Gfxprim
Threads by month
- ----- 2026 -----
- January
- ----- 2025 -----
- December
- 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
- 929 discussions
[repo.or.cz] gfxprim.git branch master updated: 4c3c5c53d86f3703ae383dd8ca9d500836018e91
by metan 12 Aug '12
by metan 12 Aug '12
12 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via 4c3c5c53d86f3703ae383dd8ca9d500836018e91 (commit)
from c5456e61ba0c97fa143aca16463e9bd6d8e05468 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/4c3c5c53d86f3703ae383dd8ca9d50083601…
commit 4c3c5c53d86f3703ae383dd8ca9d500836018e91
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Sun Aug 12 16:48:12 2012 +0200
tests: Edhance the html report.
diff --git a/tests/framework/tst_job.c b/tests/framework/tst_job.c
index 34e0357..241e0fe 100644
--- a/tests/framework/tst_job.c
+++ b/tests/framework/tst_job.c
@@ -46,8 +46,8 @@ static void start_test(struct tst_job *job)
// fprintf(stderr, "Starting test e[1;37m%se[0mn", job->test->name);
}
-static void to_time(int *sec, int *nsec, struct timespec *start,
- struct timespec *stop)
+void tst_diff_timespec(int *sec, int *nsec, struct timespec *start,
+ struct timespec *stop)
{
if (stop->tv_nsec < start->tv_nsec) {
*sec = stop->tv_sec - start->tv_sec - 1;
@@ -64,7 +64,7 @@ static void stop_test(struct tst_job *job)
int sec, nsec;
const char *result = "";
- to_time(&sec, &nsec, &job->start_time, &job->stop_time);
+ tst_diff_timespec(&sec, &nsec, &job->start_time, &job->stop_time);
switch (job->result) {
case TST_SUCCESS:
@@ -87,11 +87,12 @@ static void stop_test(struct tst_job *job)
break;
}
- fprintf(stderr, "Test e[1;37m%se[0m finished with %s "
- "(duration %i.%09is, cputime %i.%09is)n",
- name, result, sec, nsec,
+ fprintf(stderr, "e[1;37m%se[0m finished "
+ "(Time %i.%03is, CPU %i.%03is) %sn",
+ name, sec, nsec/1000000,
(int)job->cpu_time.tv_sec,
- (int)job->cpu_time.tv_nsec);
+ (int)job->cpu_time.tv_nsec/1000000,
+ result);
if (job->result == TST_MEMLEAK)
tst_malloc_print(&job->malloc_stats);
diff --git a/tests/framework/tst_job.h b/tests/framework/tst_job.h
index c18cae8..bdc9ed8 100644
--- a/tests/framework/tst_job.h
+++ b/tests/framework/tst_job.h
@@ -86,4 +86,7 @@ void tst_job_run(struct tst_job *job);
*/
void tst_job_wait(struct tst_job *job);
+void tst_diff_timespec(int *sec, int *nsec, struct timespec *start,
+ struct timespec *stop);
+
#endif /* TST_JOB_H */
diff --git a/tests/framework/tst_log.c b/tests/framework/tst_log.c
index 7277d3a..578c960 100644
--- a/tests/framework/tst_log.c
+++ b/tests/framework/tst_log.c
@@ -23,6 +23,7 @@
#include "tst_test.h"
#include "tst_job.h"
#include "tst_msg.h"
+#include "tst_preload.h"
#include "tst_log.h"
static const char *ret_to_bg_color(enum tst_ret ret)
@@ -69,23 +70,94 @@ static const char *ret_to_str(enum tst_ret ret)
return "Unknown";
}
+static void malloc_stats_html(struct tst_job *job, FILE *f, const char *padd)
+{
+ /* Create innter table */
+ fprintf(f, "%s<tr>n", padd);
+ fprintf(f, "%s <td bgcolor="#ffffcc" colspan="3">n", padd);
+ fprintf(f, "%s <center>n", padd);
+ fprintf(f, "%s <table>n", padd);
+
+ /* Create header */
+ fprintf(f, "%s <tr>n", padd);
+
+ fprintf(f, "%s <td bgcolor="#ffffaa">n", padd);
+ fprintf(f, "%s <small>Total size</small>n", padd);
+ fprintf(f, "%s </td>n", padd);
+
+ fprintf(f, "%s <td bgcolor="#ffffaa">n", padd);
+ fprintf(f, "%s <small>Total chunks</small>n", padd);
+ fprintf(f, "%s </td>n", padd);
+
+ fprintf(f, "%s <td bgcolor="#ffffaa">n", padd);
+ fprintf(f, "%s <small>Lost size</small>n", padd);
+ fprintf(f, "%s </td>n", padd);
+
+ fprintf(f, "%s <td bgcolor="#ffffaa">n", padd);
+ fprintf(f, "%s <small>Lost chunks</small>n", padd);
+ fprintf(f, "%s </td>n", padd);
+
+ fprintf(f, "%s </tr>n", padd);
+
+ /* Create data */
+ fprintf(f, "%s <tr>n", padd);
+
+ fprintf(f, "%s <td bgcolor="#ffffaa">n", padd);
+ fprintf(f, "%s <center><small>%zu</small></center>n",
+ padd, job->malloc_stats.total_size);
+ fprintf(f, "%s </td>n", padd);
+
+ fprintf(f, "%s <td bgcolor="#ffffaa">n", padd);
+ fprintf(f, "%s <center><small>%u</small></center>n",
+ padd, job->malloc_stats.total_chunks);
+ fprintf(f, "%s </td>n", padd);
+
+ fprintf(f, "%s <td bgcolor="#ffffaa">n", padd);
+ fprintf(f, "%s <center><small>%zu</small></center>n",
+ padd, job->malloc_stats.lost_size);
+ fprintf(f, "%s </td>n", padd);
+
+ fprintf(f, "%s <td bgcolor="#ffffaa">n", padd);
+ fprintf(f, "%s <center><small>%u</small></center>n",
+ padd, job->malloc_stats.lost_chunks);
+ fprintf(f, "%s </td>n", padd);
+
+ fprintf(f, "%s </tr>n", padd);
+
+ fprintf(f, "%s </table>n", padd);
+ fprintf(f, "%s </center>n", padd);
+ fprintf(f, "%s </td>n", padd);
+ fprintf(f, "%s</tr>n", padd);
+}
+
static int append_html(struct tst_job *job, FILE *f)
{
const char *padd = " ";
+ int sec, nsec;
+
+ tst_diff_timespec(&sec, &nsec, &job->start_time, &job->stop_time);
fprintf(f, "%s<tr>n", padd);
- fprintf(f, "%s <td colspan=2 bgcolor="#ccccee">%s</td>n", padd, job->test->name);
- fprintf(f, "%s <td bgcolor="%s"><font color="white">%s</td>n", padd,
+ fprintf(f, "%s <td bgcolor="#ccccee">%s </td>n", padd, job->test->name);
+ fprintf(f, "%s <td bgcolor="#ccccee">n", padd);
+ fprintf(f, "%s <small><font color="#222">%i.%03is %i.%03is</font></small>",
+ padd, sec, nsec/1000000, (int)job->cpu_time.tv_sec, (int)job->cpu_time.tv_nsec/1000000);
+ fprintf(f, "%s </td>n", padd);
+ fprintf(f, "%s <td bgcolor="%s"><center><font color="white"> %s </td></center>n", padd,
ret_to_bg_color(job->result), ret_to_str(job->result));
struct tst_msg *msg;
+ /* If calculated include malloc report */
+ if (job->test->flags & TST_MALLOC_CHECK)
+ malloc_stats_html(job, f, padd);
+
for (msg = job->store.first; msg != NULL; msg = msg->next) {
- fprintf(f, "%s<tr>", padd);
- fprintf(f, "%s <td colspan="3" bgcolor="#eeeeee">", padd);
- fprintf(f, "%s %s", padd, msg->msg);
- fprintf(f, "%s </td>", padd);
- fprintf(f, "%s</tr>", padd);
+ fprintf(f, "%s<tr>n", padd);
+ fprintf(f, "%s <td colspan="3" bgcolor="#eeeeee">n", padd);
+ fprintf(f, "%s <small>%s</small>n", padd, msg->msg);
+ fprintf(f, "%s </td>n", padd);
+ fprintf(f, "%s</tr>n", padd);
}
fprintf(f, "%s</tr>n", padd);
@@ -115,10 +187,16 @@ FILE *open_html(const struct tst_suite *suite, const char *path)
if (f == NULL)
return NULL;
- fprintf(f, "<html>n <head>n </head>n <body>n <table>n");
+ fprintf(f, "<html>n <head>n </head>n <body>n <table bgcolor="#99a">n");
+
+ fprintf(f, " <tr><td colspan="3" bgcolor="#bbbbff"><center><b>%s"
+ "</b></center></td></tr>n", suite->suite_name);
- fprintf(f, " <tr><td colspan="3" bgcolor="#bbbbff"><b>%s"
- "</b></td></tr>n", suite->suite_name);
+ fprintf(f, " <tr>n");
+ fprintf(f, " <td bgcolor="#eee"><center>Test Name</center></td>n");
+ fprintf(f, " <td bgcolor="#eee"><center>Time/CPU</center></td>n");
+ fprintf(f, " <td bgcolor="#eee"><center>Result</center></td>n");
+ fprintf(f, " </tr>n");
return f;
}
-----------------------------------------------------------------------
Summary of changes:
tests/framework/tst_job.c | 15 ++++---
tests/framework/tst_job.h | 3 +
tests/framework/tst_log.c | 98 ++++++++++++++++++++++++++++++++++++++++-----
3 files changed, 99 insertions(+), 17 deletions(-)
repo.or.cz automatic notification. Contact project admin jiri.bluebear.dluhos(a)gmail.com
if you want to unsubscribe, or site admin admin(a)repo.or.cz if you receive
no reply.
--
gfxprim.git ("A simple 2D graphics library with emphasis on correctness and well-defined operation.")
1
0
[repo.or.cz] gfxprim.git branch master updated: c5456e61ba0c97fa143aca16463e9bd6d8e05468
by metan 12 Aug '12
by metan 12 Aug '12
12 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via c5456e61ba0c97fa143aca16463e9bd6d8e05468 (commit)
from c6ff6eadd9601eb33b28a9999b5fab6d3221ed44 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/c5456e61ba0c97fa143aca16463e9bd6d8e0…
commit c5456e61ba0c97fa143aca16463e9bd6d8e05468
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Sun Aug 12 11:30:54 2012 +0200
tests: Add first simple html export.
diff --git a/tests/framework/Makefile b/tests/framework/Makefile
index 901a4fe..64186ca 100644
--- a/tests/framework/Makefile
+++ b/tests/framework/Makefile
@@ -8,7 +8,7 @@ LDFLAGS+=-L.
LDLIBS+=-ltst_preload -ldl
CFLAGS+=
-test: tst_test.o tst_job.o tst_msg.o
+test: tst_test.o tst_job.o tst_msg.o tst_log.o
APPS=test
diff --git a/tests/framework/test.c b/tests/framework/test.c
index f3d5356..ddc1573 100644
--- a/tests/framework/test.c
+++ b/tests/framework/test.c
@@ -112,12 +112,12 @@ int main(void)
{
fprintf(stderr, "(Listing testsuite tests)n");
tst_list_suite(&suite);
+
+ fprintf(stderr, "n(Running selected test)n");
+ tst_run_suite(&suite, "Sigsegv test");
fprintf(stderr, "n(Running whole suite)n");
tst_run_suite(&suite, NULL);
- fprintf(stderr, "n(Running selected test)n");
- tst_run_suite(&suite, "Sigsegv test");
-
return 0;
}
diff --git a/tests/framework/tst_log.c b/tests/framework/tst_log.c
new file mode 100644
index 0000000..7277d3a
--- /dev/null
+++ b/tests/framework/tst_log.c
@@ -0,0 +1,158 @@
+/*****************************************************************************
+ * This file is part of gfxprim library. *
+ * *
+ * Gfxprim is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Lesser General Public *
+ * License as published by the Free Software Foundation; either *
+ * version 2.1 of the License, or (at your option) any later version. *
+ * *
+ * Gfxprim 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with gfxprim; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
+ * Boston, MA 02110-1301 USA *
+ * *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
+ * *
+ *****************************************************************************/
+
+#include "tst_test.h"
+#include "tst_job.h"
+#include "tst_msg.h"
+#include "tst_log.h"
+
+static const char *ret_to_bg_color(enum tst_ret ret)
+{
+ switch (ret) {
+ case TST_SUCCESS:
+ return "#008000";
+ case TST_INTERR:
+ return "#800000";
+ case TST_SIGSEGV:
+ return "#e00000";
+ case TST_TIMEOUT:
+ return "#800080";
+ case TST_MEMLEAK:
+ return "#a0a000";
+ case TST_FAILED:
+ return "#e00000";
+ case TST_MAX:
+ break;
+ }
+
+ return "#000000";
+}
+
+static const char *ret_to_str(enum tst_ret ret)
+{
+ switch (ret) {
+ case TST_SUCCESS:
+ return "Success";
+ case TST_INTERR:
+ return "Internal Error";
+ case TST_SIGSEGV:
+ return "Segmentation Fault";
+ case TST_TIMEOUT:
+ return "Timeout";
+ case TST_MEMLEAK:
+ return "Memory Leak";
+ case TST_FAILED:
+ return "Failed";
+ case TST_MAX:
+ break;
+ }
+
+ return "Unknown";
+}
+
+static int append_html(struct tst_job *job, FILE *f)
+{
+ const char *padd = " ";
+
+ fprintf(f, "%s<tr>n", padd);
+ fprintf(f, "%s <td colspan=2 bgcolor="#ccccee">%s</td>n", padd, job->test->name);
+ fprintf(f, "%s <td bgcolor="%s"><font color="white">%s</td>n", padd,
+ ret_to_bg_color(job->result), ret_to_str(job->result));
+
+ struct tst_msg *msg;
+
+ for (msg = job->store.first; msg != NULL; msg = msg->next) {
+ fprintf(f, "%s<tr>", padd);
+ fprintf(f, "%s <td colspan="3" bgcolor="#eeeeee">", padd);
+ fprintf(f, "%s %s", padd, msg->msg);
+ fprintf(f, "%s </td>", padd);
+ fprintf(f, "%s</tr>", padd);
+ }
+
+ fprintf(f, "%s</tr>n", padd);
+
+ return 0;
+}
+
+int tst_log_append(struct tst_job *job, FILE *f, enum tst_log_fmt format)
+{
+ switch (format) {
+ case TST_LOG_HTML:
+ return append_html(job, f);
+ break;
+ default:
+ return 1;
+ }
+
+ return 1;
+}
+
+FILE *open_html(const struct tst_suite *suite, const char *path)
+{
+ FILE *f;
+
+ f = fopen(path, "w");
+
+ if (f == NULL)
+ return NULL;
+
+ fprintf(f, "<html>n <head>n </head>n <body>n <table>n");
+
+ fprintf(f, " <tr><td colspan="3" bgcolor="#bbbbff"><b>%s"
+ "</b></td></tr>n", suite->suite_name);
+
+ return f;
+}
+
+FILE *tst_log_open(const struct tst_suite *suite, const char *path,
+ enum tst_log_fmt format)
+{
+ switch (format) {
+ case TST_LOG_HTML:
+ return open_html(suite, path);
+ break;
+ default:
+ return NULL;
+ }
+
+ return NULL;
+}
+
+static int close_html(FILE *f)
+{
+ fprintf(f, " </table>n </body>n</html>n");
+ fclose(f);
+ return 0;
+}
+
+int tst_log_close(FILE *f, enum tst_log_fmt format)
+{
+ switch (format) {
+ case TST_LOG_HTML:
+ return close_html(f);
+ break;
+ default:
+ return 1;
+ }
+
+ return 1;
+}
diff --git a/tests/framework/tst_test.c b/tests/framework/tst_log.h
similarity index 56%
copy from tests/framework/tst_test.c
copy to tests/framework/tst_log.h
index d04caf5..413c854 100644
--- a/tests/framework/tst_test.c
+++ b/tests/framework/tst_log.h
@@ -20,70 +20,30 @@
* *
*****************************************************************************/
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <stdarg.h>
-
-#include "tst_job.h"
-#include "tst_test.h"
-
-int tst_warn(const char *fmt, ...)
-{
- va_list va;
- int ret;
-
- va_start(va, fmt);
- ret = vfprintf(stderr, fmt, va);
- va_end(va);
+ /*
+
+ Logs finished job result into the file.
- return ret;
-}
-
-static int run_test(const struct tst_test *test)
-{
- struct tst_job job;
+ */
- job.test = test;
+#ifndef TST_LOG_H
+#define TST_LOG_H
- tst_job_run(&job);
- tst_job_wait(&job);
-
- /* Free the test message store */
- tst_msg_clear(&job.store);
-
- return job.result;
-}
-
-void tst_run_suite(const struct tst_suite *suite, const char *tst_name)
-{
- unsigned int i;
- unsigned int counters[TST_MAX] = {};
- unsigned int counter = 0;
- int ret;
+#include <stdio.h>
- fprintf(stderr, "Running e[1;37m%se[0mnn", suite->suite_name);
+struct tst_suite;
+struct tst_job;
- for (i = 0; suite->tests[i].name != NULL; i++) {
- if (tst_name == NULL || !strcmp(tst_name, suite->tests[i].name)) {
- ret = run_test(&suite->tests[i]);
- counters[ret]++;
- counter++;
- }
- }
+enum tst_log_fmt {
+ TST_LOG_HTML,
+ TST_LOG_JSON,
+};
- fprintf(stderr, "nSummary: succedded %u out of %u (%.2f%%)n",
- counters[0], counter, 100.00 * counters[0] / counter);
-}
+FILE *tst_log_open(const struct tst_suite *suite, const char *path,
+ enum tst_log_fmt format);
-void tst_list_suite(const struct tst_suite *suite)
-{
- int i;
+int tst_log_append(struct tst_job *job, FILE *f, enum tst_log_fmt format);
- fprintf(stderr, "Testsuite: e[1;37m%se[0mnn", suite->suite_name);
+int tst_log_close(FILE *f, enum tst_log_fmt format);
- for (i = 0; suite->tests[i].name != NULL; i++)
- fprintf(stderr, "Test: e[1;37m%se[0mn", suite->tests[i].name);
-}
+#endif /* TST_LOG_H */
diff --git a/tests/framework/tst_test.c b/tests/framework/tst_test.c
index d04caf5..f45a582 100644
--- a/tests/framework/tst_test.c
+++ b/tests/framework/tst_test.c
@@ -27,6 +27,7 @@
#include <string.h>
#include <stdarg.h>
+#include "tst_log.h"
#include "tst_job.h"
#include "tst_test.h"
@@ -42,15 +43,26 @@ int tst_warn(const char *fmt, ...)
return ret;
}
-static int run_test(const struct tst_test *test)
+static int run_test(const struct tst_test *test, FILE *f,
+ enum tst_log_fmt format)
{
struct tst_job job;
job.test = test;
+ /*
+ * Flush the file before forking, otherwise
+ * there would be a copy of its buffers in both
+ * child and parent and the lines in the resulting
+ * file would be repeated several times.
+ */
+ fflush(f);
+
tst_job_run(&job);
tst_job_wait(&job);
+ tst_log_append(&job, f, format);
+
/* Free the test message store */
tst_msg_clear(&job.store);
@@ -66,14 +78,19 @@ void tst_run_suite(const struct tst_suite *suite, const char *tst_name)
fprintf(stderr, "Running e[1;37m%se[0mnn", suite->suite_name);
+ //TODO:
+ FILE *f = tst_log_open(suite, "log.html", TST_LOG_HTML);
+
for (i = 0; suite->tests[i].name != NULL; i++) {
if (tst_name == NULL || !strcmp(tst_name, suite->tests[i].name)) {
- ret = run_test(&suite->tests[i]);
+ ret = run_test(&suite->tests[i], f, TST_LOG_HTML);
counters[ret]++;
counter++;
}
}
+ tst_log_close(f, TST_LOG_HTML);
+
fprintf(stderr, "nSummary: succedded %u out of %u (%.2f%%)n",
counters[0], counter, 100.00 * counters[0] / counter);
}
-----------------------------------------------------------------------
Summary of changes:
tests/framework/Makefile | 2 +-
tests/framework/test.c | 6 +-
tests/framework/tst_log.c | 158 ++++++++++++++++++++
.../GP_Backends.h => tests/framework/tst_log.h | 41 +++---
tests/framework/tst_test.c | 21 +++-
5 files changed, 201 insertions(+), 27 deletions(-)
create mode 100644 tests/framework/tst_log.c
copy include/backends/GP_Backends.h => tests/framework/tst_log.h (78%)
repo.or.cz automatic notification. Contact project admin jiri.bluebear.dluhos(a)gmail.com
if you want to unsubscribe, or site admin admin(a)repo.or.cz if you receive
no reply.
--
gfxprim.git ("A simple 2D graphics library with emphasis on correctness and well-defined operation.")
1
0
[repo.or.cz] gfxprim.git branch master updated: c6ff6eadd9601eb33b28a9999b5fab6d3221ed44
by metan 11 Aug '12
by metan 11 Aug '12
11 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via c6ff6eadd9601eb33b28a9999b5fab6d3221ed44 (commit)
from a962dc8dcd50368da71a96ace478630c55d7401c (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/c6ff6eadd9601eb33b28a9999b5fab6d3221…
commit c6ff6eadd9601eb33b28a9999b5fab6d3221ed44
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Sat Aug 11 22:15:02 2012 +0200
tests: More work on the test framework.
Added message passing layer + few fixes.
diff --git a/tests/framework/Makefile b/tests/framework/Makefile
index 6be6899..901a4fe 100644
--- a/tests/framework/Makefile
+++ b/tests/framework/Makefile
@@ -8,7 +8,7 @@ LDFLAGS+=-L.
LDLIBS+=-ltst_preload -ldl
CFLAGS+=
-test: tst_test.o tst_job.o
+test: tst_test.o tst_job.o tst_msg.o
APPS=test
diff --git a/tests/framework/test.c b/tests/framework/test.c
index da3f13e..f3d5356 100644
--- a/tests/framework/test.c
+++ b/tests/framework/test.c
@@ -28,6 +28,9 @@
int success_fn(void)
{
+ tst_report(0, "This test does nothing");
+ tst_report(0, "But successfully");
+
return TST_SUCCESS;
}
@@ -50,12 +53,19 @@ int stack_overflow_fn(void)
int timeout_fn(void)
{
- sleep(10000);
+ tst_report(0, "Sleeping for ten seconds");
+ sleep(10);
return TST_SUCCESS;
}
int temp_dir_fn(void)
{
+ char buf[256], *res;
+
+ /* log current working directory */
+ res = getcwd(buf, sizeof(buf));
+ tst_report(0, "CWD is '%s'", res);
+
return TST_SUCCESS;
}
@@ -63,9 +73,13 @@ int malloc_leak_fn(void)
{
void *p;
- p = malloc(1);
+ p = malloc(4);
p = malloc(3);
+ free(p);
+
+ tst_report(0, "Leaking 1 chunks 4 bytes total");
+
return TST_SUCCESS;
}
diff --git a/tests/framework/tst_job.c b/tests/framework/tst_job.c
index 17166a7..34e0357 100644
--- a/tests/framework/tst_job.c
+++ b/tests/framework/tst_job.c
@@ -29,11 +29,17 @@
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
+#include <stdarg.h>
#include "tst_preload.h"
#include "tst_test.h"
#include "tst_job.h"
+/*
+ * Once we child forks to do a job, this points to its job structure.
+ */
+static struct tst_job *my_job = NULL;
+
static void start_test(struct tst_job *job)
{
(void)job;
@@ -56,41 +62,42 @@ static void stop_test(struct tst_job *job)
{
const char *name = job->test->name;
int sec, nsec;
+ const char *result = "";
to_time(&sec, &nsec, &job->start_time, &job->stop_time);
switch (job->result) {
case TST_SUCCESS:
- fprintf(stderr, "Test e[1;37m%se[0m finished with "
- "e[1;32mSUCCESSe[0m (duration %i.%05is)n",
- name, sec, nsec);
+ result = "e[1;32mSUCCESSe[0m";
break;
case TST_INTERR:
- fprintf(stderr, "Test e[1;37m%se[0m finished with "
- "e[1;31mINTERNAL ERRORe[0m (duration %i.%05is)n",
- name, sec, nsec);
+ result = "e[1;31mINTERNAL ERRORe[0m";
break;
case TST_SIGSEGV:
- fprintf(stderr, "Test e[1;37m%se[0m finished with "
- "e[1;31mSEGFAULTe[0m (duration %i.%05is)n",
- name, sec, nsec);
+ result = "e[1;31mSEGFAULTe[0m";
break;
case TST_TIMEOUT:
- fprintf(stderr, "Test e[1;37m%se[0m finished with "
- "e[1;35mTIMEOUTe[0m (duration %i.%05is}n",
- name, sec, nsec);
+ result = "e[1;35mTIMEOUTe[0m";
break;
case TST_MEMLEAK:
- fprintf(stderr, "Test e[1;37m%se[0m finished with "
- "e[1;33mMEMLEAKe[0m (duration %i.%05is}n",
- name, sec, nsec);
+ result = "e[1;33mMEMLEAKe[0m";
break;
case TST_FAILED:
- fprintf(stderr, "Test e[1;37m%se[0m finished with "
- "e[1;31mFAILUREe[0m (duration %i.%05is)n",
- name, sec, nsec);
+ result = "e[1;31mFAILUREe[0m";
break;
}
+
+ fprintf(stderr, "Test e[1;37m%se[0m finished with %s "
+ "(duration %i.%09is, cputime %i.%09is)n",
+ name, result, sec, nsec,
+ (int)job->cpu_time.tv_sec,
+ (int)job->cpu_time.tv_nsec);
+
+ if (job->result == TST_MEMLEAK)
+ tst_malloc_print(&job->malloc_stats);
+
+ /* Now print test message store */
+ tst_msg_print(&job->store);
}
/*
@@ -176,10 +183,35 @@ static void read_timespec(struct tst_job *job, struct timespec *time)
time->tv_nsec = *(long*)(ptr);
}
-static void child_write(struct tst_job *job, char ch)
+static void child_write(struct tst_job *job, char ch, void *ptr, ssize_t size)
{
if (write(job->pipefd, &ch, 1) != 1)
tst_warn("child write() failed: %s", strerror(errno));
+
+ if (ptr != NULL) {
+ if (write(job->pipefd, ptr, size) != size)
+ tst_warn("child write() failed: %s", strerror(errno));
+ }
+}
+
+int tst_report(int level, const char *fmt, ...)
+{
+ va_list va;
+ int ret;
+ char buf[258];
+
+ va_start(va, fmt);
+ ret = vsnprintf(buf+3, sizeof(buf) - 3, fmt, va);
+ va_end(va);
+
+ buf[0] = 'm';
+ buf[1] = level;
+ ((unsigned char*)buf)[2] = ret > 255 ? 255 : ret + 1;
+
+ if (my_job != NULL)
+ write(my_job->pipefd, buf, (int)buf[2] + 3);
+
+ return ret;
}
void tst_job_run(struct tst_job *job)
@@ -187,10 +219,13 @@ void tst_job_run(struct tst_job *job)
int ret;
char template[256];
int pipefd[2];
-
+
/* Write down starting time of the test */
clock_gettime(CLOCK_MONOTONIC, &job->start_time);
+ /* Prepare the test message store */
+ tst_msg_init(&job->store);
+
start_test(job);
if (pipe(pipefd)) {
@@ -211,6 +246,7 @@ void tst_job_run(struct tst_job *job)
case 0:
close(pipefd[0]);
job->pipefd = pipefd[1];
+ my_job = job;
break;
default:
close(pipefd[1]);
@@ -243,17 +279,13 @@ void tst_job_run(struct tst_job *job)
ret = job->test->tst_fn();
if (job->test->flags & TST_MALLOC_CHECK) {
- size_t size;
- unsigned int chunks;
-
tst_malloc_check_stop();
-
- tst_malloc_check_report(&size, &chunks);
-
- if (size != 0 && ret == TST_SUCCESS)
+ tst_malloc_check_report(&job->malloc_stats);
+
+ child_write(job, 's', &job->malloc_stats, sizeof(job->malloc_stats));
+
+ if (job->malloc_stats.lost_chunks != 0 && ret == TST_SUCCESS)
ret = TST_MEMLEAK;
-
- //TODO message?
}
/* Send process cpu time to parent */
@@ -265,13 +297,38 @@ void tst_job_run(struct tst_job *job)
remove_tmpdir(template);
/* Send the parent we are done */
- child_write(job, 'x');
+ child_write(job, 'x', NULL, 0);
close(job->pipefd);
exit(ret);
}
+static void parent_read_msg(struct tst_job *job)
+{
+ unsigned char header[2];
+
+ if (read(job->pipefd, header, sizeof(header)) != sizeof(header))
+ tst_warn("parent: read(message header) failed: %s",
+ strerror(errno));
+
+ char buf[header[1]];
+
+ if (read(job->pipefd, buf, sizeof(buf)) != sizeof(buf))
+ tst_warn("parent: read(message) failed: %s", strerror(errno));
+
+ /* null-terminated the string, to be extra sure */
+ buf[header[1] - 1] = '0';
+
+ tst_msg_append(&job->store, header[0], buf);
+}
+
+static void parent_read(struct tst_job *job, void *ptr, ssize_t size)
+{
+ if (read(job->pipefd, ptr, size) != size)
+ tst_warn("parent: read(): %s", strerror(errno));
+}
+
void tst_job_wait(struct tst_job *job)
{
int status, ret;
@@ -309,6 +366,18 @@ void tst_job_wait(struct tst_job *job)
case 'C':
read_timespec(job, &job->cpu_time);
break;
+ /* test message as generated by tst_report() */
+ case 'm':
+ parent_read_msg(job);
+ break;
+ /* malloc stats */
+ case 's':
+ parent_read(job, &job->malloc_stats,
+ sizeof(job->malloc_stats));
+ break;
+ default:
+ //TODO: internal error
+ break;
}
}
diff --git a/tests/framework/tst_job.h b/tests/framework/tst_job.h
index 28ec869..c18cae8 100644
--- a/tests/framework/tst_job.h
+++ b/tests/framework/tst_job.h
@@ -22,7 +22,7 @@
/*
- Test job is instance of running test.
+ Test job is an instance of running test.
*/
@@ -31,6 +31,9 @@
#include <time.h>
+#include "tst_msg.h"
+#include "tst_preload.h"
+
struct tst_test;
struct tst_job {
@@ -58,8 +61,17 @@ struct tst_job {
/* test pid */
int pid;
- /* result */
- int result;
+
+ /* test result */
+ int result;
+
+ /*
+ * test malloc statistics, filled if TST_MALLOC_CHECK was set.
+ */
+ struct malloc_stats malloc_stats;
+
+ /* store for test messages */
+ struct tst_msg_store store;
};
/*
diff --git a/tests/framework/tst_job.h b/tests/framework/tst_msg.c
similarity index 62%
copy from tests/framework/tst_job.h
copy to tests/framework/tst_msg.c
index 28ec869..2d46338 100644
--- a/tests/framework/tst_job.h
+++ b/tests/framework/tst_msg.c
@@ -20,58 +20,61 @@
* *
*****************************************************************************/
- /*
-
- Test job is instance of running test.
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
- */
+#include "tst_test.h"
-#ifndef TST_JOB_H
-#define TST_JOB_H
+#include "tst_msg.h"
-#include <time.h>
+void tst_msg_clear(struct tst_msg_store *self)
+{
+ struct tst_msg *msg, *prev = NULL;
-struct tst_test;
+ for (msg = self->first; msg != NULL; msg = msg->next) {
+ free(prev);
+ prev = msg;
+ }
-struct tst_job {
- const struct tst_test *test;
-
- /*
- * Pipe fd.
- *
- * In parent this points to the read side of the pipe so the parent
- * recieves data from child.
- *
- * In child this points to the write side of the pipe so child can
- * send data to parent.
- */
- int pipefd;
-
- int running:1;
-
- /* test execution time */
- struct timespec start_time;
- struct timespec stop_time;
+ free(prev);
+
+ self->first = NULL;
+ self->last = NULL;
+}
+
+int tst_msg_append(struct tst_msg_store *self, int type, const char *msg_text)
+{
+ size_t len = strlen(msg_text);
+ struct tst_msg *msg;
- /* test cpu time */
- struct timespec cpu_time;
+ msg = malloc(sizeof(struct tst_msg) + len + 1);
+
+ if (msg == NULL) {
+ tst_warn("tst_msg: malloc() failed: %s", strerror(errno));
+ return 1;
+ }
+
+ msg->type = type;
+ msg->next = NULL;
+ strcpy(msg->msg, msg_text);
- /* test pid */
- int pid;
- /* result */
- int result;
-};
+ if (self->last == NULL) {
+ self->first = msg;
+ self->last = msg;
+ } else {
+ self->last->next = msg;
+ self->last = msg;
+ }
-/*
- * Runs a test job as a separate process.
- *
- * The test field must point to correct test.
- */
-void tst_job_run(struct tst_job *job);
+ return 0;
+}
-/*
- * Waits for the test to finish.
- */
-void tst_job_wait(struct tst_job *job);
+void tst_msg_print(struct tst_msg_store *self)
+{
+ struct tst_msg *msg;
-#endif /* TST_JOB_H */
+ for (msg = self->first; msg != NULL; msg = msg->next)
+ fprintf(stderr, "%i: %sn", msg->type, msg->msg);
+}
diff --git a/tests/framework/tst_preload.h b/tests/framework/tst_msg.h
similarity index 71%
copy from tests/framework/tst_preload.h
copy to tests/framework/tst_msg.h
index d1eca76..a6a290a 100644
--- a/tests/framework/tst_preload.h
+++ b/tests/framework/tst_msg.h
@@ -20,22 +20,48 @@
* *
*****************************************************************************/
-#ifndef TST_PRELOAD_H
-#define TST_PRELOAD_H
+ /*
+
+ Code to store test messages into a data structure.
+
+ */
+
+#ifndef TST_MSG_H
+#define TST_MSG_H
+
+struct tst_msg {
+ struct tst_msg *next;
+ int type;
+ char msg[];
+};
+
+struct tst_msg_store {
+ struct tst_msg *first;
+ struct tst_msg *last;
+};
+
+/*
+ * Initalize message store.
+ */
+static inline void tst_msg_init(struct tst_msg_store *self)
+{
+ self->first = NULL;
+ self->last = NULL;
+}
/*
- * Starts malloc check.
+ * Cleans msg store, frees memory.
*/
-void tst_malloc_check_start(void);
+void tst_msg_clear(struct tst_msg_store *self);
/*
- * Stops malloc check.
+ * Appends test message to the store.
*/
-void tst_malloc_check_stop(void);
+int tst_msg_append(struct tst_msg_store *self, int type, const char *msg);
/*
- * Reports current malloc status.
+ * Prints messages in the store.
*/
-void tst_malloc_check_report(size_t *size, unsigned int *chunks);
+void tst_msg_print(struct tst_msg_store *self);
-#endif /* TST_PRELOAD_H */
+#endif /* TST_MSG_H */
diff --git a/tests/framework/tst_preload.c b/tests/framework/tst_preload.c
index 4a8f9bb..1ba320e 100644
--- a/tests/framework/tst_preload.c
+++ b/tests/framework/tst_preload.c
@@ -49,13 +49,17 @@ struct chunk {
};
struct chunk chunks[MAX_CHUNKS + 1];
-static size_t total_size;
-static unsigned int total_chunks;
+static size_t cur_size = 0;
+static unsigned int cur_chunks = 0;
+static size_t total_size = 0;
+static unsigned int total_chunks = 0;
-void tst_malloc_check_report(size_t *size, unsigned int *chunks)
+void tst_malloc_check_report(struct malloc_stats *stats)
{
- *size = total_size;
- *chunks = total_chunks;
+ stats->lost_size = cur_size;
+ stats->lost_chunks = cur_chunks;
+ stats->total_size = total_size;
+ stats->total_chunks = total_chunks;
}
static void add_chunk(size_t size, void *ptr)
@@ -66,8 +70,10 @@ static void add_chunk(size_t size, void *ptr)
if (chunks[i].size == 0) {
chunks[i].size = size;
chunks[i].ptr = ptr;
+ cur_size += size;
+ cur_chunks++;
total_size += size;
- total_chunks += 1;
+ total_chunks++;
return;
}
}
@@ -85,8 +91,8 @@ static void rem_chunk(void *ptr)
break;
if (chunks[i].ptr == ptr) {
- total_size -= chunks[i].size;
- total_chunks -= 1;
+ cur_size -= chunks[i].size;
+ cur_chunks--;
chunks[i].size = 0;
chunks[i].ptr = NULL;
@@ -127,3 +133,10 @@ void free(void *ptr)
real_free(ptr);
}
+
+void tst_malloc_print(struct malloc_stats *stats)
+{
+ fprintf(stderr, "Total size %zu chunks %u, lost size %zu chunks %un",
+ stats->total_size, stats->total_chunks,
+ stats->lost_size, stats->lost_chunks);
+}
diff --git a/tests/framework/tst_preload.h b/tests/framework/tst_preload.h
index d1eca76..36bb41a 100644
--- a/tests/framework/tst_preload.h
+++ b/tests/framework/tst_preload.h
@@ -33,9 +33,26 @@ void tst_malloc_check_start(void);
*/
void tst_malloc_check_stop(void);
+struct malloc_stats {
+ size_t total_size;
+ unsigned int total_chunks;
+
+ size_t lost_size;
+ unsigned int lost_chunks;
+};
+
/*
* Reports current malloc status.
+ *
+ * Size and chunks are filled with sum and number of currently allocated
+ * chunks, i.e, chunks that were allocated but not freed. The allocs is
+ * filled with number of allocations done.
+ */
+void tst_malloc_check_report(struct malloc_stats *stats);
+
+/*
+ * Prints malloc statistics.
*/
-void tst_malloc_check_report(size_t *size, unsigned int *chunks);
+void tst_malloc_print(struct malloc_stats *stats);
#endif /* TST_PRELOAD_H */
diff --git a/tests/framework/tst_test.c b/tests/framework/tst_test.c
index 9359f1c..d04caf5 100644
--- a/tests/framework/tst_test.c
+++ b/tests/framework/tst_test.c
@@ -23,29 +23,13 @@
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
-#include <stdarg.h>
#include <errno.h>
#include <string.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <ctype.h>
-#include <dirent.h>
+#include <stdarg.h>
#include "tst_job.h"
#include "tst_test.h"
-int tst_report(int level, const char *fmt, ...)
-{
- va_list va;
- int ret;
-
- va_start(va, fmt);
- ret = vfprintf(stderr, fmt, va);
- va_end(va);
-
- return ret;
-}
-
int tst_warn(const char *fmt, ...)
{
va_list va;
@@ -66,7 +50,10 @@ static int run_test(const struct tst_test *test)
tst_job_run(&job);
tst_job_wait(&job);
-
+
+ /* Free the test message store */
+ tst_msg_clear(&job.store);
+
return job.result;
}
-----------------------------------------------------------------------
Summary of changes:
tests/framework/Makefile | 2 +-
tests/framework/test.c | 18 +++-
tests/framework/tst_job.c | 129 +++++++++++++++-----
tests/framework/tst_job.h | 18 +++-
.../loaders_example.c => tests/framework/tst_msg.c | 65 +++++++----
.../GP_Backends.h => tests/framework/tst_msg.h | 47 +++++---
tests/framework/tst_preload.c | 29 +++--
tests/framework/tst_preload.h | 19 +++-
tests/framework/tst_test.c | 23 +---
9 files changed, 249 insertions(+), 101 deletions(-)
copy demos/c_simple/loaders_example.c => tests/framework/tst_msg.c (65%)
copy include/backends/GP_Backends.h => tests/framework/tst_msg.h (71%)
repo.or.cz automatic notification. Contact project admin jiri.bluebear.dluhos(a)gmail.com
if you want to unsubscribe, or site admin admin(a)repo.or.cz if you receive
no reply.
--
gfxprim.git ("A simple 2D graphics library with emphasis on correctness and well-defined operation.")
1
0
[repo.or.cz] gfxprim.git branch master updated: ded09ff77c3cb7e8a5f0666434806f7be8aebf63
by metan 10 Aug '12
by metan 10 Aug '12
10 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via ded09ff77c3cb7e8a5f0666434806f7be8aebf63 (commit)
from a9450959b372c0d3c47b09b1714c7563808756ee (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/ded09ff77c3cb7e8a5f0666434806f7be8ae…
commit ded09ff77c3cb7e8a5f0666434806f7be8aebf63
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Fri Aug 10 22:43:02 2012 +0200
tests: Remove SDL based showimage.
Similar test already exists.
diff --git a/tests/SDL/Makefile b/tests/SDL/Makefile
index 6f83335..c11568d 100644
--- a/tests/SDL/Makefile
+++ b/tests/SDL/Makefile
@@ -8,7 +8,7 @@ ifeq ($(HAVE_LIBSDL),yes)
CSOURCES=$(shell echo *.c)
APPS=pixeltest fonttest linetest randomshapetest- symbolstest textaligntest trianglefps blittest subcontext showimage+ symbolstest textaligntest trianglefps blittest subcontext aatest mixpixeltest
endif
diff --git a/tests/SDL/showimage.c b/tests/SDL/showimage.c
deleted file mode 100644
index a63ba78..0000000
--- a/tests/SDL/showimage.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/*****************************************************************************
- * This file is part of gfxprim library. *
- * *
- * Gfxprim is free software; you can redistribute it and/or *
- * modify it under the terms of the GNU Lesser General Public *
- * License as published by the Free Software Foundation; either *
- * version 2.1 of the License, or (at your option) any later version. *
- * *
- * Gfxprim 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 *
- * Lesser General Public License for more details. *
- * *
- * You should have received a copy of the GNU Lesser General Public *
- * License along with gfxprim; if not, write to the Free Software *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
- * Boston, MA 02110-1301 USA *
- * *
- * Copyright (C) 2009-2011 Cyril Hrubis <metan(a)ucw.cz> *
- * *
- *****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <SDL/SDL.h>
-
-#include "GP.h"
-#include "GP_SDL.h"
-
-SDL_Surface *display = NULL;
-GP_Context context, *bitmap;
-
-int brightness = 0;
-
-void event_loop(void)
-{
- SDL_Event event;
- GP_Context *res;
-
- while (SDL_WaitEvent(&event) > 0) {
-
- switch (event.type) {
-
- case SDL_KEYDOWN:
- switch (event.key.keysym.sym) {
- case SDLK_ESCAPE:
- return;
- case SDLK_UP:
- brightness+=2;
- case SDLK_DOWN: {
- brightness-=1;
-
- GP_FILTER_PARAMS(bitmap->pixel_type, param);
- GP_FilterParamSetIntAll(param, brightness);
- res = GP_FilterBrightness(bitmap, NULL, param, NULL);
-
- printf("brightness = %i %ux%un", brightness, res->w, res->h);
-
- GP_Blit(res, 0, 0, res->w, res->h, &context, 0, 0);
- SDL_Flip(display);
- GP_ContextFree(res);
- } break;
- default:
- break;
- }
- break;
- case SDL_QUIT:
- return;
- default:
- break;
- }
- }
-}
-
-int main(int argc, char *argv[])
-{
- /* Bits per pixel to be set for the display surface. */
- int display_bpp = 0;
-
- int i;
- for (i = 1; i < argc; i++) {
- if (strcmp(argv[i], "-16") == 0) {
- display_bpp = 16;
- }
- else if (strcmp(argv[i], "-24") == 0) {
- display_bpp = 24;
- }
- else if (strcmp(argv[i], "-32") == 0) {
- display_bpp = 32;
- }
- }
-
- GP_SetDebugLevel(10);
-
- if ((bitmap = GP_LoadImage(argv[1], NULL)) == NULL) {
- fprintf(stderr, "Failed to load bitmap: %sn", strerror(errno));
- return 1;
- }
-
- /* Initialize SDL */
- if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0) {
- fprintf(stderr, "Could not initialize SDL: %sn", SDL_GetError());
- return 1;
- }
-
- /* Create a window with a software back surface */
- display = SDL_SetVideoMode(bitmap->w, bitmap->h, display_bpp, SDL_SWSURFACE);
- if (display == NULL) {
- fprintf(stderr, "Could not open display: %sn", SDL_GetError());
- goto fail;
- }
-
- GP_SDL_ContextFromSurface(&context, display);
-
- GP_Blit(bitmap, 0, 0, bitmap->w, bitmap->h, &context, 0, 0);
- SDL_Flip(display);
-
- event_loop();
-
- SDL_Quit();
- return 0;
-fail:
- SDL_Quit();
- return 1;
-}
-
-----------------------------------------------------------------------
Summary of changes:
tests/SDL/Makefile | 2 +-
tests/SDL/showimage.c | 127 -------------------------------------------------
2 files changed, 1 insertions(+), 128 deletions(-)
delete mode 100644 tests/SDL/showimage.c
repo.or.cz automatic notification. Contact project admin jiri.bluebear.dluhos(a)gmail.com
if you want to unsubscribe, or site admin admin(a)repo.or.cz if you receive
no reply.
--
gfxprim.git ("A simple 2D graphics library with emphasis on correctness and well-defined operation.")
1
0
[repo.or.cz] gfxprim.git branch master updated: a9450959b372c0d3c47b09b1714c7563808756ee
by metan 10 Aug '12
by metan 10 Aug '12
10 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via a9450959b372c0d3c47b09b1714c7563808756ee (commit)
via e53339e37a3317890519f1cce213d9af4165997b (commit)
via 08617b71bbfd0c8e85eb7201a9e65ed227b711ae (commit)
from 1cb6c5439748776bff0baa03e9be4d5ceea9dbbc (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/a9450959b372c0d3c47b09b1714c75638087…
commit a9450959b372c0d3c47b09b1714c7563808756ee
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Fri Aug 10 19:56:26 2012 +0200
tests: Port fileview to backends.
diff --git a/demos/c_simple/Makefile b/demos/c_simple/Makefile
index 99af986..2c03ec8 100644
--- a/demos/c_simple/Makefile
+++ b/demos/c_simple/Makefile
@@ -8,7 +8,8 @@ LDLIBS+=-lrt `$(TOPDIR)/gfxprim-config --libs --libs-backends`
APPS=backend_example loaders_example loaders filters_symmetry gfx_koch virtual_backend_example meta_data meta_data_dump tmp_file showimage- v4l2_show v4l2_grab convolution weighted_median shapetest koch input
+ v4l2_show v4l2_grab convolution weighted_median shapetest koch input+ fileview
v4l2_show: LDLIBS+=-lGP_grabbers
v4l2_grab: LDLIBS+=-lGP_grabbers
diff --git a/tests/SDL/fileview.c b/demos/c_simple/fileview.c
similarity index 70%
rename from tests/SDL/fileview.c
rename to demos/c_simple/fileview.c
index d1c8008..66c2925 100644
--- a/tests/SDL/fileview.c
+++ b/demos/c_simple/fileview.c
@@ -25,13 +25,12 @@
#include <stdio.h>
#include <stdlib.h>
-#include <SDL/SDL.h>
+#include <string.h>
#include "GP.h"
-#include "GP_SDL.h"
-SDL_Surface *display = NULL;
-GP_Context context;
+static GP_Context *win;
+static GP_Backend *backend;
static GP_Pixel white_pixel, gray_pixel, dark_gray_pixel, black_pixel,
red_pixel, blue_pixel;
@@ -52,9 +51,7 @@ struct FileLine *last_line = NULL;
void redraw_screen(void)
{
- SDL_LockSurface(display);
-
- GP_Fill(&context, gray_pixel);
+ GP_Fill(win, gray_pixel);
GP_TextStyle style = GP_DEFAULT_TEXT_STYLE;
@@ -83,15 +80,13 @@ void redraw_screen(void)
struct FileLine *line = first_line;
unsigned int i;
- for (i = 0; i < context.h/GP_TextHeight(&style); i++) {
+ for (i = 0; i < win->h/GP_TextHeight(&style); i++) {
if (line == NULL)
break;
- GP_Text(&context, &style, 16, 16 + (1.0 * GP_TextHeight(&style))*i,
+ GP_Text(win, &style, 16, 16 + (1.0 * GP_TextHeight(&style))*i,
align, black_pixel, gray_pixel, line->text);
line = line->next;
}
-
- SDL_UnlockSurface(display);
}
static void warp_up(int lines)
@@ -101,7 +96,7 @@ static void warp_up(int lines)
first_line = first_line->prev;
redraw_screen();
- SDL_Flip(display);
+ GP_BackendFlip(backend);
}
static void warp_down(int lines)
@@ -111,63 +106,65 @@ static void warp_down(int lines)
first_line = first_line->next;
redraw_screen();
- SDL_Flip(display);
+ GP_BackendFlip(backend);
}
void event_loop(void)
{
- SDL_Event event;
-
- while (SDL_WaitEvent(&event) > 0) {
- switch (event.type) {
-
- case SDL_VIDEOEXPOSE:
- redraw_screen();
- SDL_Flip(display);
- break;
-
- case SDL_KEYDOWN:
- switch (event.key.keysym.sym) {
- case SDLK_SPACE:
+ GP_Event ev;
+
+ while (GP_EventGet(&ev)) {
+ switch (ev.type) {
+ case GP_EV_KEY:
+ if (ev.code != GP_EV_KEY_DOWN)
+ continue;
+
+ switch (ev.val.key.key) {
+ case GP_KEY_SPACE:
if (font)
font_flag = (font_flag + 1) % 3;
else
font_flag = (font_flag + 1) % 2;
redraw_screen();
- SDL_Flip(display);
+ GP_BackendFlip(backend);
break;
- case SDLK_RIGHT:
+ case GP_KEY_RIGHT:
tracking++;
redraw_screen();
- SDL_Flip(display);
+ GP_BackendFlip(backend);
break;
- case SDLK_LEFT:
+ case GP_KEY_LEFT:
tracking--;
redraw_screen();
- SDL_Flip(display);
+ GP_BackendFlip(backend);
break;
- case SDLK_ESCAPE:
- return;
- case SDLK_UP:
+ case GP_KEY_UP:
warp_up(1);
break;
- case SDLK_PAGEUP:
- warp_up(29);
- break;
- case SDLK_DOWN:
+ case GP_KEY_DOWN:
warp_down(1);
break;
- case SDLK_PAGEDOWN:
- warp_down(29);
+ case GP_KEY_PAGE_UP:
+ warp_up(30);
break;
- default:
+ case GP_KEY_PAGE_DOWN:
+ warp_down(30);
+ break;
+ case GP_KEY_ESC:
+ GP_BackendExit(backend);
+ exit(0);
+ break;
+ }
+ break;
+ case GP_EV_SYS:
+ switch(ev.code) {
+ case GP_EV_SYS_QUIT:
+ GP_BackendExit(backend);
+ exit(0);
break;
}
break;
-
- case SDL_QUIT:
- return;
}
}
}
@@ -208,52 +205,43 @@ static int read_file_head(const char *filename)
int main(int argc, char *argv[])
{
+ const char *backend_opts = "X11";
+
if (argc == 1) {
fprintf(stderr, "No file specifiedn");
return 1;
}
-
if (argc > 2)
font = GP_FontFaceLoad(argv[2], 0, 16);
if (!read_file_head(argv[1]))
return 1;
+
+ backend = GP_BackendInit(backend_opts, "File View", stderr);
- /* Initialize SDL */
- if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0) {
- fprintf(stderr, "Could not initialize SDL: %sn", SDL_GetError());
+ if (backend == NULL) {
+ fprintf(stderr, "Failed to initalize backend '%s'n",
+ backend_opts);
return 1;
}
+
+ win = backend->context;
- /* Create a window with a software back surface */
- display = SDL_SetVideoMode(800, 480, 0, SDL_SWSURFACE);
- if (display == NULL) {
- fprintf(stderr, "Could not open display: %sn", SDL_GetError());
- goto fail;
- }
-
- /* Initialize a GP context from the SDL display */
- GP_SDL_ContextFromSurface(&context, display);
-
- /* Load colors suitable for the display */
- white_pixel = GP_ColorToContextPixel(GP_COL_WHITE, &context);
- gray_pixel = GP_ColorToContextPixel(GP_COL_GRAY_LIGHT, &context);
- dark_gray_pixel = GP_ColorToContextPixel(GP_COL_GRAY_DARK, &context);
- black_pixel = GP_ColorToContextPixel(GP_COL_BLACK, &context);
- red_pixel = GP_ColorToContextPixel(GP_COL_RED, &context);
- blue_pixel = GP_ColorToContextPixel(GP_COL_BLUE, &context);
+ white_pixel = GP_ColorToContextPixel(GP_COL_WHITE, win);
+ gray_pixel = GP_ColorToContextPixel(GP_COL_GRAY_LIGHT, win);
+ dark_gray_pixel = GP_ColorToContextPixel(GP_COL_GRAY_DARK, win);
+ black_pixel = GP_ColorToContextPixel(GP_COL_BLACK, win);
+ red_pixel = GP_ColorToContextPixel(GP_COL_RED, win);
+ blue_pixel = GP_ColorToContextPixel(GP_COL_BLUE, win);
redraw_screen();
- SDL_Flip(display);
-
- event_loop();
+ GP_BackendFlip(backend);
+
+ for (;;) {
+ GP_BackendWait(backend);
+ event_loop();
+ }
- SDL_Quit();
return 0;
-
-fail:
- SDL_Quit();
- return 1;
}
-
diff --git a/demos/c_simple/shapetest.c b/demos/c_simple/shapetest.c
index ef33b04..702b210 100644
--- a/demos/c_simple/shapetest.c
+++ b/demos/c_simple/shapetest.c
@@ -398,7 +398,7 @@ void event_loop(void)
switch(ev.code) {
case GP_EV_SYS_QUIT:
GP_BackendExit(backend);
- exit(1);
+ exit(0);
break;
}
break;
diff --git a/tests/SDL/Makefile b/tests/SDL/Makefile
index 4455172..6f83335 100644
--- a/tests/SDL/Makefile
+++ b/tests/SDL/Makefile
@@ -7,7 +7,7 @@ LDLIBS+=-lGP -L$(TOPDIR)/build/ -lGP_SDL -lSDL
ifeq ($(HAVE_LIBSDL),yes)
CSOURCES=$(shell echo *.c)
-APPS=pixeltest fileview fonttest linetest randomshapetest+APPS=pixeltest fonttest linetest randomshapetest symbolstest textaligntest trianglefps blittest subcontext showimage aatest mixpixeltest
endif
http://repo.or.cz/w/gfxprim.git/commit/e53339e37a3317890519f1cce213d9af4165…
commit e53339e37a3317890519f1cce213d9af4165997b
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Fri Aug 10 19:38:29 2012 +0200
tests: Remove another obsolete tests.
diff --git a/tests/filters/Makefile b/tests/filters/Makefile
deleted file mode 100644
index 7e43d98..0000000
--- a/tests/filters/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-TOPDIR=../..
-
-CSOURCES=$(shell echo *.c)
-
-INCLUDE=filters loaders
-LDLIBS+=-lGP -L$(TOPDIR)/build/
-
-APPS=PGM_rotate rotate_test
-
-include $(TOPDIR)/include.mk
-include $(TOPDIR)/app.mk
diff --git a/tests/filters/PGM_rotate.c b/tests/filters/PGM_rotate.c
deleted file mode 100644
index de7abf1..0000000
--- a/tests/filters/PGM_rotate.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*****************************************************************************
- * This file is part of gfxprim library. *
- * *
- * Gfxprim is free software; you can redistribute it and/or *
- * modify it under the terms of the GNU Lesser General Public *
- * License as published by the Free Software Foundation; either *
- * version 2.1 of the License, or (at your option) any later version. *
- * *
- * Gfxprim 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 *
- * Lesser General Public License for more details. *
- * *
- * You should have received a copy of the GNU Lesser General Public *
- * License along with gfxprim; if not, write to the Free Software *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
- * Boston, MA 02110-1301 USA *
- * *
- * Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
- * <jiri.bluebear.dluhos(a)gmail.com> *
- * *
- * Copyright (C) 2009-2010 Cyril Hrubis <metan(a)ucw.cz> *
- * *
- *****************************************************************************/
-
-#include <GP.h>
-#include <GP_PGM.h>
-#include <GP_Rotate.h>
-
-int main(int argc, char *argv[])
-{
- GP_Context *context, *copy;
-
- if (argc < 2)
- fprintf(stderr, "Takes one parameter, filenamen");
-
- if (GP_LoadPGM(argv[1], &context)) {
- fprintf(stderr, "Can't load contextn");
- return 1;
- }
-
- printf("Loaded PGM %u bpp w %u h %u, bpr %un",
- context->bpp, context->w, context->h, context->bytes_per_row);
-
- copy = GP_ContextCopy(context, GP_COPY_WITH_PIXELS);
- GP_MirrorH(copy);
-
- if (GP_SavePGM("test-mh.pgm", copy)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- GP_ContextFree(copy);
- copy = GP_ContextCopy(context, GP_COPY_WITH_PIXELS);
-
- GP_MirrorV(copy);
-
- if (GP_SavePGM("test-mv.pgm", copy)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- GP_ContextFree(copy);
- copy = GP_ContextCopy(context, GP_COPY_WITH_PIXELS);
-
- GP_RotateCW(copy);
-
- if (GP_SavePGM("test-cw.pgm", copy)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- GP_ContextFree(copy);
- copy = GP_ContextCopy(context, GP_COPY_WITH_PIXELS);
-
- GP_RotateCCW(copy);
-
- if (GP_SavePGM("test-ccw.pgm", copy)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- GP_ContextFree(copy);
- GP_ContextFree(context);
-
- return 0;
-}
diff --git a/tests/filters/rotate_test.c b/tests/filters/rotate_test.c
deleted file mode 100644
index aacb235..0000000
--- a/tests/filters/rotate_test.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/*****************************************************************************
- * This file is part of gfxprim library. *
- * *
- * Gfxprim is free software; you can redistribute it and/or *
- * modify it under the terms of the GNU Lesser General Public *
- * License as published by the Free Software Foundation; either *
- * version 2.1 of the License, or (at your option) any later version. *
- * *
- * Gfxprim 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 *
- * Lesser General Public License for more details. *
- * *
- * You should have received a copy of the GNU Lesser General Public *
- * License along with gfxprim; if not, write to the Free Software *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
- * Boston, MA 02110-1301 USA *
- * *
- * Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
- * <jiri.bluebear.dluhos(a)gmail.com> *
- * *
- * Copyright (C) 2009-2010 Cyril Hrubis <metan(a)ucw.cz> *
- * *
- *****************************************************************************/
-
-#include <GP.h>
-#include <GP_PGM.h>
-#include <GP_Rotate.h>
-
-#define W 221
-#define H 160
-
-int main(void)
-{
- int i;
-
- GP_Context *context = GP_ContextAlloc(W, H, GP_PIXEL_G2), *copy;
-
- if (context == NULL) {
- fprintf(stderr, "Couldn't allocate contextn");
- return 1;
- }
-
- for (i = 0; i < 20; i++)
- GP_HLineXYW(context, 0, i, i, 3);
-
- for (i = 0; i < 20; i++)
- GP_HLineXYW(context, 1, i + 20, i, 2);
-
- for (i = 0; i < 20; i++)
- GP_HLineXYW(context, 2, i + 40, i, 1);
-
- for (i = 0; i < 20; i++)
- GP_HLineXYW(context, 3, i + 60, i, 3);
-
- for (i = 0; i < 20; i++)
- GP_HLineXYW(context, 4, i + 80, i, 2);
-
- GP_Line(context, 0, 0, W, H, 3);
- GP_Line(context, 0, H, W, 0, 3);
-
- GP_FillCircle(context, W/2, H/2, 19, 3);
- GP_FillCircle(context, W/2, H/2, 7, 2);
- GP_FillCircle(context, W/2, H/2, 5, 1);
- GP_FillCircle(context, W/2, H/2, 2, 0);
- GP_Text(context, NULL, 60, 10, GP_VALIGN_BELOW | GP_ALIGN_RIGHT, "Test", 3);
- GP_Text(context, NULL, 60, 20, GP_VALIGN_BELOW | GP_ALIGN_RIGHT, "Test", 2);
- GP_Text(context, NULL, 60, 30, GP_VALIGN_BELOW | GP_ALIGN_RIGHT, "Test", 1);
-
- if (GP_SavePGM("test.pgm", context)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- copy = GP_ContextCopy(context, GP_COPY_WITH_PIXELS);
- GP_MirrorH(copy);
-
- if (GP_SavePGM("test-mh.pgm", copy)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- GP_ContextFree(copy);
- copy = GP_ContextCopy(context, GP_COPY_WITH_PIXELS);
-
- GP_MirrorV(copy);
-
- if (GP_SavePGM("test-mv.pgm", copy)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- GP_ContextFree(copy);
- copy = GP_ContextCopy(context, GP_COPY_WITH_PIXELS);
-
- GP_RotateCW(copy);
-
- if (GP_SavePGM("test-cw.pgm", copy)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- GP_ContextFree(copy);
- copy = GP_ContextCopy(context, GP_COPY_WITH_PIXELS);
-
- GP_RotateCCW(copy);
-
- if (GP_SavePGM("test-ccw.pgm", copy)) {
- fprintf(stderr, "Can't save contextn");
- return 1;
- }
-
- GP_ContextFree(copy);
- GP_ContextFree(context);
-
- return 0;
-}
diff --git a/tests/filters/runtest.sh b/tests/filters/runtest.sh
deleted file mode 100755
index 3d8bf71..0000000
--- a/tests/filters/runtest.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-#
-# Run dynamically linked test.
-#
-
-PROG="$1"
-shift
-
-echo "LD_LIBRARY_PATH=../:../../core/:../../loaders/ ./$PROG $@"
-LD_LIBRARY_PATH="../:../../core/:../../loaders/" ./$PROG $@
diff --git a/tests/filters/test-big.pgm b/tests/filters/test-big.pgm
deleted file mode 100644
index 6a8f07f..0000000
--- a/tests/filters/test-big.pgm
+++ /dev/null
@@ -1,480004 +0,0 @@
-P2
-800 600
-255
-# CREATOR: GIMP PNM Filter Version 1.1
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-238
-238
-238
-238
-238
-238
-230
-230
-230
-230
-230
-230
-230
-230
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-238
-238
-238
-238
-238
-238
-238
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-238
-238
-238
-238
-238
-238
-238
-230
-223
-223
-223
-223
-223
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-230
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-238
-238
-238
-238
-238
-238
-238
-230
-230
-213
-202
-213
-213
-202
-132
-213
-223
-223
-223
-230
-230
-230
-230
-230
-230
-230
-230
-230
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-238
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-242
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-246
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
-247
...e-mail trimmed, has been too large.
1
0
[repo.or.cz] gfxprim.git branch master updated: 1cb6c5439748776bff0baa03e9be4d5ceea9dbbc
by metan 10 Aug '12
by metan 10 Aug '12
10 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via 1cb6c5439748776bff0baa03e9be4d5ceea9dbbc (commit)
from 1b13c9d73865b69c4c52c27a5328fd7aea68b805 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/1cb6c5439748776bff0baa03e9be4d5ceea9…
commit 1cb6c5439748776bff0baa03e9be4d5ceea9dbbc
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Fri Aug 10 18:37:58 2012 +0200
pywrap: Add error checks for PXM loaders.
diff --git a/pylib/gfxprim/loaders/loaders.i b/pylib/gfxprim/loaders/loaders.i
index 2e54d41..9561176 100644
--- a/pylib/gfxprim/loaders/loaders.i
+++ b/pylib/gfxprim/loaders/loaders.i
@@ -44,9 +44,14 @@ ERROR_ON_NONZERO(GP_SavePNG);
%include "GP_PNG.h"
-/* TODO: No error checking - legacy GP_RetCode form */
+ERROR_ON_NULL(GP_LoadPBM);
+ERROR_ON_NULL(GP_LoadPGM);
+ERROR_ON_NULL(GP_LoadPPM);
+ERROR_ON_NONZERO(GP_SavePBM);
+ERROR_ON_NONZERO(GP_SavePGM);
+ERROR_ON_NONZERO(GP_SavePPM);
+
%include "GP_PBM.h"
%include "GP_PGM.h"
%include "GP_PPM.h"
-
-----------------------------------------------------------------------
Summary of changes:
pylib/gfxprim/loaders/loaders.i | 9 +++++++--
1 files changed, 7 insertions(+), 2 deletions(-)
repo.or.cz automatic notification. Contact project admin jiri.bluebear.dluhos(a)gmail.com
if you want to unsubscribe, or site admin admin(a)repo.or.cz if you receive
no reply.
--
gfxprim.git ("A simple 2D graphics library with emphasis on correctness and well-defined operation.")
1
0
[repo.or.cz] gfxprim.git branch master updated: 1b13c9d73865b69c4c52c27a5328fd7aea68b805
by metan 10 Aug '12
by metan 10 Aug '12
10 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via 1b13c9d73865b69c4c52c27a5328fd7aea68b805 (commit)
from 4337959cd59402d875d9e155659602c1c549676b (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/1b13c9d73865b69c4c52c27a5328fd7aea68…
commit 1b13c9d73865b69c4c52c27a5328fd7aea68b805
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Fri Aug 10 18:25:32 2012 +0200
loaders: Now GP_RetCode free + fixes.
diff --git a/demos/grinder/grinder.c b/demos/grinder/grinder.c
index 5434e65..758804b 100644
--- a/demos/grinder/grinder.c
+++ b/demos/grinder/grinder.c
@@ -238,7 +238,7 @@ static int rotate(GP_Context **c, const char *params)
}
if (res == NULL)
- return GP_ENOMEM;
+ return ENOMEM;
GP_ContextFree(*c);
*c = res;
@@ -408,7 +408,7 @@ static int blur(GP_Context **c, const char *params)
float sigma_y = 0;
if (param_parse(params, blur_params, "blur", param_err, &sigma, &sigma_x, &sigma_y))
- return GP_EINVAL;
+ return EINVAL;
if (sigma > 0) {
sigma_x = sigma;
@@ -983,7 +983,7 @@ static void save_by_fmt(struct GP_Context *bitmap, const char *name, const char
progress_prefix = "Saving Image";
if (!strcmp(fmt, "ppm"))
- ret = GP_SavePPM(name, bitmap, "b");
+ ret = GP_SavePPM(name, bitmap, "b", progress_callback);
else if (!strcmp(fmt, "jpg"))
ret = GP_SaveJPG(bitmap, name, progress_callback);
else if (!strcmp(fmt, "png"))
diff --git a/include/SDL/GP_SDL_Context.h b/include/SDL/GP_SDL_Context.h
index 3963824..af53f54 100644
--- a/include/SDL/GP_SDL_Context.h
+++ b/include/SDL/GP_SDL_Context.h
@@ -27,6 +27,7 @@
#define GP_SDL_CONTEXT_H
#include "GP.h"
+#include "core/GP_RetCode.h"
GP_RetCode GP_SDL_ContextFromSurface(GP_Context *context, SDL_Surface *surf);
diff --git a/include/SDL/GP_SDL_VideoInit.h b/include/SDL/GP_SDL_VideoInit.h
index fbb388d..99927b6 100644
--- a/include/SDL/GP_SDL_VideoInit.h
+++ b/include/SDL/GP_SDL_VideoInit.h
@@ -27,6 +27,7 @@
#define GP_SDL_VIDEOINIT_H
#include "GP.h"
+#include "core/GP_RetCode.h"
GP_RetCode GP_SDL_VideoInit(GP_Context *context, int width, int height,
int argc, char **argv);
diff --git a/include/loaders/GP_Loaders.h b/include/loaders/GP_Loaders.h
index 286e372..ab0f4ef 100644
--- a/include/loaders/GP_Loaders.h
+++ b/include/loaders/GP_Loaders.h
@@ -34,7 +34,6 @@
#include "core/GP_Context.h"
#include "core/GP_ProgressCallback.h"
-#include "core/GP_RetCode.h"
#include "GP_PBM.h"
#include "GP_PGM.h"
diff --git a/include/loaders/GP_PGM.h b/include/loaders/GP_PGM.h
index 54fd546..f949cde 100644
--- a/include/loaders/GP_PGM.h
+++ b/include/loaders/GP_PGM.h
@@ -19,18 +19,19 @@
* Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
* <jiri.bluebear.dluhos(a)gmail.com> *
* *
- * Copyright (C) 2009-2010 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
-#ifndef GP_PGM_H
-#define GP_PGM_H
+#ifndef LOADERS_GP_PGM_H
+#define LOADERS_GP_PGM_H
#include "core/GP_Context.h"
-#include "core/GP_RetCode.h"
-GP_RetCode GP_LoadPGM(const char *src_path, GP_Context **res);
+GP_Context *GP_LoadPGM(const char *src_path,
+ GP_ProgressCallback *callback);
-GP_RetCode GP_SavePGM(const char *res_path, GP_Context *src);
+int GP_SavePGM(const char *res_path, GP_Context *src,
+ GP_ProgressCallback *callback);
-#endif /* GP_PGM_H */
+#endif /* LOADERS_GP_PGM_H */
diff --git a/include/loaders/GP_PPM.h b/include/loaders/GP_PPM.h
index b7d71d7..4ac1bf1 100644
--- a/include/loaders/GP_PPM.h
+++ b/include/loaders/GP_PPM.h
@@ -16,21 +16,22 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301 USA *
* *
- * Copyright (C) 2009-2011 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
-#ifndef GP_PPM_H
-#define GP_PPM_H
+#ifndef LOADERS_GP_PPM_H
+#define LOADERS_GP_PPM_H
#include "core/GP_Context.h"
-#include "core/GP_RetCode.h"
+#include "core/GP_ProgressCallback.h"
-GP_RetCode GP_LoadPPM(const char *src_path, GP_Context **res);
+GP_Context *GP_LoadPPM(const char *src_path, GP_ProgressCallback *callback);
/*
* The fmt may be either "a" for ASCII or "b" for BINARY.
*/
-GP_RetCode GP_SavePPM(const char *res_path, GP_Context *src, char *fmt);
+int GP_SavePPM(const char *res_path, GP_Context *src, char *fmt,
+ GP_ProgressCallback *callback);
-#endif /* GP_PPM_H */
+#endif /* LOADERS_GP_PPM_H */
diff --git a/libs/loaders/GP_Loaders.c b/libs/loaders/GP_Loaders.c
index 3d19e1a..5700aa4 100644
--- a/libs/loaders/GP_Loaders.c
+++ b/libs/loaders/GP_Loaders.c
@@ -37,7 +37,6 @@
GP_Context *GP_LoadImage(const char *src_path, GP_ProgressCallback *callback)
{
int len, saved_errno;
- GP_Context *res = NULL;
if (access(src_path, R_OK)) {
@@ -96,19 +95,16 @@ GP_Context *GP_LoadImage(const char *src_path, GP_ProgressCallback *callback)
break;
case 'g':
case 'G':
- //TODO: Fix this!!!
if (src_path[len - 3] == 'p' ||
src_path[len - 3] == 'P') {
- GP_LoadPGM(src_path, &res);
- return res;
+ return GP_LoadPGM(src_path, callback);
}
break;
case 'p':
case 'P':
if (src_path[len - 3] == 'p' ||
src_path[len - 3] == 'P') {
- GP_LoadPPM(src_path, &res);
- return res;
+ return GP_LoadPPM(src_path, callback);
}
break;
}
diff --git a/libs/loaders/GP_PGM.c b/libs/loaders/GP_PGM.c
index 1e0d10f..9ae8c64 100644
--- a/libs/loaders/GP_PGM.c
+++ b/libs/loaders/GP_PGM.c
@@ -19,7 +19,7 @@
* Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
* <jiri.bluebear.dluhos(a)gmail.com> *
* *
- * Copyright (C) 2009-2011 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
@@ -71,17 +71,22 @@ static void try_read_comments(FILE *f)
ungetc(c1, f);
}
-GP_RetCode GP_LoadPGM(const char *src_path, GP_Context **res)
+GP_Context *GP_LoadPGM(const char *src_path, GP_ProgressCallback *callback)
{
- FILE *f = fopen(src_path, "r");
+ FILE *f;
+ GP_Context *ret;
uint32_t w, h, gray;
GP_PixelType type;
char h1, h2;
+ int err = EIO;
+
+ f = fopen(src_path, "r");
if (f == NULL) {
+ err = errno;
GP_DEBUG(1, "Failed to open file '%s': %s",
src_path, strerror(errno));
- return GP_EBADFILE;
+ goto err0;
}
h1 = fgetc(f);
@@ -91,12 +96,14 @@ GP_RetCode GP_LoadPGM(const char *src_path, GP_Context **res)
GP_DEBUG(1, "Invalid PGM header '%c%c' (0x%2x 0x%2x)",
isprint(h1) ? h1 : ' ', isprint(h2) ? h2 : ' ',
h1, h2);
+ err = EINVAL;
goto err1;
}
try_read_comments(f);
if (fscanf(f, "%"PRIu32, &w) < 1) {
+ err = errno;
GP_DEBUG(1, "Failed to read PGM header width");
goto err1;
}
@@ -104,6 +111,7 @@ GP_RetCode GP_LoadPGM(const char *src_path, GP_Context **res)
try_read_comments(f);
if (fscanf(f, "%"PRIu32, &h) < 1) {
+ err = errno;
GP_DEBUG(1, "Failed to read PGM header height");
goto err1;
}
@@ -111,6 +119,7 @@ GP_RetCode GP_LoadPGM(const char *src_path, GP_Context **res)
try_read_comments(f);
if (fscanf(f, "%"PRIu32, &gray) < 1) {
+ err = errno;
GP_DEBUG(1, "Failed to read PGM header gray");
goto err1;
}
@@ -129,46 +138,55 @@ GP_RetCode GP_LoadPGM(const char *src_path, GP_Context **res)
type = GP_PIXEL_G8;
break;
default:
+ GP_DEBUG(1, "Invalid number of grays %u", gray);
+ err = EINVAL;
goto err1;
}
- *res = GP_ContextAlloc(w, h, type);
+ ret = GP_ContextAlloc(w, h, type);
- if (res == NULL)
+ if (ret == NULL) {
+ err = ENOMEM;
goto err1;
+ }
+ //TODO: errno here
switch (gray) {
case 1:
- if (GP_PXMLoad1bpp(f, *res))
+ if (GP_PXMLoad1bpp(f, ret))
goto err2;
break;
case 3:
- if (GP_PXMLoad2bpp(f, *res))
+ if (GP_PXMLoad2bpp(f, ret))
goto err2;
break;
case 15:
- if (GP_PXMLoad4bpp(f, *res))
+ if (GP_PXMLoad4bpp(f, ret))
goto err2;
break;
case 255:
- if (GP_PXMLoad8bpp(f, *res))
+ if (GP_PXMLoad8bpp(f, ret))
goto err2;
break;
}
fclose(f);
- return GP_ESUCCESS;
+ return ret;
err2:
- free(*res);
+ GP_ContextFree(ret);
err1:
fclose(f);
- return GP_EBADFILE;
+err0:
+ errno = err;
+ return NULL;
}
-GP_RetCode GP_SavePGM(const char *res_path, GP_Context *src)
+int GP_SavePGM(const char *res_path, GP_Context *src,
+ GP_ProgressCallback *callback)
{
FILE *f;
uint32_t gray;
+ int err = EIO;
switch (src->pixel_type) {
case GP_PIXEL_G1:
@@ -184,44 +202,56 @@ GP_RetCode GP_SavePGM(const char *res_path, GP_Context *src)
gray = 255;
break;
default:
- return GP_ENOIMPL;
+ GP_DEBUG(1, "Invalid pixel type '%s'",
+ GP_PixelTypeName(src->pixel_type));
+ errno = EINVAL;
+ return 1;
}
f = fopen(res_path, "w");
if (f == NULL) {
+ err = errno;
GP_DEBUG(1, "Failed to open file '%s': %s",
res_path, strerror(errno));
- return GP_EBADFILE;
+ goto err0;
}
if (fprintf(f, "P2n%u %un%un# Generated by gfxprimn",
(unsigned int) src->w, (unsigned int) src->h, gray) < 3)
- goto err;
+ goto err1;
+ //TODO: errno
switch (gray) {
case 1:
if (GP_PXMSave1bpp(f, src))
- goto err;
+ goto err1;
break;
case 3:
if (GP_PXMSave2bpp(f, src))
- goto err;
+ goto err1;
break;
//TODO
case 255:
if (GP_PXMSave8bpp(f, src))
- goto err;
+ goto err1;
break;
default:
- return GP_ENOIMPL;
+ err = ENOSYS;
+ goto err1;
}
- if (fclose(f))
- return GP_EBADFILE;
+ if (fclose(f)) {
+ err = errno;
+ GP_DEBUG(1, "Failed to close file '%s': %s",
+ res_path, strerror(errno));
+ goto err0;
+ }
- return GP_ESUCCESS;
-err:
+ return 0;
+err1:
fclose(f);
- return GP_EBADFILE;
+err0:
+ errno = err;
+ return 1;
}
diff --git a/libs/loaders/GP_PPM.c b/libs/loaders/GP_PPM.c
index 13a0fa3..04dc472 100644
--- a/libs/loaders/GP_PPM.c
+++ b/libs/loaders/GP_PPM.c
@@ -16,7 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301 USA *
* *
- * Copyright (C) 2009-2011 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
@@ -64,51 +64,61 @@ int load_binary_ppm(FILE *f, uint32_t depth __attribute__((unused)),
return 0;
}
-GP_RetCode GP_LoadPPM(const char *src_path, GP_Context **res)
+GP_Context *GP_LoadPPM(const char *src_path, GP_ProgressCallback *callback)
{
uint32_t w, h, depth;
char fmt;
FILE *f;
+ GP_Context *ret;
+ int err;
f = GP_ReadPNM(src_path, &fmt, &w, &h, &depth);
- if (f == NULL)
- return GP_EBADFILE;
+ if (f == NULL) {
+ err = errno;
+ goto err0;
+ }
if (fmt != '3' && fmt != '6') {
GP_DEBUG(1, "Asked to load PPM but header is 'P%c'", fmt);
+ err = EINVAL;
goto err1;
}
if (depth != 255) {
GP_DEBUG(1, "Unsupported depth %"PRIu32, depth);
+ err = ENOSYS;
goto err1;
}
- *res = GP_ContextAlloc(w, h, GP_PIXEL_RGB888);
+ ret = GP_ContextAlloc(w, h, GP_PIXEL_RGB888);
- if (res == NULL)
+ if (ret == NULL) {
+ err = ENOMEM;
goto err1;
+ }
switch (fmt) {
case '3':
//TODO
- fclose(f);
- free(res);
- return GP_ENOIMPL;
+ err = ENOSYS;
+ goto err2;
case '6':
- if (load_binary_ppm(f, depth, *res))
+ //TODO: errno
+ if (load_binary_ppm(f, depth, ret))
goto err2;
break;
}
fclose(f);
- return GP_ESUCCESS;
+ return ret;
err2:
- free(*res);
+ GP_ContextFree(ret);
err1:
fclose(f);
- return GP_EBADFILE;
+err0:
+ errno = err;
+ return NULL;
}
static int write_binary_ppm(FILE *f, GP_Context *src)
@@ -130,18 +140,23 @@ static int write_binary_ppm(FILE *f, GP_Context *src)
return 0;
}
-GP_RetCode GP_SavePPM(const char *res_path, GP_Context *src, char *fmt)
+int GP_SavePPM(const char *res_path, GP_Context *src, char *fmt,
+ GP_ProgressCallback *callback)
{
char hfmt;
FILE *f;
+ int err;
- if (src->pixel_type != GP_PIXEL_RGB888)
- return GP_ENOIMPL;
+ if (src->pixel_type != GP_PIXEL_RGB888) {
+ errno = EINVAL;
+ return 1;
+ }
switch (*fmt) {
/* ASCII */
case 'a':
- return GP_ENOIMPL;
+ errno = ENOSYS;
+ return 1;
break;
/* binary */
case 'b':
@@ -150,22 +165,32 @@ GP_RetCode GP_SavePPM(const char *res_path, GP_Context *src, char *fmt)
src->w, src->h, res_path);
break;
default:
- return GP_ENOIMPL;
+ errno = EINVAL;
+ return 1;
}
f = GP_WritePNM(res_path, hfmt, src->w, src->h, 255);
-
+
+ if (f == NULL)
+ return 1;
+
if (write_binary_ppm(f, src)) {
GP_DEBUG(1, "Failed to write buffer");
- fclose(f);
- return GP_EBADFILE;
+ err = EIO;
+ goto err1;
}
if (fclose(f) < 0) {
+ err = errno;
GP_DEBUG(1, "Failed to close file '%s' : %s",
res_path, strerror(errno));
- return GP_EBADFILE;
+ goto err0;
}
- return GP_ESUCCESS;
+ return 0;
+err1:
+ fclose(f);
+err0:
+ errno = err;
+ return 1;
}
diff --git a/libs/loaders/GP_PXMCommon.c b/libs/loaders/GP_PXMCommon.c
index 0add2f0..48bc361 100644
--- a/libs/loaders/GP_PXMCommon.c
+++ b/libs/loaders/GP_PXMCommon.c
@@ -19,7 +19,7 @@
* Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
* <jiri.bluebear.dluhos(a)gmail.com> *
* *
- * Copyright (C) 2009-2010 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
@@ -46,7 +46,7 @@ static int read_comment(FILE *f)
}
}
-GP_RetCode GP_PXMLoad1bpp(FILE *f, GP_Context *context)
+int GP_PXMLoad1bpp(FILE *f, GP_Context *context)
{
uint8_t *pixel = context->pixels;
uint32_t x, y;
@@ -58,10 +58,10 @@ GP_RetCode GP_PXMLoad1bpp(FILE *f, GP_Context *context)
while (run) {
switch (fgetc(f)) {
case EOF:
- return GP_EBADFILE;
+ return EIO;
case '#':
if (read_comment(f))
- return GP_EBADFILE;
+ return EIO;
break;
case '0':
*pixel &= ~(0x80>>(x%8));
@@ -86,10 +86,10 @@ GP_RetCode GP_PXMLoad1bpp(FILE *f, GP_Context *context)
pixel++;
}
- return GP_ESUCCESS;
+ return 0;
}
-GP_RetCode GP_PXMLoad2bpp(FILE *f, GP_Context *context)
+int GP_PXMLoad2bpp(FILE *f, GP_Context *context)
{
uint8_t *pixel = context->pixels;
uint32_t x, y;
@@ -101,10 +101,10 @@ GP_RetCode GP_PXMLoad2bpp(FILE *f, GP_Context *context)
while (run) {
switch (fgetc(f)) {
case EOF:
- return GP_EBADFILE;
+ return EIO;
case '#':
if (read_comment(f))
- return GP_EBADFILE;
+ return EIO;
break;
case '0':
*pixel &= ~(0xc0>>(2*(x%4)));
@@ -139,10 +139,10 @@ GP_RetCode GP_PXMLoad2bpp(FILE *f, GP_Context *context)
pixel++;
}
- return GP_ESUCCESS;
+ return 0;
}
-GP_RetCode GP_PXMLoad4bpp(FILE *f, GP_Context *context)
+int GP_PXMLoad4bpp(FILE *f, GP_Context *context)
{
uint8_t *pixel = context->pixels;
uint32_t x, y;
@@ -156,10 +156,10 @@ GP_RetCode GP_PXMLoad4bpp(FILE *f, GP_Context *context)
while (run) {
switch (fgetc(f)) {
case EOF:
- return GP_EBADFILE;
+ return EIO;
case '#':
if (read_comment(f))
- return GP_EBADFILE;
+ return EIO;
break;
case '1':
ch = fgetc(f);
@@ -185,10 +185,10 @@ GP_RetCode GP_PXMLoad4bpp(FILE *f, GP_Context *context)
pixel++;
}
- return GP_ESUCCESS;
+ return 0;
}
-GP_RetCode GP_PXMLoad8bpp(FILE *f, GP_Context *context)
+int GP_PXMLoad8bpp(FILE *f, GP_Context *context)
{
uint8_t *pixel = context->pixels;
uint32_t x, y;
@@ -202,10 +202,10 @@ GP_RetCode GP_PXMLoad8bpp(FILE *f, GP_Context *context)
while (run) {
switch (ch = fgetc(f)) {
case EOF:
- return GP_EBADFILE;
+ return EIO;
case '#':
if (read_comment(f))
- return GP_EBADFILE;
+ return EIO;
break;
case '1' ... '9':
val = ch - '0';
@@ -218,7 +218,7 @@ GP_RetCode GP_PXMLoad8bpp(FILE *f, GP_Context *context)
}
if (val > 255)
- return GP_EBADFILE;
+ return EIO;
case '0':
run = 0;
@@ -233,12 +233,12 @@ GP_RetCode GP_PXMLoad8bpp(FILE *f, GP_Context *context)
}
}
- return GP_ESUCCESS;
+ return 0;
}
#define BITMASK(byte, bit) (!!((byte)&(0x80>>(bit))))
-static GP_RetCode write_line_1bpp(FILE *f, const uint8_t *data, GP_Context *src)
+static int write_line_1bpp(FILE *f, const uint8_t *data, GP_Context *src)
{
uint32_t x, max = src->bytes_per_row;
int ret;
@@ -250,7 +250,7 @@ static GP_RetCode write_line_1bpp(FILE *f, const uint8_t *data, GP_Context *src)
if (x != 0)
if (fprintf(f, " ") < 0)
- return GP_EBADFILE;
+ return EIO;
ret = fprintf(f, "%u %u %u %u %u %u %u %u",
BITMASK(data[x], 0),
@@ -262,26 +262,26 @@ static GP_RetCode write_line_1bpp(FILE *f, const uint8_t *data, GP_Context *src)
BITMASK(data[x], 6),
BITMASK(data[x], 7));
if (ret < 0)
- return GP_EBADFILE;
+ return EIO;
}
for (x = 0; x < (src->w % 8); x++) {
ret = fprintf(f, " %u", BITMASK(data[max], x));
if (ret < 0)
- return GP_EBADFILE;
+ return EIO;
}
if (fprintf(f, "n") < 0)
- return GP_EBADFILE;
+ return EIO;
- return GP_ESUCCESS;
+ return 0;
}
-GP_RetCode GP_PXMSave1bpp(FILE *f, GP_Context *context)
+int GP_PXMSave1bpp(FILE *f, GP_Context *context)
{
uint32_t y;
- GP_RetCode ret;
+ int ret;
for (y = 0; y < context->h; y++) {
ret = write_line_1bpp(f, context->pixels + context->bytes_per_row * y,
@@ -291,12 +291,12 @@ GP_RetCode GP_PXMSave1bpp(FILE *f, GP_Context *context)
return ret;
}
- return GP_ESUCCESS;
+ return 0;
}
#define MASK_2BPP(byte, pix) (0x03 & (byte>>((3 - pix)<<1)))
-static GP_RetCode write_line_2bpp(FILE *f, const uint8_t *data, GP_Context *src)
+static int write_line_2bpp(FILE *f, const uint8_t *data, GP_Context *src)
{
uint32_t x, max = src->bytes_per_row;
int ret;
@@ -308,7 +308,7 @@ static GP_RetCode write_line_2bpp(FILE *f, const uint8_t *data, GP_Context *src)
if (x != 0)
if (fprintf(f, " ") < 0)
- return GP_EBADFILE;
+ return EIO;
ret = fprintf(f, "%u %u %u %u",
MASK_2BPP(data[x], 0),
@@ -316,26 +316,26 @@ static GP_RetCode write_line_2bpp(FILE *f, const uint8_t *data, GP_Context *src)
MASK_2BPP(data[x], 2),
MASK_2BPP(data[x], 3));
if (ret < 0)
- return GP_EBADFILE;
+ return EIO;
}
for (x = 0; x < (src->w % 4); x++) {
ret = fprintf(f, " %u", MASK_2BPP(data[max], x));
if (ret < 0)
- return GP_EBADFILE;
+ return EIO;
}
if (fprintf(f, "n") < 0)
- return GP_EBADFILE;
+ return EIO;
- return GP_ESUCCESS;
+ return EIO;
}
-GP_RetCode GP_PXMSave2bpp(FILE *f, GP_Context *context)
+int GP_PXMSave2bpp(FILE *f, GP_Context *context)
{
uint32_t y;
- GP_RetCode ret;
+ int ret;
for (y = 0; y < context->h; y++) {
ret = write_line_2bpp(f, context->pixels + context->bytes_per_row * y,
@@ -345,10 +345,10 @@ GP_RetCode GP_PXMSave2bpp(FILE *f, GP_Context *context)
return ret;
}
- return GP_ESUCCESS;
+ return EIO;
}
-static GP_RetCode write_line_8bpp(FILE *f, const uint8_t *data, GP_Context *src)
+static int write_line_8bpp(FILE *f, const uint8_t *data, GP_Context *src)
{
uint32_t x;
int ret;
@@ -357,24 +357,24 @@ static GP_RetCode write_line_8bpp(FILE *f, const uint8_t *data, GP_Context *src)
if (x != 0)
if (fprintf(f, " ") < 0)
- return GP_EBADFILE;
+ return EIO;
ret = fprintf(f, "%u", data[x]);
if (ret < 0)
- return GP_EBADFILE;
+ return EIO;
}
if (fprintf(f, "n") < 0)
- return GP_EBADFILE;
+ return EIO;
- return GP_ESUCCESS;
+ return 0;
}
-GP_RetCode GP_PXMSave8bpp(FILE *f, GP_Context *context)
+int GP_PXMSave8bpp(FILE *f, GP_Context *context)
{
uint32_t y;
- GP_RetCode ret;
+ int ret;
for (y = 0; y < context->h; y++) {
ret = write_line_8bpp(f, context->pixels + context->bytes_per_row * y,
@@ -384,5 +384,5 @@ GP_RetCode GP_PXMSave8bpp(FILE *f, GP_Context *context)
return ret;
}
- return GP_ESUCCESS;
+ return 0;
}
diff --git a/libs/loaders/GP_PXMCommon.h b/libs/loaders/GP_PXMCommon.h
index 39e7d02..7ed531e 100644
--- a/libs/loaders/GP_PXMCommon.h
+++ b/libs/loaders/GP_PXMCommon.h
@@ -29,30 +29,29 @@
*/
-#ifndef GP_PXM_COMMON_H
-#define GP_PXM_COMMON_H
+#ifndef LOADERS_GP_PXM_COMMON_H
+#define LOADERS_GP_PXM_COMMON_H
#include <stdio.h>
#include "core/GP_Core.h"
-#include "core/GP_RetCode.h"
/*
* Save context to ascii file.
*
* The pixel type is not checked here as these are internal funcitons.
*/
-GP_RetCode GP_PXMSave1bpp(FILE *f, GP_Context *context);
-GP_RetCode GP_PXMSave2bpp(FILE *f, GP_Context *context);
-GP_RetCode GP_PXMSave4bpp(FILE *f, GP_Context *context);
-GP_RetCode GP_PXMSave8bpp(FILE *f, GP_Context *context);
+int GP_PXMSave1bpp(FILE *f, GP_Context *context);
+int GP_PXMSave2bpp(FILE *f, GP_Context *context);
+int GP_PXMSave4bpp(FILE *f, GP_Context *context);
+int GP_PXMSave8bpp(FILE *f, GP_Context *context);
/*
* Load context from ascii file.
*/
-GP_RetCode GP_PXMLoad1bpp(FILE *f, GP_Context *context);
-GP_RetCode GP_PXMLoad2bpp(FILE *f, GP_Context *context);
-GP_RetCode GP_PXMLoad4bpp(FILE *f, GP_Context *context);
-GP_RetCode GP_PXMLoad8bpp(FILE *f, GP_Context *context);
+int GP_PXMLoad1bpp(FILE *f, GP_Context *context);
+int GP_PXMLoad2bpp(FILE *f, GP_Context *context);
+int GP_PXMLoad4bpp(FILE *f, GP_Context *context);
+int GP_PXMLoad8bpp(FILE *f, GP_Context *context);
/*
* Loads image header, returns pointer to FILE* on success, fills image
@@ -65,4 +64,4 @@ FILE *GP_WriteHeaderPNM(const char *dst_path, char *fmt,
uint32_t w, uint32_t h, uint32_t depth);
-#endif /* GP_PXM_COMMON_H */
+#endif /* LOADERS_GP_PXM_COMMON_H */
-----------------------------------------------------------------------
Summary of changes:
demos/grinder/grinder.c | 6 +-
include/SDL/GP_SDL_Context.h | 1 +
include/SDL/GP_SDL_VideoInit.h | 1 +
include/loaders/GP_Loaders.h | 1 -
include/loaders/GP_PGM.h | 15 ++++---
include/loaders/GP_PPM.h | 15 ++++---
libs/loaders/GP_Loaders.c | 8 +---
libs/loaders/GP_PGM.c | 82 +++++++++++++++++++++++++------------
libs/loaders/GP_PPM.c | 71 ++++++++++++++++++++++----------
libs/loaders/GP_PXMCommon.c | 88 ++++++++++++++++++++--------------------
libs/loaders/GP_PXMCommon.h | 23 +++++-----
11 files changed, 182 insertions(+), 129 deletions(-)
repo.or.cz automatic notification. Contact project admin jiri.bluebear.dluhos(a)gmail.com
if you want to unsubscribe, or site admin admin(a)repo.or.cz if you receive
no reply.
--
gfxprim.git ("A simple 2D graphics library with emphasis on correctness and well-defined operation.")
1
0
[repo.or.cz] gfxprim.git branch master updated: 4337959cd59402d875d9e155659602c1c549676b
by metan 10 Aug '12
by metan 10 Aug '12
10 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via 4337959cd59402d875d9e155659602c1c549676b (commit)
via a7ef27e782e440e2c0c0e215e5180d16b4a07b84 (commit)
from c7be9d64e221992b3205a65b1007653b408ba574 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/4337959cd59402d875d9e155659602c1c549…
commit 4337959cd59402d875d9e155659602c1c549676b
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Fri Aug 10 17:16:49 2012 +0200
core,loaders: Continue on removing the GP_RetCode.
diff --git a/include/core/GP_Pixel.h b/include/core/GP_Pixel.h
index 8fb84a2..f40c8a6 100644
--- a/include/core/GP_Pixel.h
+++ b/include/core/GP_Pixel.h
@@ -32,7 +32,6 @@
#include <stdint.h>
#include "GP_Common.h"
-#include "GP_RetCode.h"
#include "GP_FnPerBpp.h"
struct GP_Context;
diff --git a/include/loaders/GP_Loaders.h b/include/loaders/GP_Loaders.h
index ab0f4ef..286e372 100644
--- a/include/loaders/GP_Loaders.h
+++ b/include/loaders/GP_Loaders.h
@@ -34,6 +34,7 @@
#include "core/GP_Context.h"
#include "core/GP_ProgressCallback.h"
+#include "core/GP_RetCode.h"
#include "GP_PBM.h"
#include "GP_PGM.h"
diff --git a/include/loaders/GP_PBM.h b/include/loaders/GP_PBM.h
index 46b8c3e..82cd45b 100644
--- a/include/loaders/GP_PBM.h
+++ b/include/loaders/GP_PBM.h
@@ -19,17 +19,31 @@
* Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
* <jiri.bluebear.dluhos(a)gmail.com> *
* *
- * Copyright (C) 2009-2011 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
-#ifndef GP_PBM_H
-#define GP_PBM_H
+#ifndef LOADERS_GP_PBM_H
+#define LOADERS_GP_PBM_H
#include "core/GP_Context.h"
+#include "core/GP_ProgressCallback.h"
-GP_RetCode GP_LoadPBM(const char *src_path, GP_Context **res);
+/*
+ * Loads 1-bit Grayscale image from portable bitmap format.
+ */
+GP_Context *GP_LoadPBM(const char *src_path, GP_ProgressCallback *callback);
-GP_RetCode GP_SavePBM(const char *res_path, GP_Context *src);
+/*
+ * Save 1-bit Grayscale image into portable bitmap format.
+ *
+ * On success zero is returned, otherwise non-zero is returned and errno is
+ * filled:
+ *
+ * EINVAL - context pixel type was not 1 bit grayscale.
+ *
+ */
+int GP_SavePBM(const char *res_path, GP_Context *src,
+ GP_ProgressCallback *callback);
-#endif /* GP_PBM_H */
+#endif /* LOADERS_GP_PBM_H */
diff --git a/include/loaders/GP_PGM.h b/include/loaders/GP_PGM.h
index e3420f9..54fd546 100644
--- a/include/loaders/GP_PGM.h
+++ b/include/loaders/GP_PGM.h
@@ -27,6 +27,7 @@
#define GP_PGM_H
#include "core/GP_Context.h"
+#include "core/GP_RetCode.h"
GP_RetCode GP_LoadPGM(const char *src_path, GP_Context **res);
diff --git a/include/loaders/GP_PPM.h b/include/loaders/GP_PPM.h
index 8b57e61..b7d71d7 100644
--- a/include/loaders/GP_PPM.h
+++ b/include/loaders/GP_PPM.h
@@ -24,6 +24,7 @@
#define GP_PPM_H
#include "core/GP_Context.h"
+#include "core/GP_RetCode.h"
GP_RetCode GP_LoadPPM(const char *src_path, GP_Context **res);
diff --git a/libs/loaders/GP_Loaders.c b/libs/loaders/GP_Loaders.c
index f298983..3d19e1a 100644
--- a/libs/loaders/GP_Loaders.c
+++ b/libs/loaders/GP_Loaders.c
@@ -89,11 +89,9 @@ GP_Context *GP_LoadImage(const char *src_path, GP_ProgressCallback *callback)
switch (src_path[len - 2]) {
case 'b':
case 'B':
- //TODO: Fix this!!!
if (src_path[len - 3] == 'p' ||
src_path[len - 3] == 'P') {
- GP_LoadPBM(src_path, &res);
- return res;
+ return GP_LoadPBM(src_path, callback);
}
break;
case 'g':
diff --git a/libs/loaders/GP_PBM.c b/libs/loaders/GP_PBM.c
index 5b09153..ac7dc30 100644
--- a/libs/loaders/GP_PBM.c
+++ b/libs/loaders/GP_PBM.c
@@ -19,7 +19,7 @@
* Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
* <jiri.bluebear.dluhos(a)gmail.com> *
* *
- * Copyright (C) 2009-2010 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
@@ -44,17 +44,21 @@
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
+#include <errno.h>
#include "GP_PXMCommon.h"
#include "GP_PBM.h"
-GP_RetCode GP_LoadPBM(const char *src_path, GP_Context **res)
+GP_Context *GP_LoadPBM(const char *src_path, GP_ProgressCallback *callback)
{
- FILE *f = fopen(src_path, "r");
+ FILE *f;
+ GP_Context *ret;
uint32_t w, h;
+ f = fopen(src_path, "r");
+
if (f == NULL)
- return GP_EBADFILE;
+ return NULL;
if (fgetc(f) != 'P' || fgetc(f) != '1')
goto err1;
@@ -62,36 +66,40 @@ GP_RetCode GP_LoadPBM(const char *src_path, GP_Context **res)
if (fscanf(f, "%"PRIu32"%"PRIu32, &w, &h) < 2)
goto err1;
- *res = GP_ContextAlloc(w, h, GP_PIXEL_G1);
+ ret = GP_ContextAlloc(w, h, GP_PIXEL_G1);
- if (*res == NULL) {
+ if (ret == NULL) {
fclose(f);
- return GP_ENOMEM;
+ errno = ENOMEM;
+ return NULL;
}
- if (GP_PXMLoad1bpp(f, *res))
+ if (GP_PXMLoad1bpp(f, ret))
goto err2;
fclose(f);
- return GP_ESUCCESS;
+ return ret;
err2:
- free(*res);
+ free(ret);
err1:
fclose(f);
- return GP_EBADFILE;
+ return NULL;
}
-GP_RetCode GP_SavePBM(const char *res_path, GP_Context *src)
+int GP_SavePBM(const char *res_path, GP_Context *src,
+ GP_ProgressCallback *callback)
{
FILE *f;
- if (src->pixel_type != GP_PIXEL_G1)
- return GP_ENOIMPL;
+ if (src->pixel_type != GP_PIXEL_G1) {
+ errno = EINVAL;
+ return 1;
+ }
f = fopen(res_path, "w");
if (f == NULL)
- return GP_EBADFILE;
+ return 1;
if (fprintf(f, "P1n%u %un# Generated by gfxprimn",
(unsigned int) src->w, (unsigned int) src->h) < 2)
@@ -101,10 +109,12 @@ GP_RetCode GP_SavePBM(const char *res_path, GP_Context *src)
goto err;
if (fclose(f))
- return GP_EBADFILE;
+ return 1;
- return GP_ESUCCESS;
+ return 0;
err:
fclose(f);
- return GP_EBADFILE;
+ //TODO: better errors
+ errno = EIO;
+ return 1;
}
diff --git a/libs/loaders/GP_PPM.c b/libs/loaders/GP_PPM.c
index e84b71b..13a0fa3 100644
--- a/libs/loaders/GP_PPM.c
+++ b/libs/loaders/GP_PPM.c
@@ -37,6 +37,7 @@
#include <GP_GetPutPixel.h>
#include "GP_PNM.h"
+#include "GP_PPM.h"
int load_binary_ppm(FILE *f, uint32_t depth __attribute__((unused)),
GP_Context *res)
diff --git a/libs/loaders/GP_PXMCommon.h b/libs/loaders/GP_PXMCommon.h
index 1a3fc04..39e7d02 100644
--- a/libs/loaders/GP_PXMCommon.h
+++ b/libs/loaders/GP_PXMCommon.h
@@ -19,7 +19,7 @@
* Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
* <jiri.bluebear.dluhos(a)gmail.com> *
* *
- * Copyright (C) 2009-2010 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
@@ -34,6 +34,7 @@
#include <stdio.h>
#include "core/GP_Core.h"
+#include "core/GP_RetCode.h"
/*
* Save context to ascii file.
diff --git a/pylib/gfxprim/core/core.i b/pylib/gfxprim/core/core.i
index bfd4649..67777dd 100644
--- a/pylib/gfxprim/core/core.i
+++ b/pylib/gfxprim/core/core.i
@@ -20,7 +20,6 @@ ERROR_ON_NULL(GP_GetCounter);
%include "GP_GetSetBits.h"
%include "GP_Transform.h"
%include "GP_ProgressCallback.h"
-%include "GP_RetCode.h"
/*
http://repo.or.cz/w/gfxprim.git/commit/a7ef27e782e440e2c0c0e215e5180d16b4a0…
commit a7ef27e782e440e2c0c0e215e5180d16b4a07b84
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Fri Aug 10 14:33:55 2012 +0200
tests: Remove obsolete font test.
diff --git a/tests/text/font.test.c b/tests/text/font.test.c
deleted file mode 100644
index 7775ab8..0000000
--- a/tests/text/font.test.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/*****************************************************************************
- * This file is part of gfxprim library. *
- * *
- * Gfxprim is free software; you can redistribute it and/or *
- * modify it under the terms of the GNU Lesser General Public *
- * License as published by the Free Software Foundation; either *
- * version 2.1 of the License, or (at your option) any later version. *
- * *
- * Gfxprim 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 *
- * Lesser General Public License for more details. *
- * *
- * You should have received a copy of the GNU Lesser General Public *
- * License along with gfxprim; if not, write to the Free Software *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
- * Boston, MA 02110-1301 USA *
- * *
- * Copyright (C) 2011 Tomas Gavenciak <gavento(a)ucw.cz> *
- * *
- *****************************************************************************/
-
-/*
-
- Font load/save tests.
-
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <GP.h>
-
-#include "GP_Tests.h"
-
-#define FONT_FILE "test_font.tmp"
-
-GP_SUITE(font)
-
-GP_TEST(load_save)
-{
- GP_Font *loaded;
- int dd_size, ld_size;
-
- fail_unless(GP_FontSave(&GP_default_console_font, FONT_FILE) == GP_ESUCCESS);
- fail_unless(GP_FontLoad(&loaded, FONT_FILE) == GP_ESUCCESS);
-
- dd_size = GP_GetFontDataSize(&GP_default_console_font);
- ld_size = GP_GetFontDataSize(loaded);
-
- fail_unless(dd_size == ld_size);
-
- fail_unless(memcmp(GP_default_console_font.data, loaded->data, dd_size) == 0);
-
- /* cleanup */
- fail_unless(unlink(FONT_FILE) == 0);
-}
-GP_ENDTEST
-
-----------------------------------------------------------------------
Summary of changes:
include/core/GP_Pixel.h | 1 -
include/loaders/GP_Loaders.h | 1 +
include/loaders/GP_PBM.h | 26 ++++++++++++++----
include/loaders/GP_PGM.h | 1 +
include/loaders/GP_PPM.h | 1 +
libs/loaders/GP_Loaders.c | 4 +--
libs/loaders/GP_PBM.c | 46 ++++++++++++++++++++-------------
libs/loaders/GP_PPM.c | 1 +
libs/loaders/GP_PXMCommon.h | 3 +-
pylib/gfxprim/core/core.i | 1 -
tests/text/font.test.c | 58 ------------------------------------------
11 files changed, 55 insertions(+), 88 deletions(-)
delete mode 100644 tests/text/font.test.c
repo.or.cz automatic notification. Contact project admin jiri.bluebear.dluhos(a)gmail.com
if you want to unsubscribe, or site admin admin(a)repo.or.cz if you receive
no reply.
--
gfxprim.git ("A simple 2D graphics library with emphasis on correctness and well-defined operation.")
1
0
[repo.or.cz] gfxprim.git branch master updated: c7be9d64e221992b3205a65b1007653b408ba574
by metan 03 Aug '12
by metan 03 Aug '12
03 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via c7be9d64e221992b3205a65b1007653b408ba574 (commit)
via 85ff7a0aeccbddfdd69611f6dd3128162aff6996 (commit)
via e086670095af025857270b996b7a5d2deec42820 (commit)
via 7dc5026aa07022e0b17da3b5fd173eaa900ec3b2 (commit)
via dff4c0ec8bdcc90fab43fe7cc627d8d164cde641 (commit)
from faaba1897920ea54344ca36ec8c6633d0a6ebf1d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/c7be9d64e221992b3205a65b1007653b408b…
commit c7be9d64e221992b3205a65b1007653b408ba574
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Thu Aug 2 16:05:56 2012 +0200
filters: Add gaussian additive noise filter.
diff --git a/demos/grinder/grinder.c b/demos/grinder/grinder.c
index 648e950..5434e65 100644
--- a/demos/grinder/grinder.c
+++ b/demos/grinder/grinder.c
@@ -692,6 +692,27 @@ static int sharpen(GP_Context **c, const char *params)
return 0;
}
+/* gaussian additive noise filter */
+
+static struct param gauss_noise_params[] = {
+ {"sigma", PARAM_FLOAT, "sigma: amount of noise between [0,1]", NULL, NULL},
+ {"mu", PARAM_FLOAT, "mu: offset of noise between [0,1]", NULL, NULL},
+ {NULL, 0, NULL, NULL, NULL}
+};
+
+static int gauss_noise(GP_Context **c, const char *params)
+{
+ float sigma = 0.1;
+ float mu = 0;
+
+ if (param_parse(params, gauss_noise_params, "gaussian noise", param_err, &sigma, &mu))
+ return EINVAL;
+
+ GP_FilterGaussianNoiseAdd(*c, *c, sigma, mu, progress_callback);
+
+ return 0;
+}
+
/* arithmetics */
static const char *arithmetic_ops[] = {
@@ -806,6 +827,7 @@ static struct filter filter_table[] = {
{"median", "median filter", median_params, median},
{"sigma", "sigma (mean) filter", sigma_mean_params, sigma_mean},
{"sharpen", "laplacian edge sharpening", sharpen_params, sharpen},
+ {"gauss_noise", "additive gaussian (normaly distributed) noise", gauss_noise_params, gauss_noise},
{"jpg", "save jpg image", save_jpg_params, save_jpg},
{"png", "save png image", save_png_params, save_png},
{NULL, NULL, NULL, NULL}
diff --git a/include/filters/GP_Filters.h b/include/filters/GP_Filters.h
index e685ec3..cd06035 100644
--- a/include/filters/GP_Filters.h
+++ b/include/filters/GP_Filters.h
@@ -74,4 +74,7 @@
/* Sigma Mean filter */
#include "filters/GP_Sigma.h"
+/* Gaussian noise filter */
+#include "filters/GP_GaussianNoise.h"
+
#endif /* GP_FILTERS_H */
diff --git a/include/filters/GP_GaussianNoise.h b/include/filters/GP_GaussianNoise.h
new file mode 100644
index 0000000..59d9d35
--- /dev/null
+++ b/include/filters/GP_GaussianNoise.h
@@ -0,0 +1,70 @@
+/*****************************************************************************
+ * This file is part of gfxprim library. *
+ * *
+ * Gfxprim is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Lesser General Public *
+ * License as published by the Free Software Foundation; either *
+ * version 2.1 of the License, or (at your option) any later version. *
+ * *
+ * Gfxprim 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 *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with gfxprim; if not, write to the Free Software *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
+ * Boston, MA 02110-1301 USA *
+ * *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
+ * *
+ *****************************************************************************/
+
+ /*
+
+ Additive Gaussian noise filters.
+
+ The sigma and mu parameters define the noise parameters. The sigma defines
+ amount of randomness, the mu defines offset. Both are defined as a ratio of
+ the particular channel size.
+
+ */
+
+#ifndef GP_FILTERS_GAUSSIAN_NOISE_H
+#define GP_FILTERS_GAUSSIAN_NOISE_H
+
+#include "GP_Filter.h"
+
+int GP_FilterGaussianNoiseAddEx(const GP_Context *src,
+ GP_Coord x_src, GP_Coord y_src,
+ GP_Size w_src, GP_Size h_src,
+ GP_Context *dst,
+ GP_Coord x_dst, GP_Coord y_dst,
+ float sigma, float mu,
+ GP_ProgressCallback *callback);
+
+GP_Context *GP_FilterGaussianNoiseAddExAlloc(const GP_Context *src,
+ GP_Coord x_src, GP_Coord y_src,
+ GP_Size w_src, GP_Size h_src,
+ float sigma, float mu,
+ GP_ProgressCallback *callback);
+
+static inline int GP_FilterGaussianNoiseAdd(const GP_Context *src,
+ GP_Context *dst,
+ float sigma, float mu,
+ GP_ProgressCallback *callback)
+{
+ return GP_FilterGaussianNoiseAddEx(src, 0, 0, src->w, src->h,
+ dst, 0, 0, sigma, mu, callback);
+}
+
+static inline GP_Context *
+GP_FilterGaussianNoiseAddAlloc(const GP_Context *src,
+ float sigma, float mu,
+ GP_ProgressCallback *callback)
+{
+ return GP_FilterGaussianNoiseAddExAlloc(src, 0, 0, src->w, src->h,
+ sigma, mu, callback);
+}
+
+#endif /* GP_FILTERS_GAUSSIAN_NOISE_H */
diff --git a/include/filters/GP_Filters.h b/include/filters/GP_Rand.h
similarity index 55%
copy from include/filters/GP_Filters.h
copy to include/filters/GP_Rand.h
index e685ec3..0fc7e18 100644
--- a/include/filters/GP_Filters.h
+++ b/include/filters/GP_Rand.h
@@ -16,62 +16,25 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301 USA *
* *
- * Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
- * <jiri.bluebear.dluhos(a)gmail.com> *
- * *
- * Copyright (C) 2009-2011 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
/*
- GP_Context filters.
+ Functions to generate random numbers.
*/
-#ifndef GP_FILTERS_H
-#define GP_FILTERS_H
-
-/* Filter per channel parameter passing interface */
-#include "filters/GP_FilterParam.h"
-
-/* Point filters, brightness, contrast ... */
-#include "filters/GP_Point.h"
-
-/* Addition, difference, min, max ... */
-#include "filters/GP_Arithmetic.h"
-
-/* Histograms, ... */
-#include "filters/GP_Stats.h"
-
-/* Image rotations (90 180 270 grads) and mirroring */
-#include "filters/GP_Rotate.h"
-
-/* Linear convolution Raw API */
-#include "filters/GP_Linear.h"
-
-/* Convolution filters */
-#include "filters/GP_Convolution.h"
+#ifndef FILTERS_GP_RAND_H
+#define FILTERS_GP_RAND_H
-/* Blur filters */
-#include "filters/GP_Blur.h"
-
-/* Image scaling (resampling) */
-#include "filters/GP_Resize.h"
-
-/* Bitmap dithering */
-#include "filters/GP_Dither.h"
-
-/* Laplace based filters */
-#include "filters/GP_Laplace.h"
-
-/* Median filter */
-#include "filters/GP_Median.h"
-
-/* Weighted Median filter */
-#include "filters/GP_WeightedMedian.h"
-
-/* Sigma Mean filter */
-#include "filters/GP_Sigma.h"
+/*
+ * Fills the array with size integers with Normal (Gaussian) distribution
+ * defined by sigma and mu parameters.
+ *
+ * The size _MUST_ be odd.
+ */
+void GP_NormInt(int *arr, unsigned int size, int sigma, int mu);
-#endif /* GP_FILTERS_H */
+#endif /* FILTERS_GP_RAND_H */
diff --git a/libs/filters/GP_GaussianNoise.gen.c.t b/libs/filters/GP_GaussianNoise.gen.c.t
new file mode 100644
index 0000000..1d8c8a6
--- /dev/null
+++ b/libs/filters/GP_GaussianNoise.gen.c.t
@@ -0,0 +1,149 @@
+%% extends "filter.c.t"
+
+{% block descr %}Gaussian Noise{% endblock %}
+
+%% block body
+
+#include "core/GP_Context.h"
+#include "core/GP_GetPutPixel.h"
+#include "core/GP_TempAlloc.h"
+//#include "core/GP_Gamma.h"
+#include "core/GP_Clamp.h"
+#include "core/GP_Debug.h"
+
+#include "GP_Rand.h"
+#include "GP_GaussianNoise.h"
+
+%% for pt in pixeltypes
+%% if not pt.is_unknown() and not pt.is_palette()
+static int GP_FilterGaussianNoiseAdd_{{ pt.name }}_Raw(const GP_Context *src,
+ GP_Coord x_src, GP_Coord y_src,
+ GP_Size w_src, GP_Size h_src,
+ GP_Context *dst,
+ GP_Coord x_dst, GP_Coord y_dst,
+ float sigma, float mu,
+ GP_ProgressCallback *callback)
+{
+ GP_DEBUG(1, "Additive Gaussian noise filter %ux%u sigma=%f mu=%f",
+ w_src, h_src, sigma, mu);
+
+ %% for c in pt.chanslist
+ int sigma_{{ c[0] }} = {{ 2 ** c[2] - 1 }} * sigma;
+ int mu_{{ c[0] }} = {{ 2 ** c[2] - 1 }} * mu;
+ %% endfor
+
+ unsigned int size = w_src + w_src%2;
+
+ /* Create temporary buffers */
+ GP_TempAllocCreate(temp, sizeof(int) * size * {{ len(pt.chanslist) }});
+
+ %% for c in pt.chanslist
+ int *{{ c[0] }} = GP_TempAllocGet(temp, size * sizeof(int));
+ %% endfor
+
+ /* Apply the additive noise filter */
+ unsigned int x, y;
+
+ for (y = 0; y < h_src; y++) {
+ %% for c in pt.chanslist
+ GP_NormInt({{ c[0] }}, size, sigma_{{ c[0] }}, mu_{{ c[0] }});
+ %% endfor
+
+ for (x = 0; x < w_src; x++) {
+ GP_Pixel pix = GP_GetPixel_Raw_{{ pt.pixelsize.suffix }}(src, x + x_src, y + y_src);
+
+ %% for c in pt.chanslist
+ {{ c[0] }}[x] += GP_Pixel_GET_{{ c[0] }}_{{ pt.name }}(pix);
+ {{ c[0] }}[x] = GP_CLAMP({{ c[0] }}[x], 0, {{ 2 ** c[2] - 1 }});
+ %% endfor
+
+ pix = GP_Pixel_CREATE_{{ pt.name }}({{ expand_chanslist(pt, "", "[x]") }});
+ GP_PutPixel_Raw_{{ pt.pixelsize.suffix }}(dst, x + x_dst, y + y_dst, pix);
+ }
+
+ if (GP_ProgressCallbackReport(callback, y, h_src, w_src)) {
+ GP_TempAllocFree(temp);
+ return 1;
+ }
+ }
+
+ GP_TempAllocFree(temp);
+ GP_ProgressCallbackDone(callback);
+
+ return 0;
+}
+
+%% endif
+%% endfor
+
+int GP_FilterGaussianNoiseAdd_Raw(const GP_Context *src,
+ GP_Coord x_src, GP_Coord y_src,
+ GP_Size w_src, GP_Size h_src,
+ GP_Context *dst,
+ GP_Coord x_dst, GP_Coord y_dst,
+ float sigma, float mu,
+ GP_ProgressCallback *callback)
+{
+ switch (src->pixel_type) {
+ %% for pt in pixeltypes
+ %% if not pt.is_unknown() and not pt.is_palette()
+ case GP_PIXEL_{{ pt.name }}:
+ return GP_FilterGaussianNoiseAdd_{{ pt.name }}_Raw(src, x_src,
+ y_src, w_src, h_src, dst, x_dst, y_dst,
+ sigma, mu, callback);
+ break;
+ %% endif
+ %% endfor
+ default:
+ return -1;
+ }
+}
+
+int GP_FilterGaussianNoiseAddEx(const GP_Context *src,
+ GP_Coord x_src, GP_Coord y_src,
+ GP_Size w_src, GP_Size h_src,
+ GP_Context *dst,
+ GP_Coord x_dst, GP_Coord y_dst,
+ float sigma, float mu,
+ GP_ProgressCallback *callback)
+{
+ GP_CHECK(src->pixel_type == dst->pixel_type);
+
+ /* Check that destination is large enough */
+ GP_CHECK(x_dst + (GP_Coord)w_src <= (GP_Coord)dst->w);
+ GP_CHECK(y_dst + (GP_Coord)h_src <= (GP_Coord)dst->h);
+
+ /* Source is large enough */
+ GP_CHECK(x_src + w_src <= src->w);
+ GP_CHECK(y_src + h_src <= src->h);
+
+ return GP_FilterGaussianNoiseAdd_Raw(src, x_src, y_src, w_src, h_src,
+ dst, x_dst, y_dst,
+ sigma, mu, callback);
+}
+
+GP_Context *GP_FilterGaussianNoiseAddExAlloc(const GP_Context *src,
+ GP_Coord x_src, GP_Coord y_src,
+ GP_Size w_src, GP_Size h_src,
+ float sigma, float mu,
+ GP_ProgressCallback *callback)
+{
+ int ret;
+
+ GP_Context *dst = GP_ContextAlloc(w_src, h_src, src->pixel_type);
+
+ if (dst == NULL)
+ return NULL;
+
+ ret = GP_FilterGaussianNoiseAdd_Raw(src, x_src, y_src, w_src, h_src,
+ dst, 0, 0, sigma, mu, callback);
+
+ if (ret) {
+ GP_ContextFree(dst);
+ return NULL;
+ }
+
+ return dst;
+}
+
+%% endblock body
diff --git a/include/filters/GP_Filters.h b/libs/filters/GP_Rand.c
similarity index 55%
copy from include/filters/GP_Filters.h
copy to libs/filters/GP_Rand.c
index e685ec3..f571585 100644
--- a/include/filters/GP_Filters.h
+++ b/libs/filters/GP_Rand.c
@@ -16,62 +16,37 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301 USA *
* *
- * Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
- * <jiri.bluebear.dluhos(a)gmail.com> *
- * *
- * Copyright (C) 2009-2011 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
-/*
-
- GP_Context filters.
-
- */
-
-#ifndef GP_FILTERS_H
-#define GP_FILTERS_H
-
-/* Filter per channel parameter passing interface */
-#include "filters/GP_FilterParam.h"
-
-/* Point filters, brightness, contrast ... */
-#include "filters/GP_Point.h"
-
-/* Addition, difference, min, max ... */
-#include "filters/GP_Arithmetic.h"
-
-/* Histograms, ... */
-#include "filters/GP_Stats.h"
-
-/* Image rotations (90 180 270 grads) and mirroring */
-#include "filters/GP_Rotate.h"
-
-/* Linear convolution Raw API */
-#include "filters/GP_Linear.h"
+#include <math.h>
-/* Convolution filters */
-#include "filters/GP_Convolution.h"
+#include "core/GP_Common.h"
-/* Blur filters */
-#include "filters/GP_Blur.h"
+#include "GP_Rand.h"
-/* Image scaling (resampling) */
-#include "filters/GP_Resize.h"
+void GP_NormInt(int *arr, unsigned int size, int sigma, int mu)
+{
+ unsigned int i = 0;
+ float a, b, rsq;
-/* Bitmap dithering */
-#include "filters/GP_Dither.h"
+ GP_ASSERT(size%2 == 0);
-/* Laplace based filters */
-#include "filters/GP_Laplace.h"
+ while (i < size) {
+ /* Sample two point inside of the unit circle */
+ do {
+ a = (float)random() / (RAND_MAX/2) - 1;
+ b = (float)random() / (RAND_MAX/2) - 1;
-/* Median filter */
-#include "filters/GP_Median.h"
+ rsq = a * a + b * b;
-/* Weighted Median filter */
-#include "filters/GP_WeightedMedian.h"
+ } while (rsq >= 1 || rsq == 0);
-/* Sigma Mean filter */
-#include "filters/GP_Sigma.h"
+ /* Polar form of the Box-Muller transformation */
+ float mul = sqrtf(-2.0 * logf(rsq)/rsq);
-#endif /* GP_FILTERS_H */
+ arr[i++] = mu + sigma * a * mul;
+ arr[i++] = mu + sigma * b * mul;
+ }
+}
diff --git a/libs/filters/Makefile b/libs/filters/Makefile
index c9661e6..cedc55a 100644
--- a/libs/filters/Makefile
+++ b/libs/filters/Makefile
@@ -3,7 +3,7 @@ TOPDIR=../..
STATS_FILTERS=GP_Histogram.gen.c
POINT_FILTERS=GP_Contrast.gen.c GP_Brightness.gen.c GP_Invert.gen.c- GP_Point.gen.c GP_Noise.gen.c
+ GP_Point.gen.c GP_Noise.gen.c GP_GaussianNoise.gen.c
ARITHMETIC_FILTERS=GP_Difference.gen.c GP_Addition.gen.c GP_Min.gen.c GP_Max.gen.c GP_Multiply.gen.c
http://repo.or.cz/w/gfxprim.git/commit/85ff7a0aeccbddfdd69611f6dd3128162aff…
commit 85ff7a0aeccbddfdd69611f6dd3128162aff6996
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Thu Aug 2 14:47:34 2012 +0200
demos: c_simple: Ported input test from SDL.
diff --git a/demos/c_simple/Makefile b/demos/c_simple/Makefile
index ec6ac66..99af986 100644
--- a/demos/c_simple/Makefile
+++ b/demos/c_simple/Makefile
@@ -8,7 +8,7 @@ LDLIBS+=-lrt `$(TOPDIR)/gfxprim-config --libs --libs-backends`
APPS=backend_example loaders_example loaders filters_symmetry gfx_koch virtual_backend_example meta_data meta_data_dump tmp_file showimage- v4l2_show v4l2_grab convolution weighted_median shapetest koch
+ v4l2_show v4l2_grab convolution weighted_median shapetest koch input
v4l2_show: LDLIBS+=-lGP_grabbers
v4l2_grab: LDLIBS+=-lGP_grabbers
diff --git a/tests/SDL/input.c b/demos/c_simple/input.c
similarity index 54%
rename from tests/SDL/input.c
rename to demos/c_simple/input.c
index c2b1cde..6a083e2 100644
--- a/tests/SDL/input.c
+++ b/demos/c_simple/input.c
@@ -19,32 +19,20 @@
* Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos *
* <jiri.bluebear.dluhos(a)gmail.com> *
* *
- * Copyright (C) 2009-2011 Cyril Hrubis <metan(a)ucw.cz> *
+ * Copyright (C) 2009-2012 Cyril Hrubis <metan(a)ucw.cz> *
* *
*****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
-#include <SDL/SDL.h>
+#include <unistd.h>
#include "GP.h"
-#include "GP_SDL.h"
-SDL_Surface *display = NULL;
-GP_Context context;
+static GP_Context *win;
+static GP_Backend *backend;
-SDL_TimerID timer;
-SDL_UserEvent timer_event;
-
-GP_Pixel black_pixel, red_pixel, green_pixel, white_pixel;
-
-Uint32 timer_callback(__attribute__((unused)) Uint32 interval,
- __attribute__((unused)) void *param)
-{
- timer_event.type = SDL_USEREVENT;
- SDL_PushEvent((SDL_Event *) &timer_event);
- return 30;
-}
+static GP_Pixel red, green, white, black;
static void draw_event(GP_Event *ev)
{
@@ -55,20 +43,19 @@ static void draw_event(GP_Event *ev)
int align = GP_ALIGN_RIGHT|GP_VALIGN_BOTTOM;
- GP_TextClear(&context, NULL, 20, 20, align, black_pixel, size);
- size = GP_Print(&context, NULL, 20, 20, align,
- white_pixel, black_pixel, "Key=%s",
+ GP_TextClear(win, NULL, 20, 20, align, black, size);
+ size = GP_Print(win, NULL, 20, 20, align,
+ white, black, "Key=%s",
GP_EventKeyName(ev->val.key.key));
- SDL_Flip(display);
+
+ GP_BackendFlip(backend);
}
static void event_loop(void)
{
- SDL_Event event;
-
- while (SDL_WaitEvent(&event) > 0) {
- GP_InputDriverSDLEventPut(&event);
-
+ for (;;) {
+ GP_BackendWait(backend);
+
while (GP_EventQueued()) {
GP_Event ev;
@@ -81,17 +68,17 @@ static void event_loop(void)
switch (ev.val.key.key) {
case GP_KEY_ESC:
- SDL_Quit();
+ GP_BackendExit(backend);
exit(0);
break;
case GP_BTN_LEFT:
- GP_HLineXXY(&context, ev.cursor_x - 3,
+ GP_HLineXXY(win, ev.cursor_x - 3,
ev.cursor_x + 3,
- ev.cursor_y, red_pixel);
- GP_VLineXYY(&context, ev.cursor_x,
+ ev.cursor_y, red);
+ GP_VLineXYY(win, ev.cursor_x,
ev.cursor_y - 3,
- ev.cursor_y + 3, red_pixel);
- SDL_Flip(display);
+ ev.cursor_y + 3, red);
+ GP_BackendFlip(backend);
break;
default:
break;
@@ -102,18 +89,17 @@ static void event_loop(void)
static int size = 0;
case GP_EV_REL_POS:
if (GP_EventGetKey(&ev, GP_BTN_LEFT)) {
- GP_PutPixel(&context, ev.cursor_x,
- ev.cursor_y, green_pixel);
- SDL_Flip(display);
+ GP_PutPixel(win, ev.cursor_x,
+ ev.cursor_y, green);
}
int align = GP_ALIGN_RIGHT|GP_VALIGN_BOTTOM;
- GP_TextClear(&context, NULL, 20, 40, align,
- black_pixel, size);
- size = GP_Print(&context, NULL, 20, 40, align,
- white_pixel, black_pixel, "X=%3u Y=%3u",
+ GP_TextClear(win, NULL, 20, 40, align,
+ black, size);
+ size = GP_Print(win, NULL, 20, 40, align,
+ white, black, "X=%3u Y=%3u",
ev.cursor_x, ev.cursor_y);
- SDL_Flip(display);
+ GP_BackendFlip(backend);
break;
}
break;
@@ -124,49 +110,48 @@ static void event_loop(void)
int main(int argc, char *argv[])
{
- int display_bpp = 0;
-
- int i;
- for (i = 1; i < argc; i++) {
- if (strcmp(argv[i], "-16") == 0) {
- display_bpp = 16;
- } else if (strcmp(argv[i], "-24") == 0) {
- display_bpp = 24;
+ const char *backend_opts = "X11";
+ int opt;
+
+ while ((opt = getopt(argc, argv, "b:h")) != -1) {
+ switch (opt) {
+ case 'b':
+ backend_opts = optarg;
+ break;
+ case 'h':
+ GP_BackendInit(NULL, NULL, stderr);
+ return 0;
+ break;
+ default:
+ fprintf(stderr, "Invalid paramter '%c'n", opt);
+ return 1;
}
}
- /* Initialize SDL */
- if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0) {
- fprintf(stderr, "Could not initialize SDL: %sn", SDL_GetError());
- return 1;
- }
+// GP_SetDebugLevel(10);
- display = SDL_SetVideoMode(480, 640, display_bpp, SDL_SWSURFACE);
- if (display == NULL) {
- fprintf(stderr, "Could not open display: %sn", SDL_GetError());
- goto fail;
+ backend = GP_BackendInit(backend_opts, "Input Test", stderr);
+
+ if (backend == NULL) {
+ fprintf(stderr, "Failed to initalize backend '%s'n",
+ backend_opts);
+ return 1;
}
+
+ win = backend->context;
- GP_EventSetScreenSize(480, 640);
+ red = GP_ColorToContextPixel(GP_COL_RED, win);
+ green = GP_ColorToContextPixel(GP_COL_GREEN, win);
+ white = GP_ColorToContextPixel(GP_COL_WHITE, win);
+ black = GP_ColorToContextPixel(GP_COL_BLACK, win);
- GP_SDL_ContextFromSurface(&context, display);
+ GP_Fill(win, black);
+ GP_BackendFlip(backend);
- red_pixel = GP_ColorToContextPixel(GP_COL_RED, &context);
- green_pixel = GP_ColorToContextPixel(GP_COL_GREEN, &context);
- white_pixel = GP_ColorToContextPixel(GP_COL_WHITE, &context);
- black_pixel = GP_ColorToContextPixel(GP_COL_BLACK, &context);
+ GP_EventSetScreenSize(win->w, win->h);
- timer = SDL_AddTimer(30, timer_callback, NULL);
- if (timer == 0) {
- fprintf(stderr, "Could not set up timer: %sn", SDL_GetError());
- goto fail;
+ for (;;) {
+ GP_BackendWait(backend);
+ event_loop();
}
-
- event_loop();
- SDL_Quit();
- return 0;
-
-fail:
- SDL_Quit();
- return 1;
}
diff --git a/tests/SDL/Makefile b/tests/SDL/Makefile
index 228df9e..4455172 100644
--- a/tests/SDL/Makefile
+++ b/tests/SDL/Makefile
@@ -8,7 +8,7 @@ ifeq ($(HAVE_LIBSDL),yes)
CSOURCES=$(shell echo *.c)
APPS=pixeltest fileview fonttest linetest randomshapetest- symbolstest textaligntest trianglefps input blittest subcontext showimage+ symbolstest textaligntest trianglefps blittest subcontext showimage aatest mixpixeltest
endif
http://repo.or.cz/w/gfxprim.git/commit/e086670095af025857270b996b7a5d2deec4…
commit e086670095af025857270b996b7a5d2deec42820
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Thu Aug 2 14:25:44 2012 +0200
demos: grinder: Get rid of GP_RetCode.
diff --git a/demos/grinder/grinder.c b/demos/grinder/grinder.c
index fbf0e21..648e950 100644
--- a/demos/grinder/grinder.c
+++ b/demos/grinder/grinder.c
@@ -106,18 +106,18 @@ static struct param resize_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode resize(GP_Context **c, const char *params)
+static int resize(GP_Context **c, const char *params)
{
int alg = 1;
float ratio = -1;
if (param_parse(params, resize_params, "resize", param_err,
&alg, &ratio))
- return GP_EINVAL;
+ return EINVAL;
if (ratio == -1) {
print_error("resize: ratio parameter is missing");
- return GP_EINVAL;
+ return EINVAL;
}
GP_Size w = ratio * (*c)->w;
@@ -127,12 +127,12 @@ static GP_RetCode resize(GP_Context **c, const char *params)
res = GP_FilterResize(*c, NULL, alg, w, h, progress_callback);
if (res == NULL)
- return GP_EINVAL;
+ return EINVAL;
GP_ContextFree(*c);
*c = res;
- return GP_ESUCCESS;
+ return 0;
}
/* scale filter */
@@ -164,7 +164,7 @@ static struct param scale_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode scale(GP_Context **c, const char *params)
+static int scale(GP_Context **c, const char *params)
{
int alg = 1;
int w = -1;
@@ -172,11 +172,11 @@ static GP_RetCode scale(GP_Context **c, const char *params)
if (param_parse(params, scale_params, "scale", param_err,
&alg, &w, &h))
- return GP_EINVAL;
+ return EINVAL;
if (w == -1 && h == -1) {
print_error("scale: w and/or h missing");
- return GP_EINVAL;
+ return EINVAL;
}
if (w == -1)
@@ -190,12 +190,12 @@ static GP_RetCode scale(GP_Context **c, const char *params)
res = GP_FilterResize(*c, NULL, alg, w, h, progress_callback);
if (res == NULL)
- return GP_EINVAL;
+ return EINVAL;
GP_ContextFree(*c);
*c = res;
- return GP_ESUCCESS;
+ return 0;
}
/* rotate filter */
@@ -211,16 +211,16 @@ static struct param rotate_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode rotate(GP_Context **c, const char *params)
+static int rotate(GP_Context **c, const char *params)
{
int rot = -1;
if (param_parse(params, rotate_params, "rotate", param_err, &rot))
- return GP_EINVAL;
+ return EINVAL;
if (rot == -1) {
print_error("rotate: rot parameter is missing");
- return GP_EINVAL;
+ return EINVAL;
}
GP_Context *res = NULL;
@@ -243,7 +243,7 @@ static GP_RetCode rotate(GP_Context **c, const char *params)
GP_ContextFree(*c);
*c = res;
- return GP_ESUCCESS;
+ return 0;
}
/* mirror filter */
@@ -254,12 +254,12 @@ static struct param mirror_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode mirror(GP_Context **c, const char *params)
+static int mirror(GP_Context **c, const char *params)
{
int vert = 0, horiz = 0;
if (param_parse(params, mirror_params, "mirror", param_err, &vert, &horiz))
- return GP_EINVAL;
+ return EINVAL;
if (vert)
GP_FilterMirrorV(*c, *c, progress_callback);
@@ -267,7 +267,7 @@ static GP_RetCode mirror(GP_Context **c, const char *params)
if (horiz)
GP_FilterMirrorH(*c, *c, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* brightness filter */
@@ -278,17 +278,17 @@ static struct param bright_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode bright(GP_Context **c, const char *params)
+static int bright(GP_Context **c, const char *params)
{
int bright = 0;
char *chann = NULL;
if (param_parse(params, bright_params, "bright", param_err, &bright, &chann))
- return GP_EINVAL;
+ return EINVAL;
if (bright == 0) {
print_error("bright: bright parameter is zero or missing");
- return GP_EINVAL;
+ return EINVAL;
}
GP_FILTER_PARAMS((*c)->pixel_type, filter_params);
@@ -300,7 +300,7 @@ static GP_RetCode bright(GP_Context **c, const char *params)
if (param == NULL) {
print_error("bright: Invalid channel name");
- return GP_EINVAL;
+ return EINVAL;
}
GP_FilterParamSetIntAll(filter_params, 0);
@@ -309,7 +309,7 @@ static GP_RetCode bright(GP_Context **c, const char *params)
GP_FilterBrightness(*c, *c, filter_params, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* contrast */
@@ -320,17 +320,17 @@ static struct param contrast_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode contrast(GP_Context **c, const char *params)
+static int contrast(GP_Context **c, const char *params)
{
float mul = 0;
char *chann = NULL;
if (param_parse(params, contrast_params, "contrast", param_err, &mul, &chann))
- return GP_EINVAL;
+ return EINVAL;
if (mul <= 0) {
print_error("contrast: mul parameter must be >= 0");
- return GP_EINVAL;
+ return EINVAL;
}
GP_FILTER_PARAMS((*c)->pixel_type, filter_params);
@@ -342,7 +342,7 @@ static GP_RetCode contrast(GP_Context **c, const char *params)
if (param == NULL) {
print_error("contrast: Invalid channel name");
- return GP_EINVAL;
+ return EINVAL;
}
GP_FilterParamSetFloatAll(filter_params, 1);
@@ -351,7 +351,7 @@ static GP_RetCode contrast(GP_Context **c, const char *params)
GP_FilterContrast(*c, *c, filter_params, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* noise */
@@ -360,12 +360,12 @@ static struct param noise_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode noise(GP_Context **c, const char *params)
+static int noise(GP_Context **c, const char *params)
{
float rat;
if (param_parse(params, noise_params, "noise", param_err, &rat))
- return GP_EINVAL;
+ return EINVAL;
GP_FILTER_PARAMS((*c)->pixel_type, filter_params);
@@ -373,7 +373,7 @@ static GP_RetCode noise(GP_Context **c, const char *params)
GP_FilterNoise(*c, *c, filter_params, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* invert */
@@ -382,14 +382,14 @@ static struct param invert_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode invert(GP_Context **c, const char *params)
+static int invert(GP_Context **c, const char *params)
{
if (param_parse(params, invert_params, "invert", param_err))
- return GP_EINVAL;
+ return EINVAL;
GP_FilterInvert(*c, *c, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* blur */
@@ -401,7 +401,7 @@ static struct param blur_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode blur(GP_Context **c, const char *params)
+static int blur(GP_Context **c, const char *params)
{
float sigma = 0;
float sigma_x = 0;
@@ -417,12 +417,12 @@ static GP_RetCode blur(GP_Context **c, const char *params)
if (sigma_x <= 0 && sigma_y <= 0) {
print_error("blur: at least one of sigma_x and sigma_y must be >= 0");
- return GP_EINVAL;
+ return EINVAL;
}
GP_FilterGaussianBlur(*c, *c, sigma_x, sigma_y, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* dithering */
@@ -454,16 +454,16 @@ static struct param dither_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode dither(GP_Context **c, const char *params)
+static int dither(GP_Context **c, const char *params)
{
int fmt = -1;
if (param_parse(params, dither_params, "dither", param_err, &fmt))
- return GP_EINVAL;
+ return EINVAL;
if (fmt == -1) {
print_error("dither: invalid format or format param missing");
- return GP_EINVAL;
+ return EINVAL;
}
GP_Context *bw;
@@ -476,7 +476,7 @@ static GP_RetCode dither(GP_Context **c, const char *params)
GP_ContextFree(bw);
- return GP_ESUCCESS;
+ return 0;
}
/* jpg save filter */
@@ -486,21 +486,21 @@ static struct param save_jpg_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode save_jpg(GP_Context **c, const char *params)
+static int save_jpg(GP_Context **c, const char *params)
{
char *file = NULL;
if (param_parse(params, save_jpg_params, "jpg", param_err, &file))
- return GP_EINVAL;
+ return EINVAL;
if (file == NULL) {
print_error("jpg: filename missing");
- return GP_EINVAL;
+ return EINVAL;
}
GP_SaveJPG(*c, file, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* png save filter */
@@ -510,21 +510,21 @@ static struct param save_png_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode save_png(GP_Context **c, const char *params)
+static int save_png(GP_Context **c, const char *params)
{
char *file = NULL;
if (param_parse(params, save_png_params, "png", param_err, &file))
- return GP_EINVAL;
+ return EINVAL;
if (file == NULL) {
print_error("png: filename missing");
- return GP_EINVAL;
+ return EINVAL;
}
GP_SavePNG(*c, file, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* noise filter */
@@ -559,13 +559,13 @@ static uint32_t no_op(uint32_t val)
return val;
}
-static GP_RetCode add_noise(GP_Context **c, const char *params)
+static int add_noise(GP_Context **c, const char *params)
{
float percents = 0;
char *chann = NULL;
if (param_parse(params, add_noise_params, "add_noise", param_err, &percents, &chann))
- return GP_EINVAL;
+ return EINVAL;
GP_FILTER_PARAMS((*c)->pixel_type, priv);
GP_FilterParamSetFloatAll(priv, percents/100);
@@ -578,7 +578,7 @@ static GP_RetCode add_noise(GP_Context **c, const char *params)
if (param == NULL) {
print_error("add_noise: Invalid channel name");
- return GP_EINVAL;
+ return EINVAL;
}
@@ -588,7 +588,7 @@ static GP_RetCode add_noise(GP_Context **c, const char *params)
GP_FilterPoint(*c, *c, op_callbacks, priv, progress_callback);
- return GP_ESUCCESS;
+ return 0;
}
/* median filter */
@@ -600,12 +600,12 @@ static struct param median_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode median(GP_Context **c, const char *params)
+static int median(GP_Context **c, const char *params)
{
int rad = -1, rad_x, rad_y;
if (param_parse(params, median_params, "median", param_err, &rad, &rad_x, &rad_y))
- return GP_EINVAL;
+ return EINVAL;
if (rad != -1) {
rad_x = rad;
@@ -613,17 +613,17 @@ static GP_RetCode median(GP_Context **c, const char *params)
}
if (rad_x < 0 || rad_y < 0)
- return GP_EINVAL;
+ return EINVAL;
GP_Context *ret = GP_FilterMedianAlloc(*c, rad_x, rad_y, progress_callback);
if (ret == NULL)
- return GP_ENOMEM;
+ return ENOMEM;
GP_ContextFree(*c);
*c = ret;
- return GP_ESUCCESS;
+ return 0;
}
/* sigma mean filter */
@@ -637,14 +637,14 @@ static struct param sigma_mean_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode sigma_mean(GP_Context **c, const char *params)
+static int sigma_mean(GP_Context **c, const char *params)
{
int rad = -1, rad_x, rad_y, min = 0;
float sigma = 0.1;
if (param_parse(params, sigma_mean_params, "sigma", param_err,
&rad, &min, &sigma, &rad_x, &rad_y))
- return GP_EINVAL;
+ return EINVAL;
if (rad != -1) {
rad_x = rad;
@@ -652,19 +652,19 @@ static GP_RetCode sigma_mean(GP_Context **c, const char *params)
}
if (rad_x < 0 || rad_y < 0)
- return GP_EINVAL;
+ return EINVAL;
(*c)->gamma = GP_GammaAcquire((*c)->pixel_type, 1.2);
GP_Context *ret = GP_FilterSigmaAlloc(*c, rad_x, rad_y, min, sigma, progress_callback);
if (ret == NULL)
- return GP_ENOMEM;
+ return ENOMEM;
GP_ContextFree(*c);
*c = ret;
- return GP_ESUCCESS;
+ return 0;
}
/* laplacian edge sharpening filter */
@@ -674,22 +674,22 @@ static struct param sharpen_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode sharpen(GP_Context **c, const char *params)
+static int sharpen(GP_Context **c, const char *params)
{
float weight = 0.1;
if (param_parse(params, sharpen_params, "sigma", param_err, &weight))
- return GP_EINVAL;
+ return EINVAL;
GP_Context *ret = GP_FilterEdgeSharpeningAlloc(*c, weight, progress_callback);
if (ret == NULL)
- return GP_ENOMEM;
+ return ENOMEM;
GP_ContextFree(*c);
*c = ret;
- return GP_ESUCCESS;
+ return 0;
}
/* arithmetics */
@@ -709,24 +709,24 @@ static struct param arithmetic_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode arithmetic(GP_Context **c, const char *params)
+static int arithmetic(GP_Context **c, const char *params)
{
char *file = NULL;
int op = -1;
if (param_parse(params, arithmetic_params, "arithmetic", param_err, &file, &op))
- return GP_EINVAL;
+ return EINVAL;
if (file == NULL) {
print_error("arithmetic: Filename missing");
- return GP_EINVAL;
+ return EINVAL;
}
GP_Context *img, *res = NULL;
if ((img = GP_LoadImage(file, progress_callback)) == NULL) {
print_error("arithmetic: Invalid image.");
- return GP_EINVAL;
+ return EINVAL;
}
switch (op) {
@@ -748,13 +748,13 @@ static GP_RetCode arithmetic(GP_Context **c, const char *params)
}
if (res == NULL)
- return GP_EINVAL;
+ return ENOMEM;
GP_ContextFree(*c);
*c = res;
- return GP_ESUCCESS;
+ return 0;
}
/* histogram */
@@ -764,20 +764,20 @@ static struct param histogram_params[] = {
{NULL, 0, NULL, NULL, NULL}
};
-static GP_RetCode histogram(GP_Context **c, const char *params)
+static int histogram(GP_Context **c, const char *params)
{
char *file = "histogram.png";
if (param_parse(params, histogram_params, "histogram", param_err, &file))
- return GP_EINVAL;
+ return EINVAL;
if (file == NULL) {
print_error("histogram: Filename missing");
- return GP_EINVAL;
+ return EINVAL;
}
histogram_to_png(*c, file);
- return GP_ESUCCESS;
+ return 0;
}
/* filters */
@@ -786,7 +786,7 @@ struct filter {
const char *name;
const char *desc;
struct param *param_desc;
- GP_RetCode (*apply)(GP_Context **c, const char *params);
+ int (*apply)(GP_Context **c, const char *params);
};
static struct filter filter_table[] = {
@@ -875,7 +875,7 @@ static void add_filter(char *params)
static void apply_filters(GP_Context **src)
{
unsigned int i;
- GP_RetCode ret;
+ int ret;
for (i = 0; i < filter_cnt; i++) {
char buf[255];
@@ -885,7 +885,7 @@ static void apply_filters(GP_Context **src)
progress_prefix = buf;
if ((ret = filters[i]->apply(src, filter_params[i]))) {
- fprintf(stderr, "Error: %sn", GP_RetCodeName(ret));
+ fprintf(stderr, "Error: %sn", strerror(ret));
exit(1);
}
@@ -956,7 +956,7 @@ static void check_fmt(const char *fmt)
static void save_by_fmt(struct GP_Context *bitmap, const char *name, const char *fmt)
{
- GP_RetCode ret;
+ int ret;
progress_prefix = "Saving Image";
@@ -968,7 +968,8 @@ static void save_by_fmt(struct GP_Context *bitmap, const char *name, const char
ret = GP_SavePNG(bitmap, name, progress_callback);
if (ret) {
- fprintf(stderr, "Failed to save bitmap: %sn", GP_RetCodeName(ret));
+ fprintf(stderr, "Failed to save bitmap: %sn",
+ strerror(errno));
exit(1);
}
http://repo.or.cz/w/gfxprim.git/commit/7dc5026aa07022e0b17da3b5fd173eaa900e…
commit 7dc5026aa07022e0b17da3b5fd173eaa900ec3b2
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Thu Aug 2 14:10:04 2012 +0200
doc: Add debug env variable docs.
diff --git a/doc/debug.txt b/doc/debug.txt
index c86e8a9..3f1cc69 100644
--- a/doc/debug.txt
+++ b/doc/debug.txt
@@ -27,6 +27,9 @@ or destroyed or when particular algorithm has been started.
Setting debug level to value higher than 1 would expose even more verbose
messages the current maximum used by debug messages is 4.
+The debug level may also be set by setting the 'GP_DEBUG' environment
+variable. In such case the debug level is set accordingly to its value when
+first debug message is about to be printed.
[source,c]
-------------------------------------------------------------------------------
diff --git a/doc/environment_variables.txt b/doc/environment_variables.txt
index c120528..71e3b91 100644
--- a/doc/environment_variables.txt
+++ b/doc/environment_variables.txt
@@ -21,3 +21,10 @@ bellow:
| >=2 | Use N threads unless the image buffer is too small.
|=============================================================================
+GP_DEBUG
+~~~~~~~~
+
+The 'GP_DEBUG' environment variable may be used to set library debug level.
+The variable and its value is used only once a the time first debug message is
+about to be printed.
+
http://repo.or.cz/w/gfxprim.git/commit/dff4c0ec8bdcc90fab43fe7cc627d8d164cd…
commit dff4c0ec8bdcc90fab43fe7cc627d8d164cde641
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Thu Aug 2 13:53:04 2012 +0200
core: debug: Add debug level env variable.
Add support for setting debug level from
GP_DEBUG environment variable. The environment
variable is used exactly once at a time
first debug message is about to be printed.
diff --git a/libs/core/GP_Debug.c b/libs/core/GP_Debug.c
index ecef216..9332828 100644
--- a/libs/core/GP_Debug.c
+++ b/libs/core/GP_Debug.c
@@ -25,6 +25,7 @@
#include "GP_Debug.h"
static unsigned int debug_level = GP_DEFAULT_DEBUG_LEVEL;
+static int env_used = 0;
void GP_SetDebugLevel(unsigned int level)
{
@@ -44,6 +45,24 @@ void GP_DebugPrint(int level, const char *file, const char *function, int line,
if (level > (int)debug_level)
return;
+ if (!env_used) {
+ char *level = getenv("GP_DEBUG");
+
+ env_used = 1;
+
+ if (level != NULL) {
+ int new_level = atoi(level);
+
+ if (new_level >= 0) {
+ debug_level = new_level;
+
+ GP_DEBUG(1, "Using debug level GP_DEBUG=%i "
+ "from enviroment variable",
+ debug_level);
+ }
+ }
+ }
+
for (i = 1; i < level; i++)
fputc(' ', stderr);
-----------------------------------------------------------------------
Summary of changes:
demos/c_simple/Makefile | 2 +-
{tests/SDL => demos/c_simple}/input.c | 135 +++++++--------
demos/grinder/grinder.c | 185 +++++++++++---------
doc/debug.txt | 3 +
doc/environment_variables.txt | 7 +
include/filters/GP_Filters.h | 3 +
include/filters/GP_GaussianNoise.h | 70 ++++++++
.../GP_InputDriverX11.h => filters/GP_Rand.h} | 17 +-
libs/core/GP_Debug.c | 19 ++
libs/filters/GP_GaussianNoise.gen.c.t | 149 ++++++++++++++++
.../loaders_example.c => libs/filters/GP_Rand.c | 47 ++---
libs/filters/Makefile | 2 +-
tests/SDL/Makefile | 2 +-
13 files changed, 446 insertions(+), 195 deletions(-)
rename {tests/SDL => demos/c_simple}/input.c (54%)
create mode 100644 include/filters/GP_GaussianNoise.h
copy include/{input/GP_InputDriverX11.h => filters/GP_Rand.h} (83%)
create mode 100644 libs/filters/GP_GaussianNoise.gen.c.t
copy demos/c_simple/loaders_example.c => libs/filters/GP_Rand.c (73%)
repo.or.cz automatic notification. Contact project admin jiri.bluebear.dluhos(a)gmail.com
if you want to unsubscribe, or site admin admin(a)repo.or.cz if you receive
no reply.
--
gfxprim.git ("A simple 2D graphics library with emphasis on correctness and well-defined operation.")
1
0
[repo.or.cz] gfxprim.git branch master updated: faaba1897920ea54344ca36ec8c6633d0a6ebf1d
by metan 01 Aug '12
by metan 01 Aug '12
01 Aug '12
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project gfxprim.git.
The branch, master has been updated
via faaba1897920ea54344ca36ec8c6633d0a6ebf1d (commit)
from 14d0a7da4df6fac46b50da3afd0ab8fe35653e6f (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://repo.or.cz/w/gfxprim.git/commit/faaba1897920ea54344ca36ec8c6633d0a6e…
commit faaba1897920ea54344ca36ec8c6633d0a6ebf1d
Author: Cyril Hrubis <metan(a)ucw.cz>
Date: Wed Aug 1 00:10:28 2012 +0200
loaders: GIF: Add support for interlaced images.
diff --git a/libs/loaders/GP_GIF.c b/libs/loaders/GP_GIF.c
index aa999db..15e0c44 100644
--- a/libs/loaders/GP_GIF.c
+++ b/libs/loaders/GP_GIF.c
@@ -176,6 +176,44 @@ static int get_bg_color(GifFileType *gf, GP_Pixel *pixel)
return 1;
}
+/*
+ * The interlacing consists of 8 pixel high strips. Each pass adds some lines
+ * into each strip. This function maps y in the gif buffer to real y.
+ */
+static inline unsigned int interlace_real_y(GifFileType *gf, unsigned int y)
+{
+ const unsigned int h = gf->Image.Height;
+ unsigned int real_y;
+
+ /* Pass 1: Line 0 for each strip */
+ real_y = 8 * y;
+
+ if (real_y < h)
+ return real_y;
+
+ /* Pass 2: Line 4 for each strip */
+ real_y = 8 * (y - (h - 1)/8 - 1) + 4;
+
+ if (real_y < h)
+ return real_y;
+
+ /* Pass 3: Lines 2 and 6 */
+ real_y = 4 * (y - (h - 1)/4 - 1) + 2;
+
+ if (real_y < h)
+ return real_y;
+
+ /* Pass 4: Lines 1, 3, 5, and 7 */
+ real_y = 2 * (y - h/2 - h%2) + 1;
+
+ if (real_y < h)
+ return real_y;
+
+ GP_BUG("real_y > h");
+
+ return 0;
+}
+
GP_Context *GP_ReadGIF(void *f, GP_ProgressCallback *callback)
{
GifFileType *gf = f;
@@ -240,9 +278,16 @@ GP_Context *GP_ReadGIF(void *f, GP_ProgressCallback *callback)
DGifGetLine(gf, line, gf->Image.Width);
+ unsigned int real_y = y;
+
+ if (gf->Image.Interlace == 64) {
+ real_y = interlace_real_y(gf, y);
+ GP_DEBUG(3, "Interlace y -> real_y %u %u", y, real_y);
+ }
+
//TODO: just now we have only 8BPP
for (x = 0; x < gf->Image.Width; x++)
- GP_PutPixel_Raw_24BPP(res, x + gf->Image.Left, y, get_color(gf, line[x]));
+ GP_PutPixel_Raw_24BPP(res, x + gf->Image.Left, real_y, get_color(gf, line[x]));
if (GP_ProgressCallbackReport(callback, y - gf->Image.Top,
gf->Image.Height,
-----------------------------------------------------------------------
Summary of changes:
libs/loaders/GP_GIF.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 46 insertions(+), 1 deletions(-)
repo.or.cz automatic notification. Contact project admin jiri.bluebear.dluhos(a)gmail.com
if you want to unsubscribe, or site admin admin(a)repo.or.cz if you receive
no reply.
--
gfxprim.git ("A simple 2D graphics library with emphasis on correctness and well-defined operation.")
1
0