From d6a93182469445f039adaccaba06b601fd823256 Mon Sep 17 00:00:00 2001 From: Guillaume Martres <smarter@ubuntu.com> Date: Mon, 19 Apr 2021 12:02:23 +0200 Subject: [PATCH] Add solution to the 2021 midterm --- previous-exams/2021-midterm/m1.md | 61 +++ previous-exams/2021-midterm/m1/.gitignore | 22 + previous-exams/2021-midterm/m1/assignment.sbt | 2 + previous-exams/2021-midterm/m1/build.sbt | 12 + .../2021-midterm/m1/grading-tests.jar | Bin 0 -> 33287 bytes .../m1/project/FilteringReporterPlugin.scala | 31 ++ .../m1/project/MOOCSettings.scala | 49 ++ .../m1/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m1/project/build.properties | 1 + .../2021-midterm/m1/project/buildSettings.sbt | 5 + .../2021-midterm/m1/project/plugins.sbt | 2 + .../m1/src/main/scala/m1/Lib.scala | 60 +++ .../m1/src/main/scala/m1/M1.scala | 76 ++++ .../m1/src/test/scala/m1/M1Suite.scala | 156 +++++++ previous-exams/2021-midterm/m14.md | 42 ++ previous-exams/2021-midterm/m14/.gitignore | 22 + .../2021-midterm/m14/assignment.sbt | 2 + previous-exams/2021-midterm/m14/build.sbt | 12 + .../2021-midterm/m14/grading-tests.jar | Bin 0 -> 119786 bytes .../m14/project/FilteringReporterPlugin.scala | 31 ++ .../m14/project/MOOCSettings.scala | 49 ++ .../m14/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m14/project/build.properties | 1 + .../m14/project/buildSettings.sbt | 5 + .../2021-midterm/m14/project/plugins.sbt | 2 + .../scala/m14/AbstractBlockingQueue.scala | 14 + .../m14/AbstractThreadPoolExecutor.scala | 7 + .../m14/src/main/scala/m14/M14.scala | 80 ++++ .../m14/src/main/scala/m14/Monitor.scala | 23 + .../m14/src/test/scala/m14/M14Suite.scala | 159 +++++++ .../m14/instrumentation/MockedMonitor.scala | 73 +++ .../SchedulableBlockingQueue.scala | 17 + .../scala/m14/instrumentation/Scheduler.scala | 305 +++++++++++++ .../scala/m14/instrumentation/Stats.scala | 23 + .../m14/instrumentation/TestHelper.scala | 125 ++++++ .../scala/m14/instrumentation/TestUtils.scala | 20 + previous-exams/2021-midterm/m15.md | 42 ++ previous-exams/2021-midterm/m15/.gitignore | 22 + .../2021-midterm/m15/assignment.sbt | 2 + previous-exams/2021-midterm/m15/build.sbt | 12 + .../2021-midterm/m15/grading-tests.jar | Bin 0 -> 126110 bytes .../m15/project/FilteringReporterPlugin.scala | 31 ++ .../m15/project/MOOCSettings.scala | 49 ++ .../m15/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m15/project/build.properties | 1 + .../m15/project/buildSettings.sbt | 5 + .../2021-midterm/m15/project/plugins.sbt | 2 + .../scala/m15/AbstractBlockingQueue.scala | 14 + .../m15/AbstractThreadPoolExecutor.scala | 7 + .../m15/src/main/scala/m15/M15.scala | 79 ++++ .../m15/src/main/scala/m15/Monitor.scala | 23 + .../m15/src/test/scala/m15/M15Suite.scala | 281 ++++++++++++ .../m15/instrumentation/MockedMonitor.scala | 73 +++ .../SchedulableBlockingQueue.scala | 17 + .../scala/m15/instrumentation/Scheduler.scala | 305 +++++++++++++ .../scala/m15/instrumentation/Stats.scala | 23 + .../m15/instrumentation/TestHelper.scala | 125 ++++++ .../scala/m15/instrumentation/TestUtils.scala | 20 + previous-exams/2021-midterm/m2.md | 61 +++ previous-exams/2021-midterm/m2/.gitignore | 22 + previous-exams/2021-midterm/m2/assignment.sbt | 2 + previous-exams/2021-midterm/m2/build.sbt | 12 + .../2021-midterm/m2/grading-tests.jar | Bin 0 -> 34633 bytes .../m2/project/FilteringReporterPlugin.scala | 31 ++ .../m2/project/MOOCSettings.scala | 49 ++ .../m2/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m2/project/build.properties | 1 + .../2021-midterm/m2/project/buildSettings.sbt | 5 + .../2021-midterm/m2/project/plugins.sbt | 2 + .../m2/src/main/scala/m2/Lib.scala | 60 +++ .../m2/src/main/scala/m2/M2.scala | 75 ++++ .../m2/src/test/scala/m2/M2Suite.scala | 175 ++++++++ previous-exams/2021-midterm/m20.md | 97 ++++ previous-exams/2021-midterm/m20/.gitignore | 22 + .../2021-midterm/m20/assignment.sbt | 2 + previous-exams/2021-midterm/m20/build.sbt | 12 + .../2021-midterm/m20/grading-tests.jar | Bin 0 -> 131660 bytes .../m20/project/FilteringReporterPlugin.scala | 31 ++ .../m20/project/MOOCSettings.scala | 49 ++ .../m20/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m20/project/build.properties | 1 + .../m20/project/buildSettings.sbt | 5 + .../2021-midterm/m20/project/plugins.sbt | 2 + .../main/scala/m20/MultiWriterSeqCount.scala | 66 +++ .../m20/src/main/scala/m20/SeqCount.scala | 53 +++ .../m20/instrumentation/AtomicVariable.scala | 28 ++ .../scala/m20/instrumentation/Monitor.scala | 23 + .../m20/src/test/scala/m20/TestSuite.scala | 122 +++++ .../m20/instrumentation/MockedMonitor.scala | 72 +++ .../scala/m20/instrumentation/Scheduler.scala | 304 +++++++++++++ .../scala/m20/instrumentation/Stats.scala | 23 + .../m20/instrumentation/TestHelper.scala | 124 +++++ .../scala/m20/instrumentation/TestUtils.scala | 19 + .../m20/src/test/scala/m20/overrides.scala | 68 +++ previous-exams/2021-midterm/m21.md | 97 ++++ previous-exams/2021-midterm/m21/.gitignore | 22 + .../2021-midterm/m21/assignment.sbt | 2 + previous-exams/2021-midterm/m21/build.sbt | 12 + .../2021-midterm/m21/grading-tests.jar | Bin 0 -> 131654 bytes .../m21/project/FilteringReporterPlugin.scala | 31 ++ .../m21/project/MOOCSettings.scala | 49 ++ .../m21/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m21/project/build.properties | 1 + .../m21/project/buildSettings.sbt | 5 + .../2021-midterm/m21/project/plugins.sbt | 2 + .../main/scala/m21/MultiWriterSeqCount.scala | 66 +++ .../m21/src/main/scala/m21/SeqCount.scala | 53 +++ .../m21/instrumentation/AtomicVariable.scala | 28 ++ .../scala/m21/instrumentation/Monitor.scala | 23 + .../m21/src/test/scala/m21/TestSuite.scala | 122 +++++ .../m21/instrumentation/MockedMonitor.scala | 72 +++ .../scala/m21/instrumentation/Scheduler.scala | 304 +++++++++++++ .../scala/m21/instrumentation/Stats.scala | 23 + .../m21/instrumentation/TestHelper.scala | 124 +++++ .../scala/m21/instrumentation/TestUtils.scala | 19 + .../m21/src/test/scala/m21/overrides.scala | 68 +++ previous-exams/2021-midterm/m3.md | 61 +++ previous-exams/2021-midterm/m3/.gitignore | 22 + previous-exams/2021-midterm/m3/assignment.sbt | 2 + previous-exams/2021-midterm/m3/build.sbt | 12 + .../2021-midterm/m3/grading-tests.jar | Bin 0 -> 34429 bytes .../m3/project/FilteringReporterPlugin.scala | 31 ++ .../m3/project/MOOCSettings.scala | 49 ++ .../m3/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m3/project/build.properties | 1 + .../2021-midterm/m3/project/buildSettings.sbt | 5 + .../2021-midterm/m3/project/plugins.sbt | 2 + .../m3/src/main/scala/m3/Lib.scala | 68 +++ .../m3/src/main/scala/m3/M3.scala | 75 ++++ .../m3/src/test/scala/m3/M3Suite.scala | 174 ++++++++ previous-exams/2021-midterm/m6.md | 155 +++++++ previous-exams/2021-midterm/m6/.gitignore | 22 + previous-exams/2021-midterm/m6/assignment.sbt | 2 + previous-exams/2021-midterm/m6/build.sbt | 12 + .../2021-midterm/m6/grading-tests.jar | Bin 0 -> 35241 bytes .../m6/project/FilteringReporterPlugin.scala | 31 ++ .../m6/project/MOOCSettings.scala | 49 ++ .../m6/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m6/project/build.properties | 1 + .../2021-midterm/m6/project/buildSettings.sbt | 5 + .../2021-midterm/m6/project/plugins.sbt | 2 + .../m6/src/main/scala/m6/M6.scala | 149 +++++++ .../m6/src/main/scala/m6/lib.scala | 84 ++++ .../m6/src/test/scala/m6/M6Suite.scala | 422 ++++++++++++++++++ previous-exams/2021-midterm/m7.md | 155 +++++++ previous-exams/2021-midterm/m7/.gitignore | 22 + previous-exams/2021-midterm/m7/assignment.sbt | 2 + previous-exams/2021-midterm/m7/build.sbt | 12 + .../2021-midterm/m7/grading-tests.jar | Bin 0 -> 35244 bytes .../m7/project/FilteringReporterPlugin.scala | 31 ++ .../m7/project/MOOCSettings.scala | 49 ++ .../m7/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m7/project/build.properties | 1 + .../2021-midterm/m7/project/buildSettings.sbt | 5 + .../2021-midterm/m7/project/plugins.sbt | 2 + .../m7/src/main/scala/m7/M7.scala | 149 +++++++ .../m7/src/main/scala/m7/lib.scala | 84 ++++ .../m7/src/test/scala/m7/M7Suite.scala | 422 ++++++++++++++++++ 158 files changed, 10460 insertions(+) create mode 100644 previous-exams/2021-midterm/m1.md create mode 100644 previous-exams/2021-midterm/m1/.gitignore create mode 100644 previous-exams/2021-midterm/m1/assignment.sbt create mode 100644 previous-exams/2021-midterm/m1/build.sbt create mode 100644 previous-exams/2021-midterm/m1/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m1/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m1/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m1/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m1/project/build.properties create mode 100644 previous-exams/2021-midterm/m1/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m1/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m1/src/main/scala/m1/Lib.scala create mode 100644 previous-exams/2021-midterm/m1/src/main/scala/m1/M1.scala create mode 100644 previous-exams/2021-midterm/m1/src/test/scala/m1/M1Suite.scala create mode 100644 previous-exams/2021-midterm/m14.md create mode 100644 previous-exams/2021-midterm/m14/.gitignore create mode 100644 previous-exams/2021-midterm/m14/assignment.sbt create mode 100644 previous-exams/2021-midterm/m14/build.sbt create mode 100644 previous-exams/2021-midterm/m14/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m14/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m14/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m14/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m14/project/build.properties create mode 100644 previous-exams/2021-midterm/m14/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m14/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m14/src/main/scala/m14/AbstractBlockingQueue.scala create mode 100644 previous-exams/2021-midterm/m14/src/main/scala/m14/AbstractThreadPoolExecutor.scala create mode 100644 previous-exams/2021-midterm/m14/src/main/scala/m14/M14.scala create mode 100644 previous-exams/2021-midterm/m14/src/main/scala/m14/Monitor.scala create mode 100644 previous-exams/2021-midterm/m14/src/test/scala/m14/M14Suite.scala create mode 100644 previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/MockedMonitor.scala create mode 100644 previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/SchedulableBlockingQueue.scala create mode 100644 previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/Scheduler.scala create mode 100644 previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/Stats.scala create mode 100644 previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/TestHelper.scala create mode 100644 previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/TestUtils.scala create mode 100644 previous-exams/2021-midterm/m15.md create mode 100644 previous-exams/2021-midterm/m15/.gitignore create mode 100644 previous-exams/2021-midterm/m15/assignment.sbt create mode 100644 previous-exams/2021-midterm/m15/build.sbt create mode 100644 previous-exams/2021-midterm/m15/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m15/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m15/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m15/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m15/project/build.properties create mode 100644 previous-exams/2021-midterm/m15/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m15/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m15/src/main/scala/m15/AbstractBlockingQueue.scala create mode 100644 previous-exams/2021-midterm/m15/src/main/scala/m15/AbstractThreadPoolExecutor.scala create mode 100644 previous-exams/2021-midterm/m15/src/main/scala/m15/M15.scala create mode 100644 previous-exams/2021-midterm/m15/src/main/scala/m15/Monitor.scala create mode 100644 previous-exams/2021-midterm/m15/src/test/scala/m15/M15Suite.scala create mode 100644 previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/MockedMonitor.scala create mode 100644 previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/SchedulableBlockingQueue.scala create mode 100644 previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/Scheduler.scala create mode 100644 previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/Stats.scala create mode 100644 previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/TestHelper.scala create mode 100644 previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/TestUtils.scala create mode 100644 previous-exams/2021-midterm/m2.md create mode 100644 previous-exams/2021-midterm/m2/.gitignore create mode 100644 previous-exams/2021-midterm/m2/assignment.sbt create mode 100644 previous-exams/2021-midterm/m2/build.sbt create mode 100644 previous-exams/2021-midterm/m2/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m2/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m2/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m2/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m2/project/build.properties create mode 100644 previous-exams/2021-midterm/m2/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m2/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m2/src/main/scala/m2/Lib.scala create mode 100644 previous-exams/2021-midterm/m2/src/main/scala/m2/M2.scala create mode 100644 previous-exams/2021-midterm/m2/src/test/scala/m2/M2Suite.scala create mode 100644 previous-exams/2021-midterm/m20.md create mode 100644 previous-exams/2021-midterm/m20/.gitignore create mode 100644 previous-exams/2021-midterm/m20/assignment.sbt create mode 100644 previous-exams/2021-midterm/m20/build.sbt create mode 100644 previous-exams/2021-midterm/m20/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m20/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m20/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m20/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m20/project/build.properties create mode 100644 previous-exams/2021-midterm/m20/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m20/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m20/src/main/scala/m20/MultiWriterSeqCount.scala create mode 100644 previous-exams/2021-midterm/m20/src/main/scala/m20/SeqCount.scala create mode 100644 previous-exams/2021-midterm/m20/src/main/scala/m20/instrumentation/AtomicVariable.scala create mode 100644 previous-exams/2021-midterm/m20/src/main/scala/m20/instrumentation/Monitor.scala create mode 100644 previous-exams/2021-midterm/m20/src/test/scala/m20/TestSuite.scala create mode 100644 previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/MockedMonitor.scala create mode 100644 previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/Scheduler.scala create mode 100644 previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/Stats.scala create mode 100644 previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/TestHelper.scala create mode 100644 previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/TestUtils.scala create mode 100644 previous-exams/2021-midterm/m20/src/test/scala/m20/overrides.scala create mode 100644 previous-exams/2021-midterm/m21.md create mode 100644 previous-exams/2021-midterm/m21/.gitignore create mode 100644 previous-exams/2021-midterm/m21/assignment.sbt create mode 100644 previous-exams/2021-midterm/m21/build.sbt create mode 100644 previous-exams/2021-midterm/m21/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m21/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m21/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m21/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m21/project/build.properties create mode 100644 previous-exams/2021-midterm/m21/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m21/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m21/src/main/scala/m21/MultiWriterSeqCount.scala create mode 100644 previous-exams/2021-midterm/m21/src/main/scala/m21/SeqCount.scala create mode 100644 previous-exams/2021-midterm/m21/src/main/scala/m21/instrumentation/AtomicVariable.scala create mode 100644 previous-exams/2021-midterm/m21/src/main/scala/m21/instrumentation/Monitor.scala create mode 100644 previous-exams/2021-midterm/m21/src/test/scala/m21/TestSuite.scala create mode 100644 previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/MockedMonitor.scala create mode 100644 previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/Scheduler.scala create mode 100644 previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/Stats.scala create mode 100644 previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/TestHelper.scala create mode 100644 previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/TestUtils.scala create mode 100644 previous-exams/2021-midterm/m21/src/test/scala/m21/overrides.scala create mode 100644 previous-exams/2021-midterm/m3.md create mode 100644 previous-exams/2021-midterm/m3/.gitignore create mode 100644 previous-exams/2021-midterm/m3/assignment.sbt create mode 100644 previous-exams/2021-midterm/m3/build.sbt create mode 100644 previous-exams/2021-midterm/m3/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m3/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m3/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m3/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m3/project/build.properties create mode 100644 previous-exams/2021-midterm/m3/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m3/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m3/src/main/scala/m3/Lib.scala create mode 100644 previous-exams/2021-midterm/m3/src/main/scala/m3/M3.scala create mode 100644 previous-exams/2021-midterm/m3/src/test/scala/m3/M3Suite.scala create mode 100644 previous-exams/2021-midterm/m6.md create mode 100644 previous-exams/2021-midterm/m6/.gitignore create mode 100644 previous-exams/2021-midterm/m6/assignment.sbt create mode 100644 previous-exams/2021-midterm/m6/build.sbt create mode 100644 previous-exams/2021-midterm/m6/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m6/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m6/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m6/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m6/project/build.properties create mode 100644 previous-exams/2021-midterm/m6/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m6/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m6/src/main/scala/m6/M6.scala create mode 100644 previous-exams/2021-midterm/m6/src/main/scala/m6/lib.scala create mode 100644 previous-exams/2021-midterm/m6/src/test/scala/m6/M6Suite.scala create mode 100644 previous-exams/2021-midterm/m7.md create mode 100644 previous-exams/2021-midterm/m7/.gitignore create mode 100644 previous-exams/2021-midterm/m7/assignment.sbt create mode 100644 previous-exams/2021-midterm/m7/build.sbt create mode 100644 previous-exams/2021-midterm/m7/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m7/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m7/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m7/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m7/project/build.properties create mode 100644 previous-exams/2021-midterm/m7/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m7/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m7/src/main/scala/m7/M7.scala create mode 100644 previous-exams/2021-midterm/m7/src/main/scala/m7/lib.scala create mode 100644 previous-exams/2021-midterm/m7/src/test/scala/m7/M7Suite.scala diff --git a/previous-exams/2021-midterm/m1.md b/previous-exams/2021-midterm/m1.md new file mode 100644 index 0000000..0846974 --- /dev/null +++ b/previous-exams/2021-midterm/m1.md @@ -0,0 +1,61 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m1 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m1 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +Given the following sequential implementation of a function that computes the sequence of rolling averages, your task will be to complete and optimize a parallel version of this code. + +```scala +/** Compute the rolling average of array. + * + * For an array `arr = Arr(x1, x2, x3, ..., xn)` the result is + * `Arr(x1 / 1, (x1 + x2) / 2, (x1 + x2 + x3) / 3, ..., (x1 + x2 + x3 + ... + xn) / n)` + */ +def rollingAveragesSequential(arr: Array[Int]): Array[Double] = + // Transform all numbers to fractions with denominator 1 + val arr1 = arr.map(x => Frac(x, 1)) + // Compute the rolling average keeping the sum of all elements in the numerator and the count of elements in the denominator. + val arr2 = arr1.scan(Frac(0, 0))((acc, x) => Frac(acc.numerator + x.numerator, acc.denominator + x.denominator)) + // Transform fractions to Doubles + arr2.map(frac => frac.toDouble) + // Drop the extra initial element that was added by the scan + arr3.tail +``` + + This implementation has some issues: + - It does not use parallelism + - Creates two intermediate arrays by calling `map` + - Creates an extra intermediate arrays by calling `tail` + - Scan returns an extra element we do not need + + We want to parallelize and avoid the creation of the extra arrays. + As we are calling a `scan` the natural operations we need are `upsweep` and `downsweep`. + It is possible specialize those operations for our problem by letting those operations do the mapping. + It is also possible to change those operations to not generate the first element. + +We give you a version of `rollingAveragesSequential` that partially implements the parallelization using `upsweep` and `downsweep`. + + Your tasks in the exercise will be to: + - TASK 1: Implement the parallelization of `upsweep` and `downsweep` + - TASK 2: Remove the calls to the `map` + - TASK 3: Remove the call to `tail` + + You can get partial points for solving part of the tasks. + The order of the tasks is a suggestion, you may do them in any order if that is simpler for you. + +Look at the `Lib` trait to find the definitions of functions and classes you can use (or already used). +In this question we use a `Arr` array class instead of the normal `Array`. You may assume that this class has the same performance characteristics as the normal array. `Arr` provides only a limited set of operations. diff --git a/previous-exams/2021-midterm/m1/.gitignore b/previous-exams/2021-midterm/m1/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m1/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m1/assignment.sbt b/previous-exams/2021-midterm/m1/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m1/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m1/build.sbt b/previous-exams/2021-midterm/m1/build.sbt new file mode 100644 index 0000000..e476688 --- /dev/null +++ b/previous-exams/2021-midterm/m1/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m1" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m1.M1Suite" diff --git a/previous-exams/2021-midterm/m1/grading-tests.jar b/previous-exams/2021-midterm/m1/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..6fa91f4263cecf0bd58cfea49fefc29d3cf7bffa GIT binary patch literal 33287 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 literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m1/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m1/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m1/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m1/project/MOOCSettings.scala b/previous-exams/2021-midterm/m1/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m1/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m1/project/StudentTasks.scala b/previous-exams/2021-midterm/m1/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m1/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m1/project/build.properties b/previous-exams/2021-midterm/m1/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m1/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m1/project/buildSettings.sbt b/previous-exams/2021-midterm/m1/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m1/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m1/project/plugins.sbt b/previous-exams/2021-midterm/m1/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m1/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m1/src/main/scala/m1/Lib.scala b/previous-exams/2021-midterm/m1/src/main/scala/m1/Lib.scala new file mode 100644 index 0000000..37ce780 --- /dev/null +++ b/previous-exams/2021-midterm/m1/src/main/scala/m1/Lib.scala @@ -0,0 +1,60 @@ +package m1 + +//////////////////////////////////////// +// NO NEED TO MODIFY THIS SOURCE FILE // +//////////////////////////////////////// + +trait Lib { + + /** If an array has `n` elements and `n < THRESHOLD`, then it should be processed sequentially */ + final val THRESHOLD: Int = 33 + + /** Compute the two values in parallel + * + * Note: Most tests just compute those two sequentially to make any bug simpler to debug + */ + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) + + /** A limited array. It only contains the required operations for this exercise. */ + trait Arr[T] { + /** Get the i-th element of the array (0-based) */ + def apply(i: Int): T + /** Update the i-th element of the array with the given value (0-based) */ + def update(i: Int, x: T): Unit + /** Number of elements in this array */ + def length: Int + /** Create a copy of this array without the first element */ + def tail: Arr[T] + /** Create a copy of this array by mapping all the elements with the given function */ + def map[U](f: T => U): Arr[U] + } + + object Arr { + /** Create an array with the given elements */ + def apply[T](xs: T*): Arr[T] = { + val arr: Arr[T] = Arr.ofLength(xs.length) + for i <- 0 until xs.length do arr(i) = xs(i) + arr + } + + /** Create an array with the given length. All elements are initialized to `null`. */ + def ofLength[T](n: Int): Arr[T] = + newArrOfLength(n) + + } + + /** Create an array with the given length. All elements are initialized to `null`. */ + def newArrOfLength[T](n: Int): Arr[T] + + /** A fractional number representing `numerator/denominator` */ + case class Frac(numerator: Int, denominator: Int) { + def toDouble: Double = numerator.toDouble / denominator + } + + /** Tree result of an upsweep operation. Specialized for `Frac` results. */ + trait TreeRes { val res: Frac } + /** Leaf result of an upsweep operation. Specialized for `Frac` results. */ + case class Leaf(from: Int, to: Int, res: Frac) extends TreeRes + /** Tree node result of an upsweep operation. Specialized for `Frac` results. */ + case class Node(left: TreeRes, res: Frac, right: TreeRes) extends TreeRes +} diff --git a/previous-exams/2021-midterm/m1/src/main/scala/m1/M1.scala b/previous-exams/2021-midterm/m1/src/main/scala/m1/M1.scala new file mode 100644 index 0000000..fc53991 --- /dev/null +++ b/previous-exams/2021-midterm/m1/src/main/scala/m1/M1.scala @@ -0,0 +1,76 @@ +package m1 + + +trait M1 extends Lib { + // Functions and classes of Lib can be used in here + + /** Compute the rolling average of array. + * + * For an array `arr = Arr(x1, x2, x3, ..., xn)` the result is + * `Arr(x1 / 1, (x1 + x2) / 2, (x1 + x2 + x3) / 3, ..., (x1 + x2 + x3 + ... + xn) / n)` + */ + def rollingAveragesParallel(arr: Arr[Int]): Arr[Double] = { + if (arr.length == 0) return Arr.ofLength(0) + + val out: Arr[Double] = Arr.ofLength(arr.length) + val tree = upsweep(arr, 0, arr.length) + downsweep(arr, Frac(0, 0), tree, out) + out + } + + // No need to modify this + def scanOp(acc: Frac, x: Frac) = + Frac(acc.numerator + x.numerator, acc.denominator + x.denominator) + + + def upsweep(input: Arr[Int], from: Int, to: Int): TreeRes = { + if (to - from < THRESHOLD) + Leaf(from, to, reduceSequential(input, from + 1, to, Frac(input(from), 1))) + else { + val mid = from + (to - from)/2 + val (tL, tR) = parallel( + upsweep(input, from, mid), + upsweep(input, mid, to) + ) + Node(tL, scanOp(tL.res, tR.res), tR) + } + } + + + def downsweep(input: Arr[Int], a0: Frac, tree: TreeRes, output: Arr[Double]): Unit = { + tree match { + case Node(left, _, right) => + parallel( + downsweep(input, a0, left, output), + downsweep(input, scanOp(a0, left.res), right, output) + ) + case Leaf(from, to, _) => + downsweepSequential(input, from, to, a0, output) + } + } + + + def downsweepSequential(input: Arr[Int], from: Int, to: Int, a0: Frac, output: Arr[Double]): Unit = { + if (from < to) { + var i = from + var a = a0 + while (i < to) { + a = scanOp(a, Frac(input(i), 1)) + output(i) = a.toDouble + i = i + 1 + } + } + } + + + def reduceSequential(input: Arr[Int], from: Int, to: Int, a0: Frac): Frac = { + var a = a0 + var i = from + while (i < to) { + a = scanOp(a, Frac(input(i), 1)) + i = i + 1 + } + a + } + +} diff --git a/previous-exams/2021-midterm/m1/src/test/scala/m1/M1Suite.scala b/previous-exams/2021-midterm/m1/src/test/scala/m1/M1Suite.scala new file mode 100644 index 0000000..ab1b865 --- /dev/null +++ b/previous-exams/2021-midterm/m1/src/test/scala/m1/M1Suite.scala @@ -0,0 +1,156 @@ +package m1 + +class M1Suite extends munit.FunSuite { + + test("Rolling average result test (5pts)") { + RollingAveragesBasicLogicTest.basicTests() + RollingAveragesBasicLogicTest.normalTests() + RollingAveragesBasicLogicTest.largeTests() + } + + test("[TASK 1] Rolling average parallelism test (30pts)") { + RollingAveragesCallsToParallel.parallelismTest() + RollingAveragesParallel.basicTests() + RollingAveragesParallel.normalTests() + RollingAveragesParallel.largeTests() + } + + test("[TASK 2] Rolling average no `map` test (35pts)") { + RollingAveragesNoMap.basicTests() + RollingAveragesNoMap.normalTests() + RollingAveragesNoMap.largeTests() + } + + test("[TASK 3] Rolling average no `tail` test (30pts)") { + RollingAveragesNoTail.basicTests() + RollingAveragesNoTail.normalTests() + RollingAveragesNoTail.largeTests() + } + + + object RollingAveragesBasicLogicTest extends M1 with LibImpl with RollingAveragesTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + } + + object RollingAveragesCallsToParallel extends M1 with LibImpl with RollingAveragesTest { + private var count = 0 + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = + count += 1 + (op1, op2) + + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + + def parallelismTest() = { + assertParallelCount(Arr(), 0) + assertParallelCount(Arr(1), 0) + assertParallelCount(Arr(1, 2, 3, 4), 0) + assertParallelCount(Arr(Array.tabulate(16)(identity): _*), 0) + assertParallelCount(Arr(Array.tabulate(32)(identity): _*), 0) + + assertParallelCount(Arr(Array.tabulate(33)(identity): _*), 2) + assertParallelCount(Arr(Array.tabulate(64)(identity): _*), 2) + assertParallelCount(Arr(Array.tabulate(128)(identity): _*), 6) + assertParallelCount(Arr(Array.tabulate(256)(identity): _*), 14) + assertParallelCount(Arr(Array.tabulate(1000)(identity): _*), 62) + assertParallelCount(Arr(Array.tabulate(1024)(identity): _*), 62) + } + + def assertParallelCount(arr: Arr[Int], expected: Int): Unit = { + try { + count = 0 + rollingAveragesParallel(arr) + assert(count == expected, { + val extra = if (expected == 0) "" else s" ${expected/2} for the `upsweep` and ${expected/2} for the `downsweep`" + s"\n$arr\n\nERROR: Expected $expected instead of $count calls to `parallel(...)` for an array of ${arr.length} elements. Current parallel threshold is $THRESHOLD.$extra" + }) + } finally { + count = 0 + } + } + + } + + object RollingAveragesNoMap extends M1 with LibImpl with RollingAveragesTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl[T](arr) { + override def map[U](f: T => U): Arr[U] = throw Exception("Should not call Arr.map") + } + } + + object RollingAveragesNoTail extends M1 with LibImpl with RollingAveragesTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl[T](arr) { + override def tail: Arr[T] = throw Exception("Should not call Arr.tail") + } + } + + object RollingAveragesParallel extends M1 with LibImpl with RollingAveragesTest { + import scala.concurrent.duration._ + val TIMEOUT = Duration(10, SECONDS) + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = { + import concurrent.ExecutionContext.Implicits.global + import scala.concurrent._ + Await.result(Future(op1).zip(Future(op2)), TIMEOUT) // FIXME not timing-out + } + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + } + + trait LibImpl extends Lib { + + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] + + def newArrOfLength[T](n: Int): Arr[T] = + newArrFrom(new Array(n)) + + class ArrImpl[T](val arr: Array[AnyRef]) extends Arr[T]: + def apply(i: Int): T = + arr(i).asInstanceOf[T] + def update(i: Int, x: T): Unit = + arr(i) = x.asInstanceOf[AnyRef] + def length: Int = + arr.length + def map[U](f: T => U): Arr[U] = + newArrFrom(arr.map(f.asInstanceOf[AnyRef => AnyRef])) + def tail: Arr[T] = + newArrFrom(arr.tail) + override def toString: String = + arr.mkString("Arr(", ", ", ")") + override def equals(that: Any): Boolean = + that match + case that: ArrImpl[_] => Array.equals(arr, that.arr) + case _ => false + } + + trait RollingAveragesTest extends M1 { + + def tabulate[T](n: Int)(f: Int => T): Arr[T] = + val arr = Arr.ofLength[T](n) + for i <- 0 until n do + arr(i) = f(i) + arr + + def basicTests() = { + assertEquals(rollingAveragesParallel(Arr()), Arr[Double]()) + assertEquals(rollingAveragesParallel(Arr(1)), Arr[Double](1)) + assertEquals(rollingAveragesParallel(Arr(1, 2, 3, 4)), Arr(1, 1.5, 2, 2.5)) + assertEquals(rollingAveragesParallel(Arr(4, 4, 4, 4)), Arr[Double](4, 4, 4, 4)) + } + + def normalTests() = { + assertEquals(rollingAveragesParallel(Arr(Array.tabulate(64)(identity): _*)), Arr(Array.tabulate(64)(_.toDouble / 2): _*)) + assertEquals(rollingAveragesParallel(Arr(4, 4, 4, 4)), Arr[Double](4, 4, 4, 4)) + assertEquals(rollingAveragesParallel(Arr(4, 8, 6, 4)), Arr[Double](4, 6, 6, 5.5)) + assertEquals(rollingAveragesParallel(Arr(4, 3, 2, 1)), Arr(4, 3.5, 3, 2.5)) + assertEquals(rollingAveragesParallel(Arr(Array.tabulate(64)(identity).reverse: _*)), Arr(Array.tabulate(64)(i => 63 - i.toDouble / 2): _*)) + assertEquals(rollingAveragesParallel(Arr(Array.tabulate(128)(i => 128 - 2*i).reverse: _*)), Arr(Array.tabulate(128)(i => -126d + i): _*)) + } + + def largeTests() = { + assertEquals(rollingAveragesParallel(Arr(Array.tabulate(500)(identity): _*)), Arr(Array.tabulate(500)(_.toDouble / 2): _*)) + assertEquals(rollingAveragesParallel(Arr(Array.tabulate(512)(identity): _*)), Arr(Array.tabulate(512)(_.toDouble / 2): _*)) + assertEquals(rollingAveragesParallel(Arr(Array.tabulate(1_000)(identity): _*)), Arr(Array.tabulate(1_000)(_.toDouble / 2): _*)) + assertEquals(rollingAveragesParallel(Arr(Array.tabulate(10_000)(identity): _*)), Arr(Array.tabulate(10_000)(_.toDouble / 2): _*)) + } + } +} \ No newline at end of file diff --git a/previous-exams/2021-midterm/m14.md b/previous-exams/2021-midterm/m14.md new file mode 100644 index 0000000..62f775d --- /dev/null +++ b/previous-exams/2021-midterm/m14.md @@ -0,0 +1,42 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m14 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m14 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +In this question, you will implement a simple thread pool executor. +Thread pool executors provide a way to execute tasks in parallel using one of several pooled threads. +Using a pool of threads provides improved performance compared to creating a new thread for every operation since threads in the pool are reused throughout the executor's lifetime. + +Thread pool executors are one of the core primitive used to implement parallel programs. For example, they are the underlying mechanism used in the implementation of `Future`-s. + +Your task is to complete the implementation of the `ThreadPoolExecutor` class. This class' constructor takes the number of threads of the pool as argument and exposes two life-cycle methods (`start` and `shutdown`), and an `execute` method to run tasks on the thread pool. The `execute` method takes as argument `Unit => Unit` functions. These functions can be constructed anonymously using the following syntax: `val func = (x: Unit) => println("hello")`. Furthermore, given a `func` function of type `Unit => Unit`, one can invoke that function using `func(())`. +For the purpose of this exercise, you can assume that the tasks submitted to the thread pool via the `execute` method do not throw exceptions. + +The thread pool implementation uses two additional classes: +- `BlockingQueue`, used by the `ThreadPoolExecutor` to store pending tasks, +- `Worker`-s, which each run in a separate thread, consume tasks from the queue and execute those tasks. + +The `BlockingQueue` implements two methods: +- `put` to insert an element in the queue +- `take` to retrieve and remove an element from the queue, in a last in first out order. + +The `put` operation always succeeds and is non-blocking (the queue is unbounded). +The `take` operation is a potentially blocking operation that waits for new elements when called on an empty queue. + +Given that `Worker`-s run on separate threads, the `take` operation must be thread-safe. Furthermore, since the thread pool executor could also be used from multiple threads, the `put` operation should also be thread-safe. +Your implementation should use a single lock to achieve this thread safety, specifically using the `[wait](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait())`/`[notify](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notify())`/`[notifyAll](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notifyAll())`/`synchronized` primitives. +Remember that `wait`, `notify` and `notifyAll` should only be invoked inside a synchronized block. diff --git a/previous-exams/2021-midterm/m14/.gitignore b/previous-exams/2021-midterm/m14/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m14/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m14/assignment.sbt b/previous-exams/2021-midterm/m14/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m14/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m14/build.sbt b/previous-exams/2021-midterm/m14/build.sbt new file mode 100644 index 0000000..aeee575 --- /dev/null +++ b/previous-exams/2021-midterm/m14/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m14" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m14.M14Suite" diff --git a/previous-exams/2021-midterm/m14/grading-tests.jar b/previous-exams/2021-midterm/m14/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..ff7d9e97309ad2d12b3694244f6870f5603f0dbc GIT binary patch literal 119786 zcmb501B`B8v*z2jZQHhO+qT_(PItd;+qR9<IBnauZFk@QH@Uf!`R2||W+y8<m8_Lr zSxNnNWj$3(Nfs0g4G0Pf3J3^@_@D8=A2c9%AbD{$VR~r=2}XHg1!)O!RW$~A33WAa zAmH1(pP%n>AfN~N$q6}GdWJc8S$dl3$(be<rbX7>qx(tvQRyl9DOzbdV3>1&S?Xc2 z4)vi$X>u{f(fKh>rV-Vz3(i^4%zWI-6D*|5J;MG8biMe@?2Ob5IMvj&M8gmZv`Umh zI?#;5i;UkZMA-`cHaMBeU3x%DvXD^25NSfr|2T>Z4D^o;3I+oN^e^}S&3`Z;XdruL zHpc(*_y0W=?LVhlJGi>JxZ9gMxEZ@yJ39QIOaJ>_!v4>t^2}_i?$&PRWJ>OC;$+MW zrgp}zuK)Gv9Cce&TywO5?X8ed^Nx~anGUTDbx{!c3M>1979ml2cxVin5`$9;Z6oVO z*(80+Z?vAbp*>l_=Gf5KNv#~`%jh4ek%nAPPwi20vuv}M?(7%tw3F<I>zlxzSJWWr zWNd|$VM>&T1JtNk<BRj(rj$$0(9vL7>nl2i<rx<dX6$v2YXEZ@By1iU@0xOQjB$;= zu?>`dxEx3rhE5iUqjC-C8aU$G%wK14{ML#C*`~)G%XiWMj3pPloX;~k!cdp7WMiCX zc)-J)j&g8nf;sq=(mGLonDOiEPqZo>gBCy<A~wV&QaIX04pU*`R6OrDf}6`DE{n)1 zY2FolQNI(<RtV{Rwe3U^k+={02FXcSA!(1Mca_$nelH57iHO?@u^M2`suM6XcECpE zg?h3+_q&Zsu&35cnenVNXHJIaZGFQ`Q$63Oz71Q4vw3{DT77owR22?1x1-T?T|!!s z?tV#sM6WQE#yCVcb7s3UO(C&P^vrZR(bYM+l^DPbXk8LzO#nct!l1O1EzCKO*L|<f zMP?scy)&7wZI({Q3FHfbsvxRPp?>wqRlEmD)ksReD)srM$2+61Q0;eFP;|h9tNN+_ zb&u?>G$2{Qp;ytlh?Y+GkQHvKsP*?Ln*e;lxBTwaqq?w_NLi)SL}X`JHy_Z;vkR3o z*U!Qvu(v7Ba5r|>>%(VkSHxn#BaqGj@6L3;yj+hyN)H`RP|3CA(#^`muBz1hT$CD3 zJmIeDG%G2GT=vd-TFQKRiC9r|)*J@GsF24UM7c)JX*~ij-4!@CqdREo+<bHPt$7lX zfXGul$a+-j5XXUS{uLe6{+xN~vw`B09NX0*{wY}$lP0uaag^)kDzid`j#q{8$Ua5A zPNTkyM7#*pAR~xbLZBzTHJ9)%OMRH)F;ZA_L^x%uE2~p0by3@Fe2!g~yfE>tKxUs1 zJfX9;Ya6I4ol$C#OK+0`bEEA&=Q8f?KfT*nzoE8>1F|K&h|ebRS|jn|9<rmz<}oJ_ zDtaT?JU$1VF#K!v)KzT1Znh_GJB2^n8#_u+GSCjuGA}_(Y|g)lAlYhO#46q(Y5Rna z?+XIhbNGtMbC@1>YXPgj-jPw5G%eJW(dnC7J_I5(((|vX)Gn-i-%U1<+=D0bQ(xK{ zTUtv%TvUU;UVsZ+5BuK*@!f;Kk_BU&riNF~cKkfTFYtbj+URdMV$t{7=s8#V=6jg& zukTsM)6Kq&?^y<lwmEi*d)$q95niYW-uP2w#8gEP56ZdcOcu;kBB}QCZ)+A%3C4;q ziVx6!x)0QTLnP_f%s)5yM>`wuT<@d0_w1uG7=(MJvO8)>$iQ2wdt9OO*$9gATuP|J z)pf@jLYL)v=)`V#B_cxBD6Rr7lai4M8zbhbaQTF!=!-R{%Uid9-JNfBM+cpJAQSw} zG$0I&tTELF47>br;%QyCd9(qj>wKeoM5D%j5p{Yi8h5j8FSBi&r)#z`RzKGAd&~Df zCiYDA99UXKaVnw(KS85oFx@~~kcz4ouBiAQNE%YYfqsY=Qz>3OZeTrb?f4V+j%;_K zFrQ{Un{Pk61X!zf{USfoe@W=l{0x@u*~V90lu-yCPQQWw1z$xQ=ZX<9AfS$asQWLX z{`XkK`ERkvLiTT53{|yPTu?#_xE|JMb!UQ*0}~F7+=7VS6EhDdi3MYgHv@zymPS_& z)#`Vq?)J`$k;@bYu--{x&)833`Sx*KU3H&ipLkEp{(OFYg9-s>!I8H35x3<qs^Lv( zl<1EzNXsSy4aak-#HM7|VmZ1pBE~LO(i4p`t(DVsCi1G$Uulspv|4DFl3(c@7Yyi& zz=57P!PYVkI8jO(2nhzS+8`mBpB`uc;x7i7)>GvF0tN4?vV@Q?G^j^~Pt<scH&)vK zEb5ry#?s`^_yHABpB{MnJM8SiN-~t{Ee^JJ=)RAnz>a0fbQ)X@=GA}qgwhKo)I zuqs-1tl<G_9lFR7g2js$?~oAM489R|JQ69vCsAh%%-%2=4yx<er!bxP;$RDKawUg6 ze&sx|d#*EM`WZfVkc!28OWk2DI~=sF;yL+!2@6M2Fg|5N0pV~BoT=Kj9+uC1o<GHu zuAhlnL3r%V*Y+}<I;!v>xG8Nq+T9&=k)x*60P#&zEW4`EpbrO?C^H*W5mF(U;?l$w zw?8(g_mnimWgC_@rL1`jzmFS`N`$pb5SFYJI3`7H)VfS)mtHnxzEWKBtMuY6%6S#8 zgjzn6%+|;*`G@9Tw*}GK;6z(E+)Cz@tk(<C7aA(hONZ?XU{-#k@1KLh^YKdylsx(_ zD9Q!1h}=*%SH(*PEvr3qnpjF*<?X-E$UVbSu#~mmMbHWJx$npg^7uPZ5dkduMq!7@ zN`YRYRFxdsBXkA&c%XL;?pVd1S@W0^_=hGXd7vJHqB!^V<DEuAvxf8u9Wpeo(MJtJ zk*!R?h)AzY%;KMzkGJ@blCv)mNPH{^L+)zd3K)^@T^uY>KLH{@z4f1Y%{o<&K!{@k zA(D$kh@2;~FwT=zVxfHLgFF#5?|rlZhyxjyntVMnV(ru<(d?RHNVv_oW$YrkB(HA6 z<@X1N%;92OzfTx)gHRAZApaFDAw6K<TOdF{q!9m8v{3wew5XZ8x{261n%Y`BSSq`l zyPN-C8AZ2-y(+FcS^xvmGTpDP+xdHvn)Y?1dS?0-n|vKADP|=*Dw(<EtV4)YI}g^Z zEreIlPtflK4~fWyX{}!FgE$vH&n9SZ(^m@KCSSv8?`hX*?`!y<&yQn8AlQ1W+B8+z zv8hFo<t6-rtMJMuJFT}w2Litn7)>i`@aR45Va^2|4@}l2K29%}DfWk0hm4B%-&dKj z1{h=J7g}h!>77YEP6q`1a7Fre=#R{BOKV$?L|AA$8o&CPR`>rhZ6?mNUQ~~xsR5K8 z0Kbt$^ES=HJ;>yV@eEK(Q%%xOi5#$hXT^ypXua5`UO;7WS!B)~O&2PRZJDM=8N$t; zv;Dyp0h=T8VH#%gA2hrz?wbleOtr<@NOe#tUOMP1AC;kPAD_id6Ch1jVvZd{GQmpS zzNvyTO1yVPc%m7QJ8r}%!-d|Vn2o$(iXPn1mHmXG-5&3VN+5eohy?bV{9B$phk!d4 zU8r2Q-=xnWd64n2Nq7`1woSYWb&TCVuei`|oguzrJELalebJw&=0H-RA}#<=D<vL( zNxqbnX*qr8{t&8;G6u(Z0^_I3)iwGMYo15dE~<Y7SZE%;wPj`BNr6MC>F42u1(e%h zPtbIvxFu;XH&o1@Md5iW(2#WRkRK?7p*vt{Yd;}f@4KSs?L|2W_LxE4%M5X?wLF3h z_<Y`b%(O05pK1zrG}!BUD?8aI6cR;gMJo464MP83#EG9dI}2Glw<H$Px95f5Yh|F- zLf8|vYUD(eLg+^_2WVNM7b98nrin@!DewrIwfoH7soc_2-&#Z2uELQ7*8p|(;v(;R zA#}J}!5S#trV}f%hm<4by#ml?5OT{$f1Az3Vh=N-;XrHChF8|RJDm20XQr|N{^&0z z*65<!Se!AeG3(jFtF!t$5s37~Ek0$NbE}UW55Bhj2&d~CF)E+2@@d|o22iBTx8Sp{ zFF+B;ePLlqwfWO({HhJ<s~&hLkvCY|;|@OFi*|^lZ_7q)?M0c;Qp?s?z+!vB6h)L* zU8RMn(*W1^?yC+katU*r%(tLlnT}%DUl&ikV6Q3>Zv9nV%?@1&sY1l>7Bx>VSCrnR zc=kbnjMqoi9mPhQ7}_O4f$Cb;&ho<vv2Ega1E+d}@=%tpkiEA~yM8_N>%~GDZ(hg- z9jhN~IDg^P2R^um&?_^05N^n9TT0@pfH?<I@Yw&+`#ac?xjyX`f5FwV{cf6+w(o;~ zBpi}YgVhcQkt9}o-SU3$)ycDqJD+TOmv+}2w0ziQH8{bjATt9IV`yct7$V`37$k9O zf`eje`d6mwp+E`i4KHIt3mlr<<X33QikANp1d@Xc`KlDT6yzH&({CB0?%)wyyXJ>* z_dVn!LFk@`(w%Xu9h4Gh^K-N~iTW?d9>EjVL+sJWXeD=vEH81~uEJMf-$B_S)yt3B z0eNza78F?o$;VuxQJ@GKsTrUr%Td}7BJ!HTL-6a+J^v5oXOI^nd5~AIHm9s_%L(LL z`gD|A!G9sm`kjQ%<DUdz6#9Qc8p^*R?caX<-MWxQsFKS8j&$0sTJ_qMF~Gub?IvWH ze*qy%ruDy!K$(ljo<ShAS!kM*WpBC(sN+3|J4m_v$pPt)oBFjc+rD3QFMsr2d)M@9 zH15YaUeaJ2B^)icyS#5cw!5&;1fI74+KQ=B3XBy$zF*kre7W04<hCCZTi`5YLA?yx zYEbl-(m^(w#dS2)8c~h1_2FrBvZ0-=FQIM+1c=DyJ2E7V_#GDTmCjkuWJD$%tb2;J z7`?npku{s-EvJM_782kL6(gjw#x!kcbqXLGDxbg1Vo{{ovBnU7@+qAcG{`x8fhIB5 zNdCcyDqAC8im}AuJq1?1E+p_euq(}OyqAZOFB~&)QAS=^PA=(Ljg=x<yt<Gb^yekb zVK!7;#oQ@)^N>YX@0m(CWuV8AeV%`Gx0aZ(pObQ|tgD+8tYajgohhOYWy6L@86T6C zl?~pL^3o;IJJ+<zY!;e*1VMarK@u0UJD%RnHIk>o+BR4~-9}w2S!xFJ<^2;}qr=xu zzY0!x{W7Z^Zo-7tHkR%{WsA**hVLQPIRgv$BdSx~Opdaaa%$V?ZW|@Jms4s7y7BU2 zEw5{@xZ-}j*tsu%6bwlR3lOmnmrN3AvT99}u~rafNC8gj>*<;Op5LyOFKG}ceKV(j zz7<YE=+Cqw!MizIvMJsNXRiWYt@TnQ<D0>QYC%`4=oeSVDAy&?7hW3?b<NPR^$=s? zTgHtZZn2UtW;9s9jc^;X=_HA;l8ah;e0Dn!c8tm9$GEDD03~1_-t-8DQ#hRCD~&J@ z=3lbgrPwXOsRXwu!6=0Y%RTO_4rOa8*4-jwUs4T@{_!gXw^owxw`H8A0LFS8Vhe&{ zfC0(Z;fsy^n+9ALim(bpwP<E!i`-wIUeR?a$LAj_BPW}#VcBMLgFt`DYIX3y`F<S4 zX#RcAtuCz%)ad1u#xbI)VY}L~*f*^cnu_aD8<az<&c<}bGGaZD&|atd0M09#$w+V~ zeFSmz+c<A|19K<uFo)Z)X~54NriS_0w$HDI=4kYd;X99BbsU64+ur8v2|#^;FIS;y z6>KbnD`%~l5MeZa{X?osC#^r;ZWge9X`~-4f)8-lHQLfh*_`jZ_<5;GYFu}L{GgNm zGKymKsQ2m-NyEW_G<GhN>6qUi&CuCAWUaQlFVRJIs%N(j)bE($nCfc<hq33h+W_A1 zQM;Gg(7VIuXD)7fj2>0XcXTTN{m5G3X#0@;l4Cc=KD37>SnU<w06d;G>x+zljeHY` zzz~qfh?1Of=eu9%?qP%$qCLzzh%mU`Km!g9xO=Mooc1-X5U*13UyKtnGW2GmA-js_ z&E>Wi$>f?Q0NbK;SDLdaDjy$4X7iBm@08}+0;<NP7>N2&B&6ix<s`o5)3>uv<v`KD zMGKh3&A1$7vZ#UnsBW;TN|$b=NjzI`;Wn^Tr$+3B7FP48Q-t}n4z*lAmzNr&mv~HB z$APqV<(zrBavI+wGL-slA=8(ZiI13&$6b%5moKM!Wmu$`Un+l3%1`X5^?(ZuETh5! zm!oF)L*4QTA^M#0_z3z@x3vd-l4`Pe#Pj@>PnuvH_1Z0vWR<IFI<gbv#)`6@^RjMh zrB8<%I(mM_+M)-2<r-J{X!j{q$6&&TS?H6U9Hs+XHBI$op$gUq?FtOaeNGgSgt4v@ z@svS;eka2EE)e<MyXkWV%BJJ%Sc#)_>iu3X<LxF_@F%(iZ{%+r+WZ#H(E@Y(mKLk3 z|MBL7goa*rev-=71k9FI&=;CUGE|m?dJ1<jLa(XF-N3r$8T;7fO2#00KpFX%g5$id z0Zo1zdS~2q8fyTY?0fqFOm_V7X`y2IVTmG*+p5!CnKD%%z*-`egvI~zL=8tg4^kdk z(6dVs(qK$!R%)P5ke)S&fjmRn-x#N;3}G5QAsz$nLJK5{!qWG=z|n|yRz!zU4m_(z zd}q4Mao!V&t^@RpyMXJD!zACS5i=uw0iDYzp6`^YoF~|uX}PK#!IzSSS$2ZUpL}r_ zW1F?qNu7C%I1#~uJfDW3JZ5!-J=C(P15ATVp<c7hL=&g==N!7;KzivHLv57#Qjzx> zk+ykz6sBHCpdTfvHs+&?_8qjdv(yjeW02O2(F*Nu0i3h>PE=)ikoTEKOmx*R^#aN> z>WZ72AQie;R)EM)GH$2Hk4w^bZ?<8vy#!!}-%SSr${OccUvteSeP*&hO6r8_k^P;= zt?>_0n)6~U0gR9W&<S6Pglmt8;OtmmQNE<Ib+jCTcLRQem#3Md)*i@~0z(LsomS}L z;8Y?iih<PFF2tv)@D8-{*&ods<h)!bIs*B}eXT;uoXpl*{98S#C?5OkQ7+Nw1YEcG zD^O4u*03DO{$FKY9qF=v6Z>?X?L<j7V-X2*0Yz4pW`@4S+;}Ukw#wc;wyhi1<5_6W zcW{h~CmBxg92%jrXKgM3?Nys->~&Os;+opU0au~<W%mir)=}Sx->J=IN@~;SZ+gQi zjf=r`=(Q40VDemb2D?C8KXNL$95o2h-UgGATpgacF9fb(E(b&_oYJG?mU0VWcfF`; z^Hmwv=4Zzx+PGFSp4LDN`ssV4L3^X6eh!D?V_2Ds@ywehaRt;P;Z1LN*rIA{Ni0zn zB@wwwZ5U6tDvXRt88u!*Jpx`T7tbk6>Tfnxe!pn)dN<qfL)8iD;(477^DwTLsd>s- zaP_J)-i-%o1Q1oFYSj@{fe{HhBx3D=tq+h73i@sPT%lH&mtvs!v3pWSxprVV9pX3B zSiGO5q7Xi9e=d#Dgcov%h!|I<7exGZ(1`y4@ivkw*>yh>IgFhkZ0ksA((pwbIfpY! zOm`N?Q%-!n)2G0+tM0vZ2??AJlh(vzmaC2C)T<e^G;6mJk<u9^IQn{(VJ=*o(BOus z>k4P*?xiARctfZTGw;cdyRh9lfnghyB6z~wl=9wp#3jV?{fXI-rR23=a^mTp6b3F6 zermN5ths%m<X=ID4rMdlxj4I$A3W-`(eW_}&Id(<W9=XKI11Rj^s4sFWqh~??#Z^E z9u1;JME5HpV~YJ9ioyS-PC;D<`1w6|#SGoGm%5)^gfp*z$v)s{iM@?w>URz6aRuYB zBJ>N_*h02bN%C{*%@1`4#I}T5u0&%mVab5|nxkhc%Gom?MJ7xs>(k7^I{k^Ey2d=5 zpcDG#@L|jECZBbM4{@i?i7||Pg#c{D$&dFXTKPsTm9KbSD?n>6q~JsORG>I<9Fg?T zWemiJ(rh+v48*UrVV04JBVxW{L@|uN;{+#^U0Q2Nay@%`=X;2!+^*pPDwY_R1b6of zpV9rk-g$b6)1IFNBHLy2Tp2aBC%DCr1Mvj3hq!7uj7>{g88te=dtcH>XCo&TBVbP? zy=16ry{KU)ma<CUtnla@#EvA{)j^Gm(^D{rx71^QG^;mNF2wS|&$9el4||!nQ6u}l z9Eqf~J)w${Vwc+P-{b>y_mVyv-DqOtKApcJD?8$y(Xxq{)#~ZPzb^_=_8QzH+6VUh zawmyCt-qr&&jl{be)^k3xH#Mk8>kHaaAP%HXBOeK8rjE{8nPc0Lww}a=03be)pO7U z^V`nGbX_T7Tp~OZ=Z$eqyV1e1EW}`QHFYV!+CJvP&99(;^92g~oM*{Zg8IC<n`V6> z;JxXmP{{lZ2<@d27YsTL3;k3_2X`w2eFXWon`L!YK4GI`nv_t#VJqj@kT6HEal$d{ zC6bvqW}TWad8ouJkQGBNA;7aP66i$?+Yur-xRvt$)P0EV7M7UAjXkB*+okM=gYkNe zL%@PreO~bi4YV=))BCq3P~EywE=Z75>?i0nj|N6QJit2q8-C8023>Zp?x~riok$ZZ zrF0bOOM8YI1X47iN+rV84+ju2<5wp95Ed~5QYH-hk0tWYt7(XGrrPy*jZqi$-fNTY zM*5K+1bcjwWPGBPBhE<@>0r?763PVR_%xDefM|`%B(ZoLm>GNUlKu%3MjhESlx9m8 z<V9f!nCuPwDAnQ%cRX^hhx&o?!({xdzieKOS+sRg*-a`t^k6W1aRn3t4IZvAXbiRK zu*T&fzN9xjn8q-<K<nO}Vjr6e;r;Q$+k4J8!%(nd(IA16#;$3Zdr~LVTw8<Kx*+YU zqw6vP+?QR{o%DSs<pd!Z>st*~7zaPrEf|$wpF+{a9Gya#)7OmQ0jjK7*>)nvx*BB& zg8P{Fwr&~l4k3PcF^LibWs@Yc@RyEx94QBWj+;h4t#A%tMJ+a=b}y~`i&zJGjwZ!I zN;#PM!X|vVoDDS@4HjOeHq<Id#*$m5kt04PQF@XW{iUU4jVlB1NNsCn*__neMXhF` z{C!XB3@aDn<hEF1X`@50N|io892P!zFPf4;xk7ESzMy#<xFm-odHIa0h7hG>OZt<W zXEgO3XFlE~0eK5wA-%Dr^DT1KNXQfu14+d?HALbMaiq{<*}NU~x>>jh(vW&4sW>K9 zVK-8N0$oxeJ>ZljoI$ffFR~RE(1lo7rB)fwv|;`CQYXAtwPGII0yZo-V*#Me>ByDN zZI9*ty=T<=m*Aaeqk-=uLT={4!TJv>;W@}Omipk;KEhe{pS^6~^yTPJG~Pn7fIJ!X z{Qz9CF9an2_=-jwGwY6V&9F(oc<b7d*;1O_i^W#)!c6Lf-jmyp@yCT4p@fMe?|o&+ zpyjpSL62TVz?CDr2_x#2srj92Nc`Y)kZPH<;%zvEmP9@pB{<Zb6G7X`;kl~Txgp!e zpgto+KEmX^A=~Zq4)mqsF?G%{dBiE_f_vDH4|%O-bq+;Y522%vlXdH6D@PU7d>~=@ zpVLxgv8p0SzIWX}h`rV>O1zJV*@Mz|jhfj=ptp<EcmyID6H0?s`{XGg`|N7$6C_)i zUGtaFwzjC<IXcby`>LrI$XuqXNT#=IXt54akbgW{AU-B%WL&wb#nVC$HGegV*+-ET z>aULzyj43{&np7X?qNrsT{qTwZ)<lzX5ml{=X<lQ$WnVfNHH9d?qu$FS?9(gQPuPc zQq|y;*ypG#&y>DGn-rDw1?kI`a3N3iWY^=98F2F-=+4%p&(48$ETvb-N=^`GDP-3Z zk`0)IFtz8mq|eAf7ju$hOLP<W?LnJq$py^94TG*kx*~dcE3g9jwMsApEf=&zz~#-^ zVsNYw)&q2e+}$|nC4AB83znJz>$5%KI%g{9`2@|T%_+~Lg!uXXtO8pSZL?oif`H{D zxA53Pe~^?d-E?W@PYL4lp+7W%;zqB@*TL}fE9xouHIC}fs{2IVcdb8A=xVtnEughM zU3s-W!HX^Gj+%r8o0V;bf)Mr$nb5uwE`uAdyjglTiRT4dwtQ~-O<@jP^rEN4zzN@q z<imviR~?=7MQ(p63UQA)t`cji&T#lNk2HHrLoxH?F4?K4I=dprQQcT4c`UGhoek5C zd}>={m`$-j=l0Wu4&85XxTeay(Mr6@fR8CD+qn`gT)BlMkKIg8{Tg~ljUMBs@m-Zr z7;5@+>d>@<)?^s#bHf}K`$Fs?F#=Vc(py1SQEheQ6((U{`_2_3AYxkiezq%o-yRz; zn>ViIhTNf`3Vh^s8h@wA^RDDDjq(8|kcBIAO6;T6RvbbgEX(szZ*C4RFoAp>8Q`<8 z1)%lg&}^rt<Cj*<_{@$#Iuu>jgx1Xi=G~hBK5vs^RWIxNi_FtIr+#SThS{-G{5!b0 zz3?5ZTjeky80P&fW_Yu3GvM8-sBCm0T~k>-nNui_<aZ;ZmXDt_e}{PON}SR(Y^V4_ zJf{OwH%pqHaQ^L1Gfd#!4S&QS$bc}l6-}oRCkFM37BIs&lk`YCa?+jFhW0C8Sg9)O z+o_1(HsFOIv*4oup}Y7q%E=^GuO+lj;2p(ZyR9Ow=XaTiqd$83gm7`MgdySKCFa>5 zN!D!r%;U?Oxfl29ufM>Gg5!g#)O0zilbMh9V&s@Nm^p=8QWk;^WBS>yi2*&&Xw>*+ zRw9z@RNqyJsE=6^D?nfH+$;LZhcqt120v6TPYZtz&UPr*)Rp=F-p&BUHS{algaGGw z*+sGgugZ1OO7_vi=oI~$At{bBp^*#+v6>1q#T=N_!0ODf(7t}0htTlG!_yF|;Uln} z7QT_l1@i1<>P)5V&$*Afh=Q}k#F$_-t5!Q+*6%(<!z6XQTTGQ%krt@Rv()UIdeM8> zGVLNfsT>ceZRmaHj{p5-hd+(}svCi(AF8fq3hrtw4L>yy=<ZX9pmjN322p#&!w)6f zo{Q@Sd-4FX&|kzNx#xf7Y@qjRtOR?W%sSWDCSSbFuSEDw2KPwuzN5@bdj#4*AXfAF z;XE?H;p*h+Ycq8`$km)B9n|W<;xp+c#>+6G&D<*|^`eo#QM7a#(Au&&jqBdbu1!?A zqKY!Ndf>MQ<S9*bNpyZP3yblr=1-X5E5gkKiS)@s*ON9-8VNzCU#Ur>Cw()*!YY?E z1s8hYRN`jTKW{9nsK>f!#CgLEd2{4{ybJm_%x{^f8*$cv_=;;xliT|h=gfF*q;KLt z+Ky#wj6i^CG%d=`gYCA(FUMiz$uHPE?ALDz*fOS5uATK6PlA(=&ANL~eC`y`Pbg*G zFxZ%p+0&D<_qR3R00W+G`WBagGuRT2{5ohaJu}e*KG>KT2pr^vBMrH#sq|P0xh>F7 z<cfDOnq1Sz5m>h;hS?UaZHFvTPz$_!GdzX+s*Ew)lqqoU&rIyd75Yj8h^=|>mbD6) zp{ystk+&kJ{<32CJkf9!TgK&ub(LyY?9~puOTAysZ73b)DN~R~sfaf85&^lrMmUW? zfKf|Rq~9i1gd>JB4|NUM78@?Zw`mC~%zwJ#2@YeEK4X$TYYK)>?$Wdg83SjpMr&_m zJ-!AL^kr{(Fmp72=}&2mD$a!KUo5OXv9i(#dd}_<6vP^)^8|3S0BRLYPwOW8dRwvH z(NZb+=hXHfo`R~xRrSKC9V0)OlM16`2@0K|)ME)McZk#^|2YKLe?QqNnRBD-*eP+2 zmO0hOnV~26PJ(AYIcNbswF0$SZ&-5#!{s<zelrplh)w7n5g7F13H}N4lC9^^*86T6 zI<l2#V01lnaY&p9RCIaMUvtt#7-g1LflVW=SlMquD6NKU;oJb~o&|YiiCV<Plg{BK zy2q2=s;u&y1OJDI-*<3CZVmjO{kCFC23onmA@lB3rLl9Q!SVj}y3x##n4grvuv2}e zp*9Exmd{x!<HL1cye@hdJbKseUnV4lPY{GuskEr#8QgUfrG6Oy2t=a;qRuFrT?7be zC9=KX*O7Wf4PHW%VnUT=U34<w;}0yTdt+Ntlfw>dC5FjysH5RkQ(xtsWV$alZZu<; z0wss_(uEK!U@M|(ncS7b*@LHfIhv@{FZ?<~m&i}94`dz3#iQnEfoc2bU@E-74jG7= zaK*C$*)8zR8?mgmh%|dSTzglAmQ-fwfp2bVlMB*etf99T=DTJ-Xpg>F`P~2;aUike z$y3Z02;`&CHtbFv+H1<8-)fuPJiLs3wArb?augF6&Z>R(6iK>x8JEl%bQoE37$+1N zT_PMVb5^a&ol6Pxn2FVT4`(KqTFAI1X*$Uc4OCluQr0s;TssN#y6#U5=L3Zt*~ld? z#d8f)Wa1y#$~^ib5~?E<koX;>iw$dw&V8fl-JCIN_{Y2SKV!Q!$GfmK&9fHIw2I`< zYC5M*CkR<M3~lmC4kdu7>cv^}QUK~$bbWchX$fFAzM|lLQblw{N@bvWQdvjGCg{Up zCJ}dh-gUs5OhlUu_eIzNZQ`AjLvd50bycyEY+6#jeEtaN3w;zrlSH=*ac!T*EXwwF zr)3mlWv<Dsn_idC(mblH+Rk}&9K&6sm5aDF!))g|o!*C~X-J^U!EF+Qx5mzSb`k>@ zze(JHMK>gAjU;mt!#8nlKgiB&wtYU8qjpRR7u8*B@J_~P$oFqi_o4{rn#u?ct-D>b z%1B9U1*xOZ=59KV$vYZDCpK-@oXI3Ng*hdes$}A~0$k_BaV_*dMUpUQ9`etP!od%H zX{;{3n^)s`JEi=HeQE5*5PoUw(6PQrzz~{c>9*q^>IqEG@%9M}e_0Xu%Iiih+Mhrl z6oWX;!}M%<dyKQS0@9VFaU|O+$U)HZzm<v6wWDMkAM_G}X3CFH1t<Y_PCJs-Jz;kK zO`3z;H*+3iLQD<w>&=$uE1EBfUBY8!AA6^ePP1M}x=$a}V8uJKh#NEqkW=IBzdX*( zl5%}EO-7BQh&^M=SuhkSuwBT;;t|(gZ};E?<bqWSH|{z?OE;mfcf?EFIGq9zD-R_B z6^U(@Rf#!qJ#A;I9j9|5bzaI{W(fF}r3i{cL0&nh>9r&D0y6i7qcuB0KL6-vI5C>Q z)zoBffx;+QI&!GD0tsFFrY`bWFV0=vp?+$y5vB8RT^5;FP4-vnt<O5TzC|_u1vOjd zwl~e|GxN$m(>A?QjM`V8cK0(n_d9chXNuC?jqOWel9V5};(pYSHP0N|4o}=r`eV;~ zX1M;b_pTZr-~tX$-eH2)W4)FOZ=~N1ODB#TIX{gpie-;c*~tNW(&w0}gKW&?Yld_( zG3c^(S4XYS-W)mf961;EJd7=8mn|_{_O_IES6{8q=p0{~8;^#L3xRd=Kd7w@iW}>M z&1c@*r6=u+qy~Kqyr5b-;G1?}5}iR|Md4q(;SYps14YQa_I~k*qzsHi5Ie!WKf^!! z3nY?WyG`OI5n2q>sPrcM8XL48Q6a00wMd##7sgwt`_^~DcU@cz+rYW7XH&EaH}gWf zA9>lmh4wTNic&70od1%V5O|plNpOIG&PD&fq$W3GS2yqfs=b>^gLP6}$r!mwurnZz z15i*HCxyc;km*{eLS^JwyV9>KY|`6j+DW&uo=vw$`a>f~p!kp>{r0~W)zq9%F_TRt z*Bx%8tA~fM%jGb7fKUbD+LQMJ7Y*X#!vzURd*SU&jQ0wey_%*Ao}KgdJNfAOx$!%> z-I+T+v0=KvH_WG9wl-)!r#yovJU1*{o<7YQWK&fmdcLWP3j~aF2Zb2M25v;Zjuj0P zIVNn|F>6z@`b15un9WvkrHU5Zfum-K*fv~mnH*~l0e(x1zrTDhjB8;Z`eiZeeg{)? zuuu#hlS00|QOYVeU`snj<FIb)m>I{v>Lm1xCPvvM)!fDu^Hm85<nL!Q(4WL7+)~av zvZ4wiBVNQC0rS#KUkLYqbRxP*Q7xbCs5*bckj1v8M@sQ3Mc^4#1aZBwrsIgr-@t=I z=jANv=yot_p-Vt+=USP#g*sxx4dFb91-G;-nKtXN-QaGs+eSX(Oo&OahKjMMJXi)> zqnNT#S~9C<fK-JlTPQGLQ|x3`c{?x8L}NV2O0g(5>%b6K=+rKUg|t<tt{_ir-rJ(N zbP2QsG1Dl3n;>1$nQ@-OP@HX>#(&W#70l`w37hnc8Py+>dh?mm%%fxai`_>TNANrh z8sfrW5B_L43depPIzqK#3&iLIY=45+hZkSPX?$&nCuQKZqOZwobc3%mnIofQP;20q z_bKAvu@3&I2*R%gf>#*1`3(AhGRs*n++R(kk;Z2H9^~Bd&!Y}%hU97f96!n#Wfigf zrr*t9z+`e%z$!S>^n50U9OOu#P9H?;KW{;r;~D%qq|^xjZ4g<|2|%q*hH-me8JpG# zVEsg+Lv_a>!z|HWxX+`z5p7hK?qie}PqiM+d3{Qa$WUTKkGRzzl@rPpd$|~b>qBYS z_5G$&d(!nMW_^;cI+}v+Wzl*HJ$_WXS-g+c7beq&gJINhP(*rTf&UWb%n%m&)yD-- zlqM94EGC5h@&+7UZ9vO~pb|!~|7?1=_>Y`)=zJScupe71epJEsnT8-1oUW!f!z?v& zhu6vw#t&7KbbBU7LiQDh6#6QWFlNSdRBuRHf#mj0q|opJ*LW5^Y%)7ksfk0hM5R_b zX#umtbPDgN$jUM*jwOdwbR>9{9Y@yP--^9P*C`!Mkdm~J<}5&5--!1N<Fd2-v86sb z(;_f9pbg}1#GWW|`Uvp_Rz=XDx<`k>8jTFy%Ndl^h3Tw=YvTWpsM<)rPrsXZv%KcR zAD|=UWlr<WYqk=JaF|~^CHeh{?CCQU7^}AnlnDLL{>|NW5}i+444chGj$Ty#PWp4J zaFHnjYPuYR;VC#E<r6o@N`b$K=ez&<dnbU<U5YkaPzv8KT+#r;r0LWMmjK*9oSoG2 zS3!Gv1feF1HM<L%e6C$fJZU+K64nw?03R!OCaW^NRuxPklnbrW*Lr>%lPbNLwwf(( z*tv1}0fRwcdO2Mv#O>Dy46I9!g-J9Vm{NMwI;%@6o$Me6v`!iGz#K$mfsxRH$*%~d zw0-k2(aMw8#d-~qm>z+1BzLI8CY-1Y=Hg`$VaZrAeM>nq0JqK=UZ!U^>bF%#)<c4Q zBnT{HxfcODs<iIMtO$MJ0Aw(R3AM2kn|6;HZLa8qgNH}q`AQiMagkiX@eng9dtLNm zG(iRSQ{plIEWB~^(YCWcSHhfaGMJ6Tm)-+N`R9IlngLeEB`&-_*fJ&?V-HGPbGFz! zKtYfmI~@B~`z#Bw0H&AmH*Lu1vNWFV668J<&w{T7eINpYqW1WRGAa7Z^3D<?$i|;& zz;1p67Mq!;I9ravfE<TTDR~{(5b+HdzFvT1rW7-Ws6B`Y2i;B8KPMH;MMHth8LFvr za7=@Ke+S{I!Ot83b9+Dfol-le%{`h9CAUlMBgNP0rALU8PZ8gP2)lVpV6|w#ITTY= z@J@U<Yh%fRB2+H#Q~Bt#8tvHGKBB;v!U`xI;KxO<Ka#a&KEs<Z6wahgNpqW+i4Vjn zOedjYR7C9DRu<*&nTT#f8pkI%?S#o*5+yoCd)L2BYl1D2tlE6N4JmIy8q|87CSc7c zlGPW>y)nm?Ew<gp2@cB@2+;+B>n7XH%_egsHhrkBhWAO1po81@*ovQsE~D*!KG_m` zGz~gsNmTjkwiDLX3`PbY-p^l-*wIg`JRy9pg$Le3C7|~(GvzQPcgW+-oJ<WmkG#e+ zls$PC`0m53IaOFKAavqck}XWwlEa{#R4IL=un9`MnGKXz)8d6<IZPzs_UEKAxJPiS zOF<~=!uf6@ckh|b+=pnssm?=1p4i`Ew((Bgkm%`ytSyE=?+*(_(plfkz0!N_IMBP~ zDz_%?EM2;2-}=8fkB%<ACX5(JZvP&9tN_M}3)Al&x?kUtOtpovCVmu<#EN2Ce-uI- zdEbunc4(IPdc_)Xx879sOmnhNv8<n>pI{0*?C3stm2s39;GLuyOs5Rt63OM-VzQ`T zdMVbT6E*{Iz1(f}V>-1T#flVc`McxkiWT95*P0&SnQbRGg&4EvtsZ0TGg(GXOOTKK z5a#e}Jm*K?3Et7(X6f~gHWQXDd<w|2bhjHA@cz6q0(h=^BwgDbQ^Q+Jmd%Y?;U(g* zHKhU$Xt0XsM8XEzA!;RUM^=M8Cv2@e+nX9~s2_R1d>Ui`5Q9wuJDsTpQbnvPInG6g z>>k)f<0htTnE0TCKN3~r$+`9AnAXiI@L9|D7@_pDrE@l6Gwtk}?7idSmk~yB5^2VO z<`{`NJ`A1Ot7REi&Tc0?{7<dt3MxMc()#6%<SHIyk7MJ5*pM%x2Es2|uLj<o&LoLE zQIMCO(oUcYj7!;S)vK4~qe|NW5ds2Cct{l5&HCROe-0j&T#W*b0+hq&`Dc*J@P-F= z7yI>|p7Cnmp|%dHnee?Kd5FNz4W#<g-j+>GeO<Ul5IRS&N|wr8A)1cd|0(ya)`2=z z`?l52CFaH<;8ysH3V9ru;&>J6#@S=a&;NW0Ns^Rxv~L%i;1&gd%|`WJ<?vsrj^WOJ z>9YC*B<Qk_59!KvLSRciD5=uF@k4MhhPCnvuiThmU^UkHh>)XB0gi@>(B=$p=gZ8Q zH8J3(I316t@tJCtW;rCAAM{R5u*QhG(;rK7@bu}Ew^#W@)6E8&PoO}=;L?EGRv<1A z2%dv@G9o@YCGbYo_IW(|NbQmoHglypBK{!;Y|P{#QyXvQ_0%8iW4Ft>NI0%1;_zHp zom~*u7$en8^1-V?HfOKWg3SE@@8n9t+l|KZd-Dx2v3`l(vF5slb#HdL7sme%o1MKb zn!>v1DHbaO+=xy@HJ7z?pwxl=Ho5eOC(Tj_<KyYj%esd?Z8T~r2Fz214^rM73={;8 zEF3GvTB78_PIoqb)f;i$I~Y!5co7(My#w?&AE`U5onrP2<E!+C+PbKjq9f>fg_@qD zkcZktjF~iY7_n>t6X{pKvz3NgW8s>UhuTNZHIP(03(Y(zMuO^G@2^#js6-suX)pPF z&Nxx{#`E9BJhTN4l9SPylS;<tRW()!-LtcBl7Cia<q+EgE(o#N$E`5T%#GN?Y~ICq zGi}AEOue}-x^I7gtuu=H!;iDZeA08?VMhzWJ3ti&d(VF5ZGOYUv;>`i@H=s2=!;j= zjn{c%gPk^wcmjGmKy9S~m;=B0IF|NR=mnNgTma+cG7>4fXZi4W_m2?)&1B~#kbYU$ z8fvYDC3hrCu+T}0QX}{Tq&BQc3P$PEJfuTHxx!f`IOSAU0{l+aU2<gK$I#w>1dz3p zls+K~Pq$!r&iv~m1xJrT8fCOXm1ti`iilcStjSOX?_w(Ua;PSu)jAXv7+K1Y{JVMt zlvPkW!OUfq7pV4D4E*&1I7N{75k58Lu5_8$ExMw+hku95vjh-u5TAv!2;8J3@{cee zXV)YUJEagAiXbIRt`O3YYdDG&-eLH;4)yT0U<_Tt?VOTnZ*ZYy4=N`7!A=_Dc@kUu zR=Da|P*$vNGqMX{Wa=9+hY1l}N5U;_Py3pT4Xrh86v>?lOfefeI9~SF`7m6X4|BP7 z(nb>)cL8`qm~)7AQ>F(MCZy$|1go^6c;8$o3c*5%{nR87ureHT7|`}o6URQ-^eM9> z5$CQ_k3kC%PM7VUF@C^!fo7O1S#s1Nl!Wm#cnYlRRsdP{&~wtAEz1MRXPSC`7wQO- zW-fBgI6avFQ3lM>2creapW!KrEC&$5aG8{PYZk-VBzKCJxtaqdO^_Je#B&!NrY!R% zYUwBPuh};~0}Xr-*SJuwrE4{$V11VS;>hjNcj$H-;i$emq^TFk&ZJDiR$kGEk+vcB zxVUUt!U96x%n@>{*96jFz({QATo6=+VCF<YCmVs8+VQrzSm1=eU+!XV1VG1zj4ote z+ll;q1q0+a8lxUj@8N`A26%D3`Y9?>Q1*yDjFF&D{K$~Iv1Q>ElX7Lq3q-WriGV?E z_=3FPwy;P?Txr}A)!WQAk$IiW#7~)vM^rL@+@WE7lk^iV%6_Bm{6ikStah2hgrGaC zeh}=hBxzv4<rtEYmAFh0@d+y!)_fAm?#MJ8FyN8w<KpI25xQtwl%o1%abqD=xh^r^ zQ?SecAb_iV1IR=X#0SWzfGjD$oQSm)Xz95Bv3aR=;bp1RyGGr(uGyNFy9(G$S*(S* z8pkTk<H{bP70oNSQjQQ%P!p*-dO})EBCZYA6M()Fda#fTM!rh0QKgntw)Fl>5O{Os z93dNzcC|@4z%9DPODyHmcRl5wSeB=y*LpqjK}fdie=z&q-1t3c0;T0XLG^Wr*`b*2 zqg0e<i8EzQDY3@l7BmQHftcX$vVIeF7f&`US$z3rjYXK+)F!p24`!N`-HkKP^$3-= zmHNxMD0ylJz+9;?f;9#_NFf|RlL&mznx;Y|*un>TSeAJ}G$QG-EznP?6mTvFF|No? z`JUIhH5Ukbw`C>*TDG0~%Zrle+YPeJz=w12VlxbSf95f{#<%l87>p+|;;o)s5bL4r zghIOq^uZYS0nFTrR;`Zm>Ruw;Y8Bl<onq$!Uq0lf)2-)gH?7~3AWz}7-WEFq@uDP5 zUC^q!t&gkvoumK9T>rZM8j}58ymZd8@`ecS*}L?;Cj^nd6e)L!!kk`?^s_u$ozYx8 zIf{iAD#Fi$KJ7@JQg4g00&!E~^~vq;40sQjQG)EpT9%VF>g^%Uk@~G)708vV%l&+q z2Fm5hv3U?Ysh^A4!WF3qPJd;M*|=u5jVMolCAmX05&7P&e8)f*A=v`|!E8gbob4`h z^RmBI2P`{^*AGx@Y@Dd!w!=l(*5pjin5vkmBAE;quv<%)VlF&0qTt}ta|8(wa5r}d z5aOJ%;`J>q*#4d&5Cr{c@_nnga)ki?m(br75kW<%{ybMhm)tEZO3R*^$R3=i9te-w z48M2p@)OIsj=(j*xn4WDMjS5x>tSQ$-}O`)z7bVy_to2B?%2$!YoVGc-Hw5g1NbP7 z*ImWXotu~1raLc1yP-sdgpsW#&BX8YEVt)j4Y!oG=Fs(E6u7PM8ZM>ndMo9V>N*Sm zP|T^%;_*F_uX4Q7miPqrhy?tI1ltDm`*Ek1I&<Ymtt*b#o0`$4bVBSDFt^sBFOOA% z=DfkaMjE{8Oz^8L^KVCIrpsYrhSJZjkl-a2gnPjnbll&Z6}fGWi#0Fd-xKNU7j+b> zPDOu>D<>p!&^}9)_58c1B%XGO+=~riCy@nRIxM`^4fBSOTM-#|8Q;O-;10C=qaDf! zRY&k^td_pN+-nvymzBz6dBp7zlt0SZp;S*cHZIn)L~hIY#q@vmDcRzGTG`mxgkhf? zOf~Y@?0k6Wg6EEH<Zk*{SYTT(jxLrKNs7WJNI_j1^lF)Bk+<PJ{i$pt4M?c^hFf=O zt~E2nf1++7EvznA(pXH8A8jlJER=~l2lnJYhmPwUyF<0yKS43>=4(+e^3;lXK||)y z)U7Icst=_sE~d~SnEvcAw~P%?kl3B_3%gGhDs++_h0TLFHg7l=wLwgnL^*-Bt#WOi z7CUsNfy-Q=u$B)P*l4yl<FCA^H`*!XbC{wfx9x?SjgX&oJvIL5`o7W_>@v`5YwW4i zq*mCA1pA}5<QUFT-~nTPrpSVC?tAWsmuYJqU&*hv@EYs)SBA^davio59C1-4dzdWJ zr!cs^^`iG{Iw?KxB@VmTM4j#gUDR=`n_spt4z<W?9l|SJI2T>j&-#J3{d#cyz~N%( zUp`o4m<uGJXj{|I{(*>H-Q;q)12NFh#&A~W`Q!v&<<Y`O_|lAcK<30lp=^<TOyWA= zZC<TtN#~iUDf95yUBItdBu|A`&eHO*OPgX01~yXoGk#Li32qY%6svCN*jzK5fUvZZ zevV;T{q*X4XX6N@*=U*R?KBOsCLf^07&4<DlQKE{w1Tl}cP?;3Q_$CtwLZY9s^9Oq z8VKK}4(;{puY?xzW|h;cWBA?$*FKu_?44+!|LRq~$F91aHSQh<9q$+C&@DS&1yrD- ztxvEn4jNj;S7cNP?O*Z3hPC)DX?qY;+$@o)L@AeZs^GkxL{wypJ*oQ&#iCgu70-}$ z?HE#blJDeoxvL(4;)agkqtoVJh_WOzdqlih@w;Z_ygjHEeE(mh`%m{y(v%Jlec0Or zMeGfU468lM7OE{!LBj(c6^jZe>b|s!^lkTSB}4N1VEe1{K(B0yS{;a-#Bmdbfy{Je zB_)R_BZW;W;AaY8`sWE(thMD?<yq59dk%Vm-5N+F{UYIxnpBII$)B81#>hl;RFUlo zaq+J`#U819QZ1|mJKMDWW7H+ET&X<lS9CLh^?w}#{W7K``mX>^X|#I|znuQ4)i^6m zdjl1RYxdKloDVK~T-&rCvXWc4i52W$_et!sd=S7TcD`4k*2HywPHnI5+_~UUyHdVe z;CaY?y^Gn@H8Rh=OVH1>ktGAj?va#nCv}G_pQ#$3MDSW<@C-%p_|JXBTjPvb#W~n9 zvy4?m!l5c{U+<RYqhnqW%;wG8Y_OH>hZR=ibx5l>gG65vuD)#oHj~}KBNW^yG*INv zBVu<i9W2KP3i{mn`d8Fm>!kM_Rr*ukoT7X?W_P*gNnW>@v4Vlq;K!pV*FKp}3wtQQ zZGdyf_N9(sMp2yC0i@3ozXyqJEcpfWcRFDr#Rql42hxnS{u(I%U1<G-N2u4hk;hdH z<P3^(rh?)Pj`C*zQ=d3$t;dq^RXbEVHYWD`Cp^$aJG1p^JL2=fhO^_4qhUdSGGdcl z=|Wcb2f9Km?B?|SRIS%z)ZsaHRT6*f(!w#wcg0)B%GJ*eymI@k9>0w%$kwtI)beF) zK{o{AjllYa;VrjeiD(S?5ZNNEcd*HuFD`Di|9cf)^R==5o(4hLcTBFF2Xf7$@}hA8 zy<+!v1RgKz$eoxGnHI=|JB#txZv;GOm9jfKUh2px=)H1>LcOzjua?M`ef^k2uE18p zyi^_AlgT$q?F8b%`#K%3xZrxS2``b^I53lTnrW5vb%^6-^6C~;Q{9RjS7);Z(TY6H z@RIO4ir|V0U)td69}0%G0~eiw)lXaVY<e|@S6POUH4&CrBFUc?7+qCFinVjX7<v8# zv#LP$fCk;nWhckhZ@2j^N6+jU@{pQ`kQx}Hs%Jvui`eVN%nwpddNv`FQT%BCW~$K5 zXEYZ})`W+H0A%m?%RnS<8+@iVM2GTHC&k2$_3>4BMB{509M{996maiO1|I$dq99G^ zUGeY0V9YyGOy*13pf=ft*T0u7TP8DITMj>G+9kF6!JWq%=Qv#Q{z+3bm-2PejcM*| z9NolY2FoX}+I4JSgWYQ%wne<OLaSK;$Q+VdTG}-6jT&>xy|jFY22Xm5?^~2!3vV{4 zUC`k&4nBA`alhC3p}PLbQ5Nf<<5fRQojS<lRX1)$W2Uidc3i`R`uRtekhd8Z^U9Xf zplKPmCE(tYJ?a;G&axP|suY)(YN~1K(0gL_5R*0Y{;AohWLd+n1d4?schU3pB5Eh| zDpaNnzm=EX^BfE{M8oU}VBTJm3)$(x&1-Fw&?rRk0;F^%aca)OXaC(-j~K!?yRxu3 z0m0Kg{`*Jk2prWACpU+<=`C@>c+0E}G0c;OC+_Ee_30hGoI?;}0Raus{!dB+>wh-2 z{QErtqQ(xQjt*|t4({gC7Q&{^?$$2mu5$mh@BLfX3-6QTiU0%z1S*7s1jLq}DC*Z_ z*M4H*{N`d;;$Y(BC!hbxAm7PnSK?&XyxI)g$YKBdWZ|Mo-shp62ZV$K#INeXMzOE# z!7exdpW^DpLlh4P3kit-;Ow2cG+~x*(e6^0ZQHiHY}>YNbm=KuUAAr8wr$%!wbnj2 z-x~W}d!KWWe;`Lj%o!0gX6ox^ds&3p`skR5`^4(lI~d3i5&_G?$}tmfAy|PB1%v<! z;aY7hMZhYz-)D38m72z}voROphqhzH@Nu9S{Uc-jLj8h%f}pFTV=SXD`%#;K!Qzkf zcaL^M<b$G<+P~}KC=GXK+Y)><9T5Tpqlt0++l8Sub^2iB+jZga`~34F@c;KK`=8Sr zZP_l{IX>h^cLT$dK|awKcvOX7U_R_&fgrhvrE@S48R=Bm4OhieU<6>3yk8ROyKw^X z$ZU|p@)Csoa;-`k@CG4#K*afsH*g6-IAJ*bz4x6@n@=5Ao=aKLQKswCEI62UuYrQ7 z5FMg25)(whc`YR33X`~R3(wRebboYbDWSpd#-YU+^cxTUhAdAHCJbku`N?3!F_N&7 z!nU@{%_d`85x69thU1s4*TR=uaA5geW0Nj-{&;_B|MLfBFk64W9g;>`2%kFk&C%@V zJj<yXXKNq~$Y~7x>lCfcA9N%vbr8(jrgyQ&S&-+Z9c^$g;JCEfr)CI&iAFm=)hsRK zol!;l#XCo6hJpSCElbK5I><Vw0g-VPQhw6BuTDjiJF8+&$-DM>&JQ-b3ryqYWk&eq z67?92t(~>fG2JqOi1%`7U^2NNw4kDNvB;v1Vv#c$?Z_e>8m`dP!I_K(tfQvN`qkfq z;^9wAFB(;MI_EGtxX_m7uO{dr6E=_DERdO@K5TC)*_C!L*-zr<7vU3hxnC@{?u#z2 ziyLrz(ZAtbw(J>LB0f~Q5a6N!a4vn9i?$~hK36*~y#;-VFur*sT<>uI8tBFT6#*Xo zcI~+Tf1Nx2_siqB{}5)vHb(!sK;EHjsrtPJyTL{PjR7VGG0?cI0=0N;MueiNNuDHH zIunSWLvFD!whsgxpF*FKQ_?j8$GZrWR8I1`fLD;o#RL!)sP>6z_?zN+x$?$+*-7U6 z{xVkegS2|gu7I02mbJX}%*|N8Wu3)}Dx*e15E8v_!lZ31Eo!@fup-c(Tu@c{h*Xx2 z(`95%8<YXiNz*wt2gsm>9NI3t!O>+JQ70JeZV`Ia?pqZ*f*GpG$RYGj>usO`wFek& zE;b2M*lGeSxm>-$`wj}_Krsc|qfF&)gI-Kq#^L)K*4+oB8S7;+`gtedrD3YfngexE zti>4XThc@la||Weyx~v~h*|FO5sIp)pm`FrXUnOuWnLJxWMPi{_np?5gD!_&Ow$ZV zCh^IeYLqUO)<`uO%-nF6xMrfT=F?)R3?bF$fast`8>>Q{#ro2Io}&sLwHhY(sX;$Y zhWlK$$f2x4K$d3zZH2!Z<!4?WT+5J)HPAz`c)$RY*bOplHV{{ms)Q;{<Giw**zZ?W zTSM$zy7+PEmSmYA%qeT8INv~?CK=I?40$OLh6L?MTBSk;%-^0z7-_H2OIl?!xk9pI zNrD9`i5<7l5MC*mk|j-8t$--6pz&*yOf^F@1t&T!e@Dr%wNLjsch8BoV<K#(w=N@R zRCm@HDmgq#jm-jjqbOQuaG2G4bi0PeGEt~vyCvvBeXUMnK}s48Wd#+q&dFBB)poHm z^fb<tW=^1oo21@kDe0p8APk28^y)VbUHzOo??5mm<8#Q4LSLhQG|T!BFiIA_YayNf zuK-0gIfh`M5x+{-vAECZ4>R}`I{y)c{7n`eKY-5s6sgH<V2-C_*~$dVsPR-{J9DSY z@XKeAjAG<RCaIq5pHe&TG+S`Y5~tbFb@RP^Y#QBx8<Na;qmXde(_S~k2bfM}h=DVv z2Q5=jPG#y*6pAcAll^_=Vx>?eJ#AqK;!~^&aTIjM835Mi^e-4eH_1sk1z%0Oa1RFn z32OUos$CLE)_jLFH&r?<d4-@M+DHHKn!66f67xPA^`!@_x25_RVwA7u!Lwp`<I(YM z3BiYfa0=2Og$Y(J^CzcSHoaCNQM%8g$FR&?CN*ls?7hi-ROETymFR0occE#UZMtYs zrpET4F<$PdPfoX(_5<A`0>ZL4w+mCPMC5Z~VFR!w`f2!!A8fwO?3jLAW{|k=u6h>U z;66f|j4O|^Gr-VnqEEkY^>c15LGtSHdeAQexsm4OL*?LNbuJ>$_jJmn=3~Nlv<1MR zU3(dGJFdL9fG{fr%_W%m@EXHBpuGb};9sY!0z8;rxd<orzz&8^4~FQ2hJ5-@JZ=s3 z!D7wI)`=cKc%QFYe)mX$d&?}6cf<on!!a~*+Wk4ly?s;T=H$F3;JTN>zePJqje$(c zn*QQ=AUS&=xuHmUFVECJ_=0@E;4R|8IOSiCsm!{5z+HT-e!*(gXegx0cl63q*4<o- zyxkOhS=h%BUPz{lL<pPNzzsgz<Ju8#>iV}EhB!BYwb%DDEG^W313{dBPH6wZ5Q5@1 zz6~+Z2eZ&vM;jSQ@%+heS)2t6{*a%(gZHFRuLK&o<+ui4;s;eG&P5&L8MQM2(EEbW zbUb$OjJ@Err4wi$bC2%ZyN*uY?0r68A91=dGZ9HwsVtNBKyyy(3(&%*Z+Oa18=&EH z?C_(44j`{08yY<EFQ)l^>(}qB1=lWI^N`&yDCj|{!kbL0l#wJlo>yn@kROy8#6ML+ zdrx)$(C0>Aq!$~0Cx8fOye<{R*{RJ{`eF-}cwy1672OmD76i$wc{n%j&>)st@bp7L z>LWLb83IM(_^ZAdiRj=tYHLf?wNNA2Yf*w*u+CGGaQ0OaZ#`r$pC)Zb@J6`2b*~vW ztxLHirPZ4Nt4*4(eQCh=mu?`b@v2oTb8^bOi7RK>xnLnd^qf7iOoLUBeoG|Oik!^L z)`0dljcmWouawF;qt&tD_GL4Ld^a^oi!9=u#+_jGHoY8!vNFP$B%#47_Q+Rf&{>LX zK_03A(Mw#-7pkejCzO7DVTd1TOx`Mpem>Hgs^zGiC?XLtz9oQ#rg;np_TzZI-^0l* zD<(|CW|3RAR9Y3pZ<2oPo@+E|3Mbj{BqQ>0l1e9y)3iJrj^dasIHD5<pL@TGftO6@ zSC^jA4YFa@<lhKfdqxKLSrWHdZG(GiSahlMT?wlmCTS28!{8QNSg0CcSw@1;62<ip z8aK0%{)xZaHN>C&VSWd=-4@W-)QEnb4Aq;!Zty=Tl%6vVVtVXc@B>8OH-edQ?=-rt zKKJR#e`Nip_4>H^>6R<}zn&;hy%n|Ww*^Jt_cQ%xp7!6K=zlOW1#Ky0Rpd-2^EV?6 zq_k_b)XsVc3iDY}FjNTARJjmKUCj6kcF)+@70=+5mN4nG@vX_pPx^5GW+<wN`f6~{ zn<`}CdKKgn7xOvR#}YX2Vz_)b5u~}lt8M<$tHIw$%(2yS#C7ELCOg$G&sgE5gosk} zXdTwZz~R5OW1*XIwb<miuJuw8-bC7*tlDiIbvf4~-u}e9Z(NRrDUELx0+6D&)nsL_ zVAnBh*=8A5W5sk|v$rf)iobY?*;pzdV8Ast>wm{M92Y1RB(kT(h?y^I=m|FuL}wTl zjwKBbdk=Nv<By3Nea`lW_V2NbXNfdpS+u|2gLeEY?8b!-LIrjiTu!<lWmfC=NT`fJ z0;0pj+luBaAd$BmgH-N74;{p+qQw8TSUhVg<Pm-QC<d`ExT}w#C0yRg%?UPwDm?GJ z2`kISu~}k&-6qsg7SxZx-d6LolRp<QX!fVc`86&?)3dnvkEK&67<&Y8z6)Y5K7ydk zqHEnqsG7h<M#Q94{N2Ghlb9m4GeHT~K*|+0)+G1-{KO7(9Uw|zYq3I5FvEe)?L4Ax z(4WS&%)hkk2b7>aTU6eri$%TbB{A~Q!=esENg5X<+On!iq*uqXkt}WR%~zo>J}Epg z3ZZiyji@|azLNYYDjXx3L~(?$2w|9i{=|^KEj|qy;(W19Xp^ni*cw}MTKXB)RJY}C zyO17yBod|gY1)(u1|kC~oe+{{;LZq`e0}+yi-s$=w@b=AXIq3t;-p-n4qk#Gb#D2o zd6g<lg$_Tbyw4Vy%(l;>u2)ut3>_?eLj2XXG!F?^c<o9N=W9)|T*yV~&(sk*Vd{9@ z5cWleWa3Cggdy3|6E(rDMw|xN-$~Rr=D#Zr4TuGqdTTOySwi+bUl;hA`J%mrei4$v z!VyFYpC_n_%8K}Fcvj1ah6@Z#6=w~ZQ83o(s<{^oPI}9Wk_C=dCU3UiYD8wFl;<6Y zH4hm-J|`q|3l;@IW*|_W?44>65r?Z2TouhbGI*#I(@UMUSJ#Xgi97<)oS_Ac-i_aq zOua}f!*@@?vGq2@BDskzKQF`0k1@33a~nr$ng8K}W^btn<<6pG?G1?Sk=DZlhP3lV zdWzW*sfzk#ltO#96bMN%Yd|b!x}f=5+YL9f);nj-Wdhua*>d)F`o!S(yQ!!aR&}YC zY$8<Ok(_$dA!*c<wQ%m`ec&XYiC5#*8b1-+o>WA#OQk}7h;eMEwa#e^<7+16IYoOy zp{JGEYD2s2$!_mfdd}T@)wN~RYBFn$_oYPlN3iCYH0tM}ZFz9kM<z>4R_)!#I$boL zqc5)qvP0R968dDYz8ZPp`UB8Y{xlxy;Yx+CMVRIhZae)ax{kw8ZS=Sw8L8`<bd7G| z6wdQl`pr7txbMG9#M&fe7P9ZObNgRY55Yg7qnn|zozs6Z{zRpZZ-hkVvBf!CjI4qv zria(x9sI+=uLK~!&G~zS5KP>kHToE6utcjJyscZn5KA6<WBNtD=WRVlk4{9Z{^sF% z*>bf0Wb^GA^#aumy-5$P<iMmpQM{tk(F>#5z%n;niJk1WATz25tsQ(Co4TNE_`9ve zby%_yI#j<}MZuXx^DxOJf2PcNqE?Ek#W>}l^-n#+J$q<s3Js#zLc`Q)=A`j3bjHB! zPr4;%8)*(^=nm-<BXa24A@Q<@i38W5L}F#Sdbtc!@Ci$R2_3yy$-NA8#<2pt5S!pM z@3aN<&P&`SJ~GHOjvyB&Vg0FLh<7b>TGxTHHjVvlj076(E7>Q5YNaxpRYh;zSt0%2 z8nS`d{Y_|u55IkszPPGoLwgxTj^2*|Xlsjx(kyzb^k1mf;jb~iTkr~!cuh334Y`gx zoLM$AU<xa~51JUR7=>S5*+gDSJ>X_&`4ZMy1U@N&{3S0f(1I1>=7wj0rGOSCD#@ki z#He@<fRLr!GOKnX8r#wmu0xGJw_b=(^>~=?4>Cni*S(HmXa7~KX+{%t&eF>O(@Ys3 zi;5A1aDCM1JhwnH7~o@z1O_sqi)WJ13^Znj2%V&r{BA+1@VPI4KV@_Jq;W<xqtqU@ z(?lK{>u`INHA}>$C<)WF%nrT$;tQ-&?ItrEO(tj?j$dhWW)#A8Hi^%rq;}TAIlvsH zNcq0t`t<9ldm>p`^ulJ06tzOK>a9$zO_5oIpNXhHspnYsLDp&nmi|I@!;ta#<NkI} znBGO>5!8D^?%1+Zl&b~{`(Yz*&880)hon47UyTKqZg4Ca9v7w>w*w1+AVJrOCmJzE zUzzxZY#m2{KH338$O8JMXE{Yah2g>oR^c)`V`is%E0m<4l;a}rQ^gc!HwbA4tPDp6 zGIqR<Xn|X0BF6}uC|R%MMlNkQ5X4aWJ+LhBbEFsPam8U({TZa>b1$MB0JOSN*ueL) zW(q+hTVOBcO3i8j>DFDqjlxarf~v@wxiEwfHEdcW<Q;qw<Q(r`MRh!SlPxUpj~}c5 z)nf|(zed@A(9i-EOGPBpZ@)^dWg~TPk$y<C4k64qJ&+6G85Ozm5&|{E20hJIVyJS` zHv77ona!)OY$l(x<fId+-)cp<c}yK%=BBR&zw^3saEcz=+s+KcLf9G4JDVK;Wi;i< z>ig;XWcuUR4T_+x`LmwF0%f5*4Mi$NT4^N-nT30S6{Ox-x-3<qMeJk;G)`i>Rzkcf zbcfu;TvArfTdtR|OsNNB8G5OfQq{<vu<)O5_|e1U1c8QP^fzi2Fx!&aVR#u$N?~<P zDHCbI1yoUt{xFIox&vsAD*E$gIkMYpz1(6uCE|<Zv4dS@fK>gAiseSn{VQ_JPUnLx z5l}07;7AFQ=^PRQ;DUx)ScD|7h9gA!IB7aGMyw7O@CYhM$8pX8Ej;J!)d)tmgJHGj z;sGJ7?1;{eZC!AO9`La|33I7u#+7SP`oh@fM`n7T4uWvO?^dnp9|+4!<kK$iQ;P&l z=;apGV@g|s0{C2n08g~0RVXwVF0_H4n&A&FY}cWtbeH_xVK8^9n89BP6){+9!q*3X zTb%(A_n8bOA!&-xQh>Cyjo1kFhE%xxA*d!+O^P}L9SGwTHa2QwDorg(N-#>QDlF58 zLRAu>yWKS>&_|id!Pn{42W+pG-q;ChQ9y`(UxNIocA7&AB^tzal4v|Ti?94nZXGhX z{7Q^=W`}*OgG+j|RvD?DKrcf?D0`?XhKtBAO*CM-Kgev4m^E?94G>Xc0;!tUdU4Ms z!jDT$KYr<EIAW##SsDo|S)-B}IQ5b>3`-MA>QkSb;3#`FYITT<A7v0^IeBzqA7cX4 zW-o^Dx4{B8cTcNlIZs+xRAbmotyc$fr1iNzI|%i*PY7iGskF$i_g6?OO;v>2^H8Qz zvNBbQ03vVcctByOTuKO2L;xZ;FxRO%xKA*l42RSX&-7rP<Q*vA%?%;ZGFYCsqs}HK z7|XGkUYZXTO!YRW3s?K$u8+y1G`%xOHO&`di2sA(M=1K#*+JR*BJE_qrx5v82yy~w z3NKmgP6HNEzCp4(eHpDqtvZVtu0&aCTuIU)3eiv(b-Rlb;c2>*E|vyY8jcEu%&4&` zjmbl4tg1|@*UnU=u_F_+MiX=!cvN&IE66d<;Y4_6wEkwR*}6Zz?XuHtY{Ts=H27wJ zlA0H&rtP0EZ>i|uK>v2K0QKCB`aUygyBU=Gl{o%QqcllwOG$c}*gcy#5xU46wRhCV ze#E9~HW#cJJQ~-m>9z^RX+PPMjyco;e1oK%7!-&)6K>RKU`N#@^j$G_{5WO@4Bzhs z_AN6DwOUZCzI^U=rI&561oKaB9lHckl|H<JYu%TeAfN7qqQkx8FX34qOjE-fTLzpg zsdum`=Lj;NATq&68R!|uWwyIt`FCqxU3rceZA~vKcBh;kC(q0{S)Z^u1gWN#g4Z;C zN7?|s=%<}HqT5|2k7&Z@KR=#9-9Xaozg;t7MCfvk(BFP#?w#wpUG_-^!?_VRl7FEz zu;$~I1)6LKO&CC$Qj?xgvXUKnQ8}oNh_~%y=f-;84232hj<3?c(?b8=w9^}J=8#~A zczo709@+!?>kN$Uz}&IJrm6qbT57vvEvj6ktutEFnYa0Ai?8s0%joi)?yirq<Ei%d zq%B|<a<obQ<p7XY?BaHn7vEsY{xm@p)q*gjmus=p?(d3ol#G1@+<3>=+!*1L#nSew zHiQUe;-=2*%Dv5rYljm~t6%1NLUz8gtetCHHb;)DyxE3e+=h~Gc9pueE+db%pA-JH zof1lBv-feBbS^^FIul}(hj4}|9rDO)hKRQ@7CG>wAOC#3$gA$<C>x;nd4k|})4~F^ z3x(NccXtML(q_DURnY_ahWi|+`226bEqVg^&JfTaKN4a7TmANbNbmo%gfmt&w?leD z+3NC=;<}Lfy&qtb3U}={QqLr%&G|8`K?t4cm(Z)X3KtXA8jB_u<C@F^?lkMsP^Nux z${W*=WUR>>BYYhM(+Koj4AGm;VA{>_Qv-1rg5UsrgxH%3BejvK?alY<$@l7Gv!Tl6 zQa1sCC)R^(hZOZoAiGiV9&4ViX6JCCi)&nO8RsmTqaN-p7SK+0%H|+uqxGnXY%h;J z1sO>^fYcsdNF66C;6o<O0h$B~?+&_oAhNj>ngMdl9<zvFO(K|YM+$e#0?B=on#P>5 zZZoUiSr%-DtpJf}<HR9vCVZkLeY39;Cwy9}Efcpx@Y9A$;mmzexThtP1Z$XPc<Lt5 z@l7PjE>29nr?%e)xy%=~!XZAgpnM&qVS%t@LQMNISIdh=fh{I|`;aDX-5@@K`L@FJ z1gvL-XrX78`HHW{BhDGYW=U6K#pCOTj@X)r-I~fQ3~?L*M?P2P399&2Ae&))TdQaH z0=07hpS2T9oQf>$i<;jqKUh4s!Uzt~4#4M9<JOY6D%*u<YmE7V6arG*wiAN%gVkNn z4qkj8HowyI!udE>SOR8kA2@)ByghJRr4Jl@RJ?Mnwx1La^9A<==wMxhvnd{Cn+NOw zIp%&=lJ%t;19ZsxR{nZE9i(B@sBr|TaC8nTV;*NpC_8jzzf1NBpROx%TYmZhm^RJJ z>)I39Xw+Jxr}cS*ygs{!y0O_M=i2|Z{0z5vxCVN2D?4dH3An{Fqq}PDmXSsdM$5gh z07fFC!9CJ(xn4RoRpjO?>c%q{A@wRhWrMy1T;hGpjO_~oNUOGFP}mBy?H%dFKja-m zcxGx*vCAU1GBRiR4)r7UPmO>us`;h2*#dX7TTE9bsv4R4k-xkp?J`#q;rh1Q9N|Xm z&y^40G!bF4WjkWkxnqkT0fU&&coyu7>V5Ipx{9lpi1)vJ#iV)Q*}!e$K9olWPeavs z(EMJA+(cs_p{jpAs%f7YsHZk~@cQ|JvD%uN<Gz}bKZDh$uJbY4I1WTM)MK2z*rY;N zx3p#Ryj>C)7o=^on++$&+<Bk>Q~(Fq_xVF8ssG8)1mqf1*6Pzp&tSPS5kp$(p9}`! zb(3acpNPDAq&lYbaO79yV@+7F*Sv<QdCy!TlufM|R}H#h3{-aR0z(+J>BPND{g4gF zci?Y>F3N&PadEp(tkzNwF`{f!rlIU_Zr1jdhau%;(TB@KjeDFAPo1piJVwm{y;_Ua zck*0|`d(xI9Xkss6*@uJQ34L7job{-&5nOY$pQY|pvG7$86@+bfO`07gXnSb#yW@a zNxu2SR2Ep@q-5MR9h`;u+OrM8luz<Ez%DwER@+p>QvSOvkQKI}7A4c9V{SVCwVsvj zMZ*uzjCa>4h~6i=bDZQ7!jb#Xjio=BV#e_UsY3WF@lQWcOgBv`svhYMInlRmS>KEv zX#OmBgHp)OaXRXD)DF3J=Pz!q9FMJ^SlE%r_JwMe97~AwBg*(gGevqi8Qt>jGC(72 z0ccA?e1CaMJP0b-pM_x;Rfa1*Ib%6Gx=*U^=uJ`g6Grg9n2cU31=%fUsm9N5!|40b zIlAEU&_@<j(#;+gLoIW!AIin+Nzv8?wgIXUNg0y?ibJ3aSOekVO13~*+D3;MMwNV- z+6^dMiz*T-6d$-c_gDJS)<Dp$YAX=h?U(SIO;hS5d%#|cc&1aki5qf;2ki518-A*| z)e^7f?ZZMpf89XyLPdhy6n*IL06vlm8NNWuqL<bmi3#t6y_DgvfTy^k4iaT`t7(&F zLgARq(9JG61Eck)Q>1%~9;aMi#TsuJHpxl`6|hgj3--|@ZzzFhKSl}G`{dWk+>|R< zDH}c{6LavD0UkbTG7BrKrBEsqw{pt3el|4vSv~ZHc4L1zfLETHHCb)*XUGntjIR~F z8eEZdUTDt6DFC<zA_NsxmSuU)ggRb@v{kspciVM~XyqRS<Y&JRcq%X(pnoYCc&eJJ zVIwmAqJ<5)jUBs+8rfhQcpM*I2*_o$|I}D3zm>5h*h-N-jNh=nz^TzHB=a;d;EYSZ zTK#gny1$N>>#jn-aMfJpRaiy3+vw41BMkQrPTj+iD0i)W3fW{bN(U=;#y<(af(u6C zm5aNnoMi*vs*&=lp8}a1@RO8hPkdn-U6-O~M`c>YV<BsMdUl#S51|%$5HO<)Bj4T5 zrgmX2+QgJ5tHK-3$88W1*fYJ?dy^x_1zM}>U-4V}Wg4C*nguWwJ&bPu*sjjZqLAXg z%<}x(Y2QWWQRMvjelzpjVp);5Gg2p7^~*_@310S687u})-1=tk0%EJbgSG%|T5z<# z#_wK@6fBmDJ2&E6nAyI3@tMuKJX^mXLwE2tndMeY+=-w#()>5hQ;Imrt(+7$ti-AA zZ(Qr>a6IB{90;)ip+Oa;-v|9LTwG{X7U;-1isJIGVzOzZGBGcRgr$B~;qwIt15G(8 zFIXLW2DGPl=UF_I8p%_5k9j3CN~7Rv3M)!Wqnftm2tVzC!kCa;P^(6{VboiZMtUWB z=sZ0=S!g0lp}Oq-yBC4ZAB9i+BZqk_W~glvQ7^lsTSh5YN2au{{YO&SdC*4C<;%>Q z%r@vPjjX_GU1JB`7@kh%mBQ!pjyu@cV3<~z(O|REALM@8&`ukoj?#N8T@yw%>gVBn z_~FtAqIjsNKt-c|Puy_nELqqt&|F}|OiY9D$IH^^r3eF;B3%eyF#jqie+S$>VSN9m zApBnqzA65pocx#SLBzq>SlZUc+{xDAKkCX1B~8USK6IY7*(9Am4i5kg(0ouy3V*Zk zae4{7`eG)S@$2S%C=h|({Lnw2@LvF4h5)ARI;PII^RljPw1>6)Sx95j=jxS>D~HLE z73t1*PEIiTNT9xH86VCf43;$qmq2|-O{Pe#6{RN0BzVcfoRvb9pN3*KH*DNRj)p`} z7S@u*E+G7XW~<*cPz?99@>Ru)f=DchXXykrLo9D8YDZBva7_7g#(4Du<B$l<&Ws>) zDTyEkAwvj!{shccwiYY^1YNiM${WP+x6<WAV+3Lh6P+{vC85!r97Ro+j8_FjnFbum zd4=`j!cvn_dg~^UQVG-5nLhZ;IdGrMoZs3u-KtiSOsruFHh8aw$Adov(~26!gKEuF zJiVmR5VQ=B%W%*sg`qDhidoM+E~hGMEnO=2(M!i=QJD_vOi5|XdicQ#Kb*+ykec!z znlN%3Tbk*VhESn5j#4ph9VK?Sd*3-SIfN-D(U|Uy+#E&}&3sVYG53|p4(cBQ0PZ+n zAc*J>w6dxCk8xJGG5Z*Ks*f&Et((~rnUN$h56h(JkY58LYH@aPmy?Qh5-P5VEQ0M$ zE{lN$!=8Q9f=_?WsMcrqJ8{p8m$f!@cH17j>vOHqwGbKlDGLota`Q)o#MFz)%a~R7 zYXUJst%0>IUVqmUox%brRu9Zfn1cslXKrFqe{yG=F2k6dm;w>E13Be}n~-+RdE7yP zY-qhBwW@l0z}X+{2R8DLyIFUYBykcpU-}P%WB;{N$LhA%a`ww>_Tw*&=>|<Twsy06 zhcAJnF@|wNaaMP5{^d&XHC=(5kFs&fxyfh_nGT6_L&hv?SQ>g-CD&q6h)H<zq=A`w zV|siH3W$1}qaZNV!1U-UC{6#ZyaJ_k@KKUla8n#qnw<uLFQASeT6GoO+41(%3ziP= z>m8Om3GD0NV?TS`X8iu|nabFIZMpp4#>oF9=NSr;W=QhL8Jhh;X*R8FlAtW$w2_5o zZRDT$tw_%4?Tv<HO!~Zwr-XEOq$B%G;+8DphN)SkhC~HeWr(FJ@=(J3f&RjBP9&eG zmB{_Cam%?IC%X(!8;+YC!7Wd2FN25Nu!Y>%RMk;5sqDlOeY+}$>V-GAy`q4WEw}T{ zC)aTRot~3t6eXV*mn(l58jA9wmza`zVsbw$PqE<XpMIE!QE;3DA)Q1ca6DdbFndaL z)8#s9bRa5Nr{f)Pp+)dEca8I(d*~m0V&)=$p6SQR-sFFmK~M^LPTCJ|HPXk!KNd4? zDKUsX#i?096Z#}!8T^7D$3=iI!w(jT=5w^VD&ohUh)FLU5wow(UD`>+&dqORmyV~= z)Yrm5XyH#e<cMxBE9}XG=O8W#n1>K+Vh55}KII5zmln2r!t?%|FY-aXxceX~lWF>r zulPtkjc6>h;a5wvcuz(~$+lpK&L6=(Jpct^P|2UZDj}87yUh(VibdhPcPJ3-(#Ze) zxr$Eha3AWATonDJuzr+pxuaw>Swbl6+(^1&QK5-^#E%K%?n~Dl_1K>$N*rXH3;Fkr zSU0|0uh^itIRKq>Bam-#7<fj&MlsAn-c>HTztP;@wKqprt%8ujW3>JqO;$pjrX-?m z)H|8;p=2z_?KQQ;Sj(8^j54?ni7fwqGgx7@AweviF^{J8Ohva+5wELu!ug}hB$JhF zi47`4drrLKxYHu_^Hdzo=+%PNOFP2UjwN`mAe78#GV@g_x=?}bj6i{6e=9;%Kvk?E zM%P9K6tUmsgd@dMoRUt=IaJ4<7b|@NG>ew^?X~0vJifBke7+FraJ=yR<;1SyI{w9O z$B`n&=WBBkm7y+9uT#B2tGf}RE`n(Xj~yYC0hPWEzAYg9DaQ<D%#XdYD#3~oK(@C$ zTVsuWPj9<)?Dw`D#c<a=OifRvLW5Uq0)A%!<0CZ#28zcwT#5pW0@<kpjHhr-+ZpBi z?{GqmR%pBW4ky<CIwv6e2gs5Bh8$y~|2^PzsA_s*siJ6$Ch^2kYc?VU7mFj2*(0hq z?zILY@5jXTi%acEYEVGfqycJ}8&RT7jm!r_fe$Y2D4rY~p$-(f;j^26A|qx?yZ_+D zeR12(x)xA3Wv(^yJpb$S5|Wpa$Mkkyx3p?`#q|2-d)fJOoBor!+O+k_PIi%8&D~Rj ziF#o)Rb(nAC3BWhurRh^yd8*O+DSM=+0$v^?=c2OTW$djC=1Yo!%eMvMRyX)w;kkc zX(c2G)QLEa;h9F}+W;q6N264d^eafO>O%QKRb*MCO#>8mh<l}4jk4|#C_u46CYyB8 zo*;rA^K?frkI%Y|C4~n3d@Znv9teEYnFh$`gyl~K5S%S~v%mGa5*rzahG76oXPgSJ zrPTe1ULz4^Z`*YY-~8Buu+4m>UeO;$=2>5#Yvi7*>xjh~qlC6<u8`mvk@H0(9Yv;q zK>i5Nky=3?+0}XHLP^?D8QHZY&O%Ebace;MlR;JlAnkm0S*7RatX_$_wjLEv)gqAh zz_fgHKuEj^OY+<i2*A+t;u0;siJ4f<W+vzoz6KZ3tkDr;VO9Zlm$-u2&&4)YX@wob z4Wt9{E)Ov}4^R=rLBx|{x>;qJ5_Sm2n#X}QX})IH%{_a>4`bPD_{;C3W}+N+kD*=l z^xC_eaE#koT5=81`Yv?<s6$jSv;jA&V&%w;a>2E{DnQjQ>2!Iuc>iAM$IxP|X<TE% z(XU0Mg1dEugHZgaz5RgsKlc}A+e#sovUU9`LYv;@k%bz(e}4K6Q+7jU#!yjA*P$aX zpB#KqtkJ6#1hS1gTtnwr?c#Hz^@C?3yKz5GUN=u-i;cj07pOo83ou$g;ygC!(N;~g zCT_TNeH<6{ava#|Bt|21(@dNFRdMmE%)JGmAn9vSvWy+2XSR_#;=Wq-27@+MIjvP< z7BbjiU336_q!o|8X#_F=>LaL-<g-}_wEOzPO=mYH*wqae(`P-v7EWp+IP=v{n^R4K zCMkvy8%s5n9f8<Nds-yT>CH{Rl!)>ygC6<k(rX>PE!&<wpcEZBDy~u@IULc_m7IA} zob9Cf;dUSkiJa*{qO4BSHI*kjzW;Kf$u|PX6)miXu#_C&92$9QYJYafU{QC+Sx=)D zQ<2d9DLbbuxUtu+63aJ#&_Z95q<jH?>rMqt+z-C-qOim>T;$yZBG`kXr32qqRGRd- z(CIOC178JrCYAR^IMQ3WnXGr49;DoG{M<4Yxd(L$q>o11UlQ$mj^qAubYonbJ+WM> zqvq_8?D*`2t~;<KaJ_d1)V5?PdlY#dQBf1%6=2J8#>%iXYEHNXxtsR<$Vpp9$=3rk zrL4{Rhh8U%zbo(xG9TB>l?L>%_#_d2@0E9}Z$F9R?l~f3;%?gf=KDvgM%>j?M3d*B zS&k0Ny$_UkrR_l1*0S7nkO-{jl)#%ic+?yJcKQj;RVEGoF;nFXn#Or*@|z*<RsLG5 zM2Zx5yo)wTt0U{aQJLg5Szlu)(5}M6A*nfoYzvv~fiJ<M8#~V|)_YEypz6S_YM75C zZ9ZKXq6k7AOMQy1L(4gFraop7usQ&%m29;6O9FDTQm{B9ZLwD0)uj=AN(Q~sSkkR| zHu9{Zpv9y&szj;_Z$-xBD4jIfC~@Mh3B_Vz6q#aPI~mD{bGbSyzGPws?K#>lXht5s zK=IKzPL!t`TKm$VEzvFKFW&WohRKxsJvaybkss1#Nv0w1&fBz|=j^{)_gt%k%rwH6 z<uNyVGu_OU`aijjk(+}9gzu4WE=NftV}cdBLyI#Rlv&RXugXnKKY7>%EL+t5U9+HR zHr=s8Nv7nQ5~<ha4vOJKU*4mm9uT6QE!1v@>ZYfDcRK|5dU3b`xWE7Q!n>l}h3<2y z;1w&I<U&WJj^gPvE-Nx~>NIeQ71^-0xwZ?9y+@Sye_Ps?Z5P?`Ow+YQenw7Ley-yq zcRP&hg(n#nBo>PUcF>jG)j;U^*?Uehty2$wsM1;7uq)UudrLcFmUpJYJ=7u}j5<c5 z993%W{@dJVQ4v0wjVwfR%-=0;@is-$=$-Z!KckNJ-ZD_fer0#MYvZTx5HOklhVrE= zwWQu8Q)9FZZQ~hM|KrH%GVcY#8m`ad><9ngVhw8}X_nWB!^T&dRj?c01@@^2)E$(Y zKg+Z;+?}wOPjg!c9qD_!4~ab11KDYA0|bc%nk<OOSJ?G{**2Y-mJl;0`R)KH^H#6x zZicW|RR|t+ZYLE&1Q?opU440C-nC=}2u?-&{(DxD9C_;P0@=cz>L%%Psxj4eM7zp1 z&%T#epd&07j$81E78hI{-mYjM&feA-a<o73k?ufr#w9~5b)Nitprb!Cw{9VSdoOz0 z^Z8*wcFtD8&NyLaLDK*zbS##KCiQM%enE&XvB2%)n2<Mf0=VcI63mPp_l%mu@-e5? zy`7j2(abQUP8GkqY5S;hZ0Xf)mjA#P4cXc-L-o|l^WPxH<tc7#yIV#+R~`47jTZXw zeCDO@hy(|eSar3@1!*=_f_KQOmbi`Gr1)NqXP)YP^w%4JA}Hjh)4VQlyd&ixL(ilF zrf)CCSCq;g_Ew%Yk^vOa7xrIJosXrCy02%f>m;W~-G9}hS}cULZNGl}U_ttCz3=}! zV(>p%c4C~S9g;Ho(9;^~5SwoL44eBkzv+C`w~$Bth80%F?%Ox~^tk-QfM{)lWJUOF z`QFHO#mXfu$vU2Ssn8tDEN4fB2ogDmPZ%B)<!Un9uqHQZ7nHxkR1paDp(ogC@@4Yr zD{Jd1<Emu$8AcsBs_EG*Nyj6;zvA#2tvM|;4NRro^-IH_+`IkA&ycBKnJAmqQXK=N z;Ny`C|MJM+fX~8|Jr?zYTXa+(<2=}H%cAgsAoDKV>&HFH6z|ltkX%;L(rk7u^Ak43 z8A6DbRP$Uk8m=5(pKms(_Ky%SZ)>Tte#W06japiRI@uq)JmZua2ExaQfhrnCDvhA% ztqq{S^!Zi;_%7;v>PN~R9yrrx{CZq`-q={%X8s8<Fj9C^wSOx_Y+(52w>D`*@9U^h z3z@R(=`F=L((Xz>MwD=sVjt_^kt`qKb}{Xd)IK?;HT(Z;(TtM2C+2MG%V|s4`QxNl z(fkSb3N^1_3RV@^*VnP?d&#EW<HV=Ded-*3CXQ{<s=im5QqVypxGnCtXK^)-S3SuZ z?rR;JwX^gpBcKHN+W;lT>EfNB4r&1<(^qQ!*N3a{s%sXf3*)kQ;wINuSu{gdcUi!d zi>4fY?Jr+NB!9>znSBHAMikaVs_M$j8z(y3EcR4I9Q(V84XO}v<)U#FW1^J*fI(*B zdo4@c?{2<ljOk^}>=XZ;A|0ZZDW=GqM?>zETzm(#sXFM3&VdM3j%O3dUg&#jcpAeM zPQ!bH{xX>hvPVNv9mwauZ|~H=q!T-PP<>_{z<@29_&jw5pC@z*yx*tF<4=H{7&u9P zsp^uAt+1)Jv}<NIP~c8dt@33htR9Wyuos(Ft9siu`qJoY{w_~UkUg8u4Qbe15=;$3 zwqW_atckE$H<bxi9}4pcFucUv34IQOO~QfHiUNoJ!?uD;6X8vSD&g`85&2`Jb24{j z<`VlnS#l7h`DdhgTzxt6#oc*aBGL#gHCnt55kO`ws^)JiF|6WTW)T!;?{{;bjwj}> z%+#jI@-@AY%&m%9gKv_zrpgu$nYc}Au@0;luE-kv)`$#4v6P<JsIW$>ozYAj0TJJ0 zJ<sm^*MHRDgbJNPxg%)RfPZTDxeN?n|0pQqA>6r8^Crgl<(^i1ji#bcWS{h`?wJhN zfttxUNx@woj)iDv7ior#{O``=t}J0|w13B?1D)_?(=LDp8(gLhx|cW1Yas+Yn0r5M zen-le@D=s3FJ*b2-Wl!%O-I|6N91ka4(8(7pq>cqye$w+8LH8+8DNgVdO5qWp?3Pp zM+^J?d!>{~GDpH_iyQiG*GVgk<lp@5GEA+$(C<SHNMj6E1l_R?<0g^*GIfva`?8pB z{@g0He0R!ewPbUa6iti90$hJGDec*g{bsM(-w>=J#uU%%-|qftZ0g>3Qe(#5=`E!Q zxLu)34@r_2xm}4~SJr{ZyWQp*orL=q=8q1)xrNu3TpMwEJx|AG$#k(sCRh$ZCqDn! zQpbpyJk49_3TbH==&9^q*W!p3>~Bw0bhKB(0krd^UP>gP>|zP2+*gXPaaeNtX5ZT$ zT=LGVH-;77@oXyB_3Jd;b5L4hQXa1aI&M1o4BCsqvUph~hto~v)V%c6&W1ZM7>yN| zmp(7y6W#vma2$6zJS`L?Pr+5ad!*P6jMKO-E+j*vr7&$OF2J*JC4NAsg#Q&nXKmU@ zi^EShd6bPtvQUYez&x2_6!wh5zka-`z9cIo(Uo1RpDUN|ns?!)n4C1Ne1mAdg0v#X zThc8K0?NZ|%=x>u2)G&;!4~U?F^7rV+ec}Rl5)8f=@l3Sv7aKsQI5ttyfihk@l)%> zWqR=rsTEdvp(f+Ee9jPGPJjl&1C_}Mmr_*AxtcdDLfr>O!u(`j#T|;eC=ui+fJ+31 z2ss*NWwOe-9;CH(RnW&;7MXKPjB-CAe9^r&N`y1yd7WJq5=O7Sy-->C?*dZ}0onzz z2-j||awT6GwE$PCF@0*-4CJZ-v%#Wrni>zv+t;ZtGU)+Ko+B@-0hj4%5KK1Q%+|l) zrYV(O8sWR8Q~url{Aa1`KaE-yj2)e=oc^QZ=^Qm7(NB*YBwP49uYuD!X?HMVvX^k& zMhLz~S-#r1+jtd12EZJ|dV>M-)EU@pm$%*f>)O~0_@S_s#n15$2bSY$@9YAn8`%($ z@oJVTv5~U4D1c>Sls88;qizh)gB}Unx>d6Gj@L<|l8-%Oh`6<&KvfBStS)Qbh2E)| zpG~KCd;4{VP5?mgDra~$q2K~+oPXtF6ilWDW&1Lf3<On3&Y-p{?MKuBAP?IUqrS$; zZLKsz9Z&GdW$t!UO)gn)p6Ig;T+y{x1DHuAJi+`&s1~zM7`jQ#m(#G82_t=hLqdMS z<?*86=cH`=+%mqk1E&UWzuiDAyWsqLfPF|ZBL4NgBqsS^mwx^axB5TPTRUdMc1;O= z(2>#J@0n;B6zvZ@0-`H?k~t8B%TL09GV#PCjkI7x(a#_KFk~)PL*nUho{ee!_Ni5* zxzei*mKw)m1wEt0U`{}d&PM)FO4Bv~FzvCJMx3J57*d>!r<*J8BlnNYy@!<|?Z3mK z_7T0Xyj0V8)8nG|j(+2J0jf4dKtBh4c6+So;NO1{!-+=Q^M!TXGY-cy57h}oWV=U@ zVQ`X@3dIa!V4|s^^2Z>%#Q}}XEeE5EN&T76?~aP(JACKmi-h2I@h5zjL>AtDGnG#m z{0X|3f*uO|aoyZ0e%CMV4?5ZgLMF#8r$b^M=L<tj5y6XroJc6Q$!m`(3?kgeO^iDE zXWw)9$E>`Fp8YP&?3Mov^WCv(14Rs>Jh`Nyk{oqnfWg2|i3C&e-&4i7agde2SnZrL zh??ah(uFqFz$b8a)wuhSu<<Zu8APHxgvi6P2uVT1^mNy=lz1J&@=4{RIY+Izf1ENf ziqHe4?ma}?6HdN4-dq_XPjBk8&qi<aoq{9XA#s39z%R#wfDD8rNDai>bL3(x#|m)f zMk;e=LVSDlHd_e^u;46t>o(gllYPXwMkZi3k%BN8gjno=_C%Te%JQf!f|AMim$5+F zv9y(b3KQUIPaHMVXy-uKMAg`7(cx|X_-*zZ)}+@l16Z<WAOg5Ugy$Dpw&&vzZ^EL_ zr@pYoCm4_G$twprT$PnF+d&mo*@nl`sm4U9D%E6j#fdEd?RK%4p>3_Ry1B@7_BP?k zw4{~B^RPH2<HiVLl4earn$~5J%TmKq|5P)O(p!?n#F0Z$7%yoC{fc%~Rm+h6sP9(f zs|cv{_PEw-Pl2^fA^rApRpl<C^revn0<~Vb1Ll@7Ju6vn!i5(rp(4#x`^bi*%GX_e z%mb=5hv;g{uI}rtWg@cY#j|CiU}p8mwR5^PStYow1B>fG_sat1vpAws3mbjQRvE12 z;c9Yg+^jSbv#RNUSI$q3h1R2xvwb6mD};8euj=&xr70xN5`r8w>a1kni7qXb&ii$| z_O$qE?l8*g^B2z8pQ!m;@tJkyah&4>>*J6}?^-re5~$dASv^sNSYLz_uB4Z%JoqM< zjCNDJ<FzM9KOSFihlj<A?uQeYwaeb%e`UgvnL7sUZ%yIN_xa~c_)p4R1!E@_eXIXe z?nWwEeh+_;dD3PJ>2y%!+>4jPXi$K{iW7o|1yd+?<%|K*IokRu%qRH}{#_D77+j+f zd#1h#dmF?qAeNTDiQCwYGCe0ZJ3emi&e(o9y7ka2WMs?*s=Hb>jY^BU1{zzmt*^{Q zMnDcuyOw7ir{<&uuTJ(b&~Z@;KpQ^P+8k>Ht?dd;7g_7CC1to9Yoe$M^g;vc<W|=s z`Z)=<FTp`q3K$>LBu2Xpur%{r%+NzO<|`tY$^px0SYMTQQP>z2d(=dp0tp()|Ls*b z0XKH^6u-}<i=w?}a^euporKq>#=<3p1^p0r$|DmgBLM7kX|j7IFF|*Vj|j4=wx4G` zlX<l?T5{%&Hdsrhny)5&%XUvv!t}*&e)Xm1ES-Vs&Y58op&NpqHKf`PR>#r2)*Fw} z7f00-mntvC9u=YpZ&2*7K9i~!L_vr9wy9tCbG~0yQQ9yWeF`?2vLlINx)wvQexE&@ zx#ELLjPyx?#*9%|RDq%tb->JHcCle1cACxBLF1dedxe)3GN#~eg|%{;s^jSs21u-o ze=A+KGPmAw$x9kcz!*qs=($SxSaQGMIGLFX9>e;%-5<(Kw@p*CecBU4u`iky;TrYz zWF~>UevA1Qma<-w6#5s*CXeomrCM~sQZt05Oc^A;H+*!eP(ejkt+d4vnz{W(*AI>d zUY%O4wsE$g{vb((Ux^B4VkkoJpnc993HM|u1>h5O!YbxPGifti+$(&iL^R0Ud8YkP zq&0^;JU=SkP8gt><L3gCy81a1KES|!@08~2p^+nN<*oYkVhiXn`$WZlB+Pb4!dXiU z2E@&ytrI2~sS$#yGrL6H`*iw+E`kX1lH<pewGGccIm7YDlwp$s%irB6nUQQoNt!!Q z4DV&SS}Fd8WiRwMgf1{y<$z?tnPCA}VC%sBNiijV424Ve92Eq+s36Tjfm{u~*d&oI z`SS=!pO}&{<trl5g*%p17DSc=&V2oPGP4i~f|!Uwf&9+UjaI+w-->uKOiAk>-!XOe zUk6A3jD`P-tN&ma1uAQfNXE!t-f8)1R!wLEKXVEiSS_kR;13kYk;z$7S;ZuBvXiW9 zt<hN9^y|WZ(j7mmULS_fq2W!>B*kLTF-1*2Uv}-ZMG<A%x~@p2S^KY^T)J{4Z@pwV zc1~3J`o7`(A$ktf*FBkztv6A!8lxxyR4k{O=hKxuw&#ZHt!1iWZ=fRRo0TCWYm4jF zkLN08SD*_nNgqVTEsi_sG%yP<T~bK4QVJLy52L9p<mQzv{#1=5uqbf}%K3ekLh-k? z5>*RNqhx<siz#D)@{wIoiX!>pTPO1?4HC|{DLRb$AWefk#o2Hg#gHUJvsIjN4{4&@ z#nv|!ai#}<a(_~HQl<d?k*zubGr0zM1cb9j5fH%|YSM<TkxWy!KQ~VQ$PD6J#K4Z> zd5zsvmn_E)klhdM5#f}EcF7CITA!MBP+(&A^e1?L4oxv-f5cnKN+!r*`T3KMUI^@^ z6^;TzzFo}OsLDb~lqXVgUjA`;bh)%(xllL-9lKQY?*1<`XOo%St;ku))~0_1LPTRO zs3A0$x29t2Xw3vANg}>$(0QQ|_We98L%(X`=qX2CajU#(@iez<lHsz3xb)G>X`JEs zj6dXsvW^Z6@%k-iYPTi(V2oNhhV0@%Vyr#T9%5)_K66<Ujxbqw8`#+#lT)NVe#9uv z%Mk@Pkvt?>=xT+EP<lLr-yGtkVc0G$`5^KWg<+~Kq+14haUm??yax!hw{&{=aGd<w z_*#-lIs8pvlgZ#3&QZd=5ZI}rb`ilI;pQ&3wnLd*&SAnwf{aG0wD;m69i7H$tqKWg zheyO7q~P1(xuXk{p#BU*c(9Sy)39e+%z_Z3h<wE%Hdm9^qEm!{ajAyf7`G3?)$B({ z3-V;Da>H)2e+X8f^GNw*3Pzubs?urjM%u>P8}dFPBqB00hRZxoxLOiJczPg8xeWz; z7D<(+t%O=X4VcNaU}AcC)dwe-7qGopn#AB5D*xYTR=W0Ste{(E`Y~6I>LZQ{S8^OL zB4wpyl-JIJ;ul1B>j62dAwoU*Dp}6j)SOAq0+NN)Jy<u6)O{bFoGP4(kBP?i3S^rJ za${eb1L+~kVl?K?kO}F-BUCddO{9-~9tl~fU3|y)%)A>~?>x{{lGyF7pQ&4U8MK%f zkvCP-EbUPna6Mn#D=u;QX_=FP#82*V5I)YqlJ_2n5lFk9Y1#7G@|d_UV8DG?ZYPpU zb8q)H_Rhv$d{-Np$U1}BmV&Fug1$$@0Qz%J>A7JR!@g*{ZT(`76{PF&SO-p}mun{S zxp$P;f;|en$^p;xU7iPF;19QKS=G3zFC_6HvvHVcuc(vQlo>n%?(UfxJpA#vjyl8p z^bp#2pqJ6j<0&)UzRZppXDzosQ4E|@+<(xu1(|EXVl#*5NP-c1g70xfcOil>kqAQA zuRiCDz#?=E&M+Q-1v;L~g8LE(1k18}$tHX$K~0I%4vWLuZc8Wgo-Wvl+(x2TFfiiK zJEV(TlCTOW1<sxHgn-f;{JqoHf<<IHHB}B_l?a9Z@fQvV{f>obq%5*p6leid>rOe@ zj7`AM_Nhc{%2a9h%*_;LWJpcx*ayTJXBF)J3J+`~mi_9&Dv6Akdw3InSSLZRd0HyL z+n3GDmnXB!?bb!nmhnktWl&RgyMpXmBull+(K7Ou1uU~bzFnokd<ud#O%VjpCczD; zrmyvT>V<K4L;RW9UwCO-q|O3@#xmB`=lt=76}nC2n$+!$$u;BZ+~xkpw);N!`M7oU z1JCjK>)&bFCd288?^|Pw|Nl#4`@iT8?SGUg%9>V4Cn%X);;X?b7k#|Vv!(tLW(yL< z6bg7L%hW&+jmSdBrMY64<xGFjJWUwUP)n`3GH)VGy+UnoNE!{(+mhFj#M(gw@Fj<7 zo8+<st?<ors0(P85SK4X?;~&;*Lat|IJRECJB_}dhVH78PhsW9unVgYWHq<JKn>Bk zTX{Z#70(AxC$E<1Dg<BKTyT$uTkYZ8XBMt@VlEXg6p$R`QKq11;x`~y*%a~nNikD0 ziY|V}KZS7pT-jrfv<-gyt+VDYKv;!_AWu&7>m+w0U9pQ3jhql)9H`MK?Zrr3*N^Fo z_Ba<fA`QfQilLUQiGNxHh1C+raQ}9+YZssW5OZx#3Qx&5gC0364iM8m%f|MKjO~Mv z*&Y!OPY@%xVoj<<I_Flfrk1{AMJ^^$|Fz@vUN|3-OmO}d!b5!f4m2Cvn7sX1S#%~w zEQlo5)N#wt2A5SYY-4U6fH|1h2sID;|FCur(Sn4@wyrw1ZQHhO+qPN9wr$(CZQEuY zo9}e@==NIO_YU65d5-drKlc|qc7#MQb#TU}Ad}%(<vQUfRic8CPX6sJ&%wLSVERk+ zW2e3Dft|C7*j(6%Agaf4|1rdl5S0OnZM{u*(7`1zu^Gj^dxXdjQ21{E-II`UwmCmj zM0h&A5YGdTcc(O76JF#_lWA3l7P4;Fj*dkBVY7*g5iB+#Erky56vkoI%C0_A2W<i^ zn<%mI0QTD?kMR6c5AFWa1r!4iU1P3sShk%))|(j86775gDsQ*8F&y844H^q!irt3E zOf`U+Sy+cX3hmld#V?&v%5m4L;<wZOF0GM!-U<zRNu;Qg)fa&xyN|$P9!EkV|KM}) zBh$Lee97bpw@qghk3rbm6|ViB>?AD2<DY-33RyanUWi#hcDJOpO|om8=as<pOg?Ff z^J-!4*OY*XeKVg9*c@I2MoL7TS~#RB_awVYlwJ=QLfB@JQUC*1ZL#`f5#6MEPc)*M z;?e^2x$~vE;%}C<OSFcY!e-(+df5$8?&CK@r=U;TGGMnz4U=4?-tb;?6X83wp^MS^ z#fszxYa(GoicYFeDsKU4z4&Iq3=OQd2}l>v4_H{~ihu=b=mEsdJBULVq=$CGe~4UK z|2v}@BxpjxXbUAh-xbS9>~LplzWV61W%MLiGp;-87)!(+#{9xO#U4|pQUj^NMq|rh zsZ#mLEHXsC@?2A=wzv75cw*$`mPw5QwRYU@Ej71qV8E7n6xlJ)Y6zVf&Sow!v`Ien z;B19C%e;P096#)Nu>^f9y=;boqnnHv(SmFfBbQJh(6ag535%EZ@TMq9;e6HtKZe#E zTI*dVZ$aY)8GAqGfP05oQkGXPX+X|N{51H*x>z=XUKB5~ptYKjkeQ4WN*z=%r&8E3 z4Kb{E!1vuCv4#9s@UbyZBY43JLUgs6yNMJeJ!z^Pdm8vkZVWT8BZ8=;F;Rhn4px(r zubF{ClO2R8VtURym}s8^*3C!jIXfU0mh-9nu~k%A$C&MDX>LG4M(=E~eW8_8z|prF z+mM$(tu>4vql3(2W(e3}Fa&ckC;E;^Tw85r29r~guAnO;%U(Wy1zpNYI*x$O4sP<j z)QaG1dbrhagZw7e^k533f2^PCi{wW*O~EZ?IccP96<zv#8n1xjZF=~<3Aq<`&K+}o z0_ShvIi<~jxy?rK9F3F7c<<ji2K{bBUiU2?n1Pzh!qSFcRs)ou8MYmU_-`<}Ya!3Q z$k*%3Dki#&HHq@ySyU2&K{HnU+-|84GC%WG*Y90Knrng2ViE?-Uq=$;UolH=NA%Ra zTy@~Ec1YVnsxm$UR6{xC3{EePAe6YNMYFuhN9b%OfTaq0v52i@bE#RE+7<~>p^J~3 zYC%lhgR0EegOrXMomzab41}{&5$WZyEa5MSugs3NaO>aK%se%oRv34rLt2)S0c?0C zpfwL+cdJd31r8hesS_|WIPgig6Rhc`i7^aA0+RSTp)JfOFv1)Se_tC8N(66Tm#<E+ zOG0#jK6!|fI#w1vRmX;oHvqEOg;6}BN%BJy#a70u>ASq}oMCdMbT={o+L(p9_l1dS zO75t?;7o~#{(++7UUFrIDq--^Ny~r%5+N+xR3O-1K3#%dPo)ZeG^hm(LaOW0MS&%b z4-uWe%?MaKR3Jg(ve$t<1o5B4v&#u*^m2`!l#0Uo&eu0_^S&G)9eL<?vj1?u-fVd2 zFL=5!O?#a%70E}nH4?#)(P8smsPRC=^Q;#<6VxGM7M(dX*uD*^l0eNBO}ZWHelTMJ zNP=w>M&CeQ<XZi^?Yq45@UAS{^;0Fi>P#grbqyGBkP{p_{Dcf<mR1?*(_})$%bFrP z$?&D^`2;`+T*?q`LVCRsV!Xb}#hL}Bp7a>Mo<hy<=*hZ~GL+!~R@H|HUH)wLbX`G4 ztSY~xbTYH1{21kH!;~muwg!q7SE*S1gf8XlQfW~XUibOvlO%rpw2*j(Aa}b+5J3dB zI7yRsI2l`<=hA2ZI}_WM(HJ5sBgH5v3R%?D<YZq*_at@NqMwlZK5q!&&~KW!d2K-- z*Twg%P%bOiGlqykai(Do7KZH1wx#H=Wz+A^ihv@H5vx`dA3-m;|KJ*~``=>mKMh5* z|GK=M;6FHx6r62r%xz5n9c%>s18m5_akCal>w+bQz~bartt#N>hC%=f;q*&U!YG@( zpsiDaEEE?1Pq4Agq|z%B58LL!YC4m><-ywH?eqOx4@MJ;uxX85m=UA-Xt7nlqS*vv zyxI^g-99z05A9FPqM`Df@`2nMJKH|8rbwuMqrAMca+!l9CrPQoJk>-a11)vKIha_g zelPT*RFM>(@(NEmC`SrD<3q~iIHwMETChpRa--xB-D;eINGAW2+Ze^)${rdUBedag z?|D>o0^q2Z6m)^LO&tX8)2ISSFDUIN&8j{)Y9%LB_>jPEqIP>?k!3i+yMUs#AGqP% z)L#~BRqfUWKFB*aZ^<59wbZIW5X51-La`Woo}h@%3N*wX%&cwAgrb=)vX3@QCa6}m z@~9Y`WK}1uN$;F>7n<IvF;ypgUz%`@>ges9Q0V|Cxc6<445%LB#WT@56$^uMg_0RY z7{#enE92@bqt8VaIlW2Wd4*Kp%@7a{mStpeb`Fx8->lwDT~C|iIY9~JzDtG_Jcv0_ z*>rvKu*2e(%_qHuy32q=r&ZR%g2{mj&xF4A7lxHCEF@KS7L7Mw|Hd{ylGNsr5sEwI zA&axkC!X^#eaMTRlu4#ihOp5@r44TZ>Z`vD+wLN1bSRc0eXyxy{s)0N4v(+r<*i2x zyEtsnwH`(PDmjQrksc|(k(S==H_i)C5N9eyAPDu}Ye$oM(-s~RWR%KQUMFv4&=^RN zF62qT-$U;rtagO7e2{7Wb?Q1`h-L;_0#2Phh+g<f0@AZvp8Eqgh_nhet9;o5wQN72 z2Hwfb!s=vs$PaWRf-}%a6ZL-JMjVq%@DJPw3!4TKq>dHEtNbV2K=q2K#3JFAzi)(S zOng3wU)MsoYdvYUhFHKENn9D0vly<)m+K&C2hlk#_7LG4uOfSZjv@XS6yP&2YtBSM zk^gm}O*~B;<LE~RfSfkzGZc<1TR4T-r`RWm!MeG<5QF<KxUv5OH}w8B?!R!I4+HcA zHy-~h-1v{s@Lz}Pf2SK-7)`1Gp?D7fz!G82(!_acauY0T&5&a@tCt47kZ-0BQK-eV zJh=ryap-gCqNbiVOZFd<PFS~|9TO%3$v{mDTh}f$J@-EeBN;j0U&oriL~qaqU2kXO z3X4;y7ih}ci`3HdNNHEwtIsM3&<3*c{4UeWC|;qel;H7$n;m4x$;R9lMmN|cg#z;~ z(j64VEkqa!($f`YZ73&z5m3;Zr+*?FEWDRznJ4IA*~+2f0RASUKTWqbJBZ}v9%I>R z)R}2&Wm#>Z5z7}TQEVEpt?fv;=oRz38Idnc_OC`Fitx{=CY&8v5;1VhEn3J190Z2K zfY`HmJ?&2_`RBF7RSlL#QiqPrhE*{bHHtHB49~V3U<k)p1p~?k+_<FgCe#7a+6!`m zhg5lJML)7CS(wyga&I2m1Siu+-Es8Iu5fWeLXCWBf}j|QnMLvUdI!t#>R$5;2%yn2 z239dgQJA|XFgYh`bt@!WP$-2J&hg5{9H0FRBl8sSzhYLCe!rp^LFu<5Q={e4+*nB? zE5X>vke3IxQR=bcALLfJgyOdsC$3DRxi5ip3PWGEGg@!WhYzCZ%15ee$W?Vso15Y7 zA+6S-MejoguPQ9Lb<$KPMk1mmi8)2qS8mrP0sP)x*3HTBn}B)`D6N#{mE9u`Q(zOH z<gpYQL`O$tBj2McCcDhcm$gq}D1I&Wy%*vmwvUZn2Fz`?xYQhkT5F7qG*+O7`y1G7 zF|>t!6sRQpc8>T1ISg@Z9fN7ugiGZd$8`iqrKj>)Ebo)=i`(;+OMiDcMD8O9dRX7F zx0U(jo(2{PGE}!7c1g~b6OeP)sLVGf>9AX`{^{mY9xEfp=?Q&CcUe;DH!sLf?vjAB zPwJ(?Osb5Vr*>8@a#_{6*xo21ONmR!#ha-ux>6eqk7O?-t~B_Y_I6|D(D9faNUUY5 z$HA>MdiyqCW7x|G7o?=faMcXf@7ZX+1*}7sSd%H=K4ky*sB*i|>LyA^M_c~VKPh)P z!njdcyUr@XE@+G9EOpMwd76f%!X$a)WXUY{891ohz43`<<5V)OgQp^~vni3@im@bn z;e{YRYtjhS+zA8mebgg08%2o!_=Q>Yfci}bk|~04xCfA_N19Wci2<WPH{a3@apOAR zyRH5&kvJ-M7O2>j1F_-9HcaxVGcg+J;5`d}0bc<V+XM3(2<~nYEtV|qe8<oncTCJ_ z*H%)0#i^^67&HClMdsiy5bhdrj5ZUa8+@2eSSHdAfNFLH84wCw@88DhJt94Sw2lUr z++q|v4{}&%W8U7J2;JX!W1RwrA9iQCrC_IEd|>slM}m6-=tQ4nVrCr)I$sbEB{>Ip z^SuB$U4mKdZLqNkow7AT(6;&58h^)S&;EmP^p8B?2w(m%4)`C&aq+QWgz^u@LH@%y z82`yQg#N)eR1?1~Ag9IGXT&jV_o+j8ESB^{7=9QB1H)g&e=-gRAtj)Nv;NQ*I)c$Z zbTn^a=uh<&ftW=?H@~S~en+~c=e=-7)rNR332QwmrI@n{{V)!<(i57b7n1D_z7P0h zlnz{ht-z;WK_kzfhhmw}E-WL62v|lnxJI<$v)E=J64^Z!**!Qbx=h{$Wvpo)l)NLF zG1pZi&my|2HI5ZgcgSx#h4Py!O=dGsv>EmQ1KLA4{AyT#d|~~e+uRIzvel%YTNWx2 zd?V72cJ|uuzM}$f!Wbj=V4||XJ~_OvZ)tr$H?HS8P;SUWzW*7$xFulUCj5gqsQxSB z_}_~2zcCI)O)I1m<m?7W>q3=tz@(=<*uCGvRe|ROk8wL4K>FZB5dDp?O!F@FoWqDN zronA+h{R`?lRuAFiuO&V^<|U(lmV2^JdraL5Ghp(n_ud$y?Su*i)C@l7P)*e_fVnf zOM&?({fF<9kCXRlSDO3D(>l_SMYU>9A<@$$Ue#7@tZ%Mo$Z?MZr5T+(vLl!KuyCo* z8#J_w_7=%p(UlJj2P)FBd<0{*v}E<{doz0IN^6Lbx=oo-(U)18$V(F!K`jS&eDr-n zc#_5FCM&Vpxl)3K84<LYWHJA?=#7r3v)_)?6Lk)xh0V|5P}o-@E>N=#-qZ<zmKCER zNwH8Sa)<8hU}rWWMrUB}{u6-7d?7A#oal7k5m<W9^9t90cqV<j;}Y=UJ*^DCygwkk zx5#1fLMmXBY)uOyX<2}hOYIo8>5b5&Oj-m)YZJSbdjPP7{U4cTMA6a#{|=$jAI9qP zYE}6MCt=LYd6>}=FtsccEJgdb9j%?z8pN>JPuAd;$q2Y0Q(F&q&uN9O%{PqK<fM9n z)!`8#(JW2`y3p$rafKCi1FS2`zCNmI8wh;7U4S(UGPU#}AFPyUD;{?k&sjIWo=O4X zcF-M=_jtce{z7x0r4~&8tZDT2YJP*87wAa35K`HOOcPyJi96GO?;T`}92n(sunncV z%Eb>B23_HECqy-QYbLu(&Mt8ef|SI36NsG6z8oa($#y@9)XiWAeE&lI!sG}q0Ke_m z!7AOGQz+gU)ymucj&o5DBAT-QI8d(VxiMRj5!mZ!{)ir?FZdJV@(I#>A}Ho^AC6|w zu7=ey<-kDb-~`0q!o8lQS(@t(ax8#GK(8R02z}tu2)NQLh#-i~Ksbh7Rb<unWgExI za&I#{#Z?VQ`&Ey85`o^miY)a3?wz1#V<H@f>Q&d{k39^$xnR-u$STGgvt`swFAxYr zziTyoPB`gGd0u}2@T~tzn8WYs6_`w9waQxynWOj}$VLqYuSFYVscUzz%-5Y&UKFy^ zt*VE&M0htR`t7I7%c~wdsG?(_?ErrH=($)Wq>zHTc(leRrJW6S+TNlM<z6!B<hiIa z$tNKWTA8y3j*olTAi<J*O#`N)w{w-R7l)|fGdwvoGT&L2sz9!HYtE2+Ng9=u?x@!^ zFN@)#g0Y#01r_;`&3Z^w_BmKWtvvZs${>O<j_>&`hSmbvZ|_M039gxXuB8wSOyY2| z;?Mmu?Dr*KAG<lSG(ldkr`ez5KQ2CxM`r~KS+l0THzUvqjI^IsyCVZ(3&*zM05#mk z(RMOqRg|_gP7YwsiQgrjUM2c~lgaYfaESBDAP={F9{7GlbeAzIy9>snX`5iFP2X8K zO<qz6Vs6DS>vq&xri-^S+O_FcQo@mXst^?M*9w$wqltHwUH`}0?2s@N<ht@l2G8WK zi)HxWP=tfK1vHArS<$n0F?vRi>sHG`w4+`kMVe4XLN*^wGZi*INT%j!VO&+5TpbCL zb5wv`y0c(4G=u+0WVc;bQj3TfU#2s}lb0u3*#`Iu@2UXrHhbg2zS8W*)%cpAOkY0- zWaUpy%}v!}o{KA3_~=baZu~Gjk_#E6U(a<JWBxNmnfdLc1w)GhC3Q8)HmHll3qh%; z$Q6%ZavAT9`4F+9sPj&Qrplvvnortr&zS!Vv#Dn~w_xs>izMqc_WW#3)Q;<jHXgM5 z+6T=3=PXTAZ&)N<5X09(Tjg3&e7tSYwHt`DPtCXA$*ESkZWT-^D8&)v+Zmx~3JF5n zW(A_XmzCRTLOwF?V#R=9%hpCMj$(|`@#8|vLmlkHIW*G}KIzjs-(^?Z1Z=ViM)}tQ z_(m=dPj+*OO613_()kU~OdGK?(UTmvS=msH@_D{~*@4PsQO4LOg)_HuNQY{T%K0J{ z^9397xuXS(>{fblck$Iq3FTwBVp{bQHmR;_>AOt#elBQ?MwQG|!NAyx#VZ8!Ot&p; z>j#hFt=?Q0RMEB-%l*Mpxni08j;FE;Y>8fZ8!xln?{LPlI@(>ChPyjrA%%!CrJ(ex z&aWjtOmz!<`iKR8&Vz^unJMKba^~y99;F`Of9P))<tSvDA9;}cqrv~PuYln{=x;?s zGh-uXD}4hiV*#t5sh=M$F7IsYZ2WJUp-bh}6>|ysOUFPnE?=$wk|=T62(j#v4~bMp zykK#c4O2<x7klt8b96~VkNvqwiYX%c*`VaCS%I_h`JnpbdPL5^A}8Jw?$0V8S=k;| z#(2^BQ3u!(ZjO1(uD0inXYZc`>8qV@uUEuh11}l9%tLv5KaJ7KdTk|W$vUP5v6H(7 zi@xO~a&7L?j92!l)V3iNYi1yPySv`OuS@i!%J^kuLlQ58^T_lT210dkCLX5D$^|w$ z`Z)A4qkzarMJejYj9`<rqsZPjK3_NvpytLU*gVPIaux6E%0pyrcrbSo0WiqQ3PgA? zRW0i#s#@~d11)9WZ4s-2+~i01^M#&DL%b|j=PV;J^(wVS>N7Ep3S}w^D_hb71>#v} zK0`4=08K^fPP9~{Rn*L=r*e6rI-1CzJwR$%@!uY``2I3hNT)8^)a0-1#v;<eH|!3q z-uts-mwSbLT$<k;h(jm0L3GtZym`@<?Y+&5y$*W{A{N&D$6!s(LUU26PR1F0A<PxZ zKrS>VK8oIB>+6o;CfEuk$eJxc`Q1JbZXR^lkH}=?V)}a20%%C5Rg;*nYYaPE1t=D+ zswJJZ(W}9Ti`A2SjPC$mzt<lQRwX{v!h*<L2&lQYhT5AZ2Tqnct?Pn4(i7EBg3Zkr z?wiosFTO|%Rxdz4iA|Qhn9DDi&$5T9DLmJdS7-W7vp1Z_+tHUe&McEzn)aF`%exXc z=<1_kh19rMW1p0MsoG;9wdPNU87a_98LqR$3(8~lhbr-6LGFoR5mvY}+$C<b2Ns~4 zPO+yeg)0IZYc(aB6VC`uh1emkDLGBFklx5qY!piPsW;e3(L=Orh?__|PSY5B8n9PL z)i6{ckseE098VvQf}|r4BWcf=CrfD5qs8o2u;E<vgZs%8Db1g4pVpHKI+{W=DJvnh z>@EYTk2e)NyBgATf)%iZiH|*58@)fVks!iN>|Mf#E<x<InzMyWX|qw|cZ-D9jM#JZ znF>76YKGt+x;K|zBKj3fNpE@+)`BZbiOT(o_@kJi0nKkns&vkYpJuTEb{C3kMtSVg z-)n@0Ici*FT$V9Q>`2V;42=^nBTf|YI%ZTvWcSrm8Tr)hfndB*+nAr840I*Aqja#? zAcaF&i=YPG(R5E$+C`~HS-L;H*9r9}+siJd_eMg_U*fA9h~s8z8K+*!wF;|4V`696 zwb1dIk#Gk&^-Z@ZmnRVvq4O9QNzJhIgala|hBr<@oie@XFqSGobQAGb-Y+W36Q_~6 z3vc7>7K~<8KJTE^!dfTb+R;Xzy-b9EcU{R5Bc1U8e=d*oHWBDuKft6Hf2H!3u<X?^ z*dXm{g3OyjHWl&(-8LPiWZX_$k?TO@ol5aW3qbph>MR*lxPDjLZSwLs*Q19gp=Yq> zQ2pkDn8uYf<fUZ1j_DDz<y+^@7O{))#O|fsCj+>rO1S8C>$&1GYTtRK7c=r`3aG|x z<J&t`5jvo})L43sJ+&1TV<i3ppt@2^xqLSqc!oXWoO2VIyU~as@R>bVDy?`ZT*Yma z>(i$d8&GdUD+y99a+iSSHuS}pFlHM~1POP)3ut+lP$Xf&1Zt>$;xav&zM+>mc?s&V zRXbB*0<r!X2thqzP>N#l#K)HLPl0~v5xsVql2UYQT&8)-{W-jJcLZ*w!(sc>a~5Jj zTbQDjW4xi2z7D6mW^gOX;pH@@TM|}g+jH1GmMCqG2OjO<j-#pn1x2-204I&X=Pp4t znkT9%wcdp=(T+V6&ruE6a<45ZuYR%*t^HST7IZaD^{`8?dpt`;^Phu)7XsrzL-HwQ zyT4eSf!LC>+S4W>fT+&ET5J@$0hZiHpV=AOKkwB){mW;)l2)D0sJ$A+4L67m<FwzN z#9l`$$KC*7%;R`zrQnTw5ddhW^aUZ(Np(bqzw-!7qvv$P&;ataefA;aSH%8KK27D< zeg?t01GdbdZs`T`#tmo_UwyKT<uo&Ep02CR*m%G&4e;@aLT&FpO7E;`sO`k5YhGMZ zP4i}1b~-Z9jX|Xlvl1dYiGxc&R)j_XBed#nK|+d8dPib{daFj*u*YW%lbU@;R&>-6 zg}dKhCd?K0(g%>8oK3Y$3i;wrn3*#Y#oTJj6G5A)#C_zIO}nL&?1O*it<Ro#g#lp; z4Qp&vrhNWqm00PRVmV)1$H^fv7E#Y}gL?mHIR4tk?>;=hu?VZ&lSe$Nn_{9yJUM_o z`hEXmz&4Edz~htg?SYe)Wm*Ae8ZAVe9JwO-ZNty${kI`=FWPpT?=9H&kOz)lP0Bl* z;xj!_Cg7cDhzHJ`3}tW^j#?Bi`vt~F+J*Yn&ZG{;fIQYf)b>63ro2ZtX85yJ?xd~r zw@%LFvju~pTX(SGF16?vgEcns@z!EbO8t!EH!aK#Ew1>?&a><;E_cfg-6!pC&HU}Z z8sTtmuym|Hck?f#|F8G+|CEi+3O}+@87<ofkLwihHfWgiXZ8m1K%(DJwnNNc+>p|w z4~^M8_-`K6<unv0qd-)lsSRh!w2OX9ms3lNwPcIjdAS&^5;bxg8NU<~AoDmNLjG@} zCA@sO83j4|+p|p1la7z?*Kbyd0$C?SYIF!kc$*`|@>*#)S1?(|feQd@+Z_GWg_tgk z%@5{=2bNSz0Zb#h{0bGpcvK_eVv)LBI|y2c%IdRN*r1kO6y|>G@ZA$a12;_C#_mc3 z<bdYimn8CQ0>5hyE#S~B16k~jgn^^|FyG!WYL0+)$^Z-Omn<wUSIof0xQs^6v&Q}u z7(N3KVUR~^VhESR8S2>-lDd`8`WwbITV%cx&{FD2YPn&qg!h^46ULeijSu_C-^gHr zI8r{7fSLp%YN&U~1-?jTH1F5;pKo#RRx1YCHO-u;ZCzEwxIWT6JU<7Zq7cGk>3sb1 z_@%{zp`2v#Udh7-ln!+pi*Qg8yk$%$;Ko^Ty`gIh6@&FFBB4+WlL!UeQkcJw(>#@1 z#TLu+<kw(^VSXu-pr;p9%kGq3w{KDsUvEW}KDZ-<O__(%^?aWd0&u!X%!(P}<MG~D zkoRnMU@Ou=LH<Liy--GQ;D=mGw6AMtzwoKjB-~>mmKR26Z0T^n8#Zp=uDw4V4_d`1 zI2%_LHHjU(3hxtn1#V6eua5!HbWoYlumj$B%j~n6@0BoLbPym!a#C*>{!YMG1G(R~ zX1potbH6t2xMvbsK!Zx8iZg@0E#gy4uE^?Zu72&xq|K9mQY{EJGfty2=ut{lsAly! zFf{44NfGxH;MiaBG0|W%at|Fvu0~ktaB}9Lr?WJeiRNIbL}6eGcy6ZBVtJj3E9{%0 z$n>}dGFlBYh3P!X2^FsDohe?%-B5I=Hi$P~&K-917DbAox4Ae4ttp@~du%Nil0x|s z*>W+%cx=y=2_vp1s-BQL=xbIiinVi4vY6ccA_f`?F%Ml-X(sJ@IH>~v1Uqc=aug2u zLW{gyS8p-eZm%4r2CbZLvhCYjUgS`7X6(jK+pL4=>vaWi`6DfCk7@D+0EY-*yw&Sh z^gl`%CKxdIsdt@`K@iS2oc;~ZMv6^VC{s)I!rabCQ?K43uDoz{4a^fG97}7v_9JmJ zEQC)M17$O-w@RYXQnHt%1#3!iQpO(bOa@eG&QiyVsn?OtLm?j5H0)g!LT`-|hrRt* znet2?@kXOt%1<F;Z_x?atP4KzS}wHu-7jY&TGwQ2#x1ffs$%+nZS`V04sq;bT6gbv zEoHuRq|{l7)ESelleA$Dw(myB)QWcMMRuu3-efKbnXVB?HqFvn=s424(l9!A^FFcs z6NWNGO%k#}bUUZ4sgfjP#GIq@$CAg>(&Jy-_o<4LLxw8}prZQ4zq-P@4c@`dZgEyq zs6(i<PqXoZAkP@cJyuFfGe=`vrl*mI7giDiPAceyCnn|-<Hjt;x$cpr#aj<Qh#Zem zUYF3*%y}IM-R(Xc?@<3CJ?5G8oE&}v1~h*l*ngHDl>c3N7&{OV>D$=a5Yhje=7>_7 zP(YOb=>fuu^xuT$?*j@8PXS^Dybz!X14RK_q$NVKE>9go6eMu6!9sq5^9DpgZtWWC z*E#HkydWnV?~J7)Fob7pv~;w~=J0r#c7J|+0QWLoF=W~#6+=t@>Bejfd}y;}pD#_T z$VXr8$HqOGk2@fSj?{M?V{Ds(W{vG$LKxNxC~rOE-L1B@_n?n0F3*mdKkrMYE;dQY zzD?PzZPTK^V$B9$p#51<S6S2U&uV!X=1_#ipBil)0k>GIQPq0_t%=5bO90ZCU*2DO zBo{6jSh+&cBgOcIY70#syvGIx%?%ZREk7M(2UYN$C?iNKI8#YX-P0dCd4zj*8j#J8 z@d-ulvvh|xJ!~;Y%sVw}>fSP_C>eg7ITJf&jo6myGnxC1K35xqe_JSocyzaAakd%* zhz@mtH?a5jeA8(;=$S6o*?|emU=*l+uW}`;ym0v4aZB&DJerU#y-z=~yjYPVx@B$z zE&96N3i>Bt%YvbnLU3J?J{Ym18-85Z6m69TaBOg8`BL?H3wVPt6_V2^ymJSWHp#FM zAEDWhr{pM;=;-ScMtlTZ%ES)h<kau-*NR<stpE>{>Aq9M#sm`0LtdacNELbZj~Qp< zYJZBZu|Z`Zsi*R!E}H7eB=*<R->8fi2dTAhv!Vjue1L8l+CSUo@rMDD4<gsVRl#-_ z5+qA=_=TdG-K2K~dc4+ip52ox1iCd6<eTmp9@%(jps0oBoY};x$w58mvlpjT>Xh;C zev)Hp>4>exYK=<9?Zs{e!D@y4<#RF8>TipunS?WV6H1LYzX7k$;(MhzJo<NCCl|_E z5a~kk>(z->l{#fuq+Kdoxo(jO5i`(ULk*GZNt^8~NRrlllQ;S9sE>&3BV^(aK%>pj zvQ4$UAjI^4eWHz+kMoFaqh}T++!Sn|Cktj<)JtrH4q@(Z3O1{Cvc4i0Bv_-QC?vo~ zJ>)%*L_$BvBJu7S00^CGhs0KcMZxEl2Uln(77x@l;1?l@)RGn!iqN=_ArnfRyZnrN zprsdtr-g1Z6Qtm6Xp-6JyCF8%8Zz_D%AET?A)GSP`BUT~@NeOdix=sG2@~wNp++z- zPoL`<udD4*6Nv#*1>!(<_<Ku7I2DrtY{JkdEK09&mzD?qb0(PSNTbr^r^|@+UlGFp z^&B(&`#DyYR>d^_Nj~<34$R{VBxs^8n@0dJ_a#sgh>P_XdNs=kO)mdS<c<%RfX;!N z-2PYBuAsz&MSIba3YmLEkyZOeb@Ocb;I=yfA5;KBo9-I)ndjO4s_S|x=lk=G)0ch~ zDut5JP+YmiYN5<-OT}twHlfWREd?to!^<n&=G3bI0d3$pLPdTqvGDA)Sz~X^$*(gp z-%FC-T6yjmyNj%|gsY*mq3U+7Y)JY@lemohO~j$7b}YihqE3F)bL~)qT$D6BT?X4> ze66_LcJWGyFztXONU=u|0z)>=zr}zUzjt;GOh6zsuZrZg9CE~NZ*Wk|%*1RN+GG2$ z(>4(Qyo?4TeRwNWyh*{{3f`}OO-RXGi3J78a*oU<>%6YeDnZmtVoBK}9UqYs`irU7 zPZ^y$He*jPBvK_4zQYymgZ?&$#VH7WP(9dJTZKCKD_EFg8MRDMywyc%k4!MaV(ajt zd|J}{yfJz;ZdeSuGHzfG6C4%Y^Lea}k;Sgl+DOQrJW{7~X4XRjQv4KAj*y{R$?FY$ z8vAd8x?zZ>D;BpbC^#ULz9=mkr#oQ<;#&2pJpiCOdH@;(VKk6nK73GQzA04y3U;=( zEGjNX`Pi0|m{`0<l#4szU!4iGz9JN;fCn9}wpN5;H2?9Z=BF3v$z`KR!+c=eeGYXE z0$`}IU}jH3;qoF`YWiBL&%bn;>>4x_B@=o>nF~|`Ju0d)*G@OvA_~wFqqExIwWiq0 zlwr?Im?9!fxk}WAjo^+CzsQJI!juSHJc*#NI_`Q)m3jL7dkM);4A&B%c@cvn7M<jm z!g&;wB&I|bXAAPx1`XP1Uiiml2Rn)BY#AFxC$uPqA!7=j{K_}Sj*43-_8fyLO9m^s z!|gri{FOb&W{ohFNgiQGCsHDrHxUQB^W9Zdslj&|cf0xGBs{h4nQrxBk`jTI7-QuU z?Qu~1nPf^S38KPz=J+Ny8Y3dn3xR7T9LWt6!FsIYhR5m^$?X_v?}!O70vpR``AQmG z*CZ5kTZP*mrX5sP+S2BbCia=O){h_ZP1F(-iEUD#&ufk|+w&-!4dd<EOxaB0W-9s_ zQxUo7#i{&rFK02}0}{P?2@N9WDXunVWp=1JsN;fimYZL8A%*q@X=l-W!me^o$3dgI z@fm==M1s2K%E`BdVRx^l;h7v=ui@FCE#tIc-^jBB8>gXYpu2`2^SC{4AW~AyqdxsB z4*Ujj(Y}7q4N^kMf*kM?&LeJuMjd&19uCCB0(8WFblmU~Lh(AiDL8x!O9<Eow`~g5 z1GgZ3*}o3K^WnCOdxsmjEO<k(o<_4Rvd!pW;35vd$WzCh=?2oyy&2iD-(tw*k2^8M z-jsrP0MM*>aR26KIgE$KCdv4MPV1nxXJqIJk?rvJPz$e|on~Ag$P&wrK3q}1@3=sG z_IUY&S|u3p?zRgU=B0y330cQU#6p?pBy?3s>KZBZbkI!6Dg=Pr>JT6xCVhn{TfIt7 z*1M8jj3DjSZwr^-YZVRKEpUyqoWorCzE&;|-I&J5+6!g@Vhn5HXBKe<)*+{KICVn$ zAlDj<Ty4<CnSuvSw~6Rj;Qz-eqx*OJZ=Cj2@6@YxAW5`;?OXc*l7}7t`RBp^uUUTo z*ILQ=Z?!V%ADmSc`74{+lE~d3vnfxxL8&TfP-UM?MhPNZ9I-@(epDvxZy*&P$$SI% zn3)KARK47~g4x=5_d<PQQL2Et0YMPUEYcsD{=MrxQg5@D?F6ie=JQ0yLU-4zj_2+U z&*!bzXHMHraJ&c~Fe@5p6UJsu@DB^|c0c6R?2I(B$#H|FIByE$w(N{`Yd)||=V1<8 zW2}j+F)R)*5flKxEPz|#tG)6IjS_70T*=&%<~Zym|06X3OjYi2KB3$RN>zmb0NCRu znc`h`7+3{=mog>j#7C*^Y9J4w_5gKVjiCVr%S|tWo=t9ILRu6f^)t#ep@ni?XTT1k z41<s(CgQ1a;+9!GvN<<ROW+zM7bCm~38KTKrTS*`2fd}G=&M4#k}8+MQa-jLWxz8? zu2@~>KNLYBRx2=15S`1eBc~fc@6~mmy!jJ?=v@ITpQ2KOv)IC*%NcZaBJ!Bhov_^D ze|iVC)hbFsr3W!Pbr4+-aD=T{>R_%_7ghYEBXpuwu}{EfT+&+Ng6_~yO*P&Z-NCIQ z@T2~cTn%|ic!)ybTbc6vt9KC8Iy>i};&qjTHD4kS{nhbLyHwCJO5wxX@a?71ws|z- z2^$z<BQf>57AU}VQ%lz=N_J1OxGg6L5dS-D78m?3qFjnQyp5LcrnLLjOb?ulTL^WD zN;eF{&60#G4sK<J+l{hixc>_$!T^mB$filF5nzoi@!bze?6GOdCT@<{2Mbr;8-9m- z0?u&PaI!*~hBF1|>g+-noCnbm?OFsU1nA1rbv0DeND9|<(%MUYgCjbO48~AlciWY} z!H-a?(8*|QkQ50bW<Qm$$E6fw6=q|CTFEOXnNejo=~BR?M@J;A6Wtj<OV6`e^QMTy zt4GsQ3j`yufP^PZcE}DP$HZ_aPZj#+9FlWB3*1B+DRJApc2Ir=^72gb9eZT3(ccM- zk<uUiiDrBssRkI3B_It0H%rSsY750cW4b?VA4&qERpV5y!HdhFr4RjCYYZp{Q7yst zC;L_<|E3Rb;7)7FVO8qlO+}^lyEW{-HJ7VfEC%(N6kzA4^Ig%bsC4!&1tnYF4Fy^b z9}mwZoIV>%Gk|NxyeYT2(Br?<D7=&1caqp<3QXX)vZ@7BTa1jT+v`XVwdY=R!$o=Q z#yCNs&K9fo#n7E!`?0j~nsy^W!K<q|8FPI4;Yk=?bC3aWu|c4?gQ@h%Vyf+N$wJgv zb}e#??HQA`VMbGY0&1o6^jR+c5*L0pg0(T`Z>#L)PQ=ZMJ~@8KbbF$m>r_AAspv4K z21Hv|a&33})5sg2IZhHRK^`7hIy3(}AbZ<DcK_%&&AR>_#CPp6%XmYHQtjlDXQ#QX z_~^b)`63O~GmI5MPYAfp7u1l@t-Pz8ba}yBCuFE^IXL$zain_785FPs8QH>a>-_gi z8KU&MmUmFChnIqP-AN46uJI<vaB#|)nUE+$V)oPdl_fyH3s_3iv<TyOoiHLub^R-> zoA7znTy?bik$6!rB!z8<L#GA@^(P5w_H(KG;GOm3wo!UPHRUH@v~n34>>rU${{!XJ zV0!e)Kj*FBHRq^@{F>sf(xnY?2X@eYJox=*Q|vP_!>#Fee~uzoC`mhY4yIgXT)P~a zFOn3~EkXYh+41Jo-2VmHDbT`|wyn??{Nn+gF%QU0v=Al-4O@h$&0IJiW(Tb~e-VlC zh7gx=+8z8*SAo`=EhA(xT3BOnVw`?Di1|id-zq{NGQkJp!Cv?!a&B~h1!aJmTecM` zXhtz1#=-PR=XJff2#O{xrWg~uQd9=ZkY8KOGnfh`T~<oam@v>RB85F8zYa90_XhDM zP!il~w7gO$TXoN-HX<r+?T#%A7Rl_U2)#{GRO{tGvxto414(+pHk1PGJepD$w<tI= z{QZ-mX>ziMgYD)4v**`RGqb1LCP$EXA>p*uyCkGalL>YL1wqo3cE?rTHd>cK7ehk8 zTI&L{6()wAq9f!6Lo3Hr-q{*VnzlGIoKt;pA7+NFd#Evza_**&vy(pZjQZpw##7)< z|AmMkaSNdn{aqiu!*ZB(Zt46{7X7Lv)fOANWT*9>ePQFwGbeow&2#3>2EX5M&!ET~ zq!=ruqh*EEC1nR|!afn4zT^eI)zXU1FpCe>1eXL7{1p+cNu?KJU^z^E$*0uwvxJkH zSJyfPI-D1{p~~0$%el{?q#n}-8E9J`l(`5sCP-w9O&<30&?ok;<Mhkst3l{v;FP!+ zB(zvGG~0f^Xt2xiqmgswn^I_A`f|YM1)8*0c94#09&K)P3PHB3@LNF0W!Kzl2zk-$ zQ<<xxj0|cnh6A1)={y|_cJI0!GEjtN)!x>k`rQAb9TvK?h~?{_3xtVUM5e%g6bUfQ zf1?Y8{~KNSw;Ogy3*1v_X^HoFTU^KF4gep&H;|eykxm>e!*_t7gGicB`d5Ipy%>oR zQ5rZSB1#j5b(M3KC3PvXYGsqMBD$DeUy+&S#=4iPq-K-LT(e7^^6S@0H)}%Lm=wbM zyZ6p>LR#B(x5o_k^X17VX3s1CPJ$4V>?1__D!Ye{G#*-5a0lmSUnwmH7_cRV=K5#V z7WP*yzku8xaCcUBI*hKJ=G0pi>WgMR2su9?Vt|Q=h9@=;e+d*sdFLi76!3&8W+LZg zo+H#a=J9MBNE^_R%bQEhbvPJ8lm8vT6B@tbIdd>GbzU?~?#wTMtgJ2hon;swX)ink zZKBi0ykV+pS<-?0qSO-z7gv_1kk4+FO3lEX=;B$79haUZ)eQ=>dA?EmR_JaTUp3}a zU#JU{;X<rH3RyxWcZ56v?Z-UpT+^o|w+zbmjr9+GUrsN!gZMbh$Y8)eYYb$@a@QR& zq7OXDgOF`Kl5Ez;fyD?UjfhO-CqQ_gTHr{WrI|?SZa$<_u=2)US5ZK0KD^a=?BQLr zC|ZnjsK!OA72c-4QlE@%XYUBwRtBWOMVp_vbi(fL2>RZO%^^QMymq9)YBYsn6Dy=f zyHS1gq41LOaCA)RbSXvc!(4NcG^Jf4@sd;~e-Q`EcJYGBZgjbWJ~AyExgxv*{m*jf z$BGGHX`DpdqX?<;;xw7^d<_1Bs=Pg$*}?_bp@9YVtv(X2Uzb*uTD+rR&=%DR$Fp2w zLCm#f9TfwxTiG$$+WNXH>|f1Cd$qPPc(z0CfMxWCbP(rZQD4|<rubP`{Tw>{?A_JX zFuobAWVi0ik$w|tjj744wXSsT{dz_WW@+NWN|R7(zx~jHn|<{vfU-EShU&>$hQ%w+ zCXpbm%+vUrXgUF+7lMCJ=Ke{LFoP;+pDwgVnKw;SvKX6T_cwvk6o;}vI4mt~Ds(J} zV3{RJ7+wGhUW9_KhtoiXsQ1kzEzRXA6SciClzAib+AIuX3M0*eb(?$Q3j}tQGlT`6 zoKw-Z1hw+~9azocmP~s&aK#BkT~UguLCsigAI&?z)#t6ZF^h+?0l4f0`goy^?(B9Z zM=6bCfF1xq$A<m2+icb$zA<*44_Qi>C!+Ddzo*xeR^QGP){%*nkL@p_Y7~1b08pj9 z?%3=+K%B8C4UfuJ=V(OpR{;!q_p#(j781xcxEYXK_heZ`H-Put^1ew(aE}{AJ9Nkk zd#;d&Kc}n|mkt?lU9ig1tMBLAE$rk$THoGkGRwUlWvMflP4STz*`U+wmk1Rw{6*7W z7;%P3(;iCGS4@Mfq(x7dWvj9FjH2I@gT%DVV)(^kB04n=qf0b@xB&v;qY>M|GodMc zIm345&<-Hb#ufURLV_ZJ8`Y;euS^5gjX|)3a{7xkMP(6&k8<N7^7ve%eHvKD2ZnQ! z4?n=>bSK?9uS%7!17r&b+|sWnvVTok)rhqlu-ITv^YoskJ<TRaNC)k79VxVV1w`|+ zLwbFr-|6??kg^Fdh5)YZY^oSXpuf25T_&qmDn`7Mvqq#z{*}mTdI!3Noa*W@kxZvF zr{Y7giV$Zw{IDue`kP-pE}7LR4NV%GszUx(AyTey?eSXX-?{vs^}{QLpr?{l;II%B zV?^MXkZ1V(2MUpH?mg-f8ODeSpVO*m`p3P5vzMZfXZrjyfA3g>0jj8+&J;FG2(=Ym zRoE5*96~-j$3{-&;ByDzFq(pXbrfa&J?f1z=p$U5z&rz#D9gPN?6cNLz%d=Fk<?xD zu4+2^F|hK>>Z^&+_u2wAADatdryU8w&K@7DlX45rAkQyeHU>asF+=IT=obPhxn=9< z)%yS%eUmimEOd4@7#q3+5!B!NxOX+OayjZtYxj$-U-;wE&bLH}&AGBslo_V|A?MUS zCdjQC?JwZi-hVy=?Hs~2h~O3Qj9WFx+CI3mat!Hpalrzb{RIDP1cU#aft$FI1H1fi zN|SW+HL{-2d-LJ%apFhvX725;0sH&ZV#8N#FiVLS(KE0UcF2Sns=EMA8u?<2pdXZU zj`qMwri@oVzJmg`e!Favpi{!C^?>n-Gqdp_pYYY2{Kfoch?3VVfF1A^8QB@V@@E4a z`2|vl%g`HiQgBP2tZ#?S9LFkDC7_4%4Eqg~ujB4icl4RFMN?iVeWOk=0v)hJ>W%et zL>T%ZJ9iDe1j;{vB_6lcw_kiz>3B<&^^Id38lO!Z!wBeFgsddC|94!&s&8fU(oXPL zo4?3%$-~*6yNo^<DMNtuS1vD>*;=5`_;fxB)cy!#A^0bG;wWk{q#h)YG`d48z6gO! zXs}vMT#ypf0CuQ+{wOhoa9u8Aa2yY;00T)knZ2KZAzrZx_AXX66WeEp=7)xVf<g1| zX5c;%BiY)a^WMT_IZ`dx#G}p7VM}(A)t#}<U<YIQKRDLlfDibC&L#Uuw#e&49rQq# z52aVtDnRPu#8BD-KPl>c&c2<c+TsjDWto6t^w{Stayx`B)7GKra>rG9ThjQPhKNic zXBzQxgA>@rrAW#&d+<woML~JFXXt~Z3D+#bQK?C?6Tlyhh6C;E#ePV#srZ#ls*{fM z75hx9$B|diA9RBNy`xVk?RFeY)D4b@&l<ES>_MtjAg1jBF35V`$*quz^`oiY#^FW# zP^iAth(s-uEJF~h9CdP)ha>D*PtX*%$pTd<mToW%FX90)%&i9IKy2PRJITZv<;+8( zLSEgah|r_;uCD-d%z1W-u54!EkI8zONkjDl4E}Uxxx4IZRF<BhBnAnJOySUKg`E`z zoC+|7f@(&HThkFaoQY2wK}q~5bL$;zLCn*P!fk9p^51Gttz=Lsc+F4<s6o^rc%Cx$ z-K!AtPuHhU&O-IE_6_73z@tZSc#R2TrTnS+S(4TYK=op$=X#Vkt1w)Q`+YUcC|NRd z`2OuEo9OFjx`;5&!-k%UPWF95;n-_h!NPcgzg~yZj#y*{@X4Ug{+d8s2kzFxi457O z1x3qEJQdI0VQ=}-F>#0B)+wyXZ3enWI2dIi)={k_;zOt8jtN514;t5E#`Ol}j+2hf z1RpA%>UpQ`J47Jo{0{KXGt0G}xr>HT^jtpgLhv_V8~g+L{VG^)Fbn|Ad9&fZWhreB zzhGALq6N@sU9eUI-L(Qg8n-OE@ww;L_rCdCeQ+PY531mJ>Z-SHs|S=)YO?WUy_9!S z6Xe|%KIf!r%OdHV1vT8uN<(p0YOK+L!opIW*#@zNG3pvEjj}rx>D#7y>DHF`Jr18x zoBL-E9Gok%d~_=&rK#`|+;czXHH6T{3J^#BWrYbe<<e$is$b9*D(L-?*S?>?I@>7C ziCI7_OvXj({=`21_M@r@#(u?^d{5KG)WGB>C;^umhaTb?{H+=MQFyjc5%&QJ^lhpn z*8WFA)pF@?NCGjb3kD(D#pVE6PYH&hW=zHM@#IYOeela|nlBCQGvq-xcp)z0=(fQG zfL99`1wRc+;Znw-hJE&{Zw@8Z5j-p^``aoSbO={~;ro5yXr69Ayb@xddjJ07m*m;u z-61KUx>((vASrdvlJ8Ue12F4IU5D`N@M}K{WA}Z~$+au%Nj}R&a__(w+~3zR{1FZ& zN`;#}oaeA2P9JRCfNK_vMezG2`=&IN_l|+#XSS+Npd1=$K0Quhx^qlyq+lt$tLZ8> z6X}Jk_jRL``^vs>J;8*PqrM_{y*oF(I|eJ;T(=lf8f@;G%;+mkU}YEIS>0xmoPXdg zZSSu^dRYgr-92mx?#KbLzenlK$+9hr!bSawd{AuZ5o}4Fcmd4>KahFIFR#yUnqKtx zECaM)r2U)gw@`y0uZ{=0pqBO{A$thFt`K|>M<MSkPltLA1WSZW*Yh}gKP5XOpyWR? zvUF2oX3!!)sv#r>h$vG*Wtv^zHG#6&jbw822nFM5PpgNdx1p{qe|-!|OWVN*U`rFh zn1RAbOn)xKu$nL)O6fhIgKk69@iah{t#*jq6$u{W;m#QGu)g*GCb?s;CC%vfEA82g z4bGixcG=Zau|0Dd=Q?8;TC&?ADk3j^>Vc95rRv@D!`cJzJZwuO6;0bOb<0#GH}QKx z!X0&(r5-6P^r|>`Ex{iF=jb9wdUQ?%?%-^B8!*mmX2{Z9zT5{UFxLLE(<IwGv!&i> zFPWU?oM7`4md&OTUT0~ra#vR+LjeEPP_NQ?5^61xovAl(gh#mLfN)a(XCMmy(7PVW zzkOk4?l0?+5)qX{cxE!~+h9|z-Eu96O5f6+9hudr;w#WKeo7_{C0>6P+#a1MZJYKU zpJ}OOZcf@zoSrF=hV8EkGr$&++Rl`gw++uNZ29V%B<RGC)^c@HUw;%YvN)NXzv%nf zf`hn!dpzSdjyJAOMAW~3pR~&vvYO5Aot%k7aZ-;xu4n-BR+BBKJNRjV<q*aB1ZN0t z8F$zAOs>rDgBtp8j1$x<?5@ga`V$!Y;kBO821puWy((Fms4IH>q9rf}GoA3n#?I6J zQn`8{m0pnJM7!lS_ME`mz2I}&gm7u_^E*n@;9bOd2^PTXXU8{9h+E3ip5rdo8dmOr zJan)s!Jd_FQ^1`aRgTTN((6>v8)wePxl$w0bZ&a_Z&#Woj_VgHHP;QGGtaLyocj)q zKnYC}b41?;XoCsHJ9`^MvHl~fTqq;bN<0&9dhaA7(r~nc>HmAxOOVBQjOcBo*UD-# zIi4tL{%K#UWRoZZxN1}fu{Ic10lgL!Zy^4p?blTSO&fpZAuU{WVU8X7-s7;8a1wq6 zuV6IY(d+z3;U))zYX3zghKRWND0~n?y~{Wr4&za-m<=U?U~|Sk2@gTsoj(<8GYFcR zpvw*Z5M9-6Z57KZf>8yw!<fvpJ9`dpmbc<4f^<`cdcwxJEqJ5B1m^r9*A-}$W7qdp z^8CE86>F}0+d7%3RGTKLi32RtfCiheOt2#2rqy`F;gHmYtnWn%(s%?TwvFcGnkLZ7 zqc}?dJ`cp0XE(5KPI3xiK)hIM1j6ZyhL^Vd=<Q|RjQzn}%132qJbVX4sJ1p)4HW@t zjkiQ`BF%vQAmE*2<j`a7vO41MqaJR*hv0UoT_c3|-La=TVpj?&&o4oJf%`+$8v?ko zgm?XRl{KCPO_Mk}*=?Fp&E|=AES2UaP0fRPxRZ#udY2s;A9R05HAmgrCaCtw<MndB zTJh`5G}4|^f`9|Jf#IlxeK)UdRFeYi9iw6H@s7i-$!`yaEgFf-xMx>fhEj(YI2d?5 zR?s7zLW;ZJJe8L>!tm1>cl@)G+q6BCqT+cXK2B)L;v##LcNMv5o~zl-1Bo%=%#lj6 zcjO;hUSteFwT%U~V)KS~aFTpb2zG2^Z=@nf5{E^OAwZexnK3AFl04J<l??`pJYxuo zq&fRFM`?ks(d0RGMtACZ4_fd?4SY}64%srH^DsA{$UJa2?qespcbL8}Qv$C7@M%y= z_eFgx#^cv&YF@1NG^#M)HY@T~#rQodx-_^qD(~gEY)8*WuzL-!7+@(k2X1{XYXNP; zR6bNb`~9Oi7B(z5`duvqkh^^|m#+-v<UTY$ef_tR{FEURpOv!@$n>xE|BtkDh|Yxx z!gOrgwsT|Kwr$(CZQH)FZJS?g-q^|fb7nPj&dg>uwd~WI?&_|3-=|>J_tAyQxQC#@ zgk;pE5CY$ZBKudbrc(M(mmVrm+Q&IF!IS*A1AJs(Er)teQ~OgIT(nBqAHVtDeae4w zxY1@WN3ik<z9cXQzNxh+<Z&;(DJzh5=~Emg+qIB>K!gNobU0#nOx{LW-sO?eC;CB| z{pcE@F{TPO{YeGCE50x#T<;#%bA0m<lo;=d-Lb}<ANbz+=R<(qTEe+*3v!+G{fN%j z-`_}7l29^>$x`GjHowxe8dO{<QHN7SPM8{ZMh+^<B2U7nt^~eXJ~cs7r>k;l4ECh4 z=akf{y+h8b2f%?y-+o9d9IF>nk@Ye)#1xP8?sJCg^=^t<`=B(kBB+veUOQY4j7W5i zo!VL=NPhM|442T2ecTo}&-dVE>;~#;p+CPx()T(cn5O0s*29Wv=>XW5qSV%vQo1JD z_eJ&s8E_o}c4E>jwESRL4D|N0aUZ`P!qn`PM{3xQRd~V3P;H@ZAI-cQ-sJ+;G=98Y zLUJ5t?Q;q%a4Kugx1?(1W28IM_y%@y1=N;@1I^i`jWepvu4=lo1X(qwXp2w`Ry_2W zVDXuktbVgnvla<}sFiUV?!2FaX!*FC$f7nKGs;%QJcNka9^X-6(#{Qevv(}>WA*@7 zKg^csvn!tOWtPtG*!B-hcn8yTpKrwP0E6kP2I>_ArIhtPi8@E6K5b}$+!<JYvSrt{ zv0C>i%2gb&INJ|rVLfDi>Ins1ngxX@8}KjF7XyL?M$~o4x2XAvp~NUR*0h6q3DvGJ zk@MsKfU=SPT)oF65!S~ta4)Oro9qZKD(hJ}e-ZL?U!KA8_aiTTV5BsSfe6*A+5P!u zQ2qF^)CfJG6Sk61u=4FdYX35BGxzv6(7VQ{*r_3{x@D#RG{CsR>1^M!V+x9#!X_iK zoc)ut;)fSC5q*H&6~JPmoGxMzVN<ne6VdCnbhcy)5Zp+j0#3kj>>pAz%7}J^$HSUo zQ_I*IR5zu(b}k=Pf60)y-cE0~d}@7UUa?ovl}z$&mC&28IQ#Ks)6$zkUXIyk*_R_U zcb~~Z?odu~@?3ky)EaNRuFK5*UePS{V4qhlX#3Bb-9&cpY$R>WQ&;RRIS(g<aPGQ1 zh{w8Wfev|liK7XydFI<L0z#{vcM4U_VfIqwKwFe_BaH}Or#$lVhRGL;y4r|}4O8gf zgx)FUpFj5nKEI|d7Iq`uW8Hwy!DL>&$rV_y;z^7`bX<i~A2>SGdf85w1j`ydsr!i( zuw8wxoqj&CvOs?+dl`GHRJYMQO$nZ~T2FmiQ2Um_y5#qx!Hf>R&!yUV3UE{r0NogD zxTy)b1kUI(@Pl^sN3vc`>VsF|E4`&JR=T9!kTWsVS-`wGUD#;)Gh&vTgjZ3&jQ&cI z?$6#!j6_in?`{En7@d9twR3IJ%#QUG@vP=kAJmN_0yx0<%?9eH)kUtzYK8Bax6<C- zSc%;eFXxgYmO>zLR!06U!q86sm5mAY)@+Bp$1eMfd2<Ly`7T-15jH`YH@SD$UGm}J zFJteyXBGODFO`aVO{vTt@T3Vb<PXkw0EUg)i#%gW^AV5oKv=BGpAu0$P>Ps1x+v1( zbItY+#u%|wik;&WpGI7ic5P_wx^jJ$h*ugW)-LdR+JviGbV+4rtr>Q`CEkj4(m_bN zQxccFZ;#M@BLGz$Q|50|jHFKm`lhipBwyH*6)2-G&TNZ8SuK&UPPL+KMY>S8LAfY5 z454_xpTVsiOc`*9KV#;8E*eSh>~g7vu+RpzbqwCJ%n`$P3Wg&Red?;<7SAJ+L<|ES zUzR8!xh$F=JI}__3y8IU;%=-UeFArwQ*vevN!{If3-4SXc-oF%1kbl_AI>|PbHnv> zO{5YxcscES{5WT7Pmt#q9`BL&uy0;}mPPdQb8cn(*DY#qLHM0J-s2mq4>)$`^GSsB z6*!smiuL!2)sI=s`LuNXT`q`U)Pc0B-+ssXUUhrKS6veM1>3!f*^OKLWDaVTc#X^@ zIB@1MHWrnQjgM-|e1Kx_52-K9X*4VA3%~13^+8Es2q_&dgoW!`EX;v-K6l{d4`PQF zkyS|<D==Hoq5Ze`qzB4H&W&Dhkt%`Cnr0q2O8`_`YL+<2a=+)L3dz2@>~1~q_v&1o zJLa~exoOtr9E)w~)vDxlUZRLx<${Yj-hRNEz+1ONjQWi&qmN>28Ty|yHh_`hzgqE3 z&8R4p2tlDf8Aa4&ChQNn=!u(>xPy&<KSQ};?%%NTJg_~w=1_6oSU1_H{`07)X!871 zxA{PC3k6ORbM=>Ku4wO(FS%7iVf*K11vPJc`|)Mt1AgmEWSO0K6JsM;y4TYV7h~fz zj*NgcZ+H&|PP@Qvc@O;tO-d<%+<X4;;k6v(<jn;#ZXM=qa(q-*=9{Ig?-x<s9Wwn) zk=^G6xGV#wq>Q)d#O>s(EGOL%<m7OT#H$iD=-}mI=EjLzryg_DcuoLQ6I2Jt6=WHW z3{!hjF6BLxxwObN`rBe{Dy3D}X$K&RP=wC3Jcj!!r}CH#;;b~57)OnDa$%;R0e-<N z+l}jqneNjmTl`D}&)4uyol28dFLqC6u?u+0opIuq4xF|5%t#z`R_M(cM3y(lJUV7% zG%!(Qe3TL>gY9<|jK=^iBT`0d`2A0Q-Tk^DTtf9d>$*+fbF>1iacgf5jNlmUKyOHP zp$0P{ZB|0sJpbsE6VT`sn4fsk5npyFppN-`byXI-w_6zsPl=MBhlv<21usbJraY^K zb~1NmWEQ%BZF}s6dw(>5&O;iH1%nYvt)V0Sy^n*U-l5XBZEENYId0xFvze2>0!b5e z+~_<YTVn>ojE}`&L9N1xZfWjB*q1^0%9y4iCfSi^bZ8dE&k5eKM`*`V<<1&+yh_Va zR>BeQB|mt-^cw2+q`p@QN<VyFzlA@_?nX}7(K^_ZL#aWohY^%MpM_D3(q|MCOzs@@ z73n#eQR+eU1-cLgwaFB})wDm^oLmuqx^nKXS$~7UOA6-~wr_pljvt0fLnvk!4#XKw zoGG^AWRPi>omXx~;<(pgBPYtM=%Kmoex>J5`LzRc1V<yLX9F)uepJ+v#0ZDaXgm2$ ziDAMU|Fu)oo005SsK>eGtW`pk0V^JQzcoLdetmQl>JC0?KP^VX(I5_D2!lTgYCvU6 z#Qh^QfezhI=w0TUjO^F4b*%}cB0lQx=96VG3>VptNX7+U!XW74*}qPLzE_CMb6hJ- zK<Voh@b2mg)h_CtNq_eQHNT*Y)#<25pGK}IAuI9}rS0oG>uJ+FAG725=Va}5TIY3i zypOkOA0-8>@n0nK25Aq%67IH|(Z3Tp%U`@%IXhhAR;)AF+sk&JlhDnWDJ5PC%v!;l zCU<4gB})KX)MCx}b+i<dEMw<lv5;Zs2bHzIyF1oCdFzI`aTO=2eyp>0cquBzf4?%% zA5Xn@yl!{&y`oKZ8&`yI5DD+tTkdE1B*7(4p3K{wH0M00@;)VlOKB&$F33nSbkpfL z<*o<^o&S0ta#+lL9<MSywSsII7)=`bk|j8iVJ~j~>%@oa1od{K93UtJcg18|1~BEk z4y*uVIEF2DrCygGiB4#r$Y&c{|Ai(fH9ZMpJu)2$wd_K&*q1|SRq;_|CL02vwa9B) zck>ci7L&WwLeg*W$x}t<lAG=1bR(O1!%gxfmPo3%lR;P|jKL#XgW>HE3TMmW+O%~M zgp8H4Z>{V-DZ~`VY?@8Fw`tT*synjs!2(b!-YnHmthS~~|8p+EztLj-s$soEq$uX( z3)*$%LJBuSa<L(^=m&WzZx4WR_b$~4?iYKfHyL+kl1H6aMLd;DC@1AQn6TupaE0dv zD38ZE!CD@WCnp-K_Jw!wr3*$QhNVxGQNJimv5fHJR^{Bp7EP6_h{@J(D3Gh$JR^6y zf908SA_#k@tMl<JlB|hjYpNgzj7G6V`DtS>Xi=<fOmNu_MXAF1FgGKzH*-YUszLu% zv$B}E)R%G4#F}#3!cXK3fnPN~*Y^`ar%iX%*z^{IT~i~(tiQ~(1sZz9x2%m&xIazh zJSA0rz#;EELR^^6B^og$JtP+$=WgK+5vk$jX%R*mElP{|@6vn(Ff?4uy<(hGRS(#e zODJi8hVL{cTzVgy4<zCmKbY(y-y$==JKahCY#!3PCOpMEV|vH%-YWV10s19ww{aA^ zRl3;6VCk6i8&QuLbQ?3xXy4GoOX2A$0hIKTdmBsnc9>B-Y{&+3RT!6;G%hw>5`nO9 zDVNnn1yQDqtKBz7pv-6sdQloB=V65CvseZ#++#qRMz;TmT$ywK%0-*arvI!*!mMfQ z){_44JX8MjLMi{IF4Y|0?}#T>_lIbDZGJ-bMriDhul&4fBpJV;@<Xk|yfFJ{!;;w( zGyP7^lovp%SVU|Eb2Un1l3NMNlH!@H18oKoy+ZGDKr1cNeMMh{WL0jLHXQY*9L7qM z(f?>gSc4lm_Udwo%@jufaHKnrT(pS_`J-fMT8**RGxNoLT9vcLD_CAn>hqAyJjY7V zd{~ZcrU#x;fbnXG+X3IDyQLqvcmn%@QAD^N6MH~!G5V>03Jdw6NEtQs1OwjFqBcqu z^v8QS1jCQzMjz7k-@T-sqZ(J77`b9j>J&9Py24v-{klHe+^GF;;zJ`ODjkdeELNYU z_cZS<4)QYhl$f#-rbBw4^u`W-L*W=d$n-uC$0;`Wg7qyJ-5l5i@5J-JgB|(EPV-tY z_dZw!;rC{?lpKM29M8`7kT)cGDg0}=XZt*E$KI8}(NFkNlKrXG_<<qH!}yppC!3uc zeo*s)<v{PXp})Wp#C(}!=i2GaCZO!NkS2z4xZn^x14=f059g71o)VC>{3<|Pg140e zaQQtD+JgM>3G|a0>_#DB^^(6czZ0@+ms9?DE?INVB~YWQKs<bkr~)VQP0=wQbYuAe z7MfgS<5p}`eR!GKrkwiX#5H8myIneDN`O%>=nY$7o(x0kECU>!2;;mHvXR7y=IebD zqHoruDzi>(cbAi1q`E@kL||KrD6U%IxpLSnT#e`I$sp5mcyZ*f$yx?vZ<b-CD3iu3 z5HP}Xlm9ujps-6`t%Y$jzJc@ihnn}nQ9i-YS7==5ez1iZG7tpTc|%9N&!5YEy-IjT z{E&$+7l@(vlB+Ln8{>Y9*;e#N$(-Xmfq(1q3jHE6E(naypX=TGe6)MUaN_tG#8)65 zql}PVg(d2M8Bnsc@*6<P>B-kwx5P`&mqFk+OV{!l_y?6})VlZk=ftozEIYv0_NesF z4u8Z|i^d7n`hd@>nJk_SSw!JL))-FFr&f$nkNggtpp1gI`({q-ta`Em%m0(Rhh{@Q zWsI;BbFL@%0Li$orVCNp&c%?5I+PWclT%WG#A=-qX?b6aZDzr4h4x;Iaw<s=4rRoT zN)D2Ix(jVE+Y(exye}hFNk-2SHBy!f`PD99dVSsar+!7pS}q?|6&*^<B}l3jQHT?l zJ5r+6YH;?bfyev)dYrnOt!W}AQ~^BMK@hi3Wr+jUW@tyEnH!p!HG<_kHbfg&(j<9D z5u=<<L9vLUlr9>%dVe1K%RMjt#>Ep2C@f)NhdcUQ;nhTL4UDN0)RSnoPAZkd(3VMl zQAzG0)XSg1$9h~_-b_`_){KF#m86!F6>Cv|GQ}?rmL7rIzb$$%PEHpdS&z21Mqx?O zY$6_vhPSRdxn9Ax)`IBNEMUNF{yQ0_jZguQL(ZW?eTw{16(V~FL=Tbt2$XD)bAVgw zg6rSRorGR<&W12&z>k-Pz*<D2ZoY6QL{sJ@DEqsZrKw5H(mHt~)Tl+QW>G_H^^fLC zJ@Co5W8{ibRL5vvsLg<XDR6^r4^gHlA7n|s+gQRFmw~@MFJ(n(n=;F3*d)y#8;ywK zPjaS|g3zl?pI8E_MQG~4wfw;Tmb%suoX!{Nz<0$*rN<6s9%H0G{8pL<Iz?7BFPWrw znSRtXuX2s3#hhJ$`#1|~P(_Y);&)N>06(asm(1}{H+U<{vOQ-2p&j!<|LYPRN|>|; z?XB}*mA4y-FSWM=d690P1Ajr-|ML3?>b-WJIWmJKVhPB*HaN&~j{M1v|Lh_|rc?Y+ z{UX)Q?qbx|nEG410HI-_6ZCaocE3|Dz&S^J@n2q7(4ZKc)i}F&%F-b;TV$X+?B8rY zXfyodU?g2!jq6~kP?zGL=lN1{yJXlfa#k%04F!b4TTskD7Dfm-1UECHHfU|b<c(dV zBehU>77x`mC3a4tp+(oyn2my}5Y|Dm=j!1`bUyQruY7z}GD>)Oq!yHIB`p1-nTtS3 zzQlA$8TFz58^odlYqK|S=2iFwLSN=Uc3FL*S`EVe-B8GU3F1iwN;e(!+mi|pDeB9! zn{4mqsE3}@A*pZcaL8+$z`?hsV({Jqb4%L%kO{*cNT1tJ<}@}ci4I(pHhJyEHAtXo z&?y?mDmFevg;6}D%zxd6nQbEDuTRa1qO$meGfXQrR8Y~yRwDCG;q>8)Xgh}7YE$`6 z>FL)OVVzTqVmP)F9jG&I<&&0H$58h-MQwcKeLrOmSfT@85~#PcaBwT?5&o%~@AKUC zzt|PLQp12UQ7ACTB}7fxsCy*mYA^&y*F_{c<mLCO60Z%TlG&!p`#@H%32RifPSB>P z-Ln4TGiFR819mWMb^sc<qn32Igl80+hof_=>Vm6Nrcw71>cZm=v0iwUk{qDZuKtAE z?fFQ}E;J)9jzcvKQn-njEEXtBd~?nbn>RICL>HM|r#pP~^ZEJHEo?%vR^Q@?m4$G0 zL*`>xU1R${18^Mqrx$j6dizG%$uiOAcvbO|@msQV%z>h!(|0Jp8|q&)x8}K+YuDaC ztLw6coee8}6bX4Uxi;Ts@1`Rg!Lfx=+50G#>F2VU=+~@rj=TTpFCW>XA#FqWRi=+q zgZ^lF6A?>gNkg9;zXe|L;}n@4>dB)#B)U<WWYyN)QG5+RWx|Xp5z8<xaQ>+>uhy{( zo{NovG_aR@1D<xo^h5#&jJbXmmp;{g1JDE<DQlBXAQ3Em^rk${AwGgYMLvL)k`5tn zrQd?O*>p3yBmg$U^lfDe|DLKEQ22@=Pb<eYHJc1X1Tw632KwLE8n{Pr2RpF*_kz0g zAfiRBIQV^BKM}feZd<nviU>Zk0sQiNL*v!~3I4GO_A%dw@=bg80#pPTh+_v6>YM47 z1~iN^Ee%QQ6k8Ie2F2gcr9Tdnm`DFk_E7%4)^y&p1B&WZ)+x6>vEx7f2u}kB`XM`h zusr$T@EAtDC4fG49vrM0POmj0njVE|`hAZ~cI}|V6>_`Z?rS9RjUN7&Bs|t{??{0H z2#8ku|4*p)zgv1&eY{*zEz%wQ$VH&C=9Vs?O}i>cyOuBV<+;81&c5#{D9KYUpzp%6 zE}kxq<xXdxSe0ypR-4Lj=;^es6{?l1$kJX`X}15KpqtXQZJ0-iffymmXu=uIf`H*L z88yWLe*zk$*~=-t_*l;J9_M%hRi9U10e8E5y{{g3<4WJ<)UTTO?qCKC%Nm!h0!=x) zOj(#&Kf&HR&xkhpdV)%belH30cK?+3zLD<d`@f>mozw(=8>lQ<wd^o_(gsbJw`0vw zZ(KQ(+GlKOnsw-yB0aljHKX44E-){XObAe>Z!pYAoV6zTC-ltPFAN%36UEZf!v8#P zP7}>WgZ0kpn$d~;oTc4i%CQfFgn)bLGt@ApZqpv1gbt7&{?1vpF3Kk$dc~@V1+}oC zh~d==4Y`P?ES8J-mhH9#y2D73^*nvt8PaZLRnxmsEKST_PVX)-G7<d*49SwIUSRf* zXeU|H+lTg0_^i^RV}$hWM3ekedyn>t|A7zTelq4d{L!Bu3fEs4vDFUL^-izT73Rrl zj`Z35*U-YUra#r*7UxcMfX<_1^(J%dH)m`J@10Ym8=-6dayJ8;n1OY_{__4f$Z%km zGYS<PYM=#o68=tP#Ra9wycR^3^Oq8M!ceSF<93I*f7IT4@rkxq3{g;>q<vP?jA`30 zk|l&bpUXW3<TgNP=dqkz@~w5yx}gQwaIK$th9etD%syx^Ja?XX;(OiPrA!EM?x_dz z_podyybr{=zj&%7Z|5^m7nAA<xD`4|&7pEC{ejRv*k|08Wcvm2LprkqUKVk9<Yond zY-46b7){%d37c;0uLiyMi&u<TKUmaM28in8t@2L^pNSQjDvm6yE&4>s7VH*D26s+@ zLoL{5KEZJt)~N=K{}Z0@AtTMR`W3DBKgZt#<$FQzT0#8Mc%q*S^Aun&xR`0US`^(O znbAAURN~`S2IjOX;2>VJQ<{H>9pHx}VmtyTR%aIeTkl?lsWQI6SR2toM3n;~DCe6z z8$WogTpE`j&f{2a1X2z-n;LO#(U@{4;iHnix(<JGPPgSEb-v!_lQbOuWR0tgu>|rG z6%8rAKy1D}Xi)JweIk0tC^^uCIQBWC8$aVXZ_ACIKj1|KOiSy9h?J}_IcIAfGX<N> zk=(Dlr%25Pt=uT{JH_CD8-OJ_>>eE_6hqIF#^M>GJCkJm0a=njhGY)Sg;SX#<#@we z>Ygzs+WhXR`s&BEEyH_2OB6+_Y0Q)x<A6UYV>p%x8Rj)iaQaC;L*H8&_7;E%#JA-N zJuRgI7gNuGp%Nva@v;vBYQ?H8n_FW&)MrW~719GuNv2YiB!%=u1k1#vW<AIib4~d) zbT0D(maUcmMsZWenzg+Y^k>5gFoO82X<NdDXdV0}q9xhuh0(mpj(C^|wH*9jJgW<* zhtTRE{55?_1FF^3va%YT9#<x`j!Ff?o!)yNEoNZuS)?3vSnwNms%+_1)s5~pw5B(4 zPiEU^jQTIqx)P(+YMRcQHZfw&c4><SZtGpp{#2|n%{^BofAwc9^efTX<2WRhjYvKd zapl37D@lurs9@C)_Y8ZW3zJFc_T3zds)ov~#EnWYc$Vw#{sM1nA4r@macGNQ5DTR= z+LYcInSqKCeev^xc_R7|CNxa>>;vQw^CFHcL>p)t(P$Q9BxQ2qo&{?Ip<M?pYk=`< zdfz?!Xn`S;>k0WQiDtI2>-{~T6_*}@45;C2i;1vvq7t1eKSYn8V#J6H``?o9!jB*@ z$*6>Tu1Q;uaeHQB&IrxE@bL?(0{*Sw9A!aRXMt;CC5ejxL$)j23g}DSA4b-hrp%hL zX`mTC;7X)2gki!tb2`ZNc#%`}A*kTEcHxd-G~-eQzb_9_rN34kO#G$FRzOQ1<o|NY zCYs~lC%U1Wz2cjeAfB%M+zzu(NzOrto_$=AcLw^6G(np8h=9?;1@O=$$b`9CE{YU` zi#0x>^7q|F`_~V~3~E!W6NphF?16#cW_p`Iil@!Ow!n7ZsAc<Gs{+5gKS5AJM+e-B zl)_wFkDZEu3bu*O@#aaOFJ;JULw$W0LrV=*&*=pl-9d{`7{t1z0j&K|7!%sC&epAw z9CYld#N)IR-!jd0!qoh=qnhBgLuy)>f>EqGb^!_ufdO<fr?bLFVcA5K0r1}a*3828 zE_iYq`SGqq66nt7(q7yM!24cCxxSNYlgb*w@`GbG2EY)tE5cTO0K>)XGaGbkKXYVc zv(>*4u%cX|buZ84TO>Eu&@sbM(!6zk`mi`!agF_Lc=<`0Ibt1-aP+h%+8kwfN0tpL z&-_~;11%Up*CULxjN8*R(NVlb7+nwjGwyY}#tWCzQ*cCS$J9g+I`ninR;xIxvJe)@ z@f9=XZU3!XHUx!OtG&-(mv7oplnaMLL9bG(j`EygDMe_!qJgrN8wOUQHVJfwssJQU z@8_3DwT4-(iJRI1qpZ_o=DplNXKu{=FvxbmS~7_MfRYkDR~^U$b5;g9$IA<$;)OKz z%ts1BeWyG-H4x?_Z~DoI3`i^Gsnv#Nmj17(M<rW8K|<mR7N%NSbQ8!P3I-efbuhsT z0euqw$Art2*Ar@n!EMpzljtKX>_eKzROZ|v8o^6lhc4x+g)9NOwqYB+w8cDGPu(ue zzevai$e(KcQto8yPZ^!{s<QBYy*Ey0j7-uS$#IVIS_hOK6?$JOM|{<q^Tc~9h7%B* zGfthPx*&%zcq0;hq=F<ed#b=EE^5}C$RCZ&--uo52f~iUT2}{V%e8!;7cMHGC;5r^ zo2PgsZ%jqIvR#OI8E|h8NF(h`gs9L`Co_E#BCfcBSp%ARufODmJiOWRr1`E?ktX?O zksJO%mq>n|aL_=}=tFaQ*IrijS>eX8b-2(8_x8bbTnO2CWeIVMl!`Zux1j?uj|Ge> zcs1Ebq|BW0OsaUr!5CpJ=;2dR7bRgmRHX+c3BGV5`sr$!br8!k6rf(pKwDnPg58L= zVHn~3kZC|P$Y5u89)fvP?U`B~eNgN1goC3%wfl04rb!yaZyJL|1EWuAAcgyZ3|oy@ zTYN-(AKcIg9Gq_PqlQHIO>$z$*YS(POa~Brf67VhSTY9=bqty5?s*X=#U+6_vkCYF z!iU5NfWkj)R-2K6Vc;{mSmP1?-U%Q3e%>hS55GQByTY=O`Br!Zv|>pw2C#rB-4vvn zIO2v9^>@E6dcv0B0Tv+%dqu3X!j+Gd*nsi`qxKQlNc1M&Su9mqli2^!E_}-fT1dB7 zxPCC^+@${jMMDBbNn>IYYM;?tBeT>`Ss4i;Vhbf|PaWi~8T^n<Yr>;Y;{&Cvx2R43 zYY|9jH&1m&X?Bh{XE-mLn~<+QubFR<RVV%c7SGzxq>&V*{*?+VaFTm7ps<@idrvam zT)#QA*L46>Z{d?l%Xnq7<Vdbrwu$HKqa~0v9{R&Rz}HEx`D&W6kH{AF^6xs6Z?3e0 zpQKC6E5Fy>eJV>5YEV)APsELp4Zt>mYwr5*I?EZJG3X30hlI=Q!90@=UCz&BThK-B z$3zK2QxbM=$mD8QIYk2>Pxt2TP-&Llp|V1vo^_ay3v9?A(L@g9S2nNf=}Z@<fop5$ zZI@%`;S~wI_c@9JKdz9=8@)AN7x~&($!lp^I64jw=JU*T!n6GvDZ>T#w{UPkO*SuF zvQYP`Y{kYYbfXM*DrtA7220BxZj4WkD8w^!_rAQIM7x6Dh}ZlAj*zE@l2oL-g~%zB z3-?v)E7RFb?~6W#oxY91w5#;%_4A$K`UUH7a*W>m!r2!tP;p$B567&NBsBAweOn*m zw)8bd+hf735JcyxeVX+sS@&{R+=Zz}lz)OHV7d?$&QG&q^Zc<n?vmBLAb$7q{0GZ+ z53y}IV${r7J=UA|nsV(M2-nZkxBU3gyH-M|NdM1<4Igj!9x@+9K9{`!LJ8$HWv0Bi z%dL{cKG`y(_dvj@_Mwo(Qz{?Rr_17ae!c}l;xyNrlEfsY1yHEnOY;nJ({bbY^iO{8 zfaR`<^qLg;HfV1BabffEcZ@KgtQ;*+9XEXPX<U?#!^bcG`|_H0W*;sSk51}JI(~w@ zNp<eX#6dHPR)*gKLalOAZHNVAkAlOOY=<LDr~@aJ)gUrkVYA8Ww7F0)ip~nbbGR52 zC)LY*BtxFdv>(1Cw;b`_Et_Bwyp4*2c%Apr&U}i$g7zMbrO?gVl#JJ`KEhL0Cfo2o zKz-ip*$7gMsFGolhKBO|Eoez(2ro$tnO;-@c4BITkhwJ^J%lEj(qd~d)$+x^609cV z{Bbvx%UkbU#hn=C*m4<;GCdBroSo#zB5fXN7K>i~M(ayC7F~s2YA(xSYkV;14iRw) z6l7J{BM${(LNqrJK8h<cdt;@Lu8NK6VsRyNC6<_M&3W6EL--Nmv4mN%Iu|9}5PQKN zNu-jqi9-YcAH22Zp3Afc4m+kokc8q~bh<EBTE~bV-INZo_(&X`HZ?=P47<zx1@vak zY4NIP8zVy?6`+OKJloU5Fy&^~th^Hscx4tY+E5IU#mz82WWQNGZ$y@d+ixs3%NVlB zskhz~eM1w{$jzaG#a{^t3AzP)1}I5&0gzL`ynG;pOAPMjdZ2XwL}nNt`E5LR)K-j` zY38_n?m+Yd5XG=JFQ-8NMd@fyzIeSYEJLV*f5{?nF=v2bXo*9bPGzP(hGlw!|Kl|7 zvaI8_oWf$xeNje5*0CrbMmY0qijxObtkQLHWqSNnFAXf-U1y28Y(+^34Smy8(kqLz z!}+aC68a)E*T%xLA07+GysRMA{lzoF8S@eYENSSf$nj0XyDBHZ2PvbUEfx`-wL`<M zAex?OyogMD2{}#`6aVM6%n;edAOz32+&<Y?^y27JmupJ)TNVZ>SD~7;OW-1TdDjz$ ziEDJ{wJ&c%sr4Nd5v&+540nrBDy2Pw>Nj<Bw0J%m##Aa-Qmh|dQi*w{cz#oDH0V=2 z^P)S?XQ8P=HIg5V1Hcy$7m$_-l%w@D`c}-7DwZn1_fAo{%c)VsQdpK6QcVO%f*@_B z+k*6so|A{d)mX`rFhDWk4g^rv1tpDe&<WNoauEm5S%AK{44g$5OhQ`5DU&$w*-bQZ zo?nDpqCe7gjT8qtc_~AHT>dQ2t%wClWE2hbKw?9d+b#iq%Wi{)Vzd5xF3EZcy7uYh zf{+%TkYTwYzClSET-<7Cnh9&12GNc5x!NWR<T~y*M0E5Nqj48oXAqu@u*TH?mufQJ zwMvfxjcP>-$0<WFS#hzHRkwq3@$#;yV3BonUG(0ymT=Ycx;P@fO9+`VJe2OaN0~>i zwj$U*m}sD3_{qnlP=sBON2trEOSze5Rva=h#W7xuUbpH1P{I^jT`5&9E)UwreM%QA z#GBG_%LbWZKl<Xl^g^N?7ny$xKYQ6$1{WfW1<)k;Z*|5wM9YJF=0~STvF3ERhPU%W zaHmCOQ_bTmHc|RF6&j7Mk)@OPpME3$g@Hz=LC8_dd@EqxUf_UXFHMp)z+@ehj6|I) z77Y`(3Y>pZe2^zVWcu4GtlVvH4mc}0m1c?I@dm!-7t1q7J~5F2WD2984+3bh^>M~^ zNuDyR`LNpIP>Gu_BON*+{E%PJ(3dZfdH~Vvzb(v&m<)z=MR*_E?bfd-Bc5xI%hrT2 zoc_>x!2secAs_h1d3$IN!0QNi!6(1|F`ORwv+a*hheniLxgiEj`EJw0DmoF}<i)v$ zOv54|Wky(24*%w1xgwR)ad8yt7arIz5dy<|?B+o~8zSeuYqz-VU4)lgVSdDJqHmIv z4br<Ft;?tKq&`S;pidtal+QYTS6ER$;e<B85I^2rxm?t`&;sDPe5=o$f61GCoZa^V zq^wbOG`rA^1IxBIW<o6%Dbno;``5oOAPdzexx0?2AAJ%Ft*T0CHI>JgWMXEjHcxM4 z>cE551jE-5txtv}_IXx8X6NC}qb021i~?P$!K{GrZ$gQ~g#P0@OFl_PDP$)?5kXuq zx+UNx3p})yWf!V4Ehh-W2deo*lON#e-hs;JP$AA5FXwH9o^ykw>Y4fh;D$cBu#;os zy)()NcI0V$;iM7Y-^8<6;-xDef61PLNuE+8!P52hOPh0+;0<fC0CTj8Q5Ou2_7GpN z{^dEH>OYE2VYjB{cpwKz?(aOGOSBYsxFmRgx1<|Px!qV0ugv|04jtiHTw=2}i6{l9 zx16rYkd+@7p*AhbcW&xr$hAK7PPd=klQTWC9xdB(Hj|<z)N2>{y7G0SyCnFRzBjv_ z3q0(sXUP<T9e%#$T`i-fir+*2oI5T9j`trbmla;2zQ~vM5Ec@CvL1CbE_N&aDy5Z? zS=vy}p)Iu|eD=FFVr3qU9_n0u?_HvMG(T~t>kBY%K}H6&4{w6<O_GEE`(y;?aowAp zY_(1Yik43I^(euv@9$P}PMs)@&KF@ZDGzn;qwx2nv>9m)b<d_)mZu|7wX^_r?0I<Q z6XrkY5Y6tm(_8UtP<cHAHYAh?x+OI$$^ekmla)UHlq!$&cBok`_q7+aSTTHnny<rQ zseDe~;b$|uF!W9)1*KmO*8QL<_Dd)I_dA@>O$BCfGd-W(V-4En&G=F5V!SAT5Lzhr zIsD5S_L-p7R<`khLI3%q4tNF6d->PD{`ZbigMOQP^Y2~5Tfb=*=uL4uu$@H_{dEK> zqxXDBdh?S6iS-MR%B|5w?~%+3DhjK2HyK%=ae|#weAVJ2KPcJ4r@2Jt_!`*!1;I8$ zK$7+M@EgVf>x%=3t~O&m_(N$C=5~e8HAZblda$Kk3X6;_zhIk>EqpG6ADv&KB<c25 z3w_sk{Y)mbA6(`2z19V(x;LeWIrjqg2Pz0PH*jXLKd0(4B_(MzJEU-zmOp3p^7!OM zD?SB}lK&1u2W)ZddP5F+J$jZ_+~c(Yvm?nv#lxPhJlsvoaz*q7lT8A4y~RyZTZ~RW zHN*aZZ~%A4Pc0T^mS^_JD4pXE0iZTdapPj%Edki?+Q>gKn2NX;EY`2+bCJOfPPc!x z0a@xknEe#?bl&GcvH<NURLF&9STI1OfC8~mwBV_vq;zky)W`QMm)S~Im*30y2&`q~ z4*=1{!^1~Fmdp4F8ww8S;o9@Y*xwPb&ZD%^#k)|LM~TWHn++sm__j1ccQW%Fa#eU? zpLP`kb53Az6Jouom#aR#lo18NhbrQNR~;7*b`A^!sWwfK&og%3urKQoQq~afK%p0i z<^9$2$jaLO#MUbQU(cF|F6CvQgwW`$4LSj|p>Fj%GG+bCM`W!+`7=S=Eg?WEcp)hJ zoS0K<ahNQEmuhN>L+to5_V1IO)A=n_=+V%Hpx|pLnA|cQC3OFV$lNz-mn<QS{fl%L zWpJzgY1D_;Ol{dOaBB}ivZ#VBFf|zqF9EF_x21CV2mW~?ga|0}H$)JUodw&RR2F@a zzTn9?G^I8(HpWWjr;~QL$_WQ8(xRgxXxc<T%QoBzG7Je?@KJ#6Y%QOMg-k_9>}tmt zY2N!FPBN@OAN5!u9_xVTXJ$c*;BCs=uT+e-#a0?O%OZf21cyUqiOM_em(^I>xs(Zl zm87YnRH-f&A?v>;yIay1V=7Dae+W$(pk#AdA;GFLNx_IrAuF_}r8mvEZmjZ*TYCY8 zaGR)G0(DY=6<BnI<S%4tKjklRP!B2y1#{C1>qY8Cj2xC|>HDe-4!2kfULF#dT;axV zaaT8+;8Lj{`>)08y_>?Z4P_0q+%YPb0{=S$mqHh-k#Yo4Q7W0|Uyax0TWl6$6Sl=D zq5x;ebKHfIeB*_|`{jv;NIleoI;r3Q*4D>N%7(esQnm+$;3pab6b{oI5Kr)Woz8w( zmn+2Ei-T;1gYd4^h;>7ay*|=sAHAHD-T3l&Pl=w+K4Mh+8XK#ftydu?f4Ur8>u<x= z#=SGQGMv8JI)NkWNCKPmEgW6ETVD?3$&R6$u$Sljbo8n`CNhsvK$0#IlH0HxZ?YQy z)qZmY!xBIWVp*pPA#{J+%{JpI#V&aTRh|uw;&7I^JwjGz{vfepeJ?tgA$Q(|Gewf& zN`5?{p;iWAO6b?8n^$=lCSU~7rQxtw&!Bd*yUb@;((vxm<Z4}C>+E7<ZJVRzE9L4U zB|}Hp;>6^W|2qDfpTq+ahR}}l_OS!C(Wz*4HEd@>i}1aX`0^HaqHD|ONl#<1yxvto z4~xtKFSEq|2-8c>yOZqH#)cqZJ<m14yJTH&F^3a7VV`VWSbS)anAjViav3_;)qFL{ z$gGqdfmG;E@HRN*i~;z%#^ECFk?^Iq)8EjFAFJjC3_LLjo1a4@Tb}SM09L-TjvlZ5 z5&o*qTy7Qrm0XIEH&Nz3ZV%~AZXnBw&}H%p60W>6N%_a9cNMV{?c_b@d_xir4ui5q zrzH{h6q~{L4KEON2UBa9hhjukO8tql$QvHp06FQRlEWj@+~-c_){T2<<<IJhRTZ&Y zIQL}Pk?Ave?t$0N?ZYtGq|i;-#|13n_}fdQ7u33spe@LHH&f>J?SnJ)fjbN5!p$gO zKIGgHwNQ{=^m2$-Kyt$FKo(JJlEXj3pg5b}*>y0cznkQyzWjg0sz-0;aDh@`UpsSe z>dSm7JV7NQgtBp8J;iozCm-O08c=kZ<`WJH0uV&=Y>tw>e%NoJIi1RXcI$j|91f_h zX+0cFc-tMR@Onoj8jQK{%H>z~rp+*+sa-w8c<sO}bYn<5wwaeQi}^hc)k?g8EH^cI zIBx#bza9|yD?y59>@0uqC}Q?k)--uPt<{kc4%A36yRmcGk?tMoxPqYNq>r*}fyUtb z=6GP~9{wi>ZA=alC#1^n&Cek56!N*w2W9$Nla@^g+x6mr6EuZ<NFtjX$9-deje|RL zKQ%OJ;e!iIlyGviXu+`PF-)C~%eXH3&wCw+YV*hK;YRykrZ2X|pE#IO6gRwAQG^fE z#^pPia#N_zMNQWgO2otPc!*g=+E!djJp<!QFpktm!^={E<1~k(Sc4HZ@JN?STMj>@ z7q7EFoSIp|W0#M*Pcpf^di%?nUB^9wHxZ68ANTs!xNMGoGt`I&+58O=++xq;mqL&u zk5@LFJ4sGT?V-BxMCbbJu<V0dc`N=Lb71L5pmvQNzXOzS!Hp!%wTwvk$i*U@ek_Es zhwh!T)CPlXzHP5I@J6@`8RsL>qreeI_rfv;jqhDlh$dQSRRCfK@5(0TOD745ya%Xy z{)3?KR2-nVE#DCAIan*QRXM0Kh<*Lq$^9};YP1Q2jyxWmWQR}a>h^(&%xG&BChp@D zheO$k1YA*xL>nO2+>!^e+}_oJNAO)p$q!Lo`g_KfPb*2+KJN24ghSaLe9BQ|2ei=D zV$}WC%Q$1Se=nVZK$Uw(WUXc+0AGUknEP%fN%6`O&MZP?qN6Q<(Ova4{$I%7c97PZ zW10em9=2E=04HH!z%2@7U%!MW5B#DF-{iZad*;?r!|0|B7c}KJeg~2M$c2qp0F=cJ zfh`V{)kE;tO9dw?XxKyjC7<u@E0Qr;nTPH)WN{{UK(h?eAA}Z^aX--$9k++d{`cs@ zLON3re;^R5&_@x)f`9Lo{y`xAIxJZ6`N|~jVLToPK+%+!T)G}SE^bg3+-pJ`dO+PK zoO52qC7e8|3ATYvs7&c$O;AxUGVhikx61<r?SRhh5gz%S6W3#WJOpp;w29eIWlye( z+gfbT4Ez1ZgG>1VVEh5Tm7nZ^j*}H~5I(8YU8r-!TTnD(c$n^%{ZfxiO6#4earNY! zVtKh0wmy2zX5wL`9H)dv1@!d$v&h;~UXl|CbfzO9m%e;%#1w%EM?a?40AFj`EbsLm zvaX@Cl2u424v+H9h{r*q+hjZ`1p47+h|o*o!usMf4DvhA_^$GEg}moA*P1OA3w!oy z2}gIj1IMS8H6E$M;O%M-pM|jDm3aNmaw)$|UFp0L@H=X;Fd$iJPG?ZgBRDCbYVMa8 z=z?}ro51w99!>o5I)<GS3Yxre>;nw6xJ$(1#PtiA_bxZLMWsf(<av0lEC*petmjBJ z=DyiStNho0)AseJKtGyHcO4hNbD$x9h5fK3J2KCYcJ<l$1oHBy;zONRAP1t06*IuS zq3Da}*zLZnt+t{N#j#?<1R_5>jj-k901{cZBQa2ANgx?wMqYhgR2SK8dMKe4juV`M z*B&>Z2Ar!2N1+`WV}S@*-N;N34X-9p>k)Wo=+eD2_X&iZqhM*Y^uR^70%~*fj&?>t zyn+vJ6&5+KQP8Z&@Q5#rJ+A<gf#J>?PQoOps_{RDhmzr`hKy+Rw_TSQ9VcQ4%6vXK zsVNW@r03$$C~*h{yfjDwyEC69oP5cMN+p^o-f!9Jk|K=H(8N>OWh+0eiYpvzN1)Kc zX$H9wRS{r8+&hWVLYTmt{HX`LNDhkEC2V}0DVL!w@6iSUxD|@KCnHy5UAc3yq)?Ni zNgtrzp7>lu%#?^|xnPI@hz>5>U7YxR?%ToJ_V|9ll5R5sk{m$DHLk=@j&aVCAuTs` zONC9(6l*JyAd`upf^Z*1G~h#-xQjO*S1HlP63DqY=bil`uOZo<TN26%6qqHMM=UYE zz6bY0?VR&m#V={4?6DK<R;rjP-bYn)z)GJe6OK(>FLA4+khlZOl`8fs@!kVeDnAP7 z-!lSYqpEiYk`44kJ0IBTfiGwH;}Rc1ALZXt3{yG2n1DpI^x965%wOey3IN(knKtBz z@`@*51_zMjbw`*kQo<Gpk*Wpjh$YlWPrxigyN`J?rkX^zlUU*wh#7i11WBQcR0>hQ z8}gS>9&p4p+4UBvR+s$2nj1}PAFO<54E-lXidp&(8ms47qz1A1o}SG`a}h*tZ!%&r zsbEtP?ZqW%T-={aR}}xr(kkW+ml8~}7s24V?rg-d`z~ZfEc7?cKq@?hgG+({2(*18 z^<8i)tk8HTDm6rc4rrwm510;gS0_3GxUgM*YL)IjrDZFN<`tujf0mpcpcC9AvD@p_ z8y;F(tLNbn*h&NFK1;2h=DQL?_^zu@)Ne1od_CBZqH4aN2-0$e=!zM%vewAX65DTW znM><y1xL*W<;q2HTMy?}eUyp^gG!R-9%z(!pnoc!D&H4kajlCV(Y+$!1)}0?-bdgp z2NOa6<oxPM#=ndo<NCjc3pYNmd|sGTjUjMBd?KVc_M{yR29RKdhSVd)A{_KAi`eh& z?l0w@T*!4Cm$q+#;*UvS+duz3mt^NgbLhiJa;U1!i;<`lfj01NWKMfbHm~{!T@U&2 z6Pg&(-;e)+Ye(}usF4zb!GW3!V<9jU-19*y|76*5&UC&<EEl9bc{ILK7jRRVO{H)Q z#@r_dTavzsh$ajwiGkD{T8*&LUQ-%Y4UkiSKV~sPNPu1cPt~rn>|KeEXfV3+2ufwC zJ?`;t?Y-Y3XjidY!5&we7I8E?uDb8cEO04pzFbg_<D;@N2N!sc?&*NkBe8Yrz6-iL z-CdOJ2;yo0&wnthXkG0S;b8~c>Lg}fBG_9{`m&(stMQdLy^yh7)S^o-2K_+__AO(_ zno(yj&sLup<fWG(^s))PNxhVaa6Hr@fj~P4rL6IvrV!XXFE?{l(mZcgD0>=7=w>HM zI}B}y>pW?+5S6=MxK=AQLehf@a#U6mJEUh5;V;60@8chmZTCU7$H%5~P^-wq06Ect zw^&{?+&3+6nUDE5u9n+`k4=L&6aW8C1JfRQrIoOKJh#;IG^w+_iz<Qo;B;9Dl~O-L zFW;(UUb4?XHmSi;_KBfh<9jgK9tlEnFNzx#8aRmh)&^Xz)dvx#iV_tPNWvcWF`k1v z7vA!g4Yydefb4U-;&^2oHeudrchB9<jAIKdAX#F84TwYo;7Tdk##-{dc?n-QHHOwo zXczug!w-9jm#0_(t~@RG#Y(=hP|69FEy7F_$g)c}l8D<Lo<^0P1{%T<#Ui8QWNwC9 zZ>1XCQC1F*)fO@{-}2%$X<hKQ%iDuB@MUW|cW%YcB#PDFjZW0B+FYU_8UGHolW<2W z-h5xjL+Lsw#M+$If|v#Das@Gh<kek-rRATvavwf1WME6i(~W`9UY|>%K>$I;pL$QM z>}pvs`KLvzxVN9emN%+BinU|I-9gJIzXV@=Ya}-c@tYKmnj5X~Jw;qTbl|BXgvq*# z<xq$Hz@x4oHUd}?qy*>CjsvQ%HFF6zG`E*hR|Wja*0=H)ULb3^hbQk^XyyKf-Rbss z$Yfp3nYhHIGhh_mPXZ;wga&Hy|Dfih#gf*m==|xj<zI_JZna2}NprMEr}u}ljTr{N z&`k~K!H1qSVB-m~4eC>R8aNYR`N>vPT%k%n`*la0KAlLj<VC-*DL;44{L&jNbwF#f zeo#1m$p>3QoiacwSo!^G=VfgVR}H8a`d`D$a?RywsS3x!wC`<ioe<Ah1(f4&A_)9G zM5|D&dm(f8HwU-|;|~NoAIt@SyyCV&-uhCVOX<FEvE=2IApfCljxiqe4=Qm`V>if) zA@!Dt_MGApWG!mto8D317-b(Owo|@h)yGgl1aQ*Tn*;7=&p>(65(f$;jt{J@Wg{pZ zMr?u^NaIVb!<&=?HdNs|YDG*od}aQ}Il(3?njNcbOGt)Ik(<h&%#NXUI+WhapcMM3 z6ibm0ZYHP(cTD~BTX0s2k?+4toe?OWN`n%5WE8Fy$J<VSx9N?8cesp(+?j-U{oA1j zpE{rq94Dok&^bLhK~LEIR8%|+jv%@&vI>4&yIv}`&RWfmM``NngdLXEFXAq1;7}Wy zs06mxZ0aCz-@ya!BgV#@ua-^e-^st;Mh+PdrZJP-vkWJFa|S_TT2Jo{#*&}C?e5!a zjx$y-yB&`!W>N1zsFVY&+OYH0{9_b$N4iU*ii?tZ$PB5Pw+$0$zESKtjf#{USS-(U zX4Ix|N}^h~DKL<|PTVzZ)Cn%911#FNQVA!j4`~K)JYTwiL(@{$J?W+rYU&zqv7csa zQp<z%6$0u7%fOZT+dx@SEoC#ydw2&h3}%)u(L++d$5uVH^?ri?8{~jOBpUG06|`6# zS+kUrZaK+=EuQ04Wc2q*`Un@|`39Pvs<Kb8NE!?f!}url%C0c;;WQW@&q%Q?yFpLY zC=}KvY*XH!#=ZkIU(X9x*vq5p&Byh|=J>!yOwR(-fRU_R4V#uWP95}ITYtx+Z4_ub zv!$^>=#%9H^Y`e^QMSjpq6ZgTIDg6d?25LIY2LaXL<6f9%<o|+8RNKSn@{A|o}JC^ zN(8vY8{`^ORSkMydL=H0A6kgXpg~X3${+vm7!fG*I1C)9!b(|^3IfSP&8nsrR!}%? z(0Y}T=+0l04uTfeoMxkvnZ=3&g*gTY7R0p7YY;@Fv-;~Pt3gRX|2}WwcYNx1vk6ex zt?pK%_FUuCM^cjcWR^H%Hd-)`dOs@ZEo}s~Iyfam7(=8ic>Nt9rWBC&HaQN8nn=aC z9BZQ}?i?mc=CvAEx`MBtS^9Jp4lXFJprCCKYx;l@h5wTERbFg8=iy&d=6~}&nf1%@ z`QvJKFxLmufF%bz>o5=>Lo*Qf0Sys0;F)KN3B;ApRGll4Us@T^^VSdiKcW3Hgd$R^ zR6sy=eE%=CBGLa1tLJLu?D~IB>+V(4(ZE$h`;iyM`U97N5{==#7|f=-B{{mrjs}}* z%}Oju6|Mcu#5FKrN+D}*dFk*lIITU9+&aSVMqlvFcgfFU(m@7x6;eB@`*MA^o$+{+ zxA*&Xq5*`uVRX(Ir%(!4bI7ePrODs{zb%cfd)pxbgEibLzL&v{HyCq#0t2oT9v?j? zm#^)3U0l%(V+_}u;~P-{$D@W6KPY#^(`TLBEF2r;l61`z-kLv!9dE)T0`AQoW}^dh z2p5%G=MZH)*9N!lZvT!H9s^$l!y4`hKVNwKkdSYB7LLVWG0(s_yTEOQ^ou6K%GFbQ z0OGCMLNvH=Xpe;+-X;Zj;!_n(Tv!OZ<>c#~TTnx=p6wVqNF^RlJ9cE3RA`q|IrlFO z;8&@=Re_qar_177>~Lj)fX{F$!>{X*20(Y7$`aRPpOFh~zOXkUSb4Gp>RDJCxLhk^ z#T>k7Eza{|R}1rq3!$SWpBd|OMTX;gcH`3|!_~^x@sA2h@w&ii&_(~9bQ5w@IrD4H z%6)sN$r*a>LLR`IcaBSzJb|){&c-owiE8@L9i*3XiZxn0PLt+F8sVW)#-b#*{WmpM ztB2O7{%0{gBVZ<RwH3BrB&$IFKjsGtvw@ABXF;x;{j8nO4jDe>6)M5cPzHWQ%7v9` zJVyR4>*`OgID@aA<4CrW**UM*+yCI~ouWirnr+>(ZQHhOW0q~(wry9<vTfV8HD}p2 zPp!M3_J7-6=d}Gg+IY*%h#p^NL}wB!G0*~wv&O8XsPLGbuAN@{tx`3m;-Z)uqbM-^ zn0v7st%I5(I;&ZL4jM<1uhQ9JY(}G21-;<6JMNyJBX`fpr_2}@he5aGqk2;x%H3AE zhiokWNP1yl4|h*xnm{f%=iUe-+n0b(OZ=`;rvtUr`9@fFK0JS#-eh9#Si_#FQ>c8W zJuXdcot1r^ea@n>drb-C3RcFn+WOLw*DOW8ox^J(GkJKYf}^)bNg3UCk~b4WuDJV0 zD@CEJMQzquHBV`{Ksoge(_BPO_th~(0(3<gMX;e~BU?Fu5V<<*wu8?cV?fI>D)CJ# zkn?N;D>eODs&YUh(fijk+bxX~mZB$o3@(e{n`&&@pqu8yIhq@9*ze|O6UfnAwRV8z zz)Q{!cWa4Wb-|-xhsgCn3few4O-h)w1Ef;?Ub=?G9`YzrJIW5`j#06vxp!h-5&gyH zW%ii@88uq_K2dx;aXnZbiJiOJPk@9J-mWKRI!P$k>;f;WPmHptmN+Z^Z2Xu$I~EZ5 zFK&irK9F5<yA12|u@k;f?80}TxH^SbmO#ZfynYPZP#)wZ#RvuXc+Jy@i@&aoGE4DM ze|3bwVAuzl3V5%5c0sVJ1udkP1g}}6JVCnSoFTf8R|UH<eF7x*+XP?hHD4KJ_5$!7 zDpEhx(*;R3Xr3i#1K_{BuHYGQg>n;FrJjfSf`F%LU@nLoqqgwS;NanX#@KW^5nrR6 zWhFqR;ZMJ#-;kQ$kX}%td{yP^KKw%7U~(7PG0$w*;$w4f9_duw>Tj{xvYJbXi=4c3 zQT2AT9`ANUPnQpHMTgU<su3gS*RjIR_c#Aaw*FUGBbr_K^8cC3%>w;zVGaM^!rFgK z3Jpn=mPb}Z8T}4honzuT$p0k>QrS`lLlCKnPZ%zlq$&Z1j>VpKDhgK0?C2%!eC&3E zo!;hTz(R<K>}LDHbro~Wgo|u~)p?S`dHno6>#>F33)c&%KHxLp?qe{1I~b}u-2u}) z=ZnHsgC?a#FfdoMhAu}ia6I$2QuDyEA&F5gwgatEDVASL%({9bLI9y8UaFKdvHPr{ z@R$;*ymNRga7NKICyXH-Li2#c<R>9iOFq!tT>_!5SoWbMQvQ-0Z>8n2BgEfdQN!=9 ztucvAMs+!#7$XQ{!r+h0_NH(4Y7sowT3zrK8fhsjkBkPL(srR*q+In;s@8%#C~4#x znYE4>le1h#2ALCLxIV(+NahkchkHYU9h@O#cq%H`N1F-t>DgUAtV)2Zc2&PmGJ~~_ z((j9j-caEExiR8=!7hwpPPzhQ!Ns~rjUG2UD~5+2eL!UJVmD5#m^Nx$qq>DT2}Oam zPO}@Z&va$PR2|olDs>}j@QJF;`o=k+FP%$bGd0={D&$Aqnt#yp9m$|6L3@Oi8vTb$ zUR~T_X~YqyOY$UA+%|1cp<-Ep1*>GB3Y#^B9RKZS%n`fV)-<_yM~Nv-9<UBWFQ4(0 z4ZvTv-WbR1my6Hfzw5x!z8r>3ro*R0r*X7_?At_Qv3LH%Lx5yR&^s1X_H+*Ew)^&c z4u51zP!hQNiiZNzQsuPeAateA#Ir%t?SN^>0IrEp+Y$gKZTz)<>@JbM%{WaMvoFX0 z!1cQ2VY|KJ4BV|=+wFP-?%?vhf86uh&xZQ~|C55rDg)wGfdBx;fA;JD?3?rNd-cCJ z3+VjPk-<?x`OO@`$9gI(>rNwILMCEpxCad^4N1ZxDAC%3k?6wZMX6+Z49Dz5X)a@G zW@={k{Yrf?kSeF>3$<WqLHkXV8YrQ|VtFtQj=vQAB4D$SzT}Bs7Qr{Q<uv;`!@J9Q zY}Lc)!(|uD>>H5wvcN22n{<o%%6e2?9K&Z6U?7H`b&MCsNN*FUbJ?30fa<v~I~Lwh zQb`hQoU<xQ(`dRD9Ikh)(oJF=q(nGTpgW$Ks)H1(nh^^f0bNbC7lcwkd={r<22>zR z1&1UU7Oq+aCnqqh4ll3}r<{;B^!yry6qv4;OfM-h%ESR%P+{0ivIT7$Z^&gH%)0oA z0O$V+R}DE%T~SteFOlF57@$P!mLpD!pb}9PMX1Ti3$hNTsVwxpLct~w;p|#}WRG_- z=?xCwGK8*&*AAC}6|u^)@?fj1G1IJQujNtQ3<i#<{@4Il6Z_dAW#RAS-2p_u+JdYL zq-A&LQbz$E{(D$ms0&6?v9h#r-vp4gMS*KkWrdu1mQc(%9~IJuLc*u@)ZUb^90#^E zlWhsKd|xXmQgcYo{sglqrZ{f98HtJxc!25P?2zEhn#9v+QbXn-Pj!=$;Lu!p$LCFU zPV5N1V(J$3<kRkFx)+3?$bb;`b|ZfC&k&9fwl5@?f_Nc~Ay67g2@X%1Ptc(uh47PM z+WMonw5nJA<_XPBcR0EI;Yk!Q2Y#{&|1*(}5f1vvmk{j*y#VS7u3sj)hSQg|8ct?W z3!Y5?n?SPj@v3-8K`eMwrJmHQ%K6&jnYzAZNy4k&DC#@@QHxf6${^}KpAz!*WK|Kv zWni|jaH##6{WX{uk@VJe_k7e_M*HEu(`N06q-bRlIUFjM^|~apBireTFn>5AoOmxO zNiQdx+^8*VV;{Pt-@Mhh!Q!QeO_wN%gL<6H*K=u!Icxrmq{IP{Tw~iFvFXw=D&eOk zFxDtMpPe$FlS@y%xMODAcpO_>#>sIdWEn?N$6M4OoU7QX1SUz_W3pFxV-d8r0}YE@ z+rPVju_8Gc3w2JS!ZDLyajuwc@qyP*DUepd>ZO3UeLinBHDC}tx0^L36+^9+^xYmB z{m~{<gY1QW#s^eF8SDRPqh=hAsfsSSrP5gDJBH#AckFSd$>&*8<#dg=cAS;V&Xi1| z-Hkn`+6CcwnrR=PtFk5si>W6x>YL<kN+q|wk{@Qu=u|?qawhq9(qmz=j)^&Vj$8>x zWh3j-v3e!9df>LY0QY3QTfgbfznOU|4Eh`f4}F|Swqg#+DDpZ#*a4T;s7uc|c$wS1 zc>B2#qK6E6<zw8O{&+cnydUik7`68Ju@k%Y&}BPkw9+`TXxW^cS<reuAZeWZcp7+N z?X}dC|FC%AWlfjmmh!tz-hNJFyj<JG`Y%JmqwGF<il4~y_^;9DUkU(cr~fPfQk1Ri z79~)4lQ>-VIUWQln-o%o^pggV2GCM%gw|UW2#WkA%7(;OaZ!m!XWjrWE&Z1GifCz& z`2F!iIQB(~tD%und46*`U1#h&`F!3ke&Yj78OiE*Xl2!M>0*F7sCg!!a`vd%++(IX zLj=sLtyoo_Y3`^#j*n1Vh;uanAw!<MEVsbmOuBs4v1ykRlPgF#)`qqmY687&Bz4Ye zJxc+ZY3lKp(J?I9^N?$zjHObalfj_Cm@|MjofIQO!LVDiM=-<(SQuiw@|YO`9cA@J z95Amt(Q5tDXkXx>$@oY^5?m&DA}Xb>wE8l=nBcvYnq2JL-I;d~QoJxycc^BldS=aG zVTe!y;vBB0v~S!xTdW!RUCmLm3=i1+mSFiIW=0r8Uvh$#Bj>|7ye?7N0@t(C&`Zmn zyGUoMHs+8QeVN0MsDsN4Wb`xLmPRa0(&}e}m1_8xMBv-c^l3~%MdK_K?E~S~dGflA z4vEU3C=3)UtILXO<fR9vbUb-BqCBZjIVy2-hE0Mh+lvw)FN26Axe+k<CaYv#+BH-e zQI;mr(o5Mbx3PYVMCewuBBjfsmoo`)In1W4V(xs^c;d*Yts%A>(_X<Fv42XX!4;*R zoe9?**ZYHUGwKZ9Xk3)H&h^iX*}ZJy_8xj^0gYN5^a!I$)a=$7|A9*dJ(?8vCZ;@y zhp)(XgN<w#w^Kvf6xWO;#~<B>#dKDVsw8@y(r8`d)Q0c#-dw+{qJZOI-|)p*b6i%$ zZg1fNU~Q=YbLG6IT<-jMKM1d%j@UY`m?%{^*`kZ|b4u(7junP9|3fI=i0^MC>4`_| zHI9x^T{GZitb1YjpchRIRUcQ-7r&p5K{7?WN$wl>)8&_;BlGzfLmbneK!Yg9EXDXC zNhs_s*E{@rIC*_j*e7%ah2D6F>pNjc^&H}mST7Z@x2SO74nt1)ZBRfWegRUm5J2M= z*(TPi{PFNdnYA-E7nyW1x>s<;bigNcP4<IH;eq?HtP3+z9gAY&tN)TRrjPR#jr!Z* zF{;b~uTpFdEoLMgB_Cwkq4=*dQMjLGG+ChX#nkV-jDWnJXss@MQf6G*=1<IjBtdNq z;W6Kj1()8BllT8h5;!~khkQ+mmz5h(Kna=MA6*EH1fn__3Jx$g97d3(A-s)Kgbhj! z7=(gNPF_h?)d_@l02~1XmeuyRvbWr$ihgE=NuKCq=X}obe(v(x-CVt=_QzVmj2yI- zZOKl!1{Gesh23?;)gZ=&)Q4FQa4;Hc`TKCNvfOv^0<;Hnim-<30<)<v@wPH|!GvR7 zo=?mUTsr9VluTJzp}ce|5Yk_LF0R;%7*ToNu@G*&Qdo^V1dYR&>Akm;vE5>%_|LsS z=)zR>B#;Q$-vXBv)!9iH>@#cSae|m=2*`WPDZ%(MO=F2|O<%pzFif^Wy<Zs|p7u6b z?<`SIwU>UaPS<g|Sk{n}-q}3DdrOxK6a}V_ID_y!6{OR!U9sy;)*U2|MzXym%kB&n z;e>#`h6t~!MbysJ1ahbZd<F(yX3-Z$5Y?gjkqVv;fk%><7LkQUD87lDks8pIB#}iL zJYC-28`pgX{N$j|0uh6||EwP~sGqbYAOJw&kF5LOuHS!`bj!-pc3a9Ak7fu_wvA;S z1JdCev4QbxOU%eBXF!@|Tn1{0oJpG_!$w*?uEGlVt9EhB88S>3rgxc=S(0Q2^F^|6 z1rLOQ3Z!T{^??=8Wy&NJ6!8$sC~d#_@;-n`CL7{r-DX~|9^K$`bNpPg(?83b2q3qt zLO=4WoF{9Uo6q6#q;{F6v~*-Qqy0TBkh52mvB9_(@5mmam{wScgN$|NL`6+$7XulH z#|9Kp0{%z@dZT0;4LAT!x!NlwhqYz_x_gOeEbUjBfNxIk1fw3QPdfE`)$U_RomZt? zm#PD1KT|?$<Aelix00QmAp9aFjOnvV@q)`I{$mwd6@@vZIcz|IufPQhSsYIWmH6U7 zyd)_5S{BwUWn%vm&_|TLSq#F6jsA$a<mk5qeAg7XMX*%Js`N`z=TLMk!Zp0ZaN>?P z`8Vq2!${i&1T^JaH1)D+`UxbHBt)WFL0Xl-=~jTBQvjEM)#OzmxzNFpUA%^HrFSAd zy?WvX+A3a0O7&YYD?@e*QlcYWeGFF%0S+V^np-r<CnE$0(ooN;wzxwADXt`tK_gk| z^bBaKsg-Bd%&#>S%UejV)(jq7XvQMOnheQJOb?x~4cDc{o<f}0k8rW&eOqf+)iZYH zRyjT81r9?DBV4F3AwnX%hSW_;Ce__bZbB-HyCm&!_h>*QSMen^0jphF?J8OBS+h;W z4vPJ$1ilpWWAfV)-$39uef=wE#Gr9dm7kw8g6T^Ov3%=Vm`#IwRNLLK?aA=>N!2ny z@o+U-(s%lP#y3wH>DkRg_;>~uL+K;)7qjJf0h2k*ojxV1FRvS;^FG65ZPu$rp%^Hy z3z}cz)HTC4r!Vi95knc>2zy|5he+e}9Rq4ugNxnzBQ<N-_iw+GS6JwmJMEn|fk$c{ z@9HIYg7!*5)+{A822sk9LG^6h*H*YqtD_Rij|ZQy(^*AboGUikqnPD`Wda3$tK;?4 zR=X`@v&n8!Cc%q$w~LQrPlKK2aiMMov#cTCSJyvV>QkW7#N;%+2X-ODu&poY$ulsC z2I?UxO!w)Z6S<gcf%8djWb()C>~^7q_vTJciS5koC<B2?u=1Y*M_-v$n?A+^#6D~q z4Pj#**R7Oc+K@nwlWr2*2EL?II@b@ZrF%YVt>hEKw7oCkG%BSzk?-Q;Pm+|Ke`L0a zU22(Bw>;n4xfq4yR2u;?+1GP{F<dHqO23M9Ll*dT<ziv7dgU{gmWibS?~x5EcP__D z-nL4<hDxMt<hEvKk|vMXlMWd*_muTmI)}fQKql*tj%>7<S0{>5C52+z_mhdW!A^Cg z$d4ZA1dkU2r(6hT`pS|PQ_N&y@qjxEJdW%iq>XfBjO0!fU~)F&$|5T$#aRi1+{E8( zbcl{lQWWdx9(mFtO@loN<b>N8LpZ3E5=x>T5{}#jBcO)eLk)V;UvrPXu>T2AW^Wha z(m#st{$IUX|Hqos!`A3OMPH7Jl{~T_3h(0T)9^bXsA6(t2oSWU0-)jnX=q@*#K34V zu7iE2R!b+u7gbDzh-7r`r{V~AXO>uA^*q_-)E4jamJ@#C=j-{V8vtjQzC=o?Qw2js z%VBc6fmI6wY_q*3$|4ko@O!>%Re6UgPTA&rSeH391QU#ERAx;%scnRjVBFn6gADcO z0+V!Xa4=?vj<`VuD3C?ROWx(VcEG?~3VYPGJEa}g09&<WT4a7HU2z~s(BAz5U2pfD zrxWWmL*2T<Gmo&bAi^t=FavW(mI(I7K16;Hp>Z#&O6ZA@q8p+E$XtR5w5Czhxrszi zYw)z*ZDb89r%3|lc9%Bb9{%l+W~@OJliEFr{Bg5LF-oGhV@00cuaEw^Dy!wQuF_La z9AFG%2&<Gx--)`Eb}Y+9Xk`|coLDANMLO=5DpJ%ZbKfQdOo_v<USvA$M|EqwqS|?8 z&{j;-FLLr$u2YUshcK*y#iomNY4O;)GQyn44a8Io%k#P2GK)Z*LHcLw5(iCLX1L!) zrI>G7f(0!ab+lOflgI}ekcf$66yX%NBTSRckh7*AINs7ul(gt|P^K7~)H?<$$4GMM z)QyT}p-JxkVUSaMh=ValDoTGyd57m*C2<CCRJvUZx5edlno41+gxcw|Na@Cd`&+Z` z_*z|!Y1Xxq+FV&X#GRjF>H|3#ST+;3<!v#*TDPQ!%6D%APt`?x$Vlk4<GC1Q9fTfY z2%tPW$17!PJ18`M+Er6cxXPQDGzX2$PCi7k08~%d_pny$rFtdd{pnVDL$5OL8S)Rw z9b)@-Fg^M9GmG@mDS%E2*M1Ab39e%CkM`-B{efZUV}rze7G~NSLdYi>bef<zVT8Fh z8J%VLm1{62{0igfhK`x*f?{;=QxR_yX`$`+^k`_BNCjB?tms}_#IX89%5<PAGafq0 zyr9Cm?pUR2*QMgf2482EQcVI-vbX<Hn*xo8ZJ&gvVVPQ1N~tK9`pbyczmXRH79r0o zju8<VZPKe>jwxR>g51wMF8phCyW^)T14%;6a0&Dje=s!o6YQTu*Z&keivOePg#Xo8 z74Lt7l0S#;KSW)%>be@T8piiFjT}<wFa*_}ZDhPZV#P``E0N^}NExK2H6?ChKr{(6 zVMe|Av(GM`$GJ2-y-yu4D(_=99sMPzkIgq$T<KFM^S;6uLVc?6(a!s}-K)>}6u#g0 z3$j1(OQeBQ`L%$yVx{LW#drnXX=KR=v)Xbtz)0QTC7V{+*e^a|at;5q{M8r>fnVS( zDr(BYa&n}OjiJ91Dk*8%iTh^f)TbpyDfxcQ--*eg6EHOCrq)O}h(?(mL=vH<SS=VQ zJb+`e6-mm>l(MSKH&5^>B@5CZu~w4GOvC(5rqoMbI(@l0FySo4H@b29O*J@^Y(ig( z8s$8AOIe(l?}Th@m)a<G=y*#tsGwF|050iPstQd+`P<t)WYmiEca>d{PjhFuKP-%p z=gWh+CBwj6eMRaRBcjb3h6puVgn9oP!sP}gRtc5nxEzXb6?HR>%cFk8NuO$s2{s{v zGIw8ChiY0`r8T&#qe&;m3a(li%5P(i7rjK60K!+l!-GHw#27*MIm(~$0N$&^e=hgf zy%1pg!!Uy6=_!;$wa$v`+O0)d$|q4H&aw@()ZA#x-d9QH8-xNEHkGn|FSCZ92>Ss8 zxo3M$t+1*mb2bo`lOX?5MYj|gB9y*>3>6TpKm%*)vVO}hdTW?cfwBBV0*%d`!M03= zQ;r1j)T)3B(+DIF<bad1wKtUXXd9_53Qv*<4u3>J4d$_u5Cz&gN?f~=K7a^mI0`(z zk_l&WP5sq~vrK6tSF=$D60hgAO*Jx{9KPsI7F?QOxOSP^dpJB6Wg0GwQQ};qO#Vls z#+D)YeoUdtDUoaJ6NPai0#AX|>zL>rvt^Z?SU-Bmg|<))#l_Qvh31SA?}jv$w>d<a zn9vZ1{to76qzv7>JHln4q%um5XZJi`tnvY+No<>YHF&(4xu&iLkCS8?3ZpyOn+Qr3 z59P-iz2QitMuI+_B*}6Y54-irpi(J|@U$BEv7=+gsF1%@A6avIRjRU!hi1vjM%z}V zEP32S`r$fp>LcqakTc@!eh31LwuYjWt3*{xF0>$U`|KD);U45_i(<@ROCZ1yKxQgx zkPGo2T0U-kWyKn!NTA%s2{q0p2>2~86hFD}gG0)3inD~ClwjYA&}gP=sg8cV8oo;C zETu>)c+6tS_QXT5S1mPS4)h;Fx42Hmwooc)OGcY==|oY8nUd`-_7~ibEn)l@=iBti zC|%%w5c;|KZ+mkCKKav4lBrTk48DTyFjpIhJ2#|DeljU+Nq2Kt-?-`dHKG=6@bAX- z!67MnJfx$lY7v7bFphJg7OiZ-FE)qcH5&&8Jep1IOjY{opTA)*VxG1H+#bk0dzhzv zgl1hz0vlhFe{<8SJ{bPkC9OY%XK-I7jfTFeO9MGvv<ePc9P)gf(BiaRRj4;%&<vA! z&#AoJU<F(Ffr#7u{UUwNC3*($sV2s^Kd_)#zw<+E&0V=Qzrc<jS>Wv*V2<nmt@j6$ z$miJe)D8O7<Dzg8B1bItZNxXsy?*-{I}@$0e7iOLf+y4K^lOg?WEaSL2NdGreuv*t zLDySs78zn^(BK8s9VDCm+rkMl8gBrXCEM8T59Xh^&YOit-mBQ*DSmUcx90h(LI-lK zefOCuwEdVXy!^B?QFltALb>4Bxryo*BNVLX8%>4}I2e8s?2)3RGCb}{Jil%f4;%o_ z(Eweo1?<#wgJ-S+rSuk2)`C0FSl8?u+fOXQyYD-omiG%E3&6jdb0b`~`5obDc6%GM zt2xT7eO_s%8iNRN-JPR~qx%%P{gq@ht2Z4s-Xm-~7MSqCyXt+ax$R!}0imL3B!hOf zhHZ<CTc;Q$wE>x-Z-8E_D+&*It);`gA)Tv4*3&_5;ZHTpe`hk35Fxfh&1hDfkgq$f z8cJlxZpjX0vgR5rkjXZ{>An=5YNmVPbv_DpeL23N;sW)L<`La*+uN=B(3@KF7?_iJ zlkxz+k3WVZu=~<@g8z%sIf&}(AN^=GJotYrDE~Ee{P%iNM@dHkdlhwuI{1BV#<}D) z+B6gVy+6sqjHmeOA%QxA!F1#|k{67P+16AUc0C5Dh1)tlIM;8_X1|S;U=o3TYLcKA zwQxkH7UVNSVI^|1HQPE#D8h)GB3c)lO#D_t4@*zg0m;p<<?iDxr=IKVYaCwQkG-pG z6gjrnaf0^accN`M=Gl3Ef{l%z!T4pw;Umja^xo(ZcGd*VHRT!NQs&?C3QPj`K;)qm zngk&L!rTXS(Mu(C8*zJrBfC3OOD^Gnu|l4>+b+qLqF8o=#M8bY(PS0CqMtGh60g*! z2^37g`SBF-vmlgVI8nsiYy#jQ?2)Xk4k+sjAR;$;B)pD9Axw`XKfU2X{%GYv)h=I5 znBPhO;t9k!i$rgrMeiJ;h~5-CA`XB|7%$DRF+?<{cI0tN5}%lT#Dy^jn`aqlP?X>n zfEhjFY{|(1wX=mV#!mhQX@1H@S-^x7sCXiXav)FfxT)e?%Y=!7=9NDjA|430a4ZQ1 zxkv(QoLpXLtW7*4JzIpyxtdS<H$egx$>~0v$C+pmzVDF+LO)?{&JzW_44R@L{Wv~| zi{yqpuI=`@qSP?G;#!zY!c(i_mum$mz-$l{di=)_GTtF6Hil6g6Zm*&ZV~+2uzRv} z3nhar5PDu5vClD!Pn>q2`+A|a#u%ZBIWZ^-{0DlqxQEG|G>RGZuN4Qtd}x<zb#aag z*0~604lVtL2;AoY0+U)`DB;DP&znyS6SxIh<zoXyj;%Km;sx4|06G3)RWRSD4sppX z^_#JK=(1-&!rwo-8IOO^wZBUxY|F;8X{egW;XUgvGPr<5mN~A4?k-jMYtdurK81~+ z++bxcP*_(BJZ2{}nIV#mk?6P-3y8swSO6MDJV{W(dzNt51AU^c(?9hSVL-`SmSPU* zIv;E84(s>*Dg+AsQgT}B#anN8t%b4miWrz{#9v?aSf>ybwHLJbZ_FN|1#DoPQTv)3 zGA2!ZWclRgxGmw^V*%AOieWHG{*WrMcmfHZ=1Mj$Ye#Z(h7SOXN5RBn!Dc`Ar6IIi z#07~|*n!^>&WAvit@y=M%7>omM|7z|^{TOummh>Y6U~Nb8R8gx`a$<&WoAOI<XuhF zw3lbMp~X55wFMl~mNOa4F0xDA38Rl?j8#!3t=Ogb>@qE*qa?#cY6hOey4n{fM#MYL zqxaSzdWqo39VLuha_5ppBs1v+<Ii5iEy6r8t50L8&GJ)!Sc&^{ImzHW!u-a|giz3X zFB21Z3akqEFm#be3I7mkF?g<Hx{q#_jQ@5bmdt+oEo-|}p#5a}eX7`nds%G8%-Cfk zvKGa6%cDDZ(#1I0V;$X>rtddtd1$TbR9N0%qihXa=t4a41sB^uT)EhYL8+o3;^~{~ zj#+3hcz}K@eyDZ>r?arUD-0rr*ckR1w8<DB0aOjwgfT5Fa6q+V9sd`}OQmb7H*^)Q zTwlArgj(7i87b*_D^^RRQP5DYmLU_?z_s1+68vsj4^#4~M83;b$?5{%3in#z>jFE) zdvy7rt+Rr>l1(Cv<pma>so_*gmEHI+Re82jN=P;{bw|bD2U{Ihds}uCOd~ZP_f4J0 ziq5kR>6xyG#d*G(V~m}dA%|t&c-ukp8n0FDhDW#=QLlEGnhy8^E>v?n;5vS{@uPE& zY0E!h=S(vJzV@Fh&O+X+UZV_a&pvCMPA5V3xf9+L9CrIe#$Ur~=i1&=&EkU4_(uYt z5btWaWrODLu@QdvU!OxX!<_W{1y!U^f1jVmPT$|_?%|f+>gB!t`F*gsTV2}^F33B8 zx=)~*?p(;1d9TiV)3!d#YxssX={A*|$47Wv&0EeQzh)INKkkP8*3Xy1R)fzfN9*oU zjheFUTpN$`vS+uJ?N}r@KF6x6cPt_Hv(Fh<o!Oi2U9>i1-zV!A7he3Aa%a0rrsR9- zSWU>1&`VfMj2YZo=?hF!Zu_@3pKKH$rITJ!O?-7Q+pD8{K}(Vw2hhO>*i-HJwmO_u ze)VvhlnsF|Iv5>sH<lKysW(_Yl(3-q668oqB#CKqAt$``#D`m1ie!cd%lqQ^=z6xB zNf7N!CF6XShRVSnN)Hj$r?=h>@f!Y2KRynpSEvxFN<O+P4ou0VPNtd6Yz&vLQr@9D zq@`A&K#>9s2S~Fix+~|Y7usHCVmp=zx%Wa>4g00lVpO&_He5qPTU-@U&q%FD@RcLC zIr?;@Du%U4KE;B=$kOOc$YxI!^A=vcHU`^NpZq<IB!HY%uZ}0>ecE`6JGF>9<qV2! z+3*Y5$tjh!zQYog#{AI7a99fQ`B$#=_y6~<?fYmPV(W*VM?m~r!X*8dT1&;&!okJl zf5aRMwptUFJSd1DTJ;M0f`F(9hvn(2(V$3tbSA<5m$vIyL@$*rWJsipzE9$q*B7=G z0ygtx+ZpX%SMA3;+|2L$$E$V#WVeBTRUHg}p^B}yWD~JlPotIOAIV1#ln}z<{{Gd6 zp$XqaEW6BVB(Jl}`3F=>Fh0Lkd(K&Q`!JOQ>4A!zX0qv5EsfJ^LOg<S*g1s^t2}`$ z`gJpI4z&WthLh=E+TH1l&^lSGsba&EDyedUk-V2KmdR>*J5#k^Fu?0vXJ(iKPJu#G z%pi-xS`JNltf62{j4W&K1ycwa)F*UAp#U3u=0Z-%raCaUZmD&zR=Nw#K&9FX!s}5k z1Yd&k4Tl&l6ppOoL@v6LYEVRfN6DdVB_jDTQk|={e?PKpN9Tig!w^<0FUVuCEu;yX zbPIqgty)kbqYf7sO-BCmfHw;}LkViS`sTjeGKqVw{5cRY3ieqBXMPRN=P8kd5!_2e zIj-}e?e-@SQJTqRD|zul3We|Iii<OjFuj0Lr=FC$`C$F~OTp1v=ot0WT{iQfy={{` z)P#n;w}=Q9``D8-s&Ydj8?)1`+M?QvobaGZFw>-V^#x9+BBPAmswT6ew*c_ij4|R% zM;ojve^Lyx^A7_>LJv%qRSdUBi+D2RG1VjBE)&})Ni!H;ei~>8t6?#vTXsllXk%t@ zt9^`E=$~MwT@QA`YcYR-hw$iRLtcpy>Ptm@n}Y6HAIPvpo*xDxgY#sif6X|A#>oo7 zBvQ397G_NTUnLU01rmP~&rqFxD%BIrX8?1z?ZT5X4su9ZzZf$J>)e8S<eHxsU9m*| z=O~*_=^}H@BQtZ2IS|<e*TOOJjQk|qXD8&z#_n>MpuC|6uBHblLCctLyvef!W^M^j z8et4Fc$GD~0P9Q`w~w-m6iQIW6^*VQcGOjX(S}pid65peMoYEk3=Xxbj{Q=OO~l@- zI4T-oC$34*zWp))8DMTNvF*J_XXR%#WoIKsQ$fvi2#?6Qo}mm#sCYBpBSN&l?L)|; zMSpllZo5li96S~xym&eE0)Hec<U8m;yu-SVzK!CCcliA)?;!cVp27bg_0VuyR7Lr! zK{uwJ2$al2Xz|BJBJU>woq&^s7_M$a;TE8vRIw&StS=r)Ez5`Aes(FL{~;gb^gekx zNa;+Ahs8OkPWW$H7$pzdl4G(odkUEmF0J=D_c@1nr*XZ0ACP^z-s5$wyWQ+HmZF9F zN2t^Buqvy2<&~PI%1XyFq5wu~N2E!==_nl8M5&SPn4LW!A15_?YcMNJsUpUArn1Y? zk_~^&PC-C0Euk?x%EiW^JXB>cf<VB;q#aT_YA^3o7UxZHK4$VH5Puqkx&(nJH3W5( zV0jv}f||rTHf61N(N4o86ot%=Zzy}a?=>Vc!ZCxi%On_hEwrS~J8^RT{aEteVQGVG zU>_AdTwmW(33b*gF0ed#I+(~Od0dREd6FRATeFn$II5ySM6HVz#K7U>%)|+2YEquZ z;HAljJRdY40)vEAr(Uoo7M?a1oaKfzKCzXileBOtK+3GoINuPmmYIh1)6-(zqC&A7 zbggL%F_=b7i9Es>?D<YyX@rURrnWO9l_-N93{!=4DLZat1M|b?Uyn!+2jId08fmgb zwO(dfo!v-~!;lgz@#?QDuI^6U2r?34p%GTN<ECDGvWG?Lm{$ry_+7w#dV)1ZnY|mI ztrqTDIBKgr;EVmlB5bZnC-;1=F?`3<KWCjqoxVhMhr-vxWn^igsgRF!N;{59QnkQ? zHG-%RIhZyvL5%84N|G&5D^cL1j5d)?c^qz^B<{IMA5V-j5efXeUy11O5;Ig*TI2DQ zwD_bBNx=8=t^ylg2}y2`6LFSkyl#-%Pg*)LZ3dx~LFQDuMy~H(d)q&pSwgXjxq+?k zGnrw6-6zlUDXqY(?6KBbtPi6fme&MD*~Zd?<zjn~=Z{H3PD+S!Ks-Y%x(67Yh6|n2 zW_)(wDQy|p_Lrs^=Pw1aWuzeWniqry7#HdDsAKxS2^3(v#kP=(t}V(v7YPhT;&kH1 zli|UsDpG?bj6Cb5S(+^z3KJBKJVZb&1?>503!XyE$&?{<Yj4FX**<qxXihv~Bn>Tl z>i&d(LA6l~_9hx4oq&v5{SzT@Q9#5(F;f(Z?wC|KE+`-bq4I4dCD+J-c8u5bnrnEp z&`2o@XLS#k3V7_Ve|@})u~f=Tn9hW|((j(+XG)YSWm>0yq~O$D8~XfOP9|jL&qrC< zBJfi?7dftyx%SZH&T4)TOvu1YHp^*FUzipW<1D@tW!TP=Qc?t~K955yK=#MCDyy`& zMBLFj?IauErpDkaYL7FOg}7%&o8~XbArpErhw+OeH^hxva|ZsHMT?E6=#Gb&62-O% zo5$EIh+4Ch4t>oU)-nvE?RT%kaSCF2v#5%5*&3=*KbCD8wavfhp4=LJ&^Dsv2$4T& z-$oNfch!nKqm4^v-RFD7$&_b%Ad2OMi{OaSCd25A>1O9am2UB`PVal?=?7N@EO`~g zaqQzYd5%kZ|J<$dhi`Ycl!N<{PlQ|Gz&n2dE5r@T=^bE?3z*USgH7a9+IixJ9dy4Y zTZyO{g98=)33s|R(q~tu)fXBQAX;>+xGQ>md_)L>hHyhKkeB=2pO|#FujGj*`oafC zK+#A3C;Cx730nUF;i}*Wq!U_?-)}1@H}=}e&D!7#vumsNQ583)a~*5cgIX(E&-ogn zyXjZ(BqEjzv2(nbE$NzI{w-XsEb++#gpjMbOk2d6bHfF6O)^ogG{HXC+#$gyq6z7h zFFIEQC3wXmUG1^@z2f&#En(t!8hRb;pQ(H3@T~y86>sce(JpW3Ro|Y!B^6*_UQ3gf zq3##mys_<gqc>2x&F(#+tGN5jvA3$5?i7wbfLXvR7cmu~q-bP=cDzIOl~!%btTMYG zsOV?l7n<841+DFiv|q5cda!F(;C72U+_qudHZGz9UBJ8Q;>WaI$JOIkYz5~rC$88I zlC2SQJMVa3^M~3we)#S$;%=|=A6dRQV9ar|eQ~o@8nAq&^?-!Cx2ZWX0^fRiIy`>h zFM(k<`2VC5A4y8>n;-t6`LF!r{~?w9Ck3&Q(K<%$sbyR*lFckpZD{(EC=p#I6E(_s zN?K(T6_jeCQPf{d7QM5bCfyq8d3NOgm0ob<ySDngF~YV+xVi=i{I`$=13WRc7z9H) zD>XR9_%hETt7v<qA^4G4%fhdkdzI|61%LJ0YsPElKKnj<pBR|ldUjH(VO}0=40ksz z-3aEL<{o(O9B$UF_nAX*sn#U+<IZHy%1yDXre0D&)BagrA<+~hAuSMvIFV?Y2~I^( zv8g`j_B%U&lLTrQxawOSS!<PSo+spit7IQxIdC9QHgMpHn1J<{4aJ!mFyMq9V1!75 zB>0anBp+@bjwMa(gJx#F=noBPzC&5xf^fdcBjvRu3Tb#GQJQ5UnwD7FN#*j(ka?l> zFB}v6ZIk*zwBW-t8OeuYSLB`vGuK<6uNX}HIXYH|0wvf@#H1;i-~8LAB)%mLG2zt9 zSXffyWdX06Jq;YD^FtVEQ3RYaZ6S=P3*<tOyUO3WLY4@4PW62TpAeQyETL4LO&|g0 zmwdK=yg?ir6IZ123D*ORN47{lz&MUe**-nNXW!ziKLp(4R<O92Z&NrDx1<5RxeSx< znZTr6oGO)X017@6>Bz3sYn<XV00%6Uw!m4Eyk`@-jea!m1`G+dZ{oTU`u;rKddV1D zB+oRC=-Z0L8(zErZG(7L)@)(?np7l(-1iR*(Zcxz8g7qFcHyCQ&6}Y;Cy;NRyOaoP z#3ajFbG(LBc=|;En)!4YdOb?fnPyS40WYx^kXou9VS)D4^iEmBbmO$jqq+CiC7zQb zzWoh-%gh9^f7_@HKE-{Yz%47!;ZP{C^%2@ZR7f$-a8bA&)pe-w%@Whmvvh<`GKHmS zUsh?AH@_KQ(C68JbX|&Np580SOf<}F41l!jRMxs1!gMuNNXj1!k*t7Rl=YWa9k^4M z_~r{M0cj}n?k-j5yY-XxT_ekdAG&ksj-O_<Jvm;w9q_;}v^M<VlV!HCOIkx*jM;kc zw&5wki{guBObWN44dApiz8RkcLP77UA_gvN3l0m0N8s-p03}4;20u^!5ZEmtR1yxl zKW|d{1gNSVyOc`V#ABT-E>4IcEf4nAo3MLR<uDEtd;^e85cCfV334S5?4l*MJHMm4 zYiUzk%q~{g$yj`>EAk?iKT$LiNRzQ6pW!h`*G`L*m6EI-ah2X~TT4A6+L76$qzj}k z_krZaF?GqFPa4tBW+hcRxfQbxbH=K@QlPa;OCGKi6XI}EKYNDzh=h$$)c#177Cp<u z!%LjmQ?bAR!gDkdV`qoFc3)&^zqcikM&5B6*J`H7)w<&34Q4Ogo>FEDWsiYyn<tmu zSBWl(p}ZnBLg)c`)}qs%IU2BK(QS!|w9#)e6=_fVOTq2P#T=5L3My)B>L!`Sh{Ygd z0O+Ug3u^aG%KN|_-bZ2R>d@=P?b)c9w;X_0r~whK-GBbG`3!3%(n8d3&w3CroYY({ zS-apO#_w%MW3tx?oNCoDrolqADzv@)y+2pQ61AQrSFO(&p2IXpx#RgC#YlG@NI5TR z&L%>z4txw=RGu)~Wk@TL8|+iGXUZo8XEIQEQARQ@J;(Z9FBOcV-wWaGIx2M?)O4K6 z*V!G&GLJgp_NT3J)V6_7ZC{I6uPdaRcluw=*>i_go&}Xl!7jIfE@rhWUb$xM4Q>Wq zAddz4+kBmf2)oa_Z7{ZU@LlDuy!0f)*5E~sWwnE+dS5JapyS$I&CS1pc*^kqew`&b zW7xdaJ+NQz#>p#o-80cu{2ikE*nwkp@<Vss3DxAklZ3w^7q4?N%95V;sj`}jsu85t zbNRJ>Saao2o|Ai$ALhPj;uT4^oIV^|SKU$a?IZ!(>v^m9#8rG-q3(0Y;7W%jeCXYn z#0`JweOBXJC^(WKZff%=78H12Gpdc8GdH7VW5abtKP)#n*zG7!_+G)r{q`}^mLa2y z0dE!L^U8fH!BGnPe7M_U=aWekho;)J&T4a0!uEld?zr=d?ulwOEfwEZyMxFoE)JV; z?=zx}@%8fcc%i<rv?4V1(DyLFn~X3H3-eV*M9z;6Sxp$xgQOt)g~C(Hx4cr1Y-cJJ zhnKvOyfFl+UVsLr3dkW&y)L{NbI&Q63X!@vL&#!^YAQPA2Zq##$5ku$Q=!sOv$C<N zVg*6iuZva0Qz1|<<*4^gb87tkm<c)j`VG4|ujg=J<P;S}X=UuaMHP+sJ!5=f<m5w4 zox3bP1@l8g+T96PyqE$Oh6dOExHwzY-)va{$X1OSf>PWL%a^t?$g43hqso+xOT|o0 zYpjgjHL#irQoBW<Qj2a$`;dKu|C2t0<?#6qerQPC|B8kvn>aa3m{{AJIQ}OM>DGkQ z*H&5nl4ClZ?2<{eNTj1bWwH?F){yE@oFGZ2L&;2}Bgvl|koU;xVi6|0AE4P5Q9#gk zFhKlyf+(S=NLZY-0A-_CxmQDB>)-hYiprMabGG|>nuPh@6shm~I<ft_$7zQ5-H}|r z$Me7eK>CzFcs(d8wI!6O-kpWfTx8Fa$5>3$D_Y$<2N92{02V6zPxr6g;?~f|v6&TF z?i!Xr2hibQtafZBt<D&83HY$5Q|^J#K%`K7QhQIDvM`r{0f(7WxF_uHh&qQJM8*Qo zt!OF=(kZIwVgXW_89`E(aV4!FQ;w-EsG_+)`b2aX)|ZBi(V?*t4B6o!u8f0+AiM52 zP*jjtEJy~vaAHutDl8S(muxkb4DTJ$e4r}9Zw>*dO9)aVVEH_TwrA3ksKg53`COJK z-RR=N4#X|%;ZF}y;zBBO(L*u3w^!Tw?sb068R0jkn1e%JLP4P!;mACUf)t-+)@#mJ zqB&OB>E$yHG7DnqOL&pNd(;raUn8`5Q=#%9(2pQ$UHn7YDJ|fGNJ65BXT0eV8n(LA z_xe~RQ7OB?)0(Uv3RcycJY|ilrCtn!nzY7ZKlgbZ(fM_F#-OV&*xZfVv7DJ^<xH93 zLmEXZuqAVf8-O7YS%pWxyP>?;lQ4u0WYyz_H)tqR%Q=9}q{`KsQHAuZgFvVQ#u4Q1 z-84(H)50a3Xe}q#&9{U&=5~<B4jn|{TssR(l)z$JIOoPV>$*$Hn^%)Cps=Gho$5y} zoJR}u$K*;Hg&etNbD=Nubm?cv%rnl+&F6?si|7$8)J59tfif}0*G6C{H+VR}sY9Nt zDwOLo=g$0WUUajyrrM*Ema-Kcgc5X){O32y;jd1X*)bft<>4K5^=mnDr>n#Ejh-Ob zV^v~fCICK7ueo>^CK1=>EHZ&32*E#(gfG^)jhl2d)sNW*uy}E<Oh?URo%OpTUE1;- zk+?XqPlSaHOzol?#YVu+K(<)TMuTG3l!q%erzn-vy@T-9xyeptZrwOIy1{i$(2maj zo-l@C*gC?Y2p%dh7wl1r6&)dAu@f-ib_+OO!3^(RY8;?*1&=_L#$)B$fAx9C2%3Wy zNO+q;UfNIxd?<bJP;)UCx@0EgG}vm-oU)Hu@Xd_Zt@QGl^wV&(?4!=9SdYRDEXl;z zDAe^5BOPPSs2F&b-cPb6G{0{#)Fn~Jfi`klK4AGoqZ28+nqElW0J7JBkV~<mMCjp| z@UylZb$sB);NpqsSA4jJBYSRH|Jg7WF|5+O0{FnijR{fyt&;v)L}5t9jMf@HxzsHk zg5BAUHY%p$($h<@E$6eVYamC~hW-xnmDR>(Y#GE#nDS*h<M$P7t)pdETv4my0J|fU zo`B3W6T!5pJ(E0oKh!c}gQp#K9&+6kgM0`Z4E7BY-{sCNm}?J|fzdeAevqR=&=tkt z29&CBgV&<3jn6=L1s}5Bn|8dC5|R1P?VcN%b>o{*kArlDMsG`JT|FF}CtUMRzZsYF zthz;Z@hsS~dx_kL&)l1fN($YN#=Jyrwd~&F9aLca?wc!H;=;?WDyXWvgaG!9z^6St zur-Wpk~^+JwMPF=TN>#A&qqY_pcrdNYz^bc-?<ay<&c||v@*)c7=vY_Qej;cBQ^|T z?>|Q@azES-5QX2va6bdBH-~fZfz5vAWAz|06#c$d(+`Nh`b&?C@#P`it~Mi_$-ee4 z^e{<)`r4L`UZi}uwqs)?_zh($!SA!!(nH0R8`X73w+F`_3lCb2=*@9R4<>f9#QU`k zUSWe33T&^6#t@EcF{Gdsh`udl(^Kt!!lxQ<*{!{37MB`fes<mW6l5c!w^=%2q_{{# zQwlO7sf31bV$(R`I)GYfra)(xot;Jj5EHhjsc8-jsMyA=r$$p=cOYry?7rhe7*;9K zesmABra{CmRB=(<3jDNO=a6OzhY%mfrhyHwh5_H{nA*Mb1@fUvLSBx%MlH%0GWpe< zj4Y(To3`H2y9PVMoJ5@{Gr2G%H@^p-l}FzB^63_rJBF3ih=`8F_#VN7Gjc!)NTB&0 z_rqQsVuk6HZ=%tqc`*77625&WUa!r9cUBiy<g8gFa%pt#(N!o$=nuWi;T=B460#6( zxSx(elT$O7GtO#nu~R~PdTxGvI2r<Xky6oQo&rsOx4m^o?*4_x<B2sAa`Q9X?v_wz z3D`*BCHu^%dvYn;YG3<qhNA1DIiy+wFtcFgy|WqGRe8GhTYEKBH08N9ijcuCkdkq8 z>V3p_$R)r&Rw6>yTG#CJU{)$wquQbKouOB_Ni#0$n;gaFAkVWT2htIvK}18W)qH6{ zES03OJU$5x$EI>g60&tbB@!uO5~6%wjuI_z#M*uQ>6C&>$*1CkgLbT(GoE3@Da1{f z_Dr74@3(oA`hH_43l6I&7b~X99O#lv5f3?=sLE^`XEGp6p`RW*aCyz#f847fve_lw zqO_+{8r8H);5X{ogIPmf4jR$CqE0`Jrf4Xor#oBsszlDWubo@APVv5Dn=BpmDP{>H zr(>K7mu>?6(*D)HWFu9T2gVf>G0&4)0}urDsuAR{I55+5&=7a4fXrICBtaW!80CCA zOazFYsQtkF9ulE0DY}X7VIEPYOKwr_u6>bjva+ASWEy<MesZhdyKFYEK?N#8d=MG( zgo$T~9_t=BbL7bBX$<Z)BgZ>MJ{r^P6*v-aj}S6LsB9+#bHz}=*Enm&DMHgXp*^hA znqCA|ZXJVgqdm}trdNB4Y_pa3XTl6FB1$^}rXl=ynh8djRmzsqN`w+u!%<MO<gkJy zdRbE<m&cTAH0@Wk!-=hNK(<l{NPK?Rx@^{o5PW-?NU)<@u@G;t##i9{A?efG3y9-A z_KXtTVFF#b5Tp%iL}=lxbeg9`p=STbH^Y6J6H~&X_@KW1<Xb3){3EySGfM`q280of zolb5IO*!+Lxmvt#h-6a`bpXJjyLRgKC#`dZN;_+^=eWW;g^x#-)w%#7p57VGVMAhq zkXpklG(cUDeM!z?6*jg=hs2O<kg;P}cK8~)_oWAmrNQC&RCz02M`Qt2QnbTZR1>2B z<Uolt=i}okkHK>V@28k2(*(a<&Xv|7Hj`030(VSpS|Ob^82FiwCFSKzAwM-LMH746 zSJiV>4toTQDu58x@w9D6W)0%B2H+eIR=plnNSCMylbwo1?p(<1uDiwGCCSMX8=x1k z8N?O!!z6{CHUMad+ufOEI?LzStk8p;MUK@@3vh4pZt3Ba2U}Hrx!{tMdS6?lQ&N6^ z<=OYG2VKwJFw+GZ#C&$A;GMl<jRtsZdJ0@@&NqEjl#U#$BHT=|T#og(h9dFZaqmlV z^Bj*IsS>_}67JJMOg$vcah3c|$Z5FU{sTgC%(w7~CB6v@GX;DsFR!-o^2I5)`2^Xu zdAjEXAF9gxeeFIRnesWnfk?<1h#9@l2+jaLLhEnIE912Yyn_vXj`)htd$J`1hQi$Z z*^07~Fo-0lfsW+Rd$N`nG~TK?Vh^B2&si|JBWM|HA*|QBEU}aMt^kXGBO9VaX~cAK z6|#HIfvwxoMYe=lJhf8<TxoH+3dbt8XADNKC*>26xbcWFI4AkI_6?T7P`q&`^tNf? z+*10o2apIzK4gOmzfJYS&G)IHw3A7oed=IRqOd2%-XmMKDRZ`%2_(aZHzCB`tFp1O z6*(Ex*xEaRuElUWsb-d(qZuCd6{BLkoRjmU%gNPK?1IYolEq<5x<H{_)gQ^JQlV<n z9%-KYTWZ&69Op=`6Zttki1Da$qTG)zX1F?d{IS}e47I!3-Bj5DG#LUcCjI5h6Wi^! zUxdaM&NgjyO~yGwI!SVcCjpBFX^(4-*|V3lRFIK`4wD&^W+vxjh;#}MP<wmMYUtuR z2=*Mi4{RU<Zuhphhn3BfmZ6j-p@&h5of+w2Yn~Wo?{%kpkY)ekk&9iT^@HC#=R~08 z#x3f>>n%vCw~${|u7KZx2+}O-Z+_ZI2vzbzZab>B(G%95E)@!6)lQH2ONKpsQcAt3 z8IErY`}THz4kGXG@VgG}w;?c}G2i3UaFOV;slkC2%hrr=u$cRUoL)B<DYI0Jj~)?S zDg#9LH@Z5jn_bP@ED!)c%O|tyPYpA_nfTnymu=v$D$}j?n}CzrkEY;q1iw_482y>S zE{cM**U~mgfGuwc(9ak(JZK0fQb=~J1rRnV3H=>K6dT-r3vfoiJMU{j7Edd<g7r$g zp}=wXTLR7Q6!7{JgIC!m4g)Hw15Vv!1E`@|zGUWUsFD_S22u-p(Rv;=-bm&aRn!>$ zS78e{@^SVn#;tNTH<B75YpBxAz4p-g7k#uEF0j><k>zartVV}P90#i$dvxP{PaKEy zY<sPrFSrh79DnI1Myl<HVDn<~L9R?&!e3+qBFWU0oF);qAxIn)TjXW-b6pY>X9HU( zBbL#$t#g8<-Bm>V(A&(9yXl;@N);%b3U9tpWhJ#eg<<KSamDQS8Q#JePo(xLI!KTJ zR~6e@S7P+#k<`GYBH{O|10*#i7lCXR5WBSM9s^1`&|aNe-QU&%#qE3FS2`7ZQQ)ns z-wq(~c*tJpO8jnSG4qtx;6x4JP)Ja%)fDpokb$l;@C!9~T+H`*e_fl=TOSBmh#_m% zAwbswS<OW>w?Q0Bmaj5CAJWX0-eRWuk*V%Cx`#im2Q$~9!#BdA7oZMu{2$KVDcH8C zTie@v*|u%lwr$(CZQHhO+g^LwwymuHq*6&v>U>G%V&06KSvAKPZT8;V+n#64p&`lq zO3PoA4NAPGC2D>~#WuO^rTNMg=LW1gg{74%f>3zu+0{DgSaPvR(thcm7dcPpsN4_} z?kIhxNvU*WK|66ctysgTJwv90HBP1vx%DFL0cFBHyPCOTkA?|Yo-x`E+K6kSn+F=N zJ$Hy{D+((!En9%@-!1X3xFOuk)!c6qsi)a_N6JHW6^n}2S=)xw;#u4N-pdEg+laXg zt*=aDDifKS!6z2dz$j8WOHG{qO6kqIElAr&r-;t{Hkdx;PrY?q2{|Tj;%Ip9{<K2N zMbQ<6`f%!Hq<Z$q!-}+IxhM*IUwz!IVK;%ejAMO;H?!Hp{gaQxLu>JcB`acD%)-Nr zM{#DRXkdc&3>$KFE&A0*RyyxJiDUtsT>Fwr_lgU+Yv13Kwh5*)iQna2SrK}hY{K!H zS(GVQeF-k{&Oi8y+LCthjGe3^;LrG?#l|(*F~$-Nwll^OMM`R*dTyIxYm}n|Q#J`1 z!^1k2fp|{xJTn@WsEY{W;tWfPGyE=(q>2`c2{3AyHccki335PVjWuy5Gh=a%12!2T zE`#Pzwgi6%7y9YK<VH~JUAodfm1?V?^%!6!>1Kb*AqfCg3uJK(c~{tsn1zXI^F5VD zC1-IBP3e;diM}dRd{MK(di`^Yg-wlN`1O&Px?M2fHC6KydkEmJj29s2%h7v%jD@aI zb3F08J|k;~1Q+0nrV74hG4?aUXRv|glxHCngt3q3gB1M^6}%hC1!sSZY7+4k(2}rN zOhCnEa)0ynrM@!g?f%m&sJC1eZt)xNC74Cfru7m+Cr~;mSLH=+@prX^YhD>xqBF(i z$1@^st8BD6hBS7vwDb{PqA4%w$-|2|A1-<+Q6SyWgh#bJ8N(wi*r_=aAQOw^^{FO# z6U#<fgC3U5C$BUanuqY^`vWK0yqsu;Vb`>rrSs8M<CdmLD(e(zUePL|&rNd2>mgwC z?;eu049<yMPVt?D$(!|kCZn(i?!Sw46oThmwQM(kA{Nnm%`hfp>=T}%re9ac*z~^$ zgWXC-#dncTY9j{t?#aPJ*xVy3{aAUMfLivfsbrK=$&fsNTOnP%YJpSd<Gu^$@F882 zuGoLD4Sw5T)SEC&UG^C$S$P!XjFrM^pBdv2e}7=p>J`?GHV6D7ncAc}UmZDI7aiM= zHixf{o3(~+Mj5#L8Sj`<7zs`3VNK<sOL-8jojBLi<v6*+kcE-iO3N@PBUSX2=Zm{~ zuqq?p-?GKxXB`r_Ko?IxvZjY^sZ$mgwYnzm9H)wK=V0ZfAAXM-r3*=*7Gh6FvqYp{ z&q%vU=M}ZgbMj614t{hzVqVVQupnFW$AYczudt5w8@)JFMeO{1CQ7G=HVd2|8EZ&w zg3gi-^8h+ejmP<kB_abJ9k&&Q9At`b3+TQEEM(lCBrB)x&s7_S;VX3=zZ}PxZP8kX zDi<Ce1GI%Iu2K~Dpq^02VuC*;-%F`VhNnc(EBy|lIKRfV&MMnCawiDBC0%$Sx(9MQ zU%Sa13sy8Hx#OC9;BV?yT6bYK&1-WFiFr~(+`)atuNH-!>YGa@%{aAF0`fJ_SgyBp z4!6yq7rO%QbbpiXT|c({=RW}d>vYUsO22*p;m@B-+W(XlV)-9(3jdeWF-1c&V<TrP zV^L!pV+VaFTZjLaT<BH@_tJdw{`sa_qfN*))C^DTVq*os+UOrD3R%Su#v&@1;I{$; z4?Yz3Xh|MRAmly@2x)=yNX4NHUZ|<M$gnZgv_m}c6X=L`F@EW&yqdY@>2%U=t-)S< z`SER_l8m^#KPzP~`uXVH@&5VoxO$SL1ym!%h2P|A@Q_v|NOopyhbKK+w;{+r$FOU- zRv~3SHyZe=*C)-9<j~AYO03^<8u0_mfLRy4tSQRIIA6El%|mpAer@9ncU5FDA+_#L zI6s750?(Lq14A+UtjR_vy@m?8nKD`sy_qsutgrL;>!b3q%+rz61tL&8>W(c=6rU(j zBM}jCsPV=-a}vHn94!p5!rVTD;z);5W}?%y+k%pVVgd&M=HmB6F4AU-L5wLf7}sL4 zAEKudt+V2A1EfBb<3j*aY>)Tfi!vN-1PBK+F?|?`;3&s;Rg=rCS3Ez8o~IZhEN^q1 z3V-1Y{Qz>lKqwFD)Y-L-tm>K_0#N(Aq*vazQj&ve=nm&o1xJ-l!Ui=5HqwHfc^z$Y zY~k*N@ydh9x;yfxMl@3|X2HUhWRGJlTV_O2Arg*$J|+e)pF^7JF{o3VZg!D2QL;T8 zew`8?Gp0yu!j5r}SmUkOWEH#5Vw1ou4M7oPo5(CmW^Hk|6=W`O!|YvXVk^5|l)TN9 zVq!V62XCiF(LsIyV=kg36NYnCi!`~oMXIbt%*dEoHwg&DecPWi5XnApH>AbP+~ld6 zYR6)L#2;D31}b#Wg(4ecs(8R<6URB*&5b!Qp8#97EGtut0)PJu{=NrNGYLl%6Iv*v zZg{k#?^B09JX;J~99Myz&H>NH)=|rIE{0w>7ISsPtSQlEK4&-FV8mSs0IKvrbDaLn zXmH-?UCySd7OZM#nn*#=dqn_?jpzK4TW*WSJt*3RVQtp0K!>xAG3=_Xv>v82jmXI` zVc*&&lSXLLLcZU|^+;hoxl-Kw&r66|`3G7p;d5DDYc*7v1r*XzVfaTqX;}NJWdU-e zQeAKI-7ySl+R_$pM_WL$HRBPr8n5E2Gjf3`H#iW<c{~OGa=3Joya6{8<CwFuKNFw2 zTGfidbhZYp8l+3POn-z1s$sr;d)+#OI|p(U4f=o`T%g#gM<t%f)hd3bx#ce0hnCZM z2@NLUU!wlc7s_^^J#!`{>@c@NHY_3>N~sGa`S<0;8Z8Sy*h7hk$U<ejCNNQeu{|=% z1^E=}^MM>QT-Cc<zNd(yy)HGb7({*q_co8(g#}EvOg(8$=79*4;QQkHlX*Ou{VOZ_ z#X9<1nf}l63{RsbL0r?uT7`=Vx+dFPuzjR$;mDM`oZYTzoMNAwe7B=><UzB>URuAG z{jcD1BRtj&rw(W@x*ITuY0iSyY6JAlbW@%nSjt&1A~BPujRFe?^w+eIF;kOal=^~* zH7?|_#{)MF=TOsCY@Yd`Qb9Q72aJKjOYQAYN42_g0XQM8e}oZ@gvgE*XKeUaC^6O+ z{3g87vMUGVT%!(GB_GIp$jgaij8mq!jTK%#DT5}?YJj<jQx1!m4uOFcrMjx&??7Fk zLif3&vnvNoKK#ljUlVAvkT#Wio#-sry2pC*cA#6g7Me#GPSbyCFyfTAkC8KK$extT z9u`#?GR~lM<VMg9i@f;jIxW=Q4!kn#WNw35=Z1V6L};+lJDkTkaSQxuz-n^k2bt}{ z=Q+}3Mha)}CV#4v4Qi64hYdaudemZ3?-(){q-KOcXdL0P#XX-Vc4|Rxi9azkZ8V4d ze3e-b8YG(5hg9Jd@gFdu(ra1ppAXV!Z2pyeSHpR|T9;&G=CIY2r)Ys_f`7Q)dGcF4 zegxE@qvzY<Ed6`c_!Ip)IKknnN|Q`X&y#5NVfY!&u$8;uq}wZkPdS-o3jwm@b}U7E zqXhfu9ws{0yQ_wX)6zJoUr?&}Hd`>LP_#+B@+kk5zA&V_R~y*$)#_FeS*%FY{)j8x zwiKFp)-~}q3p5#sFw$YdtVcM@M#vJYS)Pww2&Aph%>#Cx$hC$%b2V8?jfP}IphFRm znx-|U<?(7rna;{ShoY(skZO(b3Y+t&^WDO6NejLY@vVrL<$@~1+#m8tPnwBK5A7BE zmL!QShKnh-=o644fd~XU{u6iudbjhci}({`TS@nokEaBq!7l11W1F)?$Qy<<bG_}j z3YX5+dGez498QbJykFW&Qsfk(bZj{(1rfJ%!&oc>6+!VUG~p~v(P6-Y7NZkOc_OJ< z;3$g+naIG5eh8YMy>v*@Wl<S>!!6GiQmM$7#MK`ptQRB7!e%Z;_s&WoQZf(9iLf2h z%2^yB3|I2e(bP14tmG^9O*?rI+>Rr8F!Jec8UwK4bU!kg_}x$yh-#d5GjL)yq{TBo zl@y<L$Z*=2|KV3BQHw)$6vJI$NNgTRLS|z2uQ9BVipfdt*pDiaZr8Dqd+v-U6(DJq zxmX)kui;veOBy*}J0aPR`WO%3A^uU3Iyf1d=q~0$yXx^iZ#3DlP*gcs#>+{vd0Mre zz__`S=2GMkHyujST-ILA+Z=JqP}pNBax8Bn?|xs9N~8X^+7B|ExH^^V(V(SM04m{> zY8Twn(~jp<eixz0oi-{QSTB0*#_1z(k0kw|KrU}<!E8w03^k`!ye@e~h;N;Xitt>G z8P1}bHk)AaQtV!v;W%?wILK&F1fDl^h$W9+C`u^T<##(o&LV&DfRh3xjNjs7ILBFG z4e^w2*L^Ny_3W<f=$5`$QB)b1j+hXP4!NY1$m^!?2O{;Mnyy>zFD{ia-rVT8rr89S zzBPGVbHEGI*qcKPGhHa`3`MNCcbz`PAkPqEcM-w$8H(pGevZo<58N<e#A9LXOmhjh zTrzVWr3?*lkV{}%F&kkopvk%f%Jq6g(EMw8oE1?$bW&p8ahw2BS-{ISFTOmuM0P_n zPQ>#ObLPc?a?N7TH|y^Zz(j%(;K5Fc<=P-aqECuGwf*$V>D+r*@%ciOvxlu(K+_^i zM4Y+fW0h{8JCyf0;N!Srz*{Qb7WD;iO-CM6>0M279penVcX6+(m%%9|O(?cVyZ^N) z=gVvhTfZX;l5b2KqiKFepS2ZskQADF+8p{NqRaVLYB*+uw9k_8<UV9VU+UBgLY;p$ zqKngmvXER^sZ1;Oe>>42I$kfxZ#3x-nB-u1=~mK~)@4oaz}lg}mg}OoL6k#!e{Dqw z!@0w*Fl$YRl*tEi-W<h9R$)9rDtlhAQ(5xHUaXJSIbc<4gwEziUN9S~UEq#hT^+bR zu(7o04%p~n!DbBx(vn5o^GplgZHN46DFo)Uhr~&KaWu^l#e~(z%~O?N5$Wz&nw6X@ z&h=k^Zanqq;cJkwwOKKeg2j^+S$g`DFA<N+r5MoFh{bLToas3Q91B+2+uz#<yaS9C z6@$+mbBPx7rUMak5O3dgz<|@~=W2^N2)cBQdUwdi!x59)5mnk!OTjRwPW1rwNN$}M z`I?S#N#n^IliL}li}d(zKCeq*`fq!_ed1nsK=^itk|)mH_6p4>+sRjS{wr|1gZ?vK zdBtW~XF#_iyElF51H|JG7s8(xg@cdNqpj1CuhUVSBD%2AJFuL7aqHBlCI#w|+tyc3 z4MXskADkb)4W|R7Z}^`fF$w$t-;v(A*4f*y-u)dgSxV`8qb~9yli4oXn=#SEH-ef= zaPLy*SFRq-HA)?$wBRwiJ6#S2fpgOYuI3H!!aRU0Y}DJphu2<<A^>28zX=}L0{v`c z$Kuw-91s@QX-h3Saek-=T2Ybe5>MX*6^@WfCn!LlY&kVlc~dna6;gabN)OYC7=_js zuif>Acf#q4fjGXAJ1<xnoT!Rpkp}chGKJNF^-XG$-KPyy`dVWSl`X?Ju@~L9!sdio z5|X)Iez_nPK4agA{}84Zw>`stUgQJ5xO&&B0O_gsFnS>Ms;i13C=yvwjJC+GqJZZs zVMYX^b(|4qR*)2|d1-%idgOb}m|dwB?iF1IeKCA?9)Qg)<QLsSk<>{`-Dw|gA+R!w zDQD}|ZAfx4IPRfzZeL$>ioGPymKB|flr5L%eY-=9z0?y@=xJKZtkR9A&!Njob0*ss zFfZ9CEt5Nqw@hy%j#>j!ehRwO>1Z%%CXO*i9$-DrIcFzOf-N<UQ;F`Oo;8n+!yj4H zpbrp~;To4ML~RWxFLOvL>s#B4%ZtAk+sI>A6l$^SB;&!HHS!%BgzKMfZqgU$8BVgQ zxT9eVW{6ED&8aH=m}?g^M5`8Wn;E|}&u1t7kjDToN&3vaqAaFo4Pzz&bNd!P1wSez z5lr#p^o7m%OPl?INRTwlsFxsutAi!-RVtOs>&3jyyHPYFJyM&fc%n@vZ!+sZi%;vD zuu>8XeIk{KL<b`s>|%|xQsY%;ki0&$e_=|Z_##>U{D7rUT*hLN{-aP@^tVMiWzA)@ zGDV*XKmL_mlgv|K&}xs~RBaJ5RB0$U!oE!B7i!h28;2C0vsISxa`!-TyxiW^eh^1j zX@j%)Ah&QHbW<llk=Ohn5ByyIf^IP47$!ip_|dfobUndPJ%FlSP(Q_N6xM7cFS~84 zZfY?5@Yx6lRSd8XQK<&6tb6iKk{QFT=qGxo-R)M;Jl!h-KDo<hYO_tR8Bq?je#x&D zSSe7kcAD^UR68^&WTtw-^+8!w(fWIyZd!&@s^HA=ehv~^TL?=OrJ4a6*z?r<)iLKO zc`Bn_DSgZK4wZ#Vy84RL))xo&cIMh#>iN~7OUjx!?V+|x#pP#ZQD@3a83NN~@uFl9 zvJCeu?CGWSq_lqXKH}TZS@V8AZ+N__r!2;LDAveDXwY)1;nPU?d>b=`+*IxgjAhBN zXZt2~!SD6xt_Rd%$1Ah@iEmG}yHwuC)xA+Gx0%6Dthc7y8aPQ`_jm<Oj@ac~lE0Us zuf5g6pML(=Cb(ng9zG4`&mU5v|FjAIpAwe;=O*~SZF#d3e_5jZXrn)X!_CJ0I#du8 zVE`?8RLogch6QBnMMWf?23#;3@F`ZN_O2*TfoRNk*Taz+cDK9zg}LKsxoZk|PL_zS z4V;X#pE)b;&nvk%ynm_&4AN{;RH$V|D55e2C~CU+G-AS*4EJur=l&R?tsQ-A-nVbI zoNIOtD1*F<dq`1>(!8(_PV`1kuU*HO4fVJY6@j%wjD4bq%)`(RreTT^>rj3qmu_Z% z@Ka$zeFYmN>z9Ng0tP~jh<x=gt`D+@tZBgZSQ&r~s;9A;5=3gns1!m8GL-e2iK3*V z*=A>%qQL^&azSzv7myM-xjg<G61w;V2t+rh9<_|XQz0SI1XWBTGcSXt*}+OT9z(5Y zF7o*2L8XnYS+2EdM72U*TV%4(f}8^DPP+Xtd^NE*1MQ_t^q#U}H4<U_Hc;UnUy;So zt5BZZb9}FjkuCqolx1+DWQ9Eh9$qaVYeU-eL}ruG7Dd?+#0WLm5!B*_uK11ff_@B% zeI!{)%A=gcN$&4#_Cn?Gau{RHHsecDm6$!uoK4kyohS2L7K@_c?G%XLh{6OU`0u%e zSk+$4vXSC!NBzMa>8xgAjUTJSVC&(`s;}LYbJo1YS&S?n7X5TI&!sd3R50G<fQfXW z7LC1c^~5M~**h2FaHCHMb=Lqh?GixC0??@&DG}uUv=n(9EKP%>Z<!XnLChAn1iW~^ zC@(T-CReByv14x7I{%0zkoetV2rsy?$c|AS`xhlEdi${P0c*<(P}ocPabu;YPWkm; zLnYBOvWe2aSS^nKNUr(+@SOhNlfd5Uo=!;08MU=;LU;ZV7{`~m8#&pGrY24y*t6e9 z`5eC*2o+J$SUS#=se>UFay-KY<waPWM#}c5%ZhW=g=`<9Y$wv}xIf@$e13c&VE_RU z5M)5u?qy(M1hIHGahI;0h&YX$lDSGd@7LWsFCRWT2PoRUW>@bgBm}`HDV!BpEw~=p zwd}#eGr05{?+MWLBq8p0M$ZL9TE}~?{N5hdT&!fvydSJ!svKK5sjV5V9#}aN{o@k} zP!%hR>cAP96aZhwp^XA%AiB*f2X4&~pp{x>75kHC7IHdvVS3$iY59iMH0Sn#N+AEZ zwy)k`dn69EhZW!+*OF%>VzZNz_3D*02|_RUz7h@N0hcI39sg2_Uhw<gE%WB<sKgB0 z^ZY%xwF3o0>7?NPoa|CNB0J&tU2lIh_ThQe(kU%%$S^go22Y>`L*AzFp}DDWQd0gV zz8RCG(H~b(v5^UUj-&|Ph}O`QNU|$I4v^U!esi2ey?26LxUE_Qlt;ZOd!=SR^a*#J z))ceFSD<0z{zRDF98S);59USfnt`}IfSBcCqH=@J$h1grgPbpK|IF<kBi{dGj`Qk6 z?S`Vlf$A4f#}6;Wn&#Lw!{y2g=m-!5NhLJaS+)xO&Q+^6%nRO=3n_qnV;8`)a!?@g zn5yLk{BGm5vxk)R&@F>Ou=MBrA=#!#nz65{3I`UE(st8na<w<$7;cz?NJvw$z<Qe@ zL#*zekC!YA71TD*$}Y+s(W{{FlX(<iv-(hCX&T%FRIO3FYmAf2D;OII^@c{C#a5iJ zZ_fvXadeOBL^n&fpeqp#&>5e&I;P<^V6goWWiVw?Q#)@7`rZnLzG}Gl8R03AdrAk4 zn|tq_ktTI_fXzG1{+;aahdIC+SHLYs_i6>u2>{mWM6gBC=pe7jNATbo5*JI8;&;Zh zyt1*QY+4ihW=nCvN^m5ln`SX*ZJ#zVl@F9x&YfNPY@tA$Pm~-?N*S*2fEPdsY3#lF zkU7r<RqcHTCF)(C{$HwH{%5eUr9Fc)GD=^UG9m7J_JCH3?3|sBIE`)P0-TLVga;BZ zx*XR}V{?2aKvIdr1JZn(fF#{}neC%nIoAuB<g&e5a`?CGYtxi4WdINiuZO!y`5w5x zEW5h0;m=p;^v6^MPF*8EF8apEx&=AB;Q;NIAB%^O2xGjj{NWz<u#KQZp5Y$p36)fD z-?M#ben1$`JpjpH%|ou-^dnKbHebfuSJn4?aFpljCz3Fz4CAW$08uHYhJ0zVApLx_ zxkaC;W_Z2>m%<%ol?k9lxp`uxn{Qn+ULpRrT{vpOe;b8B0jWO8mTibW?4xXOufYV! z{yMWdZnNz8Z!1X!RzINJvlhO_3jQc=EV9VkbyCvLS|g*?Q{;a(k6JDA`I?Bc(;iEU z-j@`<(r@Oh9JiZ2%;mVWV@c9O;7r|jou*UdwD820`0wQdP%(!gCoHGvnoLIK3LJ?% zSq2LTO_PJ|fodiS4%sBBMgpGz67m)a7Ykr83^O$OkxY#;lbHomp#|f-eDF3%K&?x9 z%|Tfk)?vN%AD=niJ(!ysBSWkB#ouT?U_shlNT?|r@R<gT^g@2t*k{s4*Z?(RMB1{O z{9&=l95fV^4YJRpsPc#V$Kn*-yuj!Ay(lj{uAWM2%I!0vh~tQd%fGVFFp78oxC4Al zj`=u0HZ?jzOC>VgYH&C~3ahJM>9mg0X_f_nz-mm@<@eG>wjd;`JqrohSFn8Rc=P$z zMJYRHBJ`@d3b61}N=`?%_>TdM<e5riA+2m|ki`n54to}a-j^%?u$t>NyHK<5<T)kv z!RC_gNT*e_jHXbWB=rmGC#OhVBvENr&^bQ^J8&s1$l4mRrP+Q|w}|@9gdpG(EfkZt zpt!Ju@@GKsQoSk!IEKQb>Mr<lVlb><E*vE!Fbx<Xx}Owo;2E9j_B(Q*oxk5lVvRRQ z(IZ_Fj>{PCtGV@EdD|HAcmo0~j{MYZKm~u*jIq*XSKbhjM9gugJtm43-00hVyS=Xw zjtMnqMy#)K2EqqiH{SLnV}b(kmY779G%F9CP`LpDYlVDQv5EY1Qc)KF&{oC(@XsXS zCui)Poj&N|-Ud7c<c|IAybKGConYUvD(5YcD-GYVoF#^&7b8?`LFmLmtRtM;zreYA z8r`8pe`S^d;iY$Ms6paeRejcMHqb`_lsT<#YTO!vx0T&@G!}}#+JAdhtN6Ab4g>eg ztNx@9{;3ZF5&H&LEofxWDm@r2R}0>wCTls6+hIug0~sl#7PUr|R5&IUMQqkOVG7*A zA1S&ebps`J8FBLVmZJ%JoQTH7qO@-q*cJ)BDDqB37IW_qr-jG+#CBeZD}=~Hx)2}> z=Z0HaaafuoaKA>B5X;Un!s18K@hY6>QI`OBtk_nUZj)qkKqmNgtK5-Wj>0Y3Uu6ew zkY8_U<r2pp$y}Yc0l;H0J-k?zm8&S8+j~EnW7vhYI^*SetSv)jovhtoGju`G0vI^$ zqVIA|F`8|&&0X2i0HCToJ5buAZln4}<smaW!MlGX?E8YncJXg<Ll$z@|5!4hv*9+# z;8UQigmUX}{_nk+Z@CbTwq`|HM_GzR?}D=AV>k%vd-7XX@wts}`F*9I5+;&BPPEp) zxgoK&%Vb8Y2|~mC5>Xj69(wiT=+qGuU^i9J)a0jI#O)9T=^9(Ffy{jvw3IaJhZ4!m zpT4Uc4XSkOZI|mltmBpDgqAE$)>54Xj@!wEN14w6$AlJu-a!V<UWJER3)U{}&A+y+ zu6(gIGygn1+W-Y-G7lOASRn*?=NY@#NMJgGl!@o!qTN<@KQ(SNXow!&KQ=Gg05?TJ zx-K%7zBp?vW03s%;|xOe(cf1t-a+t3`!oJ2V_n)ndwfWOYItw=?!%ngMi)+~WE(Pj z814hWJlosR(OE>L{k5;eoVKePsE04yd5qlH{JOqUGSHwjn0`eTD?oonY`6JBEbF5i zYQ3D(50xBdoFAI`oZ!RNW*~5_T^a0b_?y48F<Z|WWTQ1(k4{L@V;wqecA;(GnvIPJ zcQ~`3KFoO3>DpELv5mSOKNR<Ue155N&h<pt38QZ^D8S1qK8t~MF?%slV$WlFR1C}y zmkMq<kDCw6z0U)&$&6(+gm&F1Ym*}gkgp2W+tzzIiyQG&JbwaHr{FZ^2^V;Z`g07B z9eB`7^?vTDaIbiS|DqrBgpPj)Ie7A&5GZ>r_AK75@L_*=4>W^xn%T4+7N)ybVLK6| znBz&C2Vis0nc#zADAi+%q|E?2<T%1%zsmF0-Dgo`B%yY#R$IAapBPFP1sWCP295~U z58c@_JPq~;!Mes8iZm;9D*WX%n&}{K(_N!IOg+3Qx>tbmk<_Xn9Bu!AA(8dB3n&6$ zkG#Tu?35n*1-fRKbHW%<y-;{)w90%X8tof(AX?lUNJvf_PJq)fqNicUk-d(h4uD$9 zI#H8emrsyHU>k%6sq85fE?9rxpV#vo<YOsjKfT;qg<}mb09Tff=At;Y4fyZjsyOZD z(wBdVYSgj4P5Zd`FX@O*8QurRA~%rZV@X!QZtPt0IZW;*1WXyBT~VA1qF!YZ(mv>K z_yQV4q(@sp$e*TO1FBwWXFz4|P9IPCcXqM$$e!dH{=nAQ4RfdyQjF+YVKasvI%!rX zJ-GIQhmpUAb5W6V)<I=Wq_o<$v>L&V{zqb?+LlL5#e|{z1|9fGs>_zA1XayD%{^`< z@cmQ4Jgij|!O3m=u&<%Vid5uwP5sapWu6!J*ZKpbbBHYcTh7FPLIXX8SIu&t_4QUL zMJ`!#A#$u5cDhA0qLcErVtOAO`gpF$GV<Lr$kM7elQ7+8B~16CGnKWRc)XS*=CN(p zZ<McGx6Hui0|q~^jdfN>u*JILwZ!*s_E(#Oq1j^Tc1AEUg1y;%K#OO%LdgF8{L7@g zT3o+c^oS((^=SsXS-<(lvORTxpO)o3gmq9{ugCB6Y%I-AClr@=!?jE$*#<R!V`!0O zC&Lcq#)=Ao)r3a+r}I%HeJTc+fiwIlnzqSw0TcHo6VwQ1g}W_BgN)@Hroa)i36QR9 z-g|=m!3|0#){zm=Rf_WaEfDuQ<ZeL#>$C%ZZ7cvLpO6o@;dy8f^~N9twdO?(Bf)$b z*M-=q21*N5AVjO&qK;1-{XTu4vAkp=f1n_$%%I$73t*O*Xr>y58IwC5OEa#o7oJ|~ z1*N=^Vv~%}TLqs(<q4V!qdvqU`cXI838f_OAykSkwk>-PNOBW+f(@&EXuZOzM=Dbd zMBP@bkoJgL(rKZhGrO!~hz3x5QDyctu6v~YZKPH|V#X)yOZ!we*^%@m{c9(Iy6ZLs zz8qJ7C$eui{kNWK4(~`C<oAHC^f*b@Nrn;0Fqqe;qrgg|gTje@Mx;HlT2P{nR1f}< zz^>s=iSe*y-dHPOW)(h=FCw(sU$%5%P@*Z`R`v}QJ?$j247xv#Pz5tNV{{s)hV!@W zmLz<}478|C>5A=s77RR}VKY&sUcKnDx*(B(Z5H`;))p>{uH+uf0CU6zoRJ<*0Rb<D zMsX}s5dqC?loHBU4>K0Kv@KY;?NP95@6F7^&=Cwob0#~S96HifeCSpEsqxQTM`T0r zLRHrz{s`pv@B;#%Dxt1i#l2m_RYN=lcWNAwfS(OG(~MSOBv}vy#Duh57zz01x@Co8 zyl!m+-5!Z3GyX~fU4rYwW}}prHzQ;viAAHFt{eLoVRuP#Ao2<05zW=T`8DW2j+?gv zi<3Zllf{PNlwCb|i+aGu)qbKPErlac{?$Kw37aETkC|v`lcMZXz~||M)>=0)B8!A2 zDj#GxMc*dIjj)#Xm5*$;{XHkDKp2&;`m_`d3PTWTHSj&hp&<v01vRMh@g-QU_%Ec3 zx@CTvgnq+JOPUt@-7f51@iqAU;h+S(a}$bj?izOe#<zD)$mDT4{!{)se-9ww@e+N5 z>@Vz9akgQvw+J_kVz-KFL!b<+10z^=j{djrJ2A_$5*v%5Yne}*yH>M}uO9Q)bEFj{ zYvC+&$WeNLY~mVc`2mhaPj-WS%|B_or`yt`O3@b3R{dVoHI*i$)m>dt=wqRl=xrAR zC|vV+&D$n@bFavDa`8eGMQZ}?%h;xQ(Z4Df0zIVFus8kM<=;PxTSq@*+Jg&Mu~>uQ zO4|LFktT%E8(0RXn}e3^p`sC{Gium(4cNt(6qjgLuIMkP5htt5R<nYl{LiFf4Y5ID zkJI_bS07?}JLB|bcpr(=)EiI*#vd^+mXrur7hjX9xI5cyO%yrjGfy>GZw$~XC#Ztf zYrhNYE=;CoAUJ9Kb(3n(M3#`;>*L;|85^SG)Z>Ymk&^YSGtG~Y<B_j3D@m3s+p69a z?8nwt?-)W|4Mm~?u6gUS%k$;Gge!ElGpV=Q%Y`fA1GsqLI~-ly+Nj+HqO=J@h6u#? z31ADtg++>~;#%>EQ%|F+?;QJub8I(OlG3N2Z`FHrj{Bc)D92YRT5iD^HJuCPXhn^o z?vm1^HKa(<L@jiJ7QgxeOL1oGo)kH!1og>Fxy5GSyTi++wsmyv6q3pj4US}@v-z3k z^djC<!axnqGjOl$1TmS&_%^4SY0-D-Ksrun_PxNEj->|u1>AUWMkD{;Y7(Ig@1hMO zS&Jz;aW&O3kn)m3;`E40Z&NYapik#DNpeZ^P6>tznUv`Bg^gR}Q+^ZCb3F5ZU<>qR z<wc^&4C@k=S3u*hm<IEhCXWFTis^3L?%sg}wA*?aFImP<pf45K_IHX4Sa@GP$3*)z zXJY9@sD{t@|1ze_>G)Y3Gm3|vFv)|htfh9DC?@iwv*1f%ioJ+JVV;;s5hlJU!K2P- z#HBxauT?Do=j9i01$e4qn6bI0FXf@xITwiW<M9*pY4}kic=bk-nkx$nuk6nZWWHkP zIthFd%yr632noT3iP62+-A!~;UnGySPm|4@T9LbhjFxSsz4<Uk7ZR3gU7DJ*p+#-u zq>5so{sBWbWz;L(zk4EhHkl-jcMU@Mb5Q4KC&{!_iEVuWkDEnyjIC4hLadmAJ2C~p zH>p%&{|j$gSgq9|V4oCn;!LL%d!Ex1>|AgL9)FH+k_FiLbrveWlcZlVj`tm9_2Se{ z!B0x;_s$^VQ-9doS_o6?Fk0%to++hj!<5>nksI+K2tTLGBg}m)XDpks%y@~VF*;0R z9RGG6YVp%`BA2X;cnn8eu8Gr`yN!CsyQVLbj&zTw2*TO>E_E=7s?#Pj#RPDwV||V# zp%Zh|($=scO5#rIVA}=G1E7Q6_;94N3D@dj#0^}^eV9&G#x4jEHgE%-ixf3kE-yM{ z(gH&yKx`h%EJOm}!h_+pWvb0v3r?6Z4ndBY7?+eAn|YW;80bwf8ycVi5kd^p{!F%9 zXrIUj$5xD)^8?%`<18A{t}u`;#qdps_!N_iv$7nj2-P-2d2MbagEx6w!g#G@GKfhq zr|0VtU3D%kG`v^DTsZLbW_3uV3{xj!ClqZPl_C>t*MmLS<1CM|@;@=VYRkGrBk|#5 zDG&N(6q!}|Ae0n5dq~`Lh}o;7W#UX`G*srYi!^+s*BiBlGonutm`er>eJi3(ETT!^ zqPJx*78>m$I1b&+hTa<qOkQ6}KZV?$pYIIR5Q96b2QWzz84i#GfLdB|EW_wVrz@s$ zPhHnkPQ}zfexU_VmEei|A>7kk#_0YR*MSuq^G=79ZUy;PoA@;4>24~s>147TgqgS> ze~U}2o<e#Mdc@?|!)PX9xQYOwMx?Jr31m9_`cDY(0Xm#9)O(6CaH<DX^D$-!OelDe zh%kEI<66aHK{WQC5kd7M%=2q&8Fu{OYSuZtF%1sUZ@}BTd2n+$OPPha2|MznXi+VT zTq6rU0eeO}awI)}q+|(Ps<4fySh)(iYKEI<F%;uBYE(zqFoYAdwWw%OGt->g62ZUN zv5a$lfq#iJ=q!E}hC;DsHavtjLx#`DQPH9=zsqn8s4PJcx{<zUA$lb)v?zy*-P}<J z^;IUccu$!Yn;vK)NXIO|;GAh-oh$0F&<@_TDp6w&KX-7plnPvh-VFY6TyA8IbWl7r z)*#nC<l@38x)gJ(e_XVXBBd<?ZECY3mnp?Z$ywy`k7h$A#geGhkl{@aFx_iS!v(%` z@GMFJx36FvNclch3r-12L3$~508gDsta40GkB!f^9?p`5a%x<|g!TD5a^5z847=)~ z5^%+%KD-2}d9jWx99?1`L_Nc)z5WzRq0z`tgxsT(yxE9s$%TK^U`*!*;w;^6*Z0nu zNU4dd^H8awxH$MN%EZcIK_=__MmudmHBtOHAc0mQ8!Ac~cM-99NsUP4JIh>uyRVBo zPOjrqdsK{M&PZf-jNHmjMbNLM+{7g~-NPFVG_Jo!e|fAZwcYCr1RZT0{co2+qh4%< zPc(<c>sZ5PAD({C1Q2us6_)rxN}0&2P+77~k3hngtIf1HL_eV`W<pQw;UU(UlrH*C zj``)|A|XXy0x#(RJTf$%BDxjrqNBg~N13ZFa@R$s9n9~bsNEmQMic0i67j7tI#6-b zQ*5fN8nH)9M&a2AGZO5s^@W7ayyX%bpbj`Uxe=A}6HEhHI<#j%9D*L>ToWWU8<Et# z{I$*K*XbL$pD}2QsT11W(VzFYBM5T^hW?||LG(v_0fUHK3g|JSekl4;(ym*R>)Qa{ z>f1Y`6O|`|2a$<bc;e_(Pm#~`$rG^5%*VYV8?@}F16<k0H7nkh<ZTaRbI0#5*t-Ks zpn2~P*jt?bXA0Yc)Y~H+SlzoIX}f!tEbJYoo|Au-RG}LxG;Eajy-E8Rp`$Hr4Hf6d zKADC+psb6n$p<Rdkl2y0nYAqxR=iqTXX<2b+-=66)`1_Qz?80wzHQO1>{^ibyvrT- zLnp)sw%QQex2|qXk;v9lTN^jsbq^%avO6CBje7giMt`k}H=Zj7qv`HX$!k7ge_B+} zHf{ns$|KQ^a|vLpaBx&jCo4atzf(P0uby83Swb5JTsCUI%bKwIV+#vgCQu=4w#_qR zkFg(<b^Kc<0<OTLSfi&pE{+tA>tp}-$!L>JmFY*+KYz~f{{ObUl%342{vQgY|HFX_ z^EU*F+|^T&+*(n}Oj07U1))fR1_ip9#b4s$%E$o>FfpACmF7v|sh@W@_O=){!m>Z1 zruc^E303_i9i7G);MM3~MpnA_^Y`=i&bDc8@6XydVjrH5(P<47l!?=#y>%^tRBC63 zu?fV0y{Yz=UBWLTe*-~x4?QsRXiCan+^i-5O)!;qxmrqRm4o$>w95<(7#ga&^Z6@g z1bW79SeG%w*doU|F?VVxV~*?0YKlR-{+OhcLRoOdN%h^zfX%lm7$BK{>(|MOQBUsf z5+|Q*IoU;(aFDMzLG*#xyotpmKQ}SgH5<d9o`aq{Egd(SvpN50jE)iNtmrC=W>Eg9 z1)%LFEzB*$u+$mZF*wImh29eq!I34E2bgW|;hBwJZ*fuMhF1Zy0(6%xaRP%9aO)We zWi{*c6fq{HNjwYJNgRK-*;?J~417W~#1ljx$SK1TcGeYvqm?&7Z3p2wLIan?c+lP> zzN@#u$Q<rMo#`_ahfV_}T!<b{28#-@2ES9_DBD?Qrdi3~+BIy)p%5TG`((xM9cRLp z$!Wz&+1`OAid)l^pQ(XAE<LGrJ9YSHuoy#M^gtRf&@$o0Uj=x@(21mMgZ8rg>^P#C zih*5+Jms~??hRl?Ym$Uv$HZ(eq*Hd}cG1U0P*FjxNy4>VogpZ3O8sAh>h!hZWM_*_ zN@FNG%D+m24>k-p4hy;wXhPX90r9ONYUG>Ut$!j=^h~!F%XzmWilfYy&=W8c2xudo z*g{CmPQFb{qFENbS~sKcqh#0-4f@FK_!mh$IKfh*bTtWQK!Z|E4L^VLLsIjiKcjf$ z$|J8CvLeW$YaF(UWj^Efq>u<!pBN{H@8C<yJ!5kDe|i52@=aj{u%Gr=FL!<;!WI<V z$$Xr@1MDV%{=ROw6=waUOhptO`lm5?V+hfk8dKLDX-R~lmr~3Qk6^LHQ>99nnru1z zqP=k(M27B8mT^6hzv<J5G4B{!rTueBh&0ZN5|(q-dXirKa554cie}LWS-}fGv3`MS z1rR+56yxE}O!*N6>774nF;O!{;%s}HNd57p;J%F``P=C=1xRJf6N!79m4WPX*gKB- zeFkBu)RV=4<CRdnKd=vlAeZ!mhm@-n6?SH6a<WaBpo?O9z$Tz*D&@qZRR~*3)$ChH zFI^JytH5iNP}uB|V`&FQf;;)QLfge6xyQ@5oH;9#B&os$owgH9!B@KS0W{*ww(cz? zB+lh4E~cT4c+l&%W0E!We1%;(0_H_0QC;HZa?A-)G};MOi>e_iB9?+XC^BCnw9an( zl;Zk`JtaRvd47vM?pb~=QM3sypUk|XTc0R1-!ZI2KpUX=wb!ik*cea*$CAq@r|CCk z8w10-v3BJlH0Er(2<GBJs70hV#re=$SDjta8+{<xRt64;ii?<Su1D+|$E<O-sybE% zHjodQuU3eks6)8_cmcmX&^$%lv`<NG6oMY1^|eJWiM>aVmdME{=lYR~bl%6Wy1F~m zZ$vkthiBzPFaoo<NKei2yI3{}T8v4!n-+t0kn-Q$1odU^tAY6Iy)GE%B;TE0Lb$d{ zlr1PzfBF~(al|WVRftb`KF9g2QGZRh{2NM2dLeq*`r*kv)>ZwWfX27jU#@ZPS$PPL zI|A~piuSqhzo`ycOVn;-@m5^cQ}iHFKGxenpjXuY6)a$+iFXJ6ZPxy06)WL?NZ0>Y zh5c{20`C}J$w5A}k=zU1#U(StY8#1Am~%ZUCx&7?i&C)=E#R#gw8`X8|HJ)MxKFql z85juRtfBtcL%g2x-MqQL1NWTHosU}|pV^&1P<7*V$WNdtQH;sQ@^F;-MhKc*V@pEg zbc=mxQ|WEUDrEcRM>^90y5?mJO+NWwQ>giQshIrZ((O?JQ`5+TrlaIPRrWX^!Vmu4 zp5uDZZ}|_cOE_PFp;;S+4hEikDcsN;fiA~6Qdx^Qf-ApM-ykXar@!v4K7=Ncb`-%Y zwssgaCs`T8{QD%YMalam*b#;zxf4;GUc9FW=6O+IW~5M)2#g8KB#xq}rn{i!Zqu|_ z;>8k8en91_)EXHqz5VX5r`!9#Q#aSTohN-FfB$!6ILDH_GS07qD*yNMKRc-Y-+%Z2 zd!Jl8;lI?PqbE|By3&_`vG---2NwH=q1r;?74jJZ-WEiIbj6D^Gg8Mh)OrNl**EFg zUw+2wJ?bePeB=gKpea7&)kzjnJ$F^+UQN*amX<&_H2*+xO^&yB-f|tUH-FgKJ0I_f z#E;g2b&fH0`zO?euatF+ue%?s8an#vEYB{dM_|(fJM~ywUGeG?Y`ehO#rZ>G5(^A& zLy9P>(i!lPl!W^_WboO_RA3accU=v;Yy5Z36cUN~8Q>0g&JcmM3aKj$!n{G+xEt1o zC*hpJ#@O`57%aq!`?(3o6Xu69R66jJqchX7R!v_WxmFo!AM1{H;o7XVO@;dPrU&Sv zQTuuL8S&1Si3Pc6EEs6Rc3CLDMu!!5&(!FPipDZ#*rIxBT@2N&P@Th5i(@ZLxk@U% zzpB{j!DS++2!$$TMyscmpblm39;K{3K&3^kSN)Vg-EhlB%*D_CM*ag$MLq95>n^Tn z7^93kmhUBCx>0OJ##F0yZt34+mM*bILB%s0me9WCh}J413*$shc~0R4RYiqQfd<R) zbRXaCG|K373+KUkwf*rdu5y2q*nBH!dpT0JJLeE1C00*~6YD+=d34;9w+I*3Z5r3u z?C?1N={{NPSl6V4%o%|+eZzqta6!HZSf!9hyN@W~VO@E{@Ctt~qU@T=*r{qf-s0SC z!R%0C%)hnXoY^#F(G$#j6BDX0T9O_fN5f7=TL@0$=Z;<`Er|JM<*NUo^0oH02r#5b zuz&~hiOi@1hu7C0&<IEJ-wHDB%*eLecC^-gV9K0aP%eAZkkbt<_tJ=tY7RQ$)aZE_ zTgVrI#1Trg8-8hum*L7H%W@R<_SdBEp3>KnV2eJ!J=NzLv3|=}xgJUk4^P~LrDaOf z`wibtxZ}>+Yrb-|9(Ck;7pd%XS|F>oTRqa*^6<oE<mNuz3K+x#&gR}e@aI+MeOVhZ z^FsuWiT(wZ6jUt~_vHd>wlqt&G4BG8SXb={wIQKt?Ri}kqMst8=?S)R)I6t#!4YAp z_Pw2RK-m%BeDc2XAqDmA>3sX+5^;urUa3VYm|99m+Llz#;Z7-B1?bo_ZABycJ+VrP zs58Fd4B4Bwpcj%f)xPdhcUvSgB1)!ScxYaHJF2%QkFBFcLfFGT@j2X~)7%Dm02p{A z+qkjO+NgfqdUeInsID_Uu=D(R%a^RRN;#{^&Ty0%C477pR~1qxqq60X?aA>1d06F_ zWZFeQ{x&=2bjZNVF@>nm&|B+oc5T{vn?&V)Ek#1Wn2uk1?>0lisBDrw#o3E++>=Z~ zsUL$x&2SX|E!wVd^@08NU*MpWw|eD^UxaJ<f3$=CPZ(t-GY4aRBSj~DC*%KCzJq1E zWdQi$zEe5@`H_H{nbrOVqaqprCZHi!3PyIusnLvrpxoFT)SG$%>kceztEH*E{z2&p zN{)`z%i^xKN;BwrGwFHr{P1xHo*SeY)bUz%G;UZjM~M`2q*mSsc~H77mz7HDLpz7` z8QcmZWqdJcfXk=pH!zD)aw9GwOctwN2s9oeoRPy4+ZP0>+(K8C7b*w9w1jHOnIsmR z)U2<c-4$X=Z~C~3NsV<DL>6vZ5i`az&5$M7d*9C(5~UOdy!rY1!e?GDwV*(=$dMXy zN0Al6NP`IpDK*<pD_ywlHCjt;47#8yZriV<f*ww10w!g<3zQVt!P0M)%kzy!?wk5J zv>ehB5IJ?qmG_yNbiN<va*v|EU)KFgp$2Lt;uXjct<?z*InCuzC#^QB_$IUI`$reH zHTOnaZ}jr>zbMxUkUH^#zx93NKi2sFFSqBvRry$1vqd?q(Fcc(;Y3$gCHTPI`F5!O zKsqEw+X1(d+4N>_+hgKy&hA5E>4lof4vW@ibyZ09`h9Uw0`9P}paMZ4{%*Hhyoot{ z9IkL$MA~g1-=5x`laFq<mv8?d_WF`R04#2^11^%4JN&afv7q%_qO*;WXxfcXVs~se z#C0U#F1JgzFlZ_2MH&Jt{z*JF7i?6elA1KIV<vimJg0%a5N8Cp##;;^oxl6&Yt+Db zPR|Qe3)E}Sh4w47fHwhge{)Toc2UD}P{E+Jf%~zR9_&QCGWu9&3n%lc;5U}$%?thb z&<&)%^DCX<FjfUfLV(x0y+vIxCG(2ZOXBGVlkKl*YXkCWX2=U9=EuOT<>A?pEY2f> z%Ze}WUPOL~6-k1LlQM}0Na$m~pU|@jm&RI<f=b2c5fz`KxRtS4<k)>LiOtcbluNF} zptt&X4Q4Bs<y%|kwDIb(7l-SEmM$|iu-)aFQ<p;KSV~7(W}6an2PYULGppv+xAp_K zyR&_eMq}T3Zdwv!pZaX?nzFlQD_C6BY9BISx9_eob9#`eB~`MfOCB6v&qrqxPoi#a zLUky!VLd;7*=I2u7rn)>x}2JwoeM9+(6-eB=e=o<1CXm2AOGbXPf<ax-}-%Mfc~SP zlHh+@l$l!_+d4b_cN$o5(v|F@9MVYcMuYRk$Oe$tUoZb~OvDK!dGx$7Ndbl-HljVl zwHmpFX2}(TS5<Q<t)!vXHQos~n+++Q6r1t&jg6D<nP1*ltMB*sC$Jt)CY0gRewT@w z^vd1&ri1fJ9kumJnd63IBLv!DU%gL(Wr+>81t;ie*EvNT`beho)>1QuYZPLjjx}bC zA?KQFjP^qi(FolkEt6HX0Kpa$&jl!nY98IAYK3Umar$QZ6Ft-*wmpOr2(i(EnWyQO zpgZBDT`QJx=MbDO1J$6mew^c5H`6<PUIAzz6!&%fypb4{vb1i#z<?e`_o?K9SrGo$ zIK9?)4y#o61bMhtk5}`bp<IYhj+`R}IqMCSwWbFoo3W>}^Z-r(d;dC<^Jx?ETc#2N zqys4W?s>Xdv<TE-<duAZq<i`Fg!uWe6$l(TV^03B+e8WyzTu>cX~B>wXLRMwMgd#N zb}_;&tBKMz0%mDc<$>nFIn|5r9XT=?y%hYX`TC2i>$K_QKxuH(4v+J0BGucV{91S} zt2C`DxaE!Wx*u~6&RGSwh+xT4Lc8+a;M^Omr#EC#sKga%m%Q10vUi7cf95jdl}ij% zy1{+h?)Sg0F2mvonkI;rvZXbJCw2_o#_F4Q8&QgdmB<^86<&*QHwMV?n8F4xbG$J? zXf~0@rL+72CZ}0*Q<feJr!%KGnKt+j$sh<SXBaP}AGaYjzqv@v?|Y(<^+-~2YM*jP zu@7n}-$7}Ay;L{^8~IDUel8<l74Fef9}$ba>(sC~3$%nioa@jaV}h`}aYw03R1LRP zbUK7E0Y5b9z4%-Um^Zj)KG*yN2zjXT={UORfLXVw^f-FN6xkUw`Sh_XDYMDJ;>_>u zKj^%OZ=gAnuhFU63KLCNMs;Bbt9=yosRG9Y=0OxZ+OILmWHMdT;RngPaih$=$B**D z5NB=(7vJwhEJ2t5MV}2`*jilveN&|WqmCE<Kff*i?H@2(#aa<l8Oi6GL_g8k-CUv^ zDZ-#I<TgQ}vYD@bZUF;W0aHS<dV#pTZ^4Ll>o<P!O8B{M>vMKH4EqX#&3Q0+dK&dJ zjGK3$HoK*rlCKU(X#8^B{lay^b;5q4^ZvoR;|;q@#e&vBNod;GA>T+{IsmQN=)5>K zbAfEb(E>GMM=-U^QOj<;9!uA>6rrI$sna->pjcFlCOF#h%r|*%($Yt*O?i=PHfc;F zXktc*wBj~S?r6ChOfN*ytQ>L}1xao>V$q_f*-_6i0=HPPd@mRh@APH!BL%n}bY)(b zoiIOvH+xLGla?++|HyKmjG;ImLkQl4UoIdVDWHoDHBFhKewS#1CNq1PxcA40g2P^m z&BNb~EhP8EtpooQFO_tTTI-pPDf%MBMwSi>QqhJ#IN%tFs7vU+bhrzZmNIM~NpMML z(GrRjHm<e${3yM#y?CueILxV+mVcfq)qNiL(gv~Miyi2UM~!yf*HdmjR*Er$uFr1i zg<1PJU^7c)Z>XKnh`HEcHP9G+-%`W+DnWhUW}W@qn>OnRjm0>HI&95(6wX{Bwu{Ed zOmB~61QVP?#Fl|5<vEM=;(nss4e|t;0lWD8_9I56hFdlJ^PU5>q?H^#p`pgAzzh)r z`O13X-aRc!9QmLvPY)uMY`(xmDiV*PWVj%RGU;CA{P8>RICS%5Hj?B(``#dPTgs^Q z#ruD&>@1+NT%vvt2nvXRgmiazmvnbYN+aDR-Q5k+-GX$3bT`rs(ntuB_whU5y+=Gp zICog@TEJTGZ)W~8&&-~9_AYET#?v#TBN-cPz{(kglD*lHP_372T3nSbQ*jZ@GZFdj zOcCbfH+2(>B(`z+IY3;TfZW`vo)V#oEBb@%Duz?{P?<zxm~5e>1(K7ZZA=K<SE;$T zQ)D*Y)7KS!7ZE+w$rvXFLmz*T=Pe%0<1D_-ql~vyZWB&7*%Mi)4#^BcYbyb#4*L=e zec%DE_mpeGwfEAkq<><X0oK=tGHKEuU;cQMyjh;8Idhch1A2yJ+1adtt@kintiJhR zu(&ePe6~6YV|{?p0ZlcMX^EqSQqiSNjuyL8<lE6sLS`P71QI4)^O~%1e4%Y4KFoEg zdEhXXAke24#%P0kko{fSDC!-wFvA>cHN>}Q_!{+E!Rb;64b_!bBwWvleNL!|d-yVC zdtqFHn+IU!-i}Fl2_6!o%mtx0ad1&IdMRt*1obCYNv|?xyS`OHhro|>@@gxQVJS3R zuERT$A-y=oYdz)iV&J|Q&`jMT9WJLqUtR-Eg{=v{^DWk8++=tXZe^!se?%e@ZfSlb zEMl{MxC+meHQKq9zPJ~38#E<}c^G8Ac1%$DV)S-WI3g=KK!_P{9C0QE8vW&$Q*8cK zH2Q$v2tA3qmeX(8s7>pe!F$po@n7CX+zR<Hr$Jq&7F;axIZ_?-QXM-!V^ij4M_&n2 zH_85*ia+j&zh#6ZtMi0Vu=WFX=$qFBe&?>})86ecmx{5Op<?(D;LyBa{M__WjiUk1 zgdWt(xo{e}laQfJ3n=(pY4Ro(Yu|~Zq^%6gub|>;$}7C9aH_plN%_u|m`R`!QuQn% z^k{608zv4i_PQH(yLZ2>c1FiO$tnoVJOdwn@AXa$cVLnC$5U5-4pJe@0(D#je1TQ6 z>`qUtgcVp$>_89Uc8>kiGW2$D*zOg_`OCXyNX%(+&u5I)x~IE_?k<;TGKm*#8o1AJ zo+tg~Ss`YAR(}OpI`}+)Xb<ACf%7-pRPm=11mwlH%=`Qt<NgB*aITPW62vLmJM`mu zuqJ`Dv`^5Wy^U~48Fqv;Uk6q;?D;0ZMwi-Gv1k;>>ZzEB$N8F>BD=ioLM7^o=PPD~ z1+@|P`~pQpW;GiHPnwXMGWH1}+sLqT_Qd_pVaVb3#GPQD&HDPs2h<Q2Cn%osOF_@~ zp_y;<+(K@y*P|Q!C1IX3raG4w__#VC_%bu@uSQ_LIcGpRm&F{028~*US`?OtB_qxF z7@yk+)(;lI2X=UpHB!{U3kJa@V)5z=`Af17CEk@Dt%zk8q8z=4Bu!OK#Q9x#vCG>Y z!@)Wjg@;r~(gy@8+55*3BC5+7Pt0-Tk{zdn+nk??Ge<i|)-MYGxDd)dAY^MB<{+#a zB+3~RnQI#x^okcQ^v^L`^v;wd+$FefUQ*iNZ}FkbJ|wBV!PquH=uP*78U9qoPj7vs zr*5s>j3Kwb=l~tF5Xj&NZdCmG8~l?Tl!A3o&!f*Cs#DiUy%_oYBF=%iH-x-++eg~z zNE*k7;aL0#P9VP5;8nwT1^gllw|zyHF8++1t5MIwV`X;Hz2?BiiAZVcTo2LXIaS|# z!FV1YkTjJ=4$2t9z}iEL(ljndNza{G&J(pjCDzBMGtY3<u0uKZj!PTrIi~vJMqBpE zk1vpR9FjO9ow<tl6Qyx|2Nz77ZDsz*eG4DNrO_61eyJ+6JHA28W3<Et-9E#)E7Sd| zFwt~|`e^RFS>U+>Lrp=aI6adtOv`SR{K+`Aku^He9m@@h0El_3ID`Lk{p#xm)*G&E zuYh)N!O`ImeRX>g<t~}kWT@*Pk1KCKtg%TG+CVs&+Q3(DXzFI3ofllSQc((C;BEWy z*E?Yqy0M0mYo=QgPQxEDeRfL+m6&fWUwoRne&JV0R5WroQ=b9Fm<++wdz;;7^>l4$ zSrGmPH5EZ_CCXuTac)yrCCTn74``Nm1FRB>*)^KrTYtPL4$&@YM^QbqtbNs`i(w@Y zhw9ettGGzOU%Vyez%EUx%#O`onFt<g7aTD{zA8wws{cR|(oAD$?pF<eRN(4Ch3#@d zuZDF_jBpoh(#cFGTed~^lkY~XR+ArUji<1Xlm}}!B8GfWJ4>32dBMx)@`bdCy&U+m ztz~Oq4rviTIo1BKE>d@3PA$Tavy&IG6s`G2u%I=|Wt%+W2Z!B5>o><f(uR7Gi6mYS zBuWCfSqdC3i!0t!#q%HDEm7C58Cg5HV#3-QUiRj(6oU&Z6l<aN7=AAJ<<5t#G%o@1 zV<^EOZ9;Tt50cRQ=WjpG-jQ<5ERMoCvI-hu$wJzOqMbwPUT}sPoPo(ttqrJ!sE8X3 z2r*^|Cor(8mg1?zj#<VOJ{kSqTg3+^ob}!(xviX}%C+@5qVZR_);8HL5&A83EDfxe zYQhj$m>S@I-<g{$*xo(+<fw0g=~W&?-r`;MTFE7S)QSvak&@m<8hMV_YJ+8D${Bk_ zLrq$HsLa6yQl)#TOkZ(zA=FNlxl(1`*kI216m`U^JBz$-sB*3;-A|(NxN#w<jq){x zs_sI9{7$2fa=Y1H-2zDK>z!9xxbCNr)APzHQFQ*wsEB0^d)K!zMV1S$^3#ceaGK{@ zyK=P1c|5DTbKiJbzfcWdUXIudP12+PAoXX@Xiwv8H>(XBFkg{BPw__YoqG0-S5&m5 zv*is{4v$*!^!ZoWO$%&oG~qGq#^zJ3yqM;qzLAw0jN-divd$KnSQ_n>Vlao4DDFTG z1!vO=`!eNfhiuO>(<gdIPHwRk7-h<5wj~}fb*1=N&M}mUn1dZVe|)eZeY$^ljtaNK z;}9Z5uhYCGQuGGFhNKiG__(7gIB#Q7O^4gz_%b11LZg1PD!nm<3MCwAywjHE`aQ{| zjjOLi?oiiwFju#7SSpq)X0Q)3Ma%rCop5j7E9a~mC&5?Gq^n38Vmn$-TYW~AD;A%S za(tMI>Q+;eN2eU?P2F*TZI<4OTJvW9qJq|J+^(j=SvLP6SV)?r_&V#mtwplImr5uV z#!%}$(jbb}o&ZYw8pE(qhunCnb^7p%Z(r7(2$E<zqv)2o;Zgi}u+;KH(tgz2t*ozh zB%d$Q2ia^C#AYPJaqu)x8@k15G%|9eHd+#JEVAF+CgucWRCynr%Ic#UiR_3CZOYG1 z#B=q5r02yH*nCdOvw_N=$3oIKm6m|h7U!3B&0cdbkupNtUs{>qCpwd+i<SyPs~Z+V zC_rX9lNqqB4n`};^W!YV$1-}o%8U=2k8mW6*PJGGv!)U`FH7ewG#V@Nc5L(tS%mv# z15&xPt1hl-&=*DI+l9C|Xd=_6$>qgh)ggl_U+heu27YO>u9Klw^|dZARZ*I0$5u0F zyM1F&{)STb`4=w8=YpR+s4kRFV>HhFgZnimar1Oy=W0rBT^7Ao?=I_~5RUekF^oB( z<@gbBosSI8`Lb-{A~zrgB7IC;z4)v^RaFuP&F*X5Jn4R3s#uZS;HyzH&=UMt<g`$V zOCNP0ViOM3LvuFe9~L`G+SW$eI;Q$^z{a1lwUO;V0;t6*&dDM2!gGDXn<4a3t99gs zm-GPlfe;ih4^n4T43rTlcRbP-6~dg~>l%F8RyJ1A7bB<tV^3J+yJ=ic3183WA=AU{ z@jT~xlD{?yplMM3prhrJXvM=cs4d4wv9uFs<IJDCb}uKZ54V*2eqJL7qQ<8-mznsP z9~kd)ICF00AJLu0TGwZoIGG2#@}|+ZS5t8`YpeaJ@VP*%R~ObcQUTlcyP)h<%!f%q zqd526Vu&Nd?8kN}K&_|AR(NS3!=*W^Kc%dhr@RIeXsataKnK1FA*iZ%L=>g=vND4! zgxHprk?l}05RWyDL0te9njQZguStMC7fhsdlx{T23$AXm907XQYRnEE1x53CNnxbg zIJ}alW%^Whk+<Ib$Sg#iP=5OSG_jk7N#?$z!Q4+<G%3;jVG0E5#gae4c(3;C31rCF z>%CVP54Y*<B7Y6Gq}j#f&Rx<;aRkQ<u3#09XYZtH&bF%EK`XLBo3H#e1n{bowMd$* zxzCJl8b*=*l_Nl!9)=|Zj$LW0ydZqoUUE__Ak4;`_Z`gOp=puK?s?*xwNo4gsX5z5 z{wgTHN%>`kvE{ZnL%fK_$mmPX4qFBd<Z#r>-FS^o-5O>@AW&>fD(mjuDop@W;Fa~k zJ5H5IA?ukw8&P73+Y0qBE8i*5g7K2719n+uhf({2G~^xnnD+_D#@DMk<UXJif2iuS z4=aNTJTc6Hh0YmSrhvqS^uw?o*%pI|@;v~rpd3vWqR5)$k>fq3Fhk<ZGHhka{U|Xk zg6ttR&E->?WD_!SJnaIm-{5s%QA<qrg$x>En#_Ju8=89>oty8_UZEiUPCO+-n}+bS z84SD_Jte$13_3fXsdJ@QMljU-Lfr7z2Y!+1hZNM8K(sg1Zvv9z<fDD>xTtfwa<q`n z=PN?B=hskA`o0EBP4xFD_Xo_j+GyAeLk85N{czI~YO@&7j8d&6CJAB#;-t~M-16#X z6Gsh%4heDVj(*SSi7pKyO$2A8Zf7FxPWVoU5FX!mjK^mS;XB;V6Vey-5JPalCcDam zandOM>l63eMnjI$|AtF56|T;tOaSrq`PlJV2_~ijLJkak2XMS=%J(FPw>(xrOI#=} z-_!isyLq#OCZ+Mz(|)!!CXt#U#XgrO!{P?bmOW=nEQqrUpU#YUtm*tK<<gHKwkY?z ztt%W5%uaqk*PPG7(Mg)+5)IiqaXLnRsUKt|Bok>0;}vr(CnqQs!F9hNXD6xAi;{_x z$U)OpDjti;ib^F5wGFA^<HKmw#59P>F+{1v&c6cunO8wZYM*3Bwv@agexdOR<|JLW z51uTlvi&2+{$(FVXJ(Q^rcq9mnU&44oneeZtaY7ZINoGS<iYFu0)gJG&`_5YDGn%P zWLLVx#1=vFEZwqYcX#<9sFzqUt9qO5v8MuF87*vgfwE}H@ZlMV$@)F-qTki{X4thc zifPKCN)_jP6-^SN(Z$eQqpm?@Ry+TaW{xmV;j=9S2lpvDW1~`Nfv#($#wyehHSDft zXRs$?1l`-C2`0nMZPC}qhxR+2PYF@z<+s=4L<gh|jk%PQ3i+SV?7zb?uBtjqyh@>Y zBh%@R5qxS5NAE{FAM`3@M8T<<IEdVzEhk2SZwVP!vWIm&3CkdWnk+WwM2Oc8QiRU7 zVMRi%rV_!bTRPs1OZeH&5DRI+DLc9p0e1KbsuXR<rt#3)3#S~t5AFE^g?R;wJ6LLD z2+LGAp|R+-T_0Hj`Ywf*J2@$2>AC}FP*MU|X>?&M#A-dD#5l^nB64Pjh^vz>Q{ks4 zu?mP_fYP3p;;0EExu^<F(KES5z9Xq*qA9hFL6no<Hleij_6;#=>_@BLtIXo#r*wwE z%FE5dGd&3#&#g~aL}O-RG(b{Do86uB82^9{*(aaCLAh2hzIFv(ksCGk+?YvMEz#G; zuLOl0ak5c$QzGEPLtEHY`U69uapx}7OBSf_jk1GiWD9aAis&IFXDeK68yw+{;1Cdf z*(>D%5NPr}B5yjzo~Nw7+>|<^g0iU{Y_+Y=&shuQA8Ga2!i6p<by6>fY<DsJ3=8AZ zE3<Jd^aH!QD*4m<_`)`bK(G4rFM<@j{HXoL!Sy;b#4FGZCu5OQwsw8ggGB~mS6i+| zGN)CS@7tL#pKe)5lj|Q+>c5y9C_-U!3s~>^RHvev^0E^<2s^h3LN<cqb|>o$`-T|) z9g1*>JKH<=G(wF^dey9@bQ4QtH5|{oy88WWQ5^91*y(kjCquqDIDHf<D{5oK)2yUZ zg;33D%Qzfixj?;YvB&31cMjG~ZWp#)+A&@Mxx~Ve(|~nm@22zMr7@0DGDkym@$wD_ zTj(wI+6@bd_UsZ)qRqY8J?-yf;+E?_C){w}EVA3nYUXN6=Dd0<!og=^VEI*C9X$#2 z7OkB=4DJqGJLozEBV$*=@jFY8a*e;c;1zVW8C==wDm}Z<S0`gM9Y=_j5om#WJ`-VB z0-x}0?w~I=Vodma@K$X<@&*Y}7doas?V<Uc?9o8F69~Yi*<6&8-*KU;M~A$PhFR?5 zfOTaoYzxtw)~)R7Axevkt~@4<#LL7_kU|ma@PElW<ZabSGw@Ma5wB5G6db2DB&{{T z5G|;s2K#%21$(eb>Nck+f8}@kG^jHdUaICG42l4r&Uw>w#QdTW?5vA5f)-YUt)>*o zZ(iUeGrJ@+!3eg`k~}L=4s%h;x<gSymu6^_2C@`25lXtlr`CkC4vSgps(63Aavg*T z;wXI8YkH?|<JWp5Q=SKJ;E%obSxcBYH6fftiREU$vgqk@rnVE4`t)5(G(5MJJ)Mh~ z2}x?NPEIi9HQn`5TUy$aG^>lhHZ`94h}TI17g{1-JY*pK_u=}t?G1S|Q^a$$mTteZ z&*b}0Vz0Gv`kpCN$yLG_;r!^%4G_VVh1X8*Aa_!};w$~)(A_lh(QfX?fs2D%O(5P@ z2b7eE7Zeno#`YM98MDOaiZNmcRY)?|UZDmijF3V(5=oumnGy3Vt%bY0>$Ii*lhrMM zDJ~Ty-MTP%tc+=%63Z*LTcQKBowwmU#9Xpj`8jc4Xn1<%!&4x1ZMw0cPQP~H@P=&= zswiZ_kc`v!+h9}W@~)6n_KeX8BrL#S-4^up!E_L~yyMYfPj~_!uMQ#NcOl{f#UvZ| z0*V=3Q4eKv6hV}h#m3*BAw|nvhfT@cdm@$k<u<#_GsM&4xBcs_vqZ<*M1<aGNKTrt zeD&VE+mKh!<DXG_!tUpt(`j7;t|ksLb4saP5<p!sNcizDzJ^^kT~J)u<xTiwmbNTF z*Z7ChH@`unlwHx|)a}Df7y$JR(;{2IaD!w|0^e0h4X0&%Hrr35+h^6nP0tREu4LRO zf|K1AFfz{_uEYhkIfSCw5yUlnLDu4?V+&S+@y-atK4Oz^U})%t+s$dmlK=?349g5^ z;>t8Af)zB%Gvtxf_kCq8I|zuY({K4dVrABql%ln8?`!He^S@Ft$4P)|30%&CCr>@u z-J&`5#B&&>&z`x9I@|q}1&2$;s8)xzWd}(QXVD;#8@>M&u|*qG=)1O~iI0^qEFC3# z?Mtz_TH5g@`A7$Q?tTjOH?y-?IzF3v-85Hc12{AnRf*3nFWgs#M`bZ315jXBUcU&B zqrVZ_#M)UnG*(s+8N=-6Q6=By3b#LlL25P<*Zn-wB-~(+HFv^I$l)jmL$^;EwqU@P z_>zs?D?J(8Z2KvDtsUqle*!+8oJq`!HRnoXlv+gu{t|kE-jdK9Q=eOl95sid(p6Y& z<p31-k)D%In74aaNVkygh*}3)f{`e$<<f1iYhc)>mGhSj*>A0D+*t?&zQR8lf-UB5 zclne_%|UI+66e0h5MU8F66N#aio$-yX2$|P4+76?H^*}DiTS)x4@(ZZ+Xa_D_*1zQ zd>q#co}=A(VzG!Xo#Msf)SgYg;q|d1JF{N(%oqU$CWxRK=To5-4t)~c{-&KU*)g`Q zm(3~g$GqG{dQUDry|f@;alXE!v{v06OsKoCOkzQnCx1%GEqNJ3kln0l6IM;ylx=R9 zbKBJSdil$+BfnJC&biC1ac2k|+2`z1%<gl2?Ez}Y=nDxYglgK!>cS7uAzRdDU=4R? zSxx+UL{14sv2uEy)jms4V;Qogv_`OzhGtb(9QYbRkygztJEWk?5FJ0g{2Fe<WIY{h z+?n`l1JkoIC1Me`20a`VD}niprB~xvKNI)5`NctORF4Hdk0;`V>5ZqlS@;T`oh%#4 zq^N6yXS_0X;-%U;d0jGw$w|m}l37LV(gJ&=$<o{TA*d7HjS7laD7TfpHt2MS7A$nw zBo4)cHlLQ>Dc5vg1rJ`sY$6VC7*v}SId(FxW?v8{mHYbQsu-Q9a+g$!1odK<e~d4V z8SCKi3BAD0SBFzSF$!dpLt5={o<G0PQ>uIUhHu_F!jZ=Oj&@4-s7C(~ORlq>8`k_- zQ*BGFjQ`9Y?R~^bbb3_ROQi4Q6rL@Z#dMhtkqT9gxxNEs(?JfZ0q4yr2+fe>X_0fo z(M&rIE~>+Y1z8OigC%HZMu{!ST|7NO!%agMjLv?oR5fb#PUp3LR%Uyt90y<p{U)!z zBOG4YmxD^_`H)q98?I)mnN^fKEjf`i7&))GJ#>~D%6mUK%6;}O=QPgkwxf6Qn*jCs zj-xsbHl_Q7Zs*n6Xxp*mIb(kJ1Y#`2&Gie{3oh4FcFoBOM2<NWXXo3#o5{rbLLNGE z48WJ8k+b!JoN@MEU2P$DFqh0T%Bn4s*dzu@yMdsa9q;v*vGs9<ZTod~VxdVn23UD~ zu2O@W1sLNK(-TdzwmC{x<l~b`YwISkcEi2Om?6t~swJ||Q7w-rjhp$XJ|1FYTm5kD zI&SrFCe2%XqdpKWDajT~es)+Uwj%<a`zk#9(#;0@eg1pni|21ti?1)~bqY8N6nv9P z8oy79AgY;a$#xsTv+DNuOHH1Ar>k0CZ&A4WpA-E8u&x0{;CwRu!9@hl9~KeH+D894 z&QDP^0bDmBag9$`=QQ^5LuZmAKZkf#nGTlO!%s(r8jK2rI`8<mQ0M5L)k5O4e}y{d zHu&*lcg_KXjnhyhHqWMzwy=65rcT?Wn)bz674cprSl5VEI+jskDcaS}<^d?p473-F z_heMA$qsf+M`XG%gtkg<tebYCbC{10TD^v_cA+4cQT;{w{*Jn5`-mc~_~C_S8>5ez zYBV)6zqE!Jgw@l|tsD()n+-)bra{^Wi+tx)yb9a^mq@$>v<0bjEG#RZkzV+Ur66*C z+l=gn09LTC66wfhbhBslgo|qJn>0>>(_$YgdO|j7lsqnkIm_d8zhn+fg7uC&QOT0| z65^zhevL<Rr={Fgtzthksz>hzd5YGqnv<DEYpO@>-{<TpmRmY5n@ifK-yK(#-HtsJ z&P@5FVE)FT-M1e*c+mTl>3!}p@#lfN^>rl@tZrI!S$^B3I4Ya%k(aNS2vy3kv;#A$ zVQ)f{h<oU+t%nWJ^ClVBmaX0=Wwf9X8Yc_RWzsdX@}|bZ;{}Fz1*k5*F{oo+nF&er zwlJd3Im1+HgW*@}<S5=zZ{OC@pV}R;1Ut8Ef%xRuYFXkmiR36MO;`CAzMIxX#Uka6 zLu53|KHZZdnS=gK?0CKQWeh2&cr`WpIMY&5^*Qtf0`{w}H?n&eN&7tqBvUWE)eeYO zCk`D)ZHp1!A|jwri(w_?vf^C|!9z4HtWV}DYs65VzQXONPf<`sD_JR*C*&C=_CUT2 zt?g30e1d=tqEYG$v%s{a&DSs8j|Rq(_w`2zMU+=c7G!$3jx#J9xQ59!%oC2@R<cr8 zQv~`0f4$l;JU&rB!x-5SUDU<iur!@)?#~ha$7t&Z%=Fy5q+LC_gJ%uA)s$VXuAeIV zV!&oDi<=h5(M>=Q6KpB+b^5jvjwsM27LDT6KgMB7`W&jJllOy=vD7Uq4?sk`sOyKL zWE_~3k1Z?^TfuwP#vT`N87a*rj2ajeqTixbfF_;Yh1iDpGs1bjU6woXJ6?Q*ENYQE z)G4ApmY*y4tuW^`9AM?n|KLN1{lG)_+hV;$saGCJ8TGD7WiK&T1(R1$JpjKQhLvwZ zK$c(!l>{x0mEb92=AgtADu#s-TMR~nrE`Y7^{7npSZ`6mN*%>Gak*F<sb0D}KB+k5 zlcs}eC<z7~n9jxx=cVJTxbvo4zz1OSvyUig^rn<{`;vvTAx3YA1R3<@C#%*~RG1)W z{mk6*>Y(@|pR3H0fqB79GC0+dl019Sq_rVRJs{&Q+e}EJ$d#xFqexw-ygrIg_Z(*T z^7J}e?&~<y<V5H~HL14(p|R9qO0@#Nc7VR=kIdpwl4n9R<W8Ub@dlg>P?H$Kni@4J z$Do9><HX{6B_o=QhRCHQk!cuCYho$t(`=m$asnb&N1rJ>=BuxY=o5req*Ot^>Bl{N z@qsm3w2GFoBtIudxSf4M_$9x$5Bfw<<!q}AlfhRa7Fn3U>Vc>UMK7X^m&vtp#C%#t z<{sxYC6uzVGp|fH`l{)Q*|O!xFtxv&zl~x7yjrwa(-ZOvC?bJYibTi^Dwn{tF}oc@ z&I<U948hZrD3E`ajFo%Cu_3@{M(!tJH}o@rIp#!@ZdAS+G4J+1sq}CkIw4_s9<<4b zpu@mqEIB!*N{hN2q-7IaEat*)z`kyPL=OXE_nDW@)rZ_m>jAVlgF+%`%%zm-N=&nS zB)ACqL}*NVsP6(+@cyWoTPU&Jeb-{*tX?DnI$UB984_yNksvG=gw;2gY<wA%9Lsea zcye8GF-bZ3VcVbjLW0Fwqk#~+<Xzn{KDr{otiE}u)mIx9Ms&xSy_S%!F+&?W;4qeU z-GVTyXhC+GQ*!gtP%2U|xWck&W;35ZR#l*Z8j8+Oe9Fx*UhB_Vk#TlxMNzSjL6J-J z@!2}!9BvKJSfQ_a)=QP3$<MT1s@yQg%a0~+7#KYL9y|+%Nt`0ska|BF->>xtHI%MY zYS)iyHLsnHJ^VKH7!eZ)efw7WXI)|2aY_lIgPXBr*v~-)!I%q&H%}`K$k(7XO3uVf z>THiiyoWxqbbhSf10tAfqizWdw5ltan2UTcaTgVUqM@e^b+aYY*_h5B&{pOJ*8v}k z(y^2RZ|rm4x*_kYk(6CNxt!34HRFJrPeyW=dPhd8TcOCPRv(90Uw~e*Q%juu%3Ym* zh^lxnKWWS&RtTA(`^B-cG6^d`ebbjphrr3xp)HcDbutGU1H1kn3KGR;sIB*(>a>&g zgQWw&Ch(t3Na8bgIkMyohoBzjXgS7DfvPg$_Pr%kZ4r)n3T^};(9(A4r~`^o=6T09 zVAmlw3=3s5^*)m}iQt1BXfoCisk`_!TM`y*7ym}mZWfz}jTxsEaCrx7x}3u8$+t2y zo5S(iE~SX}XN=4o#UkmSl@v^zJNA&z$(GyaWv7Fs_Uw5HjW#(~E+lQ=o+whX!G!4` zxJ@WK-jVwl-JoJS_%@&{@JJk-yD9Q=ulCBzTW`1%9MBFDeCt4AjsCiO0p-b-&F&_U zo_3nDm%Sv($>qOLxtphP*EVuQ6EVc>=O#4B$;{~Y%JMyIRf?^f0W9A;?2Khj@Jon8 zGq!wO?(A>0nGR6SZ(hG{O}~*2Hf(zbZ=SV7+7Q}m#XZj(5q4<pfN5}RRu6<Px5o-~ zoI!7kNTKQ~t8@3!%tu=3gw$_>#7a+8gCZeiyj`)=^5H_&{@|dkeuOZ&V!#Gp8k6bq z?DcodueL<q<t{{fywa5*oye1ceY<Rnwyd>3Yy#HrIykHS=FiqSb!ueL&FcfVA>Odi zUVUbwQB;In<b6@JvsHe6&U)a4*{!c$Zq@8lRQgSH+ObHN6T#UDJDLCcPV5zW+?yDf zmTIpRrD4k=!-QstKI(~@FLm|L1<PvZsBWnmO_<uHcpOvSSvX=HAe{*u)H^=+ToLGg z(YR68yUm=r75dfgXZZ30g4sFlzrvRvUi=JS-gb@Qj0(Q<nE-N?z!|x-n{itE$`Iw& z_!behA?fb;oX11j5%RA?70-#?rxU=Q!8YJw^Up71JUCJObDKc^XXNs=k2uMdqA7Zc zH@u7)#?d46xi<qQ$@uu59j^)J2$g!9?96+pzBjR)d;0~3UEOGtR7WRRrX+OubYz19 zTODyxj3XsEMoLrJBga+MWc#QT+na6~<_Nn(Rs0S6-Dl22PD}rDrR<`YpnG~#pJ)Mz zNLOzGj>rJ+Gk5=Wz(w1LeA=|@Yxt6@tTh&kmrL~?r=gOAU}LKoZhm8o1Obgmd8m;{ zMseQ?f`U%pMpg!}>zdk1Gc=TIWI917VkEk96e#IIYQEQVjE~3)G!_md#R!%iC7&0= z^$+VNigaNY`Z1wLLXYvz@0B;{%zT%;o;V_Wn{OO!K><vK{gG)f5^^Nkii%Q5`VetY zUN7nm23$C0SjYjMgS^Nc#QJM{46;fy9W~NyGi`x&0qo1x-S%n3G3%Qr5ub~!@;VsD zt;o|cg<jFn;eR>OgG^Lt5a>$(9%jeGi{8UGg-D5!CGxc3>ilzbWCXJ+B|dWY_Hcx= zXm+=VL5;Ml8)o8Mn%mQu%ZW7-zS%eBK61Mv+RrN^^fD*DPuby_Wu79-;rB!)yu(0V z;IDe!P8RVVy&#+idu-@^ARVkx%ae~-M2Ul%ba?v^!^ktlk$H&=J?dO3J)hxehx{s0 zww^{%S4YxfUbejBpB3*clOa(y+Ym~9b)HeGXaO9mj$!rqe1hnTSAAg-Cc8Kg36@EK zv3y0=XQr*1AGRM=+jIt{q@(IHh$S0TBz1PdCnA1hMV&n~kdb;P`OStNb}g`Co*T9B zK)&HaM5HR^OYtS8r3hIsJ=E_j#wyCLJ8JUzSG$YXQ9df(;AxlNnZAzNd61Hhc8Iye z7-wtWG7knI4M)&{+|J}R+dS`cbbzH2SP6U$b!Jr$aj<swvF{8Frv!zJx46vo9nq<K zzeY>w*_)d3kK&YfYkdtKna^Sbaa&%zg-V=zmumRK;}}J+rj_`h<aF_pV#npxtk`~b zEh<`0M8gYJ_^jqdMH&uM>u0CwM=$A_J4JXsN=tlBC%9I1^&&7)yn*=Sg`h<>p!$Uh zvG2cZx?=i9m2hIbz2Wz%6wh&6-_wGa6{p5^M#MOefjmy~Y3zcgI7VkGHoDDBJ$FdX z#Y@!QrDM>>p(7%h_x%(;13QhSJub&yTy<`#R9nN<uW}K>o<RS?o5^ZQV(xQFF#%h9 z+s6%vZ0<&dyn6pBaca#9c|NyzMpWwSq{&Wj?jH*tLF)v$bd*?~;$x7Uq&D4q<_CoH zYZbaS(QWRcB<<bfEa);ztsBk!pKCvS)t1_bsx?)cPYhu6ji+VTmbTj3)4q_KXEao3 z{qRyin4($Z%q%2s58MGeOiZg)OKRmAlMJ7|K@(%JY|B0*%F#j}k-)RJv{k_uph7|8 zgE!n?cYBFECcx!FhT5CXo;A+rdqujaBq3|IiL2RJYBuT_m#ykw<GPZ6O~$cA*Eeq# z+hQc2H&Ofqmk^&;F+RWh(x{DqxwijBGm(e%O#$@zV79O~)0D>|sRh%r@{BQ@UQs^v zYwe{Q=-gZkTK^?lyC;UzN%f&8CK+9X=LX>M-b@T_N%3ID2hc;r?|&R<)PC6QU^?Vm zG8f1;S*dwa=#039$mIe%P0258atpO%E?_y>4LX_Ftuo}nnozdF$p|-a7$Y}Ua>P+R z*o4w{J6h5&RyNd3bGh|R^tBtj(NUT+p-f)J^TVxC))5!fNC{MvVd`zEi-SdZq(dO` zMWK)}SF=){!Cf`>RT*E2d$<VBinFxN-98hj-7-$@Q&ou<*)CbxQ_xfPPbW$%3f#T= zL22j_WcJZQupK3*2c*Lb;gyHoHcRB-G!aaO58H2zuHHc$+FC`+3~jZ|Dx>RvaQ(_W zv1qPf$$cb}J^^9f9C_w@IK+1x!8uEFj%*!YIiovV7Q(T8nrOw3fj!VNZG!e>_N&&d zpWzGRAeZ8g`GcC%eoGTVOJK@F4Sh3i8)v@#X{8_BRi>JG%y&Di3&v9~7D<MYqX>+a z3@MHytfjd>M1{|&{P;+8?nZ`KwiBmb8MEbw@JxTz*m`W*LF=GZT|25)M4hr0VwKv8 zj$b{ExLF`kRL9D?o)&6!yIgd7P@+L#W)Mj|pp}l9ne8bJ?z%x&7rn29=Nr=$T5Iej zf!M=QxH1@hrAEM@j*uQ295$Q>?pvs#65OT?zVE)_pkQ<Apk!BJje4hZt5tE=YBV9P zE(N>9&$9KrCB=WDBSo(QgedhYvoh&KhRLux3DMY^p>x}4no6^7HLMO-Kk<z%L&w5^ z>kpovYbQ=tu#;wB!$RwSVv>V`A%P%)Ktck4fZ&02J&k{D1^k8qyrO^v0_?NjOOk>L zyi}r6LNt=RQldhF@(R?FLW&9yAfQLz?(S~;e$KF<V9+4YARs?!0PfcW4lKt0POZSN zW^{}+|L^M$eHH26S9kySt48KFw$^rL`sToEPDU2y_ffxAO4`_}pc}XhSqBsh?H-C4 zsOHa7NYXLN+x@&VA!BDNNJ#hF+VE%5e&zWzgWoOyx6%m!5z+7QxPbrslSlvi`x?Ik zjV|#i?STUJ016S`1DXK;xd;5|@0-umLf6E|+)&m|-%kJ0(!z4ky~Rfd0omaP0YSJ2 z=LT$|U*V5bd*giPDIO{aNGHYbpaRn0K=)0i->X}nG_uhPG~y=kVYpW!MBcwZzc($v zwmH9rxvi18oxZ36udbDyk+r^!1faqrMUG4mdeR59@hR}RpOX;Z|8GtY*GZHU&&&mA zLTcc`?N4j+@AO{a-*XZ)*L$pAa8;U8N&_A3GXTcA2Nf6nBlHnTD&mlsNC4jPKbQyN ze`Y>h`DoM{3s_(`W)|rFKkpR(os4Auz;x8rxBSP(=kFbb7EiW005INTfq@A39(P#& zA?_m*@OYn`qX8q7ATS=>$Cj!*h<#WEE9_d_4xqLA0TsyZl@?p)-?2Y?u#mOBzNCe@ z(LaOM{jSEVaJhy<fX@uH+<iWu{(s{?Tz+*XeCh^ZKaB|y2u5(P{E_eeoi7QLUtjOP zmA)p4Rq`dEOfew*eR`qgf1y8I_D!N*(L12qi31P%{U$|o_;<RTzKxx!?IS&<cl3l# z1L)Y_fX{ubh2w+Rhf6DhE^Y<_Ab0=qyb!qj32UpQZTi@FVV+`p{u+2*aR2eVIJ-Z@ zeMAL^)jN?WpkurPp6vT7AoxCreOQI@!%SFkK!r0vg`Y1x{++Hu{(!YJHwWgu$7ERG zv#JvWWS|6OxIY}diFgqFhz|COp~%!gVdDTT?sLy#ALc$R1iT|0EepT|EG`iGdqOyW z_;>FA#=HD^-}9a^@JI#57`1Gzfzd+^5a)hI7}@`y89iJh#tqeC1E6V<fLi^$kMVc< zp8sG*`qqSm+U6GKk6Ja?;IeRiKvnR7G5mfG&BgyM2l_|EBCHV_gapbD0a!`*bJ!{W zZ#ghLl0%5=(wa0eKvxB9$$Kg()IE~JBV=(Leo+Nd5RekC-^n*ikC7j4S^VL#TMt0@ zpH5}&j|D}Lp#Nh{{%*SgUI?roo#}~-JR_8VxvdvK|2!)FJ9)i$0Q-mxn;%+fNCD#6 zKd9934^bbMpez(`iyP?NZ-JrUz68Zcf27*}!&BMs(>nu%ySOnZ2uKzn!+i;OQ6IoQ zB7x!MUVu1I{S)AkzfT24e~9|91a04ay8rL-+kI*#;Q8j~n&Kb5z{y<qv2oi<P)lnQ zC?_`D?>00F{-3Fj2ynOA3po$8R3Kn?+&9eSNFRVcTz}J#G_|Ba7jOs0ho4R!{!ZRB ze}*cW8(9Ghwnqx=DoUn)1gM}2sPHqI&fn=7!(;46&^}T)-0OfA;eZzR(Q<5$q90b| z*HF&)6^VTP@94iHS3Rc4uMx6-27~@PmB~NKek?Tf?~mcHVUF%=RH^e=W{=4KtINat zXm$NZ(GSc2tFN#7=pxrYqyN=|;_rg|>dxx^EcL?s5%eQ^{OaT8KH1mjG4jK5{OX?N zesAmx_yhTm9&>)z<5v$J_t{24kFy^x_pkmA?wiD!A%9^1yGM}U3;pZ+!1qnpk?;q> zk2K-0?=0QtLd8DJeOQQJ-^}>=#?#-a>BGNsAASGncS(M|O?=<Jqe=gdSv(@nuQ$W) z=dhUbUvqd^reCkY+@FVSi~l``f4gt?yE4C?nckl=x6A%aeMF33cb)G;5vm`6{$76w VVEO_9;RSxmUIBA&6JRib{2!V9T$TU; literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m14/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m14/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m14/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m14/project/MOOCSettings.scala b/previous-exams/2021-midterm/m14/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m14/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m14/project/StudentTasks.scala b/previous-exams/2021-midterm/m14/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m14/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m14/project/build.properties b/previous-exams/2021-midterm/m14/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m14/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m14/project/buildSettings.sbt b/previous-exams/2021-midterm/m14/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m14/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m14/project/plugins.sbt b/previous-exams/2021-midterm/m14/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m14/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m14/src/main/scala/m14/AbstractBlockingQueue.scala b/previous-exams/2021-midterm/m14/src/main/scala/m14/AbstractBlockingQueue.scala new file mode 100644 index 0000000..a91a39c --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/main/scala/m14/AbstractBlockingQueue.scala @@ -0,0 +1,14 @@ +package m14 + +abstract class AbstractBlockingQueue[T] extends Monitor { + private var underlying: List[T] = Nil + + def getUnderlying(): List[T] = + underlying + + def setUnderlying(newValue: List[T]): Unit = + underlying = newValue + + def put(elem: T): Unit + def take(): T +} diff --git a/previous-exams/2021-midterm/m14/src/main/scala/m14/AbstractThreadPoolExecutor.scala b/previous-exams/2021-midterm/m14/src/main/scala/m14/AbstractThreadPoolExecutor.scala new file mode 100644 index 0000000..670294c --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/main/scala/m14/AbstractThreadPoolExecutor.scala @@ -0,0 +1,7 @@ +package m14 + +abstract class AbstractThreadPoolExecutor { + def execute(task: Unit => Unit): Unit + def start(): Unit + def shutdown(): Unit +} diff --git a/previous-exams/2021-midterm/m14/src/main/scala/m14/M14.scala b/previous-exams/2021-midterm/m14/src/main/scala/m14/M14.scala new file mode 100644 index 0000000..82e2e4c --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/main/scala/m14/M14.scala @@ -0,0 +1,80 @@ +package m14 + +object M14 { + /** A thread pool that executes submitted task using one of several threads */ + class ThreadPoolExecutor(taskQueue: BlockingQueue[Unit => Unit], poolSize: Int) + extends AbstractThreadPoolExecutor { + + private class Worker extends Thread { + override def run(): Unit = { + try { + while (true) { + + val task = taskQueue.take() + task(()) + } + } catch { + case e: InterruptedException => + // Nothing to do here, we are shutting down gracefully. + } + } + } + private val workers: List[Worker] = List.fill(poolSize)(new Worker()) + + /** Executes the given task, passed by name. */ + def execute(task: Unit => Unit): Unit = + + taskQueue.put(task) + + /** Starts the thread pool. */ + def start(): Unit = + workers.foreach(_.start()) + + /** Instantly shuts down all actively executing tasks using an interrupt. */ + def shutdown(): Unit = + workers.foreach(_.interrupt()) + } + + /** + * A queue whose take operations blocks until the queue become non-empty. + * Elements must be retrived from this queue in a last in, first out order. + * All methods of this class are thread safe, that is, they can safely + * be used from multiple thread without any particular synchronization. + */ + class BlockingQueue[T] extends AbstractBlockingQueue[T] { + + // The state of this queue is stored in an underlying List[T] defined in + // the AbstractBlockingQueue class. Your implementation should access and + // update this list using the following setter and getter methods: + // - def getUnderlying(): List[T] + // - def setUnderlying(newValue: List[T]): Unit + // Using these methods is required for testing purposes. + + /** Inserts the specified element into this queue (non-blocking) */ + def put(elem: T): Unit = + + this.synchronized { + val underlying = getUnderlying() + setUnderlying(elem :: underlying) + this.notifyAll() + } + + + /** + * Retrieves and removes the head of this queue, waiting if necessary + * This queue operates in a first in, first out order. + * until an element becomes available (blocking). + * This queue operates in a last in, first out order. + */ + def take(): T = + + this.synchronized { + while (getUnderlying().isEmpty) + this.wait() + val underlying = getUnderlying() + val head = underlying.head + setUnderlying(underlying.tail) + head + } + } +} diff --git a/previous-exams/2021-midterm/m14/src/main/scala/m14/Monitor.scala b/previous-exams/2021-midterm/m14/src/main/scala/m14/Monitor.scala new file mode 100644 index 0000000..97dd73a --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/main/scala/m14/Monitor.scala @@ -0,0 +1,23 @@ +package m14 + +class Dummy + +trait Monitor { + implicit val dummy: Dummy = new Dummy + + def wait()(implicit i: Dummy) = waitDefault() + + def synchronized[T](e: => T)(implicit i: Dummy) = synchronizedDefault(e) + + def notify()(implicit i: Dummy) = notifyDefault() + + def notifyAll()(implicit i: Dummy) = notifyAllDefault() + + private val lock = new AnyRef + + // Can be overriden. + def waitDefault(): Unit = lock.wait() + def synchronizedDefault[T](toExecute: => T): T = lock.synchronized(toExecute) + def notifyDefault(): Unit = lock.notify() + def notifyAllDefault(): Unit = lock.notifyAll() +} diff --git a/previous-exams/2021-midterm/m14/src/test/scala/m14/M14Suite.scala b/previous-exams/2021-midterm/m14/src/test/scala/m14/M14Suite.scala new file mode 100644 index 0000000..cd04f2a --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/test/scala/m14/M14Suite.scala @@ -0,0 +1,159 @@ +package m14 + +import instrumentation.SchedulableBlockingQueue +import instrumentation.TestHelper._ +import instrumentation.TestUtils._ + +class M14Suite extends munit.FunSuite { + import M14._ + + test("ThreadPool should put jobs in the queue, Workers should execute jobs from the queue (10pts)") { + case class PutE(e: Unit => Unit) extends Exception + val nThreads = 3 + var taken = false + class TestBlockingQueue extends BlockingQueue[Unit => Unit] { + override def put(e: Unit => Unit): Unit = + throw new PutE(e) + + override def take(): Unit => Unit = + x => { + taken = true + Thread.sleep(10 * 1000) + } + } + + val tpe = new ThreadPoolExecutor(new TestBlockingQueue, nThreads) + val unit2unit: Unit => Unit = x => () + try { + tpe.execute(unit2unit) + assert(false, "ThreadPoolExecutor does not put jobs in the queue") + } catch { + case PutE(e) => + assert(e == unit2unit) + } + tpe.start() + Thread.sleep(1000) + assert(taken, s"ThreadPoolExecutor workers do no execute jobs from the queue") + tpe.shutdown() + } + + test("BlockingQueue should work in a sequential setting (1pts)") { + testSequential[(Int, Int, Int, Int)]{ sched => + val queue = new SchedulableBlockingQueue[Int](sched) + queue.put(1) + queue.put(2) + queue.put(3) + queue.put(4) + (queue.take(), + queue.take(), + queue.take(), + queue.take()) + }{ tuple => + (tuple == (4, 3, 2, 1), s"Expected (4, 3, 2, 1) got $tuple") + } + } + + test("BlockingQueue should work when Thread 1: 'put(1)', Thread 2: 'take' (3pts)") { + testManySchedules(2, sched => { + val queue = new SchedulableBlockingQueue[Int](sched) + (List(() => queue.put(1), () => queue.take()), + args => (args(1) == 1, s"Expected 1, got ${args(1)}")) + }) + } + + test("BlockingQueue should not be able to take from an empty queue (3pts)") { + testSequential[Boolean]{ sched => + val queue = new SchedulableBlockingQueue[Int](sched); + queue.put(1) + queue.put(2) + queue.take() + queue.take() + failsOrTimesOut(queue.take()) + }{ res => + (res, "Was able to retrieve an element from an empty queue") + } + } + + test("BlockingQueue should work when Thread 1: 'put(1)', Thread 2: 'put(2)', Thread 3: 'take' (5pts)") { + testManySchedules(3, sched => { + val queue = new SchedulableBlockingQueue[Int](sched) + (List(() => queue.put(1), () => queue.put(2), () => queue.take()) + , args => { + val takeRes = args(2).asInstanceOf[Int] + val nocreation = (takeRes == 1 || takeRes == 2) + if (!nocreation) + (false, s"'take' should return either 1 or 2") + else (true, "") + }) + }) + } + + test("BlockingQueue should work when Thread 1: 'put(1)', Thread 2: 'put(2)', Thread 3: 'take', Thread 4: 'take' (10pts)") { + testManySchedules(4, sched => { + val queue = new SchedulableBlockingQueue[Int](sched) + (List(() => queue.put(1), () => queue.put(2), () => queue.take(), () => queue.take()) + , args => { + def m(): (Boolean, String) = { + val takeRes1 = args(2).asInstanceOf[Int] + val takeRes2 = args(3).asInstanceOf[Int] + val nocreation = (x: Int) => List(1, 2).contains(x) + if (!nocreation(takeRes1)) + return (false, s"'Thread 3: take' returned $takeRes1 but should return a value in {1, 2, 3}") + if (!nocreation(takeRes2)) + return (false, s"'Thread 4: take' returned $takeRes2 but should return a value in {1, 2, 3}") + + val noduplication = takeRes1 != takeRes2 + if (!noduplication) + (false, s"'Thread 3 and 4' returned the same value: $takeRes1") + else (true, "") + } + m() + }) + }) + } + + test("BlockingQueue should work when Thread 1: 'put(1)', Thread 2: 'put(2)', Thread 3: 'put(3)', Thread 4: 'take', Thread 5: 'take' (10pts)") { + testManySchedules(5, sched => { + val queue = new SchedulableBlockingQueue[Int](sched) + (List(() => queue.put(1), () => queue.put(2), () => queue.put(3), + () => queue.take(), () => queue.take()) + , args => { + def m(): (Boolean, String) = { + val takeRes1 = args(3).asInstanceOf[Int] + val takeRes2 = args(4).asInstanceOf[Int] + val nocreation = (x: Int) => List(1, 2, 3).contains(x) + if (!nocreation(takeRes1)) + return (false, s"'Thread 4: take' returned $takeRes1 but should return a value in {1, 2, 3}") + if (!nocreation(takeRes2)) + return (false, s"'Thread 5: take' returned $takeRes2 but should return a value in {1, 2, 3}") + + val noduplication = takeRes1 != takeRes2 + if (!noduplication) + return (false, s"'Thread 4 and 5' returned the same value: $takeRes1") + else (true, "") + } + m() + }) + }) + } + + test("BlockingQueue should work when Thread 1: 'put(1); put(2); take', Thread 2: 'put(3)', Thread 3: 'put(4)' (10pts)") { + testManySchedules(3, sched => { + val queue = new SchedulableBlockingQueue[Int](sched) + (List( + () => { queue.put(1); queue.put(2); queue.take() }, + () => queue.put(3), + () => queue.put(4) + ), args => { + val takeRes = args(0).asInstanceOf[Int] + val nocreation = List(1, 2, 3, 4).contains + if (!nocreation(takeRes)) + (false, s"'Thread 1: take' returned $takeRes, but should return a value in {1, 2, 3, 4}") + else if (takeRes == 1) + (false, s"'Thread 1' returned 2 before returning 1 (got $takeRes)") + else + (true, "") + }) + }) + } +} diff --git a/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/MockedMonitor.scala b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/MockedMonitor.scala new file mode 100644 index 0000000..64aa205 --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/MockedMonitor.scala @@ -0,0 +1,73 @@ +package m14 +package instrumentation + +trait MockedMonitor extends Monitor { + def scheduler: Scheduler + + // Can be overriden. + override def waitDefault() = { + scheduler.log("wait") + scheduler updateThreadState Wait(this, scheduler.threadLocks.tail) + } + override def synchronizedDefault[T](toExecute: =>T): T = { + scheduler.log("synchronized check") + val prevLocks = scheduler.threadLocks + scheduler updateThreadState Sync(this, prevLocks) // If this belongs to prevLocks, should just continue. + scheduler.log("synchronized -> enter") + try { + toExecute + } finally { + scheduler updateThreadState Running(prevLocks) + scheduler.log("synchronized -> out") + } + } + override def notifyDefault() = { + scheduler mapOtherStates { + state => state match { + case Wait(lockToAquire, locks) if lockToAquire == this => SyncUnique(this, state.locks) + case e => e + } + } + scheduler.log("notify") + } + override def notifyAllDefault() = { + scheduler mapOtherStates { + state => state match { + case Wait(lockToAquire, locks) if lockToAquire == this => Sync(this, state.locks) + case SyncUnique(lockToAquire, locks) if lockToAquire == this => Sync(this, state.locks) + case e => e + } + } + scheduler.log("notifyAll") + } +} + +trait LockFreeMonitor extends Monitor { + override def waitDefault() = { + throw new Exception("Please use lock-free structures and do not use wait()") + } + override def synchronizedDefault[T](toExecute: =>T): T = { + throw new Exception("Please use lock-free structures and do not use synchronized()") + } + override def notifyDefault() = { + throw new Exception("Please use lock-free structures and do not use notify()") + } + override def notifyAllDefault() = { + throw new Exception("Please use lock-free structures and do not use notifyAll()") + } +} + + +abstract class ThreadState { + def locks: Seq[AnyRef] +} +trait CanContinueIfAcquiresLock extends ThreadState { + def lockToAquire: AnyRef +} +case object Start extends ThreadState { def locks: Seq[AnyRef] = Seq.empty } +case object End extends ThreadState { def locks: Seq[AnyRef] = Seq.empty } +case class Wait(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState +case class SyncUnique(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState with CanContinueIfAcquiresLock +case class Sync(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState with CanContinueIfAcquiresLock +case class Running(locks: Seq[AnyRef]) extends ThreadState +case class VariableReadWrite(locks: Seq[AnyRef]) extends ThreadState diff --git a/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/SchedulableBlockingQueue.scala b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/SchedulableBlockingQueue.scala new file mode 100644 index 0000000..16e68fa --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/SchedulableBlockingQueue.scala @@ -0,0 +1,17 @@ +package m14 +package instrumentation + +class SchedulableBlockingQueue[T](val scheduler: Scheduler) + extends m14.M14.BlockingQueue[T] with MockedMonitor { + private var underlying: List[T] = Nil + + override def getUnderlying(): List[T] = + scheduler.exec { + underlying + }(s"Get $underlying") + + override def setUnderlying(newValue: List[T]): Unit = + scheduler.exec { + underlying = newValue + }(s"Set $newValue") +} diff --git a/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/Scheduler.scala b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/Scheduler.scala new file mode 100644 index 0000000..448a809 --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/Scheduler.scala @@ -0,0 +1,305 @@ +package m14 +package instrumentation + +import java.util.concurrent._; +import scala.concurrent.duration._ +import scala.collection.mutable._ +import Stats._ + +import java.util.concurrent.atomic.AtomicInteger + +sealed abstract class Result +case class RetVal(rets: List[Any]) extends Result +case class Except(msg: String, stackTrace: Array[StackTraceElement]) extends Result +case class Timeout(msg: String) extends Result + +/** + * A class that maintains schedule and a set of thread ids. + * The schedules are advanced after an operation of a SchedulableBuffer is performed. + * Note: the real schedule that is executed may deviate from the input schedule + * due to the adjustments that had to be made for locks + */ +class Scheduler(sched: List[Int]) { + val maxOps = 500 // a limit on the maximum number of operations the code is allowed to perform + + private var schedule = sched + private var numThreads = 0 + private val realToFakeThreadId = Map[Long, Int]() + private val opLog = ListBuffer[String]() // a mutable list (used for efficient concat) + private val threadStates = Map[Int, ThreadState]() + + /** + * Runs a set of operations in parallel as per the schedule. + * Each operation may consist of many primitive operations like reads or writes + * to shared data structure each of which should be executed using the function `exec`. + * @timeout in milliseconds + * @return true - all threads completed on time, false -some tests timed out. + */ + def runInParallel(timeout: Long, ops: List[() => Any]): Result = { + numThreads = ops.length + val threadRes = Array.fill(numThreads) { None: Any } + var exception: Option[Except] = None + val syncObject = new Object() + var completed = new AtomicInteger(0) + // create threads + val threads = ops.zipWithIndex.map { + case (op, i) => + new Thread(new Runnable() { + def run(): Unit = { + val fakeId = i + 1 + setThreadId(fakeId) + try { + updateThreadState(Start) + val res = op() + updateThreadState(End) + threadRes(i) = res + // notify the master thread if all threads have completed + if (completed.incrementAndGet() == ops.length) { + syncObject.synchronized { syncObject.notifyAll() } + } + } catch { + case e: Throwable if exception != None => // do nothing here and silently fail + case e: Throwable => + log(s"throw ${e.toString}") + exception = Some(Except(s"Thread $fakeId crashed on the following schedule: \n" + opLog.mkString("\n"), + e.getStackTrace)) + syncObject.synchronized { syncObject.notifyAll() } + //println(s"$fakeId: ${e.toString}") + //Runtime.getRuntime().halt(0) //exit the JVM and all running threads (no other way to kill other threads) + } + } + }) + } + // start all threads + threads.foreach(_.start()) + // wait for all threads to complete, or for an exception to be thrown, or for the time out to expire + var remTime = timeout + syncObject.synchronized { + timed { if(completed.get() != ops.length) syncObject.wait(timeout) } { time => remTime -= time } + } + if (exception.isDefined) { + exception.get + } else if (remTime <= 1) { // timeout ? using 1 instead of zero to allow for some errors + Timeout(opLog.mkString("\n")) + } else { + // every thing executed normally + RetVal(threadRes.toList) + } + } + + // Updates the state of the current thread + def updateThreadState(state: ThreadState): Unit = { + val tid = threadId + synchronized { + threadStates(tid) = state + } + state match { + case Sync(lockToAquire, locks) => + if (locks.indexOf(lockToAquire) < 0) waitForTurn else { + // Re-aqcuiring the same lock + updateThreadState(Running(lockToAquire +: locks)) + } + case Start => waitStart() + case End => removeFromSchedule(tid) + case Running(_) => + case _ => waitForTurn // Wait, SyncUnique, VariableReadWrite + } + } + + def waitStart(): Unit = { + //while (threadStates.size < numThreads) { + //Thread.sleep(1) + //} + synchronized { + if (threadStates.size < numThreads) { + wait() + } else { + notifyAll() + } + } + } + + def threadLocks = { + synchronized { + threadStates(threadId).locks + } + } + + def threadState = { + synchronized { + threadStates(threadId) + } + } + + def mapOtherStates(f: ThreadState => ThreadState) = { + val exception = threadId + synchronized { + for (k <- threadStates.keys if k != exception) { + threadStates(k) = f(threadStates(k)) + } + } + } + + def log(str: String) = { + if((realToFakeThreadId contains Thread.currentThread().getId())) { + val space = (" " * ((threadId - 1) * 2)) + val s = space + threadId + ":" + "\n".r.replaceAllIn(str, "\n" + space + " ") + opLog += s + } + } + + /** + * Executes a read or write operation to a global data structure as per the given schedule + * @param msg a message corresponding to the operation that will be logged + */ + def exec[T](primop: => T)(msg: => String, postMsg: => Option[T => String] = None): T = { + if(! (realToFakeThreadId contains Thread.currentThread().getId())) { + primop + } else { + updateThreadState(VariableReadWrite(threadLocks)) + val m = msg + if(m != "") log(m) + if (opLog.size > maxOps) + throw new Exception(s"Total number of reads/writes performed by threads exceed $maxOps. A possible deadlock!") + val res = primop + postMsg match { + case Some(m) => log(m(res)) + case None => + } + res + } + } + + private def setThreadId(fakeId: Int) = synchronized { + realToFakeThreadId(Thread.currentThread.getId) = fakeId + } + + def threadId = + try { + realToFakeThreadId(Thread.currentThread().getId()) + } catch { + case e: NoSuchElementException => + throw new Exception("You are accessing shared variables in the constructor. This is not allowed. The variables are already initialized!") + } + + private def isTurn(tid: Int) = synchronized { + (!schedule.isEmpty && schedule.head != tid) + } + + def canProceed(): Boolean = { + val tid = threadId + canContinue match { + case Some((i, state)) if i == tid => + //println(s"$tid: Runs ! Was in state $state") + canContinue = None + state match { + case Sync(lockToAquire, locks) => updateThreadState(Running(lockToAquire +: locks)) + case SyncUnique(lockToAquire, locks) => + mapOtherStates { + _ match { + case SyncUnique(lockToAquire2, locks2) if lockToAquire2 == lockToAquire => Wait(lockToAquire2, locks2) + case e => e + } + } + updateThreadState(Running(lockToAquire +: locks)) + case VariableReadWrite(locks) => updateThreadState(Running(locks)) + } + true + case Some((i, state)) => + //println(s"$tid: not my turn but $i !") + false + case None => + false + } + } + + var threadPreference = 0 // In the case the schedule is over, which thread should have the preference to execute. + + /** returns true if the thread can continue to execute, and false otherwise */ + def decide(): Option[(Int, ThreadState)] = { + if (!threadStates.isEmpty) { // The last thread who enters the decision loop takes the decision. + //println(s"$threadId: I'm taking a decision") + if (threadStates.values.forall { case e: Wait => true case _ => false }) { + val waiting = threadStates.keys.map(_.toString).mkString(", ") + val s = if (threadStates.size > 1) "s" else "" + val are = if (threadStates.size > 1) "are" else "is" + throw new Exception(s"Deadlock: Thread$s $waiting $are waiting but all others have ended and cannot notify them.") + } else { + // Threads can be in Wait, Sync, SyncUnique, and VariableReadWrite mode. + // Let's determine which ones can continue. + val notFree = threadStates.collect { case (id, state) => state.locks }.flatten.toSet + val threadsNotBlocked = threadStates.toSeq.filter { + case (id, v: VariableReadWrite) => true + case (id, v: CanContinueIfAcquiresLock) => !notFree(v.lockToAquire) || (v.locks contains v.lockToAquire) + case _ => false + } + if (threadsNotBlocked.isEmpty) { + val waiting = threadStates.keys.map(_.toString).mkString(", ") + val s = if (threadStates.size > 1) "s" else "" + val are = if (threadStates.size > 1) "are" else "is" + val whoHasLock = threadStates.toSeq.flatMap { case (id, state) => state.locks.map(lock => (lock, id)) }.toMap + val reason = threadStates.collect { + case (id, state: CanContinueIfAcquiresLock) if !notFree(state.lockToAquire) => + s"Thread $id is waiting on lock ${state.lockToAquire} held by thread ${whoHasLock(state.lockToAquire)}" + }.mkString("\n") + throw new Exception(s"Deadlock: Thread$s $waiting are interlocked. Indeed:\n$reason") + } else if (threadsNotBlocked.size == 1) { // Do not consume the schedule if only one thread can execute. + Some(threadsNotBlocked(0)) + } else { + val next = schedule.indexWhere(t => threadsNotBlocked.exists { case (id, state) => id == t }) + if (next != -1) { + //println(s"$threadId: schedule is $schedule, next chosen is ${schedule(next)}") + val chosenOne = schedule(next) // TODO: Make schedule a mutable list. + schedule = schedule.take(next) ++ schedule.drop(next + 1) + Some((chosenOne, threadStates(chosenOne))) + } else { + threadPreference = (threadPreference + 1) % threadsNotBlocked.size + val chosenOne = threadsNotBlocked(threadPreference) // Maybe another strategy + Some(chosenOne) + //threadsNotBlocked.indexOf(threadId) >= 0 + /* + val tnb = threadsNotBlocked.map(_._1).mkString(",") + val s = if (schedule.isEmpty) "empty" else schedule.mkString(",") + val only = if (schedule.isEmpty) "" else " only" + throw new Exception(s"The schedule is $s but$only threads ${tnb} can continue")*/ + } + } + } + } else canContinue + } + + /** + * This will be called before a schedulable operation begins. + * This should not use synchronized + */ + var numThreadsWaiting = new AtomicInteger(0) + //var waitingForDecision = Map[Int, Option[Int]]() // Mapping from thread ids to a number indicating who is going to make the choice. + var canContinue: Option[(Int, ThreadState)] = None // The result of the decision thread Id of the thread authorized to continue. + private def waitForTurn = { + synchronized { + if (numThreadsWaiting.incrementAndGet() == threadStates.size) { + canContinue = decide() + notifyAll() + } + //waitingForDecision(threadId) = Some(numThreadsWaiting) + //println(s"$threadId Entering waiting with ticket number $numThreadsWaiting/${waitingForDecision.size}") + while (!canProceed()) wait() + } + numThreadsWaiting.decrementAndGet() + } + + /** + * To be invoked when a thread is about to complete + */ + private def removeFromSchedule(fakeid: Int) = synchronized { + //println(s"$fakeid: I'm taking a decision because I finished") + schedule = schedule.filterNot(_ == fakeid) + threadStates -= fakeid + if (numThreadsWaiting.get() == threadStates.size) { + canContinue = decide() + notifyAll() + } + } + + def getOperationLog() = opLog +} diff --git a/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/Stats.scala b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/Stats.scala new file mode 100644 index 0000000..bc1241c --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/Stats.scala @@ -0,0 +1,23 @@ +package m14 +package instrumentation + +import java.lang.management._ + +/** + * A collection of methods that can be used to collect run-time statistics about Leon programs. + * This is mostly used to test the resources properties of Leon programs + */ +object Stats { + def timed[T](code: => T)(cont: Long => Unit): T = { + var t1 = System.currentTimeMillis() + val r = code + cont((System.currentTimeMillis() - t1)) + r + } + + def withTime[T](code: => T): (T, Long) = { + var t1 = System.currentTimeMillis() + val r = code + (r, (System.currentTimeMillis() - t1)) + } +} diff --git a/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/TestHelper.scala b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/TestHelper.scala new file mode 100644 index 0000000..faa3505 --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/TestHelper.scala @@ -0,0 +1,125 @@ +package m14 +package instrumentation + +import scala.util.Random +import scala.collection.mutable.{Map => MutableMap} + +import Stats._ + +object TestHelper { + val noOfSchedules = 10000 // set this to 100k during deployment + val readWritesPerThread = 20 // maximum number of read/writes possible in one thread + val contextSwitchBound = 10 + val testTimeout = 240 // the total time out for a test in seconds + val schedTimeout = 15 // the total time out for execution of a schedule in secs + + // Helpers + /*def testManySchedules(op1: => Any): Unit = testManySchedules(List(() => op1)) + def testManySchedules(op1: => Any, op2: => Any): Unit = testManySchedules(List(() => op1, () => op2)) + def testManySchedules(op1: => Any, op2: => Any, op3: => Any): Unit = testManySchedules(List(() => op1, () => op2, () => op3)) + def testManySchedules(op1: => Any, op2: => Any, op3: => Any, op4: => Any): Unit = testManySchedules(List(() => op1, () => op2, () => op3, () => op4))*/ + + def testSequential[T](ops: Scheduler => Any)(assertions: T => (Boolean, String)) = + testManySchedules(1, + (sched: Scheduler) => { + (List(() => ops(sched)), + (res: List[Any]) => assertions(res.head.asInstanceOf[T])) + }) + + /** + * @numThreads number of threads + * @ops operations to be executed, one per thread + * @assertion as condition that will executed after all threads have completed (without exceptions) + * the arguments are the results of the threads + */ + def testManySchedules(numThreads: Int, + ops: Scheduler => + (List[() => Any], // Threads + List[Any] => (Boolean, String)) // Assertion + ) = { + var timeout = testTimeout * 1000L + val threadIds = (1 to numThreads) + //(1 to scheduleLength).flatMap(_ => threadIds).toList.permutations.take(noOfSchedules).foreach { + val schedules = (new ScheduleGenerator(numThreads)).schedules() + var schedsExplored = 0 + schedules.takeWhile(_ => schedsExplored <= noOfSchedules && timeout > 0).foreach { + //case _ if timeout <= 0 => // break + case schedule => + schedsExplored += 1 + val schedr = new Scheduler(schedule) + //println("Exploring Sched: "+schedule) + val (threadOps, assertion) = ops(schedr) + if (threadOps.size != numThreads) + throw new IllegalStateException(s"Number of threads: $numThreads, do not match operations of threads: $threadOps") + timed { schedr.runInParallel(schedTimeout * 1000, threadOps) } { t => timeout -= t } match { + case Timeout(msg) => + throw new java.lang.AssertionError("assertion failed\n"+"The schedule took too long to complete. A possible deadlock! \n"+msg) + case Except(msg, stkTrace) => + val traceStr = "Thread Stack trace: \n"+stkTrace.map(" at "+_.toString).mkString("\n") + throw new java.lang.AssertionError("assertion failed\n"+msg+"\n"+traceStr) + case RetVal(threadRes) => + // check the assertion + val (success, custom_msg) = assertion(threadRes) + if (!success) { + val msg = "The following schedule resulted in wrong results: \n" + custom_msg + "\n" + schedr.getOperationLog().mkString("\n") + throw new java.lang.AssertionError("Assertion failed: "+msg) + } + } + } + if (timeout <= 0) { + throw new java.lang.AssertionError("Test took too long to complete! Cannot check all schedules as your code is too slow!") + } + } + + /** + * A schedule generator that is based on the context bound + */ + class ScheduleGenerator(numThreads: Int) { + val scheduleLength = readWritesPerThread * numThreads + val rands = (1 to scheduleLength).map(i => new Random(0xcafe * i)) // random numbers for choosing a thread at each position + def schedules(): LazyList[List[Int]] = { + var contextSwitches = 0 + var contexts = List[Int]() // a stack of thread ids in the order of context-switches + val remainingOps = MutableMap[Int, Int]() + remainingOps ++= (1 to numThreads).map(i => (i, readWritesPerThread)) // num ops remaining in each thread + val liveThreads = (1 to numThreads).toSeq.toBuffer + + /** + * Updates remainingOps and liveThreads once a thread is chosen for a position in the schedule + */ + def updateState(tid: Int): Unit = { + val remOps = remainingOps(tid) + if (remOps == 0) { + liveThreads -= tid + } else { + remainingOps += (tid -> (remOps - 1)) + } + } + val schedule = rands.foldLeft(List[Int]()) { + case (acc, r) if contextSwitches < contextSwitchBound => + val tid = liveThreads(r.nextInt(liveThreads.size)) + contexts match { + case prev :: tail if prev != tid => // we have a new context switch here + contexts +:= tid + contextSwitches += 1 + case prev :: tail => + case _ => // init case + contexts +:= tid + } + updateState(tid) + acc :+ tid + case (acc, _) => // here context-bound has been reached so complete the schedule without any more context switches + if (!contexts.isEmpty) { + contexts = contexts.dropWhile(remainingOps(_) == 0) + } + val tid = contexts match { + case top :: tail => top + case _ => liveThreads(0) // here, there has to be threads that have not even started + } + updateState(tid) + acc :+ tid + } + schedule #:: schedules() + } + } +} diff --git a/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/TestUtils.scala b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/TestUtils.scala new file mode 100644 index 0000000..f980f99 --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/TestUtils.scala @@ -0,0 +1,20 @@ +package m14 +package instrumentation + +import scala.concurrent._ +import scala.concurrent.duration._ +import scala.concurrent.ExecutionContext.Implicits.global + +object TestUtils { + def failsOrTimesOut[T](action: => T): Boolean = { + val asyncAction = Future { + action + } + try { + Await.result(asyncAction, 2000.millisecond) + } catch { + case _: Throwable => return true + } + return false + } +} diff --git a/previous-exams/2021-midterm/m15.md b/previous-exams/2021-midterm/m15.md new file mode 100644 index 0000000..781e05a --- /dev/null +++ b/previous-exams/2021-midterm/m15.md @@ -0,0 +1,42 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m15 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m15 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +In this question, you will implement a simple thread pool executor. +Thread pool executors provide a way to execute tasks in parallel using one of several pooled threads. +Using a pool of threads provides improved performance compared to creating a new thread for every operation since threads in the pool are reused throughout the executor's lifetime. + +Thread pool executors are one of the core primitive used to implement parallel programs. For example, they are the underlying mechanism used in the implementation of `Future`-s. + +Your task is to complete the implementation of the `ThreadPoolExecutor` class. This class' constructor takes the number of threads of the pool as argument and exposes two life-cycle methods (`start` and `shutdown`), and an `execute` method to run tasks on the thread pool. The `execute` method takes as argument `Unit => Unit` functions. These functions can be constructed anonymously using the following syntax: `val func = (x: Unit) => println("hello")`. Furthermore, given a `func` function of type `Unit => Unit`, one can invoke that function using `func(())`. +For the purpose of this exercise, you can assume that the tasks submitted to the thread pool via the `execute` method do not throw exceptions. + +The thread pool implementation uses two additional classes: +- `BlockingQueue`, used by the `ThreadPoolExecutor` to store pending tasks, +- `Worker`-s, which each run in a separate thread, consume tasks from the queue and execute those tasks. + +The `BlockingQueue` implements two methods: +- `put` to insert an element in the queue +- `take` to retrieve and remove an element from the queue, in a first in first out order. + +The `put` operation always succeeds and is non-blocking (the queue is unbounded). +The `take` operation is a potentially blocking operation that waits for new elements when called on an empty queue. + +Given that `Worker`-s run on separate threads, the `take` operation must be thread-safe. Furthermore, since the thread pool executor could also be used from multiple threads, the `put` operation should also be thread-safe. +Your implementation should use a single lock to achieve this thread safety, specifically using the `[wait](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait())`/`[notify](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notify())`/`[notifyAll](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notifyAll())`/`synchronized` primitives. +Remember that `wait`, `notify` and `notifyAll` should only be invoked inside a synchronized block. diff --git a/previous-exams/2021-midterm/m15/.gitignore b/previous-exams/2021-midterm/m15/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m15/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m15/assignment.sbt b/previous-exams/2021-midterm/m15/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m15/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m15/build.sbt b/previous-exams/2021-midterm/m15/build.sbt new file mode 100644 index 0000000..3b7539d --- /dev/null +++ b/previous-exams/2021-midterm/m15/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m15" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m15.M15Suite" diff --git a/previous-exams/2021-midterm/m15/grading-tests.jar b/previous-exams/2021-midterm/m15/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..3243be21fe08c74418f052ef9b4f521129bd62f0 GIT binary patch literal 126110 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 N9rh=r@iGKV<X_lpOws@V literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m15/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m15/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m15/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m15/project/MOOCSettings.scala b/previous-exams/2021-midterm/m15/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m15/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m15/project/StudentTasks.scala b/previous-exams/2021-midterm/m15/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m15/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m15/project/build.properties b/previous-exams/2021-midterm/m15/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m15/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m15/project/buildSettings.sbt b/previous-exams/2021-midterm/m15/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m15/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m15/project/plugins.sbt b/previous-exams/2021-midterm/m15/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m15/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m15/src/main/scala/m15/AbstractBlockingQueue.scala b/previous-exams/2021-midterm/m15/src/main/scala/m15/AbstractBlockingQueue.scala new file mode 100644 index 0000000..85a28b2 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/main/scala/m15/AbstractBlockingQueue.scala @@ -0,0 +1,14 @@ +package m15 + +abstract class AbstractBlockingQueue[T] extends Monitor { + private var underlying: List[T] = Nil + + def getUnderlying(): List[T] = + underlying + + def setUnderlying(newValue: List[T]): Unit = + underlying = newValue + + def put(elem: T): Unit + def take(): T +} diff --git a/previous-exams/2021-midterm/m15/src/main/scala/m15/AbstractThreadPoolExecutor.scala b/previous-exams/2021-midterm/m15/src/main/scala/m15/AbstractThreadPoolExecutor.scala new file mode 100644 index 0000000..5e663e8 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/main/scala/m15/AbstractThreadPoolExecutor.scala @@ -0,0 +1,7 @@ +package m15 + +abstract class AbstractThreadPoolExecutor { + def execute(task: Unit => Unit): Unit + def start(): Unit + def shutdown(): Unit +} diff --git a/previous-exams/2021-midterm/m15/src/main/scala/m15/M15.scala b/previous-exams/2021-midterm/m15/src/main/scala/m15/M15.scala new file mode 100644 index 0000000..27bb83d --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/main/scala/m15/M15.scala @@ -0,0 +1,79 @@ +package m15 + +object M15 { + /** A thread pool that executes submitted task using one of several threads */ + class ThreadPoolExecutor(taskQueue: BlockingQueue[Unit => Unit], poolSize: Int) + extends AbstractThreadPoolExecutor { + + private class Worker extends Thread { + override def run(): Unit = { + try { + while (true) { + + val task = taskQueue.take() + task(()) + } + } catch { + case e: InterruptedException => + // Nothing to do here, we are shutting down gracefully. + } + } + } + private val workers: List[Worker] = List.fill(poolSize)(new Worker()) + + /** Executes the given task, passed by name. */ + def execute(task: Unit => Unit): Unit = + + taskQueue.put(task) + + /** Starts the thread pool. */ + def start(): Unit = + workers.foreach(_.start()) + + /** Instantly shuts down all actively executing tasks using an interrupt. */ + def shutdown(): Unit = + workers.foreach(_.interrupt()) + } + + /** + * A queue whose take operations blocks until the queue become non-empty. + * Elements must be retrived from this queue in a first in, first out order. + * All methods of this class are thread safe, that is, they can safely + * be used from multiple thread without any particular synchronization. + */ + class BlockingQueue[T] extends AbstractBlockingQueue[T] { + + // The state of this queue is stored in an underlying List[T] defined in + // the AbstractBlockingQueue class. Your implementation should access and + // update this list using the following setter and getter methods: + // - def getUnderlying(): List[T] + // - def setUnderlying(newValue: List[T]): Unit + // Using these methods is required for testing purposes. + + /** Inserts the specified element into this queue (non-blocking) */ + def put(elem: T): Unit = + + this.synchronized { + val underlying = getUnderlying() + setUnderlying(elem :: underlying) + this.notifyAll() + } + + + /** + * Retrieves and removes the head of this queue, waiting if necessary + * until an element becomes available (blocking). + * This queue operates in a first in, first out order. + */ + def take(): T = + + this.synchronized { + while (getUnderlying().isEmpty) + this.wait() + val underlying = getUnderlying() + val last = underlying.last + setUnderlying(underlying.init) + last + } + } +} diff --git a/previous-exams/2021-midterm/m15/src/main/scala/m15/Monitor.scala b/previous-exams/2021-midterm/m15/src/main/scala/m15/Monitor.scala new file mode 100644 index 0000000..b64e697 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/main/scala/m15/Monitor.scala @@ -0,0 +1,23 @@ +package m15 + +class Dummy + +trait Monitor { + implicit val dummy: Dummy = new Dummy + + def wait()(implicit i: Dummy) = waitDefault() + + def synchronized[T](e: => T)(implicit i: Dummy) = synchronizedDefault(e) + + def notify()(implicit i: Dummy) = notifyDefault() + + def notifyAll()(implicit i: Dummy) = notifyAllDefault() + + private val lock = new AnyRef + + // Can be overriden. + def waitDefault(): Unit = lock.wait() + def synchronizedDefault[T](toExecute: => T): T = lock.synchronized(toExecute) + def notifyDefault(): Unit = lock.notify() + def notifyAllDefault(): Unit = lock.notifyAll() +} diff --git a/previous-exams/2021-midterm/m15/src/test/scala/m15/M15Suite.scala b/previous-exams/2021-midterm/m15/src/test/scala/m15/M15Suite.scala new file mode 100644 index 0000000..e0f2243 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/test/scala/m15/M15Suite.scala @@ -0,0 +1,281 @@ +package m15 + +import instrumentation.SchedulableBlockingQueue +import instrumentation.TestHelper._ +import instrumentation.TestUtils._ + +class M15Suite extends munit.FunSuite { + import M15._ + + test("ThreadPool should put jobs in the queue, Workers should execute jobs from the queue (10pts)") { + case class PutE(e: Unit => Unit) extends Exception + val nThreads = 3 + var taken = false + class TestBlockingQueue extends BlockingQueue[Unit => Unit] { + override def put(e: Unit => Unit): Unit = + throw new PutE(e) + + override def take(): Unit => Unit = + x => { + taken = true + Thread.sleep(10 * 1000) + } + } + + val tpe = new ThreadPoolExecutor(new TestBlockingQueue, nThreads) + val unit2unit: Unit => Unit = x => () + try { + tpe.execute(unit2unit) + assert(false, "ThreadPoolExecutor does not put jobs in the queue") + } catch { + case PutE(e) => + assert(e == unit2unit) + } + tpe.start() + Thread.sleep(1000) + assert(taken, s"ThreadPoolExecutor workers do no execute jobs from the queue") + tpe.shutdown() + } + + test("BlockingQueue should work in a sequential setting (1pts)") { + testSequential[(Int, Int, Int, Int)]{ sched => + val queue = new SchedulableBlockingQueue[Int](sched) + queue.put(1) + queue.put(2) + queue.put(3) + queue.put(4) + (queue.take(), + queue.take(), + queue.take(), + queue.take()) + }{ tuple => + (tuple == (1, 2, 3, 4), s"Expected (1, 2, 3, 4) got $tuple") + } + } + + test("BlockingQueue should work when Thread 1: 'put(1)', Thread 2: 'take' (3pts)") { + testManySchedules(2, sched => { + val queue = new SchedulableBlockingQueue[Int](sched) + (List(() => queue.put(1), () => queue.take()), + args => (args(1) == 1, s"Expected 1, got ${args(1)}")) + }) + } + + test("BlockingQueue should not be able to take from an empty queue (3pts)") { + testSequential[Boolean]{ sched => + val queue = new SchedulableBlockingQueue[Int](sched); + queue.put(1) + queue.put(2) + queue.take() + queue.take() + failsOrTimesOut(queue.take()) + }{ res => + (res, "Was able to retrieve an element from an empty queue") + } + } + + test("Should work when Thread 1: 'put(1)', Thread 2: 'put(2)', Thread 3: 'take', and a buffer of size 1") { + testManySchedules(3, sched => { + val prodCons = new SchedulableBlockingQueue[Int](sched) + (List(() => prodCons.put(1), () => prodCons.put(2), () => prodCons.take()) + , args => { + val takeRes = args(2).asInstanceOf[Int] + val nocreation = (takeRes == 1 || takeRes == 2) + if (!nocreation) + (false, s"'take' should return either 1 or 2") + else (true, "") + }) + }) + } + + // testing no duplication + test("Should work when Thread 1: 'put(1)', Thread 2: 'put(2)', Thread 3: 'take', Thread 4: 'take', and a buffer of size 3") { + testManySchedules(4, sched => { + val prodCons = new SchedulableBlockingQueue[Int](sched) + (List(() => prodCons.put(1), () => prodCons.put(2), () => prodCons.take(), () => prodCons.take()) + , args => { + def m(): (Boolean, String) = { + val takeRes1 = args(2).asInstanceOf[Int] + val takeRes2 = args(3).asInstanceOf[Int] + val nocreation = (x: Int) => List(1, 2).contains(x) + if (!nocreation(takeRes1)) + return (false, s"'Thread 3: take' returned $takeRes1 but should return a value in {1, 2, 3}") + if (!nocreation(takeRes2)) + return (false, s"'Thread 4: take' returned $takeRes2 but should return a value in {1, 2, 3}") + + val noduplication = takeRes1 != takeRes2 + if (!noduplication) + (false, s"'Thread 3 and 4' returned the same value: $takeRes1") + else (true, "") + } + m() + }) + }) + } + + // testing no duplication with 5 threads + test("Should work when Thread 1: 'put(1)', Thread 2: 'put(2)', Thread 3: 'put(3)', Thread 4: 'take', Thread 5: 'take', and a buffer of size 1") { + testManySchedules(5, sched => { + val prodCons = new SchedulableBlockingQueue[Int](sched) + (List(() => prodCons.put(1), () => prodCons.put(2), () => prodCons.put(3), + () => prodCons.take(), () => prodCons.take()) + , args => { + def m(): (Boolean, String) = { + val takeRes1 = args(3).asInstanceOf[Int] + val takeRes2 = args(4).asInstanceOf[Int] + val nocreation = (x: Int) => List(1, 2, 3).contains(x) + if (!nocreation(takeRes1)) + return (false, s"'Thread 4: take' returned $takeRes1 but should return a value in {1, 2, 3}") + if (!nocreation(takeRes2)) + return (false, s"'Thread 5: take' returned $takeRes2 but should return a value in {1, 2, 3}") + + val noduplication = takeRes1 != takeRes2 + if (!noduplication) + return (false, s"'Thread 4 and 5' returned the same value: $takeRes1") + else (true, "") + } + m() + }) + }) + } + + // testing fifo buffer size 1 + test("Should work when Thread 1: 'put(1); put(2)', Thread 2: 'take', Thread 3: 'put(3)', Thread 4: 'put(4)', and a buffer of size 3") { + testManySchedules(4, sched => { + val prodCons = new SchedulableBlockingQueue[Int](sched) + (List(() => { prodCons.put(1); prodCons.put(2) }, () => prodCons.take(), + () => prodCons.put(3), () => prodCons.put(4)) + , args => { + def m(): (Boolean, String) = { + val takeRes = args(1).asInstanceOf[Int] + // no creation + val nocreation = (x: Int) => List(1, 2, 3, 4).contains(x) + if (!nocreation(takeRes)) + return (false, s"'Thread 2: take' returned $takeRes, but should return a value in {1, 2, 3, 4}") + // fifo (cannot have 2 without 1) + if (takeRes == 2) + (false, s"'Thread 2' returned 2 before returning 1") + else + (true, "") + } + m() + }) + }) + } + + // testing fifo buffer size 5 + test("Should work when Thread 1: 'put(1); put(2)', Thread 2: 'take', Thread 3: 'put(11)', Thread 4: 'put(10)', and a buffer of size 5") { + testManySchedules(4, sched => { + val prodCons = new SchedulableBlockingQueue[Int](sched) + (List(() => { prodCons.put(1); prodCons.put(2) }, () => prodCons.take(), + () => prodCons.put(11), () => prodCons.put(10)) + , args => { + def m(): (Boolean, String) = { + val takeRes = args(1).asInstanceOf[Int] + // no creation + val nocreation = (x: Int) => List(1, 2, 10, 11).contains(x) + if (!nocreation(takeRes)) + return (false, s"'Thread 2: take' returned $takeRes, but should return a value in {1, 2, 10, 11}") + // fifo (cannot have 2 without 1) + if (takeRes == 2) + (false, s"'Thread 2' returned 2 before returning 1") + else + (true, "") + } + m() + }) + }) + } + + // testing fifo on more complicated case + test("Should work when Thread 1: 'put(1); put(3)', Thread 2: 'put(2)', Thread 3: 'put(4)', Thread 4: 'take', Thread 5: 'take', and a buffer of size 10") { + testManySchedules(5, sched => { + val prodCons = new SchedulableBlockingQueue[Int](sched) + (List(() => { prodCons.put(1); prodCons.put(3) }, () => prodCons.put(2), + () => prodCons.put(4), () => prodCons.take(), () => prodCons.take()) + , args => { + def m(): (Boolean, String) = { + val takeRes1 = args(3).asInstanceOf[Int] + val takeRes2 = args(4).asInstanceOf[Int] + // no creation + val nocreation = (x: Int) => List(1, 2, 3, 4).contains(x) + if (!nocreation(takeRes1)) + return (false, s"'Thread 4: take' returned $takeRes1 but should return a value in {1, 2, 3, 4}") + if (!nocreation(takeRes2)) + return (false, s"'Thread 5: take' returned $takeRes2 but should return a value in {1, 2, 3, 4}") + // no duplication + if (takeRes1 == takeRes2) + return (false, s"'Thread 4 and 5' returned the same value: $takeRes1") + // fifo (cannot have 3 without 1) + val takes = List(takeRes1, takeRes2) + if (takes.contains(3) && !takes.contains(1)) + (false, s"'Thread 4 or 5' returned 3 before returning 1") + else + (true, "") + } + m() + }) + }) + } + + // combining put and take in one thread + test("Should work when Thread 1: 'put(21); put(22)', Thread 2: 'take', Thread 3: 'put(23); take', Thread 4: 'put(24); take', and a buffer of size 2") { + testManySchedules(4, sched => { + val prodCons = new SchedulableBlockingQueue[Int](sched) + (List(() => { prodCons.put(21); prodCons.put(22) }, () => prodCons.take(), + () => { prodCons.put(23); prodCons.take() }, () => { prodCons.put(24); prodCons.take() }) + , args => { + def m(): (Boolean, String) = { + val takes = List(args(1).asInstanceOf[Int], args(2).asInstanceOf[Int], args(3).asInstanceOf[Int]) + // no creation + val vals = List(21, 22, 23, 24) + + var i = 0 + while (i < takes.length) { + val x = takes(i) + if (!vals.contains(x)) + return (false, s"'Thread $i: take' returned $x but should return a value in $vals") + i += 1 + } + + // no duplication + if (takes.distinct.size != takes.size) + return (false, s"Takes did not return unique values: $takes") + // fifo (cannot have 22 without 21) + if (takes.contains(22) && !takes.contains(21)) + (false, s"`Takes returned 22 before returning 21") + else + (true, "") + } + m() + }) + }) + } + + // completely hidden hard to crack test + test("[Black box test] Values should be taken in the order they are put") { + testManySchedules(4, sched => { + val prodCons = new SchedulableBlockingQueue[(Char, Int)](sched) + val n = 2 + (List( + () => for (i <- 1 to n) { prodCons.put(('a', i)) }, + () => for (i <- 1 to n) { prodCons.put(('b', i)) }, + () => for (i <- 1 to n) { prodCons.put(('c', i)) }, + () => { + import scala.collection.mutable + var counts = mutable.HashMap.empty[Char, Int] + counts('a') = 0 + counts('b') = 0 + counts('c') = 0 + for (i <- 1 to (3 * n)) { + val (c, n) = prodCons.take() + counts(c) += 1 + assert(counts(c) == n) + } + }) + , _ => + (true, "") + ) + }) + } +} diff --git a/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/MockedMonitor.scala b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/MockedMonitor.scala new file mode 100644 index 0000000..c0591e3 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/MockedMonitor.scala @@ -0,0 +1,73 @@ +package m15 +package instrumentation + +trait MockedMonitor extends Monitor { + def scheduler: Scheduler + + // Can be overriden. + override def waitDefault() = { + scheduler.log("wait") + scheduler updateThreadState Wait(this, scheduler.threadLocks.tail) + } + override def synchronizedDefault[T](toExecute: =>T): T = { + scheduler.log("synchronized check") + val prevLocks = scheduler.threadLocks + scheduler updateThreadState Sync(this, prevLocks) // If this belongs to prevLocks, should just continue. + scheduler.log("synchronized -> enter") + try { + toExecute + } finally { + scheduler updateThreadState Running(prevLocks) + scheduler.log("synchronized -> out") + } + } + override def notifyDefault() = { + scheduler mapOtherStates { + state => state match { + case Wait(lockToAquire, locks) if lockToAquire == this => SyncUnique(this, state.locks) + case e => e + } + } + scheduler.log("notify") + } + override def notifyAllDefault() = { + scheduler mapOtherStates { + state => state match { + case Wait(lockToAquire, locks) if lockToAquire == this => Sync(this, state.locks) + case SyncUnique(lockToAquire, locks) if lockToAquire == this => Sync(this, state.locks) + case e => e + } + } + scheduler.log("notifyAll") + } +} + +trait LockFreeMonitor extends Monitor { + override def waitDefault() = { + throw new Exception("Please use lock-free structures and do not use wait()") + } + override def synchronizedDefault[T](toExecute: =>T): T = { + throw new Exception("Please use lock-free structures and do not use synchronized()") + } + override def notifyDefault() = { + throw new Exception("Please use lock-free structures and do not use notify()") + } + override def notifyAllDefault() = { + throw new Exception("Please use lock-free structures and do not use notifyAll()") + } +} + + +abstract class ThreadState { + def locks: Seq[AnyRef] +} +trait CanContinueIfAcquiresLock extends ThreadState { + def lockToAquire: AnyRef +} +case object Start extends ThreadState { def locks: Seq[AnyRef] = Seq.empty } +case object End extends ThreadState { def locks: Seq[AnyRef] = Seq.empty } +case class Wait(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState +case class SyncUnique(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState with CanContinueIfAcquiresLock +case class Sync(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState with CanContinueIfAcquiresLock +case class Running(locks: Seq[AnyRef]) extends ThreadState +case class VariableReadWrite(locks: Seq[AnyRef]) extends ThreadState diff --git a/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/SchedulableBlockingQueue.scala b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/SchedulableBlockingQueue.scala new file mode 100644 index 0000000..31b09be --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/SchedulableBlockingQueue.scala @@ -0,0 +1,17 @@ +package m15 +package instrumentation + +class SchedulableBlockingQueue[T](val scheduler: Scheduler) + extends m15.M15.BlockingQueue[T] with MockedMonitor { + private var underlying: List[T] = Nil + + override def getUnderlying(): List[T] = + scheduler.exec { + underlying + }(s"Get $underlying") + + override def setUnderlying(newValue: List[T]): Unit = + scheduler.exec { + underlying = newValue + }(s"Set $newValue") +} diff --git a/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/Scheduler.scala b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/Scheduler.scala new file mode 100644 index 0000000..fd5f427 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/Scheduler.scala @@ -0,0 +1,305 @@ +package m15 +package instrumentation + +import java.util.concurrent._; +import scala.concurrent.duration._ +import scala.collection.mutable._ +import Stats._ + +import java.util.concurrent.atomic.AtomicInteger + +sealed abstract class Result +case class RetVal(rets: List[Any]) extends Result +case class Except(msg: String, stackTrace: Array[StackTraceElement]) extends Result +case class Timeout(msg: String) extends Result + +/** + * A class that maintains schedule and a set of thread ids. + * The schedules are advanced after an operation of a SchedulableBuffer is performed. + * Note: the real schedule that is executed may deviate from the input schedule + * due to the adjustments that had to be made for locks + */ +class Scheduler(sched: List[Int]) { + val maxOps = 500 // a limit on the maximum number of operations the code is allowed to perform + + private var schedule = sched + private var numThreads = 0 + private val realToFakeThreadId = Map[Long, Int]() + private val opLog = ListBuffer[String]() // a mutable list (used for efficient concat) + private val threadStates = Map[Int, ThreadState]() + + /** + * Runs a set of operations in parallel as per the schedule. + * Each operation may consist of many primitive operations like reads or writes + * to shared data structure each of which should be executed using the function `exec`. + * @timeout in milliseconds + * @return true - all threads completed on time, false -some tests timed out. + */ + def runInParallel(timeout: Long, ops: List[() => Any]): Result = { + numThreads = ops.length + val threadRes = Array.fill(numThreads) { None: Any } + var exception: Option[Except] = None + val syncObject = new Object() + var completed = new AtomicInteger(0) + // create threads + val threads = ops.zipWithIndex.map { + case (op, i) => + new Thread(new Runnable() { + def run(): Unit = { + val fakeId = i + 1 + setThreadId(fakeId) + try { + updateThreadState(Start) + val res = op() + updateThreadState(End) + threadRes(i) = res + // notify the master thread if all threads have completed + if (completed.incrementAndGet() == ops.length) { + syncObject.synchronized { syncObject.notifyAll() } + } + } catch { + case e: Throwable if exception != None => // do nothing here and silently fail + case e: Throwable => + log(s"throw ${e.toString}") + exception = Some(Except(s"Thread $fakeId crashed on the following schedule: \n" + opLog.mkString("\n"), + e.getStackTrace)) + syncObject.synchronized { syncObject.notifyAll() } + //println(s"$fakeId: ${e.toString}") + //Runtime.getRuntime().halt(0) //exit the JVM and all running threads (no other way to kill other threads) + } + } + }) + } + // start all threads + threads.foreach(_.start()) + // wait for all threads to complete, or for an exception to be thrown, or for the time out to expire + var remTime = timeout + syncObject.synchronized { + timed { if(completed.get() != ops.length) syncObject.wait(timeout) } { time => remTime -= time } + } + if (exception.isDefined) { + exception.get + } else if (remTime <= 1) { // timeout ? using 1 instead of zero to allow for some errors + Timeout(opLog.mkString("\n")) + } else { + // every thing executed normally + RetVal(threadRes.toList) + } + } + + // Updates the state of the current thread + def updateThreadState(state: ThreadState): Unit = { + val tid = threadId + synchronized { + threadStates(tid) = state + } + state match { + case Sync(lockToAquire, locks) => + if (locks.indexOf(lockToAquire) < 0) waitForTurn else { + // Re-aqcuiring the same lock + updateThreadState(Running(lockToAquire +: locks)) + } + case Start => waitStart() + case End => removeFromSchedule(tid) + case Running(_) => + case _ => waitForTurn // Wait, SyncUnique, VariableReadWrite + } + } + + def waitStart(): Unit = { + //while (threadStates.size < numThreads) { + //Thread.sleep(1) + //} + synchronized { + if (threadStates.size < numThreads) { + wait() + } else { + notifyAll() + } + } + } + + def threadLocks = { + synchronized { + threadStates(threadId).locks + } + } + + def threadState = { + synchronized { + threadStates(threadId) + } + } + + def mapOtherStates(f: ThreadState => ThreadState) = { + val exception = threadId + synchronized { + for (k <- threadStates.keys if k != exception) { + threadStates(k) = f(threadStates(k)) + } + } + } + + def log(str: String) = { + if((realToFakeThreadId contains Thread.currentThread().getId())) { + val space = (" " * ((threadId - 1) * 2)) + val s = space + threadId + ":" + "\n".r.replaceAllIn(str, "\n" + space + " ") + opLog += s + } + } + + /** + * Executes a read or write operation to a global data structure as per the given schedule + * @param msg a message corresponding to the operation that will be logged + */ + def exec[T](primop: => T)(msg: => String, postMsg: => Option[T => String] = None): T = { + if(! (realToFakeThreadId contains Thread.currentThread().getId())) { + primop + } else { + updateThreadState(VariableReadWrite(threadLocks)) + val m = msg + if(m != "") log(m) + if (opLog.size > maxOps) + throw new Exception(s"Total number of reads/writes performed by threads exceed $maxOps. A possible deadlock!") + val res = primop + postMsg match { + case Some(m) => log(m(res)) + case None => + } + res + } + } + + private def setThreadId(fakeId: Int) = synchronized { + realToFakeThreadId(Thread.currentThread.getId) = fakeId + } + + def threadId = + try { + realToFakeThreadId(Thread.currentThread().getId()) + } catch { + case e: NoSuchElementException => + throw new Exception("You are accessing shared variables in the constructor. This is not allowed. The variables are already initialized!") + } + + private def isTurn(tid: Int) = synchronized { + (!schedule.isEmpty && schedule.head != tid) + } + + def canProceed(): Boolean = { + val tid = threadId + canContinue match { + case Some((i, state)) if i == tid => + //println(s"$tid: Runs ! Was in state $state") + canContinue = None + state match { + case Sync(lockToAquire, locks) => updateThreadState(Running(lockToAquire +: locks)) + case SyncUnique(lockToAquire, locks) => + mapOtherStates { + _ match { + case SyncUnique(lockToAquire2, locks2) if lockToAquire2 == lockToAquire => Wait(lockToAquire2, locks2) + case e => e + } + } + updateThreadState(Running(lockToAquire +: locks)) + case VariableReadWrite(locks) => updateThreadState(Running(locks)) + } + true + case Some((i, state)) => + //println(s"$tid: not my turn but $i !") + false + case None => + false + } + } + + var threadPreference = 0 // In the case the schedule is over, which thread should have the preference to execute. + + /** returns true if the thread can continue to execute, and false otherwise */ + def decide(): Option[(Int, ThreadState)] = { + if (!threadStates.isEmpty) { // The last thread who enters the decision loop takes the decision. + //println(s"$threadId: I'm taking a decision") + if (threadStates.values.forall { case e: Wait => true case _ => false }) { + val waiting = threadStates.keys.map(_.toString).mkString(", ") + val s = if (threadStates.size > 1) "s" else "" + val are = if (threadStates.size > 1) "are" else "is" + throw new Exception(s"Deadlock: Thread$s $waiting $are waiting but all others have ended and cannot notify them.") + } else { + // Threads can be in Wait, Sync, SyncUnique, and VariableReadWrite mode. + // Let's determine which ones can continue. + val notFree = threadStates.collect { case (id, state) => state.locks }.flatten.toSet + val threadsNotBlocked = threadStates.toSeq.filter { + case (id, v: VariableReadWrite) => true + case (id, v: CanContinueIfAcquiresLock) => !notFree(v.lockToAquire) || (v.locks contains v.lockToAquire) + case _ => false + } + if (threadsNotBlocked.isEmpty) { + val waiting = threadStates.keys.map(_.toString).mkString(", ") + val s = if (threadStates.size > 1) "s" else "" + val are = if (threadStates.size > 1) "are" else "is" + val whoHasLock = threadStates.toSeq.flatMap { case (id, state) => state.locks.map(lock => (lock, id)) }.toMap + val reason = threadStates.collect { + case (id, state: CanContinueIfAcquiresLock) if !notFree(state.lockToAquire) => + s"Thread $id is waiting on lock ${state.lockToAquire} held by thread ${whoHasLock(state.lockToAquire)}" + }.mkString("\n") + throw new Exception(s"Deadlock: Thread$s $waiting are interlocked. Indeed:\n$reason") + } else if (threadsNotBlocked.size == 1) { // Do not consume the schedule if only one thread can execute. + Some(threadsNotBlocked(0)) + } else { + val next = schedule.indexWhere(t => threadsNotBlocked.exists { case (id, state) => id == t }) + if (next != -1) { + //println(s"$threadId: schedule is $schedule, next chosen is ${schedule(next)}") + val chosenOne = schedule(next) // TODO: Make schedule a mutable list. + schedule = schedule.take(next) ++ schedule.drop(next + 1) + Some((chosenOne, threadStates(chosenOne))) + } else { + threadPreference = (threadPreference + 1) % threadsNotBlocked.size + val chosenOne = threadsNotBlocked(threadPreference) // Maybe another strategy + Some(chosenOne) + //threadsNotBlocked.indexOf(threadId) >= 0 + /* + val tnb = threadsNotBlocked.map(_._1).mkString(",") + val s = if (schedule.isEmpty) "empty" else schedule.mkString(",") + val only = if (schedule.isEmpty) "" else " only" + throw new Exception(s"The schedule is $s but$only threads ${tnb} can continue")*/ + } + } + } + } else canContinue + } + + /** + * This will be called before a schedulable operation begins. + * This should not use synchronized + */ + var numThreadsWaiting = new AtomicInteger(0) + //var waitingForDecision = Map[Int, Option[Int]]() // Mapping from thread ids to a number indicating who is going to make the choice. + var canContinue: Option[(Int, ThreadState)] = None // The result of the decision thread Id of the thread authorized to continue. + private def waitForTurn = { + synchronized { + if (numThreadsWaiting.incrementAndGet() == threadStates.size) { + canContinue = decide() + notifyAll() + } + //waitingForDecision(threadId) = Some(numThreadsWaiting) + //println(s"$threadId Entering waiting with ticket number $numThreadsWaiting/${waitingForDecision.size}") + while (!canProceed()) wait() + } + numThreadsWaiting.decrementAndGet() + } + + /** + * To be invoked when a thread is about to complete + */ + private def removeFromSchedule(fakeid: Int) = synchronized { + //println(s"$fakeid: I'm taking a decision because I finished") + schedule = schedule.filterNot(_ == fakeid) + threadStates -= fakeid + if (numThreadsWaiting.get() == threadStates.size) { + canContinue = decide() + notifyAll() + } + } + + def getOperationLog() = opLog +} diff --git a/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/Stats.scala b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/Stats.scala new file mode 100644 index 0000000..e82c098 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/Stats.scala @@ -0,0 +1,23 @@ +package m15 +package instrumentation + +import java.lang.management._ + +/** + * A collection of methods that can be used to collect run-time statistics about Leon programs. + * This is mostly used to test the resources properties of Leon programs + */ +object Stats { + def timed[T](code: => T)(cont: Long => Unit): T = { + var t1 = System.currentTimeMillis() + val r = code + cont((System.currentTimeMillis() - t1)) + r + } + + def withTime[T](code: => T): (T, Long) = { + var t1 = System.currentTimeMillis() + val r = code + (r, (System.currentTimeMillis() - t1)) + } +} diff --git a/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/TestHelper.scala b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/TestHelper.scala new file mode 100644 index 0000000..5f86338 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/TestHelper.scala @@ -0,0 +1,125 @@ +package m15 +package instrumentation + +import scala.util.Random +import scala.collection.mutable.{Map => MutableMap} + +import Stats._ + +object TestHelper { + val noOfSchedules = 10000 // set this to 100k during deployment + val readWritesPerThread = 20 // maximum number of read/writes possible in one thread + val contextSwitchBound = 10 + val testTimeout = 240 // the total time out for a test in seconds + val schedTimeout = 15 // the total time out for execution of a schedule in secs + + // Helpers + /*def testManySchedules(op1: => Any): Unit = testManySchedules(List(() => op1)) + def testManySchedules(op1: => Any, op2: => Any): Unit = testManySchedules(List(() => op1, () => op2)) + def testManySchedules(op1: => Any, op2: => Any, op3: => Any): Unit = testManySchedules(List(() => op1, () => op2, () => op3)) + def testManySchedules(op1: => Any, op2: => Any, op3: => Any, op4: => Any): Unit = testManySchedules(List(() => op1, () => op2, () => op3, () => op4))*/ + + def testSequential[T](ops: Scheduler => Any)(assertions: T => (Boolean, String)) = + testManySchedules(1, + (sched: Scheduler) => { + (List(() => ops(sched)), + (res: List[Any]) => assertions(res.head.asInstanceOf[T])) + }) + + /** + * @numThreads number of threads + * @ops operations to be executed, one per thread + * @assertion as condition that will executed after all threads have completed (without exceptions) + * the arguments are the results of the threads + */ + def testManySchedules(numThreads: Int, + ops: Scheduler => + (List[() => Any], // Threads + List[Any] => (Boolean, String)) // Assertion + ) = { + var timeout = testTimeout * 1000L + val threadIds = (1 to numThreads) + //(1 to scheduleLength).flatMap(_ => threadIds).toList.permutations.take(noOfSchedules).foreach { + val schedules = (new ScheduleGenerator(numThreads)).schedules() + var schedsExplored = 0 + schedules.takeWhile(_ => schedsExplored <= noOfSchedules && timeout > 0).foreach { + //case _ if timeout <= 0 => // break + case schedule => + schedsExplored += 1 + val schedr = new Scheduler(schedule) + //println("Exploring Sched: "+schedule) + val (threadOps, assertion) = ops(schedr) + if (threadOps.size != numThreads) + throw new IllegalStateException(s"Number of threads: $numThreads, do not match operations of threads: $threadOps") + timed { schedr.runInParallel(schedTimeout * 1000, threadOps) } { t => timeout -= t } match { + case Timeout(msg) => + throw new java.lang.AssertionError("assertion failed\n"+"The schedule took too long to complete. A possible deadlock! \n"+msg) + case Except(msg, stkTrace) => + val traceStr = "Thread Stack trace: \n"+stkTrace.map(" at "+_.toString).mkString("\n") + throw new java.lang.AssertionError("assertion failed\n"+msg+"\n"+traceStr) + case RetVal(threadRes) => + // check the assertion + val (success, custom_msg) = assertion(threadRes) + if (!success) { + val msg = "The following schedule resulted in wrong results: \n" + custom_msg + "\n" + schedr.getOperationLog().mkString("\n") + throw new java.lang.AssertionError("Assertion failed: "+msg) + } + } + } + if (timeout <= 0) { + throw new java.lang.AssertionError("Test took too long to complete! Cannot check all schedules as your code is too slow!") + } + } + + /** + * A schedule generator that is based on the context bound + */ + class ScheduleGenerator(numThreads: Int) { + val scheduleLength = readWritesPerThread * numThreads + val rands = (1 to scheduleLength).map(i => new Random(0xcafe * i)) // random numbers for choosing a thread at each position + def schedules(): LazyList[List[Int]] = { + var contextSwitches = 0 + var contexts = List[Int]() // a stack of thread ids in the order of context-switches + val remainingOps = MutableMap[Int, Int]() + remainingOps ++= (1 to numThreads).map(i => (i, readWritesPerThread)) // num ops remaining in each thread + val liveThreads = (1 to numThreads).toSeq.toBuffer + + /** + * Updates remainingOps and liveThreads once a thread is chosen for a position in the schedule + */ + def updateState(tid: Int): Unit = { + val remOps = remainingOps(tid) + if (remOps == 0) { + liveThreads -= tid + } else { + remainingOps += (tid -> (remOps - 1)) + } + } + val schedule = rands.foldLeft(List[Int]()) { + case (acc, r) if contextSwitches < contextSwitchBound => + val tid = liveThreads(r.nextInt(liveThreads.size)) + contexts match { + case prev :: tail if prev != tid => // we have a new context switch here + contexts +:= tid + contextSwitches += 1 + case prev :: tail => + case _ => // init case + contexts +:= tid + } + updateState(tid) + acc :+ tid + case (acc, _) => // here context-bound has been reached so complete the schedule without any more context switches + if (!contexts.isEmpty) { + contexts = contexts.dropWhile(remainingOps(_) == 0) + } + val tid = contexts match { + case top :: tail => top + case _ => liveThreads(0) // here, there has to be threads that have not even started + } + updateState(tid) + acc :+ tid + } + schedule #:: schedules() + } + } +} diff --git a/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/TestUtils.scala b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/TestUtils.scala new file mode 100644 index 0000000..3f4afe8 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/TestUtils.scala @@ -0,0 +1,20 @@ +package m15 +package instrumentation + +import scala.concurrent._ +import scala.concurrent.duration._ +import scala.concurrent.ExecutionContext.Implicits.global + +object TestUtils { + def failsOrTimesOut[T](action: => T): Boolean = { + val asyncAction = Future { + action + } + try { + Await.result(asyncAction, 2000.millisecond) + } catch { + case _: Throwable => return true + } + return false + } +} diff --git a/previous-exams/2021-midterm/m2.md b/previous-exams/2021-midterm/m2.md new file mode 100644 index 0000000..47b0976 --- /dev/null +++ b/previous-exams/2021-midterm/m2.md @@ -0,0 +1,61 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m2 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m2 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +Given the following sequential implementation of a function that computes the sequence of rolling geometric means, your task will be to complete and optimize a parallel version of this code. + +```scala +/** Compute the rolling geometric mean of an array. + * + * For an array `arr = Arr(x1, x2, x3, ..., xn)` the result is + * `Arr(math.pow(x1, 1), math.pow((x1 + x2), 1.0/2), math.pow((x1 + x2 + x3), 1.0/3), ..., math.pow((x1 + x2 + x3 + ... + xn), 1.0/n))` + */ +def rollingGeoMeanParallel(arr: Arr[Int]): Arr[Double] = { + // Transform all numbers to roots with degree 1 + val arr1 = arr.map(x => Root(x, 1)) + // Compute the rolling geometric mean keeping the root structured + val arr2 = arr1.scan(Root(1, 0))((acc, x) => Root(acc.radicand * x.radicand, acc.degree + x.degree)) + // Transform the roots to Doubles + arr2.map(root => root.toDouble) + // Drop the extra initial element that was added by the scan + arr3.tail +``` + + This implementation has some issues: + - It does not use parallelism + - Creates two intermediate arrays by calling `map` + - Creates an extra intermediate arrays by calling `tail` + - Scan returns an extra element we do not need + + We want to parallelize and avoid the creation of the extra arrays. + As we are calling a `scan` the natural operations we need are `upsweep` and `downsweep`. + It is possible specialize those operations for our problem by letting those operations do the mapping. + It is also possible to change those operations to not generate the first element. + +We give you a version of `rollingGeoMeanSequential` that partially implements the parallelization using `upsweep` and `downsweep`. + + Your tasks in the exercise will be to: + - TASK 1: Implement the parallelization of `upsweep` and `downsweep` + - TASK 2: Remove the calls to the `map` + - TASK 3: Remove the call to `tail` + + You can get partial points for solving part of the tasks. + The order of the tasks is a suggestion, you may do them in any order if that is simpler for you. + +Look at the `Lib` trait to find the definitions of functions and classes you can use (or already used). +In this question we use a `Arr` array class instead of the normal `Array`. You may assume that this class has the same performance characteristics as the normal array. `Arr` provides only a limited set of operations. diff --git a/previous-exams/2021-midterm/m2/.gitignore b/previous-exams/2021-midterm/m2/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m2/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m2/assignment.sbt b/previous-exams/2021-midterm/m2/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m2/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m2/build.sbt b/previous-exams/2021-midterm/m2/build.sbt new file mode 100644 index 0000000..4a68d9e --- /dev/null +++ b/previous-exams/2021-midterm/m2/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m2" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m2.M2Suite" diff --git a/previous-exams/2021-midterm/m2/grading-tests.jar b/previous-exams/2021-midterm/m2/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..66ce3fdf704542bc3d07a5b92687caf1fd2b3cf1 GIT binary patch literal 34633 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%0AhB#V!ya~=w(#p>tWK0IPIZ8yjNmH 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¨6-PA429Qd^CEO;0yG9_dIh!gDEbT$k24v<`Ha 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 literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m2/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m2/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m2/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m2/project/MOOCSettings.scala b/previous-exams/2021-midterm/m2/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m2/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m2/project/StudentTasks.scala b/previous-exams/2021-midterm/m2/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m2/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m2/project/build.properties b/previous-exams/2021-midterm/m2/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m2/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m2/project/buildSettings.sbt b/previous-exams/2021-midterm/m2/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m2/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m2/project/plugins.sbt b/previous-exams/2021-midterm/m2/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m2/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m2/src/main/scala/m2/Lib.scala b/previous-exams/2021-midterm/m2/src/main/scala/m2/Lib.scala new file mode 100644 index 0000000..9f1aff5 --- /dev/null +++ b/previous-exams/2021-midterm/m2/src/main/scala/m2/Lib.scala @@ -0,0 +1,60 @@ +package m2 + +//////////////////////////////////////// +// NO NEED TO MODIFY THIS SOURCE FILE // +//////////////////////////////////////// + +trait Lib { + + /** If an array has `n` elements and `n < THRESHOLD`, then it should be processed sequentially */ + final val THRESHOLD: Int = 33 + + /** Compute the two values in parallel + * + * Note: Most tests just compute those two sequentially to make any bug simpler to debug + */ + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) + + /** A limited array. It only contains the required operations for this exercise. */ + trait Arr[T] { + /** Get the i-th element of the array (0-based) */ + def apply(i: Int): T + /** Update the i-th element of the array with the given value (0-based) */ + def update(i: Int, x: T): Unit + /** Number of elements in this array */ + def length: Int + /** Create a copy of this array without the first element */ + def tail: Arr[T] + /** Create a copy of this array by mapping all the elements with the given function */ + def map[U](f: T => U): Arr[U] + } + + object Arr { + /** Create an array with the given elements */ + def apply[T](xs: T*): Arr[T] = { + val arr: Arr[T] = Arr.ofLength(xs.length) + for i <- 0 until xs.length do arr(i) = xs(i) + arr + } + + /** Create an array with the given length. All elements are initialized to `null`. */ + def ofLength[T](n: Int): Arr[T] = + newArrOfLength(n) + + } + + /** Create an array with the given length. All elements are initialized to `null`. */ + def newArrOfLength[T](n: Int): Arr[T] + + /** A number representing `radicand^(1.0/degree)` */ + case class Root(radicand: Int, degree: Int) { + def toDouble: Double = scala.math.pow(radicand, 1.0/degree) + } + + /** Tree result of an upsweep operation. Specialized for `Root` results. */ + trait TreeRes { val res: Root } + /** Leaf result of an upsweep operation. Specialized for `Root` results. */ + case class Leaf(from: Int, to: Int, res: Root) extends TreeRes + /** Tree node result of an upsweep operation. Specialized for `Root` results. */ + case class Node(left: TreeRes, res: Root, right: TreeRes) extends TreeRes +} diff --git a/previous-exams/2021-midterm/m2/src/main/scala/m2/M2.scala b/previous-exams/2021-midterm/m2/src/main/scala/m2/M2.scala new file mode 100644 index 0000000..1710998 --- /dev/null +++ b/previous-exams/2021-midterm/m2/src/main/scala/m2/M2.scala @@ -0,0 +1,75 @@ +package m2 + + +trait M2 extends Lib { + // Functions and classes of Lib can be used in here + + /** Compute the rolling geometric mean of an array. + * + * For an array `arr = Arr(x1, x2, x3, ..., xn)` the result is + * `Arr(math.pow(x1, 1), math.pow((x1 + x2), 1.0/2), math.pow((x1 + x2 + x3), 1.0/3), ..., math.pow((x1 + x2 + x3 + ... + xn), 1.0/n))` + */ + def rollingGeoMeanParallel(arr: Arr[Int]): Arr[Double] = { + if (arr.length == 0) return Arr.ofLength(0) + + val out: Arr[Double] = Arr.ofLength(arr.length) + val tree = upsweep(arr, 0, arr.length) + downsweep(arr, Root(1, 0), tree, out) + out + } + + // No need to modify this + def scanOp(acc: Root, x: Root) = + Root(acc.radicand * x.radicand, acc.degree + x.degree) + + + def upsweep(input: Arr[Int], from: Int, to: Int): TreeRes = { + if (to - from < THRESHOLD) + Leaf(from, to, reduceSequential(input, from + 1, to, Root(input(from), 1))) + else { + val mid = from + (to - from)/2 + val (tL, tR) = parallel( + upsweep(input, from, mid), + upsweep(input, mid, to) + ) + Node(tL, scanOp(tL.res, tR.res), tR) + } + } + + + def downsweep(input: Arr[Int], a0: Root, tree: TreeRes, output: Arr[Double]): Unit = { + tree match { + case Node(left, _, right) => + parallel( + downsweep(input, a0, left, output), + downsweep(input, scanOp(a0, left.res), right, output) + ) + case Leaf(from, to, _) => + downsweepSequential(input, from, to, a0, output) + } + } + + + def downsweepSequential(input: Arr[Int], from: Int, to: Int, a0: Root, output: Arr[Double]): Unit = { + if (from < to) { + var i = from + var a = a0 + while (i < to) { + a = scanOp(a, Root(input(i), 1)) + output(i) = a.toDouble + i = i + 1 + } + } + } + + + def reduceSequential(input: Arr[Int], from: Int, to: Int, a0: Root): Root = { + var a = a0 + var i = from + while (i < to) { + a = scanOp(a, Root(input(i), 1)) + i = i + 1 + } + a + } +} diff --git a/previous-exams/2021-midterm/m2/src/test/scala/m2/M2Suite.scala b/previous-exams/2021-midterm/m2/src/test/scala/m2/M2Suite.scala new file mode 100644 index 0000000..a5b3a44 --- /dev/null +++ b/previous-exams/2021-midterm/m2/src/test/scala/m2/M2Suite.scala @@ -0,0 +1,175 @@ +package m2 + +class M2Suite extends munit.FunSuite { + + test("Rolling geometric mean result test (5pts)") { + RollingGeoMeanBasicLogicTest.basicTests() + RollingGeoMeanBasicLogicTest.normalTests() + RollingGeoMeanBasicLogicTest.largeTests() + } + + test("[TASK 1] Rolling geometric mean parallelism test (30pts)") { + RollingGeoMeanCallsToParallel.parallelismTest() + RollingGeoMeanParallel.basicTests() + RollingGeoMeanParallel.normalTests() + RollingGeoMeanParallel.largeTests() + } + + test("[TASK 2] Rolling geometric mean no `map` test (35pts)") { + RollingGeoMeanNoMap.basicTests() + RollingGeoMeanNoMap.normalTests() + RollingGeoMeanNoMap.largeTests() + } + + test("[TASK 3] Rolling geometric mean no `tail` test (30pts)") { + RollingGeoMeanNoTail.basicTests() + RollingGeoMeanNoTail.normalTests() + RollingGeoMeanNoTail.largeTests() + } + + + object RollingGeoMeanBasicLogicTest extends M2 with LibImpl with RollingGeoMeanTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + } + + object RollingGeoMeanCallsToParallel extends M2 with LibImpl with RollingGeoMeanTest { + private var count = 0 + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = + count += 1 + (op1, op2) + + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + + def parallelismTest() = { + assertParallelCount(Arr(), 0) + assertParallelCount(Arr(1), 0) + assertParallelCount(Arr(1, 2, 3, 4), 0) + assertParallelCount(Arr(Array.tabulate(16)(identity): _*), 0) + assertParallelCount(Arr(Array.tabulate(32)(identity): _*), 0) + + assertParallelCount(Arr(Array.tabulate(33)(identity): _*), 2) + assertParallelCount(Arr(Array.tabulate(64)(identity): _*), 2) + assertParallelCount(Arr(Array.tabulate(128)(identity): _*), 6) + assertParallelCount(Arr(Array.tabulate(256)(identity): _*), 14) + assertParallelCount(Arr(Array.tabulate(1000)(identity): _*), 62) + assertParallelCount(Arr(Array.tabulate(1024)(identity): _*), 62) + } + + def assertParallelCount(arr: Arr[Int], expected: Int): Unit = { + try { + count = 0 + rollingGeoMeanParallel(arr) + assert(count == expected, { + val extra = if (expected == 0) "" else s" ${expected/2} for the `upsweep` and ${expected/2} for the `downsweep`" + s"\n$arr\n\nERROR: Expected $expected instead of $count calls to `parallel(...)` for an array of ${arr.length} elements. Current parallel threshold is $THRESHOLD.$extra" + }) + } finally { + count = 0 + } + } + + } + + object RollingGeoMeanNoMap extends M2 with LibImpl with RollingGeoMeanTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl[T](arr) { + override def map[U](f: T => U): Arr[U] = throw Exception("Should not call Arr.map") + } + } + + object RollingGeoMeanNoTail extends M2 with LibImpl with RollingGeoMeanTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl[T](arr) { + override def tail: Arr[T] = throw Exception("Should not call Arr.tail") + } + } + + object RollingGeoMeanParallel extends M2 with LibImpl with RollingGeoMeanTest { + import scala.concurrent.duration._ + val TIMEOUT = Duration(10, SECONDS) + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = { + import concurrent.ExecutionContext.Implicits.global + import scala.concurrent._ + Await.result(Future(op1).zip(Future(op2)), TIMEOUT) // FIXME not timing-out + } + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + } + + trait LibImpl extends Lib { + + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] + + def newArrOfLength[T](n: Int): Arr[T] = + newArrFrom(new Array(n)) + + class ArrImpl[T](val arr: Array[AnyRef]) extends Arr[T]: + def apply(i: Int): T = + arr(i).asInstanceOf[T] + def update(i: Int, x: T): Unit = + arr(i) = x.asInstanceOf[AnyRef] + def length: Int = + arr.length + def map[U](f: T => U): Arr[U] = + newArrFrom(arr.map(f.asInstanceOf[AnyRef => AnyRef])) + def tail: Arr[T] = + newArrFrom(arr.tail) + override def toString: String = + arr.mkString("Arr(", ", ", ")") + override def equals(that: Any): Boolean = + that match + case that: ArrImpl[_] => Array.equals(arr, that.arr) + case _ => false + } + + trait RollingGeoMeanTest extends M2 { + + def tabulate[T](n: Int)(f: Int => T): Arr[T] = + val arr = Arr.ofLength[T](n) + for i <- 0 until n do + arr(i) = f(i) + arr + + def asSeq(arr: Arr[Double]) = + val array = new Array[Double](arr.length) + for i <- 0 to (arr.length - 1) do + array(i) = arr(i) + array.toSeq + + def scanOp_(acc: Root, x: Root) = + Root(acc.radicand * x.radicand, acc.degree + x.degree) + + def result(ds: Seq[Int]): Arr[Double] = + Arr(ds.map(x => Root(x, 1)).scan(Root(1, 0))(scanOp_).tail.map(_.toDouble): _*) + + def check(input: Seq[Int]) = + assertEquals( + // .toString calls are a terrible kludge so that NaNs compare equal to eachother... + asSeq(rollingGeoMeanParallel(Arr(input: _*))).map(_.toString), + asSeq(result(input)).map(_.toString) + ) + + def basicTests() = { + check(Seq()) + check(Seq(1)) + check(Seq(1, 2, 3, 4)) + check(Seq(4, 4, 4, 4)) + } + + def normalTests() = { + check(Seq.tabulate(64)(identity)) + check(Seq(4, 4, 4, 4)) + check(Seq(4, 8, 6, 4)) + check(Seq(4, 3, 2, 1)) + check(Seq.tabulate(64)(identity).reverse) + check(Seq.tabulate(128)(i => 128 - 2*i).reverse) + } + + def largeTests() = { + check(Seq.tabulate(500)(identity)) + check(Seq.tabulate(512)(identity)) + check(Seq.tabulate(1_000)(identity)) + check(Seq.tabulate(10_000)(identity)) + } + } +} diff --git a/previous-exams/2021-midterm/m20.md b/previous-exams/2021-midterm/m20.md new file mode 100644 index 0000000..59f6c09 --- /dev/null +++ b/previous-exams/2021-midterm/m20.md @@ -0,0 +1,97 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m20 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m20 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +In this question, you will complete the definition of two concurrent data +structures **without using `synchronized`**: `SeqCount` and `MultiWriterSeqCount`. + +## Part 1: SeqCount (defined in `SeqCount.scala`) + +An instance of this class stores two integers (initially set to 0), the stored +values can be updated using `write` and retrieved using `copy`. Only one thread +at a time is allowed to call `write` but multiple threads can call `copy` at +once. + +Your task in this part is to implement `copy` such that this method never +returns _partially updated values_, for example given two threads operating +concurrently on a `SeqCount` `sc`: +```scala +// Thread 1 +sc.write(1, 2) +``` +```scala +// Thread 2 +val result = sc.copy() +``` +`result` must either be `(0, 0)` (since the initial values are 0) or `(1, 2)`, +but it must not be `(1, 0)`, `(0, 2)` or any other value. + +To successfully implement this method you will need to use `generation`: this +method returns the current value of a volatile variable which is initially set +to 0, gets incremented by one at the beginning of `write`, and incremented by +one again at the end of `write`. + +**You are not allowed to use `synchronized` or directly call any of +`myGeneration`, `myX` or `myY` (use the pre-defined getters and setters +instead).** + +Hints: +- Remember that a write to a volatile field _happens-before_ every subsequent + read of that field. +- `generation` will always be even when a write has completed and always +odd when a write is in progress. +- `copy` can be implemented as a tail-recursive method. + +## Part 2: MultiWriterSeqCount (defined in `MultiWriterSeqCount.scala`) + +Like `SeqCount`, this class stores two integers updated using `write` and +retrieved using `copy`, but unlike `SeqCount` multiple threads are allowed to +call `write` at the same time: these writes will all succeed but they are +allowed to complete in any order, for example given three threads operating +concurrently on a `MultiWriterSeqCount` `msc`: +```scala +// Thread 1 +msc.write(1, 2) +``` +```scala +// Thread 2 +msc.write(10, 20) +``` +```scala +// Thread 3 +val result = msc.copy() +``` +`result` must either be `(0, 0)`, `(1, 2)` or `(10, 20)`. + +In this class, the generation is stored in an atomic variable instead of a +volatible field therefore it's important to note that: +- a `set` on an atomic variable _happens-before_ every subsequent `get` of that + variable. +- A call to `compareAndSet` both gets and set an atomic variable. + +Your task in this part is to implement both `copy` and `write`. + +**You are not allowed to use `synchronized` or directly call any of +`myGeneration`, `myX` or `myY` (use the pre-defined getters and setters +instead).** + +Hints: +- you should be able to just copy-paste the implementation of `copy` you + implemented in Part 1 +- you will need to make use of `compareAndSetGeneration` in `write` +- `write` can be implemented as a tail-recursive method. diff --git a/previous-exams/2021-midterm/m20/.gitignore b/previous-exams/2021-midterm/m20/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m20/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m20/assignment.sbt b/previous-exams/2021-midterm/m20/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m20/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m20/build.sbt b/previous-exams/2021-midterm/m20/build.sbt new file mode 100644 index 0000000..8cd8c7a --- /dev/null +++ b/previous-exams/2021-midterm/m20/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m20" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m20.M20Suite" diff --git a/previous-exams/2021-midterm/m20/grading-tests.jar b/previous-exams/2021-midterm/m20/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..b6bb8fe06564ac4c2bec2396c5dfe7caa3b51e44 GIT binary patch literal 131660 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	qO9{ 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	y@KDmh{xDnnn7$hLBU=N1<TFUf0)r!v zXpD?Ki=#UMPKWpbBlk{B{Z8*p4k7;2RApc=dl))XKN(srTLV)q!6>)qApJXGSfB)> zF__SQ4(<mGwgnA}0*PB=^CuS#ti2=t(pzBQ6xi$_!=6A7fuU}aiv7}Dji8w0;KPq( zS@PX~VFyQIDI=(qJ=EC>3O7?Qmo#yNTfxknuGyQ|pfQ_HT$J(y7?Nke2RWy9xBqWW zsLP~1`^nE8)FKyXaLC;Z;&FIRGElUw*sH2UK^;_K4FDsL2W?(QLeWSP8-7}!2Jj~T zVBYaLnu)sbGAY6Sr$7hp1APOz36BRH!E`k-bNJ)s#KB(7O>U0i3z}~<ST~$QYA8y< zsJLh(xUJ2yO9qBRQP7}~u`H1&v8YwxV-7!F3u@~tP=O7}+Q|6Bv3o687G`FqY!9{i zGjilXH6Z@NWqTtKC#X4Oere+0@lo3^_$!|0Ef~;cNI^spB>Q(#4(BTa`^`-M&iYsV z5OZ9h%rhW7GMzH(Z|JCPKl?D~2?TU<CGbJ6(gy{H)Bm0C(6kh}^Cj=JLBsw5KFHXf zLX=q4)_&sK)rJ7%^dJ4j=habIXKf=}bW=$mv1;X2&|l8|(O>#YQE}0zQ0|^e<_{W% zA()(yRe)EZ#G+PVwoSYLI8b2~sDM19YSbQqg+rlMPz!W2oOSmgkp?nc05TvCM+FTi z!Dw{oTz(MB0*nm-S|D?kT2XUR3n6$dP1OPjK?b;czD2)NQ|IB_|ANlK{&KyBxTa*- z1cnWIFybNS@VNKya^ORwO$y0}&J)0XEU-X8&Y^1H?{eTrlfxAb(hW^!K-WFE5n=s~ zCI>X+OnFX+tE>=6rr1GpHy*}6+qr}5k^j@53w6y>g;y#)0J`tphJ@U6U>A=dI~&2! z&WnDQ-`2IkOwb6>doTZgCxy!>uxMn^q@+4e2Z%F&P*+7zQBg}!UPdb~0UEa<=s3s{ zSW6s9b^hauy@QjXT02du6$Y42fDFhIV1R2f_O{@E)EU^-JE4(aS`ynxa!&#<dLUD) zWl&L3OJG;`e4GwQu=hS0nX03B1obY|1l=gtZ>;1#3+$vNJh<ZgsC+aPjR2%~rSQ8z zO}T?v8hIH@pos#Cy8Nn!1q>{p{P#im_iiZporLs`hH62r9N~W)F*(={0(-(+R)Gq- zK!v^VPrp;S0XjAsEilMEs0M%*-ardvG@cn+G-^fmM;}L4M9TJX^zUG6=-S2ppl*Bd z%YP?>`)Jw!4Qxk6Ge0Q*{<vJo8kvNm%M6YD`|s*RMxTm6i$*Q~{!8kR(VAIDqYu6M z^PnL6?_ooJTvn2g28~9K{Wmlrler4fkx|RB|861V)(Cxd1o_DOo(}4<{|XvpHbDt` zHfp=~U)X`XfRrjbf_?avHV2K~f0`Y6q32kR5{#w__aDDQ=H^wS=Ass2{~@Ej!+XDz zX2ap!{~rDxd6e&<B>O$%k=J*1&3~B%8gcgfIwI%b-1fIQpq6RBUl;N`jM;m54u^SA x9#m$(9{}={>Gt(#DjG5NzfwVlrVOKi9xOi=n7$woMer949#d!k01GC_{{S4s(i{K) literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m20/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m20/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m20/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m20/project/MOOCSettings.scala b/previous-exams/2021-midterm/m20/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m20/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m20/project/StudentTasks.scala b/previous-exams/2021-midterm/m20/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m20/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m20/project/build.properties b/previous-exams/2021-midterm/m20/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m20/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m20/project/buildSettings.sbt b/previous-exams/2021-midterm/m20/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m20/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m20/project/plugins.sbt b/previous-exams/2021-midterm/m20/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m20/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m20/src/main/scala/m20/MultiWriterSeqCount.scala b/previous-exams/2021-midterm/m20/src/main/scala/m20/MultiWriterSeqCount.scala new file mode 100644 index 0000000..89df220 --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/main/scala/m20/MultiWriterSeqCount.scala @@ -0,0 +1,66 @@ +package m20 + +import instrumentation._ + +import scala.annotation.tailrec + +/** Multi-writer, multi-reader data structure containing a pair of integers. */ +class MultiWriterSeqCount extends Monitor: + /** Do not directly use this variable, use `generation`, `setGeneration` and + * `compareAndSetGeneration` instead. + */ + protected val myGeneration: AbstractAtomicVariable[Int] = new AtomicVariable(0) + protected def generation: Int = myGeneration.get + protected def setGeneration(newGeneration: Int): Unit = + myGeneration.set(newGeneration) + protected def compareAndSetGeneration(expected: Int, newValue: Int): Boolean = + myGeneration.compareAndSet(expected, newValue) + + /** Do not directly use this variable, use `x` and `setX` instead. */ + protected var myX: Int = 0 + protected def x: Int = myX + protected def setX(newX: Int): Unit = + myX = newX + + /** Do not directly use this variable, use `y` and `setY` instead. */ + protected var myY: Int = 0 + protected def y: Int = myY + protected def setY(newY: Int): Unit = + myY = newY + + /** Write new values into this data structure. + * This method is always safe to call. + * The implementation of this method is not allowed to call `synchronized`. + */ + + @tailrec + final def write(newX: Int, newY: Int): Unit = + val old = generation + if old % 2 != 0 then + write(newX, newY) + else + if !compareAndSetGeneration(old, old + 1) then + write(newX, newY) + else + setX(newX) + setY(newY) + setGeneration(old + 2) + + /** Copy the values previously written into this data structure into a tuple. + * This method is always safe to call. + * The implementation of this method is not allowed to call `synchronized`. + */ + + @tailrec + final def copy(): (Int, Int) = + val old = generation + if old % 2 != 0 then + copy() + else + val result = (x, y) + if generation != old then + copy() + else + result + +end MultiWriterSeqCount diff --git a/previous-exams/2021-midterm/m20/src/main/scala/m20/SeqCount.scala b/previous-exams/2021-midterm/m20/src/main/scala/m20/SeqCount.scala new file mode 100644 index 0000000..ff95a2c --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/main/scala/m20/SeqCount.scala @@ -0,0 +1,53 @@ +package m20 + +import instrumentation._ + +import scala.annotation.tailrec + +/** Single-writer, multi-reader data structure containing a pair of integers. */ +class SeqCount extends Monitor: + /** Do not directly use this variable, use `generation` and `setGeneration` instead. */ + @volatile protected var myGeneration: Int = 0 + protected def generation: Int = myGeneration + protected def setGeneration(newGeneration: Int): Unit = + myGeneration = newGeneration + + /** Do not directly use this variable, use `x` and `setX` instead. */ + protected var myX: Int = 0 + protected def x: Int = myX + protected def setX(newX: Int): Unit = + myX = newX + + /** Do not directly use this variable, use `y` and `setY` instead. */ + protected var myY: Int = 0 + protected def y: Int = myY + protected def setY(newY: Int): Unit = + myY = newY + + /** Write new values into this data structure. + * This method must only be called from one thread at a time. + */ + final def write(newX: Int, newY: Int): Unit = + setGeneration(generation + 1) + setX(newX) + setY(newY) + setGeneration(generation + 1) + + /** Copy the values previously written into this data structure into a tuple. + * This method is always safe to call. + * The implementation of this method is not allowed to call `synchronized`. + */ + + @tailrec + final def copy(): (Int, Int) = + val old = generation + if old % 2 != 0 then + copy() + else + val result = (x, y) + if generation != old then + copy() + else + result + +end SeqCount diff --git a/previous-exams/2021-midterm/m20/src/main/scala/m20/instrumentation/AtomicVariable.scala b/previous-exams/2021-midterm/m20/src/main/scala/m20/instrumentation/AtomicVariable.scala new file mode 100644 index 0000000..b966283 --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/main/scala/m20/instrumentation/AtomicVariable.scala @@ -0,0 +1,28 @@ +package m20.instrumentation + +import java.util.concurrent.atomic._ + +abstract class AbstractAtomicVariable[T] { + def get: T + def set(value: T): Unit + def compareAndSet(expect: T, newval: T) : Boolean +} + +class AtomicVariable[T](initial: T) extends AbstractAtomicVariable[T] { + + private val atomic = new AtomicReference[T](initial) + + override def get: T = atomic.get() + + override def set(value: T): Unit = atomic.set(value) + + override def compareAndSet(expected: T, newValue: T): Boolean = { + val current = atomic.get + if (current == expected) { + atomic.compareAndSet(current, newValue) + } + else { + false + } + } +} diff --git a/previous-exams/2021-midterm/m20/src/main/scala/m20/instrumentation/Monitor.scala b/previous-exams/2021-midterm/m20/src/main/scala/m20/instrumentation/Monitor.scala new file mode 100644 index 0000000..bf844ac --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/main/scala/m20/instrumentation/Monitor.scala @@ -0,0 +1,23 @@ +package m20.instrumentation + +class Dummy + +trait Monitor { + implicit val dummy: Dummy = new Dummy + + def wait()(implicit i: Dummy) = waitDefault() + + def synchronized[T](e: => T)(implicit i: Dummy) = synchronizedDefault(e) + + def notify()(implicit i: Dummy) = notifyDefault() + + def notifyAll()(implicit i: Dummy) = notifyAllDefault() + + private val lock = new AnyRef + + // Can be overriden. + def waitDefault(): Unit = lock.wait() + def synchronizedDefault[T](toExecute: =>T): T = lock.synchronized(toExecute) + def notifyDefault(): Unit = lock.notify() + def notifyAllDefault(): Unit = lock.notifyAll() +} diff --git a/previous-exams/2021-midterm/m20/src/test/scala/m20/TestSuite.scala b/previous-exams/2021-midterm/m20/src/test/scala/m20/TestSuite.scala new file mode 100644 index 0000000..14e707c --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/test/scala/m20/TestSuite.scala @@ -0,0 +1,122 @@ +package m20 + +import scala.concurrent._ +import scala.concurrent.duration._ +import scala.collection.mutable.HashMap +import scala.util.Random +import instrumentation._ +import instrumentation.TestHelper._ +import instrumentation.TestUtils._ + +enum ThreadResult: + case WriteError(error: String) + case WriteSuccess + case Read(result: (Int, Int)) +import ThreadResult._ + +class M20Suite extends munit.FunSuite: + /** If at least one thread resulted in an error, + * return `(false, errorMessage)` otherwise return `(true, "")`. + */ + def processResults(results: List[ThreadResult]): (Boolean, String) = + val success = (true, "") + results.foldLeft(success) { + case (acc @ (false, _), _) => + // Report the first error found + acc + case (_, WriteError(error)) => + (false, error) + case (_, Read((x, y))) if x + 1 != y => + (false, s"Read ($x, $y) but expected y to be ${x + 1}") + case (_, _: Read | WriteSuccess) => + success + } + + def randomList(length: Int): List[Int] = + List.fill(length)(Random.nextInt) + + test("SeqCount: single-threaded write and copy (1 pts)") { + val sc = new SeqCount + randomList(100).lazyZip(randomList(100)).foreach { (x, y) => + sc.write(x, y) + assertEquals(sc.copy(), (x, y)) + } + } + + test("SeqCount: one write thread, two copy threads (4 pts)") { + testManySchedules(3, sched => + val sc = new SchedulableSeqCount(sched) + // Invariant in this test: y == x + 1 + sc.write(0, 1) + + val randomValues = randomList(length = 5) + + def writeThread(): ThreadResult = + randomValues.foldLeft(WriteSuccess) { + case (res: WriteError, _) => + // Report the first error found + res + case (_, i) => + sc.write(i, i + 1) + val writtenValues = (i, i + 1) + val readBack = sc.copy() + if writtenValues != readBack then + WriteError(s"Wrote $writtenValues but read back $readBack") + else + WriteSuccess + } + + def copyThread(): ThreadResult = + Read(sc.copy()) + + val threads = List( + () => writeThread(), + () => copyThread(), + () => copyThread() + ) + + (threads, results => processResults(results.asInstanceOf[List[ThreadResult]])) + ) + } + + test("MultiWriterSeqCount: single-threaded write and copy (1 pts)") { + val sc = new MultiWriterSeqCount + randomList(100).lazyZip(randomList(100)).foreach { (x, y) => + sc.write(x, y) + assertEquals(sc.copy(), (x, y)) + } + } + + test("MultiWriterSeqCount: two write threads, two copy threads (4 pts)") { + testManySchedules(4, sched => + val msc = new SchedulableMultiWriterSeqCount(sched) + // Invariant in this test: y == x + 1 + msc.write(0, 1) + + val randomValues = randomList(length = 5) + + def writeThread(): ThreadResult = + randomValues.foreach(i => msc.write(i, i + 1)) + // Unlke in the SeqCount test, we do not verify that we can read back + // the values we wrote, because the other writer thread might have + // overwritten them already. + WriteSuccess + + def copyThread(): ThreadResult = + Read(msc.copy()) + + val threads = List( + () => writeThread(), + () => writeThread(), + () => copyThread(), + () => copyThread() + ) + + (threads, results => processResults(results.asInstanceOf[List[ThreadResult]])) + ) + } + + import scala.concurrent.duration._ + override val munitTimeout = 200.seconds +end M20Suite + diff --git a/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/MockedMonitor.scala b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/MockedMonitor.scala new file mode 100644 index 0000000..0b7e94f --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/MockedMonitor.scala @@ -0,0 +1,72 @@ +package m20.instrumentation + +trait MockedMonitor extends Monitor { + def scheduler: Scheduler + + // Can be overriden. + override def waitDefault() = { + scheduler.log("wait") + scheduler updateThreadState Wait(this, scheduler.threadLocks.tail) + } + override def synchronizedDefault[T](toExecute: =>T): T = { + scheduler.log("synchronized check") + val prevLocks = scheduler.threadLocks + scheduler updateThreadState Sync(this, prevLocks) // If this belongs to prevLocks, should just continue. + scheduler.log("synchronized -> enter") + try { + toExecute + } finally { + scheduler updateThreadState Running(prevLocks) + scheduler.log("synchronized -> out") + } + } + override def notifyDefault() = { + scheduler mapOtherStates { + state => state match { + case Wait(lockToAquire, locks) if lockToAquire == this => SyncUnique(this, state.locks) + case e => e + } + } + scheduler.log("notify") + } + override def notifyAllDefault() = { + scheduler mapOtherStates { + state => state match { + case Wait(lockToAquire, locks) if lockToAquire == this => Sync(this, state.locks) + case SyncUnique(lockToAquire, locks) if lockToAquire == this => Sync(this, state.locks) + case e => e + } + } + scheduler.log("notifyAll") + } +} + +trait LockFreeMonitor extends Monitor { + override def waitDefault() = { + throw new Exception("Please use lock-free structures and do not use wait()") + } + override def synchronizedDefault[T](toExecute: =>T): T = { + throw new Exception("Please use lock-free structures and do not use synchronized()") + } + override def notifyDefault() = { + throw new Exception("Please use lock-free structures and do not use notify()") + } + override def notifyAllDefault() = { + throw new Exception("Please use lock-free structures and do not use notifyAll()") + } +} + + +abstract class ThreadState { + def locks: Seq[AnyRef] +} +trait CanContinueIfAcquiresLock extends ThreadState { + def lockToAquire: AnyRef +} +case object Start extends ThreadState { def locks: Seq[AnyRef] = Seq.empty } +case object End extends ThreadState { def locks: Seq[AnyRef] = Seq.empty } +case class Wait(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState +case class SyncUnique(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState with CanContinueIfAcquiresLock +case class Sync(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState with CanContinueIfAcquiresLock +case class Running(locks: Seq[AnyRef]) extends ThreadState +case class VariableReadWrite(locks: Seq[AnyRef]) extends ThreadState diff --git a/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/Scheduler.scala b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/Scheduler.scala new file mode 100644 index 0000000..bdc09b5 --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/Scheduler.scala @@ -0,0 +1,304 @@ +package m20.instrumentation + +import java.util.concurrent._; +import scala.concurrent.duration._ +import scala.collection.mutable._ +import Stats._ + +import java.util.concurrent.atomic.AtomicInteger + +sealed abstract class Result +case class RetVal(rets: List[Any]) extends Result +case class Except(msg: String, stackTrace: Array[StackTraceElement]) extends Result +case class Timeout(msg: String) extends Result + +/** + * A class that maintains schedule and a set of thread ids. + * The schedules are advanced after an operation of a SchedulableBuffer is performed. + * Note: the real schedule that is executed may deviate from the input schedule + * due to the adjustments that had to be made for locks + */ +class Scheduler(sched: List[Int]) { + val maxOps = 500 // a limit on the maximum number of operations the code is allowed to perform + + private var schedule = sched + private var numThreads = 0 + private val realToFakeThreadId = Map[Long, Int]() + private val opLog = ListBuffer[String]() // a mutable list (used for efficient concat) + private val threadStates = Map[Int, ThreadState]() + + /** + * Runs a set of operations in parallel as per the schedule. + * Each operation may consist of many primitive operations like reads or writes + * to shared data structure each of which should be executed using the function `exec`. + * @timeout in milliseconds + * @return true - all threads completed on time, false -some tests timed out. + */ + def runInParallel(timeout: Long, ops: List[() => Any]): Result = { + numThreads = ops.length + val threadRes = Array.fill(numThreads) { None: Any } + var exception: Option[Except] = None + val syncObject = new Object() + var completed = new AtomicInteger(0) + // create threads + val threads = ops.zipWithIndex.map { + case (op, i) => + new Thread(new Runnable() { + def run(): Unit = { + val fakeId = i + 1 + setThreadId(fakeId) + try { + updateThreadState(Start) + val res = op() + updateThreadState(End) + threadRes(i) = res + // notify the master thread if all threads have completed + if (completed.incrementAndGet() == ops.length) { + syncObject.synchronized { syncObject.notifyAll() } + } + } catch { + case e: Throwable if exception != None => // do nothing here and silently fail + case e: Throwable => + log(s"throw ${e.toString}") + exception = Some(Except(s"Thread $fakeId crashed on the following schedule: \n" + opLog.mkString("\n"), + e.getStackTrace)) + syncObject.synchronized { syncObject.notifyAll() } + //println(s"$fakeId: ${e.toString}") + //Runtime.getRuntime().halt(0) //exit the JVM and all running threads (no other way to kill other threads) + } + } + }) + } + // start all threads + threads.foreach(_.start()) + // wait for all threads to complete, or for an exception to be thrown, or for the time out to expire + var remTime = timeout + syncObject.synchronized { + timed { if(completed.get() != ops.length) syncObject.wait(timeout) } { time => remTime -= time } + } + if (exception.isDefined) { + exception.get + } else if (remTime <= 1) { // timeout ? using 1 instead of zero to allow for some errors + Timeout(opLog.mkString("\n")) + } else { + // every thing executed normally + RetVal(threadRes.toList) + } + } + + // Updates the state of the current thread + def updateThreadState(state: ThreadState): Unit = { + val tid = threadId + synchronized { + threadStates(tid) = state + } + state match { + case Sync(lockToAquire, locks) => + if (locks.indexOf(lockToAquire) < 0) waitForTurn else { + // Re-aqcuiring the same lock + updateThreadState(Running(lockToAquire +: locks)) + } + case Start => waitStart() + case End => removeFromSchedule(tid) + case Running(_) => + case _ => waitForTurn // Wait, SyncUnique, VariableReadWrite + } + } + + def waitStart(): Unit = { + //while (threadStates.size < numThreads) { + //Thread.sleep(1) + //} + synchronized { + if (threadStates.size < numThreads) { + wait() + } else { + notifyAll() + } + } + } + + def threadLocks = { + synchronized { + threadStates(threadId).locks + } + } + + def threadState = { + synchronized { + threadStates(threadId) + } + } + + def mapOtherStates(f: ThreadState => ThreadState) = { + val exception = threadId + synchronized { + for (k <- threadStates.keys if k != exception) { + threadStates(k) = f(threadStates(k)) + } + } + } + + def log(str: String) = { + if((realToFakeThreadId contains Thread.currentThread().getId())) { + val space = (" " * ((threadId - 1) * 2)) + val s = space + threadId + ":" + "\n".r.replaceAllIn(str, "\n" + space + " ") + opLog += s + } + } + + /** + * Executes a read or write operation to a global data structure as per the given schedule + * @param msg a message corresponding to the operation that will be logged + */ + def exec[T](primop: => T)(msg: => String, postMsg: => Option[T => String] = None): T = { + if(! (realToFakeThreadId contains Thread.currentThread().getId())) { + primop + } else { + updateThreadState(VariableReadWrite(threadLocks)) + val m = msg + if(m != "") log(m) + if (opLog.size > maxOps) + throw new Exception(s"Total number of reads/writes performed by threads exceed $maxOps. A possible deadlock!") + val res = primop + postMsg match { + case Some(m) => log(m(res)) + case None => + } + res + } + } + + private def setThreadId(fakeId: Int) = synchronized { + realToFakeThreadId(Thread.currentThread.getId) = fakeId + } + + def threadId = + try { + realToFakeThreadId(Thread.currentThread().getId()) + } catch { + case e: NoSuchElementException => + throw new Exception("You are accessing shared variables in the constructor. This is not allowed. The variables are already initialized!") + } + + private def isTurn(tid: Int) = synchronized { + (!schedule.isEmpty && schedule.head != tid) + } + + def canProceed(): Boolean = { + val tid = threadId + canContinue match { + case Some((i, state)) if i == tid => + //println(s"$tid: Runs ! Was in state $state") + canContinue = None + state match { + case Sync(lockToAquire, locks) => updateThreadState(Running(lockToAquire +: locks)) + case SyncUnique(lockToAquire, locks) => + mapOtherStates { + _ match { + case SyncUnique(lockToAquire2, locks2) if lockToAquire2 == lockToAquire => Wait(lockToAquire2, locks2) + case e => e + } + } + updateThreadState(Running(lockToAquire +: locks)) + case VariableReadWrite(locks) => updateThreadState(Running(locks)) + } + true + case Some((i, state)) => + //println(s"$tid: not my turn but $i !") + false + case None => + false + } + } + + var threadPreference = 0 // In the case the schedule is over, which thread should have the preference to execute. + + /** returns true if the thread can continue to execute, and false otherwise */ + def decide(): Option[(Int, ThreadState)] = { + if (!threadStates.isEmpty) { // The last thread who enters the decision loop takes the decision. + //println(s"$threadId: I'm taking a decision") + if (threadStates.values.forall { case e: Wait => true case _ => false }) { + val waiting = threadStates.keys.map(_.toString).mkString(", ") + val s = if (threadStates.size > 1) "s" else "" + val are = if (threadStates.size > 1) "are" else "is" + throw new Exception(s"Deadlock: Thread$s $waiting $are waiting but all others have ended and cannot notify them.") + } else { + // Threads can be in Wait, Sync, SyncUnique, and VariableReadWrite mode. + // Let's determine which ones can continue. + val notFree = threadStates.collect { case (id, state) => state.locks }.flatten.toSet + val threadsNotBlocked = threadStates.toSeq.filter { + case (id, v: VariableReadWrite) => true + case (id, v: CanContinueIfAcquiresLock) => !notFree(v.lockToAquire) || (v.locks contains v.lockToAquire) + case _ => false + } + if (threadsNotBlocked.isEmpty) { + val waiting = threadStates.keys.map(_.toString).mkString(", ") + val s = if (threadStates.size > 1) "s" else "" + val are = if (threadStates.size > 1) "are" else "is" + val whoHasLock = threadStates.toSeq.flatMap { case (id, state) => state.locks.map(lock => (lock, id)) }.toMap + val reason = threadStates.collect { + case (id, state: CanContinueIfAcquiresLock) if !notFree(state.lockToAquire) => + s"Thread $id is waiting on lock ${state.lockToAquire} held by thread ${whoHasLock(state.lockToAquire)}" + }.mkString("\n") + throw new Exception(s"Deadlock: Thread$s $waiting are interlocked. Indeed:\n$reason") + } else if (threadsNotBlocked.size == 1) { // Do not consume the schedule if only one thread can execute. + Some(threadsNotBlocked(0)) + } else { + val next = schedule.indexWhere(t => threadsNotBlocked.exists { case (id, state) => id == t }) + if (next != -1) { + //println(s"$threadId: schedule is $schedule, next chosen is ${schedule(next)}") + val chosenOne = schedule(next) // TODO: Make schedule a mutable list. + schedule = schedule.take(next) ++ schedule.drop(next + 1) + Some((chosenOne, threadStates(chosenOne))) + } else { + threadPreference = (threadPreference + 1) % threadsNotBlocked.size + val chosenOne = threadsNotBlocked(threadPreference) // Maybe another strategy + Some(chosenOne) + //threadsNotBlocked.indexOf(threadId) >= 0 + /* + val tnb = threadsNotBlocked.map(_._1).mkString(",") + val s = if (schedule.isEmpty) "empty" else schedule.mkString(",") + val only = if (schedule.isEmpty) "" else " only" + throw new Exception(s"The schedule is $s but$only threads ${tnb} can continue")*/ + } + } + } + } else canContinue + } + + /** + * This will be called before a schedulable operation begins. + * This should not use synchronized + */ + var numThreadsWaiting = new AtomicInteger(0) + //var waitingForDecision = Map[Int, Option[Int]]() // Mapping from thread ids to a number indicating who is going to make the choice. + var canContinue: Option[(Int, ThreadState)] = None // The result of the decision thread Id of the thread authorized to continue. + private def waitForTurn = { + synchronized { + if (numThreadsWaiting.incrementAndGet() == threadStates.size) { + canContinue = decide() + notifyAll() + } + //waitingForDecision(threadId) = Some(numThreadsWaiting) + //println(s"$threadId Entering waiting with ticket number $numThreadsWaiting/${waitingForDecision.size}") + while (!canProceed()) wait() + } + numThreadsWaiting.decrementAndGet() + } + + /** + * To be invoked when a thread is about to complete + */ + private def removeFromSchedule(fakeid: Int) = synchronized { + //println(s"$fakeid: I'm taking a decision because I finished") + schedule = schedule.filterNot(_ == fakeid) + threadStates -= fakeid + if (numThreadsWaiting.get() == threadStates.size) { + canContinue = decide() + notifyAll() + } + } + + def getOperationLog() = opLog +} diff --git a/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/Stats.scala b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/Stats.scala new file mode 100644 index 0000000..e38dd2a --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/Stats.scala @@ -0,0 +1,23 @@ +/* Copyright 2009-2015 EPFL, Lausanne */ +package m20.instrumentation + +import java.lang.management._ + +/** + * A collection of methods that can be used to collect run-time statistics about Leon programs. + * This is mostly used to test the resources properties of Leon programs + */ +object Stats { + def timed[T](code: => T)(cont: Long => Unit): T = { + var t1 = System.currentTimeMillis() + val r = code + cont((System.currentTimeMillis() - t1)) + r + } + + def withTime[T](code: => T): (T, Long) = { + var t1 = System.currentTimeMillis() + val r = code + (r, (System.currentTimeMillis() - t1)) + } +} diff --git a/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/TestHelper.scala b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/TestHelper.scala new file mode 100644 index 0000000..b361ded --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/TestHelper.scala @@ -0,0 +1,124 @@ +package m20.instrumentation + +import scala.util.Random +import scala.collection.mutable.{Map => MutableMap} + +import Stats._ + +object TestHelper { + val noOfSchedules = 10000 // set this to 100k during deployment + val readWritesPerThread = 20 // maximum number of read/writes possible in one thread + val contextSwitchBound = 10 + val testTimeout = 150 // the total time out for a test in seconds + val schedTimeout = 15 // the total time out for execution of a schedule in secs + + // Helpers + /*def testManySchedules(op1: => Any): Unit = testManySchedules(List(() => op1)) + def testManySchedules(op1: => Any, op2: => Any): Unit = testManySchedules(List(() => op1, () => op2)) + def testManySchedules(op1: => Any, op2: => Any, op3: => Any): Unit = testManySchedules(List(() => op1, () => op2, () => op3)) + def testManySchedules(op1: => Any, op2: => Any, op3: => Any, op4: => Any): Unit = testManySchedules(List(() => op1, () => op2, () => op3, () => op4))*/ + + def testSequential[T](ops: Scheduler => Any)(assertions: T => (Boolean, String)) = + testManySchedules(1, + (sched: Scheduler) => { + (List(() => ops(sched)), + (res: List[Any]) => assertions(res.head.asInstanceOf[T])) + }) + + /** + * @numThreads number of threads + * @ops operations to be executed, one per thread + * @assertion as condition that will executed after all threads have completed (without exceptions) + * the arguments are the results of the threads + */ + def testManySchedules(numThreads: Int, + ops: Scheduler => + (List[() => Any], // Threads + List[Any] => (Boolean, String)) // Assertion + ) = { + var timeout = testTimeout * 1000L + val threadIds = (1 to numThreads) + //(1 to scheduleLength).flatMap(_ => threadIds).toList.permutations.take(noOfSchedules).foreach { + val schedules = (new ScheduleGenerator(numThreads)).schedules() + var schedsExplored = 0 + schedules.takeWhile(_ => schedsExplored <= noOfSchedules && timeout > 0).foreach { + //case _ if timeout <= 0 => // break + case schedule => + schedsExplored += 1 + val schedr = new Scheduler(schedule) + //println("Exploring Sched: "+schedule) + val (threadOps, assertion) = ops(schedr) + if (threadOps.size != numThreads) + throw new IllegalStateException(s"Number of threads: $numThreads, do not match operations of threads: $threadOps") + timed { schedr.runInParallel(schedTimeout * 1000, threadOps) } { t => timeout -= t } match { + case Timeout(msg) => + throw new java.lang.AssertionError("assertion failed\n"+"The schedule took too long to complete. A possible deadlock! \n"+msg) + case Except(msg, stkTrace) => + val traceStr = "Thread Stack trace: \n"+stkTrace.map(" at "+_.toString).mkString("\n") + throw new java.lang.AssertionError("assertion failed\n"+msg+"\n"+traceStr) + case RetVal(threadRes) => + // check the assertion + val (success, custom_msg) = assertion(threadRes) + if (!success) { + val msg = "The following schedule resulted in wrong results: \n" + custom_msg + "\n" + schedr.getOperationLog().mkString("\n") + throw new java.lang.AssertionError("Assertion failed: "+msg) + } + } + } + if (timeout <= 0) { + throw new java.lang.AssertionError("Test took too long to complete! Cannot check all schedules as your code is too slow!") + } + } + + /** + * A schedule generator that is based on the context bound + */ + class ScheduleGenerator(numThreads: Int) { + val scheduleLength = readWritesPerThread * numThreads + val rands = (1 to scheduleLength).map(i => new Random(0xcafe * i)) // random numbers for choosing a thread at each position + def schedules(): LazyList[List[Int]] = { + var contextSwitches = 0 + var contexts = List[Int]() // a stack of thread ids in the order of context-switches + val remainingOps = MutableMap[Int, Int]() + remainingOps ++= (1 to numThreads).map(i => (i, readWritesPerThread)) // num ops remaining in each thread + val liveThreads = (1 to numThreads).toSeq.toBuffer + + /** + * Updates remainingOps and liveThreads once a thread is chosen for a position in the schedule + */ + def updateState(tid: Int): Unit = { + val remOps = remainingOps(tid) + if (remOps == 0) { + liveThreads -= tid + } else { + remainingOps += (tid -> (remOps - 1)) + } + } + val schedule = rands.foldLeft(List[Int]()) { + case (acc, r) if contextSwitches < contextSwitchBound => + val tid = liveThreads(r.nextInt(liveThreads.size)) + contexts match { + case prev :: tail if prev != tid => // we have a new context switch here + contexts +:= tid + contextSwitches += 1 + case prev :: tail => + case _ => // init case + contexts +:= tid + } + updateState(tid) + acc :+ tid + case (acc, _) => // here context-bound has been reached so complete the schedule without any more context switches + if (!contexts.isEmpty) { + contexts = contexts.dropWhile(remainingOps(_) == 0) + } + val tid = contexts match { + case top :: tail => top + case _ => liveThreads(0) // here, there has to be threads that have not even started + } + updateState(tid) + acc :+ tid + } + schedule #:: schedules() + } + } +} diff --git a/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/TestUtils.scala b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/TestUtils.scala new file mode 100644 index 0000000..a6a1cac --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/TestUtils.scala @@ -0,0 +1,19 @@ +package m20.instrumentation + +import scala.concurrent._ +import scala.concurrent.duration._ +import scala.concurrent.ExecutionContext.Implicits.global + +object TestUtils { + def failsOrTimesOut[T](action: => T): Boolean = { + val asyncAction = Future { + action + } + try { + Await.result(asyncAction, 2000.millisecond) + } catch { + case _: Throwable => return true + } + return false + } +} diff --git a/previous-exams/2021-midterm/m20/src/test/scala/m20/overrides.scala b/previous-exams/2021-midterm/m20/src/test/scala/m20/overrides.scala new file mode 100644 index 0000000..cffe5c5 --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/test/scala/m20/overrides.scala @@ -0,0 +1,68 @@ +package m20 + +import instrumentation._ + +import scala.annotation.tailrec +import java.util.concurrent.atomic._ + +class SchedulableAtomicVariable[T](initial: T, scheduler: Scheduler, name: String) extends AbstractAtomicVariable[T]: + private val proxied: AtomicVariable[T] = new AtomicVariable[T](initial) + + override def get: T = scheduler.exec { + proxied.get + } (s"", Some(res => s"$name: get $res")) + + override def set(value: T): Unit = scheduler.exec { + proxied.set(value) + } (s"$name: set $value", None) + + override def compareAndSet(expected: T, newValue: T): Boolean = { + scheduler.exec { + proxied.compareAndSet(expected, newValue) + } (s"$name: compareAndSet(expected = $expected, newValue = $newValue)", Some(res => s"$name: Did it set? $res") ) + } + +end SchedulableAtomicVariable + +class SchedulableSeqCount(val scheduler: Scheduler) extends SeqCount with LockFreeMonitor: + override def generation: Int = scheduler.exec { + super.generation + } ("", Some(res => s"generation is $res")) + override def setGeneration(newGeneration: Int): Unit = scheduler.exec { + super.setGeneration(newGeneration) + } ( s"setGeneration($newGeneration)", None ) + + override def x: Int = scheduler.exec { + super.x + } ("", Some(res => s"x is $res")) + override def setX(newX: Int): Unit = scheduler.exec { + super.setX(newX) + } (s"setX($newX)", None) + + override def y: Int = scheduler.exec { + super.y + } ("", Some(res => s"y is $res")) + override def setY(newY: Int): Unit = scheduler.exec { + super.setY(newY) + } (s"setY($newY)", None) + +end SchedulableSeqCount + +class SchedulableMultiWriterSeqCount(val scheduler: Scheduler) extends MultiWriterSeqCount with LockFreeMonitor: + override protected val myGeneration: AbstractAtomicVariable[Int] = new SchedulableAtomicVariable(0, scheduler, "myGeneration") + + override def x: Int = scheduler.exec { + super.x + } ("", Some(res => s"x is $res")) + override def setX(newX: Int): Unit = scheduler.exec { + super.setX(newX) + } (s"setX($newX)", None) + + override def y: Int = scheduler.exec { + super.y + } ("", Some(res => s"y is $res")) + override def setY(newY: Int): Unit = scheduler.exec { + super.setY(newY) + } (s"setY($newY)", None) + +end SchedulableMultiWriterSeqCount diff --git a/previous-exams/2021-midterm/m21.md b/previous-exams/2021-midterm/m21.md new file mode 100644 index 0000000..fb11db8 --- /dev/null +++ b/previous-exams/2021-midterm/m21.md @@ -0,0 +1,97 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m21 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m21 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +In this question, you will complete the definition of two concurrent data +structures **without using `synchronized`**: `SeqCount` and `MultiWriterSeqCount`. + +## Part 1: SeqCount (defined in `SeqCount.scala`) + +An instance of this class stores two integers (initially set to 1), the stored +values can be updated using `write` and retrieved using `copy`. Only one thread +at a time is allowed to call `write` but multiple threads can call `copy` at +once. + +Your task in this part is to implement `copy` such that this method never +returns _partially updated values_, for example given two threads operating +concurrently on a `SeqCount` `sc`: +```scala +// Thread 1 +sc.write(1, 2) +``` +```scala +// Thread 2 +val result = sc.copy() +``` +`result` must either be `(0, 0)` (since the initial values are 0) or `(1, 2)`, +but it must not be `(1, 0)`, `(0, 2)` or any other value. + +To successfully implement this method you will need to use `generation`: this +method returns the current value of a volatile variable which is initially set +to 1, gets incremented by one at the beginning of `write`, and incremented by +one again at the end of `write`. + +**You are not allowed to use `synchronized` or directly call any of +`myGeneration`, `myX` or `myY` (use the pre-defined getters and setters +instead).** + +Hints: +- Remember that a write to a volatile field _happens-before_ every subsequent + read of that field. +- `generation` will always be odd when a write has completed and always +even when a write is in progress. +- `copy` can be implemented as a tail-recursive method. + +## Part 2: MultiWriterSeqCount (defined in `MultiWriterSeqCount.scala`) + +Like `SeqCount`, this class stores two integers updated using `write` and +retrieved using `copy`, but unlike `SeqCount` multiple threads are allowed to +call `write` at the same time: these writes will all succeed but they are +allowed to complete in any order, for example given three threads operating +concurrently on a `MultiWriterSeqCount` `msc`: +```scala +// Thread 1 +msc.write(1, 2) +``` +```scala +// Thread 2 +msc.write(10, 20) +``` +```scala +// Thread 3 +val result = msc.copy() +``` +`result` must either be `(0, 0)`, `(1, 2)` or `(10, 20)`. + +In this class, the generation is stored in an atomic variable instead of a +volatible field therefore it's important to note that: +- a `set` on an atomic variable _happens-before_ every subsequent `get` of that + variable. +- A call to `compareAndSet` both gets and set an atomic variable. + +Your task in this part is to implement both `copy` and `write`. + +**You are not allowed to use `synchronized` or directly call any of +`myGeneration`, `myX` or `myY` (use the pre-defined getters and setters +instead).** + +Hints: +- you should be able to just copy-paste the implementation of `copy` you + implemented in Part 1 +- you will need to make use of `compareAndSetGeneration` in `write` +- `write` can be implemented as a tail-recursive method. diff --git a/previous-exams/2021-midterm/m21/.gitignore b/previous-exams/2021-midterm/m21/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m21/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m21/assignment.sbt b/previous-exams/2021-midterm/m21/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m21/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m21/build.sbt b/previous-exams/2021-midterm/m21/build.sbt new file mode 100644 index 0000000..15c6258 --- /dev/null +++ b/previous-exams/2021-midterm/m21/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m21" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m21.M21Suite" diff --git a/previous-exams/2021-midterm/m21/grading-tests.jar b/previous-exams/2021-midterm/m21/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..879793e5498e751321315fff68817cea677fc435 GIT binary patch literal 131654 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 P0qy9Xk}^^$6UCv=&g<`WX>Z+w%s7Yazf% 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 YE<Z9bd?6sn0Ds}YHg(nlFkwRYA1a_=8~^|S literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m21/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m21/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m21/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m21/project/MOOCSettings.scala b/previous-exams/2021-midterm/m21/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m21/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m21/project/StudentTasks.scala b/previous-exams/2021-midterm/m21/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m21/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m21/project/build.properties b/previous-exams/2021-midterm/m21/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m21/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m21/project/buildSettings.sbt b/previous-exams/2021-midterm/m21/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m21/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m21/project/plugins.sbt b/previous-exams/2021-midterm/m21/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m21/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m21/src/main/scala/m21/MultiWriterSeqCount.scala b/previous-exams/2021-midterm/m21/src/main/scala/m21/MultiWriterSeqCount.scala new file mode 100644 index 0000000..73a81fb --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/main/scala/m21/MultiWriterSeqCount.scala @@ -0,0 +1,66 @@ +package m21 + +import instrumentation._ + +import scala.annotation.tailrec + +/** Multi-writer, multi-reader data structure containing a pair of integers. */ +class MultiWriterSeqCount extends Monitor: + /** Do not directly use this variable, use `generation`, `setGeneration` and + * `compareAndSetGeneration` instead. + */ + protected val myGeneration: AbstractAtomicVariable[Int] = new AtomicVariable(1) + protected def generation: Int = myGeneration.get + protected def setGeneration(newGeneration: Int): Unit = + myGeneration.set(newGeneration) + protected def compareAndSetGeneration(expected: Int, newValue: Int): Boolean = + myGeneration.compareAndSet(expected, newValue) + + /** Do not directly use this variable, use `x` and `setX` instead. */ + protected var myX: Int = 0 + protected def x: Int = myX + protected def setX(newX: Int): Unit = + myX = newX + + /** Do not directly use this variable, use `y` and `setY` instead. */ + protected var myY: Int = 0 + protected def y: Int = myY + protected def setY(newY: Int): Unit = + myY = newY + + /** Write new values into this data structure. + * This method is always safe to call. + * The implementation of this method is not allowed to call `synchronized`. + */ + + @tailrec + final def write(newX: Int, newY: Int): Unit = + val old = generation + if old % 2 != 1 then + write(newX, newY) + else + if !compareAndSetGeneration(old, old + 1) then + write(newX, newY) + else + setX(newX) + setY(newY) + setGeneration(old + 2) + + /** Copy the values previously written into this data structure into a tuple. + * This method is always safe to call. + * The implementation of this method is not allowed to call `synchronized`. + */ + + @tailrec + final def copy(): (Int, Int) = + val old = generation + if old % 2 != 1 then + copy() + else + val result = (x, y) + if generation != old then + copy() + else + result + +end MultiWriterSeqCount diff --git a/previous-exams/2021-midterm/m21/src/main/scala/m21/SeqCount.scala b/previous-exams/2021-midterm/m21/src/main/scala/m21/SeqCount.scala new file mode 100644 index 0000000..c17f45e --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/main/scala/m21/SeqCount.scala @@ -0,0 +1,53 @@ +package m21 + +import instrumentation._ + +import scala.annotation.tailrec + +/** Single-writer, multi-reader data structure containing a pair of integers. */ +class SeqCount extends Monitor: + /** Do not directly use this variable, use `generation` and `setGeneration` instead. */ + @volatile protected var myGeneration: Int = 1 + protected def generation: Int = myGeneration + protected def setGeneration(newGeneration: Int): Unit = + myGeneration = newGeneration + + /** Do not directly use this variable, use `x` and `setX` instead. */ + protected var myX: Int = 0 + protected def x: Int = myX + protected def setX(newX: Int): Unit = + myX = newX + + /** Do not directly use this variable, use `y` and `setY` instead. */ + protected var myY: Int = 0 + protected def y: Int = myY + protected def setY(newY: Int): Unit = + myY = newY + + /** Write new values into this data structure. + * This method must only be called from one thread at a time. + */ + final def write(newX: Int, newY: Int): Unit = + setGeneration(generation + 1) + setX(newX) + setY(newY) + setGeneration(generation + 1) + + /** Copy the values previously written into this data structure into a tuple. + * This method is always safe to call. + * The implementation of this method is not allowed to call `synchronized`. + */ + + @tailrec + final def copy(): (Int, Int) = + val old = generation + if old % 2 != 1 then + copy() + else + val result = (x, y) + if generation != old then + copy() + else + result + +end SeqCount diff --git a/previous-exams/2021-midterm/m21/src/main/scala/m21/instrumentation/AtomicVariable.scala b/previous-exams/2021-midterm/m21/src/main/scala/m21/instrumentation/AtomicVariable.scala new file mode 100644 index 0000000..5a5d2f4 --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/main/scala/m21/instrumentation/AtomicVariable.scala @@ -0,0 +1,28 @@ +package m21.instrumentation + +import java.util.concurrent.atomic._ + +abstract class AbstractAtomicVariable[T] { + def get: T + def set(value: T): Unit + def compareAndSet(expect: T, newval: T) : Boolean +} + +class AtomicVariable[T](initial: T) extends AbstractAtomicVariable[T] { + + private val atomic = new AtomicReference[T](initial) + + override def get: T = atomic.get() + + override def set(value: T): Unit = atomic.set(value) + + override def compareAndSet(expected: T, newValue: T): Boolean = { + val current = atomic.get + if (current == expected) { + atomic.compareAndSet(current, newValue) + } + else { + false + } + } +} diff --git a/previous-exams/2021-midterm/m21/src/main/scala/m21/instrumentation/Monitor.scala b/previous-exams/2021-midterm/m21/src/main/scala/m21/instrumentation/Monitor.scala new file mode 100644 index 0000000..0655100 --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/main/scala/m21/instrumentation/Monitor.scala @@ -0,0 +1,23 @@ +package m21.instrumentation + +class Dummy + +trait Monitor { + implicit val dummy: Dummy = new Dummy + + def wait()(implicit i: Dummy) = waitDefault() + + def synchronized[T](e: => T)(implicit i: Dummy) = synchronizedDefault(e) + + def notify()(implicit i: Dummy) = notifyDefault() + + def notifyAll()(implicit i: Dummy) = notifyAllDefault() + + private val lock = new AnyRef + + // Can be overriden. + def waitDefault(): Unit = lock.wait() + def synchronizedDefault[T](toExecute: =>T): T = lock.synchronized(toExecute) + def notifyDefault(): Unit = lock.notify() + def notifyAllDefault(): Unit = lock.notifyAll() +} diff --git a/previous-exams/2021-midterm/m21/src/test/scala/m21/TestSuite.scala b/previous-exams/2021-midterm/m21/src/test/scala/m21/TestSuite.scala new file mode 100644 index 0000000..5038092 --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/test/scala/m21/TestSuite.scala @@ -0,0 +1,122 @@ +package m21 + +import scala.concurrent._ +import scala.concurrent.duration._ +import scala.collection.mutable.HashMap +import scala.util.Random +import instrumentation._ +import instrumentation.TestHelper._ +import instrumentation.TestUtils._ + +enum ThreadResult: + case WriteError(error: String) + case WriteSuccess + case Read(result: (Int, Int)) +import ThreadResult._ + +class M21Suite extends munit.FunSuite: + /** If at least one thread resulted in an error, + * return `(false, errorMessage)` otherwise return `(true, "")`. + */ + def processResults(results: List[ThreadResult]): (Boolean, String) = + val success = (true, "") + results.foldLeft(success) { + case (acc @ (false, _), _) => + // Report the first error found + acc + case (_, WriteError(error)) => + (false, error) + case (_, Read((x, y))) if x + 1 != y => + (false, s"Read ($x, $y) but expected y to be ${x + 1}") + case (_, _: Read | WriteSuccess) => + success + } + + def randomList(length: Int): List[Int] = + List.fill(length)(Random.nextInt) + + test("SeqCount: single-threaded write and copy (1 pts)") { + val sc = new SeqCount + randomList(100).lazyZip(randomList(100)).foreach { (x, y) => + sc.write(x, y) + assertEquals(sc.copy(), (x, y)) + } + } + + test("SeqCount: one write thread, two copy threads (4 pts)") { + testManySchedules(3, sched => + val sc = new SchedulableSeqCount(sched) + // Invariant in this test: y == x + 1 + sc.write(0, 1) + + val randomValues = randomList(length = 5) + + def writeThread(): ThreadResult = + randomValues.foldLeft(WriteSuccess) { + case (res: WriteError, _) => + // Report the first error found + res + case (_, i) => + sc.write(i, i + 1) + val writtenValues = (i, i + 1) + val readBack = sc.copy() + if writtenValues != readBack then + WriteError(s"Wrote $writtenValues but read back $readBack") + else + WriteSuccess + } + + def copyThread(): ThreadResult = + Read(sc.copy()) + + val threads = List( + () => writeThread(), + () => copyThread(), + () => copyThread() + ) + + (threads, results => processResults(results.asInstanceOf[List[ThreadResult]])) + ) + } + + test("MultiWriterSeqCount: single-threaded write and copy (1 pts)") { + val sc = new MultiWriterSeqCount + randomList(100).lazyZip(randomList(100)).foreach { (x, y) => + sc.write(x, y) + assertEquals(sc.copy(), (x, y)) + } + } + + test("MultiWriterSeqCount: two write threads, two copy threads (4 pts)") { + testManySchedules(4, sched => + val msc = new SchedulableMultiWriterSeqCount(sched) + // Invariant in this test: y == x + 1 + msc.write(0, 1) + + val randomValues = randomList(length = 5) + + def writeThread(): ThreadResult = + randomValues.foreach(i => msc.write(i, i + 1)) + // Unlke in the SeqCount test, we do not verify that we can read back + // the values we wrote, because the other writer thread might have + // overwritten them already. + WriteSuccess + + def copyThread(): ThreadResult = + Read(msc.copy()) + + val threads = List( + () => writeThread(), + () => writeThread(), + () => copyThread(), + () => copyThread() + ) + + (threads, results => processResults(results.asInstanceOf[List[ThreadResult]])) + ) + } + + import scala.concurrent.duration._ + override val munitTimeout = 200.seconds +end M21Suite + diff --git a/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/MockedMonitor.scala b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/MockedMonitor.scala new file mode 100644 index 0000000..f7629e1 --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/MockedMonitor.scala @@ -0,0 +1,72 @@ +package m21.instrumentation + +trait MockedMonitor extends Monitor { + def scheduler: Scheduler + + // Can be overriden. + override def waitDefault() = { + scheduler.log("wait") + scheduler updateThreadState Wait(this, scheduler.threadLocks.tail) + } + override def synchronizedDefault[T](toExecute: =>T): T = { + scheduler.log("synchronized check") + val prevLocks = scheduler.threadLocks + scheduler updateThreadState Sync(this, prevLocks) // If this belongs to prevLocks, should just continue. + scheduler.log("synchronized -> enter") + try { + toExecute + } finally { + scheduler updateThreadState Running(prevLocks) + scheduler.log("synchronized -> out") + } + } + override def notifyDefault() = { + scheduler mapOtherStates { + state => state match { + case Wait(lockToAquire, locks) if lockToAquire == this => SyncUnique(this, state.locks) + case e => e + } + } + scheduler.log("notify") + } + override def notifyAllDefault() = { + scheduler mapOtherStates { + state => state match { + case Wait(lockToAquire, locks) if lockToAquire == this => Sync(this, state.locks) + case SyncUnique(lockToAquire, locks) if lockToAquire == this => Sync(this, state.locks) + case e => e + } + } + scheduler.log("notifyAll") + } +} + +trait LockFreeMonitor extends Monitor { + override def waitDefault() = { + throw new Exception("Please use lock-free structures and do not use wait()") + } + override def synchronizedDefault[T](toExecute: =>T): T = { + throw new Exception("Please use lock-free structures and do not use synchronized()") + } + override def notifyDefault() = { + throw new Exception("Please use lock-free structures and do not use notify()") + } + override def notifyAllDefault() = { + throw new Exception("Please use lock-free structures and do not use notifyAll()") + } +} + + +abstract class ThreadState { + def locks: Seq[AnyRef] +} +trait CanContinueIfAcquiresLock extends ThreadState { + def lockToAquire: AnyRef +} +case object Start extends ThreadState { def locks: Seq[AnyRef] = Seq.empty } +case object End extends ThreadState { def locks: Seq[AnyRef] = Seq.empty } +case class Wait(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState +case class SyncUnique(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState with CanContinueIfAcquiresLock +case class Sync(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState with CanContinueIfAcquiresLock +case class Running(locks: Seq[AnyRef]) extends ThreadState +case class VariableReadWrite(locks: Seq[AnyRef]) extends ThreadState diff --git a/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/Scheduler.scala b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/Scheduler.scala new file mode 100644 index 0000000..cef9ac5 --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/Scheduler.scala @@ -0,0 +1,304 @@ +package m21.instrumentation + +import java.util.concurrent._; +import scala.concurrent.duration._ +import scala.collection.mutable._ +import Stats._ + +import java.util.concurrent.atomic.AtomicInteger + +sealed abstract class Result +case class RetVal(rets: List[Any]) extends Result +case class Except(msg: String, stackTrace: Array[StackTraceElement]) extends Result +case class Timeout(msg: String) extends Result + +/** + * A class that maintains schedule and a set of thread ids. + * The schedules are advanced after an operation of a SchedulableBuffer is performed. + * Note: the real schedule that is executed may deviate from the input schedule + * due to the adjustments that had to be made for locks + */ +class Scheduler(sched: List[Int]) { + val maxOps = 500 // a limit on the maximum number of operations the code is allowed to perform + + private var schedule = sched + private var numThreads = 0 + private val realToFakeThreadId = Map[Long, Int]() + private val opLog = ListBuffer[String]() // a mutable list (used for efficient concat) + private val threadStates = Map[Int, ThreadState]() + + /** + * Runs a set of operations in parallel as per the schedule. + * Each operation may consist of many primitive operations like reads or writes + * to shared data structure each of which should be executed using the function `exec`. + * @timeout in milliseconds + * @return true - all threads completed on time, false -some tests timed out. + */ + def runInParallel(timeout: Long, ops: List[() => Any]): Result = { + numThreads = ops.length + val threadRes = Array.fill(numThreads) { None: Any } + var exception: Option[Except] = None + val syncObject = new Object() + var completed = new AtomicInteger(0) + // create threads + val threads = ops.zipWithIndex.map { + case (op, i) => + new Thread(new Runnable() { + def run(): Unit = { + val fakeId = i + 1 + setThreadId(fakeId) + try { + updateThreadState(Start) + val res = op() + updateThreadState(End) + threadRes(i) = res + // notify the master thread if all threads have completed + if (completed.incrementAndGet() == ops.length) { + syncObject.synchronized { syncObject.notifyAll() } + } + } catch { + case e: Throwable if exception != None => // do nothing here and silently fail + case e: Throwable => + log(s"throw ${e.toString}") + exception = Some(Except(s"Thread $fakeId crashed on the following schedule: \n" + opLog.mkString("\n"), + e.getStackTrace)) + syncObject.synchronized { syncObject.notifyAll() } + //println(s"$fakeId: ${e.toString}") + //Runtime.getRuntime().halt(0) //exit the JVM and all running threads (no other way to kill other threads) + } + } + }) + } + // start all threads + threads.foreach(_.start()) + // wait for all threads to complete, or for an exception to be thrown, or for the time out to expire + var remTime = timeout + syncObject.synchronized { + timed { if(completed.get() != ops.length) syncObject.wait(timeout) } { time => remTime -= time } + } + if (exception.isDefined) { + exception.get + } else if (remTime <= 1) { // timeout ? using 1 instead of zero to allow for some errors + Timeout(opLog.mkString("\n")) + } else { + // every thing executed normally + RetVal(threadRes.toList) + } + } + + // Updates the state of the current thread + def updateThreadState(state: ThreadState): Unit = { + val tid = threadId + synchronized { + threadStates(tid) = state + } + state match { + case Sync(lockToAquire, locks) => + if (locks.indexOf(lockToAquire) < 0) waitForTurn else { + // Re-aqcuiring the same lock + updateThreadState(Running(lockToAquire +: locks)) + } + case Start => waitStart() + case End => removeFromSchedule(tid) + case Running(_) => + case _ => waitForTurn // Wait, SyncUnique, VariableReadWrite + } + } + + def waitStart(): Unit = { + //while (threadStates.size < numThreads) { + //Thread.sleep(1) + //} + synchronized { + if (threadStates.size < numThreads) { + wait() + } else { + notifyAll() + } + } + } + + def threadLocks = { + synchronized { + threadStates(threadId).locks + } + } + + def threadState = { + synchronized { + threadStates(threadId) + } + } + + def mapOtherStates(f: ThreadState => ThreadState) = { + val exception = threadId + synchronized { + for (k <- threadStates.keys if k != exception) { + threadStates(k) = f(threadStates(k)) + } + } + } + + def log(str: String) = { + if((realToFakeThreadId contains Thread.currentThread().getId())) { + val space = (" " * ((threadId - 1) * 2)) + val s = space + threadId + ":" + "\n".r.replaceAllIn(str, "\n" + space + " ") + opLog += s + } + } + + /** + * Executes a read or write operation to a global data structure as per the given schedule + * @param msg a message corresponding to the operation that will be logged + */ + def exec[T](primop: => T)(msg: => String, postMsg: => Option[T => String] = None): T = { + if(! (realToFakeThreadId contains Thread.currentThread().getId())) { + primop + } else { + updateThreadState(VariableReadWrite(threadLocks)) + val m = msg + if(m != "") log(m) + if (opLog.size > maxOps) + throw new Exception(s"Total number of reads/writes performed by threads exceed $maxOps. A possible deadlock!") + val res = primop + postMsg match { + case Some(m) => log(m(res)) + case None => + } + res + } + } + + private def setThreadId(fakeId: Int) = synchronized { + realToFakeThreadId(Thread.currentThread.getId) = fakeId + } + + def threadId = + try { + realToFakeThreadId(Thread.currentThread().getId()) + } catch { + case e: NoSuchElementException => + throw new Exception("You are accessing shared variables in the constructor. This is not allowed. The variables are already initialized!") + } + + private def isTurn(tid: Int) = synchronized { + (!schedule.isEmpty && schedule.head != tid) + } + + def canProceed(): Boolean = { + val tid = threadId + canContinue match { + case Some((i, state)) if i == tid => + //println(s"$tid: Runs ! Was in state $state") + canContinue = None + state match { + case Sync(lockToAquire, locks) => updateThreadState(Running(lockToAquire +: locks)) + case SyncUnique(lockToAquire, locks) => + mapOtherStates { + _ match { + case SyncUnique(lockToAquire2, locks2) if lockToAquire2 == lockToAquire => Wait(lockToAquire2, locks2) + case e => e + } + } + updateThreadState(Running(lockToAquire +: locks)) + case VariableReadWrite(locks) => updateThreadState(Running(locks)) + } + true + case Some((i, state)) => + //println(s"$tid: not my turn but $i !") + false + case None => + false + } + } + + var threadPreference = 0 // In the case the schedule is over, which thread should have the preference to execute. + + /** returns true if the thread can continue to execute, and false otherwise */ + def decide(): Option[(Int, ThreadState)] = { + if (!threadStates.isEmpty) { // The last thread who enters the decision loop takes the decision. + //println(s"$threadId: I'm taking a decision") + if (threadStates.values.forall { case e: Wait => true case _ => false }) { + val waiting = threadStates.keys.map(_.toString).mkString(", ") + val s = if (threadStates.size > 1) "s" else "" + val are = if (threadStates.size > 1) "are" else "is" + throw new Exception(s"Deadlock: Thread$s $waiting $are waiting but all others have ended and cannot notify them.") + } else { + // Threads can be in Wait, Sync, SyncUnique, and VariableReadWrite mode. + // Let's determine which ones can continue. + val notFree = threadStates.collect { case (id, state) => state.locks }.flatten.toSet + val threadsNotBlocked = threadStates.toSeq.filter { + case (id, v: VariableReadWrite) => true + case (id, v: CanContinueIfAcquiresLock) => !notFree(v.lockToAquire) || (v.locks contains v.lockToAquire) + case _ => false + } + if (threadsNotBlocked.isEmpty) { + val waiting = threadStates.keys.map(_.toString).mkString(", ") + val s = if (threadStates.size > 1) "s" else "" + val are = if (threadStates.size > 1) "are" else "is" + val whoHasLock = threadStates.toSeq.flatMap { case (id, state) => state.locks.map(lock => (lock, id)) }.toMap + val reason = threadStates.collect { + case (id, state: CanContinueIfAcquiresLock) if !notFree(state.lockToAquire) => + s"Thread $id is waiting on lock ${state.lockToAquire} held by thread ${whoHasLock(state.lockToAquire)}" + }.mkString("\n") + throw new Exception(s"Deadlock: Thread$s $waiting are interlocked. Indeed:\n$reason") + } else if (threadsNotBlocked.size == 1) { // Do not consume the schedule if only one thread can execute. + Some(threadsNotBlocked(0)) + } else { + val next = schedule.indexWhere(t => threadsNotBlocked.exists { case (id, state) => id == t }) + if (next != -1) { + //println(s"$threadId: schedule is $schedule, next chosen is ${schedule(next)}") + val chosenOne = schedule(next) // TODO: Make schedule a mutable list. + schedule = schedule.take(next) ++ schedule.drop(next + 1) + Some((chosenOne, threadStates(chosenOne))) + } else { + threadPreference = (threadPreference + 1) % threadsNotBlocked.size + val chosenOne = threadsNotBlocked(threadPreference) // Maybe another strategy + Some(chosenOne) + //threadsNotBlocked.indexOf(threadId) >= 0 + /* + val tnb = threadsNotBlocked.map(_._1).mkString(",") + val s = if (schedule.isEmpty) "empty" else schedule.mkString(",") + val only = if (schedule.isEmpty) "" else " only" + throw new Exception(s"The schedule is $s but$only threads ${tnb} can continue")*/ + } + } + } + } else canContinue + } + + /** + * This will be called before a schedulable operation begins. + * This should not use synchronized + */ + var numThreadsWaiting = new AtomicInteger(0) + //var waitingForDecision = Map[Int, Option[Int]]() // Mapping from thread ids to a number indicating who is going to make the choice. + var canContinue: Option[(Int, ThreadState)] = None // The result of the decision thread Id of the thread authorized to continue. + private def waitForTurn = { + synchronized { + if (numThreadsWaiting.incrementAndGet() == threadStates.size) { + canContinue = decide() + notifyAll() + } + //waitingForDecision(threadId) = Some(numThreadsWaiting) + //println(s"$threadId Entering waiting with ticket number $numThreadsWaiting/${waitingForDecision.size}") + while (!canProceed()) wait() + } + numThreadsWaiting.decrementAndGet() + } + + /** + * To be invoked when a thread is about to complete + */ + private def removeFromSchedule(fakeid: Int) = synchronized { + //println(s"$fakeid: I'm taking a decision because I finished") + schedule = schedule.filterNot(_ == fakeid) + threadStates -= fakeid + if (numThreadsWaiting.get() == threadStates.size) { + canContinue = decide() + notifyAll() + } + } + + def getOperationLog() = opLog +} diff --git a/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/Stats.scala b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/Stats.scala new file mode 100644 index 0000000..6eb7239 --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/Stats.scala @@ -0,0 +1,23 @@ +/* Copyright 2009-2015 EPFL, Lausanne */ +package m21.instrumentation + +import java.lang.management._ + +/** + * A collection of methods that can be used to collect run-time statistics about Leon programs. + * This is mostly used to test the resources properties of Leon programs + */ +object Stats { + def timed[T](code: => T)(cont: Long => Unit): T = { + var t1 = System.currentTimeMillis() + val r = code + cont((System.currentTimeMillis() - t1)) + r + } + + def withTime[T](code: => T): (T, Long) = { + var t1 = System.currentTimeMillis() + val r = code + (r, (System.currentTimeMillis() - t1)) + } +} diff --git a/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/TestHelper.scala b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/TestHelper.scala new file mode 100644 index 0000000..5be75d6 --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/TestHelper.scala @@ -0,0 +1,124 @@ +package m21.instrumentation + +import scala.util.Random +import scala.collection.mutable.{Map => MutableMap} + +import Stats._ + +object TestHelper { + val noOfSchedules = 10000 // set this to 100k during deployment + val readWritesPerThread = 20 // maximum number of read/writes possible in one thread + val contextSwitchBound = 10 + val testTimeout = 150 // the total time out for a test in seconds + val schedTimeout = 15 // the total time out for execution of a schedule in secs + + // Helpers + /*def testManySchedules(op1: => Any): Unit = testManySchedules(List(() => op1)) + def testManySchedules(op1: => Any, op2: => Any): Unit = testManySchedules(List(() => op1, () => op2)) + def testManySchedules(op1: => Any, op2: => Any, op3: => Any): Unit = testManySchedules(List(() => op1, () => op2, () => op3)) + def testManySchedules(op1: => Any, op2: => Any, op3: => Any, op4: => Any): Unit = testManySchedules(List(() => op1, () => op2, () => op3, () => op4))*/ + + def testSequential[T](ops: Scheduler => Any)(assertions: T => (Boolean, String)) = + testManySchedules(1, + (sched: Scheduler) => { + (List(() => ops(sched)), + (res: List[Any]) => assertions(res.head.asInstanceOf[T])) + }) + + /** + * @numThreads number of threads + * @ops operations to be executed, one per thread + * @assertion as condition that will executed after all threads have completed (without exceptions) + * the arguments are the results of the threads + */ + def testManySchedules(numThreads: Int, + ops: Scheduler => + (List[() => Any], // Threads + List[Any] => (Boolean, String)) // Assertion + ) = { + var timeout = testTimeout * 1000L + val threadIds = (1 to numThreads) + //(1 to scheduleLength).flatMap(_ => threadIds).toList.permutations.take(noOfSchedules).foreach { + val schedules = (new ScheduleGenerator(numThreads)).schedules() + var schedsExplored = 0 + schedules.takeWhile(_ => schedsExplored <= noOfSchedules && timeout > 0).foreach { + //case _ if timeout <= 0 => // break + case schedule => + schedsExplored += 1 + val schedr = new Scheduler(schedule) + //println("Exploring Sched: "+schedule) + val (threadOps, assertion) = ops(schedr) + if (threadOps.size != numThreads) + throw new IllegalStateException(s"Number of threads: $numThreads, do not match operations of threads: $threadOps") + timed { schedr.runInParallel(schedTimeout * 1000, threadOps) } { t => timeout -= t } match { + case Timeout(msg) => + throw new java.lang.AssertionError("assertion failed\n"+"The schedule took too long to complete. A possible deadlock! \n"+msg) + case Except(msg, stkTrace) => + val traceStr = "Thread Stack trace: \n"+stkTrace.map(" at "+_.toString).mkString("\n") + throw new java.lang.AssertionError("assertion failed\n"+msg+"\n"+traceStr) + case RetVal(threadRes) => + // check the assertion + val (success, custom_msg) = assertion(threadRes) + if (!success) { + val msg = "The following schedule resulted in wrong results: \n" + custom_msg + "\n" + schedr.getOperationLog().mkString("\n") + throw new java.lang.AssertionError("Assertion failed: "+msg) + } + } + } + if (timeout <= 0) { + throw new java.lang.AssertionError("Test took too long to complete! Cannot check all schedules as your code is too slow!") + } + } + + /** + * A schedule generator that is based on the context bound + */ + class ScheduleGenerator(numThreads: Int) { + val scheduleLength = readWritesPerThread * numThreads + val rands = (1 to scheduleLength).map(i => new Random(0xcafe * i)) // random numbers for choosing a thread at each position + def schedules(): LazyList[List[Int]] = { + var contextSwitches = 0 + var contexts = List[Int]() // a stack of thread ids in the order of context-switches + val remainingOps = MutableMap[Int, Int]() + remainingOps ++= (1 to numThreads).map(i => (i, readWritesPerThread)) // num ops remaining in each thread + val liveThreads = (1 to numThreads).toSeq.toBuffer + + /** + * Updates remainingOps and liveThreads once a thread is chosen for a position in the schedule + */ + def updateState(tid: Int): Unit = { + val remOps = remainingOps(tid) + if (remOps == 0) { + liveThreads -= tid + } else { + remainingOps += (tid -> (remOps - 1)) + } + } + val schedule = rands.foldLeft(List[Int]()) { + case (acc, r) if contextSwitches < contextSwitchBound => + val tid = liveThreads(r.nextInt(liveThreads.size)) + contexts match { + case prev :: tail if prev != tid => // we have a new context switch here + contexts +:= tid + contextSwitches += 1 + case prev :: tail => + case _ => // init case + contexts +:= tid + } + updateState(tid) + acc :+ tid + case (acc, _) => // here context-bound has been reached so complete the schedule without any more context switches + if (!contexts.isEmpty) { + contexts = contexts.dropWhile(remainingOps(_) == 0) + } + val tid = contexts match { + case top :: tail => top + case _ => liveThreads(0) // here, there has to be threads that have not even started + } + updateState(tid) + acc :+ tid + } + schedule #:: schedules() + } + } +} diff --git a/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/TestUtils.scala b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/TestUtils.scala new file mode 100644 index 0000000..5da7604 --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/TestUtils.scala @@ -0,0 +1,19 @@ +package m21.instrumentation + +import scala.concurrent._ +import scala.concurrent.duration._ +import scala.concurrent.ExecutionContext.Implicits.global + +object TestUtils { + def failsOrTimesOut[T](action: => T): Boolean = { + val asyncAction = Future { + action + } + try { + Await.result(asyncAction, 2000.millisecond) + } catch { + case _: Throwable => return true + } + return false + } +} diff --git a/previous-exams/2021-midterm/m21/src/test/scala/m21/overrides.scala b/previous-exams/2021-midterm/m21/src/test/scala/m21/overrides.scala new file mode 100644 index 0000000..92d0cec --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/test/scala/m21/overrides.scala @@ -0,0 +1,68 @@ +package m21 + +import instrumentation._ + +import scala.annotation.tailrec +import java.util.concurrent.atomic._ + +class SchedulableAtomicVariable[T](initial: T, scheduler: Scheduler, name: String) extends AbstractAtomicVariable[T]: + private val proxied: AtomicVariable[T] = new AtomicVariable[T](initial) + + override def get: T = scheduler.exec { + proxied.get + } (s"", Some(res => s"$name: get $res")) + + override def set(value: T): Unit = scheduler.exec { + proxied.set(value) + } (s"$name: set $value", None) + + override def compareAndSet(expected: T, newValue: T): Boolean = { + scheduler.exec { + proxied.compareAndSet(expected, newValue) + } (s"$name: compareAndSet(expected = $expected, newValue = $newValue)", Some(res => s"$name: Did it set? $res") ) + } + +end SchedulableAtomicVariable + +class SchedulableSeqCount(val scheduler: Scheduler) extends SeqCount with LockFreeMonitor: + override def generation: Int = scheduler.exec { + super.generation + } ("", Some(res => s"generation is $res")) + override def setGeneration(newGeneration: Int): Unit = scheduler.exec { + super.setGeneration(newGeneration) + } ( s"setGeneration($newGeneration)", None ) + + override def x: Int = scheduler.exec { + super.x + } ("", Some(res => s"x is $res")) + override def setX(newX: Int): Unit = scheduler.exec { + super.setX(newX) + } (s"setX($newX)", None) + + override def y: Int = scheduler.exec { + super.y + } ("", Some(res => s"y is $res")) + override def setY(newY: Int): Unit = scheduler.exec { + super.setY(newY) + } (s"setY($newY)", None) + +end SchedulableSeqCount + +class SchedulableMultiWriterSeqCount(val scheduler: Scheduler) extends MultiWriterSeqCount with LockFreeMonitor: + override protected val myGeneration: AbstractAtomicVariable[Int] = new SchedulableAtomicVariable(1, scheduler, "myGeneration") + + override def x: Int = scheduler.exec { + super.x + } ("", Some(res => s"x is $res")) + override def setX(newX: Int): Unit = scheduler.exec { + super.setX(newX) + } (s"setX($newX)", None) + + override def y: Int = scheduler.exec { + super.y + } ("", Some(res => s"y is $res")) + override def setY(newY: Int): Unit = scheduler.exec { + super.setY(newY) + } (s"setY($newY)", None) + +end SchedulableMultiWriterSeqCount diff --git a/previous-exams/2021-midterm/m3.md b/previous-exams/2021-midterm/m3.md new file mode 100644 index 0000000..ee3969e --- /dev/null +++ b/previous-exams/2021-midterm/m3.md @@ -0,0 +1,61 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m3 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m3 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +Given the following sequential implementation of a function that computes the sequence of rolling windowed averages, your task will be to complete and optimize a parallel version of this code. + +```scala +/** Compute the rolling windowed mean of an array. + * + * For an array `arr = Arr(x1, x2, x3, ..., x_n)` the result is + * `Arr(x1, (x1+x2)/2, (x1+x2+x3)/3, (x2+x3+x4)/3, ..., (x_{n-2}, x_{n-1}, x_n)/n)` + */ +def rollingWinMeanParallel(arr: Arr[Int]): Arr[Double] = { + // Transform all numbers to averages of window of size 1 + val arr1 = arr.map(x => AvgWin(x :: Nil)) + // Compute the rolling windowed average by combining the windows together + val arr2 = arr1.scan(AvgWin(Nil))((acc, x) => acc.pushAll(x)) + // Transform the windowed averages to Doubles + arr2.map(win => win.toDouble) + // Drop the extra initial element that was added by the scan + arr3.tail +``` + + This implementation has some issues: + - It does not use parallelism + - Creates two intermediate arrays by calling `map` + - Creates an extra intermediate arrays by calling `tail` + - Scan returns an extra element we do not need + + We want to parallelize and avoid the creation of the extra arrays. + As we are calling a `scan` the natural operations we need are `upsweep` and `downsweep`. + It is possible specialize those operations for our problem by letting those operations do the mapping. + It is also possible to change those operations to not generate the first element. + +We give you a version of `rollingWinMeanSequential` that partially implements the parallelization using `upsweep` and `downsweep`. + + Your tasks in the exercise will be to: + - TASK 1: Implement the parallelization of `upsweep` and `downsweep` + - TASK 2: Remove the calls to the `map` + - TASK 3: Remove the call to `tail` + + You can get partial points for solving part of the tasks. + The order of the tasks is a suggestion, you may do them in any order if that is simpler for you. + +Look at the `Lib` trait to find the definitions of functions and classes you can use (or already used). +In this question we use a `Arr` array class instead of the normal `Array`. You may assume that this class has the same performance characteristics as the normal array. `Arr` provides only a limited set of operations. diff --git a/previous-exams/2021-midterm/m3/.gitignore b/previous-exams/2021-midterm/m3/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m3/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m3/assignment.sbt b/previous-exams/2021-midterm/m3/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m3/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m3/build.sbt b/previous-exams/2021-midterm/m3/build.sbt new file mode 100644 index 0000000..b15645a --- /dev/null +++ b/previous-exams/2021-midterm/m3/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m3" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m3.M3Suite" diff --git a/previous-exams/2021-midterm/m3/grading-tests.jar b/previous-exams/2021-midterm/m3/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..dea8c3895d7df93482a29b4f7e0c85a5f13b7c12 GIT binary patch literal 34429 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 literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m3/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m3/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m3/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m3/project/MOOCSettings.scala b/previous-exams/2021-midterm/m3/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m3/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m3/project/StudentTasks.scala b/previous-exams/2021-midterm/m3/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m3/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m3/project/build.properties b/previous-exams/2021-midterm/m3/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m3/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m3/project/buildSettings.sbt b/previous-exams/2021-midterm/m3/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m3/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m3/project/plugins.sbt b/previous-exams/2021-midterm/m3/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m3/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m3/src/main/scala/m3/Lib.scala b/previous-exams/2021-midterm/m3/src/main/scala/m3/Lib.scala new file mode 100644 index 0000000..68e89db --- /dev/null +++ b/previous-exams/2021-midterm/m3/src/main/scala/m3/Lib.scala @@ -0,0 +1,68 @@ +package m3 + +//////////////////////////////////////// +// NO NEED TO MODIFY THIS SOURCE FILE // +//////////////////////////////////////// + +trait Lib { + + /** If an array has `n` elements and `n < THRESHOLD`, then it should be processed sequentially */ + final val THRESHOLD: Int = 33 + + /** Compute the two values in parallel + * + * Note: Most tests just compute those two sequentially to make any bug simpler to debug + */ + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) + + /** A limited array. It only contains the required operations for this exercise. */ + trait Arr[T] { + /** Get the i-th element of the array (0-based) */ + def apply(i: Int): T + /** Update the i-th element of the array with the given value (0-based) */ + def update(i: Int, x: T): Unit + /** Number of elements in this array */ + def length: Int + /** Create a copy of this array without the first element */ + def tail: Arr[T] + /** Create a copy of this array by mapping all the elements with the given function */ + def map[U](f: T => U): Arr[U] + } + + object Arr { + /** Create an array with the given elements */ + def apply[T](xs: T*): Arr[T] = { + val arr: Arr[T] = Arr.ofLength(xs.length) + for i <- 0 until xs.length do arr(i) = xs(i) + arr + } + + /** Create an array with the given length. All elements are initialized to `null`. */ + def ofLength[T](n: Int): Arr[T] = + newArrOfLength(n) + + } + + /** Create an array with the given length. All elements are initialized to `null`. */ + def newArrOfLength[T](n: Int): Arr[T] + + /** A number representing the average of a list of integers (the "window") */ + case class AvgWin(list: List[Int]) { + def push(i: Int) = list match { + case i3 :: i2 :: i1 :: Nil => AvgWin(i :: i3 :: i2 :: Nil) + case list => AvgWin(i :: list) + } + + def pushAll(other: AvgWin) = + other.list.foldRight(this)((el, self) => self.push(el)) + + def toDouble: Double = if list.isEmpty then 0 else list.sum / list.length + } + + /** Tree result of an upsweep operation. Specialized for `AvgWin` results. */ + trait TreeRes { val res: AvgWin } + /** Leaf result of an upsweep operation. Specialized for `AvgWin` results. */ + case class Leaf(from: Int, to: Int, res: AvgWin) extends TreeRes + /** Tree node result of an upsweep operation. Specialized for `AvgWin` results. */ + case class Node(left: TreeRes, res: AvgWin, right: TreeRes) extends TreeRes +} diff --git a/previous-exams/2021-midterm/m3/src/main/scala/m3/M3.scala b/previous-exams/2021-midterm/m3/src/main/scala/m3/M3.scala new file mode 100644 index 0000000..81aff19 --- /dev/null +++ b/previous-exams/2021-midterm/m3/src/main/scala/m3/M3.scala @@ -0,0 +1,75 @@ +package m3 + + +trait M3 extends Lib { + // Functions and classes of Lib can be used in here + + /** Compute the rolling windowed mean of an array. + * + * For an array `arr = Arr(x1, x2, x3, ..., x_n)` the result is + * `Arr(x1, (x1+x2)/2, (x1+x2+x3)/3, (x2+x3+x4)/3, ..., (x_{n-2}, x_{n-1}, x_n)/n)` + */ + def rollingWinMeanParallel(arr: Arr[Int]): Arr[Double] = { + if (arr.length == 0) return Arr.ofLength(0) + + val out: Arr[Double] = Arr.ofLength(arr.length) + val tree = upsweep(arr, 0, arr.length) + downsweep(arr, AvgWin(Nil), tree, out) + out + } + + // No need to modify this + def scanOp(acc: AvgWin, x: AvgWin) = + acc.pushAll(x) + + + def upsweep(input: Arr[Int], from: Int, to: Int): TreeRes = { + if (to - from < THRESHOLD) + Leaf(from, to, reduceSequential(input, from + 1, to, AvgWin(input(from) :: Nil))) + else { + val mid = from + (to - from)/2 + val (tL, tR) = parallel( + upsweep(input, from, mid), + upsweep(input, mid, to) + ) + Node(tL, scanOp(tL.res, tR.res), tR) + } + } + + + def downsweep(input: Arr[Int], a0: AvgWin, tree: TreeRes, output: Arr[Double]): Unit = { + tree match { + case Node(left, _, right) => + parallel( + downsweep(input, a0, left, output), + downsweep(input, scanOp(a0, left.res), right, output) + ) + case Leaf(from, to, _) => + downsweepSequential(input, from, to, a0, output) + } + } + + + def downsweepSequential(input: Arr[Int], from: Int, to: Int, a0: AvgWin, output: Arr[Double]): Unit = { + if (from < to) { + var i = from + var a = a0 + while (i < to) { + a = scanOp(a, AvgWin(input(i) :: Nil)) + output(i) = a.toDouble + i = i + 1 + } + } + } + + + def reduceSequential(input: Arr[Int], from: Int, to: Int, a0: AvgWin): AvgWin = { + var a = a0 + var i = from + while (i < to) { + a = scanOp(a, AvgWin(input(i) :: Nil)) + i = i + 1 + } + a + } +} diff --git a/previous-exams/2021-midterm/m3/src/test/scala/m3/M3Suite.scala b/previous-exams/2021-midterm/m3/src/test/scala/m3/M3Suite.scala new file mode 100644 index 0000000..176df6a --- /dev/null +++ b/previous-exams/2021-midterm/m3/src/test/scala/m3/M3Suite.scala @@ -0,0 +1,174 @@ +package m3 + +class M3Suite extends munit.FunSuite { + + test("Rolling windowed average result test (5pts)") { + RollingWinMeanBasicLogicTest.basicTests() + RollingWinMeanBasicLogicTest.normalTests() + RollingWinMeanBasicLogicTest.largeTests() + } + + test("[TASK 1] Rolling windowed average parallelism test (30pts)") { + RollingWinMeanCallsToParallel.parallelismTest() + RollingWinMeanParallel.basicTests() + RollingWinMeanParallel.normalTests() + RollingWinMeanParallel.largeTests() + } + + test("[TASK 2] Rolling windowed average no `map` test (35pts)") { + RollingWinMeanNoMap.basicTests() + RollingWinMeanNoMap.normalTests() + RollingWinMeanNoMap.largeTests() + } + + test("[TASK 3] Rolling windowed average no `tail` test (30pts)") { + RollingWinMeanNoTail.basicTests() + RollingWinMeanNoTail.normalTests() + RollingWinMeanNoTail.largeTests() + } + + + object RollingWinMeanBasicLogicTest extends M3 with LibImpl with RollingWinMeanTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + } + + object RollingWinMeanCallsToParallel extends M3 with LibImpl with RollingWinMeanTest { + private var count = 0 + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = + count += 1 + (op1, op2) + + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + + def parallelismTest() = { + assertParallelCount(Arr(), 0) + assertParallelCount(Arr(1), 0) + assertParallelCount(Arr(1, 2, 3, 4), 0) + assertParallelCount(Arr(Array.tabulate(16)(identity): _*), 0) + assertParallelCount(Arr(Array.tabulate(32)(identity): _*), 0) + + assertParallelCount(Arr(Array.tabulate(33)(identity): _*), 2) + assertParallelCount(Arr(Array.tabulate(64)(identity): _*), 2) + assertParallelCount(Arr(Array.tabulate(128)(identity): _*), 6) + assertParallelCount(Arr(Array.tabulate(256)(identity): _*), 14) + assertParallelCount(Arr(Array.tabulate(1000)(identity): _*), 62) + assertParallelCount(Arr(Array.tabulate(1024)(identity): _*), 62) + } + + def assertParallelCount(arr: Arr[Int], expected: Int): Unit = { + try { + count = 0 + rollingWinMeanParallel(arr) + assert(count == expected, { + val extra = if (expected == 0) "" else s" ${expected/2} for the `upsweep` and ${expected/2} for the `downsweep`" + s"\n$arr\n\nERROR: Expected $expected instead of $count calls to `parallel(...)` for an array of ${arr.length} elements. Current parallel threshold is $THRESHOLD.$extra" + }) + } finally { + count = 0 + } + } + + } + + object RollingWinMeanNoMap extends M3 with LibImpl with RollingWinMeanTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl[T](arr) { + override def map[U](f: T => U): Arr[U] = throw Exception("Should not call Arr.map") + } + } + + object RollingWinMeanNoTail extends M3 with LibImpl with RollingWinMeanTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl[T](arr) { + override def tail: Arr[T] = throw Exception("Should not call Arr.tail") + } + } + + object RollingWinMeanParallel extends M3 with LibImpl with RollingWinMeanTest { + import scala.concurrent.duration._ + val TIMEOUT = Duration(10, SECONDS) + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = { + import concurrent.ExecutionContext.Implicits.global + import scala.concurrent._ + Await.result(Future(op1).zip(Future(op2)), TIMEOUT) // FIXME not timing-out + } + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + } + + trait LibImpl extends Lib { + + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] + + def newArrOfLength[T](n: Int): Arr[T] = + newArrFrom(new Array(n)) + + class ArrImpl[T](val arr: Array[AnyRef]) extends Arr[T]: + def apply(i: Int): T = + arr(i).asInstanceOf[T] + def update(i: Int, x: T): Unit = + arr(i) = x.asInstanceOf[AnyRef] + def length: Int = + arr.length + def map[U](f: T => U): Arr[U] = + newArrFrom(arr.map(f.asInstanceOf[AnyRef => AnyRef])) + def tail: Arr[T] = + newArrFrom(arr.tail) + override def toString: String = + arr.mkString("Arr(", ", ", ")") + override def equals(that: Any): Boolean = + that match + case that: ArrImpl[_] => Array.equals(arr, that.arr) + case _ => false + } + + trait RollingWinMeanTest extends M3 { + + def tabulate[T](n: Int)(f: Int => T): Arr[T] = + val arr = Arr.ofLength[T](n) + for i <- 0 until n do + arr(i) = f(i) + arr + + def asSeq(arr: Arr[Double]) = + val array = new Array[Double](arr.length) + for i <- 0 to (arr.length - 1) do + array(i) = arr(i) + array.toSeq + + def scanOp_(acc: AvgWin, x: AvgWin) = + acc.pushAll(x) + + def result(ds: Seq[Int]): Arr[Double] = + Arr(ds.map(x => AvgWin(x :: Nil)).scan(AvgWin(Nil))(scanOp_).tail.map(_.toDouble): _*) + + def check(input: Seq[Int]) = + assertEquals( + asSeq(rollingWinMeanParallel(Arr(input: _*))), + asSeq(result(input)) + ) + + def basicTests() = { + check(Seq()) + check(Seq(1)) + check(Seq(1, 2, 3, 4)) + check(Seq(4, 4, 4, 4)) + } + + def normalTests() = { + check(Seq.tabulate(64)(identity)) + check(Seq(4, 4, 4, 4)) + check(Seq(4, 8, 6, 4)) + check(Seq(4, 3, 2, 1)) + check(Seq.tabulate(64)(identity).reverse) + check(Seq.tabulate(128)(i => 128 - 2*i).reverse) + } + + def largeTests() = { + check(Seq.tabulate(500)(identity)) + check(Seq.tabulate(512)(identity)) + check(Seq.tabulate(1_000)(identity)) + check(Seq.tabulate(10_000)(identity)) + } + } +} diff --git a/previous-exams/2021-midterm/m6.md b/previous-exams/2021-midterm/m6.md new file mode 100644 index 0000000..f0eb449 --- /dev/null +++ b/previous-exams/2021-midterm/m6.md @@ -0,0 +1,155 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m6 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m6 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +In this exercise, you will implement an array Combiner using internally a doubly linked list of arrays. Your goal is to complete the implementation of the (simplified) Combiner interface, by implementing the `result` method to compute the result array from this array combiner. + +Here you can see the declaration of the `DLLCombiner` class and the related `Node` class definition. Look at the `Lib` trait in the `lib.scala` file to find all definitions of relevant functions and classes. + + +```scala + class Node(val size: Int) { + var value: Array[Int] = new Array(size) + var next: Node = null + var previous: Node = null + var cnt = 0 + + def add(v: Int) = { + value(cnt) = v + cnt += 1 + } + } + + // Simplified Combiner interface + // Implements methods += and combine + // Abstract methods should be implemented in subclasses + abstract class DLLCombiner(val chunk_size: Int) +``` + +`DLLCombiner` class contains the implementation of methods `+=` and `combine`. You should look at them to better understand the structure of this array Combiner, before moving on to solving this exercise. + +Your task in the exercise will be to implement the `result` method of the `DLLCombinerImplementation` class. This method should compute the result array from this array combiner. This method should work in parallel according to the Combiner contract. Implement this method efficiently using 4 parallel tasks, by copying the doubly linked list to the array from both ends at the same time. Two threads should start from the start of the list and two from the end. In each case, one thread would be responsible for odd list indexes and the other for even ones. + + +```scala + class DLLCombinerImplementation(chunk_size: Int = 3) extends DLLCombiner(chunk_size) { + + // Computes every other Integer element of data array, starting from the first (index 0), up to the middle + def task1(data: Array[Int]) = task { + ??? + } + + // Computes every other Integer element of data array, starting from the second, up to the middle + def task2(data: Array[Int]) = task { + ??? + } + + // Computes every other Integer element of data array, starting from the second to last, up to the middle + def task3(data: Array[Int]) = task { + ??? + } + + // Computes every other Integer element of data array, starting from the last, up to the middle + // This is executed on the current thread. + def task4(data: Array[Int]) = { + ??? + } + + def result(): Array[Int] = { + val data = new Array[Int](cnt) + + ??? + + data + } + + } +``` + +Following the description above, your task in the exercise is to: + +- Implement the four tasks to copy parts of the array. Each task is responsible for computing one quarter of the array, as indicated in comments: + + Task 1: Computes every other Integer element of data array, starting from the first (index 0), up to the middle + + Task 2: Computes every other Integer element of data array, starting from the second, up to the middle + + Task 3: Computes every other Integer element of data array, starting from the second to last, up to the middle + + Task 4: Computes every other Integer element of data array, starting from the last, up to the middle +- Implement the method `result` to compute the result array in parallel using those four tasks. + +Hints: + +- Note that this doubly linked list implementation uses `null` pointers to represent the absence of nodes. Be careful when working with `null` pointers in your solution, to avoid causing a `NullPointerException`. + +- `DLLCombinerImplementation` comes with a private `copyForward` method that you can use in your solution: + +```scala + private def copyForward(data: Array[Int], curr: Node, from: Int, to: Int, limit: Int) +``` + +This method copies certain elements from a doubly linked list to an array, in a way that might be useful for this exercise. + +## Examples + +Here is one example of the `result` method with intermediate results: + +```scala + val combiner1 = DLLCombinerImplementation(4) + combiner1 += 7 // (7) + combiner1 += 2 // (7, 2) + combiner1 += 4 // (7, 2, 4) + combiner1 += 3 // (7, 2, 4, 3) + combiner1 += 9 // (7, 2, 4, 3) <-> (9) + combiner1 += 5 // (7, 2, 4, 3) <-> (9, 5) + combiner1 += 1 // (7, 2, 4, 3) <-> (9, 5, 1) + + val res1 = combiner1.result() // (7, 2, 4, 3, 9, 5, 1) + +``` +In this example, `task1` was responsible for computing elements at indexes 0 and 2, `task2` for computing the element at index 1, `task3` for computing elements at indexes 5 and 3, and `task4` for computing elements at indexes 6 and 4. + +Here is another example with combining: + +```scala + val c1 = DLLCombinerImplementation(4) + c1 += 7 // (7) + c1 += 2 // (7, 2) + c1 += 4 // (7, 2, 4) + c1 += 3 // (7, 2, 4, 3) + c1 += 9 // (7, 2, 4, 3) <-> (9) + c1 += 5 // (7, 2, 4, 3) <-> (9, 5) + c1 += 1 // (7, 2, 4, 3) <-> (9, 5, 1) + + val c2 = DLLCombinerImplementation(4) + c2 += 6 // (6) + c2 += 8 // (6, 8) + c2 += 5 // (6, 8, 5) + c2 += 1 // (6, 8, 5, 1) + + val c3 = DLLCombinerImplementation(4) + c3 += 1 // (1) + + c1.combine(c2).combine(c3) // (7, 2, 4, 3) <-> (9, 5, 1) <-> (6, 8, 5, 1) <-> (1) + val res = c1.result() // (7, 2, 4, 3, 9, 5, 1, 6, 8, 5, 1, 1) + +``` + +You can look at the public tests to find more examples. + +In your solution you should only make changes to the `DLLCombinerImplementation` class. You are not allowed to change the file `lib.scala`. You can get partial points for solving parts of this exercise. + + + diff --git a/previous-exams/2021-midterm/m6/.gitignore b/previous-exams/2021-midterm/m6/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m6/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m6/assignment.sbt b/previous-exams/2021-midterm/m6/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m6/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m6/build.sbt b/previous-exams/2021-midterm/m6/build.sbt new file mode 100644 index 0000000..96606f6 --- /dev/null +++ b/previous-exams/2021-midterm/m6/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m6" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m6.M6Suite" diff --git a/previous-exams/2021-midterm/m6/grading-tests.jar b/previous-exams/2021-midterm/m6/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..2127d4e28e16c94709e41b0e9a6bf7e9a5ad4b88 GIT binary patch literal 35241 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�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 literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m6/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m6/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m6/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m6/project/MOOCSettings.scala b/previous-exams/2021-midterm/m6/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m6/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m6/project/StudentTasks.scala b/previous-exams/2021-midterm/m6/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m6/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m6/project/build.properties b/previous-exams/2021-midterm/m6/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m6/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m6/project/buildSettings.sbt b/previous-exams/2021-midterm/m6/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m6/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m6/project/plugins.sbt b/previous-exams/2021-midterm/m6/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m6/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m6/src/main/scala/m6/M6.scala b/previous-exams/2021-midterm/m6/src/main/scala/m6/M6.scala new file mode 100644 index 0000000..f754c4a --- /dev/null +++ b/previous-exams/2021-midterm/m6/src/main/scala/m6/M6.scala @@ -0,0 +1,149 @@ +package m6 + +import java.util.concurrent._ +import scala.util.DynamicVariable + +trait M6 extends Lib { + + class DLLCombinerImplementation(chunk_size: Int = 3) extends DLLCombiner(chunk_size){ + + // Computes every other Integer element of data array, starting from the first (index 0), up to the middle + def task1(data: Array[Int]): ForkJoinTask[Unit] = task { + + var current = head + if(current != null) { + var i_from = 0 + var i_to = 0 + copyForward(data, current, i_from, i_to, cnt/2) + } + } + + // Computes every other Integer element of data array, starting from the second, up to the middle + def task2(data: Array[Int]): ForkJoinTask[Unit] = task { + + var current = head + if(current != null) { + var i_from = 1 + var i_to = 1 + + if(i_from >= current.cnt) { + current = current.next + if(current != null) { + i_from = 0 + } + else i_to = cnt/2 // to stop the loop + } + + copyForward(data, current, i_from, i_to, cnt/2) + } + } + + // Computes every other Integer element of data array, starting from the second to last, up to the middle + def task3(data: Array[Int]): ForkJoinTask[Unit] = task { + + var current = last + if( current != null) { + var i_to = cnt - 2 + var i_from = current.cnt - 2 + if(i_from < 0) { + current = current.previous + if(current != null) { + i_from = current.cnt - 1 + } + else i_to = cnt/2 - 1 // to stop the loop + } + + copyBackward(data, current, i_from, i_to, cnt/2) + } + } + + // Computes every other Integer element of data array, starting from the last, up to the middle + // This is executed on the current thread. + def task4(data: Array[Int]): Unit = { + + var current = last + if( current != null) { + var i_from = current.cnt - 1 + var i_to = cnt - 1 + copyBackward(data, current, i_from, i_to, cnt/2) + } + } + + def result(): Array[Int] = { + val data = new Array[Int](cnt) + + val t1 = task1(data) + val t2 = task2(data) + val t3 = task3(data) + + task4(data) + + t1.join() + t2.join() + t3.join() + + + data + } + + + private def copyBackward(data: Array[Int], curr: Node, from: Int, to: Int, limit: Int) = { + var current = curr + var i_from = from + var i_to = to + + while (i_to >= limit) { + try{ + data(i_to) = current.value(i_from) + i_to -= 2 + i_from -= 2 + if(i_from == -1) { + current = current.previous + i_from = current.cnt - 1 + } + else if(i_from == -2) { + current = current.previous + i_from = current.cnt - 2 + if(current.cnt == 1) { + current = current.previous + i_from = current.cnt - 1 + } + } + } + catch{ + case e: Exception => + } + } + + } + private def copyForward(data: Array[Int], curr: Node, from: Int, to: Int, limit: Int) = { + var current = curr + var i_from = from + var i_to = to + + while (i_to < limit) { + try { + data(i_to) = current.value(i_from) + i_to += 2 + i_from += 2 + if(i_from == current.cnt){ + current = current.next + i_from = 0 + } + else if(i_from > current.cnt) { + current = current.next + i_from = 1 + if(current.cnt == 1) { + current = current.next + i_from = 0 + } + } + } + catch{ + case e: Exception => + } + } + } + } + +} diff --git a/previous-exams/2021-midterm/m6/src/main/scala/m6/lib.scala b/previous-exams/2021-midterm/m6/src/main/scala/m6/lib.scala new file mode 100644 index 0000000..bfb2838 --- /dev/null +++ b/previous-exams/2021-midterm/m6/src/main/scala/m6/lib.scala @@ -0,0 +1,84 @@ +package m6 + +import java.util.concurrent._ +import scala.util.DynamicVariable + +trait Lib { + + class Node(val size: Int) { + var value: Array[Int] = new Array(size) + var next: Node = null + var previous: Node = null + var cnt = 0 + + def add(v: Int) = { + value(cnt) = v + cnt += 1 + } + } + + // Simplified Combiner interface + // Implements methods += and combine + // Abstract methods should be implemented in subclasses + abstract class DLLCombiner(val chunk_size: Int) { + var head: Node = null + var last: Node = null + var cnt: Int = 0 + var chunks: Int = 0 + + // Adds an Integer to the last node of this array combiner. If the last node is full, allocates a new node. + def +=(elem: Int): Unit = { + if(cnt % chunk_size == 0) { + chunks = chunks + 1 + val node = new Node(chunk_size) + if (cnt == 0) { + head = node + last = node + } + else { + last.next = node + node.previous = last + last = node + } + } + last.add(elem) + cnt += 1 + } + + // Combines this array combiner and another given combiner in constant O(1) complexity. + def combine(that: DLLCombiner): DLLCombiner = { + assert(this.chunk_size == that.chunk_size) + if (this.cnt == 0) { + this.head = that.head + this.last = that.last + this.cnt = that.cnt + this.chunks = that.chunks + + this + } + else if (that.cnt == 0) + this + else { + this.last.next = that.head + that.head.previous = this.last + + this.cnt = this.cnt + that.cnt + this.chunks = this.chunks + that.chunks + this.last = that.last + + this + } + } + + def task1(data: Array[Int]): ForkJoinTask[Unit] + def task2(data: Array[Int]): ForkJoinTask[Unit] + def task3(data: Array[Int]): ForkJoinTask[Unit] + def task4(data: Array[Int]): Unit + + def result(): Array[Int] + + } + + def task[T](body: => T): ForkJoinTask[T] + +} \ No newline at end of file diff --git a/previous-exams/2021-midterm/m6/src/test/scala/m6/M6Suite.scala b/previous-exams/2021-midterm/m6/src/test/scala/m6/M6Suite.scala new file mode 100644 index 0000000..e04fcf0 --- /dev/null +++ b/previous-exams/2021-midterm/m6/src/test/scala/m6/M6Suite.scala @@ -0,0 +1,422 @@ +package m6 + +import java.util.concurrent._ +import scala.util.DynamicVariable + +class M6Suite extends AbstractM6Suite { + + // (70+) 30 / 500 points for correct implementation, don't check parallelism + test("[Correctness] fetch result - simple combiners (5pts)") { + assertCorrectnessSimple() + } + + test("[Correctness] fetch result - small combiners (5pts)") { + assertCorrectnessBasic() + } + + test("[Correctness] fetch result - small combiners after combining (10pts)") { + assertCorrectnessCombined() + } + + test("[Correctness] fetch result - large combiners (10pts)") { + assertCorrectnessLarge() + } + + def assertCorrectnessSimple() = { + simpleCombiners.foreach(elem => assert(compare(elem._1, elem._2))) + } + + def assertCorrectnessBasic() = { + basicCombiners.foreach(elem => assert(compare(elem._1, elem._2))) + } + + def assertCorrectnessCombined() = { + combinedCombiners.foreach(elem => assert(compare(elem._1, elem._2))) + } + + def assertCorrectnessLarge() = { + largeCombiners.foreach(elem => assert(compare(elem._1, elem._2))) + } + + // (70+30+) 50 / 500 points for correct parallel implementation, don't check if it's exactly 1/4 of the array per task + private var count = 0 + private val expected = 3 + + override def task[T](body: => T): ForkJoinTask[T] = { + count += 1 + scheduler.value.schedule(body) + } + + test("[TaskCount] number of newly created tasks should be 3 (5pts)") { + assertTaskCountSimple() + } + + test("[TaskCount] fetch result and check parallel - simple combiners (5pts)") { + assertTaskCountSimple() + assertCorrectnessSimple() + } + + test("[TaskCount] fetch result and check parallel - small combiners (10pts)") { + assertTaskCountSimple() + assertCorrectnessBasic() + } + + test("[TaskCount] fetch result and check parallel - small combiners after combining (15pts)") { + assertTaskCountSimple() + assertCorrectnessCombined() + } + + test("[TaskCount] fetch result and check parallel - large combiners (15pts)") { + assertTaskCountSimple() + assertCorrectnessLarge() + } + + def assertTaskCountSimple(): Unit = { + simpleCombiners.foreach(elem => assertTaskCount(elem._1, elem._2)) + } + + def assertTaskCount(combiner: DLLCombinerTest, array: Array[Int]): Unit = { + try { + count = 0 + build(combiner, array) + combiner.result() + assertEquals(count, expected, { + s"ERROR: Expected $expected instead of $count calls to `task(...)`" + }) + } finally { + count = 0 + } + } + + //(70+30+50+) 200 / 500 points for correct parallel implementation, exactly 1/4 of the array per task + test("[TaskFairness] each task should compute 1/4 of the result (50pts)") { + assertTaskFairness(simpleCombiners.unzip._1) + } + + test("[TaskFairness] each task should correctly compute 1/4 of the result - simple combiners (20pts)") { + assertTaskFairness(simpleCombiners.unzip._1) + assertCorrectnessSimple() + } + + test("[TaskFairness] each task should correctly compute 1/4 of the result - small combiners (30pts)") { + assertTaskFairness(basicCombiners.unzip._1) + assertCorrectnessBasic() + } + + test("[TaskFairness] each task should correctly compute 1/4 of the result - small combiners after combining (50pts)") { + assertTaskFairness(combinedCombiners.unzip._1) + assertCorrectnessCombined() + } + + test("[TaskFairness] each task should correctly compute 1/4 of the result - large combiners (50pts)") { + assertTaskFairness(largeCombiners.unzip._1) + assertCorrectnessLarge() + } + + def assertTaskFairness(combiners: List[DLLCombinerTest]): Unit = { + def assertNewTaskFairness(combiner: DLLCombinerTest, task: ForkJoinTask[Unit], data: Array[Int]) = { + var count = 0 + var expected = combiner.cnt / 4 + task.join + count = data.count(elem => elem != 0) + + assert((count - expected).abs <= 1) + } + + def assertMainTaskFairness(combiner: DLLCombinerTest, task: Unit, data: Array[Int]) = { + var count = 0 + var expected = combiner.cnt / 4 + count = data.count(elem => elem != 0) + + assert((count - expected).abs <= 1) + } + + combiners.foreach { elem => + var data = Array.fill(elem.cnt)(0) + assertNewTaskFairness(elem, elem.task1(data), data) + + data = Array.fill(elem.cnt)(0) + assertNewTaskFairness(elem, elem.task2(data), data) + + data = Array.fill(elem.cnt)(0) + assertNewTaskFairness(elem, elem.task3(data), data) + + data = Array.fill(elem.cnt)(0) + assertMainTaskFairness(elem, elem.task4(data), data) + } + } + + //(70+30+50+200+) 150 / 500 points for correct parallel implementation, exactly 1/4 of the array per task, exactly the specified quarter + + test("[TaskPrecision] each task should compute specified 1/4 of the result - simple combiners (20pts)") { + assertTaskPrecision(simpleCombiners) + } + + test("[TaskPrecision] each task should compute specified 1/4 of the result - small combiners (30pts)") { + assertTaskPrecision(basicCombiners) + } + + test("[TaskPrecision] each task should compute specified 1/4 of the result - small combiners after combining (50pts)") { + assertTaskPrecision(combinedCombiners) + } + + test("[TaskPrecision] each task should compute specified 1/4 of the result - large combiners (50pts)") { + assertTaskPrecision(largeCombiners) + } + + def assertTaskPrecision(combiners: List[(DLLCombinerTest, Array[Int])]): Unit = { + combiners.foreach { elem => + var data = Array.fill(elem._1.cnt)(0) + var ref = Array.fill(elem._1.cnt)(0) + val task1 = elem._1.task1(data) + task1.join + Range(0, elem._1.cnt).foreach(i => (if (i < elem._1.cnt / 2 - 1 && i % 2 == 0) ref(i) = elem._2(i))) + assert(Range(0, elem._1.cnt / 2 - 1).forall(i => data(i) == ref(i))) + + data = Array.fill(elem._1.cnt)(0) + ref = Array.fill(elem._1.cnt)(0) + val task2 = elem._1.task2(data) + task2.join + Range(0, elem._1.cnt).foreach(i => (if (i < elem._1.cnt / 2 - 1 && i % 2 == 1) ref(i) = elem._2(i))) + assert(Range(0, elem._1.cnt / 2 - 1).forall(i => data(i) == ref(i))) + + data = Array.fill(elem._1.cnt)(0) + ref = Array.fill(elem._1.cnt)(0) + val task3 = elem._1.task3(data) + task3.join + Range(0, elem._1.cnt).foreach(i => (if (i > elem._1.cnt / 2 + 1 && i % 2 == elem._1.cnt % 2) ref(i) = elem._2(i))) + assert(Range(elem._1.cnt / 2 + 2, elem._1.cnt).forall(i => data(i) == ref(i))) + + data = Array.fill(elem._1.cnt)(0) + ref = Array.fill(elem._1.cnt)(0) + val task4 = elem._1.task4(data) + Range(0, elem._1.cnt).foreach(i => (if (i > elem._1.cnt / 2 + 1 && i % 2 != elem._1.cnt % 2) ref(i) = elem._2(i))) + assert(Range(elem._1.cnt / 2 + 2, elem._1.cnt).forall(i => data(i) == ref(i))) + } + } + + test("[Public] fetch simple result without combining (5pts)") { + val combiner1 = DLLCombinerTest(2) + combiner1 += 7 + combiner1 += 2 + combiner1 += 3 + combiner1 += 8 + combiner1 += 1 + combiner1 += 2 + combiner1 += 3 + combiner1 += 8 + + val result = combiner1.result() + val array = Array(7, 2, 3, 8, 1, 2, 3, 8) + + assert(Range(0,array.size).forall(i => array(i) == result(i))) + } + + test("[Public] fetch result without combining (5pts)") { + val combiner1 = DLLCombinerTest(2) + combiner1 += 7 + combiner1 += 2 + combiner1 += 3 + combiner1 += 8 + combiner1 += 1 + + val result = combiner1.result() + val array = Array(7, 2, 3, 8, 1) + + assert(Range(0,array.size).forall(i => array(i) == result(i))) + } + + test("[Public] fetch result after simple combining (5pts)") { + val combiner1 = DLLCombinerTest(2) + combiner1 += 7 + combiner1 += 2 + + val combiner2 = DLLCombinerTest(2) + combiner2 += 3 + combiner2 += 8 + + val combiner3 = DLLCombinerTest(2) + combiner2 += 1 + combiner2 += 9 + + val combiner4 = DLLCombinerTest(2) + combiner2 += 3 + combiner2 += 2 + + val result = combiner1.combine(combiner2).combine(combiner3).combine(combiner4).result() + val array = Array(7, 2, 3, 8, 1, 9, 3, 2) + + assert(Range(0,array.size).forall(i => array(i) == result(i))) + } + + test("[Public] fetch result - empty combiner (20pts)") { + val combiner1 = DLLCombinerTest(2) + val result = combiner1.result() + assertEquals(result.size, 0) + } + + test("[Public] fetch result - full single element combiner (15pts)") { + val combiner1 = DLLCombinerTest(3) + combiner1 += 4 + combiner1 += 2 + combiner1 += 6 + + val result = combiner1.result() + val array = Array(4, 2, 6) + + assert(Range(0,array.size).forall(i => array(i) == result(i))) + } + +} + + +trait AbstractM6Suite extends munit.FunSuite with LibImpl { + + def simpleCombiners = buildSimpleCombiners() + def basicCombiners = buildBasicCombiners() + def combinedCombiners = buildCombinedCombiners() + def largeCombiners = buildLargeCombiners() + + def buildSimpleCombiners() = { + val simpleCombiners = List( + (DLLCombinerTest(4), Array(4, 2, 6, 1, 5, 4, 3, 5, 6, 3, 4, 5, 6, 3, 4, 5)), + (DLLCombinerTest(4), Array(7, 2, 2, 9, 3, 2, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2)), + (DLLCombinerTest(4), Array.fill(16)(5)) + ) + simpleCombiners.foreach(elem => build(elem._1, elem._2)) + simpleCombiners + } + + def buildBasicCombiners() = { + val basicCombiners = List( + (DLLCombinerTest(2), Array(4, 2, 6)), + (DLLCombinerTest(5), Array(4, 2, 6)), + (DLLCombinerTest(3), Array(4, 2, 6, 1, 7, 2, 4)), + (DLLCombinerTest(4), Array(7, 2, 2, 9, 3, 2, 11, 12, 13, 14, 15, 16, 17, 22)), + (DLLCombinerTest(3), Array.fill(16)(7)), + (DLLCombinerTest(3), Array.fill(19)(7)), + (DLLCombinerTest(3), Array.fill(5)(7)), + (DLLCombinerTest(3), Array.fill(6)(7)) + ) + basicCombiners.foreach(elem => build(elem._1, elem._2)) + basicCombiners + } + + def buildCombinedCombiners() = { + var combinedCombiners = List[(DLLCombinerTest, Array[Int])]() + Range(1, 10).foreach { chunk_size => + val array = basicCombiners.filter(elem => elem._1.chunk_size == chunk_size).foldLeft(Array[Int]()) { (acc, i) => acc ++ i._2 } + val combiner = DLLCombinerTest(chunk_size) + basicCombiners.filter(elem => elem._1.chunk_size == chunk_size).foreach(elem => combiner.combine(elem._1)) + + combinedCombiners = combinedCombiners :+ (combiner, array) + } + combinedCombiners + } + + def buildLargeCombiners() = { + val largeCombiners = List( + (DLLCombinerTest(21), Array.fill(1321)(4) ++ Array.fill(1322)(7)), + (DLLCombinerTest(18), Array.fill(1341)(2) ++ Array.fill(1122)(5)), + (DLLCombinerTest(3), Array.fill(1321)(4) ++ Array.fill(1322)(7) ++ Array.fill(321)(4) ++ Array.fill(322)(7)), + (DLLCombinerTest(12), Array.fill(992321)(4) ++ Array.fill(99322)(7)), + (DLLCombinerTest(4), Array.fill(953211)(4) ++ Array.fill(999322)(1)) + ) + largeCombiners.foreach(elem => build(elem._1, elem._2)) + largeCombiners + } + + def build(combiner: DLLCombinerTest, array: Array[Int]): DLLCombinerTest = { + array.foreach(elem => combiner += elem) + combiner + } + + def compare(combiner: DLLCombinerTest, array: Array[Int]): Boolean = { + val result = combiner.result() + Range(0,array.size).forall(i => array(i) == result(i)) + } + + def buildAndCompare(combiner: DLLCombinerTest, array: Array[Int]): Boolean = { + array.foreach(elem => combiner += elem) + val result = combiner.result() + + Range(0,array.size).forall(i => array(i) == result(i)) + } + +} + +trait LibImpl extends M6 { + + val forkJoinPool = new ForkJoinPool + + abstract class TaskScheduler { + def schedule[T](body: => T): ForkJoinTask[T] + } + + class DefaultTaskScheduler extends TaskScheduler { + def schedule[T](body: => T): ForkJoinTask[T] = { + val t = new RecursiveTask[T] { + def compute = body + } + Thread.currentThread match { + case wt: ForkJoinWorkerThread => + t.fork() + case _ => + forkJoinPool.execute(t) + } + t + } + } + + val scheduler = + new DynamicVariable[TaskScheduler](new DefaultTaskScheduler) + + def task[T](body: => T): ForkJoinTask[T] = { + scheduler.value.schedule(body) + } + + class DLLCombinerTest(chunk_size: Int = 3) extends DLLCombinerImplementation(chunk_size) { + + override def +=(elem: Int): Unit = { + if(cnt % chunk_size == 0) { + chunks = chunks + 1 + val node = new Node(chunk_size) + if (cnt == 0) { + head = node + last = node + } + else { + last.next = node + node.previous = last + last = node + } + } + last.add(elem) + cnt += 1 + } + + override def combine(that: DLLCombiner): DLLCombiner = { + assert(this.chunk_size == that.chunk_size) + if (this.cnt == 0) { + this.head = that.head + this.last = that.last + this.cnt = that.cnt + this.chunks = that.chunks + + this + } + else if (that.cnt == 0) + this + else { + this.last.next = that.head + that.head.previous = this.last + + this.cnt = this.cnt + that.cnt + this.chunks = this.chunks + that.chunks + this.last = that.last + + this + } + } + } +} diff --git a/previous-exams/2021-midterm/m7.md b/previous-exams/2021-midterm/m7.md new file mode 100644 index 0000000..899703e --- /dev/null +++ b/previous-exams/2021-midterm/m7.md @@ -0,0 +1,155 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m7 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m7 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +In this exercise, you will implement an array Combiner using internally a doubly linked list of arrays. Your goal is to complete the implementation of the (simplified) Combiner interface, by implementing the `result` method to compute the result array from this array combiner. + +Here you can see the declaration of the `DLLCombiner` class and the related `Node` class definition. Look at the `Lib` trait in the `lib.scala` file to find all definitions of relevant functions and classes. + + +```scala + class Node(val size: Int) { + var value: Array[Int] = new Array(size) + var next: Node = null + var previous: Node = null + var cnt = 0 + + def add(v: Int) = { + value(cnt) = v + cnt += 1 + } + } + + // Simplified Combiner interface + // Implements methods += and combine + // Abstract methods should be implemented in subclasses + abstract class DLLCombiner(val chunk_size: Int) +``` + +`DLLCombiner` class contains the implementation of methods `+=` and `combine`. You should look at them to better understand the structure of this array Combiner, before moving on to solving this exercise. + +Your task in the exercise will be to implement the `result` method of the `DLLCombinerImplementation` class. This method should compute the result array from this array combiner. This method should work in parallel according to the Combiner contract. Implement this method efficiently using 4 parallel tasks, by copying the doubly linked list to the array from both ends at the same time. Two threads should start from the start of the list and two from the end. In each case, one thread would be responsible for odd list indexes and the other for even ones. + + +```scala + class DLLCombinerImplementation(chunk_size: Int = 3) extends DLLCombiner(chunk_size) { + + // Computes every other Integer element of data array, starting from the second, up to the middle + def task1(data: Array[Int]) = task { + ??? + } + + // Computes every other Integer element of data array, starting from the first (index 0), up to the middle + def task2(data: Array[Int]) = task { + ??? + } + + // Computes every other Integer element of data array, starting from the last, up to the middle + def task3(data: Array[Int]) = task { + ??? + } + + // Computes every other Integer element of data array, starting from the second to last, up to the middle + // This is executed on the current thread. + def task4(data: Array[Int]) = { + ??? + } + + def result(): Array[Int] = { + val data = new Array[Int](cnt) + + ??? + + data + } + + } +``` + +Following the description above, your task in the exercise is to: + +- Implement the four tasks to copy parts of the array. Each task is responsible for computing one quarter of the array, as indicated in comments: + + Task 1: Computes every other Integer element of data array, starting from the second, up to the middle + + Task 2: Computes every other Integer element of data array, starting from the first (index 0), up to the middle + + Task 3: Computes every other Integer element of data array, starting from the last, up to the middle + + Task 4: Computes every other Integer element of data array, starting from the second to last, up to the middle +- Implement the method `result` to compute the result array in parallel using those four tasks. + +Hints: + +- Note that this doubly linked list implementation uses `null` pointers to represent the absence of nodes. Be careful when working with `null` pointers in your solution, to avoid causing a `NullPointerException`. + +- `DLLCombinerImplementation` comes with a private `copyForward` method that you can use in your solution: + +```scala + private def copyForward(data: Array[Int], curr: Node, from: Int, to: Int, limit: Int) +``` + +This method copies certain elements from a doubly linked list to an array, in a way that might be useful for this exercise. + +## Examples + +Here is one example of the `result` method with intermediate results: + +```scala + val combiner1 = DLLCombinerImplementation(4) + combiner1 += 7 // (7) + combiner1 += 2 // (7, 2) + combiner1 += 4 // (7, 2, 4) + combiner1 += 3 // (7, 2, 4, 3) + combiner1 += 9 // (7, 2, 4, 3) <-> (9) + combiner1 += 5 // (7, 2, 4, 3) <-> (9, 5) + combiner1 += 1 // (7, 2, 4, 3) <-> (9, 5, 1) + + val res1 = combiner1.result() // (7, 2, 4, 3, 9, 5, 1) + +``` +In this example, `task1` was responsible for computing elements at index 1, `task2` for computing elements at indexes 0 and 2, `task3` for computing elements at indexes 6 and 4, and `task4` for computing elements at indexes 5 and 3. + +Here is another example with combining: + +```scala + val c1 = DLLCombinerImplementation(4) + c1 += 7 // (7) + c1 += 2 // (7, 2) + c1 += 4 // (7, 2, 4) + c1 += 3 // (7, 2, 4, 3) + c1 += 9 // (7, 2, 4, 3) <-> (9) + c1 += 5 // (7, 2, 4, 3) <-> (9, 5) + c1 += 1 // (7, 2, 4, 3) <-> (9, 5, 1) + + val c2 = DLLCombinerImplementation(4) + c2 += 6 // (6) + c2 += 8 // (6, 8) + c2 += 5 // (6, 8, 5) + c2 += 1 // (6, 8, 5, 1) + + val c3 = DLLCombinerImplementation(4) + c3 += 1 // (1) + + c1.combine(c2).combine(c3) // (7, 2, 4, 3) <-> (9, 5, 1) <-> (6, 8, 5, 1) <-> (1) + val res = c1.result() // (7, 2, 4, 3, 9, 5, 1, 6, 8, 5, 1, 1) + +``` + +You can look at the public tests to find more examples. + +In your solution you should only make changes to the `DLLCombinerImplementation` class. You are not allowed to change the file `lib.scala`. You can get partial points for solving parts of this exercise. + + + diff --git a/previous-exams/2021-midterm/m7/.gitignore b/previous-exams/2021-midterm/m7/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m7/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m7/assignment.sbt b/previous-exams/2021-midterm/m7/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m7/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m7/build.sbt b/previous-exams/2021-midterm/m7/build.sbt new file mode 100644 index 0000000..25a0926 --- /dev/null +++ b/previous-exams/2021-midterm/m7/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m7" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m7.M7Suite" diff --git a/previous-exams/2021-midterm/m7/grading-tests.jar b/previous-exams/2021-midterm/m7/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..4536552028df3dbab3c2d6fd1d7ae9f4f1322f75 GIT binary patch literal 35244 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 Il2#B805RkCod5s; literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m7/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m7/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m7/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m7/project/MOOCSettings.scala b/previous-exams/2021-midterm/m7/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m7/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m7/project/StudentTasks.scala b/previous-exams/2021-midterm/m7/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m7/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m7/project/build.properties b/previous-exams/2021-midterm/m7/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m7/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m7/project/buildSettings.sbt b/previous-exams/2021-midterm/m7/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m7/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m7/project/plugins.sbt b/previous-exams/2021-midterm/m7/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m7/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m7/src/main/scala/m7/M7.scala b/previous-exams/2021-midterm/m7/src/main/scala/m7/M7.scala new file mode 100644 index 0000000..d941f26 --- /dev/null +++ b/previous-exams/2021-midterm/m7/src/main/scala/m7/M7.scala @@ -0,0 +1,149 @@ +package m7 + +import java.util.concurrent._ +import scala.util.DynamicVariable + +trait M7 extends Lib { + + class DLLCombinerImplementation(chunk_size: Int = 3) extends DLLCombiner(chunk_size){ + + // Computes every other Integer element of data array, starting from the second, up to the middle + def task1(data: Array[Int]): ForkJoinTask[Unit] = task { + + var current = head + if(current != null) { + var i_from = 1 + var i_to = 1 + + if(i_from >= current.cnt) { + current = current.next + if(current != null) { + i_from = 0 + } + else i_to = cnt/2 // to stop the loop + } + + copyForward(data, current, i_from, i_to, cnt/2) + } + } + + // Computes every other Integer element of data array, starting from the first (index 0), up to the middle + def task2(data: Array[Int]): ForkJoinTask[Unit] = task { + + var current = head + if(current != null) { + var i_from = 0 + var i_to = 0 + copyForward(data, current, i_from, i_to, cnt/2) + } + } + + // Computes every other Integer element of data array, starting from the last, up to the middle + def task3(data: Array[Int]): ForkJoinTask[Unit] = task { + + var current = last + if( current != null) { + var i_from = current.cnt - 1 + var i_to = cnt - 1 + copyBackward(data, current, i_from, i_to, cnt/2) + } + } + + // Computes every other Integer element of data array, starting from the second to last, up to the middle + // This is executed on the current thread. + def task4(data: Array[Int]): Unit = { + + var current = last + if( current != null) { + var i_to = cnt - 2 + var i_from = current.cnt - 2 + if(i_from < 0) { + current = current.previous + if(current != null) { + i_from = current.cnt - 1 + } + else i_to = cnt/2 - 1 // to stop the loop + } + + copyBackward(data, current, i_from, i_to, cnt/2) + } + } + + def result(): Array[Int] = { + val data = new Array[Int](cnt) + + val t1 = task1(data) + val t2 = task2(data) + val t3 = task3(data) + + task4(data) + + t1.join() + t2.join() + t3.join() + + + data + } + + + private def copyBackward(data: Array[Int], curr: Node, from: Int, to: Int, limit: Int) = { + var current = curr + var i_from = from + var i_to = to + + while (i_to >= limit) { + try{ + data(i_to) = current.value(i_from) + i_to -= 2 + i_from -= 2 + if(i_from == -1) { + current = current.previous + i_from = current.cnt - 1 + } + else if(i_from == -2) { + current = current.previous + i_from = current.cnt - 2 + if(current.cnt == 1) { + current = current.previous + i_from = current.cnt - 1 + } + } + } + catch{ + case e: Exception => + } + } + + } + private def copyForward(data: Array[Int], curr: Node, from: Int, to: Int, limit: Int) = { + var current = curr + var i_from = from + var i_to = to + + while (i_to < limit) { + try { + data(i_to) = current.value(i_from) + i_to += 2 + i_from += 2 + if(i_from == current.cnt){ + current = current.next + i_from = 0 + } + else if(i_from > current.cnt) { + current = current.next + i_from = 1 + if(current.cnt == 1) { + current = current.next + i_from = 0 + } + } + } + catch{ + case e: Exception => + } + } + } + } + +} diff --git a/previous-exams/2021-midterm/m7/src/main/scala/m7/lib.scala b/previous-exams/2021-midterm/m7/src/main/scala/m7/lib.scala new file mode 100644 index 0000000..20eda60 --- /dev/null +++ b/previous-exams/2021-midterm/m7/src/main/scala/m7/lib.scala @@ -0,0 +1,84 @@ +package m7 + +import java.util.concurrent._ +import scala.util.DynamicVariable + +trait Lib { + + class Node(val size: Int) { + var value: Array[Int] = new Array(size) + var next: Node = null + var previous: Node = null + var cnt = 0 + + def add(v: Int) = { + value(cnt) = v + cnt += 1 + } + } + + // Simplified Combiner interface + // Implements methods += and combine + // Abstract methods should be implemented in subclasses + abstract class DLLCombiner(val chunk_size: Int) { + var head: Node = null + var last: Node = null + var cnt: Int = 0 + var chunks: Int = 0 + + // Adds an Integer to the last node of this array combiner. If the last node is full, allocates a new node. + def +=(elem: Int): Unit = { + if(cnt % chunk_size == 0) { + chunks = chunks + 1 + val node = new Node(chunk_size) + if (cnt == 0) { + head = node + last = node + } + else { + last.next = node + node.previous = last + last = node + } + } + last.add(elem) + cnt += 1 + } + + // Combines this array combiner and another given combiner in constant O(1) complexity. + def combine(that: DLLCombiner): DLLCombiner = { + assert(this.chunk_size == that.chunk_size) + if (this.cnt == 0) { + this.head = that.head + this.last = that.last + this.cnt = that.cnt + this.chunks = that.chunks + + this + } + else if (that.cnt == 0) + this + else { + this.last.next = that.head + that.head.previous = this.last + + this.cnt = this.cnt + that.cnt + this.chunks = this.chunks + that.chunks + this.last = that.last + + this + } + } + + def task1(data: Array[Int]): ForkJoinTask[Unit] + def task2(data: Array[Int]): ForkJoinTask[Unit] + def task3(data: Array[Int]): ForkJoinTask[Unit] + def task4(data: Array[Int]): Unit + + def result(): Array[Int] + + } + + def task[T](body: => T): ForkJoinTask[T] + +} \ No newline at end of file diff --git a/previous-exams/2021-midterm/m7/src/test/scala/m7/M7Suite.scala b/previous-exams/2021-midterm/m7/src/test/scala/m7/M7Suite.scala new file mode 100644 index 0000000..8e1c344 --- /dev/null +++ b/previous-exams/2021-midterm/m7/src/test/scala/m7/M7Suite.scala @@ -0,0 +1,422 @@ +package m7 + +import java.util.concurrent._ +import scala.util.DynamicVariable + +class M7Suite extends AbstractM7Suite { + + // (70+) 30 / 500 points for correct implementation, don't check parallelism + test("[Correctness] fetch result - simple combiners (5pts)") { + assertCorrectnessSimple() + } + + test("[Correctness] fetch result - small combiners (5pts)") { + assertCorrectnessBasic() + } + + test("[Correctness] fetch result - small combiners after combining (10pts)") { + assertCorrectnessCombined() + } + + test("[Correctness] fetch result - large combiners (10pts)") { + assertCorrectnessLarge() + } + + def assertCorrectnessSimple() = { + simpleCombiners.foreach(elem => assert(compare(elem._1, elem._2))) + } + + def assertCorrectnessBasic() = { + basicCombiners.foreach(elem => assert(compare(elem._1, elem._2))) + } + + def assertCorrectnessCombined() = { + combinedCombiners.foreach(elem => assert(compare(elem._1, elem._2))) + } + + def assertCorrectnessLarge() = { + largeCombiners.foreach(elem => assert(compare(elem._1, elem._2))) + } + + // (70+30+) 50 / 500 points for correct parallel implementation, don't check if it's exactly 1/4 of the array per task + private var count = 0 + private val expected = 3 + + override def task[T](body: => T): ForkJoinTask[T] = { + count += 1 + scheduler.value.schedule(body) + } + + test("[TaskCount] number of newly created tasks should be 3 (5pts)") { + assertTaskCountSimple() + } + + test("[TaskCount] fetch result and check parallel - simple combiners (5pts)") { + assertTaskCountSimple() + assertCorrectnessSimple() + } + + test("[TaskCount] fetch result and check parallel - small combiners (10pts)") { + assertTaskCountSimple() + assertCorrectnessBasic() + } + + test("[TaskCount] fetch result and check parallel - small combiners after combining (15pts)") { + assertTaskCountSimple() + assertCorrectnessCombined() + } + + test("[TaskCount] fetch result and check parallel - large combiners (15pts)") { + assertTaskCountSimple() + assertCorrectnessLarge() + } + + def assertTaskCountSimple(): Unit = { + simpleCombiners.foreach(elem => assertTaskCount(elem._1, elem._2)) + } + + def assertTaskCount(combiner: DLLCombinerTest, array: Array[Int]): Unit = { + try { + count = 0 + build(combiner, array) + combiner.result() + assertEquals(count, expected, { + s"ERROR: Expected $expected instead of $count calls to `task(...)`" + }) + } finally { + count = 0 + } + } + + //(70+30+50+) 200 / 500 points for correct parallel implementation, exactly 1/4 of the array per task + test("[TaskFairness] each task should compute 1/4 of the result (50pts)") { + assertTaskFairness(simpleCombiners.unzip._1) + } + + test("[TaskFairness] each task should correctly compute 1/4 of the result - simple combiners (20pts)") { + assertTaskFairness(simpleCombiners.unzip._1) + assertCorrectnessSimple() + } + + test("[TaskFairness] each task should correctly compute 1/4 of the result - small combiners (30pts)") { + assertTaskFairness(basicCombiners.unzip._1) + assertCorrectnessBasic() + } + + test("[TaskFairness] each task should correctly compute 1/4 of the result - small combiners after combining (50pts)") { + assertTaskFairness(combinedCombiners.unzip._1) + assertCorrectnessCombined() + } + + test("[TaskFairness] each task should correctly compute 1/4 of the result - large combiners (50pts)") { + assertTaskFairness(largeCombiners.unzip._1) + assertCorrectnessLarge() + } + + def assertTaskFairness(combiners: List[DLLCombinerTest]): Unit = { + def assertNewTaskFairness(combiner: DLLCombinerTest, task: ForkJoinTask[Unit], data: Array[Int]) = { + var count = 0 + var expected = combiner.cnt / 4 + task.join + count = data.count(elem => elem != 0) + + assert((count - expected).abs <= 1) + } + + def assertMainTaskFairness(combiner: DLLCombinerTest, task: Unit, data: Array[Int]) = { + var count = 0 + var expected = combiner.cnt / 4 + count = data.count(elem => elem != 0) + + assert((count - expected).abs <= 1) + } + + combiners.foreach { elem => + var data = Array.fill(elem.cnt)(0) + assertNewTaskFairness(elem, elem.task1(data), data) + + data = Array.fill(elem.cnt)(0) + assertNewTaskFairness(elem, elem.task2(data), data) + + data = Array.fill(elem.cnt)(0) + assertNewTaskFairness(elem, elem.task3(data), data) + + data = Array.fill(elem.cnt)(0) + assertMainTaskFairness(elem, elem.task4(data), data) + } + } + + //(70+30+50+200+) 150 / 500 points for correct parallel implementation, exactly 1/4 of the array per task, exactly the specified quarter + + test("[TaskPrecision] each task should compute specified 1/4 of the result - simple combiners (20pts)") { + assertTaskPrecision(simpleCombiners) + } + + test("[TaskPrecision] each task should compute specified 1/4 of the result - small combiners (30pts)") { + assertTaskPrecision(basicCombiners) + } + + test("[TaskPrecision] each task should compute specified 1/4 of the result - small combiners after combining (50pts)") { + assertTaskPrecision(combinedCombiners) + } + + test("[TaskPrecision] each task should compute specified 1/4 of the result - large combiners (50pts)") { + assertTaskPrecision(largeCombiners) + } + + def assertTaskPrecision(combiners: List[(DLLCombinerTest, Array[Int])]): Unit = { + combiners.foreach { elem => + var data = Array.fill(elem._1.cnt)(0) + var ref = Array.fill(elem._1.cnt)(0) + val task1 = elem._1.task1(data) + task1.join + Range(0, elem._1.cnt).foreach(i => (if (i < elem._1.cnt / 2 - 1 && i % 2 == 1) ref(i) = elem._2(i))) + assert(Range(0, elem._1.cnt / 2 - 1).forall(i => data(i) == ref(i))) + + data = Array.fill(elem._1.cnt)(0) + ref = Array.fill(elem._1.cnt)(0) + val task2 = elem._1.task2(data) + task2.join + Range(0, elem._1.cnt).foreach(i => (if (i < elem._1.cnt / 2 - 1 && i % 2 == 0) ref(i) = elem._2(i))) + assert(Range(0, elem._1.cnt / 2 - 1).forall(i => data(i) == ref(i))) + + data = Array.fill(elem._1.cnt)(0) + ref = Array.fill(elem._1.cnt)(0) + val task3 = elem._1.task3(data) + task3.join + Range(0, elem._1.cnt).foreach(i => (if (i > elem._1.cnt / 2 + 1 && i % 2 != elem._1.cnt % 2) ref(i) = elem._2(i))) + assert(Range(elem._1.cnt / 2 + 2, elem._1.cnt).forall(i => data(i) == ref(i))) + + data = Array.fill(elem._1.cnt)(0) + ref = Array.fill(elem._1.cnt)(0) + val task4 = elem._1.task4(data) + Range(0, elem._1.cnt).foreach(i => (if (i > elem._1.cnt / 2 + 1 && i % 2 == elem._1.cnt % 2) ref(i) = elem._2(i))) + assert(Range(elem._1.cnt / 2 + 2, elem._1.cnt).forall(i => data(i) == ref(i))) + } + } + + test("[Public] fetch simple result without combining (5pts)") { + val combiner1 = DLLCombinerTest(2) + combiner1 += 7 + combiner1 += 2 + combiner1 += 3 + combiner1 += 8 + combiner1 += 1 + combiner1 += 2 + combiner1 += 3 + combiner1 += 8 + + val result = combiner1.result() + val array = Array(7, 2, 3, 8, 1, 2, 3, 8) + + assert(Range(0,array.size).forall(i => array(i) == result(i))) + } + + test("[Public] fetch result without combining (5pts)") { + val combiner1 = DLLCombinerTest(2) + combiner1 += 7 + combiner1 += 2 + combiner1 += 3 + combiner1 += 8 + combiner1 += 1 + + val result = combiner1.result() + val array = Array(7, 2, 3, 8, 1) + + assert(Range(0,array.size).forall(i => array(i) == result(i))) + } + + test("[Public] fetch result after simple combining (5pts)") { + val combiner1 = DLLCombinerTest(2) + combiner1 += 7 + combiner1 += 2 + + val combiner2 = DLLCombinerTest(2) + combiner2 += 3 + combiner2 += 8 + + val combiner3 = DLLCombinerTest(2) + combiner2 += 1 + combiner2 += 9 + + val combiner4 = DLLCombinerTest(2) + combiner2 += 3 + combiner2 += 2 + + val result = combiner1.combine(combiner2).combine(combiner3).combine(combiner4).result() + val array = Array(7, 2, 3, 8, 1, 9, 3, 2) + + assert(Range(0,array.size).forall(i => array(i) == result(i))) + } + + test("[Public] fetch result - empty combiner (20pts)") { + val combiner1 = DLLCombinerTest(2) + val result = combiner1.result() + assertEquals(result.size, 0) + } + + test("[Public] fetch result - full single element combiner (15pts)") { + val combiner1 = DLLCombinerTest(3) + combiner1 += 4 + combiner1 += 2 + combiner1 += 6 + + val result = combiner1.result() + val array = Array(4, 2, 6) + + assert(Range(0,array.size).forall(i => array(i) == result(i))) + } + +} + + +trait AbstractM7Suite extends munit.FunSuite with LibImpl { + + def simpleCombiners = buildSimpleCombiners() + def basicCombiners = buildBasicCombiners() + def combinedCombiners = buildCombinedCombiners() + def largeCombiners = buildLargeCombiners() + + def buildSimpleCombiners() = { + val simpleCombiners = List( + (DLLCombinerTest(4), Array(4, 2, 6, 1, 5, 4, 3, 5, 6, 3, 4, 5, 6, 3, 4, 5)), + (DLLCombinerTest(4), Array(7, 2, 2, 9, 3, 2, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2)), + (DLLCombinerTest(4), Array.fill(16)(5)) + ) + simpleCombiners.foreach(elem => build(elem._1, elem._2)) + simpleCombiners + } + + def buildBasicCombiners() = { + val basicCombiners = List( + (DLLCombinerTest(2), Array(4, 2, 6)), + (DLLCombinerTest(5), Array(4, 2, 6)), + (DLLCombinerTest(3), Array(4, 2, 6, 1, 7, 2, 4)), + (DLLCombinerTest(4), Array(7, 2, 2, 9, 3, 2, 11, 12, 13, 14, 15, 16, 17, 22)), + (DLLCombinerTest(3), Array.fill(16)(7)), + (DLLCombinerTest(3), Array.fill(19)(7)), + (DLLCombinerTest(3), Array.fill(5)(7)), + (DLLCombinerTest(3), Array.fill(6)(7)) + ) + basicCombiners.foreach(elem => build(elem._1, elem._2)) + basicCombiners + } + + def buildCombinedCombiners() = { + var combinedCombiners = List[(DLLCombinerTest, Array[Int])]() + Range(1, 10).foreach { chunk_size => + val array = basicCombiners.filter(elem => elem._1.chunk_size == chunk_size).foldLeft(Array[Int]()) { (acc, i) => acc ++ i._2 } + val combiner = DLLCombinerTest(chunk_size) + basicCombiners.filter(elem => elem._1.chunk_size == chunk_size).foreach(elem => combiner.combine(elem._1)) + + combinedCombiners = combinedCombiners :+ (combiner, array) + } + combinedCombiners + } + + def buildLargeCombiners() = { + val largeCombiners = List( + (DLLCombinerTest(21), Array.fill(1321)(4) ++ Array.fill(1322)(7)), + (DLLCombinerTest(18), Array.fill(1341)(2) ++ Array.fill(1122)(5)), + (DLLCombinerTest(3), Array.fill(1321)(4) ++ Array.fill(1322)(7) ++ Array.fill(321)(4) ++ Array.fill(322)(7)), + (DLLCombinerTest(12), Array.fill(992321)(4) ++ Array.fill(99322)(7)), + (DLLCombinerTest(4), Array.fill(953211)(4) ++ Array.fill(999322)(1)) + ) + largeCombiners.foreach(elem => build(elem._1, elem._2)) + largeCombiners + } + + def build(combiner: DLLCombinerTest, array: Array[Int]): DLLCombinerTest = { + array.foreach(elem => combiner += elem) + combiner + } + + def compare(combiner: DLLCombinerTest, array: Array[Int]): Boolean = { + val result = combiner.result() + Range(0,array.size).forall(i => array(i) == result(i)) + } + + def buildAndCompare(combiner: DLLCombinerTest, array: Array[Int]): Boolean = { + array.foreach(elem => combiner += elem) + val result = combiner.result() + + Range(0,array.size).forall(i => array(i) == result(i)) + } + +} + +trait LibImpl extends M7 { + + val forkJoinPool = new ForkJoinPool + + abstract class TaskScheduler { + def schedule[T](body: => T): ForkJoinTask[T] + } + + class DefaultTaskScheduler extends TaskScheduler { + def schedule[T](body: => T): ForkJoinTask[T] = { + val t = new RecursiveTask[T] { + def compute = body + } + Thread.currentThread match { + case wt: ForkJoinWorkerThread => + t.fork() + case _ => + forkJoinPool.execute(t) + } + t + } + } + + val scheduler = + new DynamicVariable[TaskScheduler](new DefaultTaskScheduler) + + def task[T](body: => T): ForkJoinTask[T] = { + scheduler.value.schedule(body) + } + + class DLLCombinerTest(chunk_size: Int = 3) extends DLLCombinerImplementation(chunk_size) { + + override def +=(elem: Int): Unit = { + if(cnt % chunk_size == 0) { + chunks = chunks + 1 + val node = new Node(chunk_size) + if (cnt == 0) { + head = node + last = node + } + else { + last.next = node + node.previous = last + last = node + } + } + last.add(elem) + cnt += 1 + } + + override def combine(that: DLLCombiner): DLLCombiner = { + assert(this.chunk_size == that.chunk_size) + if (this.cnt == 0) { + this.head = that.head + this.last = that.last + this.cnt = that.cnt + this.chunks = that.chunks + + this + } + else if (that.cnt == 0) + this + else { + this.last.next = that.head + that.head.previous = this.last + + this.cnt = this.cnt + that.cnt + this.chunks = this.chunks + that.chunks + this.last = that.last + + this + } + } + } +} -- GitLab