diff --git a/.DS_Store b/.DS_Store
index 8089655..e32069e 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/AGENTS.md b/AGENTS.md
index 95b60ae..1ae95e7 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -10,15 +10,15 @@ Technical handoff for coding agents and contributors working on this repository.
- No backend/runtime services required
- Source dataset and generated card data are JSON files in repo
-## Current Snapshot (2026-03-21)
+## Current Snapshot (2026-03-22)
-- `topic_cards.json`: **174 total cards**
+- `topic_cards.json`: **27 total cards**
- `deck_groups`: **6** (`week-1` through `week-6`)
- Weeks covered in the dataset: **1-6**
-- Exam-topic cards (`exam_stats.total_hits > 0`): **136**
+- Exam-topic cards (`exam_stats.total_hits > 0`): **18**
- Duplicate normalized topic labels: **0**
-- Total key points across all cards: **935**
-- Optional key-point detail blocks: **256**
+- Total key points across all cards: **106**
+- Optional key-point detail blocks: **96**
Curation state:
diff --git a/README.md b/README.md
index cbf2405..4143571 100644
--- a/README.md
+++ b/README.md
@@ -66,6 +66,10 @@ python3 -m http.server 8000
Then open [http://localhost:8000](http://localhost:8000).
+## Course Materials
+
+Official course files are still kept at their canonical paths under `materials/`, but there is now also a cleaner week-ordered view under [materials/by_week](materials/by_week) for easier browsing.
+
## Support This Project
This project was made by just one student, and the AI coding tools used to build and improve it cost real money.
diff --git a/docs/curation/TOPIC_MERGING_GUIDELINES.md b/docs/curation/TOPIC_MERGING_GUIDELINES.md
index 8dde811..9b3710e 100644
--- a/docs/curation/TOPIC_MERGING_GUIDELINES.md
+++ b/docs/curation/TOPIC_MERGING_GUIDELINES.md
@@ -14,14 +14,16 @@ Use this guide when you need to:
## Current Baseline
-At the time this guide was written:
+As of 2026-03-22, the merged deck baseline was:
-- `topic_cards.json` has **174** cards.
+- `topic_cards.json` has **27** merged cards.
- `deck_groups` covers **6** weeks.
-- exam-topic cards (`exam_stats.total_hits > 0`) total **136**.
+- exam-topic cards (`exam_stats.total_hits > 0`) total **18**.
- exact duplicate normalized topic labels are **0**.
- exam-topic key points have optional detail coverage (examples/tables/explanations) and should stay selectable in UI.
+Treat `AGENTS.md` as the authoritative current snapshot for repo-wide counts. These numbers can drift as manual curation continues.
+
Important: even with exact duplicates removed, semantic overlap can still exist.
Important: curation should be evidence-driven; do not force fixed per-topic item counts.
@@ -63,13 +65,13 @@ Start with highest-impact cards (highest exam hits), then low-hit cards.
Suggested review bundles:
-1. `For Loops`, `Range()`
-2. `Conditions`, `truthy_falsy`, `Boolean operators`, `comparison_operators`, `walrus_operator`
-3. `Functions`, `Return / None`, `Default arguments`, `*args`, `*args / **kwargs`
-4. `mutable_immutable`, `mutable args`, `mutable_default`, `Objects`, `Names`
-5. `Dictionaries`, `Sets`, `dict / average`
-6. `Indexing`, `Slicing`, `Strings`
-7. `Lambda`, `Enumerate`, `Zip`
+1. `Python Basics`, `Objects and Names`, `Sequences and Access`
+2. `Operators and Truth`, `Conditions`, `Conversion and Truthiness`
+3. `Functions and Imports`, `Defining and Calling Functions`, `Return Behavior`, `Scope`, `Arguments`, `Higher-Order Patterns`
+4. `Dictionaries and Mappings`, `Lists and Sets`, `Comprehensions`, `Generators and Iterators`
+5. `String Fundamentals`, `String Operations and Methods`, `String Formatting`
+6. `OOP Fundamentals`, `Error Handling`
+7. `Pandas Core Structures`, `Inspecting and Selecting Data`, `Working With Values`, `Combining Data`, `Datetime`
These are semantic-review bundles, not mandatory merges.
diff --git a/docs/specs/RM-008-external-cheatsheet-gap-audit.md b/docs/specs/RM-008-external-cheatsheet-gap-audit.md
new file mode 100644
index 0000000..40fcf33
--- /dev/null
+++ b/docs/specs/RM-008-external-cheatsheet-gap-audit.md
@@ -0,0 +1,180 @@
+# RM-008: External Cheat-Sheet Gap Audit
+
+## Metadata
+
+- ID: `RM-008`
+- Status: `done`
+- Priority: `High`
+- Owner: `Codex`
+- Last Updated: `2026-03-22`
+
+## Problem
+
+The repo needed a manual completeness audit against public cheat sheets for the same course before wider student release. The live [topic_cards.json](../../topic_cards.json) is also materially different from the older `174`-card snapshot still described in some repo docs, so the audit had to compare against the current merged `27`-card deck rather than the stale documentation.
+
+## Goals
+
+- Manually review all 9 PDFs in [materials/example_cheat_sheets](../../materials/example_cheat_sheets) using rendered page images, not text-only extraction.
+- Normalize overlapping concepts across the public sheets into one actionable inventory.
+- Classify each concept as `covered`, `partial`, `missing-course-backed`, or `missing-extra-helpful`.
+- Suggest concrete manual additions without mutating [topic_cards.json](../../topic_cards.json) yet.
+
+## Non-Goals
+
+- Automatically importing public-sheet material into [topic_cards.json](../../topic_cards.json).
+- Treating generic Python helper content as mandatory course content.
+- Changing app behavior or data schema.
+
+## Proposed Solution
+
+Render every public PDF to PNG, review the rendered pages manually with the PDF skill, de-duplicate the extracted concept families, and compare them against the live merged deck by actual snippet/key-point/example presence rather than card titles. Record the results as a split report:
+
+- `Course-backed gaps`: missing or partial concepts that fit the current course-backed card model.
+- `Extra-helpful additions`: useful public-sheet content that is broader than the current evidence-backed scope.
+
+## Implementation Plan
+
+1. Render all 9 PDFs to `tmp/pdfs/render/` with `pdftoppm`.
+2. Have 3 subagents manually review the rendered pages in parallel using the PDF skill.
+3. Manually spot-check representative rendered pages in the main thread to verify the extracted concept families.
+4. Normalize duplicates across the 9 PDFs into one concept inventory.
+5. Compare each concept family against the live `27` merged cards in [topic_cards.json](../../topic_cards.json).
+6. Record the split report and full inventory in this spec.
+7. Align stale contributor docs with the live dataset snapshot.
+
+## Manual Review Notes
+
+- Rendered output: `43` PNG pages under `tmp/pdfs/render/`.
+- Review method: rendered-page reading with the PDF skill, not `pdftotext` alone.
+- Subagent clusters:
+ - `athena-python-endterm-study-guide-key-concepts-functions.pdf`
+ - `python-resit-cheat-sheet-2022-key-concepts-functions.pdf`
+ - `python-exam-content-summary-key-formulas-concepts.pdf`
+ - `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf`
+ - `python-cheatsheet-for-final-exam-preparation.pdf`
+ - `python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf`
+ - `python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf`
+ - `python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf`
+ - `summary-introduction-to-python.pdf`
+- Main-thread visual spot checks covered rendered pages including:
+ - `athena...:2`
+ - `python-101...:2,5,9`
+ - `python-codes...:2`
+ - `python-cheatsheet-for-final-exam-preparation:2`
+ - `python-exam-content-summary...:2`
+ - `summary-introduction-to-python:3,6`
+
+## Summary Findings
+
+- The public sheets are mostly redundant with the current deck; they do not reveal large missing topic families across the core course.
+- The clearest true content gap is a compact `NumPy` reference block.
+- Most other differences are narrower `partial` gaps inside existing merged topics:
+ - list aliasing vs copying
+ - dict utility idioms
+ - typed `except` examples
+ - richer string-formatting styles
+ - datetime ISO/day-of-year helpers
+ - pandas mutation/missing-data/value-op reminders
+- The biggest extra-helpful but lower-evidence additions are:
+ - practical console workflow (`pwd`, `python3 file.py`, `pip3 install`, `help(...)`)
+ - timezone-aware datetime helpers
+ - one compact worked aggregation example
+
+Normalized concept-family counts:
+
+- `covered`: 16
+- `partial`: 9
+- `missing-course-backed`: 1
+- `missing-extra-helpful`: 3
+
+## Course-Backed Gaps
+
+| Concept | Source PDF + page | Current mapping | Status | Proposed manual addition |
+| --- | --- | --- | --- | --- |
+| List copy and alias semantics (`y = x`, `x[:]`, `list(x)`, shallow vs deep copy) | `summary-introduction-to-python.pdf:3`
`athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3` | `Objects and Names` / `Lists and Sets` | `partial` | Add a compact example showing aliasing vs real copies, and note that `copy.deepcopy(...)` is needed for nested structures. |
+| Dict utility patterns (`update`, `pop`, sorted accumulation, `zip`, `enumerate`) | `python-cheatsheet-for-final-exam-preparation.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `Dictionaries and Mappings` | `partial` | Add one mini reference block with `dict.update`, `dict.pop`, `dict(zip(...))`, and a small loop over `.items()`. |
+| Typed error handling vs broad `except` | `python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2` | `Error Handling` | `partial` | Add a minimal `try/except ValueError` example and a note that bare `except` is broad. |
+| String immutability and reassignment after methods | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3` | `String Operations and Methods` | `partial` | Add one reminder that `replace`, `capitalize`, `split`, and `join` return new strings and do not mutate the original. |
+| Formatting styles beyond f-strings (`.format`, conversion flags, compact specifiers) | `python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`python-exam-content-summary-key-formulas-concepts.pdf:2` | `String Formatting` | `partial` | Extend the formatting card with `.format(...)`, `!r`, `!s`, and a `{:02d}` example. |
+| Constructor/default-argument and instance-vs-class-attribute pitfalls | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:3`
`python-cheatsheet-for-final-exam-preparation.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `OOP Fundamentals` | `partial` | Add one compact class example covering `__init__`, default arguments, and the difference between instance and class attributes. |
+| Datetime ISO/day-of-year helpers | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `Datetime` | `partial` | Add quick refs for `isoweekday()`, `isocalendar()`, and `day_of_year = (dt - datetime(dt.year, 1, 1)).days + 1`. |
+| NumPy arrays, vectorized arithmetic, boolean masks, 2D indexing, and `shape` | `summary-introduction-to-python.pdf:6` | `none` | `missing-course-backed` | Add a small `NumPy` topic block or extend an existing week-1/values card with `import numpy as np`, `np.array(...)`, vectorized math, boolean subsetting, 2D indexing, and `.shape`. |
+| Pandas value/mutation/missing-data helpers (`T`, `sort_index`, `sort_values`, `drop`, `dropna`, `fillna(method=..., limit=...)`, `set_index`) | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`summary-introduction-to-python.pdf:3`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:3` | `Working With Values` / `Combining Data` | `partial` | Add a compact reminder block covering sort/drop/index/missing-data helpers, and flag `DataFrame.append(...)` as legacy with `pd.concat(...)` preferred. |
+| Pandas vectorized string helpers and `apply(..., axis=...)` patterns | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2`
`python-cheatsheet-for-final-exam-preparation.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2,3` | `Working With Values` | `partial` | Add one short side-by-side example for `.str`, `.map(...)`, and `df.apply(..., axis=0/1)`. |
+
+## Extra-Helpful Additions
+
+| Concept | Source PDF + page | Current mapping | Status | Proposed manual addition |
+| --- | --- | --- | --- | --- |
+| Timezone-aware datetime variants (`today`, `utcnow`, `datetime.now(tz=...)`, `pytz.timezone(...)`) | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3` | `Datetime` | `missing-extra-helpful` | Add a small optional note for UTC vs local time and timezone-aware construction if you want broader real-world usefulness. |
+| Practical console workflow (`pwd`, `python3 file.py`, `pip3 install`, `help(...)`) | `summary-introduction-to-python.pdf:2` | `Python Basics` | `missing-extra-helpful` | Add a tiny “run Python locally” helper block near the intro or splash help text. |
+| Worked aggregation / weighted-average style practice snippet | `python-exam-content-summary-key-formulas-concepts.pdf:4` | `Loops` / `Working With Values` | `missing-extra-helpful` | Add one loop-based average or weighted-average example if you want one more exam-ready worked pattern. |
+
+## Full Normalized Inventory
+
+| Concept | Source PDF + page | Mapped current topic | Status | Proposed target topic | Proposed section type | Proposed manual addition |
+| --- | --- | --- | --- | --- | --- | --- |
+| Core primitives, comments, print, input, and basic control-flow framing | `athena-python-endterm-study-guide-key-concepts-functions.pdf:2`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:2`
`python-exam-content-summary-key-formulas-concepts.pdf:2`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:2`
`summary-introduction-to-python.pdf:2` | `Python Basics` / `Functions and Imports` | `covered` | `Python Basics` | `key_points_to_remember` | No addition needed. |
+| Numeric operators and boolean logic | `athena-python-endterm-study-guide-key-concepts-functions.pdf:2`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:2`
`python-exam-content-summary-key-formulas-concepts.pdf:2`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:2` | `Operators and Truth` | `covered` | `Operators and Truth` | `key_points_to_remember` | No addition needed. |
+| Sequence indexing, slicing, containment, and `range` stop-exclusion | `athena-python-endterm-study-guide-key-concepts-functions.pdf:2`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:2`
`python-exam-content-summary-key-formulas-concepts.pdf:2`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:2`
`summary-introduction-to-python.pdf:3` | `Sequences and Access` | `covered` | `Sequences and Access` | `key_points_to_remember` | No addition needed. |
+| Basic list mutation (`append`, `remove`, slicing, deletion) | `python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:2`
`summary-introduction-to-python.pdf:3` | `Lists and Sets` | `covered` | `Lists and Sets` | `key_points_to_remember` | No addition needed. |
+| List copy and alias semantics (`y = x`, `x[:]`, `list(x)`, shallow vs deep copy) | `summary-introduction-to-python.pdf:3`
`athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3` | `Objects and Names` / `Lists and Sets` | `partial` | `Objects and Names` | `key_points_to_remember` | Add alias-vs-copy example plus a `copy.deepcopy(...)` note for nested structures. |
+| Basic dict creation, lookup, membership, iteration, and `dict(zip(...))` | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:2`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`summary-introduction-to-python.pdf:3` | `Dictionaries and Mappings` | `covered` | `Dictionaries and Mappings` | `lecture_snippets` | No addition needed. |
+| Dict utility patterns (`update`, `pop`, sorted accumulation, `zip`, `enumerate`) | `python-cheatsheet-for-final-exam-preparation.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `Dictionaries and Mappings` | `partial` | `Dictionaries and Mappings` | `ai_examples` | Add a compact helper block with `update`, `pop`, `.items()`, and `dict(zip(...))`. |
+| Loops, `break`, `continue`, `enumerate()`, and dict iteration | `python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:2,3`
`summary-introduction-to-python.pdf:3` | `Loops` | `covered` | `Loops` | `ai_examples` | No addition needed. |
+| Function and import basics | `athena-python-endterm-study-guide-key-concepts-functions.pdf:2,3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:2,3`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3` | `Functions and Imports` | `covered` | `Functions and Imports` | `lecture_snippets` | No addition needed. |
+| Default args, `*args`, `**kwargs`, `lambda`, `map`, `filter`, `reduce`, `zip`, and closures | `python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3`
`summary-introduction-to-python.pdf:4`
`athena-python-endterm-study-guide-key-concepts-functions.pdf:2,3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:2,3`
`python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2`
`python-cheatsheet-for-final-exam-preparation.pdf:2` | `Arguments` / `Higher-Order Patterns` | `covered` | `Higher-Order Patterns` | `ai_examples` | No addition needed. |
+| Typed error handling vs broad `except` | `python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2` | `Error Handling` | `partial` | `Error Handling` | `key_points_to_remember` | Add a small typed-`except` pattern and warn about bare `except`. |
+| String quoting, escaping, and method overview | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`summary-introduction-to-python.pdf:2,3` | `String Fundamentals` / `String Operations and Methods` | `covered` | `String Operations and Methods` | `lecture_snippets` | No addition needed. |
+| String immutability and reassignment after methods | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3` | `String Operations and Methods` | `partial` | `String Operations and Methods` | `key_points_to_remember` | Add a reminder that methods like `replace` and `capitalize` return new strings. |
+| Formatting styles beyond f-strings (`.format`, conversion flags, compact specifiers) | `python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`python-exam-content-summary-key-formulas-concepts.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `String Formatting` | `partial` | `String Formatting` | `lecture_snippets` | Extend with `.format(...)`, `!r`, `!s`, and `{:02d}`; mention `Template.safe_substitute(...)` as optional broader context. |
+| OOP basics (`class`, `self`, `__init__`, instantiation, attributes) | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3`
`python-exam-content-summary-key-formulas-concepts.pdf:2`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2` | `OOP Fundamentals` | `covered` | `OOP Fundamentals` | `lecture_snippets` | No addition needed. |
+| Constructor/default-argument and instance-vs-class-attribute pitfalls | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:3`
`python-cheatsheet-for-final-exam-preparation.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `OOP Fundamentals` | `partial` | `OOP Fundamentals` | `ai_examples` | Add a compact class example with a safe default pattern and class-vs-instance attribute note. |
+| Comprehensions | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2` | `Comprehensions` | `covered` | `Comprehensions` | `ai_examples` | No addition needed. |
+| Generators and iterators | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `Generators and Iterators` | `covered` | `Generators and Iterators` | `ai_examples` | No addition needed. |
+| Truthiness, equality, and coercion worked examples | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2`
`python-cheatsheet-for-final-exam-preparation.pdf:2` | `Conversion and Truthiness` | `covered` | `Conversion and Truthiness` | `ai_examples` | No addition needed. |
+| Local scope vs returned values | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2` | `Scope` / `Return Behavior` | `covered` | `Return Behavior` | `key_points_to_remember` | No addition needed. |
+| Datetime basics (`now`, `strftime`, `strptime`, `timedelta`, `replace`) | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `Datetime` | `covered` | `Datetime` | `lecture_snippets` | No addition needed. |
+| Datetime ISO/day-of-year helpers | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2` | `Datetime` | `partial` | `Datetime` | `ai_examples` | Add `isoweekday()`, `isocalendar()`, and reusable day-of-year helper snippets. |
+| Timezone-aware datetime variants (`today`, `utcnow`, `datetime.now(tz=...)`, `pytz.timezone(...)`) | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3` | `Datetime` | `missing-extra-helpful` | `Datetime` | `key_points_to_remember` | Optional timezone note for broader usefulness. |
+| NumPy arrays, vectorized arithmetic, boolean masks, 2D indexing, and `shape` | `summary-introduction-to-python.pdf:6` | `none` | `missing-course-backed` | `NumPy` or existing week-1/values card | `lecture_snippets` | Add a compact NumPy starter reference with arrays, masks, indexing, and `.shape`. |
+| Pandas core structures, indexing, and selection basics (`Series`, `DataFrame`, `.loc`, `.iloc`, `.head`, `.tail`, `.describe`) | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3`
`python-exam-content-summary-key-formulas-concepts.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`summary-introduction-to-python.pdf:3`
`python-101-intro-to-python-basics-and-data-handling-in-week-1-8.pdf:9` | `Pandas Core Structures` / `Inspecting and Selecting Data` | `covered` | `Inspecting and Selecting Data` | `lecture_snippets` | No addition needed. |
+| Pandas value/mutation/missing-data helpers (`T`, `sort_index`, `sort_values`, `drop`, `dropna`, `fillna(method=..., limit=...)`, `set_index`) | `athena-python-endterm-study-guide-key-concepts-functions.pdf:3`
`python-resit-cheat-sheet-2022-key-concepts-functions.pdf:3`
`python-cheat-sheet-methods-on-immutable-lists-dictionaries-final.pdf:2`
`summary-introduction-to-python.pdf:3`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:3` | `Working With Values` / `Combining Data` | `partial` | `Working With Values` | `key_points_to_remember` | Add a compact DataFrame manipulation helper block; mention `append` only as a legacy note. |
+| Pandas vectorized string helpers and `apply(..., axis=...)` patterns | `python-endterm-cheat-sheet-key-concepts-code-snippets.pdf:2`
`python-cheatsheet-for-final-exam-preparation.pdf:2`
`python-codes-for-exam-dictionary-datetime-and-pandas-operations.pdf:2,3` | `Working With Values` | `partial` | `Working With Values` | `ai_examples` | Add one short `.str` example plus row-wise vs column-wise `apply`. |
+| Practical console workflow (`pwd`, `python3 file.py`, `pip3 install`, `help(...)`) | `summary-introduction-to-python.pdf:2` | `Python Basics` | `missing-extra-helpful` | `Python Basics` | `key_points_to_remember` | Optional quick-start helper block for running code locally. |
+| Worked aggregation / weighted-average style practice snippet | `python-exam-content-summary-key-formulas-concepts.pdf:4` | `Loops` / `Working With Values` | `missing-extra-helpful` | `Working With Values` | `ai_examples` | Optional loop-based average or weighted-average worked example. |
+
+## Risks and Mitigations
+
+- Risk: public sheets contain generic Python advice that is useful but not strongly course-backed.
+- Mitigation: keep `missing-extra-helpful` separate from course-backed gaps.
+- Risk: older repo docs still imply a `174`-card deck and can cause future audits to compare against the wrong baseline.
+- Mitigation: align the contributor docs with the live `27`-card snapshot as part of this task.
+- Risk: some public snippets use legacy pandas APIs.
+- Mitigation: flag legacy patterns explicitly instead of promoting them unqualified.
+
+## Test Plan
+
+- Manual checks:
+ - Confirm all 9 PDFs were rendered to `43` PNG pages in `tmp/pdfs/render/`.
+ - Confirm all 9 PDFs were reviewed from rendered pages, not text extraction alone.
+ - Confirm the inventory compares against the live [topic_cards.json](../../topic_cards.json), not stale docs.
+- Validation commands:
+ - Run the `topic_cards.json` integrity check from [AGENTS.md](../../AGENTS.md).
+ - Run `make leave-better`.
+
+## Rollout and Validation
+
+- Commands run:
+ - `pdftoppm -png -rx 180 -ry 180 materials/example_cheat_sheets/*.pdf tmp/pdfs/render/...`
+ - `python3 - <<'PY' ... integrity check from AGENTS.md ... PY`
+ - `make leave-better`
+- Success criteria:
+ - Audit artifact exists and lists every normalized concept family from the reviewed PDFs.
+ - Gaps are split into course-backed vs extra-helpful.
+ - Contributor docs no longer claim the live deck still has `174` cards.
+
+## Open Questions
+
+- If follow-up curation is implemented, should `NumPy` become its own merged topic, or should the starter snippets be folded into an existing week-1 or values-focused card?
+- If extra-helpful additions are accepted, should practical workflow notes live in the card dataset or in UI/help copy outside the printable cheat sheet?
diff --git a/materials/README.md b/materials/README.md
new file mode 100644
index 0000000..fea4f2b
--- /dev/null
+++ b/materials/README.md
@@ -0,0 +1,39 @@
+# Materials Layout
+
+This folder now has two layers:
+
+- the original canonical source paths used by the data pipeline and live dataset
+- a non-breaking organized index under `materials/by_week/`
+
+## Canonical Source Paths
+
+The canonical files stay where they were so existing references in `data/study_db.json`, `topic_cards.json`, scripts, and tests do not break.
+
+Examples:
+
+- `materials/lectures/`
+- `materials/notebooks/`
+- `materials/post_midterm/`
+- `materials/exams/`
+
+## Organized Week View
+
+Use `materials/by_week/` when you want a cleaner human-facing overview of the official course files.
+
+- `week-01` through `week-06` group lecture, notebook, exercise, solution, and helper files by week
+- `shared-assessments/` groups official exams and cross-week assessment material that does not belong to a single week
+
+These entries are symlinks that point back to the canonical originals.
+
+## How to Use This Folder
+
+- Clone the repo with Git when you want `materials/by_week/` to behave like a link index.
+- Avoid relying on ZIP downloads for this view. ZIP exports may flatten or drop symlinks, which can leave tiny plain-text files instead of working links.
+- On Windows, symlink support may require Developer Mode, an elevated shell, WSL, or a Git/shell setup with symlink support enabled.
+- If an entry under `materials/by_week/` opens as a short path string instead of the expected file, re-clone the repo with Git in an environment with symlink support.
+
+## Notes
+
+- Week 4-6 lecture decks also exist under `materials/lectures/`, but the organized view points to the `materials/post_midterm/` copies because those are the paths used by the live dataset.
+- `OOP.py` is grouped under `week-06` because the repo already classifies it as week 6 material.
+- External comparison PDFs stay in `materials/example_cheat_sheets/` and are not part of the official week index.
diff --git a/materials/by_week/shared-assessments/post-midterm/Sample Final plus answers.pdf b/materials/by_week/shared-assessments/post-midterm/Sample Final plus answers.pdf
new file mode 120000
index 0000000..52017be
--- /dev/null
+++ b/materials/by_week/shared-assessments/post-midterm/Sample Final plus answers.pdf
@@ -0,0 +1 @@
+../../../post_midterm/Sample Final plus answers.pdf
\ No newline at end of file
diff --git a/materials/by_week/shared-assessments/pre-midterm/2023.pdf b/materials/by_week/shared-assessments/pre-midterm/2023.pdf
new file mode 120000
index 0000000..4d43e45
--- /dev/null
+++ b/materials/by_week/shared-assessments/pre-midterm/2023.pdf
@@ -0,0 +1 @@
+../../../exams/2023.pdf
\ No newline at end of file
diff --git a/materials/by_week/shared-assessments/pre-midterm/2024.pdf b/materials/by_week/shared-assessments/pre-midterm/2024.pdf
new file mode 120000
index 0000000..25d2de0
--- /dev/null
+++ b/materials/by_week/shared-assessments/pre-midterm/2024.pdf
@@ -0,0 +1 @@
+../../../exams/2024.pdf
\ No newline at end of file
diff --git a/materials/by_week/shared-assessments/pre-midterm/Midterm Extra Practice.txt b/materials/by_week/shared-assessments/pre-midterm/Midterm Extra Practice.txt
new file mode 120000
index 0000000..703046b
--- /dev/null
+++ b/materials/by_week/shared-assessments/pre-midterm/Midterm Extra Practice.txt
@@ -0,0 +1 @@
+../../../exams/Midterm Extra Practice.txt
\ No newline at end of file
diff --git a/materials/by_week/shared-assessments/pre-midterm/trial midterm.pdf b/materials/by_week/shared-assessments/pre-midterm/trial midterm.pdf
new file mode 120000
index 0000000..90d9356
--- /dev/null
+++ b/materials/by_week/shared-assessments/pre-midterm/trial midterm.pdf
@@ -0,0 +1 @@
+../../../exams/trial midterm.pdf
\ No newline at end of file
diff --git a/materials/by_week/shared-assessments/previous-years/final-exam-solutions-for-python-programming-62oop21.pdf b/materials/by_week/shared-assessments/previous-years/final-exam-solutions-for-python-programming-62oop21.pdf
new file mode 120000
index 0000000..2be569f
--- /dev/null
+++ b/materials/by_week/shared-assessments/previous-years/final-exam-solutions-for-python-programming-62oop21.pdf
@@ -0,0 +1 @@
+../../../post_midterm/practice_exams_previous_years/final-exam-solutions-for-python-programming-62oop21.pdf
\ No newline at end of file
diff --git a/materials/by_week/shared-assessments/previous-years/final-exam-solutions-for-python-programming-course-code-308088-308234.pdf b/materials/by_week/shared-assessments/previous-years/final-exam-solutions-for-python-programming-course-code-308088-308234.pdf
new file mode 120000
index 0000000..e68fa32
--- /dev/null
+++ b/materials/by_week/shared-assessments/previous-years/final-exam-solutions-for-python-programming-course-code-308088-308234.pdf
@@ -0,0 +1 @@
+../../../post_midterm/practice_exams_previous_years/final-exam-solutions-for-python-programming-course-code-308088-308234.pdf
\ No newline at end of file
diff --git a/materials/by_week/shared-assessments/previous-years/final-exam-study-guide-trial-python-basics-2023.pdf b/materials/by_week/shared-assessments/previous-years/final-exam-study-guide-trial-python-basics-2023.pdf
new file mode 120000
index 0000000..9a5329e
--- /dev/null
+++ b/materials/by_week/shared-assessments/previous-years/final-exam-study-guide-trial-python-basics-2023.pdf
@@ -0,0 +1 @@
+../../../post_midterm/practice_exams_previous_years/final-exam-study-guide-trial-python-basics-2023.pdf
\ No newline at end of file
diff --git a/materials/by_week/shared-assessments/previous-years/introduction-to-python-trial-final-exam-solutions-py22.pdf b/materials/by_week/shared-assessments/previous-years/introduction-to-python-trial-final-exam-solutions-py22.pdf
new file mode 120000
index 0000000..0e97846
--- /dev/null
+++ b/materials/by_week/shared-assessments/previous-years/introduction-to-python-trial-final-exam-solutions-py22.pdf
@@ -0,0 +1 @@
+../../../post_midterm/practice_exams_previous_years/introduction-to-python-trial-final-exam-solutions-py22.pdf
\ No newline at end of file
diff --git a/materials/by_week/shared-assessments/previous-years/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023.pdf b/materials/by_week/shared-assessments/previous-years/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023.pdf
new file mode 120000
index 0000000..55c3093
--- /dev/null
+++ b/materials/by_week/shared-assessments/previous-years/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023.pdf
@@ -0,0 +1 @@
+../../../post_midterm/practice_exams_previous_years/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023.pdf
\ No newline at end of file
diff --git a/materials/by_week/shared-assessments/previous-years/resit-solutions-for-introduction-to-python-35761538.pdf b/materials/by_week/shared-assessments/previous-years/resit-solutions-for-introduction-to-python-35761538.pdf
new file mode 120000
index 0000000..07d6dd2
--- /dev/null
+++ b/materials/by_week/shared-assessments/previous-years/resit-solutions-for-introduction-to-python-35761538.pdf
@@ -0,0 +1 @@
+../../../post_midterm/practice_exams_previous_years/resit-solutions-for-introduction-to-python-35761538.pdf
\ No newline at end of file
diff --git a/materials/by_week/shared-assessments/previous-years/trial-final-exam-solutions-introduction-to-python-3077951.pdf b/materials/by_week/shared-assessments/previous-years/trial-final-exam-solutions-introduction-to-python-3077951.pdf
new file mode 120000
index 0000000..de2b26c
--- /dev/null
+++ b/materials/by_week/shared-assessments/previous-years/trial-final-exam-solutions-introduction-to-python-3077951.pdf
@@ -0,0 +1 @@
+../../../post_midterm/practice_exams_previous_years/trial-final-exam-solutions-introduction-to-python-3077951.pdf
\ No newline at end of file
diff --git a/materials/by_week/week-01/lectures/Lecture Week 1.md b/materials/by_week/week-01/lectures/Lecture Week 1.md
new file mode 120000
index 0000000..5f03ed4
--- /dev/null
+++ b/materials/by_week/week-01/lectures/Lecture Week 1.md
@@ -0,0 +1 @@
+../../../lectures/Lecture Week 1.md
\ No newline at end of file
diff --git a/materials/by_week/week-01/lectures/Lecture Week 1.pptx b/materials/by_week/week-01/lectures/Lecture Week 1.pptx
new file mode 120000
index 0000000..3823fca
--- /dev/null
+++ b/materials/by_week/week-01/lectures/Lecture Week 1.pptx
@@ -0,0 +1 @@
+../../../lectures/Lecture Week 1.pptx
\ No newline at end of file
diff --git a/materials/by_week/week-01/notebooks/Notebook Week 1.ipynb b/materials/by_week/week-01/notebooks/Notebook Week 1.ipynb
new file mode 120000
index 0000000..7f51115
--- /dev/null
+++ b/materials/by_week/week-01/notebooks/Notebook Week 1.ipynb
@@ -0,0 +1 @@
+../../../notebooks/Notebook Week 1.ipynb
\ No newline at end of file
diff --git a/materials/by_week/week-02/lectures/Lecture Week 2.md b/materials/by_week/week-02/lectures/Lecture Week 2.md
new file mode 120000
index 0000000..7538f8c
--- /dev/null
+++ b/materials/by_week/week-02/lectures/Lecture Week 2.md
@@ -0,0 +1 @@
+../../../lectures/Lecture Week 2.md
\ No newline at end of file
diff --git a/materials/by_week/week-02/lectures/Lecture Week 2.pptx b/materials/by_week/week-02/lectures/Lecture Week 2.pptx
new file mode 120000
index 0000000..a2fac20
--- /dev/null
+++ b/materials/by_week/week-02/lectures/Lecture Week 2.pptx
@@ -0,0 +1 @@
+../../../lectures/Lecture Week 2.pptx
\ No newline at end of file
diff --git a/materials/by_week/week-02/notebooks/Notebook Week 2.ipynb b/materials/by_week/week-02/notebooks/Notebook Week 2.ipynb
new file mode 120000
index 0000000..77a0831
--- /dev/null
+++ b/materials/by_week/week-02/notebooks/Notebook Week 2.ipynb
@@ -0,0 +1 @@
+../../../notebooks/Notebook Week 2.ipynb
\ No newline at end of file
diff --git a/materials/by_week/week-03/lectures/Lecture Week 3.md b/materials/by_week/week-03/lectures/Lecture Week 3.md
new file mode 120000
index 0000000..95d406e
--- /dev/null
+++ b/materials/by_week/week-03/lectures/Lecture Week 3.md
@@ -0,0 +1 @@
+../../../lectures/Lecture Week 3.md
\ No newline at end of file
diff --git a/materials/by_week/week-03/lectures/Lecture Week 3.pptx b/materials/by_week/week-03/lectures/Lecture Week 3.pptx
new file mode 120000
index 0000000..32dc946
--- /dev/null
+++ b/materials/by_week/week-03/lectures/Lecture Week 3.pptx
@@ -0,0 +1 @@
+../../../lectures/Lecture Week 3.pptx
\ No newline at end of file
diff --git a/materials/by_week/week-03/notebooks/Notebook Week 3.ipynb b/materials/by_week/week-03/notebooks/Notebook Week 3.ipynb
new file mode 120000
index 0000000..083878c
--- /dev/null
+++ b/materials/by_week/week-03/notebooks/Notebook Week 3.ipynb
@@ -0,0 +1 @@
+../../../notebooks/Notebook Week 3.ipynb
\ No newline at end of file
diff --git a/materials/by_week/week-04/exercises/Exercise_4.1.py b/materials/by_week/week-04/exercises/Exercise_4.1.py
new file mode 120000
index 0000000..bf4d75a
--- /dev/null
+++ b/materials/by_week/week-04/exercises/Exercise_4.1.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_4.1.py
\ No newline at end of file
diff --git a/materials/by_week/week-04/exercises/Exercise_4.2.py b/materials/by_week/week-04/exercises/Exercise_4.2.py
new file mode 120000
index 0000000..e62e7cf
--- /dev/null
+++ b/materials/by_week/week-04/exercises/Exercise_4.2.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_4.2.py
\ No newline at end of file
diff --git a/materials/by_week/week-04/exercises/Exercise_4.3.py b/materials/by_week/week-04/exercises/Exercise_4.3.py
new file mode 120000
index 0000000..3fa4fda
--- /dev/null
+++ b/materials/by_week/week-04/exercises/Exercise_4.3.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_4.3.py
\ No newline at end of file
diff --git a/materials/by_week/week-04/exercises/Exercise_4.4.py b/materials/by_week/week-04/exercises/Exercise_4.4.py
new file mode 120000
index 0000000..75a60fa
--- /dev/null
+++ b/materials/by_week/week-04/exercises/Exercise_4.4.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_4.4.py
\ No newline at end of file
diff --git a/materials/by_week/week-04/exercises/Exercise_4.5.py b/materials/by_week/week-04/exercises/Exercise_4.5.py
new file mode 120000
index 0000000..3b38542
--- /dev/null
+++ b/materials/by_week/week-04/exercises/Exercise_4.5.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_4.5.py
\ No newline at end of file
diff --git a/materials/by_week/week-04/exercises/Exercise_4.6.py b/materials/by_week/week-04/exercises/Exercise_4.6.py
new file mode 120000
index 0000000..f7ea1d5
--- /dev/null
+++ b/materials/by_week/week-04/exercises/Exercise_4.6.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_4.6.py
\ No newline at end of file
diff --git a/materials/by_week/week-04/exercises/Exercise_4.7.py b/materials/by_week/week-04/exercises/Exercise_4.7.py
new file mode 120000
index 0000000..0121495
--- /dev/null
+++ b/materials/by_week/week-04/exercises/Exercise_4.7.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_4.7.py
\ No newline at end of file
diff --git a/materials/by_week/week-04/exercises/Exercise_4.8.py b/materials/by_week/week-04/exercises/Exercise_4.8.py
new file mode 120000
index 0000000..b016355
--- /dev/null
+++ b/materials/by_week/week-04/exercises/Exercise_4.8.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_4.8.py
\ No newline at end of file
diff --git a/materials/by_week/week-04/exercises/Exercise_4.9.py b/materials/by_week/week-04/exercises/Exercise_4.9.py
new file mode 120000
index 0000000..65bd350
--- /dev/null
+++ b/materials/by_week/week-04/exercises/Exercise_4.9.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_4.9.py
\ No newline at end of file
diff --git a/materials/by_week/week-04/lectures/Lecture Week 4.pptx b/materials/by_week/week-04/lectures/Lecture Week 4.pptx
new file mode 120000
index 0000000..0b9963a
--- /dev/null
+++ b/materials/by_week/week-04/lectures/Lecture Week 4.pptx
@@ -0,0 +1 @@
+../../../post_midterm/Lecture Week 4.pptx
\ No newline at end of file
diff --git a/materials/by_week/week-04/notebooks/Notebook Week 4.ipynb b/materials/by_week/week-04/notebooks/Notebook Week 4.ipynb
new file mode 120000
index 0000000..1584c0c
--- /dev/null
+++ b/materials/by_week/week-04/notebooks/Notebook Week 4.ipynb
@@ -0,0 +1 @@
+../../../post_midterm/Notebook Week 4.ipynb
\ No newline at end of file
diff --git a/materials/by_week/week-04/solutions/Solutions week 4.txt b/materials/by_week/week-04/solutions/Solutions week 4.txt
new file mode 120000
index 0000000..58407b3
--- /dev/null
+++ b/materials/by_week/week-04/solutions/Solutions week 4.txt
@@ -0,0 +1 @@
+../../../post_midterm/Solutions week 4.txt
\ No newline at end of file
diff --git a/materials/by_week/week-05/exercises/Exercise_5.1.py b/materials/by_week/week-05/exercises/Exercise_5.1.py
new file mode 120000
index 0000000..376a5cc
--- /dev/null
+++ b/materials/by_week/week-05/exercises/Exercise_5.1.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_5.1.py
\ No newline at end of file
diff --git a/materials/by_week/week-05/exercises/Exercise_5.2.py b/materials/by_week/week-05/exercises/Exercise_5.2.py
new file mode 120000
index 0000000..1b3a0a2
--- /dev/null
+++ b/materials/by_week/week-05/exercises/Exercise_5.2.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_5.2.py
\ No newline at end of file
diff --git a/materials/by_week/week-05/exercises/Exercise_5.3.py b/materials/by_week/week-05/exercises/Exercise_5.3.py
new file mode 120000
index 0000000..0b09ea5
--- /dev/null
+++ b/materials/by_week/week-05/exercises/Exercise_5.3.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_5.3.py
\ No newline at end of file
diff --git a/materials/by_week/week-05/exercises/Exercise_5.4.py b/materials/by_week/week-05/exercises/Exercise_5.4.py
new file mode 120000
index 0000000..8287093
--- /dev/null
+++ b/materials/by_week/week-05/exercises/Exercise_5.4.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_5.4.py
\ No newline at end of file
diff --git a/materials/by_week/week-05/exercises/Exercise_5.5.py b/materials/by_week/week-05/exercises/Exercise_5.5.py
new file mode 120000
index 0000000..4a0a62e
--- /dev/null
+++ b/materials/by_week/week-05/exercises/Exercise_5.5.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_5.5.py
\ No newline at end of file
diff --git a/materials/by_week/week-05/exercises/Exercise_5.6.py b/materials/by_week/week-05/exercises/Exercise_5.6.py
new file mode 120000
index 0000000..6385c81
--- /dev/null
+++ b/materials/by_week/week-05/exercises/Exercise_5.6.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_5.6.py
\ No newline at end of file
diff --git a/materials/by_week/week-05/exercises/Exercise_5.7.py b/materials/by_week/week-05/exercises/Exercise_5.7.py
new file mode 120000
index 0000000..75d28dc
--- /dev/null
+++ b/materials/by_week/week-05/exercises/Exercise_5.7.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_5.7.py
\ No newline at end of file
diff --git a/materials/by_week/week-05/exercises/Exercise_5.8.py b/materials/by_week/week-05/exercises/Exercise_5.8.py
new file mode 120000
index 0000000..a4ee483
--- /dev/null
+++ b/materials/by_week/week-05/exercises/Exercise_5.8.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_5.8.py
\ No newline at end of file
diff --git a/materials/by_week/week-05/exercises/Exercise_5.9.py b/materials/by_week/week-05/exercises/Exercise_5.9.py
new file mode 120000
index 0000000..0e4d7eb
--- /dev/null
+++ b/materials/by_week/week-05/exercises/Exercise_5.9.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_5.9.py
\ No newline at end of file
diff --git a/materials/by_week/week-05/lectures/Lecture Week 5.pptx b/materials/by_week/week-05/lectures/Lecture Week 5.pptx
new file mode 120000
index 0000000..650f567
--- /dev/null
+++ b/materials/by_week/week-05/lectures/Lecture Week 5.pptx
@@ -0,0 +1 @@
+../../../post_midterm/Lecture Week 5.pptx
\ No newline at end of file
diff --git a/materials/by_week/week-05/notebooks/Notebook Week 5.ipynb b/materials/by_week/week-05/notebooks/Notebook Week 5.ipynb
new file mode 120000
index 0000000..86d9351
--- /dev/null
+++ b/materials/by_week/week-05/notebooks/Notebook Week 5.ipynb
@@ -0,0 +1 @@
+../../../post_midterm/Notebook Week 5.ipynb
\ No newline at end of file
diff --git a/materials/by_week/week-05/solutions/Solutions week 5.txt b/materials/by_week/week-05/solutions/Solutions week 5.txt
new file mode 120000
index 0000000..f9cfe28
--- /dev/null
+++ b/materials/by_week/week-05/solutions/Solutions week 5.txt
@@ -0,0 +1 @@
+../../../post_midterm/Solutions week 5.txt
\ No newline at end of file
diff --git a/materials/by_week/week-06/exercises/Exercise_6.1.py b/materials/by_week/week-06/exercises/Exercise_6.1.py
new file mode 120000
index 0000000..5620ae3
--- /dev/null
+++ b/materials/by_week/week-06/exercises/Exercise_6.1.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_6.1.py
\ No newline at end of file
diff --git a/materials/by_week/week-06/exercises/Exercise_6.2.py b/materials/by_week/week-06/exercises/Exercise_6.2.py
new file mode 120000
index 0000000..bc4a7c8
--- /dev/null
+++ b/materials/by_week/week-06/exercises/Exercise_6.2.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_6.2.py
\ No newline at end of file
diff --git a/materials/by_week/week-06/exercises/Exercise_6.3.py b/materials/by_week/week-06/exercises/Exercise_6.3.py
new file mode 120000
index 0000000..fe1eb01
--- /dev/null
+++ b/materials/by_week/week-06/exercises/Exercise_6.3.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_6.3.py
\ No newline at end of file
diff --git a/materials/by_week/week-06/exercises/Exercise_6.4.py b/materials/by_week/week-06/exercises/Exercise_6.4.py
new file mode 120000
index 0000000..5eea140
--- /dev/null
+++ b/materials/by_week/week-06/exercises/Exercise_6.4.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_6.4.py
\ No newline at end of file
diff --git a/materials/by_week/week-06/exercises/Exercise_6.5.py b/materials/by_week/week-06/exercises/Exercise_6.5.py
new file mode 120000
index 0000000..ba675b1
--- /dev/null
+++ b/materials/by_week/week-06/exercises/Exercise_6.5.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_6.5.py
\ No newline at end of file
diff --git a/materials/by_week/week-06/exercises/Exercise_6.6.py b/materials/by_week/week-06/exercises/Exercise_6.6.py
new file mode 120000
index 0000000..4040488
--- /dev/null
+++ b/materials/by_week/week-06/exercises/Exercise_6.6.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_6.6.py
\ No newline at end of file
diff --git a/materials/by_week/week-06/exercises/Exercise_6.7.py b/materials/by_week/week-06/exercises/Exercise_6.7.py
new file mode 120000
index 0000000..397579c
--- /dev/null
+++ b/materials/by_week/week-06/exercises/Exercise_6.7.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_6.7.py
\ No newline at end of file
diff --git a/materials/by_week/week-06/exercises/Exercise_6.8.py b/materials/by_week/week-06/exercises/Exercise_6.8.py
new file mode 120000
index 0000000..eda6ddd
--- /dev/null
+++ b/materials/by_week/week-06/exercises/Exercise_6.8.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_6.8.py
\ No newline at end of file
diff --git a/materials/by_week/week-06/exercises/Exercise_6.9.py b/materials/by_week/week-06/exercises/Exercise_6.9.py
new file mode 120000
index 0000000..0c032bc
--- /dev/null
+++ b/materials/by_week/week-06/exercises/Exercise_6.9.py
@@ -0,0 +1 @@
+../../../post_midterm/Exercise_6.9.py
\ No newline at end of file
diff --git a/materials/by_week/week-06/helpers/OOP.py b/materials/by_week/week-06/helpers/OOP.py
new file mode 120000
index 0000000..3740377
--- /dev/null
+++ b/materials/by_week/week-06/helpers/OOP.py
@@ -0,0 +1 @@
+../../../post_midterm/OOP.py
\ No newline at end of file
diff --git a/materials/by_week/week-06/lectures/Lecture Week 6.pptx b/materials/by_week/week-06/lectures/Lecture Week 6.pptx
new file mode 120000
index 0000000..23b4149
--- /dev/null
+++ b/materials/by_week/week-06/lectures/Lecture Week 6.pptx
@@ -0,0 +1 @@
+../../../post_midterm/Lecture Week 6.pptx
\ No newline at end of file
diff --git a/materials/by_week/week-06/notebooks/Notebook Week 6.ipynb b/materials/by_week/week-06/notebooks/Notebook Week 6.ipynb
new file mode 120000
index 0000000..0bc8caf
--- /dev/null
+++ b/materials/by_week/week-06/notebooks/Notebook Week 6.ipynb
@@ -0,0 +1 @@
+../../../post_midterm/Notebook Week 6.ipynb
\ No newline at end of file
diff --git a/tests/test_materials_by_week_symlinks.py b/tests/test_materials_by_week_symlinks.py
new file mode 100644
index 0000000..a507089
--- /dev/null
+++ b/tests/test_materials_by_week_symlinks.py
@@ -0,0 +1,30 @@
+from pathlib import Path
+import os
+import unittest
+
+
+class MaterialsByWeekSymlinkTests(unittest.TestCase):
+ @classmethod
+ def setUpClass(cls) -> None:
+ cls.root = Path(__file__).resolve().parents[1]
+ cls.by_week = cls.root / "materials" / "by_week"
+
+ def test_by_week_leaf_entries_are_symlinks_with_existing_targets(self) -> None:
+ entries = []
+ for path in self.by_week.rglob("*"):
+ if path.name.startswith("."):
+ continue
+ if path.is_dir() and not path.is_symlink():
+ continue
+ entries.append(path)
+
+ self.assertGreater(len(entries), 0, "Expected materials/by_week to contain linked material entries")
+
+ for entry in entries:
+ self.assertTrue(entry.is_symlink(), f"{entry}: expected by_week entry to be a symlink")
+ target = (entry.parent / os.readlink(entry)).resolve()
+ self.assertTrue(target.exists(), f"{entry}: symlink target does not exist: {target}")
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-01.png b/tmp/pdfs/assessments/Sample Final plus answers-01.png
new file mode 100644
index 0000000..1581c29
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-01.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-02.png b/tmp/pdfs/assessments/Sample Final plus answers-02.png
new file mode 100644
index 0000000..98c8a51
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-02.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-03.png b/tmp/pdfs/assessments/Sample Final plus answers-03.png
new file mode 100644
index 0000000..ae4080b
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-03.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-04.png b/tmp/pdfs/assessments/Sample Final plus answers-04.png
new file mode 100644
index 0000000..5093f4e
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-04.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-05.png b/tmp/pdfs/assessments/Sample Final plus answers-05.png
new file mode 100644
index 0000000..db6ffda
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-05.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-06.png b/tmp/pdfs/assessments/Sample Final plus answers-06.png
new file mode 100644
index 0000000..41f6b5c
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-06.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-07.png b/tmp/pdfs/assessments/Sample Final plus answers-07.png
new file mode 100644
index 0000000..f1d0506
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-07.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-08.png b/tmp/pdfs/assessments/Sample Final plus answers-08.png
new file mode 100644
index 0000000..717e898
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-08.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-09.png b/tmp/pdfs/assessments/Sample Final plus answers-09.png
new file mode 100644
index 0000000..2a43546
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-09.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-10.png b/tmp/pdfs/assessments/Sample Final plus answers-10.png
new file mode 100644
index 0000000..e879322
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-10.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-11.png b/tmp/pdfs/assessments/Sample Final plus answers-11.png
new file mode 100644
index 0000000..dc59f7f
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-11.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-12.png b/tmp/pdfs/assessments/Sample Final plus answers-12.png
new file mode 100644
index 0000000..ebe6331
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-12.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-13.png b/tmp/pdfs/assessments/Sample Final plus answers-13.png
new file mode 100644
index 0000000..6c450b8
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-13.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-14.png b/tmp/pdfs/assessments/Sample Final plus answers-14.png
new file mode 100644
index 0000000..82bae06
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-14.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-15.png b/tmp/pdfs/assessments/Sample Final plus answers-15.png
new file mode 100644
index 0000000..9d580b3
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-15.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-16.png b/tmp/pdfs/assessments/Sample Final plus answers-16.png
new file mode 100644
index 0000000..d15f647
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-16.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-17.png b/tmp/pdfs/assessments/Sample Final plus answers-17.png
new file mode 100644
index 0000000..ff171c0
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-17.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-18.png b/tmp/pdfs/assessments/Sample Final plus answers-18.png
new file mode 100644
index 0000000..bbb15cc
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-18.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-19.png b/tmp/pdfs/assessments/Sample Final plus answers-19.png
new file mode 100644
index 0000000..ed90bd6
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-19.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-20.png b/tmp/pdfs/assessments/Sample Final plus answers-20.png
new file mode 100644
index 0000000..b72a39d
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-20.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-21.png b/tmp/pdfs/assessments/Sample Final plus answers-21.png
new file mode 100644
index 0000000..02ac2ab
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-21.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-22.png b/tmp/pdfs/assessments/Sample Final plus answers-22.png
new file mode 100644
index 0000000..9d02d95
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-22.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-23.png b/tmp/pdfs/assessments/Sample Final plus answers-23.png
new file mode 100644
index 0000000..39d37e5
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-23.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-24.png b/tmp/pdfs/assessments/Sample Final plus answers-24.png
new file mode 100644
index 0000000..c0bd355
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-24.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-25.png b/tmp/pdfs/assessments/Sample Final plus answers-25.png
new file mode 100644
index 0000000..ce471c4
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-25.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-26.png b/tmp/pdfs/assessments/Sample Final plus answers-26.png
new file mode 100644
index 0000000..5093f4e
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-26.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-27.png b/tmp/pdfs/assessments/Sample Final plus answers-27.png
new file mode 100644
index 0000000..2d7873b
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-27.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-28.png b/tmp/pdfs/assessments/Sample Final plus answers-28.png
new file mode 100644
index 0000000..baf1d0c
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-28.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-29.png b/tmp/pdfs/assessments/Sample Final plus answers-29.png
new file mode 100644
index 0000000..4e9aa3f
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-29.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-30.png b/tmp/pdfs/assessments/Sample Final plus answers-30.png
new file mode 100644
index 0000000..1fdd093
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-30.png differ
diff --git a/tmp/pdfs/assessments/Sample Final plus answers-31.png b/tmp/pdfs/assessments/Sample Final plus answers-31.png
new file mode 100644
index 0000000..eba598b
Binary files /dev/null and b/tmp/pdfs/assessments/Sample Final plus answers-31.png differ
diff --git a/tmp/pdfs/assessments/final-exam-solutions-for-python-programming-course-code-308088-308234-05.png b/tmp/pdfs/assessments/final-exam-solutions-for-python-programming-course-code-308088-308234-05.png
new file mode 100644
index 0000000..054ae55
Binary files /dev/null and b/tmp/pdfs/assessments/final-exam-solutions-for-python-programming-course-code-308088-308234-05.png differ
diff --git a/tmp/pdfs/assessments/final-exam-solutions-for-python-programming-course-code-308088-308234-06.png b/tmp/pdfs/assessments/final-exam-solutions-for-python-programming-course-code-308088-308234-06.png
new file mode 100644
index 0000000..1f75a07
Binary files /dev/null and b/tmp/pdfs/assessments/final-exam-solutions-for-python-programming-course-code-308088-308234-06.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-01.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-01.png
new file mode 100644
index 0000000..8bd8a69
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-01.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-02.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-02.png
new file mode 100644
index 0000000..7f56edd
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-02.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-03.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-03.png
new file mode 100644
index 0000000..b68230b
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-03.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-04.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-04.png
new file mode 100644
index 0000000..a884893
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-04.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-05.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-05.png
new file mode 100644
index 0000000..ae1167e
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-05.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-06.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-06.png
new file mode 100644
index 0000000..5b019fd
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-06.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-07.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-07.png
new file mode 100644
index 0000000..c1dfe89
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-07.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-08.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-08.png
new file mode 100644
index 0000000..dd006ba
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-08.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-09.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-09.png
new file mode 100644
index 0000000..3916a79
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-09.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-10.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-10.png
new file mode 100644
index 0000000..e653825
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-10.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-11.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-11.png
new file mode 100644
index 0000000..dda99e5
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-11.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-12.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-12.png
new file mode 100644
index 0000000..c5dd9ce
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-12.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-13.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-13.png
new file mode 100644
index 0000000..63b4a98
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-13.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-14.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-14.png
new file mode 100644
index 0000000..067fd21
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-14.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-15.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-15.png
new file mode 100644
index 0000000..f47dcfb
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-15.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-16.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-16.png
new file mode 100644
index 0000000..3e83cd9
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-16.png differ
diff --git a/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-17.png b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-17.png
new file mode 100644
index 0000000..c5bca0c
Binary files /dev/null and b/tmp/pdfs/assessments/introduction-to-python-trial-final-exam-solutions-py22-17.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-01.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-01.png
new file mode 100644
index 0000000..1be0b61
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-01.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-02.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-02.png
new file mode 100644
index 0000000..97e5a9c
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-02.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-03.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-03.png
new file mode 100644
index 0000000..21f26e4
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-03.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-04.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-04.png
new file mode 100644
index 0000000..0d506fd
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-04.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-05.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-05.png
new file mode 100644
index 0000000..a32351b
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-05.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-06.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-06.png
new file mode 100644
index 0000000..e7117f8
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-06.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-07.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-07.png
new file mode 100644
index 0000000..395f93c
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-07.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-08.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-08.png
new file mode 100644
index 0000000..5e44c71
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-08.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-09.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-09.png
new file mode 100644
index 0000000..f9dbd81
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-09.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-10.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-10.png
new file mode 100644
index 0000000..85c01ba
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-10.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-11.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-11.png
new file mode 100644
index 0000000..e4d2b57
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-11.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-12.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-12.png
new file mode 100644
index 0000000..71f40ae
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-12.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-13.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-13.png
new file mode 100644
index 0000000..9e86a33
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-13.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-14.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-14.png
new file mode 100644
index 0000000..05bd25f
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-14.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-15.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-15.png
new file mode 100644
index 0000000..61acf4a
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-15.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-16.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-16.png
new file mode 100644
index 0000000..2bd811e
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-16.png differ
diff --git a/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-17.png b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-17.png
new file mode 100644
index 0000000..262f886
Binary files /dev/null and b/tmp/pdfs/assessments/resit-exam-guidelines-for-intro-to-python-6013b0470y-july-2023-17.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-01.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-01.png
new file mode 100644
index 0000000..9be4a55
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-01.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-02.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-02.png
new file mode 100644
index 0000000..ac2bde7
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-02.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-03.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-03.png
new file mode 100644
index 0000000..4351c25
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-03.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-04.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-04.png
new file mode 100644
index 0000000..6e14107
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-04.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-05.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-05.png
new file mode 100644
index 0000000..87cf0c0
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-05.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-06.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-06.png
new file mode 100644
index 0000000..8e73f3a
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-06.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-07.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-07.png
new file mode 100644
index 0000000..0bc6d84
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-07.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-08.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-08.png
new file mode 100644
index 0000000..a889d1a
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-08.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-09.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-09.png
new file mode 100644
index 0000000..0fa5e4c
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-09.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-10.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-10.png
new file mode 100644
index 0000000..5250241
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-10.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-11.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-11.png
new file mode 100644
index 0000000..4acfcae
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-11.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-12.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-12.png
new file mode 100644
index 0000000..e866b26
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-12.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-13.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-13.png
new file mode 100644
index 0000000..6ac1ba4
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-13.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-14.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-14.png
new file mode 100644
index 0000000..b811f11
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-14.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-15.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-15.png
new file mode 100644
index 0000000..790b439
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-15.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-16.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-16.png
new file mode 100644
index 0000000..2f3f54b
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-16.png differ
diff --git a/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-17.png b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-17.png
new file mode 100644
index 0000000..0f19c1c
Binary files /dev/null and b/tmp/pdfs/assessments/resit-solutions-for-introduction-to-python-35761538-17.png differ
diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-01.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-01.png
new file mode 100644
index 0000000..4c6f457
Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-01.png differ
diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-02.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-02.png
new file mode 100644
index 0000000..f455784
Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-02.png differ
diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-03.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-03.png
new file mode 100644
index 0000000..0f7352f
Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-03.png differ
diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-04.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-04.png
new file mode 100644
index 0000000..df6c540
Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-04.png differ
diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-05.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-05.png
new file mode 100644
index 0000000..b4109f0
Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-05.png differ
diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-06.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-06.png
new file mode 100644
index 0000000..441be9d
Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-06.png differ
diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-07.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-07.png
new file mode 100644
index 0000000..81fc6b3
Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-07.png differ
diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-08.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-08.png
new file mode 100644
index 0000000..b0bc6fb
Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-08.png differ
diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-09.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-09.png
new file mode 100644
index 0000000..966d253
Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-09.png differ
diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-10.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-10.png
new file mode 100644
index 0000000..a5f0a4a
Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-10.png differ
diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-11.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-11.png
new file mode 100644
index 0000000..6d52727
Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-11.png differ
diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-12.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-12.png
new file mode 100644
index 0000000..81d4a12
Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-12.png differ
diff --git a/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-13.png b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-13.png
new file mode 100644
index 0000000..feb7090
Binary files /dev/null and b/tmp/pdfs/assessments/trial-final-exam-solutions-introduction-to-python-3077951-13.png differ
diff --git a/tmp/pdfs/official/sample_final/page-01.png b/tmp/pdfs/official/sample_final/page-01.png
new file mode 100644
index 0000000..ae6bb04
Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-01.png differ
diff --git a/tmp/pdfs/official/sample_final/page-02.png b/tmp/pdfs/official/sample_final/page-02.png
new file mode 100644
index 0000000..84e12aa
Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-02.png differ
diff --git a/tmp/pdfs/official/sample_final/page-03.png b/tmp/pdfs/official/sample_final/page-03.png
new file mode 100644
index 0000000..f995351
Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-03.png differ
diff --git a/tmp/pdfs/official/sample_final/page-04.png b/tmp/pdfs/official/sample_final/page-04.png
new file mode 100644
index 0000000..bde7b4e
Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-04.png differ
diff --git a/tmp/pdfs/official/sample_final/page-05.png b/tmp/pdfs/official/sample_final/page-05.png
new file mode 100644
index 0000000..5c17893
Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-05.png differ
diff --git a/tmp/pdfs/official/sample_final/page-06.png b/tmp/pdfs/official/sample_final/page-06.png
new file mode 100644
index 0000000..cbf94be
Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-06.png differ
diff --git a/tmp/pdfs/official/sample_final/page-07.png b/tmp/pdfs/official/sample_final/page-07.png
new file mode 100644
index 0000000..4194e88
Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-07.png differ
diff --git a/tmp/pdfs/official/sample_final/page-08.png b/tmp/pdfs/official/sample_final/page-08.png
new file mode 100644
index 0000000..4d389de
Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-08.png differ
diff --git a/tmp/pdfs/official/sample_final/page-09.png b/tmp/pdfs/official/sample_final/page-09.png
new file mode 100644
index 0000000..90e7943
Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-09.png differ
diff --git a/tmp/pdfs/official/sample_final/page-10.png b/tmp/pdfs/official/sample_final/page-10.png
new file mode 100644
index 0000000..cd5dca0
Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-10.png differ
diff --git a/tmp/pdfs/official/sample_final/page-11.png b/tmp/pdfs/official/sample_final/page-11.png
new file mode 100644
index 0000000..1bc048f
Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-11.png differ
diff --git a/tmp/pdfs/official/sample_final/page-12.png b/tmp/pdfs/official/sample_final/page-12.png
new file mode 100644
index 0000000..eda1a45
Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-12.png differ
diff --git a/tmp/pdfs/official/sample_final/page-29.png b/tmp/pdfs/official/sample_final/page-29.png
new file mode 100644
index 0000000..3036086
Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-29.png differ
diff --git a/tmp/pdfs/official/sample_final/page-30.png b/tmp/pdfs/official/sample_final/page-30.png
new file mode 100644
index 0000000..1682524
Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-30.png differ
diff --git a/tmp/pdfs/official/sample_final/page-31.png b/tmp/pdfs/official/sample_final/page-31.png
new file mode 100644
index 0000000..93a71ac
Binary files /dev/null and b/tmp/pdfs/official/sample_final/page-31.png differ
diff --git a/tmp/pdfs/official/trial_final/page-01.png b/tmp/pdfs/official/trial_final/page-01.png
new file mode 100644
index 0000000..ae155aa
Binary files /dev/null and b/tmp/pdfs/official/trial_final/page-01.png differ
diff --git a/tmp/pdfs/official/trial_final/page-02.png b/tmp/pdfs/official/trial_final/page-02.png
new file mode 100644
index 0000000..280ffcf
Binary files /dev/null and b/tmp/pdfs/official/trial_final/page-02.png differ
diff --git a/tmp/pdfs/official/trial_final/page-03.png b/tmp/pdfs/official/trial_final/page-03.png
new file mode 100644
index 0000000..23427ff
Binary files /dev/null and b/tmp/pdfs/official/trial_final/page-03.png differ
diff --git a/tmp/pdfs/official/trial_final/page-04.png b/tmp/pdfs/official/trial_final/page-04.png
new file mode 100644
index 0000000..dd943c3
Binary files /dev/null and b/tmp/pdfs/official/trial_final/page-04.png differ
diff --git a/tmp/pdfs/official/trial_final/page-05.png b/tmp/pdfs/official/trial_final/page-05.png
new file mode 100644
index 0000000..edeffad
Binary files /dev/null and b/tmp/pdfs/official/trial_final/page-05.png differ
diff --git a/tmp/pdfs/official/trial_final/page-06.png b/tmp/pdfs/official/trial_final/page-06.png
new file mode 100644
index 0000000..15df6ad
Binary files /dev/null and b/tmp/pdfs/official/trial_final/page-06.png differ
diff --git a/tmp/pdfs/official/trial_final/page-07.png b/tmp/pdfs/official/trial_final/page-07.png
new file mode 100644
index 0000000..4d82d0e
Binary files /dev/null and b/tmp/pdfs/official/trial_final/page-07.png differ
diff --git a/tmp/pdfs/official/trial_final/page-08.png b/tmp/pdfs/official/trial_final/page-08.png
new file mode 100644
index 0000000..a79e02e
Binary files /dev/null and b/tmp/pdfs/official/trial_final/page-08.png differ
diff --git a/tmp/pdfs/official_decks/Lecture Week 1.pdf b/tmp/pdfs/official_decks/Lecture Week 1.pdf
new file mode 100644
index 0000000..676d7dc
Binary files /dev/null and b/tmp/pdfs/official_decks/Lecture Week 1.pdf differ
diff --git a/tmp/pdfs/official_decks/Lecture Week 4.pdf b/tmp/pdfs/official_decks/Lecture Week 4.pdf
new file mode 100644
index 0000000..cf6d6ae
Binary files /dev/null and b/tmp/pdfs/official_decks/Lecture Week 4.pdf differ
diff --git a/tmp/pdfs/official_decks/Lecture Week 5.pdf b/tmp/pdfs/official_decks/Lecture Week 5.pdf
new file mode 100644
index 0000000..0deb0ad
Binary files /dev/null and b/tmp/pdfs/official_decks/Lecture Week 5.pdf differ
diff --git a/tmp/pdfs/official_decks/Lecture Week 6.pdf b/tmp/pdfs/official_decks/Lecture Week 6.pdf
new file mode 100644
index 0000000..d31f678
Binary files /dev/null and b/tmp/pdfs/official_decks/Lecture Week 6.pdf differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1.pdf b/tmp/pdfs/official_pptx/Lecture Week 1.pdf
new file mode 100644
index 0000000..dd2d44b
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1.pdf differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-01.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-01.png
new file mode 100644
index 0000000..4a62335
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-01.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-02.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-02.png
new file mode 100644
index 0000000..0da5e63
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-02.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-03.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-03.png
new file mode 100644
index 0000000..732c42f
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-03.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-04.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-04.png
new file mode 100644
index 0000000..ea43aab
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-04.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-05.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-05.png
new file mode 100644
index 0000000..04053cf
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-05.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-06.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-06.png
new file mode 100644
index 0000000..ef87538
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-06.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-07.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-07.png
new file mode 100644
index 0000000..72ea866
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-07.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-08.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-08.png
new file mode 100644
index 0000000..c5d748e
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-08.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-09.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-09.png
new file mode 100644
index 0000000..3aaa2c7
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-09.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-10.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-10.png
new file mode 100644
index 0000000..96a0333
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-10.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-11.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-11.png
new file mode 100644
index 0000000..93fadd1
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-11.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-12.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-12.png
new file mode 100644
index 0000000..0469fb4
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-12.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-13.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-13.png
new file mode 100644
index 0000000..a787a84
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-13.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-14.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-14.png
new file mode 100644
index 0000000..bf03490
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-14.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-15.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-15.png
new file mode 100644
index 0000000..268bb0e
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-15.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-16.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-16.png
new file mode 100644
index 0000000..c4c7793
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-16.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-17.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-17.png
new file mode 100644
index 0000000..50b3f49
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-17.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-18.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-18.png
new file mode 100644
index 0000000..361d8f1
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-18.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-19.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-19.png
new file mode 100644
index 0000000..ab49671
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-19.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-20.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-20.png
new file mode 100644
index 0000000..18212d3
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-20.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-21.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-21.png
new file mode 100644
index 0000000..c6bf56b
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-21.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-22.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-22.png
new file mode 100644
index 0000000..a482c19
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-22.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-23.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-23.png
new file mode 100644
index 0000000..f6601af
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-23.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-24.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-24.png
new file mode 100644
index 0000000..d21883c
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-24.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-25.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-25.png
new file mode 100644
index 0000000..3d026c9
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-25.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-26.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-26.png
new file mode 100644
index 0000000..c8b9272
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-26.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-27.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-27.png
new file mode 100644
index 0000000..d0e3a87
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-27.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-28.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-28.png
new file mode 100644
index 0000000..53e6633
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-28.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-29.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-29.png
new file mode 100644
index 0000000..cd9240d
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-29.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-30.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-30.png
new file mode 100644
index 0000000..2b75a66
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-30.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-31.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-31.png
new file mode 100644
index 0000000..81dcd12
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-31.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-32.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-32.png
new file mode 100644
index 0000000..288432d
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-32.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-33.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-33.png
new file mode 100644
index 0000000..3bf8638
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-33.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-34.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-34.png
new file mode 100644
index 0000000..cb7ad84
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-34.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-35.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-35.png
new file mode 100644
index 0000000..f1c25df
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-35.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-36.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-36.png
new file mode 100644
index 0000000..00670e3
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-36.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-37.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-37.png
new file mode 100644
index 0000000..e632201
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-37.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-38.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-38.png
new file mode 100644
index 0000000..4fe1ce9
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-38.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-39.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-39.png
new file mode 100644
index 0000000..ddc3559
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-39.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-40.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-40.png
new file mode 100644
index 0000000..7e0b2da
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-40.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-41.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-41.png
new file mode 100644
index 0000000..41343a2
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-41.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-42.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-42.png
new file mode 100644
index 0000000..6744010
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-42.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-43.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-43.png
new file mode 100644
index 0000000..75580f6
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-43.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-44.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-44.png
new file mode 100644
index 0000000..c65bc68
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-44.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-45.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-45.png
new file mode 100644
index 0000000..6a69173
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-45.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-46.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-46.png
new file mode 100644
index 0000000..f1c3bc6
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-46.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-47.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-47.png
new file mode 100644
index 0000000..5f237ab
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-47.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-48.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-48.png
new file mode 100644
index 0000000..fded703
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-48.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-49.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-49.png
new file mode 100644
index 0000000..28d8ace
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-49.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-50.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-50.png
new file mode 100644
index 0000000..5d5d9e3
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-50.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-51.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-51.png
new file mode 100644
index 0000000..afd4753
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-51.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-52.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-52.png
new file mode 100644
index 0000000..cac10e5
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-52.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-53.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-53.png
new file mode 100644
index 0000000..0cc9c18
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-53.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-54.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-54.png
new file mode 100644
index 0000000..55c0998
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-54.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-55.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-55.png
new file mode 100644
index 0000000..a34a8bd
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-55.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-56.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-56.png
new file mode 100644
index 0000000..c7f0ec5
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-56.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 1/page-57.png b/tmp/pdfs/official_pptx/Lecture Week 1/page-57.png
new file mode 100644
index 0000000..c3d8331
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 1/page-57.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2.pdf b/tmp/pdfs/official_pptx/Lecture Week 2.pdf
new file mode 100644
index 0000000..a23d56d
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2.pdf differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-01.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-01.png
new file mode 100644
index 0000000..61a6195
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-01.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-02.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-02.png
new file mode 100644
index 0000000..b6518a3
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-02.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-03.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-03.png
new file mode 100644
index 0000000..d2b0a71
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-03.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-04.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-04.png
new file mode 100644
index 0000000..262f89e
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-04.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-05.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-05.png
new file mode 100644
index 0000000..5d5b16d
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-05.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-06.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-06.png
new file mode 100644
index 0000000..645e802
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-06.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-07.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-07.png
new file mode 100644
index 0000000..798f4a2
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-07.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-08.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-08.png
new file mode 100644
index 0000000..80c8ca7
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-08.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-09.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-09.png
new file mode 100644
index 0000000..3cbc61b
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-09.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-10.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-10.png
new file mode 100644
index 0000000..5a08ba9
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-10.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-11.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-11.png
new file mode 100644
index 0000000..58ad315
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-11.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-12.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-12.png
new file mode 100644
index 0000000..02479c6
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-12.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-13.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-13.png
new file mode 100644
index 0000000..7aed13a
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-13.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-14.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-14.png
new file mode 100644
index 0000000..6b14760
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-14.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-15.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-15.png
new file mode 100644
index 0000000..3582777
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-15.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-16.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-16.png
new file mode 100644
index 0000000..937e874
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-16.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-17.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-17.png
new file mode 100644
index 0000000..a12f172
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-17.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-18.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-18.png
new file mode 100644
index 0000000..8e19fde
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-18.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-19.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-19.png
new file mode 100644
index 0000000..afb61de
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-19.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-20.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-20.png
new file mode 100644
index 0000000..70dc676
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-20.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-21.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-21.png
new file mode 100644
index 0000000..5e115f5
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-21.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-22.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-22.png
new file mode 100644
index 0000000..4e724db
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-22.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-23.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-23.png
new file mode 100644
index 0000000..2abf01a
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-23.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-24.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-24.png
new file mode 100644
index 0000000..7f1f639
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-24.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-25.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-25.png
new file mode 100644
index 0000000..817ca1e
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-25.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-26.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-26.png
new file mode 100644
index 0000000..722b21f
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-26.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-27.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-27.png
new file mode 100644
index 0000000..72505e6
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-27.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-28.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-28.png
new file mode 100644
index 0000000..99e541c
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-28.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-29.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-29.png
new file mode 100644
index 0000000..e8ccbcf
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-29.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-30.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-30.png
new file mode 100644
index 0000000..28f1532
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-30.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-31.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-31.png
new file mode 100644
index 0000000..6aa79e7
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-31.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-32.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-32.png
new file mode 100644
index 0000000..6833057
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-32.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-33.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-33.png
new file mode 100644
index 0000000..48a5cbc
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-33.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-34.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-34.png
new file mode 100644
index 0000000..28c2759
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-34.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-35.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-35.png
new file mode 100644
index 0000000..9a9d34f
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-35.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-36.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-36.png
new file mode 100644
index 0000000..c8295e8
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-36.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-37.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-37.png
new file mode 100644
index 0000000..11ae7d2
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-37.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-38.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-38.png
new file mode 100644
index 0000000..0fbeda7
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-38.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-39.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-39.png
new file mode 100644
index 0000000..bf21db6
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-39.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-40.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-40.png
new file mode 100644
index 0000000..1fa34f9
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-40.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-41.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-41.png
new file mode 100644
index 0000000..9dc2ddc
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-41.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-42.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-42.png
new file mode 100644
index 0000000..8b5f829
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-42.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 2/page-43.png b/tmp/pdfs/official_pptx/Lecture Week 2/page-43.png
new file mode 100644
index 0000000..010c9c6
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 2/page-43.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3.pdf b/tmp/pdfs/official_pptx/Lecture Week 3.pdf
new file mode 100644
index 0000000..ccb3662
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3.pdf differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-01.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-01.png
new file mode 100644
index 0000000..59ccd1b
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-01.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-02.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-02.png
new file mode 100644
index 0000000..ec71f07
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-02.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-03.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-03.png
new file mode 100644
index 0000000..cc4ca9a
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-03.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-04.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-04.png
new file mode 100644
index 0000000..53efdff
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-04.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-05.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-05.png
new file mode 100644
index 0000000..71c1447
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-05.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-06.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-06.png
new file mode 100644
index 0000000..0d85747
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-06.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-07.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-07.png
new file mode 100644
index 0000000..412dda4
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-07.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-08.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-08.png
new file mode 100644
index 0000000..132e6bb
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-08.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-09.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-09.png
new file mode 100644
index 0000000..75bf2cf
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-09.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-10.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-10.png
new file mode 100644
index 0000000..46af6bd
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-10.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-11.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-11.png
new file mode 100644
index 0000000..0fa440b
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-11.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-12.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-12.png
new file mode 100644
index 0000000..62c925e
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-12.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-13.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-13.png
new file mode 100644
index 0000000..e0ea5bd
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-13.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-14.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-14.png
new file mode 100644
index 0000000..32994c5
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-14.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-15.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-15.png
new file mode 100644
index 0000000..7cb5216
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-15.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-16.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-16.png
new file mode 100644
index 0000000..7838bfa
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-16.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-17.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-17.png
new file mode 100644
index 0000000..649ab24
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-17.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-18.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-18.png
new file mode 100644
index 0000000..da15c2f
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-18.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-19.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-19.png
new file mode 100644
index 0000000..7f60f6f
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-19.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-20.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-20.png
new file mode 100644
index 0000000..ee7413d
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-20.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-21.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-21.png
new file mode 100644
index 0000000..73287dc
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-21.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-22.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-22.png
new file mode 100644
index 0000000..e5552a7
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-22.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-23.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-23.png
new file mode 100644
index 0000000..2552ef7
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-23.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-24.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-24.png
new file mode 100644
index 0000000..439f157
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-24.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-25.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-25.png
new file mode 100644
index 0000000..5e7408a
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-25.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-26.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-26.png
new file mode 100644
index 0000000..e8b2d96
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-26.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-27.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-27.png
new file mode 100644
index 0000000..9c0d656
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-27.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-28.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-28.png
new file mode 100644
index 0000000..8f55b4a
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-28.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-29.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-29.png
new file mode 100644
index 0000000..a37e8da
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-29.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-30.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-30.png
new file mode 100644
index 0000000..3b7f0c7
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-30.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-31.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-31.png
new file mode 100644
index 0000000..4886124
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-31.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-32.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-32.png
new file mode 100644
index 0000000..691ad3d
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-32.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-33.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-33.png
new file mode 100644
index 0000000..a5718a6
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-33.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-34.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-34.png
new file mode 100644
index 0000000..e9b12d8
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-34.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-35.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-35.png
new file mode 100644
index 0000000..c5f8c20
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-35.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-36.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-36.png
new file mode 100644
index 0000000..47e5246
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-36.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-37.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-37.png
new file mode 100644
index 0000000..ce42a73
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-37.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-38.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-38.png
new file mode 100644
index 0000000..656c592
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-38.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-39.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-39.png
new file mode 100644
index 0000000..13cbeb5
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-39.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-40.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-40.png
new file mode 100644
index 0000000..72646cf
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-40.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-41.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-41.png
new file mode 100644
index 0000000..fb1f9cf
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-41.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-42.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-42.png
new file mode 100644
index 0000000..3ac51b6
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-42.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-43.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-43.png
new file mode 100644
index 0000000..4b92d71
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-43.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-44.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-44.png
new file mode 100644
index 0000000..1b64c3f
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-44.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-45.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-45.png
new file mode 100644
index 0000000..fab9223
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-45.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-46.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-46.png
new file mode 100644
index 0000000..a0e5646
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-46.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-47.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-47.png
new file mode 100644
index 0000000..894bf1a
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-47.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-48.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-48.png
new file mode 100644
index 0000000..4e65be0
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-48.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-49.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-49.png
new file mode 100644
index 0000000..f2e0f4f
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-49.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-50.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-50.png
new file mode 100644
index 0000000..9235a4e
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-50.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-51.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-51.png
new file mode 100644
index 0000000..8af41f4
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-51.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-52.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-52.png
new file mode 100644
index 0000000..e94d301
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-52.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-53.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-53.png
new file mode 100644
index 0000000..374da7c
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-53.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-54.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-54.png
new file mode 100644
index 0000000..34d7e0b
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-54.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 3/page-55.png b/tmp/pdfs/official_pptx/Lecture Week 3/page-55.png
new file mode 100644
index 0000000..3ea5594
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 3/page-55.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4.pdf b/tmp/pdfs/official_pptx/Lecture Week 4.pdf
new file mode 100644
index 0000000..00ba96c
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4.pdf differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-01.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-01.png
new file mode 100644
index 0000000..0853445
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-01.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-02.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-02.png
new file mode 100644
index 0000000..f1ba7a0
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-02.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-03.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-03.png
new file mode 100644
index 0000000..494af88
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-03.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-04.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-04.png
new file mode 100644
index 0000000..16ac354
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-04.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-05.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-05.png
new file mode 100644
index 0000000..39df0ef
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-05.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-06.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-06.png
new file mode 100644
index 0000000..76f1908
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-06.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-07.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-07.png
new file mode 100644
index 0000000..855cf2f
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-07.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-08.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-08.png
new file mode 100644
index 0000000..32ace88
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-08.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-09.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-09.png
new file mode 100644
index 0000000..b1b1490
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-09.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-10.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-10.png
new file mode 100644
index 0000000..7328ae6
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-10.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-11.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-11.png
new file mode 100644
index 0000000..5b4bb8e
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-11.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-12.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-12.png
new file mode 100644
index 0000000..3b3e77d
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-12.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-13.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-13.png
new file mode 100644
index 0000000..31e2789
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-13.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-14.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-14.png
new file mode 100644
index 0000000..09f5b0d
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-14.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-15.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-15.png
new file mode 100644
index 0000000..8bb9774
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-15.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-16.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-16.png
new file mode 100644
index 0000000..67e361c
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-16.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-17.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-17.png
new file mode 100644
index 0000000..3ce1fb7
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-17.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-18.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-18.png
new file mode 100644
index 0000000..b17d114
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-18.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-19.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-19.png
new file mode 100644
index 0000000..0b1ba03
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-19.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-20.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-20.png
new file mode 100644
index 0000000..310b46e
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-20.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-21.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-21.png
new file mode 100644
index 0000000..4949547
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-21.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-22.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-22.png
new file mode 100644
index 0000000..6c67d7a
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-22.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-23.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-23.png
new file mode 100644
index 0000000..1c9a3ba
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-23.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-24.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-24.png
new file mode 100644
index 0000000..aba118c
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-24.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-25.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-25.png
new file mode 100644
index 0000000..25c63b8
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-25.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-26.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-26.png
new file mode 100644
index 0000000..3aa1d5a
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-26.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-27.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-27.png
new file mode 100644
index 0000000..c0fd473
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-27.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-28.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-28.png
new file mode 100644
index 0000000..9e5fc82
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-28.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-29.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-29.png
new file mode 100644
index 0000000..edda6cc
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-29.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-30.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-30.png
new file mode 100644
index 0000000..4503b9b
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-30.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-31.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-31.png
new file mode 100644
index 0000000..c52c3fc
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-31.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-32.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-32.png
new file mode 100644
index 0000000..de10986
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-32.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-33.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-33.png
new file mode 100644
index 0000000..d3b8d5b
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-33.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-34.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-34.png
new file mode 100644
index 0000000..333d8ce
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-34.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-35.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-35.png
new file mode 100644
index 0000000..6eb921c
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-35.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-36.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-36.png
new file mode 100644
index 0000000..663a2bf
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-36.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-37.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-37.png
new file mode 100644
index 0000000..31f6d14
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-37.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-38.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-38.png
new file mode 100644
index 0000000..f1fc087
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-38.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-39.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-39.png
new file mode 100644
index 0000000..2ad4de0
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-39.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-40.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-40.png
new file mode 100644
index 0000000..a2d743f
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-40.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-41.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-41.png
new file mode 100644
index 0000000..ce066cd
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-41.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-42.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-42.png
new file mode 100644
index 0000000..936f806
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-42.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-43.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-43.png
new file mode 100644
index 0000000..3cdcc06
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-43.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-44.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-44.png
new file mode 100644
index 0000000..ae76d7d
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-44.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-45.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-45.png
new file mode 100644
index 0000000..e1ff2c7
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-45.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 4/page-46.png b/tmp/pdfs/official_pptx/Lecture Week 4/page-46.png
new file mode 100644
index 0000000..b60eb10
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 4/page-46.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5.pdf b/tmp/pdfs/official_pptx/Lecture Week 5.pdf
new file mode 100644
index 0000000..6459e7c
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5.pdf differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-01.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-01.png
new file mode 100644
index 0000000..a68a8cd
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-01.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-02.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-02.png
new file mode 100644
index 0000000..714c487
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-02.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-03.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-03.png
new file mode 100644
index 0000000..c45d71b
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-03.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-04.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-04.png
new file mode 100644
index 0000000..9d8e4ee
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-04.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-05.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-05.png
new file mode 100644
index 0000000..279ef32
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-05.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-06.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-06.png
new file mode 100644
index 0000000..9b6c8d5
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-06.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-07.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-07.png
new file mode 100644
index 0000000..a189d52
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-07.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-08.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-08.png
new file mode 100644
index 0000000..214881e
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-08.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-09.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-09.png
new file mode 100644
index 0000000..9880474
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-09.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-10.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-10.png
new file mode 100644
index 0000000..efc5fc7
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-10.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-11.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-11.png
new file mode 100644
index 0000000..a439508
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-11.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-12.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-12.png
new file mode 100644
index 0000000..3f87235
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-12.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-13.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-13.png
new file mode 100644
index 0000000..2044e9b
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-13.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-14.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-14.png
new file mode 100644
index 0000000..f20369c
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-14.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-15.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-15.png
new file mode 100644
index 0000000..8a5a186
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-15.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-16.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-16.png
new file mode 100644
index 0000000..e6ebc6c
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-16.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-17.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-17.png
new file mode 100644
index 0000000..6e70118
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-17.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-18.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-18.png
new file mode 100644
index 0000000..59d49d6
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-18.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-19.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-19.png
new file mode 100644
index 0000000..1a0ae69
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-19.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-20.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-20.png
new file mode 100644
index 0000000..699742b
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-20.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-21.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-21.png
new file mode 100644
index 0000000..7d8f202
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-21.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-22.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-22.png
new file mode 100644
index 0000000..66dcb3c
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-22.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-23.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-23.png
new file mode 100644
index 0000000..443d7ec
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-23.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-24.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-24.png
new file mode 100644
index 0000000..9a0be4a
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-24.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-25.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-25.png
new file mode 100644
index 0000000..0c06de4
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-25.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-26.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-26.png
new file mode 100644
index 0000000..8412c68
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-26.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-27.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-27.png
new file mode 100644
index 0000000..12b6006
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-27.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-28.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-28.png
new file mode 100644
index 0000000..847fb1b
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-28.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-29.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-29.png
new file mode 100644
index 0000000..9b16ab7
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-29.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-30.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-30.png
new file mode 100644
index 0000000..86c5c13
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-30.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-31.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-31.png
new file mode 100644
index 0000000..1612bf6
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-31.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-32.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-32.png
new file mode 100644
index 0000000..2f916c5
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-32.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-33.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-33.png
new file mode 100644
index 0000000..250e7b2
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-33.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-34.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-34.png
new file mode 100644
index 0000000..18bf901
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-34.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-35.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-35.png
new file mode 100644
index 0000000..a757dde
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-35.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-36.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-36.png
new file mode 100644
index 0000000..b19ca7c
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-36.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-37.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-37.png
new file mode 100644
index 0000000..26e10f3
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-37.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-38.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-38.png
new file mode 100644
index 0000000..f089c88
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-38.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-39.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-39.png
new file mode 100644
index 0000000..7d71327
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-39.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-40.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-40.png
new file mode 100644
index 0000000..2dd1792
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-40.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-41.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-41.png
new file mode 100644
index 0000000..2d070a4
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-41.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-42.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-42.png
new file mode 100644
index 0000000..c92df62
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-42.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-43.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-43.png
new file mode 100644
index 0000000..b3f0ed1
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-43.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-44.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-44.png
new file mode 100644
index 0000000..1ae4540
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-44.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-45.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-45.png
new file mode 100644
index 0000000..5cd0d0d
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-45.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-46.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-46.png
new file mode 100644
index 0000000..7e6f135
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-46.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-47.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-47.png
new file mode 100644
index 0000000..4146d6a
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-47.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-48.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-48.png
new file mode 100644
index 0000000..4c54b1f
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-48.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-49.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-49.png
new file mode 100644
index 0000000..9377da8
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-49.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-50.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-50.png
new file mode 100644
index 0000000..231ecae
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-50.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-51.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-51.png
new file mode 100644
index 0000000..9c71b57
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-51.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-52.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-52.png
new file mode 100644
index 0000000..d13515c
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-52.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-53.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-53.png
new file mode 100644
index 0000000..c7837c4
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-53.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-54.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-54.png
new file mode 100644
index 0000000..d177637
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-54.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-55.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-55.png
new file mode 100644
index 0000000..5dc32e6
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-55.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-56.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-56.png
new file mode 100644
index 0000000..4ce68b6
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-56.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-57.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-57.png
new file mode 100644
index 0000000..f8db4e0
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-57.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-58.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-58.png
new file mode 100644
index 0000000..c062c5c
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-58.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-59.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-59.png
new file mode 100644
index 0000000..bdf910e
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-59.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-60.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-60.png
new file mode 100644
index 0000000..461fc84
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-60.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-61.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-61.png
new file mode 100644
index 0000000..3288e18
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-61.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-62.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-62.png
new file mode 100644
index 0000000..07361ae
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-62.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-63.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-63.png
new file mode 100644
index 0000000..026bd6a
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-63.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-64.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-64.png
new file mode 100644
index 0000000..38ff29f
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-64.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-65.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-65.png
new file mode 100644
index 0000000..ccae2a5
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-65.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 5/page-66.png b/tmp/pdfs/official_pptx/Lecture Week 5/page-66.png
new file mode 100644
index 0000000..69ea8a1
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 5/page-66.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6.pdf b/tmp/pdfs/official_pptx/Lecture Week 6.pdf
new file mode 100644
index 0000000..0a3e6ee
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6.pdf differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-01.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-01.png
new file mode 100644
index 0000000..0b1fff6
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-01.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-02.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-02.png
new file mode 100644
index 0000000..2986eff
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-02.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-03.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-03.png
new file mode 100644
index 0000000..4bc6ed6
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-03.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-04.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-04.png
new file mode 100644
index 0000000..01d71fb
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-04.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-05.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-05.png
new file mode 100644
index 0000000..e4f9966
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-05.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-06.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-06.png
new file mode 100644
index 0000000..d61676a
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-06.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-07.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-07.png
new file mode 100644
index 0000000..f75f9f7
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-07.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-08.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-08.png
new file mode 100644
index 0000000..382f0d4
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-08.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-09.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-09.png
new file mode 100644
index 0000000..99fc5ba
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-09.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-10.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-10.png
new file mode 100644
index 0000000..f64c31a
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-10.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-11.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-11.png
new file mode 100644
index 0000000..8ddaa92
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-11.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-12.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-12.png
new file mode 100644
index 0000000..b0e8b4c
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-12.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-13.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-13.png
new file mode 100644
index 0000000..05dc772
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-13.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-14.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-14.png
new file mode 100644
index 0000000..395bba1
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-14.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-15.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-15.png
new file mode 100644
index 0000000..ddcd373
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-15.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-16.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-16.png
new file mode 100644
index 0000000..6f148be
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-16.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-17.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-17.png
new file mode 100644
index 0000000..6627099
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-17.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-18.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-18.png
new file mode 100644
index 0000000..518e7a9
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-18.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-19.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-19.png
new file mode 100644
index 0000000..2b454fd
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-19.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-20.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-20.png
new file mode 100644
index 0000000..dab3bac
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-20.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-21.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-21.png
new file mode 100644
index 0000000..3c62302
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-21.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-22.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-22.png
new file mode 100644
index 0000000..20f7658
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-22.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-23.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-23.png
new file mode 100644
index 0000000..f25b137
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-23.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-24.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-24.png
new file mode 100644
index 0000000..c2c9d06
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-24.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-25.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-25.png
new file mode 100644
index 0000000..67f274e
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-25.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-26.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-26.png
new file mode 100644
index 0000000..c83295d
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-26.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-27.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-27.png
new file mode 100644
index 0000000..15f4ab0
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-27.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-28.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-28.png
new file mode 100644
index 0000000..07f814c
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-28.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-29.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-29.png
new file mode 100644
index 0000000..1b57e3d
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-29.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-30.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-30.png
new file mode 100644
index 0000000..bd4c0f1
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-30.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-31.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-31.png
new file mode 100644
index 0000000..e4f1e5f
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-31.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-32.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-32.png
new file mode 100644
index 0000000..a3d3e08
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-32.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-33.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-33.png
new file mode 100644
index 0000000..79b8b63
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-33.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-34.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-34.png
new file mode 100644
index 0000000..2713746
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-34.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-35.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-35.png
new file mode 100644
index 0000000..29ef519
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-35.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-36.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-36.png
new file mode 100644
index 0000000..a9e6e72
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-36.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-37.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-37.png
new file mode 100644
index 0000000..7c23bd9
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-37.png differ
diff --git a/tmp/pdfs/official_pptx/Lecture Week 6/page-38.png b/tmp/pdfs/official_pptx/Lecture Week 6/page-38.png
new file mode 100644
index 0000000..712a6e7
Binary files /dev/null and b/tmp/pdfs/official_pptx/Lecture Week 6/page-38.png differ
diff --git a/tmp/pdfs/render/resit-guidelines-02.png b/tmp/pdfs/render/resit-guidelines-02.png
new file mode 100644
index 0000000..c7b2b0f
Binary files /dev/null and b/tmp/pdfs/render/resit-guidelines-02.png differ
diff --git a/tmp/pdfs/render/resit-guidelines-03.png b/tmp/pdfs/render/resit-guidelines-03.png
new file mode 100644
index 0000000..bcb2330
Binary files /dev/null and b/tmp/pdfs/render/resit-guidelines-03.png differ
diff --git a/tmp/pdfs/render/resit-solutions-02.png b/tmp/pdfs/render/resit-solutions-02.png
new file mode 100644
index 0000000..46695d9
Binary files /dev/null and b/tmp/pdfs/render/resit-solutions-02.png differ
diff --git a/tmp/pdfs/render/sample-final-01.png b/tmp/pdfs/render/sample-final-01.png
new file mode 100644
index 0000000..ae6bb04
Binary files /dev/null and b/tmp/pdfs/render/sample-final-01.png differ
diff --git a/tmp/pdfs/render/sample-final-02.png b/tmp/pdfs/render/sample-final-02.png
new file mode 100644
index 0000000..84e12aa
Binary files /dev/null and b/tmp/pdfs/render/sample-final-02.png differ
diff --git a/tmp/pdfs/render/sample-final-03.png b/tmp/pdfs/render/sample-final-03.png
new file mode 100644
index 0000000..f995351
Binary files /dev/null and b/tmp/pdfs/render/sample-final-03.png differ
diff --git a/tmp/pdfs/render/sample-final-04.png b/tmp/pdfs/render/sample-final-04.png
new file mode 100644
index 0000000..bde7b4e
Binary files /dev/null and b/tmp/pdfs/render/sample-final-04.png differ
diff --git a/tmp/pdfs/render/sample-final-05.png b/tmp/pdfs/render/sample-final-05.png
new file mode 100644
index 0000000..5c17893
Binary files /dev/null and b/tmp/pdfs/render/sample-final-05.png differ
diff --git a/tmp/pdfs/render/sample-final-06.png b/tmp/pdfs/render/sample-final-06.png
new file mode 100644
index 0000000..cbf94be
Binary files /dev/null and b/tmp/pdfs/render/sample-final-06.png differ
diff --git a/tmp/pdfs/render/sample-final-07.png b/tmp/pdfs/render/sample-final-07.png
new file mode 100644
index 0000000..4194e88
Binary files /dev/null and b/tmp/pdfs/render/sample-final-07.png differ
diff --git a/tmp/pdfs/render/sample-final-08.png b/tmp/pdfs/render/sample-final-08.png
new file mode 100644
index 0000000..4d389de
Binary files /dev/null and b/tmp/pdfs/render/sample-final-08.png differ
diff --git a/tmp/pdfs/render/sample-final-09.png b/tmp/pdfs/render/sample-final-09.png
new file mode 100644
index 0000000..90e7943
Binary files /dev/null and b/tmp/pdfs/render/sample-final-09.png differ
diff --git a/tmp/pdfs/render/sample-final-10.png b/tmp/pdfs/render/sample-final-10.png
new file mode 100644
index 0000000..cd5dca0
Binary files /dev/null and b/tmp/pdfs/render/sample-final-10.png differ
diff --git a/tmp/pdfs/render/sample-final-11.png b/tmp/pdfs/render/sample-final-11.png
new file mode 100644
index 0000000..1bc048f
Binary files /dev/null and b/tmp/pdfs/render/sample-final-11.png differ
diff --git a/tmp/pdfs/render/sample-final-12.png b/tmp/pdfs/render/sample-final-12.png
new file mode 100644
index 0000000..eda1a45
Binary files /dev/null and b/tmp/pdfs/render/sample-final-12.png differ
diff --git a/tmp/pdfs/render/sample-final-13.png b/tmp/pdfs/render/sample-final-13.png
new file mode 100644
index 0000000..263ed91
Binary files /dev/null and b/tmp/pdfs/render/sample-final-13.png differ
diff --git a/tmp/pdfs/render/sample-final-14.png b/tmp/pdfs/render/sample-final-14.png
new file mode 100644
index 0000000..9449250
Binary files /dev/null and b/tmp/pdfs/render/sample-final-14.png differ
diff --git a/tmp/pdfs/render/sample-final-15.png b/tmp/pdfs/render/sample-final-15.png
new file mode 100644
index 0000000..df2f968
Binary files /dev/null and b/tmp/pdfs/render/sample-final-15.png differ
diff --git a/tmp/pdfs/render/sample-final-16.png b/tmp/pdfs/render/sample-final-16.png
new file mode 100644
index 0000000..c1e8e89
Binary files /dev/null and b/tmp/pdfs/render/sample-final-16.png differ
diff --git a/tmp/pdfs/render/sample-final-17.png b/tmp/pdfs/render/sample-final-17.png
new file mode 100644
index 0000000..6d20e99
Binary files /dev/null and b/tmp/pdfs/render/sample-final-17.png differ
diff --git a/tmp/pdfs/render/sample-final-18.png b/tmp/pdfs/render/sample-final-18.png
new file mode 100644
index 0000000..6fbf4a7
Binary files /dev/null and b/tmp/pdfs/render/sample-final-18.png differ
diff --git a/tmp/pdfs/render/sample-final-19.png b/tmp/pdfs/render/sample-final-19.png
new file mode 100644
index 0000000..895b703
Binary files /dev/null and b/tmp/pdfs/render/sample-final-19.png differ
diff --git a/tmp/pdfs/render/sample-final-20.png b/tmp/pdfs/render/sample-final-20.png
new file mode 100644
index 0000000..bf9c6a1
Binary files /dev/null and b/tmp/pdfs/render/sample-final-20.png differ
diff --git a/tmp/pdfs/render/trial-final-02.png b/tmp/pdfs/render/trial-final-02.png
new file mode 100644
index 0000000..280ffcf
Binary files /dev/null and b/tmp/pdfs/render/trial-final-02.png differ
diff --git a/tmp/pdfs/render/week1-01.png b/tmp/pdfs/render/week1-01.png
new file mode 100644
index 0000000..0b3f952
Binary files /dev/null and b/tmp/pdfs/render/week1-01.png differ
diff --git a/tmp/pdfs/render/week1-02.png b/tmp/pdfs/render/week1-02.png
new file mode 100644
index 0000000..3cf47d1
Binary files /dev/null and b/tmp/pdfs/render/week1-02.png differ
diff --git a/tmp/pdfs/render/week1-03.png b/tmp/pdfs/render/week1-03.png
new file mode 100644
index 0000000..455aa7a
Binary files /dev/null and b/tmp/pdfs/render/week1-03.png differ
diff --git a/tmp/pdfs/render/week1-04.png b/tmp/pdfs/render/week1-04.png
new file mode 100644
index 0000000..8805cd8
Binary files /dev/null and b/tmp/pdfs/render/week1-04.png differ
diff --git a/tmp/pdfs/render/week1-05.png b/tmp/pdfs/render/week1-05.png
new file mode 100644
index 0000000..359772f
Binary files /dev/null and b/tmp/pdfs/render/week1-05.png differ
diff --git a/tmp/pdfs/render/week1-06.png b/tmp/pdfs/render/week1-06.png
new file mode 100644
index 0000000..fd777ad
Binary files /dev/null and b/tmp/pdfs/render/week1-06.png differ
diff --git a/tmp/pdfs/render/week1-07.png b/tmp/pdfs/render/week1-07.png
new file mode 100644
index 0000000..0149c36
Binary files /dev/null and b/tmp/pdfs/render/week1-07.png differ
diff --git a/tmp/pdfs/render/week1-08.png b/tmp/pdfs/render/week1-08.png
new file mode 100644
index 0000000..86f528f
Binary files /dev/null and b/tmp/pdfs/render/week1-08.png differ
diff --git a/tmp/pdfs/render/week1-09.png b/tmp/pdfs/render/week1-09.png
new file mode 100644
index 0000000..e8f57f5
Binary files /dev/null and b/tmp/pdfs/render/week1-09.png differ
diff --git a/tmp/pdfs/render/week1-10.png b/tmp/pdfs/render/week1-10.png
new file mode 100644
index 0000000..92186d0
Binary files /dev/null and b/tmp/pdfs/render/week1-10.png differ
diff --git a/tmp/pdfs/render/week1-11.png b/tmp/pdfs/render/week1-11.png
new file mode 100644
index 0000000..6a23094
Binary files /dev/null and b/tmp/pdfs/render/week1-11.png differ
diff --git a/tmp/pdfs/render/week1-12.png b/tmp/pdfs/render/week1-12.png
new file mode 100644
index 0000000..9a6e640
Binary files /dev/null and b/tmp/pdfs/render/week1-12.png differ
diff --git a/tmp/pdfs/render/week1-13.png b/tmp/pdfs/render/week1-13.png
new file mode 100644
index 0000000..5752bdd
Binary files /dev/null and b/tmp/pdfs/render/week1-13.png differ
diff --git a/tmp/pdfs/render/week1-14.png b/tmp/pdfs/render/week1-14.png
new file mode 100644
index 0000000..6a5e1c9
Binary files /dev/null and b/tmp/pdfs/render/week1-14.png differ
diff --git a/tmp/pdfs/render/week1-15.png b/tmp/pdfs/render/week1-15.png
new file mode 100644
index 0000000..3c90537
Binary files /dev/null and b/tmp/pdfs/render/week1-15.png differ
diff --git a/tmp/pdfs/render/week1-16.png b/tmp/pdfs/render/week1-16.png
new file mode 100644
index 0000000..8b7df70
Binary files /dev/null and b/tmp/pdfs/render/week1-16.png differ
diff --git a/tmp/pdfs/render/week1-17.png b/tmp/pdfs/render/week1-17.png
new file mode 100644
index 0000000..c3fa90c
Binary files /dev/null and b/tmp/pdfs/render/week1-17.png differ
diff --git a/tmp/pdfs/render/week1-18.png b/tmp/pdfs/render/week1-18.png
new file mode 100644
index 0000000..50166ce
Binary files /dev/null and b/tmp/pdfs/render/week1-18.png differ
diff --git a/tmp/pdfs/render/week1-19.png b/tmp/pdfs/render/week1-19.png
new file mode 100644
index 0000000..5204693
Binary files /dev/null and b/tmp/pdfs/render/week1-19.png differ
diff --git a/tmp/pdfs/render/week1-20.png b/tmp/pdfs/render/week1-20.png
new file mode 100644
index 0000000..808c0b2
Binary files /dev/null and b/tmp/pdfs/render/week1-20.png differ
diff --git a/tmp/pdfs/render/week1-21.png b/tmp/pdfs/render/week1-21.png
new file mode 100644
index 0000000..f93a1ec
Binary files /dev/null and b/tmp/pdfs/render/week1-21.png differ
diff --git a/tmp/pdfs/render/week1-22.png b/tmp/pdfs/render/week1-22.png
new file mode 100644
index 0000000..b1d85af
Binary files /dev/null and b/tmp/pdfs/render/week1-22.png differ
diff --git a/tmp/pdfs/render/week1-23.png b/tmp/pdfs/render/week1-23.png
new file mode 100644
index 0000000..b9aaf3c
Binary files /dev/null and b/tmp/pdfs/render/week1-23.png differ
diff --git a/tmp/pdfs/render/week1-24.png b/tmp/pdfs/render/week1-24.png
new file mode 100644
index 0000000..d7c3100
Binary files /dev/null and b/tmp/pdfs/render/week1-24.png differ
diff --git a/tmp/pdfs/render/week1-25.png b/tmp/pdfs/render/week1-25.png
new file mode 100644
index 0000000..9960300
Binary files /dev/null and b/tmp/pdfs/render/week1-25.png differ
diff --git a/tmp/pdfs/render/week1-26.png b/tmp/pdfs/render/week1-26.png
new file mode 100644
index 0000000..8c1c53d
Binary files /dev/null and b/tmp/pdfs/render/week1-26.png differ
diff --git a/tmp/pdfs/render/week1-27.png b/tmp/pdfs/render/week1-27.png
new file mode 100644
index 0000000..aa9eda5
Binary files /dev/null and b/tmp/pdfs/render/week1-27.png differ
diff --git a/tmp/pdfs/render/week1-28.png b/tmp/pdfs/render/week1-28.png
new file mode 100644
index 0000000..6b0be53
Binary files /dev/null and b/tmp/pdfs/render/week1-28.png differ
diff --git a/tmp/pdfs/render/week1-29.png b/tmp/pdfs/render/week1-29.png
new file mode 100644
index 0000000..e088bb5
Binary files /dev/null and b/tmp/pdfs/render/week1-29.png differ
diff --git a/tmp/pdfs/render/week1-30.png b/tmp/pdfs/render/week1-30.png
new file mode 100644
index 0000000..9b9f00c
Binary files /dev/null and b/tmp/pdfs/render/week1-30.png differ
diff --git a/tmp/pdfs/render/week1-31.png b/tmp/pdfs/render/week1-31.png
new file mode 100644
index 0000000..7842ef3
Binary files /dev/null and b/tmp/pdfs/render/week1-31.png differ
diff --git a/tmp/pdfs/render/week1-32.png b/tmp/pdfs/render/week1-32.png
new file mode 100644
index 0000000..85da389
Binary files /dev/null and b/tmp/pdfs/render/week1-32.png differ
diff --git a/tmp/pdfs/render/week1-33.png b/tmp/pdfs/render/week1-33.png
new file mode 100644
index 0000000..a028b08
Binary files /dev/null and b/tmp/pdfs/render/week1-33.png differ
diff --git a/tmp/pdfs/render/week1-34.png b/tmp/pdfs/render/week1-34.png
new file mode 100644
index 0000000..696207c
Binary files /dev/null and b/tmp/pdfs/render/week1-34.png differ
diff --git a/tmp/pdfs/render/week1-35.png b/tmp/pdfs/render/week1-35.png
new file mode 100644
index 0000000..2c35d36
Binary files /dev/null and b/tmp/pdfs/render/week1-35.png differ
diff --git a/tmp/pdfs/render/week1-36.png b/tmp/pdfs/render/week1-36.png
new file mode 100644
index 0000000..264e4e2
Binary files /dev/null and b/tmp/pdfs/render/week1-36.png differ
diff --git a/tmp/pdfs/render/week1-37.png b/tmp/pdfs/render/week1-37.png
new file mode 100644
index 0000000..1a3c3e5
Binary files /dev/null and b/tmp/pdfs/render/week1-37.png differ
diff --git a/tmp/pdfs/render/week1-38.png b/tmp/pdfs/render/week1-38.png
new file mode 100644
index 0000000..032caf2
Binary files /dev/null and b/tmp/pdfs/render/week1-38.png differ
diff --git a/tmp/pdfs/render/week1-39.png b/tmp/pdfs/render/week1-39.png
new file mode 100644
index 0000000..653b813
Binary files /dev/null and b/tmp/pdfs/render/week1-39.png differ
diff --git a/tmp/pdfs/render/week1-40.png b/tmp/pdfs/render/week1-40.png
new file mode 100644
index 0000000..2a27f80
Binary files /dev/null and b/tmp/pdfs/render/week1-40.png differ
diff --git a/tmp/pdfs/render/week1x-56.png b/tmp/pdfs/render/week1x-56.png
new file mode 100644
index 0000000..2e58130
Binary files /dev/null and b/tmp/pdfs/render/week1x-56.png differ
diff --git a/tmp/pdfs/render/week1x-57.png b/tmp/pdfs/render/week1x-57.png
new file mode 100644
index 0000000..2ca2658
Binary files /dev/null and b/tmp/pdfs/render/week1x-57.png differ
diff --git a/tmp/pdfs/render/week4-01.png b/tmp/pdfs/render/week4-01.png
new file mode 100644
index 0000000..b1978ec
Binary files /dev/null and b/tmp/pdfs/render/week4-01.png differ
diff --git a/tmp/pdfs/render/week4-02.png b/tmp/pdfs/render/week4-02.png
new file mode 100644
index 0000000..e012eb2
Binary files /dev/null and b/tmp/pdfs/render/week4-02.png differ
diff --git a/tmp/pdfs/render/week4-03.png b/tmp/pdfs/render/week4-03.png
new file mode 100644
index 0000000..a71cab6
Binary files /dev/null and b/tmp/pdfs/render/week4-03.png differ
diff --git a/tmp/pdfs/render/week4-04.png b/tmp/pdfs/render/week4-04.png
new file mode 100644
index 0000000..3177c9d
Binary files /dev/null and b/tmp/pdfs/render/week4-04.png differ
diff --git a/tmp/pdfs/render/week4-05.png b/tmp/pdfs/render/week4-05.png
new file mode 100644
index 0000000..0617c27
Binary files /dev/null and b/tmp/pdfs/render/week4-05.png differ
diff --git a/tmp/pdfs/render/week4-06.png b/tmp/pdfs/render/week4-06.png
new file mode 100644
index 0000000..887b5c0
Binary files /dev/null and b/tmp/pdfs/render/week4-06.png differ
diff --git a/tmp/pdfs/render/week4-07.png b/tmp/pdfs/render/week4-07.png
new file mode 100644
index 0000000..43845d0
Binary files /dev/null and b/tmp/pdfs/render/week4-07.png differ
diff --git a/tmp/pdfs/render/week4-08.png b/tmp/pdfs/render/week4-08.png
new file mode 100644
index 0000000..edcbaa8
Binary files /dev/null and b/tmp/pdfs/render/week4-08.png differ
diff --git a/tmp/pdfs/render/week4-09.png b/tmp/pdfs/render/week4-09.png
new file mode 100644
index 0000000..a01a311
Binary files /dev/null and b/tmp/pdfs/render/week4-09.png differ
diff --git a/tmp/pdfs/render/week4-10.png b/tmp/pdfs/render/week4-10.png
new file mode 100644
index 0000000..19bdf11
Binary files /dev/null and b/tmp/pdfs/render/week4-10.png differ
diff --git a/tmp/pdfs/render/week4-11.png b/tmp/pdfs/render/week4-11.png
new file mode 100644
index 0000000..666860b
Binary files /dev/null and b/tmp/pdfs/render/week4-11.png differ
diff --git a/tmp/pdfs/render/week4-12.png b/tmp/pdfs/render/week4-12.png
new file mode 100644
index 0000000..ae21ba2
Binary files /dev/null and b/tmp/pdfs/render/week4-12.png differ
diff --git a/tmp/pdfs/render/week4-13.png b/tmp/pdfs/render/week4-13.png
new file mode 100644
index 0000000..8eeba14
Binary files /dev/null and b/tmp/pdfs/render/week4-13.png differ
diff --git a/tmp/pdfs/render/week4-14.png b/tmp/pdfs/render/week4-14.png
new file mode 100644
index 0000000..794d30a
Binary files /dev/null and b/tmp/pdfs/render/week4-14.png differ
diff --git a/tmp/pdfs/render/week4-15.png b/tmp/pdfs/render/week4-15.png
new file mode 100644
index 0000000..1700bee
Binary files /dev/null and b/tmp/pdfs/render/week4-15.png differ
diff --git a/tmp/pdfs/render/week4-16.png b/tmp/pdfs/render/week4-16.png
new file mode 100644
index 0000000..7ccf56f
Binary files /dev/null and b/tmp/pdfs/render/week4-16.png differ
diff --git a/tmp/pdfs/render/week4-17.png b/tmp/pdfs/render/week4-17.png
new file mode 100644
index 0000000..9338f92
Binary files /dev/null and b/tmp/pdfs/render/week4-17.png differ
diff --git a/tmp/pdfs/render/week4-18.png b/tmp/pdfs/render/week4-18.png
new file mode 100644
index 0000000..5d26cbc
Binary files /dev/null and b/tmp/pdfs/render/week4-18.png differ
diff --git a/tmp/pdfs/render/week4-19.png b/tmp/pdfs/render/week4-19.png
new file mode 100644
index 0000000..8b65130
Binary files /dev/null and b/tmp/pdfs/render/week4-19.png differ
diff --git a/tmp/pdfs/render/week4-20.png b/tmp/pdfs/render/week4-20.png
new file mode 100644
index 0000000..5f4e557
Binary files /dev/null and b/tmp/pdfs/render/week4-20.png differ
diff --git a/tmp/pdfs/render/week4-21.png b/tmp/pdfs/render/week4-21.png
new file mode 100644
index 0000000..c8f448a
Binary files /dev/null and b/tmp/pdfs/render/week4-21.png differ
diff --git a/tmp/pdfs/render/week4-22.png b/tmp/pdfs/render/week4-22.png
new file mode 100644
index 0000000..63d3805
Binary files /dev/null and b/tmp/pdfs/render/week4-22.png differ
diff --git a/tmp/pdfs/render/week4-23.png b/tmp/pdfs/render/week4-23.png
new file mode 100644
index 0000000..7845758
Binary files /dev/null and b/tmp/pdfs/render/week4-23.png differ
diff --git a/tmp/pdfs/render/week4-24.png b/tmp/pdfs/render/week4-24.png
new file mode 100644
index 0000000..554a60a
Binary files /dev/null and b/tmp/pdfs/render/week4-24.png differ
diff --git a/tmp/pdfs/render/week4-25.png b/tmp/pdfs/render/week4-25.png
new file mode 100644
index 0000000..3edf4f3
Binary files /dev/null and b/tmp/pdfs/render/week4-25.png differ
diff --git a/tmp/pdfs/render/week4-26.png b/tmp/pdfs/render/week4-26.png
new file mode 100644
index 0000000..fbad4a0
Binary files /dev/null and b/tmp/pdfs/render/week4-26.png differ
diff --git a/tmp/pdfs/render/week4-27.png b/tmp/pdfs/render/week4-27.png
new file mode 100644
index 0000000..9e35764
Binary files /dev/null and b/tmp/pdfs/render/week4-27.png differ
diff --git a/tmp/pdfs/render/week4-28.png b/tmp/pdfs/render/week4-28.png
new file mode 100644
index 0000000..c158ed1
Binary files /dev/null and b/tmp/pdfs/render/week4-28.png differ
diff --git a/tmp/pdfs/render/week4-29.png b/tmp/pdfs/render/week4-29.png
new file mode 100644
index 0000000..fce8a60
Binary files /dev/null and b/tmp/pdfs/render/week4-29.png differ
diff --git a/tmp/pdfs/render/week4-30.png b/tmp/pdfs/render/week4-30.png
new file mode 100644
index 0000000..702d5da
Binary files /dev/null and b/tmp/pdfs/render/week4-30.png differ
diff --git a/tmp/pdfs/render/week4-31.png b/tmp/pdfs/render/week4-31.png
new file mode 100644
index 0000000..0171519
Binary files /dev/null and b/tmp/pdfs/render/week4-31.png differ
diff --git a/tmp/pdfs/render/week4-32.png b/tmp/pdfs/render/week4-32.png
new file mode 100644
index 0000000..619e718
Binary files /dev/null and b/tmp/pdfs/render/week4-32.png differ
diff --git a/tmp/pdfs/render/week4-33.png b/tmp/pdfs/render/week4-33.png
new file mode 100644
index 0000000..9d765d4
Binary files /dev/null and b/tmp/pdfs/render/week4-33.png differ
diff --git a/tmp/pdfs/render/week4-34.png b/tmp/pdfs/render/week4-34.png
new file mode 100644
index 0000000..89c4e31
Binary files /dev/null and b/tmp/pdfs/render/week4-34.png differ
diff --git a/tmp/pdfs/render/week4-35.png b/tmp/pdfs/render/week4-35.png
new file mode 100644
index 0000000..3c6dda4
Binary files /dev/null and b/tmp/pdfs/render/week4-35.png differ
diff --git a/tmp/pdfs/render/week4-36.png b/tmp/pdfs/render/week4-36.png
new file mode 100644
index 0000000..67dd160
Binary files /dev/null and b/tmp/pdfs/render/week4-36.png differ
diff --git a/tmp/pdfs/render/week4-37.png b/tmp/pdfs/render/week4-37.png
new file mode 100644
index 0000000..7a9a1e9
Binary files /dev/null and b/tmp/pdfs/render/week4-37.png differ
diff --git a/tmp/pdfs/render/week4-38.png b/tmp/pdfs/render/week4-38.png
new file mode 100644
index 0000000..d3e2990
Binary files /dev/null and b/tmp/pdfs/render/week4-38.png differ
diff --git a/tmp/pdfs/render/week4-39.png b/tmp/pdfs/render/week4-39.png
new file mode 100644
index 0000000..377e4aa
Binary files /dev/null and b/tmp/pdfs/render/week4-39.png differ
diff --git a/tmp/pdfs/render/week4-40.png b/tmp/pdfs/render/week4-40.png
new file mode 100644
index 0000000..bf6d830
Binary files /dev/null and b/tmp/pdfs/render/week4-40.png differ
diff --git a/tmp/pdfs/render/week4x-44.png b/tmp/pdfs/render/week4x-44.png
new file mode 100644
index 0000000..b6f2f1e
Binary files /dev/null and b/tmp/pdfs/render/week4x-44.png differ
diff --git a/tmp/pdfs/render/week4x-45.png b/tmp/pdfs/render/week4x-45.png
new file mode 100644
index 0000000..b61e63c
Binary files /dev/null and b/tmp/pdfs/render/week4x-45.png differ
diff --git a/tmp/pdfs/render/week4x-46.png b/tmp/pdfs/render/week4x-46.png
new file mode 100644
index 0000000..4cc4a87
Binary files /dev/null and b/tmp/pdfs/render/week4x-46.png differ
diff --git a/tmp/pdfs/render/week5-01.png b/tmp/pdfs/render/week5-01.png
new file mode 100644
index 0000000..5a60f6f
Binary files /dev/null and b/tmp/pdfs/render/week5-01.png differ
diff --git a/tmp/pdfs/render/week5-02.png b/tmp/pdfs/render/week5-02.png
new file mode 100644
index 0000000..07b441b
Binary files /dev/null and b/tmp/pdfs/render/week5-02.png differ
diff --git a/tmp/pdfs/render/week5-03.png b/tmp/pdfs/render/week5-03.png
new file mode 100644
index 0000000..ef3948c
Binary files /dev/null and b/tmp/pdfs/render/week5-03.png differ
diff --git a/tmp/pdfs/render/week5-04.png b/tmp/pdfs/render/week5-04.png
new file mode 100644
index 0000000..5e2713e
Binary files /dev/null and b/tmp/pdfs/render/week5-04.png differ
diff --git a/tmp/pdfs/render/week5-05.png b/tmp/pdfs/render/week5-05.png
new file mode 100644
index 0000000..50ee4c3
Binary files /dev/null and b/tmp/pdfs/render/week5-05.png differ
diff --git a/tmp/pdfs/render/week5-06.png b/tmp/pdfs/render/week5-06.png
new file mode 100644
index 0000000..fc98f1b
Binary files /dev/null and b/tmp/pdfs/render/week5-06.png differ
diff --git a/tmp/pdfs/render/week5-07.png b/tmp/pdfs/render/week5-07.png
new file mode 100644
index 0000000..32838b3
Binary files /dev/null and b/tmp/pdfs/render/week5-07.png differ
diff --git a/tmp/pdfs/render/week5-08.png b/tmp/pdfs/render/week5-08.png
new file mode 100644
index 0000000..5839fe5
Binary files /dev/null and b/tmp/pdfs/render/week5-08.png differ
diff --git a/tmp/pdfs/render/week5-09.png b/tmp/pdfs/render/week5-09.png
new file mode 100644
index 0000000..63c6bef
Binary files /dev/null and b/tmp/pdfs/render/week5-09.png differ
diff --git a/tmp/pdfs/render/week5-10.png b/tmp/pdfs/render/week5-10.png
new file mode 100644
index 0000000..b058533
Binary files /dev/null and b/tmp/pdfs/render/week5-10.png differ
diff --git a/tmp/pdfs/render/week5-11.png b/tmp/pdfs/render/week5-11.png
new file mode 100644
index 0000000..6ae48fe
Binary files /dev/null and b/tmp/pdfs/render/week5-11.png differ
diff --git a/tmp/pdfs/render/week5-12.png b/tmp/pdfs/render/week5-12.png
new file mode 100644
index 0000000..132413f
Binary files /dev/null and b/tmp/pdfs/render/week5-12.png differ
diff --git a/tmp/pdfs/render/week5-13.png b/tmp/pdfs/render/week5-13.png
new file mode 100644
index 0000000..cb13402
Binary files /dev/null and b/tmp/pdfs/render/week5-13.png differ
diff --git a/tmp/pdfs/render/week5-14.png b/tmp/pdfs/render/week5-14.png
new file mode 100644
index 0000000..e939b48
Binary files /dev/null and b/tmp/pdfs/render/week5-14.png differ
diff --git a/tmp/pdfs/render/week5-15.png b/tmp/pdfs/render/week5-15.png
new file mode 100644
index 0000000..6be040d
Binary files /dev/null and b/tmp/pdfs/render/week5-15.png differ
diff --git a/tmp/pdfs/render/week5-16.png b/tmp/pdfs/render/week5-16.png
new file mode 100644
index 0000000..7476a63
Binary files /dev/null and b/tmp/pdfs/render/week5-16.png differ
diff --git a/tmp/pdfs/render/week5-17.png b/tmp/pdfs/render/week5-17.png
new file mode 100644
index 0000000..146576a
Binary files /dev/null and b/tmp/pdfs/render/week5-17.png differ
diff --git a/tmp/pdfs/render/week5-18.png b/tmp/pdfs/render/week5-18.png
new file mode 100644
index 0000000..5cf3006
Binary files /dev/null and b/tmp/pdfs/render/week5-18.png differ
diff --git a/tmp/pdfs/render/week5-19.png b/tmp/pdfs/render/week5-19.png
new file mode 100644
index 0000000..0993314
Binary files /dev/null and b/tmp/pdfs/render/week5-19.png differ
diff --git a/tmp/pdfs/render/week5-20.png b/tmp/pdfs/render/week5-20.png
new file mode 100644
index 0000000..91ca689
Binary files /dev/null and b/tmp/pdfs/render/week5-20.png differ
diff --git a/tmp/pdfs/render/week5-21.png b/tmp/pdfs/render/week5-21.png
new file mode 100644
index 0000000..4e417e9
Binary files /dev/null and b/tmp/pdfs/render/week5-21.png differ
diff --git a/tmp/pdfs/render/week5-22.png b/tmp/pdfs/render/week5-22.png
new file mode 100644
index 0000000..c49f385
Binary files /dev/null and b/tmp/pdfs/render/week5-22.png differ
diff --git a/tmp/pdfs/render/week5-23.png b/tmp/pdfs/render/week5-23.png
new file mode 100644
index 0000000..5aa6315
Binary files /dev/null and b/tmp/pdfs/render/week5-23.png differ
diff --git a/tmp/pdfs/render/week5-24.png b/tmp/pdfs/render/week5-24.png
new file mode 100644
index 0000000..9bc5872
Binary files /dev/null and b/tmp/pdfs/render/week5-24.png differ
diff --git a/tmp/pdfs/render/week5-25.png b/tmp/pdfs/render/week5-25.png
new file mode 100644
index 0000000..b548893
Binary files /dev/null and b/tmp/pdfs/render/week5-25.png differ
diff --git a/tmp/pdfs/render/week5-26.png b/tmp/pdfs/render/week5-26.png
new file mode 100644
index 0000000..42af22f
Binary files /dev/null and b/tmp/pdfs/render/week5-26.png differ
diff --git a/tmp/pdfs/render/week5-27.png b/tmp/pdfs/render/week5-27.png
new file mode 100644
index 0000000..b77a4e1
Binary files /dev/null and b/tmp/pdfs/render/week5-27.png differ
diff --git a/tmp/pdfs/render/week5-28.png b/tmp/pdfs/render/week5-28.png
new file mode 100644
index 0000000..984d8d3
Binary files /dev/null and b/tmp/pdfs/render/week5-28.png differ
diff --git a/tmp/pdfs/render/week5-29.png b/tmp/pdfs/render/week5-29.png
new file mode 100644
index 0000000..649ea04
Binary files /dev/null and b/tmp/pdfs/render/week5-29.png differ
diff --git a/tmp/pdfs/render/week5-30.png b/tmp/pdfs/render/week5-30.png
new file mode 100644
index 0000000..d2020ce
Binary files /dev/null and b/tmp/pdfs/render/week5-30.png differ
diff --git a/tmp/pdfs/render/week5-31.png b/tmp/pdfs/render/week5-31.png
new file mode 100644
index 0000000..44ae63f
Binary files /dev/null and b/tmp/pdfs/render/week5-31.png differ
diff --git a/tmp/pdfs/render/week5-32.png b/tmp/pdfs/render/week5-32.png
new file mode 100644
index 0000000..a1aeaa4
Binary files /dev/null and b/tmp/pdfs/render/week5-32.png differ
diff --git a/tmp/pdfs/render/week5-33.png b/tmp/pdfs/render/week5-33.png
new file mode 100644
index 0000000..e7760e6
Binary files /dev/null and b/tmp/pdfs/render/week5-33.png differ
diff --git a/tmp/pdfs/render/week5-34.png b/tmp/pdfs/render/week5-34.png
new file mode 100644
index 0000000..f30fe37
Binary files /dev/null and b/tmp/pdfs/render/week5-34.png differ
diff --git a/tmp/pdfs/render/week5-35.png b/tmp/pdfs/render/week5-35.png
new file mode 100644
index 0000000..c3e329f
Binary files /dev/null and b/tmp/pdfs/render/week5-35.png differ
diff --git a/tmp/pdfs/render/week5-36.png b/tmp/pdfs/render/week5-36.png
new file mode 100644
index 0000000..e7c469d
Binary files /dev/null and b/tmp/pdfs/render/week5-36.png differ
diff --git a/tmp/pdfs/render/week5-37.png b/tmp/pdfs/render/week5-37.png
new file mode 100644
index 0000000..986a7df
Binary files /dev/null and b/tmp/pdfs/render/week5-37.png differ
diff --git a/tmp/pdfs/render/week5-38.png b/tmp/pdfs/render/week5-38.png
new file mode 100644
index 0000000..62f3a16
Binary files /dev/null and b/tmp/pdfs/render/week5-38.png differ
diff --git a/tmp/pdfs/render/week5-39.png b/tmp/pdfs/render/week5-39.png
new file mode 100644
index 0000000..c6e8ef7
Binary files /dev/null and b/tmp/pdfs/render/week5-39.png differ
diff --git a/tmp/pdfs/render/week5-40.png b/tmp/pdfs/render/week5-40.png
new file mode 100644
index 0000000..f5d3f56
Binary files /dev/null and b/tmp/pdfs/render/week5-40.png differ
diff --git a/tmp/pdfs/render/week5x-41.png b/tmp/pdfs/render/week5x-41.png
new file mode 100644
index 0000000..0c38ef2
Binary files /dev/null and b/tmp/pdfs/render/week5x-41.png differ
diff --git a/tmp/pdfs/render/week5x-42.png b/tmp/pdfs/render/week5x-42.png
new file mode 100644
index 0000000..86807f5
Binary files /dev/null and b/tmp/pdfs/render/week5x-42.png differ
diff --git a/tmp/pdfs/render/week5x-43.png b/tmp/pdfs/render/week5x-43.png
new file mode 100644
index 0000000..8a728e6
Binary files /dev/null and b/tmp/pdfs/render/week5x-43.png differ
diff --git a/tmp/pdfs/render/week5x-44.png b/tmp/pdfs/render/week5x-44.png
new file mode 100644
index 0000000..21edd0b
Binary files /dev/null and b/tmp/pdfs/render/week5x-44.png differ
diff --git a/tmp/pdfs/render/week5x-45.png b/tmp/pdfs/render/week5x-45.png
new file mode 100644
index 0000000..1e067af
Binary files /dev/null and b/tmp/pdfs/render/week5x-45.png differ
diff --git a/tmp/pdfs/render/week5x-46.png b/tmp/pdfs/render/week5x-46.png
new file mode 100644
index 0000000..b96dfa6
Binary files /dev/null and b/tmp/pdfs/render/week5x-46.png differ
diff --git a/tmp/pdfs/render/week5x-47.png b/tmp/pdfs/render/week5x-47.png
new file mode 100644
index 0000000..2fafc2a
Binary files /dev/null and b/tmp/pdfs/render/week5x-47.png differ
diff --git a/tmp/pdfs/render/week5x-48.png b/tmp/pdfs/render/week5x-48.png
new file mode 100644
index 0000000..4961dce
Binary files /dev/null and b/tmp/pdfs/render/week5x-48.png differ
diff --git a/tmp/pdfs/render/week5x-49.png b/tmp/pdfs/render/week5x-49.png
new file mode 100644
index 0000000..3c981d6
Binary files /dev/null and b/tmp/pdfs/render/week5x-49.png differ
diff --git a/tmp/pdfs/render/week5x-50.png b/tmp/pdfs/render/week5x-50.png
new file mode 100644
index 0000000..c2a764a
Binary files /dev/null and b/tmp/pdfs/render/week5x-50.png differ
diff --git a/tmp/pdfs/render/week5x-51.png b/tmp/pdfs/render/week5x-51.png
new file mode 100644
index 0000000..1c25245
Binary files /dev/null and b/tmp/pdfs/render/week5x-51.png differ
diff --git a/tmp/pdfs/render/week5x-52.png b/tmp/pdfs/render/week5x-52.png
new file mode 100644
index 0000000..1a59d17
Binary files /dev/null and b/tmp/pdfs/render/week5x-52.png differ
diff --git a/tmp/pdfs/render/week5x-53.png b/tmp/pdfs/render/week5x-53.png
new file mode 100644
index 0000000..27831dd
Binary files /dev/null and b/tmp/pdfs/render/week5x-53.png differ
diff --git a/tmp/pdfs/render/week5x-54.png b/tmp/pdfs/render/week5x-54.png
new file mode 100644
index 0000000..252140d
Binary files /dev/null and b/tmp/pdfs/render/week5x-54.png differ
diff --git a/tmp/pdfs/render/week5x-55.png b/tmp/pdfs/render/week5x-55.png
new file mode 100644
index 0000000..d519c9c
Binary files /dev/null and b/tmp/pdfs/render/week5x-55.png differ
diff --git a/tmp/pdfs/render/week5x-56.png b/tmp/pdfs/render/week5x-56.png
new file mode 100644
index 0000000..7845fd1
Binary files /dev/null and b/tmp/pdfs/render/week5x-56.png differ
diff --git a/tmp/pdfs/render/week5x-57.png b/tmp/pdfs/render/week5x-57.png
new file mode 100644
index 0000000..8393adb
Binary files /dev/null and b/tmp/pdfs/render/week5x-57.png differ
diff --git a/tmp/pdfs/render/week5x-58.png b/tmp/pdfs/render/week5x-58.png
new file mode 100644
index 0000000..aeb891d
Binary files /dev/null and b/tmp/pdfs/render/week5x-58.png differ
diff --git a/tmp/pdfs/render/week5x-59.png b/tmp/pdfs/render/week5x-59.png
new file mode 100644
index 0000000..7d56710
Binary files /dev/null and b/tmp/pdfs/render/week5x-59.png differ
diff --git a/tmp/pdfs/render/week5x-60.png b/tmp/pdfs/render/week5x-60.png
new file mode 100644
index 0000000..f2043a0
Binary files /dev/null and b/tmp/pdfs/render/week5x-60.png differ
diff --git a/tmp/pdfs/render/week5x-61.png b/tmp/pdfs/render/week5x-61.png
new file mode 100644
index 0000000..1142c44
Binary files /dev/null and b/tmp/pdfs/render/week5x-61.png differ
diff --git a/tmp/pdfs/render/week5x-62.png b/tmp/pdfs/render/week5x-62.png
new file mode 100644
index 0000000..874ad85
Binary files /dev/null and b/tmp/pdfs/render/week5x-62.png differ
diff --git a/tmp/pdfs/render/week5x-63.png b/tmp/pdfs/render/week5x-63.png
new file mode 100644
index 0000000..a1bc691
Binary files /dev/null and b/tmp/pdfs/render/week5x-63.png differ
diff --git a/tmp/pdfs/render/week5x-64.png b/tmp/pdfs/render/week5x-64.png
new file mode 100644
index 0000000..320c1ba
Binary files /dev/null and b/tmp/pdfs/render/week5x-64.png differ
diff --git a/tmp/pdfs/render/week5x-65.png b/tmp/pdfs/render/week5x-65.png
new file mode 100644
index 0000000..27a01f2
Binary files /dev/null and b/tmp/pdfs/render/week5x-65.png differ
diff --git a/tmp/pdfs/render/week5x-66.png b/tmp/pdfs/render/week5x-66.png
new file mode 100644
index 0000000..37de0fd
Binary files /dev/null and b/tmp/pdfs/render/week5x-66.png differ
diff --git a/tmp/pdfs/render/week6-01.png b/tmp/pdfs/render/week6-01.png
new file mode 100644
index 0000000..863812d
Binary files /dev/null and b/tmp/pdfs/render/week6-01.png differ
diff --git a/tmp/pdfs/render/week6-02.png b/tmp/pdfs/render/week6-02.png
new file mode 100644
index 0000000..164522e
Binary files /dev/null and b/tmp/pdfs/render/week6-02.png differ
diff --git a/tmp/pdfs/render/week6-03.png b/tmp/pdfs/render/week6-03.png
new file mode 100644
index 0000000..087a42f
Binary files /dev/null and b/tmp/pdfs/render/week6-03.png differ
diff --git a/tmp/pdfs/render/week6-04.png b/tmp/pdfs/render/week6-04.png
new file mode 100644
index 0000000..c011220
Binary files /dev/null and b/tmp/pdfs/render/week6-04.png differ
diff --git a/tmp/pdfs/render/week6-05.png b/tmp/pdfs/render/week6-05.png
new file mode 100644
index 0000000..4c22345
Binary files /dev/null and b/tmp/pdfs/render/week6-05.png differ
diff --git a/tmp/pdfs/render/week6-06.png b/tmp/pdfs/render/week6-06.png
new file mode 100644
index 0000000..5c3d76c
Binary files /dev/null and b/tmp/pdfs/render/week6-06.png differ
diff --git a/tmp/pdfs/render/week6-07.png b/tmp/pdfs/render/week6-07.png
new file mode 100644
index 0000000..f1645ab
Binary files /dev/null and b/tmp/pdfs/render/week6-07.png differ
diff --git a/tmp/pdfs/render/week6-08.png b/tmp/pdfs/render/week6-08.png
new file mode 100644
index 0000000..fc10061
Binary files /dev/null and b/tmp/pdfs/render/week6-08.png differ
diff --git a/tmp/pdfs/render/week6-09.png b/tmp/pdfs/render/week6-09.png
new file mode 100644
index 0000000..4f34d0b
Binary files /dev/null and b/tmp/pdfs/render/week6-09.png differ
diff --git a/tmp/pdfs/render/week6-10.png b/tmp/pdfs/render/week6-10.png
new file mode 100644
index 0000000..72590aa
Binary files /dev/null and b/tmp/pdfs/render/week6-10.png differ
diff --git a/tmp/pdfs/render/week6-11.png b/tmp/pdfs/render/week6-11.png
new file mode 100644
index 0000000..babbd27
Binary files /dev/null and b/tmp/pdfs/render/week6-11.png differ
diff --git a/tmp/pdfs/render/week6-12.png b/tmp/pdfs/render/week6-12.png
new file mode 100644
index 0000000..c86373b
Binary files /dev/null and b/tmp/pdfs/render/week6-12.png differ
diff --git a/tmp/pdfs/render/week6-13.png b/tmp/pdfs/render/week6-13.png
new file mode 100644
index 0000000..dcdf498
Binary files /dev/null and b/tmp/pdfs/render/week6-13.png differ
diff --git a/tmp/pdfs/render/week6-14.png b/tmp/pdfs/render/week6-14.png
new file mode 100644
index 0000000..eaef28f
Binary files /dev/null and b/tmp/pdfs/render/week6-14.png differ
diff --git a/tmp/pdfs/render/week6-15.png b/tmp/pdfs/render/week6-15.png
new file mode 100644
index 0000000..8fdcc98
Binary files /dev/null and b/tmp/pdfs/render/week6-15.png differ
diff --git a/tmp/pdfs/render/week6-16.png b/tmp/pdfs/render/week6-16.png
new file mode 100644
index 0000000..8dd4418
Binary files /dev/null and b/tmp/pdfs/render/week6-16.png differ
diff --git a/tmp/pdfs/render/week6-17.png b/tmp/pdfs/render/week6-17.png
new file mode 100644
index 0000000..687c61e
Binary files /dev/null and b/tmp/pdfs/render/week6-17.png differ
diff --git a/tmp/pdfs/render/week6-18.png b/tmp/pdfs/render/week6-18.png
new file mode 100644
index 0000000..cc01669
Binary files /dev/null and b/tmp/pdfs/render/week6-18.png differ
diff --git a/tmp/pdfs/render/week6-19.png b/tmp/pdfs/render/week6-19.png
new file mode 100644
index 0000000..9587b2e
Binary files /dev/null and b/tmp/pdfs/render/week6-19.png differ
diff --git a/tmp/pdfs/render/week6-20.png b/tmp/pdfs/render/week6-20.png
new file mode 100644
index 0000000..d8d50ec
Binary files /dev/null and b/tmp/pdfs/render/week6-20.png differ
diff --git a/tmp/pdfs/render/week6-21.png b/tmp/pdfs/render/week6-21.png
new file mode 100644
index 0000000..d25a601
Binary files /dev/null and b/tmp/pdfs/render/week6-21.png differ
diff --git a/tmp/pdfs/render/week6-22.png b/tmp/pdfs/render/week6-22.png
new file mode 100644
index 0000000..aaf36b7
Binary files /dev/null and b/tmp/pdfs/render/week6-22.png differ
diff --git a/tmp/pdfs/render/week6-23.png b/tmp/pdfs/render/week6-23.png
new file mode 100644
index 0000000..aa0dfdc
Binary files /dev/null and b/tmp/pdfs/render/week6-23.png differ
diff --git a/tmp/pdfs/render/week6-24.png b/tmp/pdfs/render/week6-24.png
new file mode 100644
index 0000000..f188395
Binary files /dev/null and b/tmp/pdfs/render/week6-24.png differ
diff --git a/tmp/pdfs/render/week6-25.png b/tmp/pdfs/render/week6-25.png
new file mode 100644
index 0000000..20adab3
Binary files /dev/null and b/tmp/pdfs/render/week6-25.png differ
diff --git a/tmp/pdfs/render/week6-26.png b/tmp/pdfs/render/week6-26.png
new file mode 100644
index 0000000..f42f56c
Binary files /dev/null and b/tmp/pdfs/render/week6-26.png differ
diff --git a/tmp/pdfs/render/week6-27.png b/tmp/pdfs/render/week6-27.png
new file mode 100644
index 0000000..ba95686
Binary files /dev/null and b/tmp/pdfs/render/week6-27.png differ
diff --git a/tmp/pdfs/render/week6-28.png b/tmp/pdfs/render/week6-28.png
new file mode 100644
index 0000000..d65386a
Binary files /dev/null and b/tmp/pdfs/render/week6-28.png differ
diff --git a/tmp/pdfs/render/week6-29.png b/tmp/pdfs/render/week6-29.png
new file mode 100644
index 0000000..c3e2fd0
Binary files /dev/null and b/tmp/pdfs/render/week6-29.png differ
diff --git a/tmp/pdfs/render/week6-30.png b/tmp/pdfs/render/week6-30.png
new file mode 100644
index 0000000..20a6845
Binary files /dev/null and b/tmp/pdfs/render/week6-30.png differ
diff --git a/tmp/pdfs/render/week6-31.png b/tmp/pdfs/render/week6-31.png
new file mode 100644
index 0000000..b559f58
Binary files /dev/null and b/tmp/pdfs/render/week6-31.png differ
diff --git a/tmp/pdfs/render/week6-32.png b/tmp/pdfs/render/week6-32.png
new file mode 100644
index 0000000..94645af
Binary files /dev/null and b/tmp/pdfs/render/week6-32.png differ
diff --git a/tmp/pdfs/render/week6-33.png b/tmp/pdfs/render/week6-33.png
new file mode 100644
index 0000000..2ed90d5
Binary files /dev/null and b/tmp/pdfs/render/week6-33.png differ
diff --git a/tmp/pdfs/render/week6-34.png b/tmp/pdfs/render/week6-34.png
new file mode 100644
index 0000000..b3b43bf
Binary files /dev/null and b/tmp/pdfs/render/week6-34.png differ
diff --git a/tmp/pdfs/render/week6-35.png b/tmp/pdfs/render/week6-35.png
new file mode 100644
index 0000000..ca651a7
Binary files /dev/null and b/tmp/pdfs/render/week6-35.png differ
diff --git a/tmp/pdfs/render/week6-36.png b/tmp/pdfs/render/week6-36.png
new file mode 100644
index 0000000..a58b569
Binary files /dev/null and b/tmp/pdfs/render/week6-36.png differ
diff --git a/tmp/pdfs/render/week6-37.png b/tmp/pdfs/render/week6-37.png
new file mode 100644
index 0000000..429c855
Binary files /dev/null and b/tmp/pdfs/render/week6-37.png differ
diff --git a/tmp/pdfs/render/week6-38.png b/tmp/pdfs/render/week6-38.png
new file mode 100644
index 0000000..428340d
Binary files /dev/null and b/tmp/pdfs/render/week6-38.png differ
diff --git a/tmp/pdfs/rm008_official/render/exams/trial_final-02.png b/tmp/pdfs/rm008_official/render/exams/trial_final-02.png
new file mode 100644
index 0000000..280ffcf
Binary files /dev/null and b/tmp/pdfs/rm008_official/render/exams/trial_final-02.png differ
diff --git a/tmp/pdfs/rm008_official/render/exams/trial_final-07.png b/tmp/pdfs/rm008_official/render/exams/trial_final-07.png
new file mode 100644
index 0000000..4d82d0e
Binary files /dev/null and b/tmp/pdfs/rm008_official/render/exams/trial_final-07.png differ
diff --git a/tmp/pdfs/rm008_official/render/w4/page-23.png b/tmp/pdfs/rm008_official/render/w4/page-23.png
new file mode 100644
index 0000000..7845758
Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w4/page-23.png differ
diff --git a/tmp/pdfs/rm008_official/render/w4/page-30.png b/tmp/pdfs/rm008_official/render/w4/page-30.png
new file mode 100644
index 0000000..702d5da
Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w4/page-30.png differ
diff --git a/tmp/pdfs/rm008_official/render/w4/page-39.png b/tmp/pdfs/rm008_official/render/w4/page-39.png
new file mode 100644
index 0000000..377e4aa
Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w4/page-39.png differ
diff --git a/tmp/pdfs/rm008_official/render/w4/page-40.png b/tmp/pdfs/rm008_official/render/w4/page-40.png
new file mode 100644
index 0000000..bf6d830
Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w4/page-40.png differ
diff --git a/tmp/pdfs/rm008_official/render/w4/page-43.png b/tmp/pdfs/rm008_official/render/w4/page-43.png
new file mode 100644
index 0000000..025a781
Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w4/page-43.png differ
diff --git a/tmp/pdfs/rm008_official/render/w5/page-03.png b/tmp/pdfs/rm008_official/render/w5/page-03.png
new file mode 100644
index 0000000..ef3948c
Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w5/page-03.png differ
diff --git a/tmp/pdfs/rm008_official/render/w5/page-52.png b/tmp/pdfs/rm008_official/render/w5/page-52.png
new file mode 100644
index 0000000..1a59d17
Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w5/page-52.png differ
diff --git a/tmp/pdfs/rm008_official/render/w5/page-59.png b/tmp/pdfs/rm008_official/render/w5/page-59.png
new file mode 100644
index 0000000..7d56710
Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w5/page-59.png differ
diff --git a/tmp/pdfs/rm008_official/render/w6/page-32.png b/tmp/pdfs/rm008_official/render/w6/page-32.png
new file mode 100644
index 0000000..94645af
Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w6/page-32.png differ
diff --git a/tmp/pdfs/rm008_official/render/w6/page-33.png b/tmp/pdfs/rm008_official/render/w6/page-33.png
new file mode 100644
index 0000000..2ed90d5
Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w6/page-33.png differ
diff --git a/tmp/pdfs/rm008_official/render/w6/page-34.png b/tmp/pdfs/rm008_official/render/w6/page-34.png
new file mode 100644
index 0000000..b3b43bf
Binary files /dev/null and b/tmp/pdfs/rm008_official/render/w6/page-34.png differ
diff --git a/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 4.pdf b/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 4.pdf
new file mode 100644
index 0000000..cfb97dd
Binary files /dev/null and b/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 4.pdf differ
diff --git a/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 5.pdf b/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 5.pdf
new file mode 100644
index 0000000..9014a97
Binary files /dev/null and b/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 5.pdf differ
diff --git a/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 6.pdf b/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 6.pdf
new file mode 100644
index 0000000..7af1fd1
Binary files /dev/null and b/tmp/pdfs/rm008_official/slides_pdf/Lecture Week 6.pdf differ
diff --git a/tmp/pdfs/text/sample-final.txt b/tmp/pdfs/text/sample-final.txt
new file mode 100644
index 0000000..cebdafb
--- /dev/null
+++ b/tmp/pdfs/text/sample-final.txt
@@ -0,0 +1,627 @@
+01234
+5ÿ
+7
+8
+914
+ÿ
+ÿ
+9
+
+8
+9ÿ
+ÿ
+
+
+9
+ÿ!"#$%&"ÿ"ÿ'()"ÿ*+*,ÿ-*.*/ÿ0ÿÿ121!%&31ÿ0ÿ*.ÿ4"&3
+
+5678ÿ
+01234
+ÿÿÿ ÿ
+
+012345ÿ789ÿ2ÿ5 ÿ0ÿ70ÿ0775ÿPQRSTUQÿÿ2375ÿ0ÿ2ÿ0 83 ÿVWXQÿ0 5ÿXYZQ
+8ÿ23ÿ0 ÿ2ÿ ÿ8880785ÿ538ÿ2ÿ082
+ ÿVWXQÿ0 83 ÿ0 ÿ ÿ0 ÿ8ÿ0 5ÿ8ÿ3ÿ ÿ05ÿ2ÿ ÿ2ÿ538ÿ082 ÿ
+XYZQÿ0 83 ÿ8ÿ072ÿ0ÿ8ÿ3ÿ8ÿ52 4ÿ 087ÿ 5ÿ2ÿ ÿ05ÿ2ÿ ÿ2
+2 32ÿÿ8ÿ84ÿ 8 5ÿ0ÿ2ÿ2 382 ÿ ÿ ÿXYZQÿ0 83 ÿ2375ÿ ÿ!307
+2ÿ ÿ8ÿ[UWVZ[
+"2ÿ#07ÿ8ÿ ÿ0 ÿ0ÿPQRSTUQÿ2ÿ0
+\]^_`aÿcÿdefghiejklmnomkp
+ ÿ ÿ27728ÿ2ÿ2 5882 ÿ2375ÿ2ÿ ÿ3
+\]^_`aqr`\sÿccÿklmnomk
+\]^_`aq\tusÿccÿkimvok
+$8ÿ2ÿ ÿ27728ÿ25 ÿ ÿ08ÿ0ÿ23ÿ0 %
+&'(ÿ*+,-.ÿ/ÿ012.,*23ÿ45+,43ÿ/ÿ6ÿ72.38-7.,93:
+
+wxyzzÿ|}~}
+ÿÿÿÿ ÿÿÿ
+ÿÿÿÿÿÿÿÿ¡ÿÿ
+ÿÿÿÿÿÿÿÿ¡ÿÿ
+wxyzzÿ|}~}¢
+ÿÿÿÿ ÿj£ei¤¥ÿ¦s§¨_©s^r`\s¥ÿ¦s§¨_©s^\tusp¢
+ÿÿÿÿÿÿÿÿ£ei¤qr`\sÿcÿ¦s§¨_©s^r`\s
+ÿÿÿÿÿÿÿÿ£ei¤q\tusÿcÿ¦s§¨_©s^\tus
+wxyzzÿ|}~}¢
+ÿÿÿÿ ÿj£ei¤¥ÿ¦s§¨_©s^r`\s¥ÿ¦s§¨_©s^\tusckimvokp¢
+ÿÿÿÿÿÿÿÿª«¬ªÿr`\s¥ÿ\tus
+wxyzzÿ|}~}¢
+ÿÿÿÿ ÿj¦s§¨_©s^r`\s¥ÿ¦s§¨_©s^\tusp®
+ÿÿÿÿÿÿÿÿr`\sÿcÿ¦s§¨_©s^r`\s
+ÿÿÿÿÿÿÿÿ\tusÿcÿ¦s§¨_©s^\tus
+
+" 509
+;<<=>?@AÿCD?@AÿCD?ÿ@@ABAC@@DEFGHIÿJKJGFIÿLMJNOPIÿPFQKFRSETOPFEUVWX>YZ
+ÿÿÿÿÿÿÿÿ[\]^_JKJGFÿUÿJKJGF
+ÿÿÿÿÿÿÿÿ[\]^_LMJNOPÿUÿLMJNOP
+ÿÿÿÿÿÿÿÿ[\]^_PFQKFRSETOPFEÿUÿPFQKFRSETOPFEÿ`?ÿPFQKFRSETOPFEÿ>57>ÿab
+ÿÿÿÿ
+ÿÿÿÿ=>?ÿcdd@efgAfhD[\]^IÿETOPFY<
+ÿÿÿÿÿÿÿÿ[\]^_PFQKFRSETOPFE_ciifBdDETOPFY
+ÿÿÿÿ
+ÿÿÿÿ=>?ÿjklh@ecCABmD[\]^Y<
+ÿÿÿÿÿÿÿÿ`?ÿ[\]^_PFQKFRSETOPFEZ
+ÿÿÿÿÿÿÿÿÿÿÿÿn>opnXÿqrstuD[svD[\]^_PFQKFRSETOPFEYÿwÿ
+]\tD[\]^_PFQKFRSETOPFEYIÿxY
+74ÿ8928ÿ 4ÿ4284ÿ2ÿyzz{ÿ7048ÿ2 ÿ266ÿ8ÿ|}}~ÿ4897ÿ8944ÿ84ÿ634ÿ89
+OO SÿUÿrrD\ÿttÿ\^IÿÿrqutY
+OO S_LSPFQKFRDY
+OO S_LSPFQKFRDY
+OO S_LSPFQKFRDY
+928ÿ 66ÿ894 ÿ894ÿ7667 ÿ72 ÿ 8ÿ87ÿ894ÿ44
+n`XoDOO S_jklh@ecCABmDYY
+ÿ"#$%&ÿ'ÿ()*&$"*+ÿ,-#$,+ÿ'ÿ.ÿ/*&+0%/&$1+2
+
+
+
+z
+ ¡
+344023
+
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ44ÿ515
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515
+
+01234567ÿ939ÿ ÿ37ÿ3ÿ59ÿ037ÿNOPQRSONÿ 50ÿ5ÿ 397ÿ ÿ3ÿ6 27ÿ
+50956357
+30ÿ509563ÿ56ÿ97ÿNOPQRSONÿ59ÿ3ÿ9 ÿ7ÿTUVWRTÿ36ÿTXYVQRTÿ 7ÿ07 6564
+37ÿ37ÿ9769ÿ6327ÿ3ÿ9564ÿ36ÿ0 7ÿ437ÿ3ÿ 39
+ÿ730ÿ9769ÿ !ÿ57ÿ9ÿ569ÿ97ÿ564ÿ97"9ÿ9ÿ97ÿ0776
+ZU[\]^ÿ3ÿ70757ÿ3ÿ437ÿÿZX_[`]^
+ 77ÿZU[\]^ÿ5ÿ95997ÿ ÿ97ÿ6327ÿÿ97ÿ9769ÿ36ÿZX_[`]^ÿ5ÿ95997ÿ ÿ97
+3093ÿ0 7ÿ437ÿ 7ÿ0 7ÿ437ÿ ÿ7ÿ537ÿ9ÿ67ÿ70523ÿ307ÿ397ÿ97
+70523ÿ 569
+ÿ7"327ÿ5
+abcdefbaÿhÿijklmnokpÿkqrmnksÿktumrokpÿvwxsÿjklmnokpÿkyouzmurksÿktumrokpÿ
+{|x}
+976ÿ !ÿ57ÿ9ÿ77ÿ97ÿ564ÿ9 ÿ567ÿ5697ÿ9ÿ97ÿ0776
+[QVWÿVNÿYRRRQÿVÿYVQRÿ ÿ
+RYSVYQÿVNÿYRRRQÿVÿYVQRÿ ÿ
+# 50ÿÿ97ÿ564ÿ07ÿ742769ÿ5ÿ30577ÿ 39ÿ ÿ369$
+%&'ÿ)*+,-ÿ.ÿ/01-+)12ÿ34*+32ÿ.ÿ5ÿ61-27,6-+829
+
+ÿÿÿ
+ÿÿÿÿ ¡¢£¤¥¦§¨©¤¦ª«ÿ¨¡ÿ¤®¤¯¤£ÿ¨ÿ°¨£¤ÿ±ÿ ¡¢£¤¥¦²¨£¤¦ª«³´
+ÿ
+µ¶·ÿabcdefbsÿ¸·¹deÿºfÿabcdefba»ºbe¼a½¾p
+ÿÿÿÿ¿uÀzÁ½ÂkÃÄÁÅrozÁÆÿÈmÄÿuoÉoÀÊorÿmÿËumroÿÌÂÿÃÄÁÅrozÁÍktumrokÎÆÏk¾
+ÿ
+µ¶·ÿabcdefbÿºfÿabcdefbap
+ÿÿÿÿ¿uÀzÁ½ÂkÃÄÁÅrozÁÍÐlmnoÐÎÆÿÈmÄÿuoÉoÀÊorÿmÿËumroÿÌÂÿkÿÑÿ
+ÄÁu½abcdefbiktumrok}¾¾¾
+ÿ
+µ¶·ÿabcdefbsÿ¸·¹deÿºfÿabcdefba»ºbe¼a½¾p
+ÿÿÿÿ¿uÀzÁ½ÂÐÃÄÁÅrozÁÆÿÈmÄÿuoÉoÀÊorÿmÿËumroÿÌÂÿÃËumroÆÏо
+ÿ
+
+7730
+:;;<=>?@ÿBC;DÿEC;ÿFG;HEIJDÿIHÿ>DHB;K;<ÿ?JKK;?ELM
+
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ44ÿ515
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515
+
+0123ÿ5660ÿ72ÿ8976ÿÿ35725ÿ 60ÿUVWXYZ[\]V^_[^`Xa_Wÿ7 7ÿ29 7ÿ256ÿ5369
+6ÿ23737ÿ2ÿ76ÿ35725ÿ230ÿ6ÿÿ795ÿ7 7ÿ9696657ÿÿ07ÿ5369ÿ6ÿ537
+93657ÿÿ2ÿÿ795ÿ8 7ÿÿ07ÿ37ÿ76ÿ07ÿ ÿ6ÿ6 9760ÿÿ0 6ÿ76ÿbcb
+ 9 769ÿ7ÿ923ÿ 6
+29ÿ6 6ÿ76ÿ228 5ÿ35725ÿ !
+defghijklemnjmogpnfqrstsuvtvuwxssry
+defghijklemnjmogpnfqrstsuvtvwxssry
+defghijklemnjmogpnfqrstsuvtvuwxussry
+230ÿÿ967395ÿ76ÿ795!
+rstsvtvwxssr
+" ÿ2ÿ76ÿ228 5ÿ206ÿ6657ÿ#$%&ÿ($)ÿ 66ÿ8 7ÿ23ÿ8 57*
++,-ÿ/0123ÿ4ÿ56731/78ÿ9:0198ÿ4ÿ;ÿ<738=2<31>8?
+
+z{|ÿ~
+ÿÿÿÿ ÿ
+ÿÿÿÿ{ÿ
+ÿ
+z{|ÿ~ qmogpnfy
+ÿÿÿÿ{ÿmogpnf ¡¢£¤¥¦¢qrur§ÿrry
+ÿ
+z{|ÿ~ qmogpnfy
+ÿÿÿÿ¨©ª©i«ÿ¬ÿ®
+ÿÿÿÿ|¯ÿÿ©mÿmogpnf
+ÿÿÿÿÿÿÿÿ°|ÿÿ©mÿrswt±xv²³´µr
+ÿÿÿÿÿÿÿÿÿÿÿÿ¨©ª©i« ¥££¢¶·qy
+ÿÿÿÿ{ÿrr ¸¯°q¨©ª©i«y
+ÿ
+z{|ÿ~ qmogpnfy
+ÿÿÿÿ{ÿrr ¸¯°qmogpnf «k¹©iqruryy
+ÿ
+
+660 @
+ABBCDEFGÿIJBKÿLJBÿMNBOLPQKÿPOÿEKOIBRBCÿFQRRBFLST
+
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ44ÿ515
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515
+
+ÿÿÿÿ!"#$%ÿ&''ÿKL(ÿ)"ÿÿÿ&'%ÿ&''ÿMNMÿÿÿ&'%ÿ&''
+MOM(ÿ*"ÿ&"+ÿ%,$(
+-ÿ'+.ÿ"ÿ&$"ÿÿ&'%ÿ&''ÿMPM/ÿ0+&ÿ&"+ÿ"ÿ%ÿ1ÿ"ÿ%,$ÿ+ÿ&'%
+MNMÿÿMOM(ÿ2+&ÿ1ÿ"ÿ1''0+3ÿ&ÿ'+ÿ0+''ÿ&+ÿ0"ÿ4ÿ0"5
+678ÿ:;<=>ÿ?ÿ@AB><:BCÿDE;CH=G>6?ÿ@>6ÿAB6C@DE?ÿDCÿ9?C=6F67ÿ:EFF6:@GH
+566789:;ÿ=>6?ÿ@>6ÿAB6C@DE?ÿDCÿ9?C=6F67ÿI9F@D9GGHÿ:EFF6:@GH
+566789:;ÿ=>6?ÿ@>6ÿAB6C@DE?ÿDCÿ9?C=6F67ÿD?:EFF6:@GH
+
+012343ÿ643ÿ789ÿ6 6ÿ676463ÿ;<=ÿ6 ÿ;<>ÿ123ÿ99ÿ3ÿ72ÿ823 ÿ473
+?@ABCDEFGH
+ÿ
+ÿÿÿÿÿJÿÿÿÿKÿÿÿÿLÿÿÿÿM
+GÿÿNOPÿÿQORÿÿSONÿÿTOT
+RÿÿUOPÿÿROTÿÿSOGÿÿVOV
+VÿÿVORÿÿNORÿÿQOSÿÿVOU
+TÿÿWOQÿÿQOWÿÿWOSÿÿQOP
+NÿÿGORÿÿSOWÿÿROSÿÿVOP
+ÿ
+ÿ
+?@ABCDEFRH
+ÿ
+ÿ
+ÿÿÿÿÿJÿÿÿÿLÿÿÿÿM
+TÿÿWOQÿÿWOSÿÿQOP
+VÿÿVORÿÿQOSÿÿVOU
+RÿÿUOPÿÿSOGÿÿVOV
+ÿ
+22ÿ9ÿ723ÿ9980ÿ9 3ÿ3ÿÿ!"ÿ26#3ÿ43673 ÿ;<>ÿ49ÿ;<=$
+%&'ÿ)*+,-ÿ.ÿ/01-+)12ÿ34*+32ÿ.ÿ5ÿ61-27,6-+829
+
+XYZÿ\ÿXY]^_`abcdeXfghi_jfeXdek\lmnopq^r`jstusvwvuÿvxvuÿvyvzz
+EFRÿ{ÿEFGO|}~ÿÿ ÿÿÿ
+EFRÿ{ÿEFGO}~ÿÿÿ O~}DÿE|{H
+EFRÿ{ÿEFGO}~ÿÿÿ O~}DH
+33 :6
+
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ44ÿ515
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515
+
+ÿÿÿÿÿ!""M
+ÿ#ÿ$!ÿ!%&ÿ'(&!ÿ)(!"&*ÿÿ!%%+
+%,!ÿ)#ÿ&ÿ-*ÿÿ)!%"%ÿÿÿ$&!.ÿÿ/%""%$+#ÿ/%ÿ0)"#ÿ
+ÿ")&ÿ%/ÿ&ÿ1ÿNOPMQRSTUPVÿXYYSTZ[Y\\U]TN.
+2%(3ÿ"4ÿ&%ÿ!&ÿÿ$ÿÿ&&ÿ%"*ÿ!%&ÿ&ÿ)(!"&*ÿ)ÿ/%)ÿÿ
+Mÿ&
+)ÿ%.ÿ5!ÿ%/ÿ&ÿ/%""%$+ÿ!%ÿ"ÿ$""ÿ!,ÿ$&ÿ*%(ÿ$&6
+789ÿ;<=>?ÿ@ÿABC?=;CDÿEF<=EDÿ@ÿGÿHC?DI>H?=JDK
+
+^_`abcdefgheÿjkÿj_^lmnocpqÿpstuvs
+wxwyz{|}~ÿ~
+wxdefghe} xwyz{|}~ÿ~
+wxw|
+L-!4
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ44ÿ515
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515
+
+01234ÿ2ÿ6773ÿ28ÿ894ÿ7667 0 ÿ74ÿ4 4 8
+FGHIÿKLMNMOPNÿQRSTUVÿKLMNMOPN
+ÿ
+WXYÿZ[\]IH^\_`aKLMNbcMdOefcgh
+ÿÿÿÿKLMNcÿiÿjk
+ÿÿÿÿlmdÿKLMNbcMdÿOeÿKLMNbcMdOefch
+ÿÿÿÿÿÿÿÿQYÿnonÿOeÿKLMNbcMdh
+ÿÿÿÿÿÿÿÿÿÿÿÿKLMNcpqrrstuaKLMNMOPNpvwxrwyzsaKLMNbcMd{ÿn|uo|zo|}ngg
+ÿÿÿÿÿÿÿÿX~QYÿnnÿQÿKLMNbcMdh
+ÿÿÿÿÿÿÿÿÿÿÿÿKLMNcpqrrstuaKLMNMOPNpvwxrwyzsaKLMNbcMd{ÿn|z|u|}ngg
+ÿÿÿÿÿÿÿÿX~Xh
+ÿÿÿÿÿÿÿÿÿÿÿÿKLMNcpLNeKaTXg
+ÿÿÿÿUXVUÿjKLMNpPmeM ÿOlÿ\[ÿQÿTVÿTXÿX~XÿTXÿYTUÿ\[ÿQÿKLMNck
+ÿ
+74ÿ8928ÿ7ÿ266ÿ894ÿ 807 ÿ6034ÿ890
+ÿÿ
+928ÿ74ÿ894ÿ 807 ÿ266ÿ48
+ÿ !"#ÿ$ÿ%&'#!'(ÿ)* !)(ÿ$ÿ+ÿ,'#(-",#!.(/
+
+ ¡ÿ£¤¥¦¡ÿ§¨
+ÿ©ÿ
+ÿ
+ÿ
+044123
+23345678ÿ:;3<ÿ=;3ÿ>?3@=AB<ÿA@ÿ6<@:3C34ÿ7BCC37=DE
+
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ44ÿ515
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515
+
+ÿÿÿ!"ÿÿ!#$ÿÿ%"&$"ÿ&''(ÿQRSTUVTSWRXÿÿ)ÿÿ($*ÿ+'
+"(ÿ##"ÿÿ"*,#ÿ%ÿÿ(ÿÿÿ($*ÿ+'ÿ##"ÿ!$$"ÿÿ#-ÿ.
+##"ÿ+'ÿ$ÿ#%#ÿ'!ÿ"ÿ$"/#ÿ,!"ÿ0ÿ"(ÿ1223#ÿ4*'5ÿÿ%"&$"ÿ&''6
+QRSTUVTSWRXYQRZWZ[\WY]^]]_ÿ]_ÿabb
+'(ÿ##"ÿÿ$"/#6
+c]
+7$&ÿ%ÿÿ%''!$"/ÿ&(ÿ/*"ÿ!$''ÿ&$+ÿ!ÿÿ!"8ÿ9:ÿ&"ÿ*ÿ
+ÿQRZWZ[\Wÿ"(ÿZ[\WQWdZRÿ&'ÿ#ÿ'#( ÿ$*#(ÿ%#*ÿÿ($*ÿ*('-;
+<=>ÿ@ABCDÿEÿFGHDB@HIÿJKABJIÿEÿLÿMHDINCMDBOIP
+
+efgÿijklmnlkojpqrstu
+ÿÿÿÿvfwxvyÿqrsÿzÿij{o{|}oqrs~ÿÿtt~r ÿÿ
+efgÿijklmnlkojp
+ÿÿÿÿvfwxvyÿÿÿÿÿÿÿ
+efgÿijklmnlkojp
+ÿÿÿÿvfwxvyÿÿÿÿÿÿÿ
+efgÿijklmnlkojp
+ÿÿÿÿvfwxvyÿÿÿÿÿ
+
+3(,&)
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ44ÿ515
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515
+
+0123ÿ5678ÿ6ÿ9 ÿ2ÿ ÿ6998ÿHIJKLMÿÿ55ÿ878ÿ8988ÿÿ338
+55ÿ2ÿ58ÿ2992 ÿ28ÿ98ÿ 99ÿ868ÿ6ÿ26ÿÿ55ÿ58ÿ08ÿ68ÿ58ÿ8988
+2ÿHIJKLMÿ6ÿ58ÿ76938ÿ68ÿ58ÿ38ÿ2ÿ5668ÿÿ58ÿ282ÿ08
+ÿ!"#$%ÿ&ÿ'()%#!)*ÿ+,"#+*ÿ&ÿ-ÿ.)%*/$.%#0*1
+
+NOPQRSÿUVWXOPQRYÿZ[\ÿOPQRÿ]^ÿ_O`Pabc
+defghijfklÿnopÿijfkÿigÿeiqjrst
+uvwxyÿZ[\ÿvwxyÿv{ÿ|v}w~ÿ]ZÿUVWvwxyÿÿ
+u vwxyÿvwxyÿZ[\ÿvwxyÿ]^ÿ|v}w~
+28860
+34456789ÿ;<4=ÿ><4ÿ?@4A>BC=ÿBAÿ7=A;4D45ÿ8CDD48>EF
+34456789ÿ;<4=ÿ><4ÿ?@4A>BC=ÿBAÿ7=A;4D45ÿG7D>B7EEFÿ8CDD48>EF
+34456789ÿ;<4=ÿ><4ÿ?@4A>BC=ÿBAÿ7=A;4D45ÿB=8CDD48>EF
+
+01233456ÿ89 8ÿ42ÿ9 6ÿÿ058ÿ4ÿ068865ÿ006ÿIJKLMNÿ146ÿ068865ÿ6ÿ2336ÿ56ÿ48965
+6ÿÿ046ÿ56
+42ÿ06ÿ84ÿ6 86ÿ4896ÿ058ÿ89 8ÿ48 5ÿ896ÿ56ÿ068865ÿÿ896ÿ56ÿ46ÿ28ÿ42
+ 8ÿ84ÿ82ÿ66ÿ2336ÿ56ÿ06886ÿ84ÿ85ÿ046ÿ56ÿ654ÿÿ66ÿ046ÿ56ÿ06886
+84ÿ85ÿ2336ÿ56ÿ654
+99ÿ4ÿ896ÿ4004 ÿ46ÿ065ÿ 00ÿ966ÿ9 8ÿ42ÿ 8
+ÿ"#$%&ÿ'ÿ()*&$"*+ÿ,-#$,+ÿ'ÿ.ÿ/*&+0%/&$1+2
+
+OPQRRQSTUVVWXYZÿ\]ÿPQRRQST\^P_`QSYZÿabcaÿPQRRQSTdefWXYZÿghiÿPQRRQSÿjkÿP\^Rlmn
+opÿrsÿpÿjkÿtuvwxyz{|}~ tyÿabcaÿpyÿghiÿpÿjkÿ
+r
+hÿrÿ ÿ¡¢£ÿ ¤
+¥hkaÿrÿ ÿ¡¢£ÿ ¤
+366
+4556789:ÿ<=5>ÿ?=5ÿ@A5B?CD>ÿCBÿ8>B<5E56ÿ9DEE59?FG
+4556789:ÿ<=5>ÿ?=5ÿ@A5B?CD>ÿCBÿ8>B<5E56ÿH8E?C8FFGÿ9DEE59?FG
+4556789:ÿ<=5>ÿ?=5ÿ@A5B?CD>ÿCBÿ8>B<5E56ÿC>9DEE59?FG
+
+0 1233456ÿ842ÿ9 6ÿ966ÿ 65ÿ
+GHI
+ÿÿÿ5ÿ445
+JÿLÿMNM
+OÿLÿP
+QÿLÿPRS
+9 ÿ 6ÿ96ÿ42325ÿ4ÿ96ÿ44ÿ65ÿ4ÿ46
+TUVWXYJÿLLÿOZ
+TUVWXYOÿLLÿQZ
+TUVWXYJÿLLÿQZ
+TUVWXYJÿLLÿOÿLLÿQZ
+ÿ !"#ÿ$ÿ%&'#!'(ÿ)* !)(ÿ$ÿ+ÿ,'#(-",#!.(/
+
+[\]^_
+`Ua_
+[\]^_
+[\]^_
+`Ua_
+`Ua_
+`Ua_
+`Ua_
+[\]^_
+[\]^_
+[\]^_
+`Ua_
+`Ua_
+[\]^_
+[\]^_
+[\]^_
+
+066 1
+23345678ÿ:;3<ÿ=;3ÿ>?3@=AB<ÿA@ÿ6<@:3C34ÿ7BCC37=DE
+23345678ÿ:;3<ÿ=;3ÿ>?3@=AB<ÿA@ÿ6<@:3C34ÿF6C=A6DDEÿ7BCC37=DE
+
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515
+
+ÿÿÿÿÿ!"#ÿ#"ÿ$ÿÿ%ÿ$ÿ&ÿ'!ÿ(ÿÿ()*ÿÿÿ+$
+*ÿ"ÿ$ÿ!ÿ'ÿ$ÿ+ÿÿ$ÿ"%ÿ!,-ÿ./ÿ$ÿ0ÿ*ÿ1
+2ÿ$ÿ"%ÿ!,ÿÿ,ÿ)-3
+4ÿ5!"#6
+(ÿ7ÿ)ÿ8ÿ(
+9ÿ7ÿ(ÿ8ÿ:
+:ÿ7ÿ9ÿ8ÿ;
+--()ÿ7ÿ<ÿ8ÿ(<
+=$ÿ$ÿ"&!ÿ$ÿ##ÿ"ÿ$ÿ++ÿ"ÿ.--6ÿ#>ÿ$ÿ! 3?@AÿCDEFGÿHÿIJKGECKLÿMNDEMLÿHÿOÿPKGLQFPGERLS
+
+WÿYÿZ
+[\]^_ÿWÿ`Yÿabc
+ÿÿÿÿde]fghWÿiÿhWjakk
+ÿÿÿÿWÿiYÿl
+mnopqrstÿvÿw
+xyeÿqÿqzÿ{|}~ÿ
+ÿÿÿÿde]fgqÿ ÿmnopqrst
+ÿÿÿÿmnopqrstÿvÿq
+T$ÿ'ÿ$ÿ,%ÿ2
+U$ÿ'ÿ,%ÿ2
+
+4,+2
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿV44ÿ515
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515
+
+0123456789ÿ63ÿ0 0789ÿ09ÿ7ÿ0543ÿ8ÿ30ÿ
+`abÿdefghijklm
+ÿÿÿÿnaopqrÿsÿijkÿttÿu
+ÿÿÿÿnarpnvÿwxyz{ÿ}~{ÿwÿ~ÿ ÿ{~x
+ÿ
+nvrhjl
+ÿ
+ÿÿ!ÿ"#$$%ÿ&'&%ÿ!ÿ(ÿ)$%*)+%,
+
+-./012ÿ4/ÿ5ÿ16751ÿ859.ÿ58:ÿ758862ÿ;.ÿ<.=.<.87.:ÿ602/4:.ÿ6=ÿ2>.ÿ=0872468?
+@@ÿ7Aÿ806ÿÿB7ÿC608ÿ0360
+D 3ÿA862ÿ0ÿ63ÿEA6789ÿ7Aÿ7840346
+F05ÿ48ÿ08ÿ5A3ÿ3763ÿ786ÿ0ÿ3658GÿH56ÿ806ÿH06
+I33H4J
+KLLMNOPQÿSTLUÿVTLÿWXLYVZ[UÿZYÿOUYSL\LMÿP[\\LPV]^
+KLLMNOPQÿSTLUÿVTLÿWXLYVZ[UÿZYÿOUYSL\LMÿ_O\VZO]]^ÿP[\\LPV]^
+KLLMNOPQÿSTLUÿVTLÿWXLYVZ[UÿZYÿOUYSL\LMÿZUP[\\LPV]^
+
+0123ÿ567859 ÿ58ÿ5ÿ6ÿ589ÿFGHIJKÿ ÿÿ6595ÿ32ÿ5ÿ2662
+LMNOPQÿSÿTUVWXYVÿZ[ÿ\]ÿZÿ^ÿ\[ÿUVWXYVÿZ[ÿ\]ÿZÿ_ÿ\`
+ 5ÿ2369ÿ8ÿ0789ÿ ÿ8ÿ2662 ÿ298ÿ008
+abMcOdLMNOPQTe`df[ÿghÿ__ÿLMNOPQTf`df[ÿghh
+ÿ!"ÿ#ÿ$%&"&'ÿ()('ÿ#ÿ*ÿ+&"',!+"-'.
+
+i
+j
+k
+l
+/88950
+12234567ÿ9:2;ÿ<:2ÿ=>2?<@A;ÿ@?ÿ5;?92B23ÿ6ABB262?<@A;ÿ@?ÿ5;?92B23ÿE5B<@5CCDÿ6ABB262?<@A;ÿ@?ÿ5;?92B23ÿ@;6ABB26;?@:ÿ?>ÿ4:>81A12ÿ5@AA15;BC
+01123456ÿ891:ÿ;91ÿ<=1>;?@:ÿ?>ÿ4:>81A12ÿD4A;?4BBCÿ5@AA15;BC
+01123456ÿ891:ÿ;91ÿ<=1>;?@:ÿ?>ÿ4:>81A12ÿ?:5@AA15;BC
+
+0123ÿ52ÿ627ÿ809 ÿÿÿ2ÿÿÿ2ÿÿ3909ÿ9 ÿ78 ÿ2 ÿÿ999
+20ÿ99
+ÿ627ÿ 9ÿ9ÿ20 ÿK
+ÿÿ
+LÿNÿOPQPRÿPSPRÿPTPRÿPUPRÿPVPRÿPWPRÿPXPRÿPYPRÿPZP[
+123ÿ52ÿ627ÿ09 9
+\ÿNÿOOPQPRÿPSPRÿPTP[RÿOPUPRÿPVPRÿPWP[RÿOPXPRÿPYPRÿPZP[[
+!ÿ#$%&'ÿ(ÿ)*+'%#+,ÿ-.$%-,ÿ(ÿ/ÿ0+',1&0'%2,3
+
+]ÿ_ÿ`a`bcdbÿeÿfghÿijkÿbÿblÿkmlnodpqÿrqÿfgh
+\ÿNÿOLOsOt[uuv[ÿwxyÿsÿszÿ{z|}{y~{L[
+42ÿ2ÿ9ÿ829ÿ320
+5990ÿ2ÿ829ÿ320
+9958
+67789:;<ÿ>?7@ÿA?7ÿBC7DAEF@ÿEDÿ:@D>7G78ÿ;FGG7;AHI
+67789:;<ÿ>?7@ÿA?7ÿBC7DAEF@ÿEDÿ:@D>7G78ÿJ:GAE:HHIÿ;FGG7;AHI
+67789:;<ÿ>?7@ÿA?7ÿBC7DAEF@ÿEDÿ:@D>7G78ÿE@;FGG7;AHI
+
+0123ÿ5678ÿ92ÿ 98ÿ6ÿ392ÿ68ÿ^_`aÿ9569ÿ6890ÿ6ÿ926ÿ60ÿ6ÿ39ÿ6389
+295ÿ958ÿ80ÿ6ÿ958ÿ76380ÿ2ÿ958ÿ39ÿ68ÿ9880
+893ÿ62958ÿ926ÿ9569ÿ560ÿ958ÿ068ÿ80ÿ60ÿ958ÿ39ÿ6389ÿ2ÿ865ÿ23939ÿ8
+958ÿ2 802ÿ7638ÿ0523ÿ8ÿ63698ÿ60ÿ958ÿ03ÿ2ÿ95208ÿ76380ÿ2ÿ958ÿ39
+926ÿ 5208ÿ80ÿ68ÿ068ÿ956ÿ2ÿ836ÿ92ÿ958ÿ23939ÿ8ÿÿ38092
+2ÿ868
+bcdefghiÿklÿmiÿhlÿniÿmop
+0523ÿ893ÿ6ÿ926ÿ9569ÿ0ÿ836ÿ92
+qrsÿuvÿwsÿrvÿxsÿyz
+55ÿ2ÿ958ÿ22 ÿ260ÿ 20ÿ60ÿ988!
+"#$ÿ&'()*ÿ+ÿ,-.*(&./ÿ01'(0/ÿ+ÿ2ÿ3.*/4)3*(5/6
+
+{|}ÿ~fpi
+ÿÿÿÿ ÿÿgo
+ÿÿÿÿÿÿdeÿ fpi
+ÿÿÿÿÿÿÿÿ ÿÿ bfÿÿlÿÿdeÿdb fpÿdÿÿÿp
+ÿÿÿÿ|ÿ|
+{|}ÿ~fkpi
+ÿÿÿÿeedecÿÿ
+ÿÿÿÿmÿÿgo
+ÿÿÿÿ}ÿÿdeÿ ¡¢£fk fppi
+ÿÿÿÿÿÿÿÿeedecÿ¤ÿk
+ÿÿÿÿÿÿÿÿmÿÿeedec
+ÿÿÿÿ|ÿm
+
+789:ÿ8<ÿ9:=ÿ>?8@=ÿA8BCÿ>DÿEF9=FG=G
+H28ÿ2ÿ958ÿ6278ÿ 20ÿ60ÿ988
+886
+IJJKLMNOÿQRJSÿTRJÿUVJWTXYSÿXWÿMSWQJZJKÿNYZZJNT[\
+IJJKLMNOÿQRJSÿTRJÿUVJWTXYSÿXWÿMSWQJZJKÿ]MZTXM[[\ÿNYZZJNT[\
+
+01123456ÿ891 ÿ91ÿ 1 ÿÿ4 8112ÿ515
+
+01230ÿ56ÿ027ÿ87690ÿ ÿ027ÿ 5ÿ883
+FGÿIÿJKLÿMLÿNLÿOP
+FQÿIÿJMLÿNLÿOLÿRP
+ÿ
+SGÿIÿTU
+VWXÿYZ[Lÿ\]F^Zÿ_`ÿabcdFGLÿFQef
+ÿÿÿÿSGJYZ[PÿIÿ\]F^Z
+ÿ
+SQÿIÿTU
+VWXÿYZ[Lÿ\]F^Zÿ_`ÿghijgklmgdFQLÿKef
+ÿÿÿÿSQJYZ[PÿIÿ\]F^Z
+ÿ
+nXopqdSGÿIIÿSQe
+ÿ
+ÿÿÿÿ!"!ÿÿ#ÿ$%$&'
+
+rXst
+uvwxt
+(ÿ7888ÿ76637)
+* 7ÿ ÿ027ÿ3+ ,7
+-77.+3/0
+12234567ÿ9:2;ÿ<:2ÿ=>2?<@A;ÿ@?ÿ5;?92B23ÿ6ABB262?<@A;ÿ@?ÿ5;?92B23ÿE5B<@5CCDÿ6ABB262?<@A;ÿ@?ÿ5;?92B23ÿ@;6ABB26?3@=AB<ÿA@ÿ6<@:3C34ÿ7BCC37=DE
+23345678ÿ:;3<ÿ=;3ÿ>?3@=AB<ÿA@ÿ6<@:3C34ÿF6C=A6DDEÿ7BCC37=DE
+23345678ÿ:;3<ÿ=;3ÿ>?3@=AB<ÿA@ÿ6<@:3C34ÿA<7BCC37=DE
+
+0123ÿ5607ÿ857ÿ92 2 ÿ8
+GÿIÿJKLMNOPQRLJ
+55ÿ8ÿ3 ÿ857ÿSTUVWÿ8 ÿ7852ÿ 23ÿ 8ÿ857ÿ92 2 ÿ0637
+X
+ÿÿ!ÿ"#$$%ÿ&'&%ÿ!ÿ(ÿ)$%*)+%,
+
+YZ[\]^_`abc^GdÿJRJee
+YZ[\]fgh_`abcfijikk
+-285ÿ8ÿ 23ÿ7 07ÿ8568ÿ738
+.7857ÿ8ÿ 23ÿ7 07ÿ8568ÿ738
+/77061
+23345678ÿ:;3<ÿ=;3ÿ>?3@=AB<ÿA@ÿ6<@:3C34ÿ7BCC37=DE
+23345678ÿ:;3<ÿ=;3ÿ>?3@=AB<ÿA@ÿ6<@:3C34ÿF6C=A6DDEÿ7BCC37=DE
+23345678ÿ:;3<ÿ=;3ÿ>?3@=AB<ÿA@ÿ6<@:3C34ÿA<7BCC37=DE
+
+0 1234ÿ2ÿ6773ÿ28ÿ894ÿ76670 ÿ 87 ÿ4 87
+VWXÿZ[\Z]\[^_`abcdefgÿhijklmn
+ÿÿÿÿoWpqrsÿtÿu
+ÿÿÿÿXvoÿwxÿyzÿ{o|pn
+ÿÿÿÿÿÿÿÿoWpqrsÿ}tÿcdefbwxm
+ÿÿÿÿoWsqozÿoWpqrs
+ÿ
+99ÿ7ÿ894ÿ76670 ÿ 87 ÿ266ÿ076ÿ48ÿ894ÿ4ÿ~ÿ2ÿ2ÿ468
+ÿ!ÿ"ÿ#$%!%&ÿ'('&ÿ"ÿ)ÿ*%!&+*!,&-
+
+Z[\Z]\[^_`abxiiÿnÿÿ}ÿ gÿgÿgÿgÿm
+Z[\Z]\[^_`abxiiÿnÿhhgÿgÿgÿgÿm
+./01ÿ345607/5ÿ6899:ÿ;/49<ÿ9=8<ÿ0/ÿ0180ÿ>=:490
+?4894ÿ 87 ÿ266ÿ076ÿ642ÿ87ÿ8928ÿ468
+@4423
+ABBCDEFGÿIJBKÿLJBÿMNBOLPQKÿPOÿEKOIBRBCÿFQRRBFLST
+ABBCDEFGÿIJBKÿLJBÿMNBOLPQKÿPOÿEKOIBRBCÿUERLPESSTÿFQRRBFLST
+ABBCDEFGÿIJBKÿLJBÿMNBOLPQKÿPOÿEKOIBRBCÿPKFQRRBFLST
+
+012ÿ456ÿ7859ÿ ÿ6J
+ÿÿ52ÿÿÿ8ÿ456ÿ98ÿ5ÿ6 ÿÿ ÿ456ÿ8 ÿ ÿ6
+52ÿKLÿ25ÿ ÿ ÿ7 ÿ8ÿ4ÿ ÿ256
+MJN
+65ÿ ÿ ÿ J
+ÿÿ 4ÿ588ÿ ÿ6ÿ52ÿ ÿÿ ÿÿ5 ÿ85
+8ÿ ÿ5 ÿ89 ÿ25ÿ ÿ
+!ÿ#$%&'ÿ(ÿ)*+'%#+,ÿ-.$%-,ÿ(ÿ/ÿ0+',1&0'%2,3
+
+OPQRSTÿVWXY
+Z[\]X^VWXY_`aÿbÿ[ÿbbÿcd
+efghÿVWXYÿOPQRSTÿZ\
+Z[\]X^`aÿbÿ[ÿbbÿcd
+OPQRSTÿjklmÿnoÿpqrslkrls
+tuvrlwjklmxyzÿ{ÿuÿ{{ÿ|}
+efghÿVWXYÿOPQRSTÿZ\ÿnoÿ~]XW]X
+QSOT^~]XW]Xÿbÿ[ÿbbÿcd
+
+4 7
+566789:;ÿ=>6?ÿ@>6ÿAB6C@DE?ÿDCÿ9?C=6F67ÿ:EFF6:@GH
+566789:;ÿ=>6?ÿ@>6ÿAB6C@DE?ÿDCÿ9?C=6F67ÿI9F@D9GGHÿ:EFF6:@GH
+566789:;ÿ=>6?ÿ@>6ÿAB6C@DE?ÿDCÿ9?C=6F67ÿD?:EFF6:@GH
+
+
\ No newline at end of file
diff --git a/tmp/pdfs/text/week1.txt b/tmp/pdfs/text/week1.txt
new file mode 100644
index 0000000..2b24f8e
--- /dev/null
+++ b/tmp/pdfs/text/week1.txt
@@ -0,0 +1,874 @@
+Introduction to Python
+Week 1
+
+1
+
+What is Python?
+• It is a programming language
+• A Python script is readable for human beings
+• A Python script is not readable for computers: a python script must be translated,
+before a computer can read and execute it
+
+• Python is translated in two steps:
+1. The Python script is translated line by line into so-called byte code
+2. This byte-code is translated into machine-code
+
+• Writing code must be precise. Ambiguities, that would be correctly interpreted by
+humans, will lead to errors in Python
+• We use a so-called monospaced font for code on these slides.
+This means that all characters take an equal amount of space.
+Using a monospaced font for code is a common practice
+2
+
+Why Python?
+• Python forces you to work in a structured way, and this is one of the
+reasons it is used in places, like universities, where programming is taught
+• Python is hot as it is used a lot in (packages for) artificial intelligence/machine
+learning
+
+• Some trade-offs:
+• Python is relatively slow
+• Python is very expandable
+• It is easy to let Python cooperate with programs written in faster (e.g. compiled) languages like C, C+
++, FORTRAN and RUST
+• There are a lot of packages (extensions) available for Python, and some have faster programming
+languages under the hood
+
+3
+
+Program for Today
+1. Organization of the Course
+2. Python
+
+4
+
+Organization of the course
+• Instructors
+• Topics
+• Tools
+• Communication
+• Study advice
+• Pythonanywhere
+• Assesment
+
+5
+
+Instructors
+• Mathijs Janssen (course coordinator, lecturer, instructor for
+tutorial groups 5 and 10)
+• Reza Armakan (instructor for tutorial groups 11, 12, and 13)
+• Alessandro Capra (instructor for tutorial groups 6, 7, 8 and 9)
+• Oliver Feltham (instructor for tutorial groups 1, 2, 3 and 4)
+• Ieva Rudzite and Catalin Zaharia (Discussions page and
+email: intropython-eb@uva.nl)
+
+6
+
+Communication
+• Central to our communication is the discussion board on Canvas
+• If you have questions about Python, you can ask them via the discussion
+board
+• They can be answered and discussed by your fellow students, but your
+teachers will regularly check the discussion board and solve any loose
+ends
+
+• Questions that are more personal can be asked via the mail
+function of canvas
+
+7
+
+Learning goals
+• Understanding code (Tutorials, lectures), this is exam material
+• Writing code (Tutorials, lectures), this is homework and can lead
+to a higher grade
+• Getting an idea about Python in the real world, possible guest
+lectures
+
+8
+
+Tools
+• Lectures (beginning of the week)
+• presentation of material about the python language that you need to know for the exam and
+that you can use for the programming exercises
+• Lectures are supported by lecture slides and Jupyter notebooks
+• Every week, you will get a set of personalized questions and a Python program that you can
+use to send your answers to our server and that server will tell you immediately whether your
+answer produce the right results, these questions can be quite complicated
+• You can send in solutions as often as you want, till the deadline Sunday night 23:59
+• Your answers will be tested automatically. Your code will be applied to several testsets. If a
+program produces the right result, you get a point, if it doesn't you won't get a point for that
+question
+• At the beginning of the next week, you will get feedback that tells you whether your solution
+worked correctly and also will give an example how to solve these exercises with the material,
+you had to study so far
+• These feedback solutions are also material to learn for the exam
+
+• DataCamp: a website with videos about the course material. The website will
+present you with questions, and instant feedback to your answers
+9
+
+Tools
+• Tutorials: here you can work on your homework and discuss problems with
+your fellow students and the tutors
+• Homework exercises can be more difficult than exam questions and exam
+questions will be more difficult/complex than DataCamp questions
+• Q&A sessions (at the end of the week):
+• Tying loose ends
+• Material we could not deal with in the first lecture of the week
+• Questions you asked, during lectures, during tutorials and on the discussion board
+
+• The internet, has tons of well-done material on Python, some examples:
+• https://www.w3schools.com/python/ (the level is comparable to DataCamp, but a bit
+more extensive)
+• https://www.StackOverflow.com (the holy grail if you need help writing programs)
+• https://realpython.com/ (good tutorials, but not all are free. If you want to become very
+good, maybe spend some money here)
+10
+
+Running Python
+• There are a lot of options, but we will only mention a few
+• Notebooks can be run in the browser on Colab
+(https://colab.research.google.com/), If you want to be fancier have
+a look at the Anaconda project
+(https://anaconda.org/anaconda/anaconda-project)
+• We advise you to use Pythonanywhere for writing and testing your
+Python programs for the homework
+• Pythonanywhere runs in your browser
+• Pythonanywhere is very easy to set up and use and your teachers can help
+you with it
+
+• You are free to use other systems to run Python, but we
+cannot always offer help. There are just too many options
+11
+
+Study advice
+• Before the lecture, study the DataCamp material
+• After the lecture have a good look again at the notebook and
+the slides for that week
+• Play with the notebooks. Run the code, change the code and
+run it again
+• Come to the tutorials and do your homework exercises
+• If you don't understand something, google for a solution, and
+ask a question on the discussion board
+
+12
+
+Assessment
+• Midterm and Final exam
+• Multiple choice
+
+• Questions will test your ability to understand code
+• Examples:
+•
+•
+•
+•
+•
+
+Which code fragment will print the following output
+What will be printed by the following code fragment
+Which code fragment prints the same output as the following code fragment
+Of the following code fragments, one prints an output that differs from the other fragments
+Which of the following code fragments solves the following problem correctly
+
+•
+•
+•
+•
+
+None of the above
+Both
+All
+An error
+
+• Options can include:
+
+• You're allowed to use one (double-sided) A4-cheatsheet during the exam
+
+• Making a good cheat sheet will help you to learn the material for the exam, and maybe you
+won't need it during the exam anymore
+
+• Final exam grade must be at least 5.0
+• Total grade must be at least 5.5
+13
+
+Python
+• Logical and physical lines of code
+• Comments
+• Objects
+• Operators
+
+14
+
+Logical lines of codes
+• A Python program consists of
+• Logical lines of code
+
+• Simple statements consist of one logical line of code
+a = 1
+
+• Compound statements consist of several logical lines of code
+if a > 0:
+print("a is positive")
+else:
+print("a zero or negative")
+
+15
+
+Physical lines of code
+• In the previous slide every logical line was one physical line
+• Two or more physical lines can be joined into one logical line with the help of
+backward slashes, this is called explicit line joining:
+a = 'Two or more physical lines can be joined' +\
+' into one logical line with the help of backward slashes'
+
+• Sometimes one can use parts of a logical line inside a pair of parentheses, or
+square brackets, or curly brackets, to join physical lines, this is called implicit
+joining
+a = ['Sometimes one can use parts of a logical line inside a',
+'pair of parentheses, or square brackets, or curly brackets, ',
+'to join physical lines , this is called implicite joining ']
+
+• These examples of joining are easy to follow, but the precise rules of the
+explicit and implicit joining are a bit more complicated. However, in the exam
+material you can always assume the rules for joining are applied correctly
+16
+
+Comments
+# This whole physical line is a comment
+a = 1 # Everything after the hashtag (#) is a comment
+# This is a
+# multiline comment
+
+17
+
+Objects
+• Every object has exactly one unique id that cannot be changed
+• Every object has exactly one type that cannot be changed
+• Every objects has exactly one value
+• The type of an object defines which type of value can be stored in the object
+• The type of an object defines whether a value is mutable or is immutable
+• The value of a mutable objects can be changed, the value of an immutable
+object cannot be changed
+• An Object can have zero, one or more names bound/referring to it
+• A name can only refer to one object, at any time
+• Names can be unbound from an object and bound to another object any time
+18
+
+Objects
+• An object can be deleted
+• By using a del statement: del(name_of_object)
+• When an object is not referred to, not by a name or anything else, it can no
+longer be used in a program and Python's garbage collection will
+automatically remove the object
+• Objects created in a program [function], will only exist during the lifetime of
+the program [function], and will be automatically deleted when the program
+[function] ends
+
+• Everything in Python is an object
+
+19
+
+Assignment statements (I)
+• A common way to create an object is using an assignment statement, e.g.
+name_1 = 300
+
+• To follow exactly what Python will do, it is best to read these assignment
+statements from right to left:
+• Python creates a new object with value 300, type int, and a unique id
+• Python infers the object type from the value on the right side of the assignment
+statement. In this case the type will be int (integer)
+• Python binds the name on the left side of the assignment statement name_1 to this
+newly created object
+
+• We have created an object with the name name_1 and we can now display
+the value, the type and the id of the object:
+print (name_1)
+print (type(name_1))
+print (id(name_1))
+20
+
+Using assignment statements to
+create objects(II)
+• Let's now create a second object with value 300 and type int
+name_2 = 300
+
+• We can show, that name_1, and name_2 refer to objects that
+have the same value, and the same type, but have different id's
+print(name_1 == name_2)
+print(type(name_1) == type(name_2))
+print(id(name_1) != id(name_2))
+or shorter:
+print(name_1 not is name_2)
+
+21
+
+Using assignment statements to
+create objects(III)
+• You can also create an object and give it two (or more) names:
+name_3 = 300
+name_4 = name_3
+name_5 = name_3
+name_6 = name_4
+or shorter:
+name_3 = name_4 = name_5 = name_6 = 300
+
+• We can show, that name_3, that name_4, that name_5, and name_6
+all refer to the same object, and have the same value and type:
+print(name_3 == name_4 == name_5 == name_6)
+print(type(name_3) == type(name_4) == type(name_5) == type(name_6))
+print(name_3 is name_4 is name_5 is name_6)
+22
+
+Types of objects
+• Integer
+var_1 = 123
+print(type(var_1) == int)
+• Floating point number
+var_1 = 123.3
+print(type(var_1) == float)
+• String
+var_1 = '123'
+print(type(var_1) == str)
+• Boolean
+var_1 = True
+print(type(var_1) == bool)
+23
+
+Types of objects
+• Tuple
+var_1 = ('123', 123)
+print(type(var_1) == tuple)
+
+• List
+var_1 = [123, '123']
+print(type(var_1) == list)
+
+• Dictionary
+var_1 = {'key_1': 'elem_1', 'key_2': 'elem_2'}
+print(type(var_1) == dict)
+
+• Set
+var_1 = {123, '123'}
+print(type(var_1) == set)
+24
+
+Question
+• Which of the following statements is correct:
+I. Two objects can have different values, while having the same type
+II. Two objects can have the same value, while having different types
+
+a. I is correct
+b. II is correct
+c. I and II are both correct
+d. Neither is correct
+
+25
+
+Answer
+• Which of the following statements is correct:
+I. Two objects can have different values, while having the same type
+II. Two objects can have the same value, while having different types
+
+a. I is correct
+b. II is correct
+c. I and II are both correct
+d. Neither is correct
+I is correct for example:
+a = 1
+b = 2
+
+II is not correct, it is not possible to create 2 objects, with names a and b
+for which:
+print (a == b) gives True
+print (type(a) == type(b) gives False this
+
+26
+
+Names of objects
+• Names of objects can consist of (capitalized) letters, digits, and
+underscores (_)
+• Names of objects can start with (capitalized) letters, or an
+underscore
+• Names of objects are case sensitive, e.g. name_1 and Name_1 are
+different names
+• These are the minimal technical rules you have to abide too, if you
+don't follow them, Python throws an error
+• Organizations where you work can have extra rules
+• A common followed list of rules, can be found in the PEP 8 – Style
+Guide for Python Code (https://peps.python.org/pep-0008/ )
+27
+• In this course we only follow the minimal technical rules
+
+Arithmetic Operators
+• a + b, a – b, a * b
+• a / b, a // b
+• a / b results in a float
+• a // b results in the highest integer that is smaller or equal to the result of a
+division
+
+• a % b gives the remainder of the integer division
+• a ** b exponentiation
+• NB ^ (what is used in excel for exponentiation) is also a Python-operator but
+does something entirely different
+
+• Question: What is the result of (a//b)*b + a%b
+28
+
+Arithmetic Operators
+• a + b, a – b, a * b
+• a / b, a // b
+
+• a / b results in a float
+• a // b results in the highest integer that is smaller or equal to the result of a division
+
+• a % b gives the remainder of the integer division
+• a ** b exponentiation
+• NB ^ (what is used in excel for exponentiation) is also a Python-operator but does
+something entirely different
+
+• Question: What is the result of (a//b)*b + a%b
+• Answer: a
+29
+
+Comparison operators
+• a == b, a != b, a > b, a < b, a >= b, a <= b
+• Always lead to True or False
+• Comparing floats can be tricky: 1.1 + 2.2 according to Python is not equal to
+3.3. This is because floating point numbers are not precise. Computers use a
+binary system and that means that floats are not stored as precise as you maybe
+expect. For homeworkexercises we have built-in a tolerance so that when your
+answer is close enough you get a full point
+• If you are interested in how to solve this problem with floating points, have a look
+at the isclose function or the Decimal type, this is not part of the exam
+• Comparing strings, tuples and lists all work the same. Elements are compared
+from left to right, and the first elements that differs decides the result. If no
+element differs and the structures are of equal length, the structures are seen as
+equal. If no element differs and the structures are of different length, the longest
+structure is seen as larger
+30
+
+Boolean operators
+• x and y: True if both are True, otherwise False
+• x or y: False if both are False, otherwise True
+• not x: True if x is False, False if x is True
+• NB && and || (which are used in some programming languages for and
+and or) are also a Python-operators but do something entirely different
+
+31
+
+Mutable vs immutable
+• List (mutable):
+l1 = [1,2,3]
+print(l1)
+# Onscreen: [1, 2, 3]
+l1[2] = 4
+print(l1)
+# Onscreen: [1, 2, 4]
+
+• Tuple (immutable):
+t1 = (1,2,3)
+print(t1)
+# Onscreen: (1, 2, 3)
+t1[2] = 4
+# Onscreen: TypeError Traceback (most recent call last)
+Input In [2], in ()
+----> 1 t1[2] = 4
+TypeError: 'tuple' object does not support item assignment
+32
+
+Question
+• We know objects with a string value are immutable
+• Why then does the following code work
+box_1 = 'content'
+print(box_1)
+box_1 = 'new content'
+print(box_1)
+
+33
+
+Answer
+• We know objects with a string value are immutable
+• Why then does the following code work
+box_1 = 'content'
+print(box_1)
+box_1 = 'new content'
+print(box_1)
+
+• Answer: we didn't change the object, we created a new object and gave it
+an old name
+box_1 = 'content'
+print(box_1)
+old_id = id(box_1)
+box_1 = 'new content'
+print(box_1)
+new_id = id(box_1)
+print(old_id == new_id)
+34
+
+An example with a string (immutable)
+name_1 = 's1'
+
+Python creates an object with the value 's1', and binds the name name_1 to that object.
+We have now one object with the string value 's1' and with the name name_1
+
+name_2 = name_1
+
+To the object with value 's1' and with the name name_1, Python binds a second
+name name_2.
+We have now one object with the value 's1', and with two names name_1 and
+name_2
+
+name_1 = 's2'
+
+From the object with value 's1' the name name_1 is removed.
+Python creates a new object with the value 's2' and binds the name name_1 to
+this new object.
+We have now one object with the value 's2' and with the name name_1,
+and we have one object with the value 's1' and with the name name_2
+
+name_2 = 's3'
+
+From the object with the value ‘s1' the name name_2 is removed.
+If as is the case here, this is the only reference left to that object, Python's garbage
+collection will remove this object.
+35
+We will now have one object with value 's2' and with the name name_1
+
+An example with a list (mutable)
+l1 = ['s1', 's2']
+
+Python creates two objects, one with value 's1' and another one with value 's2'.
+Next, Python creates an object of type list that refers to these two objects and binds the
+name l1 to that list.
+(The objects containing 's1' and 's2' have no names, but have id's and can be
+referred to.)
+
+l2 = l1
+
+To the list referring to the two string objects, Python binds a second name l2.
+
+l1[0] = 's3'
+
+Python creates a new object with the value 's3'.
+Next, Python mutates the list, with the names l1 and l2. The first object referred
+to by that list (with the names l1 and l2) is no longer the object with value 's1',
+but the object with value 's3', while the second object referred to by that list (with
+the names l1 and l2) is still the object with the value 's2'.
+
+l2 = ['s4', 's5']
+
+From the first list the name l2 is removed.
+As that list is still referenced by the name l1, the list will not be removed by Python's
+garbage collection.
+Next, Python creates two objects, one object with the value 's4' and another object
+with the value ‘s5'.
+36
+Now Python creates a list referring to these two objects and binds the name l2 to it.
+
+Indexing
+• l1 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
+• The first element, seen from the left, is 0, the second is 1,
+and the last is len(l1)-1
+• The first element, seen from the right, is -1, the second is -2,
+and the last is -len(l1)
+• print(l1[0] == l1[-len(l1)] )
+
+37
+
+Slicing (I)
+• Slicing creates a new object made consisting of elements of another object
+• Slicing can be used with objects of type list, string and tuple and the result will be
+an object of the same type
+• Syntax: new_list = existing_list[start:end:step_size]
+• Start, end, and step_size are parameters of the slicing operation
+
+• Start is inclusive, and tells Python with which index to start the slicing
+• End is not inclusive, and tells Python with which index to stop the slicing (this
+could be beyond the highest or lowest index value)
+• The first element is 0, the second is 1, and the last is len(existing_list)
+• You can also use -1 for the last element and -len(existing_list)
+for the first
+• Step_size
+• len is a built_in function that gives you the number of elements when applied on a list,
+string or tuple
+
+38
+
+Slicing (I): examples when stepsize >= 1
+• Recall: new_list = existing_list[start:end:step_size]
+
+• l1 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
+• print(l1[0:6:2])
+• print(l1[1:6:1] == l1[1:6])
+• print(l1[1:6:1] == l1[1:6:])
+• print(l1[0:6:2] == l1[:6:2])
+• print(l1[2:len(l1):2] == l1[2::2])
+• print(l1[0:len(l1):1] == l1[::])
+39
+
+Question: what is the result of the
+following program?
+• l1 = [1, 2, 3, 4]
+l2 = l1
+l3 = l1[::]
+l1[-1] = 5
+print(l1 == l2 , l2 == l3)
+• And why?
+
+40
+
+Question: what is the result of the
+following program?
+• l1 = [1, 2, 3, 4]
+l2 = l1
+l3 = l1[::]
+l1[-1] = 5
+print(l1 == l2 , l2 == l3)
+• Answer: True False
+• Look at the definition of slicing: Slicing creates a new object
+
+41
+
+Slicing (II): examples when stepsize >=1
+• Recall: new_list = existing_list[start:end:step_size]
+• l1 = [1,2,3,4,5,6,7,8]
+• print(l1[7]) # You ask for the 8th element
+# Onscreen: 8
+• print(l1[-1]) # You ask for the last element
+# Onscreen: 8
+• print(l1[-5:5])
+# Onscreen: [4, 5]
+• print(l1[:-5])
+# Onscreen: [1, 2, 3]
+
+42
+
+Slicing (III): examples with negative
+steps
+
+• While with positive steps you go from the start to the right,
+with a negative step you go from the end to the left
+
+• l1 = [1,2,3,4,5,6,7,8]
+• print(l1[5:1:-2]) # Onscreen: [6, 4]
+• print(l1[5::-1]) # Onscreen: [6, 5, 4, 3, 2, 1]
+• print(l1[:1:-1]) # Onscreen: [8, 7, 6, 5, 4, 3]
+• print(l1[1:5:-2]) # Onscreen: []
+• Python will check whether you are already past the end index, it works
+similar as print(l1[5:1:2]) # Onscreen: []
+
+43
+
+Question: What will be printed?
+• l1 = [1, 2, 3, 4]
+• print(l1[::-1])
+
+44
+
+Question: What will be printed?
+• l1 = [1, 2, 3, 4]
+• print(l1[::-1])
+• Answer: [4, 3, 2, 1]
+
+45
+
+Slicing with strings and tuples
+• Slicing can also be done with strings and tuples
+• t1 = (1, 2, 3)
+print(t1[1:]) # Onscreen: (2, 3)
+• s1 = 'uva Amsterdam'
+print(s1[5:-3:2]) # Onscreen: mtr
+
+46
+
+Changing a slice of a list
+• Changing a list:
+l1 = [1, 2, 3, 4, 5, 6]
+l1[1:4] = l1[1:4][::-1]
+print(l1) # Onscreen: [1, 4, 3, 2, 5, 6]
+• Tricky:
+l1 = [1, 2, 3, 4, 5, 6]
+l1[1:2] = [1, 1]
+print(l1) # Onscreen: [1, 1, 1, 3, 4, 5, 6]
+vs
+l1 = [1, 2, 3, 4, 5, 6]
+l1[1] = [1, 1]
+print(l1) # Onscreen: [1, [1, 1], 3, 4, 5, 6]
+47
+
+'Changing' a slice of a string or a
+tupple
+• 'changing' a string:
+
+• s1 = 'uva Amxterdam'
+s1[6] = 's'
+# Gives an error
+• s1 = 'uva Amxterdam'
+s1 = s1[:6] + 's' + s1[7:]
+print(s1)
+# works
+
+• 'changing' a tuple:
+• t1 = (1, 4, 3)
+t1[1] = 2
+# Gives an error
+• t1 = (1, 4, 3)
+t1 = t1[:1] + (2,) + t1[2:]
+print(t1)
+# works
+48
+
+Range
+• range(start, stop, step)
+
+• Range function is used to generate a series of numbers. The
+start, stop and step parameters work similar as in list slicing, but
+as you will see the defaults work a bit different.
+x = list(range(6))
+print(x)
+# Onscreen: [0, 1, 2, 3, 4, 5]
+x = list(range(3,6))
+print(x)
+# Onscreen: [3, 4, 5]
+x = list(range(3,6,2))
+print(x)
+# Onscreen: [3, 5]
+49
+
+Functions
+• We often want to (re)use pieces of code
+• Pieces of code can be wrapped into a function, given a name, and then re-used
+by referencing that name
+• We can pass input to a function, these values are called arguments
+• Functions can create output, we say functions can return a value
+def size(length, width):
+return length * width
+print(size (2,3)) # Onscreen: 6
+
+• Python comes with a lot of built-in functions, we already saw:
+print
+id
+len
+type
+del
+
+• We don't much care how these built-in functions are written, we just want to know
+what it does ( = how it turns inputs into outputs)
+• We will write our own functions from Week 3 onwards
+50
+
+Objects
+• Organizing your code in functions is a good idea, but organizing your code
+in objects may be even better
+• Objects can encapsulate (≈ contain) functions and data
+• Objects are always defined on the basis of a blueprint, and that blueprint is
+called a class, so you first have to define the class:
+class Rectangle:
+def __init__(self, length, width):
+self.length = length
+self.width = width
+def size(self):
+return self.length * self.width
+
+51
+
+Objects
+• class Rectangle:
+def __init__(self, length, width):
+self.length = length
+self.width = width
+def size(self):
+return self.length * self.width
+• And now you can define your objects:
+rectangle_1 = Rectangle(2,3)
+rectangle_2 = Rectangle(3,3)
+print(rectangle_1.size(), rectangle_2.size())
+# Onscreen: 6 9
+
+52
+
+In Python, everything is an object
+• Recall that every object has a type, a value, and zero or more names
+• Functions that are encapsulated in objects are called methods
+• Depending on the type, an object has several methods
+• Methods can take arguments, and they also have access to the data
+inside the object
+• For every datatype there is already a built-in class, that defines what you
+can do with an object of that type
+
+53
+
+In Python, everything is an object
+• Sometimes, methods return a value
+• Sometimes, methods change the object itself, but this is only possible if the object
+is mutable
+• If an object is immutable, the method applied on it must return a value as it cannot change
+that object itself
+
+• Example of a method on an immutable object:
+• s1='UVA Amsterdam'
+s1=s1.upper() or s1.upper()
+• Which code is correct?
+• Answer: s1=s1.upper(), since the method upper() returns a new string. If you just do
+s1.upper() Python is ok with that, but the string itself cannot be changed. This error can be
+very difficult to find.
+
+• For methods working on mutable objects, you have to know whether it changes
+the object or returns a value.
+• Example (l1 is a list): l1. sort() sorts the list itself
+• Example (l1 is a list): l1. index('a') returns the index of the first element in the list with value
+'a'
+54
+
+Importing additional functionality from
+packages
+• Python ecosystem = core language + standard library + third-party
+packages
+• The ecosystem is enormous, there is no way to make it available by
+default
+• That's why we need to install third-party packages separately, for example
+• Even the standard library is large; it's functionality must be imported to be
+used
+• E.g. import math
+
+• Importing is about making the contents of a module (= Python file)
+available in the namespace of our program
+
+55
+
+Example: Importing additional
+functionality from packages
+• Example: how to access the randint function in the random module of the
+numpy package
+• Via import, you make an object available to your program
+• print(numpy.random.randint(1, 10)) # error
+• import numpy
+print(numpy.random.randint(1, 10)) # works
+• import numpy as np
+print(np.random.randint(1, 10))
+# works
+print(numpy.random.randint(1, 10)) # error
+• import numpy.random as rnd
+print(rnd.randint(1, 10))
+# works
+print(numpy.random.randint(1, 10)) # error
+56
+
+Example: Importing additional
+functionality from packages
+• from numpy.random import randint
+print(randint(1, 10))
+# works
+print(numpy.random.randint(1, 10)) # error
+• from numpy.random import randint as
+give_me_a_random_integer
+print(give_me_a_random_integer(1, 10)) # works
+print(numpy.random.randint(1, 10))
+# error
+• NB!! Notice you can only give one name to an imported object, so if you
+use as to change the name, you no longer can use the original name
+
+57
+
+
\ No newline at end of file
diff --git a/tmp/pdfs/text/week4.txt b/tmp/pdfs/text/week4.txt
new file mode 100644
index 0000000..cc0a038
--- /dev/null
+++ b/tmp/pdfs/text/week4.txt
@@ -0,0 +1,794 @@
+Introduction to Python
+Week 4
+
+1
+
+Program for This Week
+1.
+2.
+3.
+4.
+5.
+6.
+7.
+
+Defining strings
+Basic string manipulation
+String methods
+F-strings
+Object-oriented programming (OOP) concepts
+Error handling
+Midterm and homework questions (next week)
+
+3
+
+Defining strings with quotes
+• When using single quotes, Python searches for a matching quote, and stops
+searching at the End of the Line (EOL)
+• The following give an error (SyntaxError: EOL while scanning string):
+• print("it')
+• print('it")
+
+• When using triple quotes, Python searches for a matching triple, and stops
+searching at the End of the File (EOF)
+• The following give an error (EOF while scanning string literal):
+• print('''it's
+a new line)
+• print("""it's
+another new line
+"")
+4
+
+Quotes inside a string
+• The following works:
+• print("it's") # Onscreen: it's
+• print('it"s') # Onscreen: it"s
+
+• The following gives an error (SyntaxError: invalid syntax):
+• print("it"s")
+• print('it's')
+
+• Alternatively, working with escape characters also works:
+• print("it\"s\'s") # Onscreen: it"s's
+• print('it\"s\'s') # Onscreen: it"s's
+
+• Triple quotes work as well:
+• print("""it"s's""") # Onscreen: it"s's
+• print('''it"s's''') # Onscreen: it"s's
+
+5
+
+Escape characters
+• \\ = \
+• \’ = '
+• \" = "
+• \n = go to the next line
+• \t = insert a tab
+• print('The info, it\'s on the next\\following line in two columns:\n1\t2')
+# Onscreen: The info, it's on the next\following line in two columns:
+# 1 2
+• This is great, but if you must type the string yourself, using triple single or double quotes may be easier:
+• print("""The info, it's on the next\following line in two columns:
+1 2""")
+# Onscreen: The info, it's on the next line in two columns:
+# 1 2
+
+6
+
+Basic string manipulation: built-in functions
+• There are also some built-in functions that can be used with strings
+• Built-in means that they are part of the Python system, you don't have to program them yourself
+• The function len() gives you the length of a string:
+• a = 'abcd'
+print(len(a)) # Onscreen: 4
+• Concatenation, which is used to concatenate strings, uses the + operator:
+• a = 'abcd'
+b = 'ef'
+a = a + b
+print(a) # Onscreen: abcdef
+• That you can use an operator for several different operations is called operator overloading, in this case
+the + operator to add numbers, to concatenate strings, to append to lists
+• The function sorted() can also be used to a string:
+• print(sorted('acbd')) # Onscreen: ['a', 'b', 'c', 'd']
+• The result of sorting a string is a list. Later this lecture we will use the join method to transform
+this list back into a string
+7
+
+String methods
+• Methods are functions
+• Methods are, just like functions, called by adding round brackets after the method
+• Within these round brackets you can add arguments that you want to pass to the method
+
+• The difference with a function is that you always must pass the object on which
+the method is applied as first argument to the method
+• This can be done in several ways, but most easily by using the dot operator (dot = .)
+
+• Compare a function call:
+• print(len('abcd')) # Onscreen: 4
+
+• With a method call:
+• 'abcd'.index('b') # Onscreen: 1
+
+• Though it seems like only one argument is passed to the method, two arguments
+are passed to this index method: the string object with value 'abcd', and an object
+with value 'b'
+8
+
+String methods
+• Methods can either:
+• Change the object that is passed to them with the dot operator
+• Return a changed version of the object as a new object
+
+• If you program methods yourself, you can even let them do both
+• You can assume that the built-in methods of the standard library take only one option
+• For a built-in method, you must know which option it will be
+• With methods used in the Pandas library you can often change the default option via a parameter
+
+• Question: What will the option be in the case of a string method?
+• As strings are immutable, string methods can only return a new object
+
+• Technically, even a method that changes an object returns a value: just like a function
+without a return statement, a method without a return statement will return None
+• However, that returned value is not what you will be interested in
+
+9
+
+String methods: Question
+• For example, if you want to capitalize (make the first character uppercase) a
+string, which of the following code fragments will print: Abcd
+1. s1 = 'abcd'
+s1 = s1.capitalize()
+print(s1)
+2. s1 = 'abcd'
+s1.capitalize()
+print(s1)
+a) Both are correct
+b) Both are incorrect
+c) Only 1 is correct
+d) Only 2 is correct
+
+10
+
+String methods: Question
+• For example, if you want to capitalize (make the first character uppercase) a
+string, which of the following code fragments will print: Abcd
+1. s1 = 'abcd'
+s1 = s1.capitalize()
+print(s1)
+2. s1 = 'abcd'
+s1.capitalize()
+print(s1)
+a) Both are correct
+b) Both are incorrect
+c) Only 1 is correct
+d) Only 2 is correct
+•
+
+Correct answer: c. s1.capitalize doesn't change string s1, but returns a new string. You
+must give that new string a name else you cannot use it in the print statement. The second
+code fragment, actually prints abcd
+11
+
+String methods: change and test case
+• Change the case:
+• print('ABcd'.upper()) # Onscreen: ABCD
+• print('ABcd'.lower()) # Onscreen: abcd
+
+• Change only the first character into uppercase:
+• print('abcd'.capitalize()) # Onscreen: Abcd
+
+• NB! I use the word change a lot, but don't forget the string cannot be changed,
+we actually create a new string on the basis of the old string
+• Test the case of the letters in the string:
+• print('ABCD'.isupper()) # Onscreen: True
+• print('ABcd'.isupper()) # Onscreen: False
+• print('ABcd'.islower()) # Onscreen: False
+• print('abcd'.islower()) # Onscreen: True
+• print('ABcd'[:2].isupper()) # Onscreen: True
+
+12
+
+String methods: split
+• Split a string: for example, consider s1 = 'axbcxdefxg h\nij\tk'
+• print(s1.split('x')) # Onscreen: ['a', 'bc', 'def', 'g h\nij\tk']
+• print(s1.split('x', 2)) # Onscreen: ['a', 'bc', 'defxg h\nij\tk']
+• print(s1.rsplit('x', 2)) # Onscreen: ['axbc', 'def', 'g h\nij\tk']
+• print(s1.split()) # Onscreen: ['axbcxdefxg', 'h', 'ij', 'k']
+• print(s1.split('q')) # Onscreen: ['axbcxdefxg h\nij\tk']
+• The argument you pass to split, is used to split the string and is also removed from the string
+• If the argument is not in the string, Python will return an element with only one element, which is a copy
+of the string
+• If you also add a number, then that will be the maximum number of times Python will split the string
+• The default is splitting around spaces, new lines (\n), and tabs (\t)
+• To split a string in physical lines:
+• s1 = 'axbcx\rdefxg \nhij '
+• print(s1.split('\n'))
+# Onscreen: ['axbcx\rdefxg ', 'hij']
+• print(s1.splitlines())
+# Onscreen: ['axbcx', 'defxg ', 'hij']
+• I prefer the first
+
+13
+
+String methods: join
+• Join a string: for example: l1 = ['abc', 'de', 'fg', 'h']
+• print('xy'.join(l1)) # Onscreen: abcxydexyfgxyh
+• print(''.join(l1)) # Onscreen: abcdefgh
+
+• How to sort a string:
+• a = sorted('0123456789', key=lambda x: str(int(x) % 2 == 1) + x))
+• print(''.join(a)) # Onscreen: '0246813579'
+
+14
+
+String methods: strip
+• Strip a string: for example, consider s1 = ' fgedee '
+• print(s1.strip(' e')) # Onscreen: fged
+• print(s1.strip()) # Onscreen: fgedee
+• print(s1.lstrip(' e')) # Onscreen: fgedee..
+• print(s1.lstrip()) # Onscreen: fgedee..
+• print(s1.rstrip(' e')) # Onscreen: ..fged
+• print(s1.rstrip()) # Onscreen: ..fgedee
+• Python removes characters from the object if they are in the passed string and stops as soon as it
+encounters a character that is not in the list
+• strip works from both sides of the string, lstrip starts from the left side, and rstrip starts
+from the right side
+• s1.strip(' e') and s1.lstrip(' e').rstrip(' e') give the same result
+• The default is removing spaces, new lines (\n), and tabs (\t)
+• More types of so-called white spaces will be removed, but only these 3 you must know
+• NB! The spaces in the strip examples are represented by dots in the Onscreen
+15
+
+String methods: replace
+• Replace a substring: consider for example s1 = 'abcdefghabcdefgh':
+• print(s1.replace('a', 'aa')) # Onscreen: aabcdefghaabcdefgh
+• print(s1.replace('a', 'aa', 1)) # Onscreen: aabcdefghabcdefgh
+• print(s1.replace('a', '')) # Onscreen: bcdefghbcdefgh
+• print(s1.replace('q', 'qq')) # Onscreen: abcdefghabcdefgh
+
+• The first passed string is the old substring and it will be replaced by the second passed
+string, that is the new substring
+• The new and the old substring can have any length
+• Only the new string can be an empty string: you can use this to remove substrings from the string
+
+• You can add an integer, and that will tell Python how many changes to make
+• If you don't add a number Python will replace all old substrings
+
+16
+
+String methods: find, index
+• Find a substring: consider for example
+• s1 = 'abcdefghabcdefgh'
+• print(s1.find('e'))
+# On screen: 4
+• print(s1.index('e', 5))
+# On screen: 12
+• print(s1.find('e', 5, 10))
+# On screen: -1
+• print(s1.index('e', 5, 13))
+# On screen: 12
+• print(s1.find('ef'))
+# On screen: 4
+• print(s1.index('q'))
+# On screen: ValueError: substring not found
+• With these methods, you can find the index of a substring in a string
+• If you add one integer as an extra parameter, it will tell Python from where to start searching in the string
+• If you add another integer as an extra parameter, it will tell Python before which index to stop searching
+• The only difference between find and index is that if find cannot find anything, find will return –
+1 and if index cannot find anything index will throw an error. In all other cases find and index will
+return a non-negative integer.
+17
+
+String methods: count
+• Find a substring: consider for example
+• s1 = 'abcdefghabcdefgh'
+• print(s1.count('e'))
+• print(s1.count('e', 5))
+• print(s1.count('e', 5, 10))
+• print(s1.count('e', 5, 13))
+• print(s1.count('ef'))
+• print(s1.count('q'))
+
+# Onscreen: 2
+# Onscreen: 1
+# Onscreen: 0
+# Onscreen: 1
+# Onscreen: 2
+# Onscreen: 0
+
+• With these methods, you can find how often a substring occurs in a string
+• If you add one integer as an extra parameter, it will tell Python from where to start
+searching
+• If you add another integer as an extra parameter, it will tell Python before which index
+to stop searching
+19
+
+String methods: Question
+• You have a string called 's1', with only lowercase letters. You want to create a new
+string where only the last letter is capitalized and give it the name 's1'. Which of the
+following codes, gives the correct result?
+1. s1 = s1[::-1].capitalize()[::-1]
+2. s1 = s1[:-1]+ s1[-1].upper()
+3. s1 = ''.join(list(s1)[:-1]+ [list(s1)[-1].upper()])
+
+a) Only 1 is correct
+b) Only 2 is correct
+c) They are all correct
+d) They are all incorrect
+
+20
+
+String methods: Question
+• You have a string called 's1', with only lowercase letters. You want to create a new
+string where only the last letter is capitalized and give it the name 's1'. Which of the
+following codes, gives the correct result?
+1. s1 = s1[::-1].capitalize()[::-1]
+2. s1 = s1[:-1]+ s1[-1].upper()
+3. s1 = ''.join(list(s1)[:-1]+ [list(s1)[-1].upper()])
+
+a) Only 1 is correct
+b) Only 2 is correct
+c) They are all correct
+d) They are all incorrect
+e) Correct answer: c. This is quite a difficult question best to run it and see what
+happens, and try to understand
+21
+
+String methods: Question
+• How to sort a string?
+1. s1 = 'acbd'
+l1 = sorted(s1)
+s1 = ''.join(l1)
+2. s1 = 'acbd'
+l1 = list(s1)
+l1 = l1.sort()
+s1 = ''.join(l1)
+
+a) Both are correct
+b) Both are incorrect
+c) Only 1 is correct
+d) Only 2 is correct
+
+22
+
+String methods: Question
+• How to sort a string?
+1. s1 = 'acbd'
+l1 = sorted(s1)
+s1 = ''.join(l1)
+2. s1 = 'acbd'
+l1 = list(s1)
+l1 = l1.sort()
+s1 = ''.join(l1)
+
+a) Both are correct
+b) Both are incorrect
+c) Only 1 is correct
+d) Only 2 is correct
+• Correct answer: c. In the third line of code in option 2, l1.sort(), changes l1 and
+returns None, and so in line 4 l1 is now None and Python will throw an error
+23
+
+String module
+• import string
+print(string.ascii_lowercase) # Onscreen: abcdefghijklmnopqrstuvwxyz
+print(string.ascii_uppercase) # Onscreen: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+print(string.ascii_letters)
+# Onscreen: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+print(string.digits) # Onscreen: 0123456789
+print(string.punctuation) # Onscreen: "#$%&'()*+,-./:;<=>?@[\]^_`{|}
+~
+print(string.whitespace) # Onscreen:
+print ('\t' in string.whitespace, '\n' in string.whitespace, ' '
+in string.whitespace) # Onscreen: True True True
+
+• These are all strings that you can use after importing string
+• In general, laziness is a good thing for a programmer. Although it is hardly more
+work, using these constants instead of typing all those characters yourself, avoids
+making errors.
+24
+
+F-strings
+• F-strings can be used to format output
+• They can be very convenient
+• Say you want a function that multiplies two integers and e.g., when you multiply 7 and 13, returns a string that
+looks as follows: "0007 times 0013 gives 0091"
+• This can be done by writing a function with what we learned in the first 3 weeks:
+def main(a, b):
+def format1(x):
+return ('0000' + str(x))[-4:]
+return format1(a) + ' times ' + format1(b) + ' gives ' + format1(a * b)
+
+25
+
+F-strings
+• With an F-string, the task gets more convenient and more readable:
+• def main(a, b):
+return f'{a:04d} times {b:04d} gives {a * b:04d}'
+
+• Inside the curly braces, before the colon you have the value and after the colon
+the formatting of that value
+• You don't have to know the part after the colon for the exam, just the value part
+
+• In this case, the f means you deal with an integer, the 4 gives you the length,
+and the 0 tells Python to add extra zeroes in front if the number is shorter than 4
+digits
+
+26
+
+F-strings
+• If you leave out the formatting part, Python will just apply the str function to the
+value
+• print(f'{a} {b}' == str(a) + ' ' + str(b)) # Onscreen: True
+
+• The values can be just simple values, or the returns of functions/methods, or slices
+or values from sequences or dictionaries: in short, all expressions that Python will
+evaluate to a value
+• For example:
+• s1 = 'tekst'
+t1 = (1, 2, 3)
+l1 = [4, 5, 6]
+capitals = {'Netherlands' : 'Amsterdam'}
+print(f'{s1} {s1.upper()} {t1[2]} {l1} {capitals["Netherlands"]}')
+# Onscreen: tekst TEKST 3 [4, 5, 6] Amsterdam
+
+27
+
+F-strings
+• Just like with strings in general, if you use one type of quotes on the outside,
+you should use the other type of quotes on the inside
+• If you cannot solve this problem, you can always use escape characters (\' and \")
+
+• If you need to escape a { or } you cannot achieve that with a backward slash, but
+you can by doubling the braces {{ and }}
+• Although f-strings are very convenient, I find the documentation on the internet a
+bit difficult to comprehend, so I always end with trial and error, and success in the
+end
+• A nice trick for debugging purposes:
+a = 10
+b = 'Amsterdam'
+print (f'{a=}{b=}')
+
+# Onscreen: a=10 b='Amsterdam'
+
+28
+
+Object-Oriented Programming
+• Programming philosophy/approach
+• A way of organising code
+
+• Well-organised code: easier to understand, fix bugs and
+maintain/extend
+• Trade-off with performance
+• Usually only relevant in large projects
+• OOP is helpful for organisation, but not a guarantee for good
+organisation
+• (Alan Kay, “inventor” of OOP: better named “process-oriented
+programming”)
+29
+
+Object-Oriented Programming (Background)
+• OOP is hard-wired into Python, but we can do more of it.
+• Everything is an object/process
+• Encapsulation: objects have data/attributes (name, age, colour) and
+methods/stuff we want to do with the data (index, sort, draw)
+• Abstraction: focus on what object does, hide how it does it.
+• Inheritance: objects take properties (attributes and methods) from
+superclasses (circle is a type of shape, consumer is a type of agent)
+• Polymorphism: conceptually similar methods have same name, even
+if implementation is different (draw circle vs draw rectangle)
+30
+
+Object-Oriented Programming (Background)
+• Advantage: if well chosen abstractions, focus on problem at hand
+• Easier to read, fix and extend
+• Compare list1.len()and
+length = 0
+for x in list1:
+length +=1
+
+return length
+
+• If not well-chosen, classes can be a confusing mess
+• Choosing well is beyond the scope of this course
+
+31
+
+Class definition
+class Rectangle:
+def __init__(self, length, width=1):
+self.length = length
+self.width = width
+def size(self, data_type=int):
+return f"The size = {data_type(self.length * self.width)}."
+rectangle_1 = Rectangle(2,3)
+rectangle_2 = Rectangle(3)
+rectangle_3 = Rectangle(2,2)
+for object in [rectangle_1, rectangle_2, rectangle_3, Rectangle(4,4)]:
+print(object.size(float))
+# On screen: 6.0
+3.0
+4.0
+16.0
+
+32
+
+Class definition
+• A class definition starts with the class keyword
+• The first line of the class definition ends with a colon (:), so the next
+line(s) should be indented
+• Everything indented more than the class keyword is seen as part of
+the class definition
+• The class definition stops when the level of indentation is the same as that of
+the class keyword
+
+33
+
+Object creation
+class Rectangle:
+def __init__(self, length, width=1):
+self.length = length
+self.width = width
+def size(self, data_type=int):
+return f"The size = {data_type(self.length * self.width)}."
+rectangle_1 = Rectangle(2,3)
+rectangle_2 = Rectangle(3)
+rectangle_3 = Rectangle(2,2)
+for object in [rectangle_1, rectangle_2, rectangle_3, Rectangle(4,4)]:
+print(object.size())
+
+34
+
+Object creation
+• rectangle_1 = Rectangle(2,3)
+• Python will:
+1. Create a new object (empty at this point)
+2. Pass that object and the arguments between the brackets, in this case 2 and 3,
+to the __init__ method that is defined inside the class definition
+• Python calls the __init__ method in the following
+way: __init__(rectangle_1, 2, 3)
+3. Assign the name rectangle_1 to the new object
+
+• The creation of an object this way, is called the instantiation of the
+object
+
+35
+
+Class name
+class Rectangle:
+def __init__(self, length, width=1):
+self.length = length
+self.width = width
+def size(self, data_type=int):
+return f"The size = {data_type(self.length * self.width)}."
+rectangle_1 = Rectangle(2,3)
+rectangle_2 = Rectangle(3)
+rectangle_3 = Rectangle(2,2)
+for object in [rectangle_1, rectangle_2, rectangle_3, Rectangle(4,4)]:
+print(object.size())
+
+• It is a convention to start class names with a capital letter
+• Convention means: Python doesn't care, but people do
+
+36
+
+Methods
+class Rectangle:
+def __init__(self, length, width=1):
+self.length = length
+self.width = width
+def size(self):
+return f"The size = {self.length * self.width}."
+rectangle_1 = Rectangle(2,3)
+rectangle_2 = Rectangle(3)
+rectangle_3 = Rectangle(2,2)
+for object in [rectangle_1, rectangle_2, rectangle_3, Rectangle(4,4)]:
+print(object.size())
+
+37
+
+Methods
+• Definitions of functions and methods look the same
+• The difference is that a method always expects an object as the first argument
+• The object itself is passed to the method via the dot operator:
+• The method call rectangle_1.size(float) passes the object with the
+name rectangle_1 to the method as the first argument, float is the second argument
+
+• By convention, the corresponding parameter is called self
+• You call these methods with the help of round brackets, pass the object via the dot
+operator, and pass other arguments between the brackets
+• print(rectangle_1.size()) # Onscreen: 6
+• print(rectangle_2.size()) # Onscreen: This rectangle is 3 by 1
+
+• You have two type of methods:
+• Methods you call directly like size()
+• Methods that you call indirectly like __init__
+38
+
+__init__ method
+class Rectangle:
+def __init__(self, length, width=1):
+self.length = length
+self.width = width
+def size(self, data_type=int):
+return f"The size = {data_type(self.length * self.width)}."
+rectangle_1 = Rectangle(2,3)
+rectangle_2 = Rectangle(3)
+rectangle_3 = Rectangle(2,2)
+for object in [rectangle_1, rectangle_2, rectangle_3,
+Rectangle(4,4)]:
+print(object.size())
+
+39
+
+__init__ method (a dunder method)
+• The __init__ method is called automatically by Python after Python creates an object
+• The object itself and the arguments are passed to the __init__ method
+• Python calls the __init__ method for you, so the name should be exactly __init__
+• The first thing you should do is storing the passed arguments into the objects itself, if the
+information is to be used outside the __init__ method. Otherwise, the information is only
+available during the execution of the __init__ method
+• self.length = length
+• self.width = width
+• The __init__ method can have a return statement, but that is only allowed to return None
+• The __init__ method is a so-called dunder method. Dunder means double underscore. Dunder
+methods are automatically called by Python. For example, __add__ is automatically called when
+you use the plus operator. As the __add__ dunder method can be defined for several classes, it
+can have a different working depending on the context. This is the so-called operator overloading
+• Dunder methods are in general not directly called by you but are automatically called by Python.
+However, it is often possible to call them directly. The dunder method __add__ is the method
+automatically called when Python processes the + operator, can also be called directly
+print([1,2,3].__add__([4,5]))
+# On screen: [1, 2, 3, 4, 5]
+
+40
+
+Class attributes
+class Rectangle:
+total_size = 0
+def __init__(self, length, width=1):
+self.length = length
+self.width = width
+Rectangle.total_size += self.length * self.width
+print(f'{self.length} by {self.width} created, {Rectangle.total_size = }')
+def size(self, data_type=int):
+return f"The size = {data_type(self.length * self.width)}."
+def __del__(self):
+Rectangle.total_size -= self.length * self.width
+print(f'{self.length} by {self.width} deleted, {Rectangle.total_size = }')
+print(Rectangle.total_size)
+rectangle_1 = Rectangle(2,3)
+
+# On screen: 0
+# On screen: 2 by 3 created, Rectangle.total_size = 6
+
+rectangle_2 = Rectangle(2)
+del rectangle_1
+
+# On screen: 2 by 1 created, Rectangle.total_size
+= 8
+41
+# On screen: 2 by 3 deleted, Rectangle.total_size = 2
+
+Class attributes
+• Class attributes are objects where you store information that you want to use in
+several objects created on the basis of the same class
+• You can reference class attributes outside the class:
+• print(Rectangle.objects_in_existence) # Onscreen: 2
+
+42
+
+__del__ method
+class Rectangle:
+objects_in_existence = 0
+def __init__(self, length, width=1):
+self.length = length
+self.width = width
+Rectangle.objects_in_existence += 1
+def size(self):
+return f"size = {self.length * self.width}"
+def info(self):
+return f'This rectangle is {self.length} by {self.width}'
+def __del__(self):
+Rectangle.objects_in_existence -= 1
+rectangle_1 = Rectangle(2,3)
+rectangle_2 = Rectangle(3)
+43
+
+__del__ method
+• The __del__ method is called automatically just before an object is deleted
+• While a class definition without an __init__ method makes no sense, a class
+without a __del__ method is very common
+• You can delete an object with a del statement, or have it automatically deleted
+when there is no longer any reference to this object (this is
+called garbage collection), as explained in week 1
+• In both cases Python will check whether you defined a __del__ method and call it for you
+
+44
+
+Referencing and defining attributes outside class and object
+• You can reference and define class and object attributes from the 'outside'
+class Rectangle:
+objects_in_existence = 0
+def __init__(self, length, width=1):
+self.length = length
+self.width = width
+Rectangle.objects_in_existence += 1
+def info_about_attribute_a(self):
+return f'{Rectangle.a=}, {self.a=}'
+• rectangle_1 = Rectangle(2,3)
+• We can define attributes, and refer to attributes from outside a class/object
+rectangle_1 = Rectangle(2,3)
+Rectangle.a = 5
+rectangle_1.a = 10
+print(Rectangle.a, rectangle_1.a)
+#On screen: 1 5 10
+• Now we can define, and refer to class/object attributes from outside the class/object
+print(rectangle_1.info_about_attribute_a()
+# On screen: Rectangle.a=5, self.a=10
+• Though insightful, not an example to follow
+
+45
+
+Error handling
+• We saw:
+
+s1 = 'abcdefghabcdefgh'
+print(s1.find('i')) # Onscreen: -1
+print(s1.index('i')) # Onscreen: ValueError: substring not found
+
+• Both ways to tell the caller of the method that the substring is not
+found are fine
+• However, you could prefer the way the find method deals with not finding the
+substring over the way the index method deals with it (by throwing an error),
+or the other way around
+
+• Python has a nice way to deal with errors, which is used a lot in the real
+world
+• It is not part of the exam, but it will be used in one future homework question
+
+46
+
+Error handling
+• If you want to have an index function that when not finding returns -1 instead of
+throwing an error, you can do the following:
+• def my_index(s,needle):
+try:
+result = s.index(needle)
+•
+except:
+result = -1
+•
+return result
+• s1 ='abcdefghabcdefgh'
+print(my_index(s1, 'e')) # Onscreen: 4
+print(my_index(s1, 'i')) # Onscreen: -1
+
+• Although you can make it more complicated, this is the basis: you tell Python in the
+try part to run some code and tell Python in the except part, what Python should
+do in case of an exception (error)
+• Instead of Python throwing an error and killing your program, which means that
+the rest of your code won't be executed, your program stays in control
+
+47
+
+Error handling
+• If you want to have a find function that when not finding throws an error, instead of
+returning -1, you can do the following:
+• def my_find(s,needle):2
+if (result := s.find(needle)) == -1:
+•
+raise ValueError("substring not found")
+•
+return result
+• s1 ='abcdefghabcdefgh'
+print(my_find(s1, 'e')) # Onscreen: 4
+print(my_find(s1, 'i')) # Onscreen: ValueError: substring not
+found
+
+• Not throwing an error can be tricky:
+• s1 = 'abcdefghabcdefgh'
+• Question: What is the result of print(s1[s1.find('i')])
+48
+
+
\ No newline at end of file
diff --git a/tmp/pdfs/text/week5.txt b/tmp/pdfs/text/week5.txt
new file mode 100644
index 0000000..7f9b415
--- /dev/null
+++ b/tmp/pdfs/text/week5.txt
@@ -0,0 +1,2943 @@
+Introduction to Python
+Week 5
+
+1
+
+Program for This Week: Data analysis with Pandas
+1. Dataframe
+2. Series
+3. Selection
+4. Missing data
+5. Operations on data
+6. Merging (concatenate and join)
+7. Grouping
+Merging and grouping are part of the weekly exercises but are not exam material.
+
+2
+
+Pandas DataFrame
+• Pandas is one of the standard libraries in data science
+• The most important datatype used in Pandas is the DataFrame
+• A DataFrame contains tabular data just like a spreadsheet in excel
+• A Dataframe with only one column is called a Series
+
+• Pandas is built on top of NumPy, so there is overhead because of the conversion to and from NumPy structures
+• NumPy lacks the flexibility of Python, and therefore is fast when crunching numbers
+• Pandas works fast with uniform numerical data, but can be slow when working with string data
+• Pandas is very flexible, this comes with a performance price
+• Like NumPy, Pandas offers vectorization: you can apply a function to all elements of a column/row/frame.
+Vectorization will probably be faster than loops or the map function in Python, but that is not a given
+• Vectorization can make your code more readable
+• An interesting library for data science is Polar, written in Rust, avoiding Pandas/Numpy conversion overhead.
+https://www.datacamp.com/blog/an-introduction-to-polars-python-s-tool-for-large-scale-data-analysis.
+• Interesting is also Microsoft's project 'Python in excel' where your interface is not a Pandas DataFrame but an
+excel spreadsheet. https://support.microsoft.com/en-us/office/introduction-to-python-in-excel-55643c2e-ff563
+4168-b1ce-9428c8308545
+
+DataFrame, rownames and colnames
+Name
+
+Length
+
+Weight
+
+First
+
+A
+
+153
+
+55
+
+Second
+
+B
+
+160
+
+70
+
+Third
+
+C
+
+150
+
+60
+
+• Name, Length and Weight are the names of the columns and First, Second, and Third are the names of the rows (also
+called indices)
+• In these slides we will call these colnames and rownames, respectively, and you can get these the following way:
+# Onscreen: Index(['First', 'Second', 'Third'],
+• print(df.index)
+dtype='object')
+# Onscreen: Index(['Name', 'Length', 'Weight'],
+• print(df.columns)
+dtype='object')
+• df.index and df.columns are special attributes, over which you can iterate, and apply slicing and indexing to
+• These objects also have a map method, which you can use to apply a function to their elements
+• Elements of these objects cannot be changed, but they can be overwritten in full:
+# Onscreen: Error
+• df.index[1] = 'fourth'
+# Works
+• df.index = ['First', 'Fourth', 'Third']
+4
+
+Creating a DataFrame using a dictionary
+• Say you want to create the following dataframe:
+Name
+
+Length
+
+Weight
+
+First
+
+A
+
+153
+
+55
+
+Second
+
+B
+
+160
+
+70
+
+Third
+
+C
+
+150
+
+60
+
+• One of the easiest ways to create this dataframe is by using a dictionary:
+import pandas as pd
+d1 = {'Name':['A', 'B', 'C'],'Length':[153, 160, 150],'Weight':[55, 70, 60]}
+df1 = pd.DataFrame (d1, index=['First', 'Second', 'Third'])
+print(df1)
+
+5
+
+Creating a DataFrame using a dictionary
+• Let's do some closer inspection of the code, line by line:
+• import pandas as pd
+• You need to import the Pandas package just like the math package as it is not standard imported in
+Python
+• We rename the package to pd, this is simply a convention
+• d1 = {'Name':['A','B','C'],'Length':[153,160,150],'Weight':[55,70,60]}
+• We create a dictionary, where each key:value pair represents a column: the keys are the colnames
+and the values of the columns are in the sublists
+• df1 = pd.DataFrame (d1, index=['First','Second','Third'])
+• We use the DataFrame class from the Pandas package to create a dataframe object and give it the
+name df1
+• The index parameter defines the rownames
+• print(df1)
+• Print the created dataframe object to see whether it turned out as we planned
+6
+
+Creating a DataFrame using a list of lists
+• Alternatively, you can create a dataframe using a list of lists, where every sublist represents a
+row
+• import pandas as pd
+l1 = [['A', 153, 55], ['B', 160, 70], ['C', 150, 60]]
+df1 = pd.DataFrame (l1, index=['First', 'Second',
+'Third'], columns=['Name', 'Length', 'Weight'])
+print(df1)
+
+• Since there are no keys, you must pass the names of the columns another way
+to the DataFrame class
+• Instead of a list of lists, you can use a tuple of lists, or a list of tuples, or tuples of tuples
+
+7
+
+Creating a DataFrame using the transpose operator
+• import pandas as pd
+d1 = {'First':['A', 153, 55],'Second':['B', 160, 70],'Third':['C', 150, 60]}
+df1 = pd.DataFrame (d1, index=['Name', 'Length', 'Weight'] )
+• print(df1)
+First
+
+Second
+
+Third
+
+Name
+
+A
+
+B
+
+C
+
+Length
+
+153
+
+160
+
+150
+
+Weight
+
+55C
+
+70
+
+60
+
+Name
+
+Length
+
+Weight
+
+First
+
+A
+
+153
+
+55
+
+Second
+
+B
+
+160
+
+70
+
+Third
+
+C
+
+150
+
+60
+
+• df1 = df1.T
+• print(df1)
+
+8
+
+Creating a DataFrame using default col and row names
+• import pandas as pd
+l1 = [['A', 153, 55], ['B', 160, 70], ['C', 150, 60]]
+df1 = pd.DataFrame (l1)
+
+• The result of this code will be:
+
+
+0
+
+1
+
+2
+
+0
+
+A
+
+153
+
+55
+
+1
+
+B
+
+160
+
+70
+
+2
+
+C
+
+150
+
+60
+
+• You might think they look a lot like indices from a list, and it does, but looks can
+be deceiving since they are colnames and rownames, and are more like keys in
+dictionaries
+
+9
+
+Creating a series using a dictionary or a list
+• Say you want to create the following series
+First
+
+153
+
+Second
+
+160
+
+Third
+
+150
+
+Name: Length
+
+• import pandas as pd
+d1 = {'First': 153, 'Second': 160, 'Third': 150}
+s1 = pd.Series(d1, name = 'Length')
+print(s1)
+• import pandas as pd
+l1 = [153, 160, 150]
+s1 = pd.Series(l1, name = 'Length', index=['First', 'Second', 'Third'])
+print(s1)
+10
+
+Series using defaults
+• import pandas as pd
+l1 = [153, 160, 150]
+s1 = pd.Series(l1)
+print(s1)
+• The result of this code will be:
+0
+
+153
+
+1
+
+160
+
+2
+
+150
+
+11
+
+Dataframe and Series indices are like keys in dictionaries
+• With a list you can do the following:
+• l1 = [153, 160, 150]
+del l1[1]
+del l1[1]
+print (l1)
+# Onscreen: [153]
+• You cannot do that with a dictionary:
+• d1 = {0:153, 1:160, 2:150}
+del d1[1]
+del d1[1]
+# Onscreen: KeyError: 1
+• And, not with a series (or dataframe):
+• s1 = pd.Series([153, 160, 150])
+s1 = s1.drop(1)
+s1 = s1.drop(1)
+# Onscreen: KeyError: '[1] not found in axis'
+• The reason is that de indices of a list give relative positions and are recalculated, while indices in a series
+(and in a dataframe), and keys in a dictionary are not recalculated
+12
+
+Viewing data
+• Assume you created a dataframe like this:
+• import pandas as pd
+l1 = ['A', 'B', 'C', 'D'] * 250
+l2 = [160, 170, 180, 190, 200] * 200
+l3 = [55, 66] * 500
+d1 = {'Name':l1, 'Length': l2, 'Weight': l3}
+df1 = pd.DataFrame (d1)
+
+• If you do: print(df1), Python will only show you the first 5 and the last 5 rows
+• To have a bit more control, you could use:
+• print(df1.head(3)) to print the first 3 rows
+• print(df1.tail(7)) to print the last 7 rows
+• You can use 'any' number as an argument in head() and tail(), but the default is 5
+
+13
+
+Viewing data
+• If you are more interested in some quick statistics, you can use describe()
+• We can apply this to our dataframe with 1000 rows: print(df1.describe())
+• This results in:
+•
+
+Length
+Weight
+count 1000.000000 1000.000000
+mean
+180.000000
+60.500000
+std
+14.149212
+5.502752
+min
+160.000000
+55.000000
+25%
+170.000000
+55.000000
+50%
+180.000000
+60.500000
+75%
+190.000000
+66.000000
+max
+200.000000
+66.000000
+
+14
+
+Sorting dataframes
+1.
+2.
+3.
+4.
+
+Sorting a dataframe by rownames
+Sorting a dataframe by colnames
+Sorting a dataframe by the values in a row
+Sorting a dataframe by the values in a column
+
+15
+
+Sorting a dataframe by rownames
+• You have the following dateframe:
+
+
+Name
+
+Length
+
+Weight
+
+First
+
+A
+
+153
+
+55
+
+Second
+
+B
+
+160
+
+70
+
+Third
+
+C
+
+150
+
+60
+
+• df1 = df1.sort_index(axis=0, ascending=False))
+
+
+Name
+
+Length
+
+Weight
+
+Third
+
+C
+
+150
+
+60
+
+Second
+
+B
+
+160
+
+70
+
+First• ascending A
+153
+= True is the default
+
+55
+
+• axis = 0, and ascending = True are the defaults
+16
+
+Sorting a dataframe by colnames
+• You have the following dateframe:
+
+
+Name
+
+Length
+
+Weight
+
+First
+
+A
+
+153
+
+55
+
+Second
+
+B
+
+160
+
+70
+
+Third
+
+C
+
+150
+
+60
+
+• df1=df1.sort_index(axis=1, ascending=False)
+Weight
+
+Name
+
+Length
+
+First
+
+55
+
+A
+
+153
+
+Second
+
+70
+
+B
+
+160
+
+Third
+
+60
+
+C
+
+150
+
+• ascending = True is the default
+17
+
+Sorting a dataframe by the values in a column
+• You have the following dateframe:
+
+
+Name
+
+Length
+
+Weight
+
+First
+
+A
+
+153
+
+55
+
+Second
+
+B
+
+160
+
+70
+
+Third
+
+C
+
+150
+
+60
+
+• df1=df1.sort_values(by='Length', axis=0, ascending=False)
+
+
+Name
+
+Length
+
+Weight
+
+Second
+
+B
+
+160
+
+70
+
+First
+
+A
+
+153
+
+55
+
+Third
+C
+150
+60
+• This only works if all elements in the column have datatypes for which the > operator works
+• You can pass a list with several colnames to the by parameter, and several booleans to the ascending
+parameter
+18
+• axis = 0, and ascending = True are the defaults
+
+Sorting a dataframe by the values in a row
+• You have the following dateframe:
+
+
+Name
+
+Length
+
+Weight
+
+First
+
+100
+
+153
+
+55
+
+Second
+
+200
+
+160
+
+70
+
+Third
+
+300
+
+150
+
+60
+
+• df1=df1.sort_values(by='First', ascending=False, axis=1)
+
+
+Length
+
+Name
+
+Weight
+
+First
+
+153
+
+100
+
+55
+
+Second
+
+160
+
+200
+
+70
+
+Third
+
+150
+
+300
+
+60
+
+• This only works if all elements in a row have datatypes for which the > operator works
+• You can pass a list with several rownames to the by parameter, and several booleans to the
+ascending parameter
+• axis = 0, and ascending = True are the defaults
+
+19
+
+Selecting from a dataframe using columns
+• You can use the column names to select the corresponding column,
+similar to using keys in a dictionary:
+• df1 = df1[‘Length’]
+• df1 = df1[[‘Length’,’Width’]]
+
+• Notice that several columns are passed as a list!
+
+20
+
+Selecting from a dataframe, using loc
+• loc works on the rownames and the colnames of the dataframe
+• df1.loc[row_selection, col_selection]
+• Between the square brackets there are two parts:
+• Before the comma, you give your selection of rownames
+• After the comma, you give your selection of colnames
+
+• row_selection can be filled in in different ways:
+• Slicing: first_name : last_name
+• You select from the rows from the top to the bottom
+• Your selection is a list of rownames: the first one first_name, the last one last_name (inclusive!) and
+all the rows in between
+• If you leave out first_name the default is the first row and if you leave out the last_name the default
+is the last row
+• So, if you leave out first_name and last_name, you select all the rows
+• A list with 1 or more rownames: e.g. ['First', Third']
+
+• One rowname: e.g. 'First'
+21
+
+Selecting from a dataframe: loc
+• col_selection can be filled in in exactly the same ways:
+• Slicing: first_name : last_name
+• You make a selection from the columns from left to right
+• Your selection is a list of colnames: the first one first_name, the last one last_name (inclusive!) and
+all the columns in between
+• If you leave out first_name the default is the first column and if you leave out the last_name the
+default is the last column
+• So, if you leave out first_name and last_name, you select all the columns
+• A list with 1 or more colnames: e.g. ['Second', 'Third']
+
+• One colname: e.g. 'Third'
+
+• The only difference between row_selection and col_selection is that you can
+leave out the col_selection
+• The default is all colnames
+
+22
+
+Selecting from a dataframe, using iloc
+• iloc works almost the same as loc, but there are important differences:
+• iloc doesn't work with colnames and rownames, but with their relative position, like an index in a
+list
+• When slicing with iloc the end is not inclusive, like an index in a list
+• Just like with lists you can use -1 etc. to count from the opposite corner
+• You can use negative numbers when slicing, but also when you select rows/columns with a list of index
+numbers
+
+23
+
+Aside on slicing and indexing (Dijkstra)
+• Slices could be [inclusive:inclusive], [inclusive:exclusive],
+[exclusive:inclusive] or [exclusive:exclusive].
+• [in:ex]and [ex:in]: length is difference (len([5:18])=18-5), and consecutive
+slices have overlapping point ([5:12] + [12:18] == 5:18])
+• [ex:in]and [ex:ex]: starting at zero means [-1:…](ugly, and already used)
+• [in:in]and [ex:in]: empty list is [n:n-1]. Very ugly.
+• So [in:ex]it is.
+• Given that, index of the last element of [:n]is n if we start indexing at 0, but it is
+n if we start indexing at 1.
+• So we start indexing at 0.
+• (Argument doesn’t apply whenslicing by names instead of numbers. But still
+annoying…)
+
+24
+
+Selecting from a dataframe
+• The result of a selection is quite intuitive
+• All the cells that are at the same time part of one of the selected columns and one of the selected
+rows are selected
+
+• What may be less intuitive is the resulting datatype:
+Row_selection
+
+Col_selection
+
+Result
+
+A list/slice of rows
+
+A list/slice of cols A dataframe
+
+A list/slice of rows
+
+One col
+
+One row
+
+A list/slice of cols A series, where the values are from the row, the rownames
+are from the column selection and the name attribute of
+the series now contains the rowname
+
+One row
+
+One col
+
+A series, where the values are from the column, the
+rownames are from the row selection. The name attribute
+of the series now contains the colname
+
+A scalar, like an integer or a string
+
+• NB! A list/slice containing only one name is still a list/slice
+25
+
+df1.loc[:,:] or df1.iloc[:, :]
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+•
+
+26
+
+df1.loc[:] or df1.iloc[:]
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+•
+
+27
+
+df1.loc[:,10:12] or df1.iloc[:,:-1]
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+•
+
+28
+
+df1.loc[[3,0]] or df1.iloc[[0,3]]
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+•
+
+29
+
+df1.loc[[2]] or df1.iloc[[1]]
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+•
+
+30
+
+df1.loc[2] or df1.iloc[1]
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+10
+
+B
+
+13
+
+160
+
+12
+
+70
+
+17
+
+11
+
+Name: 2
+
+
+
+•
+
+31
+
+df1.loc[[2],[13]] or df1.iloc[[1],[1]]
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+•
+
+32
+
+df1.loc[[2],13] or df1.iloc[[-3],-3]
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+2
+
+160
+
+Name: 13
+
+
+
+•
+
+33
+
+df1.loc[2,13] or df1.iloc[-3,1]
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+160
+
+•
+
+34
+
+Name attribute
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+• s1 = df1.loc[2]
+print(s1.name) # On screen: 2
+• s1 = df1.iloc[1]
+print(s1.name) # On screen: 2
+
+• s1 = df1.loc[:,13]
+print(s1.name)
+# On screen: 13
+• s1 = df1.iloc[:,1]
+print(s1.name)
+# On screen: 13
+
+35
+
+Question, what is the result of
+
+
+0
+
+2
+
+3
+
+A
+
+153
+
+2
+
+B
+
+160
+
+• print(df2.iloc[2, 2])
+
+36
+
+Question, what is the result of
+
+
+0
+
+2
+
+3
+
+A
+
+153
+
+2
+
+B
+
+160
+
+• print(df1.iloc[2, 2])
+• IndexError: index 2 is out of bounds for axis 0 with size 2
+
+37
+
+Update a selection
+• You can use the selection mechanism also to change parts of a DataFrame
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+• df1.loc[[3,0]] = [['E', 100, 40, 20], ['F', 101, 41, 21]]
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+E
+
+100
+
+40
+
+20
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+F
+
+101
+
+41
+
+21
+38
+
+Selecting from a dataframe: boolean indexing
+• Previously, we said that the selection of the columns and the rows in
+df1.loc[row_selection, col_selection]
+
+can be done via a slice, a list with names or one name.
+• There is a fourth way: instead of giving a list of names, you can give a list or series with
+Boolean values (True, False)
+• This list with Boolean values has to have the same length as the number of rows
+• Then every row that corresponds with a True in the list is selected
+
+• Instead of a list with Booleans, you can also use a series with Boolean values
+
+39
+
+Boolean indexing
+• We want to select the green parts
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+• With loc: df1.loc[[3,2],[13,17]]
+• With iloc: df1.iloc[:2,[1,-1]]
+• With Boolean indexing: df1.loc[[True, True, False, False],[False, True,
+False, True]]
+
+• You could also mix and match:
+• df1.loc[[True, True, False, False],[13,17]]
+• df1.loc[[3,2],[False, True, False, True]]
+40
+
+Boolean indexing
+• We want to select all rows, where the values in column 13 < 155
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+• With loc: df1.loc[[3,1]]
+• With iloc: df1.iloc[::2]
+• With Boolean indexing: df1.loc[df1.13 < 155]
+• You could also mix and match:
+• df1.loc[[True, True, False, False],[13,17]]
+• df1.loc[[3,2],[False, True, False, True]]
+
+• You can also apply Boolean indexing to series
+41
+
+Selecting from a dataframe: shortcuts
+• df1.Name
+• df1.loc[:,'Name']
+• df1['Average Weight']
+• df1.loc[:,'Average Weight']
+• df1[['Name']]
+• df1.loc[:,['Name']]
+• df1[['Name', 'Weight']]
+• df1.loc[:,['Name', 'Weight']]
+• df1.Name['First']
+• df1.loc['First','Name']
+• df1.Name[['First', 'Second']]
+• df1.loc[['First', 'Second'],'Name']
+
+42
+
+Question: What will be printed by
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+• print(df1[[10,13]][[1,2]])
+
+43
+
+Question: What will be printed by: print(df1[[10,13]][[1,2]])?
+
+
+10
+
+13
+
+12
+
+17
+
+3
+
+A
+
+153
+
+55
+
+10
+
+2
+
+B
+
+160
+
+70
+
+11
+
+1
+
+C
+
+150
+
+60
+
+12
+
+0
+
+D
+
+190
+
+80
+
+13
+
+• df1 = df1[[10,13]]
+
+
+10
+
+13
+
+3
+
+A
+
+153
+
+2
+
+B
+
+160
+
+1
+
+C
+
+150
+
+0
+
+D
+
+190
+
+• print(df1[[1,2]])
+• An error
+
+44
+
+Selecting from a Series: shortcuts
+• s1[1]
+• df1.iloc[1]
+• s1[:2]
+• s1.iloc[:2]
+
+45
+
+Vectorized operations
+• Vectorized operations: you apply the same operation to all elements of one or
+several columns, to a row or to a series
+• This is a very powerful part of Pandas
+
+• The topics we will discuss are:
+• Broadcasting
+• Basic statistical operations are available as Series methods
+• Mapping a function to Series elements
+• Vectorized string methods
+• Applying a function to each row or to each column
+
+46
+
+Basic operations: broadcasting
+• Broadcasting can be done for the whole dataframe or for one column or row
+• This works with scalars (integers, floats)
+
+• Consider the following dataframe, called df:
+
+
+A
+
+B
+
+0
+
+2
+
+3
+
+1
+
+5
+
+4
+
+2
+
+6
+
+7
+
+• The following give the same result:
+• df += 1
+• df.A += 1; df.B +=1
+
+
+A
+
+B
+
+0
+
+3
+
+4
+
+1
+
+6
+
+5
+
+2
+
+7
+
+8
+47
+
+Basic operations: broadcasting
+• Instead of using broadcasting, you can also work with a more complex
+structure, as long as it has the same shape
+• For example: df *= df:
+
+
+A
+
+B
+
+0
+
+4
+
+9
+
+1
+
+25
+
+16
+
+2
+
+36
+
+49
+
+df:
+
+
+A
+
+B
+
+0
+
+2
+
+3
+
+1
+
+5
+
+4
+
+2
+
+6
+
+7
+
+• The following also works: df.A /= [1, 2, 3]
+
+
+A
+
+B
+
+0
+
+2.0
+
+3
+
+1
+
+2.5
+
+4
+
+2
+
+2.0
+
+7
+
+• But the following gives an error: df.A //= [1,2]
+# ValueError: operands could not be broadcast together with shapes (3,) (2,)
+48
+
+Basic statistical operations as Series methods
+
+
+A
+
+B
+
+0
+
+2
+
+3
+
+1
+
+5
+
+4
+
+2
+
+6
+
+7
+
+• mean, max, min, median, mode, sum, value_counts, std, ... all work as
+
+methods of series
+
+• For example, df.A.mean() returns 4.333333333333333
+
+• These methods can be used in a vectorized way too
+• For example, df.mean() returns the series:
+A 4.333333
+B 4.666667
+
+49
+
+Mapping a function to all elements
+
+df:
+
+• For example:
+• df.A = df.A.map(lambda x: 3 * x)
+• def triple(x):
+return x*3
+df.A = df.A.map(triple)
+
+
+
+A
+
+B
+
+
+
+A
+
+B
+
+0
+
+6
+
+3
+
+0
+
+2
+
+3
+
+1
+
+15
+
+4
+
+1
+
+5
+
+4
+
+2
+
+18
+
+7
+
+2
+
+6
+
+7
+
+• You can only apply this map method to a series
+• If you want to apply a function to all elements (all cells) in the dataframe, you must
+use applymap:
+• For example: df = df.applymap(lambda x: 3 * x)
+
+
+A
+
+B
+
+0
+
+6
+
+9
+
+1
+
+15
+
+12
+
+2
+
+18
+
+21
+
+50
+
+Vectorized string methods
+• Consider a Series called s that contains only strings
+• You may want to apply the same string method, indexing or slicing to every element of
+this series
+• We already saw that we can do this with the help of s.map
+• But, remember that last week we learnt that an object is always build based on a class
+• The basis of a string object is the class str
+• By using this class name str we can directly call the methods in the class
+• With this trick we can apply all methods that we know work for strings, slicing and
+indexing to the series
+• And because this is pandas, this will be broadcast to all elements of the series
+
+51
+
+Vectorized string methods
+• The following pairs of code work exactly the same way:
+• s.map(lambda x: x[::-1])
+s.str[::-1]
+• s.map(lambda x: x.lower())
+s.str.lower()
+• s.map(lambda x: x.count('a'))
+s.str.count('a')
+• s.map(lambda x: x.isupper())
+s.str.isupper()
+
+• And just like any other method, you can chain them with dot operators in between, if
+the result of the operation is a new series with only strings
+
+52
+
+Question
+• What will the following program print:
+
+import pandas as pd
+s = pd.Series(['abc', 'xAef', 'aAgh', 'xyz'])
+print(s.str.upper().str.count('A').mean())
+
+a. 0.0
+b. 0.5
+c. 1.0
+d. 1.5
+
+53
+
+Answer
+• What will the following program print:
+
+import pandas as pd
+s = pd.Series(['abc', 'xAef', 'aAgh', 'xyz'])
+print(s.str.upper().str.count('A').mean())
+
+a. 0.0
+b. 0.5
+c. 1.0
+d. 1.5
+
+Answer: option c is correct.
+
+54
+
+The vectorized in operator
+• The in operator is used to test whether a string is a substring of another string or a
+string is an element of a list (or tuple etc.)
+• The vectorized version is called isin
+• isin and in are not defined as methods in the str class
+• The following work the same:
+• s.map(lambda x: x in 'abcd')
+s.isin(list('abcd'))
+• s.map(lambda x: x not in 'abcd')
+~s.isin(list('abcd'))
+
+• The ~ operator works like the not operator but is vectorized
+• If you have a series with only Boolean values, and you apply the ~ operator all Trues will become
+False and all Falses will become True
+
+55
+
+Applying a function to each row/column
+• Say you want a new row with the averages of each column:
+df.loc['Av'] = df.apply(lambda x: x.mean(), axis = 0)
+
+df:
+
+
+A
+
+B
+
+0
+
+2
+
+3
+
+
+
+A
+
+B
+
+1
+
+5
+
+4
+
+0
+
+2.000000
+
+3.000000
+
+2
+
+6
+
+7
+
+1
+
+5.000000
+
+4.000000
+
+2
+
+6.000000
+
+7.000000
+
+Av
+
+4.333333
+
+4.666667
+
+• Say you want a new column with the averages of each row:
+df.loc[:,'Av'] = df.apply(lambda x: x.mean(), axis = 1)
+
+
+A
+
+B
+
+Av
+
+0
+
+2
+
+3
+
+2.5
+
+1
+
+5
+
+4
+
+4.5
+
+2
+
+6
+
+7
+
+6.5
+
+56
+
+Adding data to a dataframe
+• In the previous slide we saw an example of adding a column to a dataframe
+• When adding data to a column, the following applies:
+• A scalar value is broadcast to all rows
+• Collections of values (arrays, lists) must have a length and structure equal to the number of rows
+• A series of values added to a column will be fit into the dataframe according to the rownames of the
+dataframe and the indexnames of the series
+• Missing values may result if the two indices are not fully overlapping
+
+57
+
+Adding data to a dataframe
+• When adding data to a row, the following applies:
+• A scalar value is broadcasted to all columns
+• Collections of values (arrays, lists) must have a length equal to the number of columns
+• A Series of values added to a row will be fit into the DataFrame according to the columnames of the
+dataframe and the indexnames in the series
+• Missing values may result if the two indices are not fully overlapping
+
+58
+
+Missing data
+• A special value from Numpy is used to denote missing data: np.nan
+• Looks like 'NaN' when printed, but it is not a string: it's something like True, False, and None
+
+• Indicate missing values: df.isna(), creates the same shape as df, but with Trues and Falses
+• Replace missing data with a value: df.fillna(value)
+• Drop rows / columns with missing data: df.dropna()
+• Missing data is sometimes automatically generated
+• e.g. by merging datasets with (partly) incompatible names/indices
+
+59
+
+Concatenating DataFrames
+• Dataframes can be concatenated either vertically or horizontally:
+• Vertically: pd.concat([df1, df2])
+• Horizontally: pd.concat([df1, df2], axis=1)
+
+• The resulting DataFrame has the union of the index / column labels in the direction of
+concatenation
+• Missing values are created when the 'unionized' labels are not fully overlapping
+• axis=0, is the default
+
+60
+
+Joining / merging DataFrames
+• Data we want to use is often dispersed across several tables
+• Example:
+• We have millions of tax records, including municipality of residence, in one table
+• We have each municipality and the province it is part of in another table
+• We want to calculate taxes paid per province
+• We'd have to match the province from the second table to each tax record in the first table, using
+the municipality name as a key for the matching, before we can calculate province-level statistics
+• We'd have to join / merge the DataFrames
+
+61
+
+Merging DataFrames
+dftax
+
+
+Name
+
+Income
+
+Tax
+
+City
+
+0
+
+A
+
+100
+
+10
+
+Amsterdam
+
+1
+
+B
+
+200
+
+60
+
+Rotterdam
+
+2
+
+C
+
+150
+
+30
+
+London
+
+dfprov
+
+
+City
+
+Province
+
+0
+
+Amsterdam
+
+Noord Holland
+
+1
+
+Rotterdam
+
+Zuid Holland
+
+2
+
+Utrecht
+
+Utrecht
+
+62
+
+Merging DataFrames: on parameter
+•
+•
+•
+•
+
+print(dftax.merge(dfprov, how='left'))
+print(pd.merge(dftax, dfprov, how='left'))
+print(dftax.merge(dfprov, on= 'City', how='left'))
+print(dftax.merge(dfprov, left_on='City', right_on = 'City', how='left'))
+
+
+
+Name
+
+Income
+
+Tax
+
+City
+
+Province
+
+0
+
+A
+
+100
+
+10
+
+Amsterdam
+
+Noord Holland
+
+1
+
+B
+
+200
+
+60
+
+Rotterdam
+
+Zuid Holland
+
+2
+
+C
+
+150
+
+30
+
+London
+
+NaN
+
+• If both dataframes share some colnames, Pandas will use those to connect the data
+
+• If you want only some of the columns with the same name as the connection, you should use the on
+parameter
+• If the columns you want to use for the connection have different names, you have
+to use right_on and left_on
+• For example, if the city column in dfprov was called Cities you would need:
+right_on =‘Cities',
+
+left_on = ‘City'
+
+• The first dataframe is called left, the second one right
+
+63
+
+Merging DataFrames: how parameter
+• print(dftax.merge(dfprov,
+
+how='left'))
+
+
+
+Name
+
+Income
+
+Tax
+
+City
+
+Province
+
+0
+
+A
+
+100
+
+10
+
+Amsterdam
+
+Noord Holland
+
+1
+
+B
+
+200
+
+60
+
+Rotterdam
+
+Zuid Holland
+
+2
+
+C
+
+150
+
+30
+
+London
+
+NaN
+
+• print(dftax.merge(dfprov,
+
+how='right'))
+
+
+
+Name
+
+Income
+
+Tax
+
+City
+
+Province
+
+0
+
+A
+
+100
+
+10
+
+Amsterdam
+
+Noord Holland
+
+1
+
+B
+
+200
+
+60
+
+Rotterdam
+
+Zuid Holland
+
+2
+
+NaN
+
+NaN
+
+NaN
+
+Utrecht
+
+Utrecht
+
+64
+
+Grouping DataFrames (Split-Apply-Combine)
+1. Splitting the data into groups based on some criteria
+2. Applying a function to each group independently
+3. Combining the results into a data structure
+• Example:
+• In the tax records example earlier, we might split the data by province names, calculate total taxes
+paid for each province, then combine the resulting numbers into a Series indexed by province
+names
+
+65
+
+Grouping DataFrames
+• dfcombined = dftax.merge(dfprov, how='left')
+dfcombined.loc[:,'Province'] = dfcombined.loc[:,'Province'].fillna('Rest')
+# We replace the missing values with a string
+# As the groupby method ignores NaN values
+result = dfcombined.groupby('Province')['Tax'].sum()
+result = result.sort_values(ascending = False)
+# We want the highest taxed Province first
+
+•The result will be:
+Zuid Holland
+
+60
+
+Rest
+
+35
+
+Noord Holland
+
+10
+
+• You get the total tax with:
+print(result.sum())
+
+• And the tax for Noord Holland with:
+
+print(result['Noord Holland'])
+
+# Onscreen 105
+# Onscreen: 10
+66
+
+
\ No newline at end of file
diff --git a/tmp/pdfs/text/week6.txt b/tmp/pdfs/text/week6.txt
new file mode 100644
index 0000000..7c6803f
--- /dev/null
+++ b/tmp/pdfs/text/week6.txt
@@ -0,0 +1,694 @@
+Introduction to Python
+Week 6
+
+1
+
+Program for This Week
+1. Comprehensions
+2. Generators
+3. Handling dates and times with the datetime module
+4. On Friday we finish the slides if needed and if we have time left, we can do some
+questions of the trial exam
+
+3
+
+Comprehensions
+• Comprehensions are just a very concise way to write a for loop
+• You don't learn new logic here, but you learn a new way to write your loops
+• Everything you can do with a comprehension you can do with a loop
+• I also will show two examples of a loop and a comprehension doing the same,
+and use colors, so you can see you are passing Python the same information
+
+4
+
+List comprehensions
+• Example: you have a list called l1 with integers and you must write code that
+creates a new list where all integers are ignored when they are divisible by 3, are
+doubled when they are odd and not divisible by 3, and halved when they are
+even and not divisible by 3.
+The new list should only contain integers and be called l2.
+• For example, l1 = [1, 3, 2, 4] should result in l2 = [2, 1, 2]
+
+• Based on what you have learned so far, your solution could be:
+l2 = []
+for x in l1:
+if x % 3 == 0:
+continue
+addition = x * 2 if x%2 == 1 else x // 2
+l2.append(addition)
+
+• With a comprehension, the solution could be:
+
+l2 = [x * 2 if x%2 == 1 else x // 2 for x in l1 if x % 3 != 0]
+5
+
+List comprehensions
+• These options look very different, but both code fragments contain the same information for
+Python
+• l2 = []
+for x in l1:
+if x % 3 == 0:
+continue
+addition = x * 2 if x%2==1 else x // 2
+l2.append(addition)
+• l2 = [x * 2 if x%2==1 else x // 2 for x in l1 if x % 3 != 0]
+• This tells Python, what the name of the new list should be
+• This tells Python that we want to create a list, and append the results of the processed elements to
+that list
+• This tells Python what the source is of which we want to process the elements
+• This tells Python, which elements to include for processing (be careful in this set-up of the for loop
+you tell what to exclude but in a comprehension what to include)
+• This tells Python, what to do with the elements that should be processed
+
+6
+
+Dictionary comprehensions
+• Example: you have two lists called l1, l2 with integers and you must write code that creates
+a dictionary where the keys come from l1 and the values are triple those from l2, except when
+the key and/or the value can be divided by 2, then these values should be ignored.
+The new dictionary should be called d1.
+• For example, l1 = [1, 3, 2, 5], l2 = [1, 2, 6, 3] should result in d1 =
+{1:3, 5:9}
+• Based on what you learned so far, the solution could be:
+d1 = {}
+for k,v in zip(l1,l2):
+if k%2 == 0 or v%2 == 0:
+continue
+d1[k] = v * 3
+• With a comprehension, the solution could be:
+d1 = {k: v*3 for k,v in zip(l1,l2) if not (k%2 == 0 or v%2 == 0)}
+
+7
+
+Dictionary comprehensions
+• d1 = {}
+for k,v in zip(l1,l2):
+if k%2 == 0 or v%2 == 0:
+continue
+d1[k] = v * 3
+• d1 = {k: v*3 for k,v in zip(l1,l2) if not (k%2 == 0 or v%2 == 0)}
+• This tells Python, what the name of the new list should be
+• This tells Python that we want to create a dictionary, and append the results of the processed
+elements to that dictionary
+• This tells Python what the source is of which we want to process the elements
+• This tells Python, which elements to include for processing (be careful in this set-up of the for
+loop you tell what to exclude but in a comprehension what to include)
+• This tells Python, what to do with the elements that should be processed
+
+8
+
+Set comprehensions
+• Example: you have a list called l1 with integers and you have to write code that
+creates a set, with all the values from the list doubled, while ignoring values from
+the list that are even.
+The new set should be called s1.
+• For example, l1 = [1, 3, 2, 5] should result in s1 = {2, 6, 10}
+• Based on what you learned so far, the solution could be:
+s1 = set()
+for x in l1:
+if x%2 == 0:
+continue
+s1.add(x * 2)
+
+• With a comprehension, the solution could be:
+
+s1 = {x * 2 for x in l1 if not (x%2 == 0)}
+
+• Question: Why does Python understand you are building a set and not a
+dictionary?
+9
+
+Set comprehensions
+• Example: you have a list called l1 with integers and you have to write code that
+creates a set, with all the values from the list doubled, while ignoring values from
+the list that are even. The new set should be called s1.
+• For example, l1 = [1, 3, 2, 5] should result in s1 = {2, 6, 10}
+• Based on what you learned so far, the solution could be:
+s1 = set()
+for x in l1:
+if x%2 == 0:
+continue
+s1.add(x * 2)
+
+• With a comprehension, the solution could be:
+
+s1 = {x * 2 for x in l1 if not (x%2 == 0)}
+
+• Question: why does Python understand you are building a set and not a
+dictionary?
+• Answer: because you don't create key: value pairs, but single values
+10
+
+'string comprehensions'
+• Example: you have a string called s1 with only letters and digits and you have to
+write code that creates a string where all vowels doubled, all consonants tripled,
+and all digits ignored. The new string should be called s2
+• For example, s1 = 'a1BcDE2FgH3i' should result in
+s2 = 'aaBBBcccDDDEEFFFgggHHHii'
+
+• Based on what you learned so far, the solution could be:
+
+import string
+s2 = ''
+for x in s1:
+if x in string.digits:
+continue
+s2 += x*2 if x.lower() in 'aeiou' else x*3
+
+• Question: string comprehensions don't exist; so how would you solve this
+problem with a comprehension?
+Hint: Remember how we sorted a string.
+11
+
+'string comprehensions'
+• With a comprehension, the solution could be:
+
+import string
+l1 = [x * 2 if x.lower() in 'aeiou' else x * 3 for x in s1 if x in
+string.ascii_letters]
+
+• s2 = ''.join(l1)
+
+• So, you use a list comprehension to solve the question
+• There is actually no such thing as a string comprehension, and therefore I put quotes
+around it
+
+12
+
+Nested comprehensions
+• Example: you want to create a dictionary result, with keys being the integers between 1 and 4, and values are
+sub-dictionaries. The sub-dictionaries have keys that start with the same integer as the key in result till 4 and the
+values are sum of these keys.
+• For example:
+print(result) should give : {1: {1: 2, 2: 3, 3: 4}, 2: {2: 4, 3: 5}, 3: {3: 6}}
+print(result[2][3]) should give 5
+• func = lambda x,y: x+y
+• result = {}
+for x in range(1, 4):
+result1 = {}
+for y in range(x, 4):
+result1[y] = func(x,y)
+result[x] = result1
+• With a comprehension, the solution could be:
+• result = {x:{y: func(x,y) for y in range(x, 4)} for x in range(1, 4)}
+• Read the comprehension right to left
+13
+
+Nested comprehensions
+• Example: you want to create a dictionary result, with keys being tuples of two integers (second one greater
+equal) between 1 and 4, and values that are the sum of these numbers.
+• For example:
+print(result) should give :
+{(1, 1): 2, (1, 2): 3, (1, 3): 4, (2, 2): 4, (2, 3): 5, (3, 3): 6}
+print(result[(2, 3)] should give 5
+• func = lambda x,y: x+y
+• result = {}
+for x in range(1, 4):
+for y in range(x, 4):
+result[x,y] = func(x,y)
+• With a comprehension, the solution could be:
+• result = {(x, y): func(x,y) for x in range(1, 4) for y in range(x, 4)}
+• Read the comprehension from right to left
+
+14
+
+List comprehensions (old school)
+• In week 3 Hugo explained, in one of the Datacamp video's, lambda functions in
+combinations with map and filter. This combination also can make your code very concise
+• I will show you how that works, and I hope you will agree, that comprehensions are the
+better option
+• Say you have a list called l1 with integers and you have to write code that creates a new list
+where all integers are ignored when they are divisible by 3, are doubled when they are odd
+and not divisible by 3, and halved when they are even and not divisible by 3.
+The new list should only contain integers and be called l2
+• For example, l1 = [1, 3, 2, 4] should result in l2 = [2, 1, 2]
+• With a comprehension, the solution could be:
+l2 = [x * 2 if x%2 == 1 else x // 2 for x in l1 if x % 3 != 0]
+• With map, filter and lamba, the solution could be:
+l2 = list(map(lambda x: x * 2 if x%2 == 1 else x//2, filter(lambda
+x: x % 3 != 0, l1)))
+• There is a reason map and filter are used less since the introduction of comprehensions in
+Python
+15
+
+How to read this
+• l2 = list(map(lambda x: x * 2 if x%2 == 1 else x//2, filter(lambda x: x % 3 !
+= 0, l1)))
+• Start at the deepest level wrt the brackets
+• filtered_values = filter(lambda x: x % 3 != 0, l1)
+• processed_values = map(lambda x: x * 2 if x%2 == 1 else x//2,
+filtered_values)
+• list_of_processed_values = list(processed_values)
+• print(list_of_processed_values)
+
+16
+
+Question
+We already have the following code:
+s1 = '01212321'
+set1 = {int(x) * 2 for x in s1 if x in '02468'}
+Which of the following lines of code will print True?
+a. print(set1 == {'0', '4', '4', '4'})
+b. print(set1 == {4, 0})
+c.
+
+Both will print True
+
+d. Neither one will print True
+
+17
+
+Question
+We already have the following code:
+s1 = '01212321'
+set1 = {int(x) * 2 for x in s1 if x in '02468'}
+Which of the following lines of code will print True?
+a. print(set1 == {'0', '4', '4', '4'})
+b. print(set1 == {4, 0})
+c.
+
+Both will print True
+
+d. Neither one will print True
+e. Cannot be correct as the created elements are clearly integers
+f.
+
+Is correct. Sets only keep unique values, and there is no order
+Actually print(set1 == {4, 4, 4, 4, 0}) would also lead to True, as the created set object will only keep
+two unique values: 0 and 4
+18
+
+Keeping state between function calls
+• Assume, you must write a function that returns a certain start value, and next times you
+call the function returns the previous value plus a certain step value, until the value would
+be greater than a certain stop value, in which case the function throws an error
+• For example, if you have a start value = 1, a stop value of 5, and a step value of 2,
+• The first time that function is called, it should return 1, the second time 3, the third time 5,
+and the fourth time it should throw an error
+• This looks like a very simple problem. Adding 2 to a number is not that complicated,
+checking whether a number is greater than the stop value also looks very doable
+• The problem is that in between function calls you need to keep track of the value of the
+last number. (This is called keeping track of the state.)
+• After execution, a function and its local names will all have disappeared
+• How to solve this?
+1. Using a Standard function
+2. Using a Standard function and the global keyword
+3. Using Object oriented programming
+4. Using an iterator
+19
+5. Using a generator function
+
+Keeping state with a standard function
+• def myfunc(start, stop, step):
+num = start
+start += step
+if num > stop:
+raise StopIteration('End of numbers')
+else:
+return num, start, stop, step
+• sta = 1
+sto = 5
+ste = 2
+• num, sta, sto, ste = myfunc(sta, sto, ste)
+print(num)
+# Onscreen: 1
+• num, sta, sto, ste = myfunc(sta, sto, ste)
+print(num)
+# Onscreen: 3
+num, sta, sto, ste = myfunc(sta, sto, ste)
+print(num)
+# Onscreen: 5
+• num, sta, sto, ste = myfunc(sta, sto, ste)
+# Onscreen: StopIteration: End of numbers
+• This solution is a bit inconvenient as you must to store all values between calls yourself
+• If we want to store behavior and data together, using a class looks like a good solution
+
+20
+
+Keeping state with a standard function and the global keyword
+• def myfunc():
+global start, stop, step
+num = start
+start += step
+if num > stop:
+raise Exception('End of numbers')
+else:
+return num
+• start = 1
+stop = 5
+step = 2
+• print(myfunc()) # Onscreen: 1
+print(myfunc()) # Onscreen: 3
+print(myfunc()) # Onscreen: 5
+print(myfunc()) # Onscreen: Exception: End of numbers
+• This solution is a bit inconvenient as you must store the data outside the function, and
+use the global keyword
+• If we want to store behavior and data together, using a class looks like a good solution
+21
+
+Keeping state with a standard class
+• class Myfunc:
+def __init__(self, start, stop, step):
+self.start = start
+self.stop = stop
+self.step = step
+•
+
+def following(self):
+self.num = self.start
+self.start += self.step
+if self.num > self.stop:
+raise Exception('End of numbers')
+else:
+return self.num
+
+• myfunc = Myfunc(1, 5, 2)
+• print(myfunc.following())
+print(myfunc.following())
+print(myfunc.following())
+print(myfunc.following())
+
+# Onscreen: 1
+# Onscreen: 3
+# Onscreen: 5
+# Onscreen: Exception: End of numbers
+
+• This works, but Python offers a more dedicated solution: iterators
+
+22
+
+Keeping state with a dedicated class: iterators
+• class Myiterator:
+def __init__(self, start, stop, step):
+self.start = start
+self.stop = stop
+self.step = step
+•
+
+def __next__(self):
+self.num = self.start
+self.start += self.step
+if self.num > self.stop:
+raise StopIteration('End of numbers')
+else:
+return self.num
+
+• myiterator = Myiterator(1, 5, 2)
+• print(next(myiterator))
+print(next(myiterator))
+print(next(myiterator))
+print(next(myiterator))
+
+# Onscreen: 1
+# Onscreen: 3
+# Onscreen: 5
+# Onscreen: Exception: End of numbers
+
+• This works well, but sometimes Python offers another nice solution to create iterators: generator23
+
+Keeping state with a generator function
+• def generatorfunction(start, stop, step):
+•
+
+while (num:=start) <= stop:
+yield num
+start += step
+return 'End of numbers'
+
+• mygenerator = generatorfunction(1, 5, 2) # Creating the generator
+• print(next(mygenerator))
+print(next(mygenerator))
+print(next(mygenerator))
+print(next(mygenerator))
+
+# Onscreen: 1
+# Onscreen: 3
+# Onscreen: 5
+# Onscreen: StopIteration: End of numbers
+
+24
+
+Generator functions
+• A generatorfunction is a function that contains a yield statement and that you use to construct a generator
+• A yield statement returns a value, stops the function, but Python keeps the function and all its objects in
+memory (the data of standard functions are all lost after the function execution
+• You can compare it with a computer that goes in sleep (or hibernate) mode, if you restart the computer, you will
+resume where you were, on the moment, when the computer went in sleep mode
+• If the generator is called again your program runs the statement that should be executed after the yield
+statement
+• def generatorfunction():
+num = 1
+•
+yield num
+num += 2
+yield num
+num += 2
+yield num
+# Creating the generator
+• mygenerator = generatorfunction()
+# Onscreen: 1
+• print(next(mygenerator))
+print(next(mygenerator))
+# Onscreen: 3
+print(next(mygenerator))
+# Onscreen: 5
+25
+print(next(mygenerator))
+# Onscreen: StopIteration: End of numbers
+
+Using a Generator function inside a loop
+• def generatorfunction(start, stop, step):
+•
+
+while (num:=start) <= stop:
+yield num
+start += step
+
+•
+
+return 'End of numbers'
+
+• for x in generatorfunction(1, 5, 2):
+print(x)
+# Onscreen: 1
+3
+5
+• No error here, as the for loop catches that error for you
+
+26
+
+Turning a generatorfunction into a list
+• def generatorfunction(start, stop, step):
+•
+
+while (num:=start) <= stop:
+yield num
+start += step
+
+•
+
+return 'End of numbers'
+
+• print(list(generatorfunction(1, 5, 2))) # Onscreen: [1, 3, 5]
+• So, you can do this, but in a way, defies the idea of a generator
+• A generator is very efficient on memory usage, only delivering a next value if asked for it
+• Question: As always there is a trade-off, could you guess what?
+• Answer: for small lists, the overhead of the generator starts to count
+
+27
+
+Turning a list into an iterator
+• myiterator = iter([1,3,5])
+• print(next(myiterator))
+print(next(myiterator))
+print(next(myiterator))
+print(next(myiterator))
+
+# Onscreen: 1
+# Onscreen: 3
+# Onscreen: 5
+# Onscreen: StopIteration
+
+• Works because the list class has an __iter__ and a __next__ method
+
+28
+
+Generator comprehension
+• mygenerator = (x for x in range(100000000) if x%3 == 0 or x%4 ==
+0)
+• print(next(mygenerator))
+print(next(mygenerator))
+print(next(mygenerator))
+print(next(mygenerator))
+
+# Onscreen: 0
+# Onscreen: 3
+# Onscreen: 4
+# Onscreen: 6
+
+• vs
+• l1 = [x for x in range(100000000) if x%3 == 0 or x%4 == 0]
+• print(l1[0])
+print(l1[1])
+print(l1[2])
+print(l1[3])
+
+29
+
+Handling date and times
+• Dates and times in Python are measured as seconds since
+1970-01-01 00:00:00 UTC Coordinated Universal Time, also
+known as Greenwich Mean Time (GMT)
+• UTC doesn't have daylight saving time, so every day has 24
+hours
+• To get the time in seconds since that moment:
+• from datetime import datetime
+print(datetime.now().timestamp())
+# On screen: 1716179932.022811
+
+• This is great for computers, but not so much for humans
+30
+
+Classes in the datetime module
+There are several classes defined in the datetime module, we start with the following
+three:
+1. datetime.date
+This object stores a date and has the year, month, and day as attributes. It is based
+on the Gregorian calendar, and assumes the world always used the Gregorian
+calender
+2. datetime.time
+This object stores a time and has the hour, minute, second, microsecond, and tzinfo
+(time zone information) as attributes. It assumes there are 86,400 seconds in every
+day, so no leap seconds
+3. datetime.datetime
+This object is a combination of a datetime.date and a datetime.time. It has all the
+attributes of both classes
+(Here you see, that while the name of user-built classes starts with a capital, the names of
+built-in classes do not (always))
+We will only use the datetime class in these slides. But the idea for datetime.date and
+datetime.time is the same
+31
+
+Creating a datetime object
+• Creating a datetime object by passing integers
+from datetime import datetime
+• d = datetime (year=2023, month=5, day=22, hour=17, minute = 10, second=30)
+• d = datetime (hour=17, month=5, day=22, second=30, minute = 10, year=2023)
+• d = datetime (2023, 5, 22, 17, 10, 30 )
+• d = datetime (2023, 5, 22, minute = 10, day = 22, hour = 17, second=30 )
+• print(d)
+• The order of the positional parameters: year>month>day>hour>minute>second
+
+32
+
+attributes of a datatime object
+• from datetime import datetime
+• d = datetime.now()
+• print(f'{d.year = }, {d.month = }, {d.day = }, {d.hour = }, {d.minute
+= }, {d.second = }, {d.microsecond = }')
+• print(f'''
+Datum en tijd in ISO format: {d.isoformat()}
+Day of the week (1=Monday): {d.isoweekday()}
+Week of the year: {d.isocalendar()[1]}
+Year: {d.isocalendar()[0]}
+''')
+• In the next slide you will see that you can get all this info with the help of the strftime method
+• The difference is that these attributes give the information as integers, strftime gives it in string
+format. We can easily use str and int
+33
+
+Creating a string representation a datetime object
+• d = datetime.now()
+• print(d)
+• print(f'''
+{d.strftime('Year with century: %Y') = }
+{d.strftime('Year without century: %y') = }
+{d.strftime('Full month name: %B') = }
+{d.strftime('Month number: %m') = }
+{d.strftime('Day of the month: %d') = }
+• {d.strftime('Full weekday name: %A') = }
+{d.strftime('Weekday number: %w') = }
+• {d.strftime('Week number of the year: %U') = }
+{d.strftime('Day number of the year: %j') = }
+• {d.strftime('Hour number: %H') = }
+{d.strftime('Minute number: %M') = }
+{d.strftime('Second number: %S') = }
+• ''')
+
+34
+
+Creating a datetime object by passing a string
+• Say you want to create the following datetime object with date and time: 2024-05-20 00:00:00,
+the following codes all manage to do this:
+• from datetime import datetime
+• d = datetime.strptime('2024$05%20','%Y$%m%%%d')
+• d = datetime.strptime('24$05%20','%y$%m%%%d')
+• d = datetime.strptime('24$05%20','%y$%m%%%d')
+• d = datetime.strptime('2024*141','%Y*%j')
+• d = datetime.strptime('2024*20xyz1','%Y*%Uxyz%w')
+• d = datetime.strptime('202420Monday','%Y%U%A')
+• d = datetime.strptime('00:00:00 20-05-2024', '%H:%M:%S %d-%m-%Y')
+
+35
+
+Changing a datetime object with the replace method
+• You can change all (or some) attributes of a datetime object with the replace method:
+• from datetime import datetime
+d = datetime.now()
+• d = d.replace(year=2026, month=10, day=13, hour=13, minute=10,second=13,
+microsecond=123456)
+• You can do more advanced replacements:
+• from datetime import datetime
+• d = d.replace(year=d.year - 2)
+
+36
+
+Arithmetic with datetime and timedelta
+objects
+• If you subtract datetimes a timedelta object is automatically created:
+• from datetime import datetime
+birthday = datetime(1923, 10, 26)
+today = datetime.now()
+• age = today - birthday
+• print(f'{age.days}{age.seconds}') # On screen: 36732 14249
+• print(type(age))
+
+# On screen: Timedelta
+
+37
+
+Arithmetic with datetime and timedelta
+objects
+• Timedelta has only 3 attributes that you can access: days, seconds and microseconds. So, if you
+want to calculate the age in years, that is not that simple.
+• age = today.year - birthday.year - 1
+• age += today.month > birthday.month or today.month == birthday.month and
+today.day >= birthday.day
+
+• But if you don't subtract two datetimes, but want to add or subtract for example some days to or
+from a datetimet, you need to import the timedelta class explicitly, and create a timedelta object:
+• from datetime import timedelta, datetime
+• d = datetime(2022, 5, 24)
+• diff = timedelta(days=10)
+• print(d + diff) # Onscreen: 2022-06-03 00:00:00
+• print(type(d + diff)) # Onscreen:
+
+38
+
+Arithmetic with datetime and timedelta
+objects
+• If you want to add or subtract days or seconds to a datetime object, the timedelta object can be very
+convenient.
+• While the timedelta object has three attributes accessible, there are more parameters one can use, to
+define a timedelta object
+• The following codes will all give the same result:
+• from datetime import datetime, timedelta
+• today = datetime.now()
+• future_day = datetime.now() + timedelta(days=100)
+• future_day = datetime.now() + timedelta(weeks=14, days=2)
+• future_day = datetime.now() + timedelta(hours=100*24)
+• future_day = datetime.now() + timedelta(minutes=100*24*60)
+• future_day = datetime.now() + timedelta(seconds=100*24*60*60)
+39
+
+
\ No newline at end of file
diff --git a/topic_cards.json b/topic_cards.json
index 640f5ec..bee76c3 100644
--- a/topic_cards.json
+++ b/topic_cards.json
@@ -485,7 +485,8 @@
"ai-example-5",
"ai-example-6",
"ai-example-7",
- "ai-example-8"
+ "ai-example-8",
+ "manual-objects-aliasing"
],
"key_point_ids": [
"kp-1",
@@ -494,6 +495,7 @@
"kp-4",
"kp-5",
"kp-6",
+ "kp-manual-aliasing-copy",
"kp-7",
"kp-8",
"kp-9"
@@ -1493,6 +1495,23 @@
}
]
},
+ {
+ "id": "kp-manual-aliasing-copy",
+ "text": "For mutable objects, `l2 = l1` aliases the same object; use slicing like `l1[:]` when you need an independent copy.",
+ "status": "curated",
+ "generator": "manual-gap-merge-rm008",
+ "model": null,
+ "subtopic_id": "w1-objects-and-names-core",
+ "subtopic_title": "Objects, Types, Mutability, Assignment, and Names",
+ "details": [
+ {
+ "id": "kp-manual-aliasing-copy-d1",
+ "kind": "example",
+ "title": "Aliasing vs slicing copy",
+ "code": "l1 = [1, 2, 3]\nl2 = l1\nl3 = l1[:]\nl1[0] = 99\nprint(l2) # [99, 2, 3]\nprint(l3) # [1, 2, 3]"
+ }
+ ]
+ },
{
"id": "kp-7",
"text": "Functions are objects. Defined with def. Called with (). Built-in functions: print, id, len, type, del. Functions can return values. Methods are functions attached to objects.",
@@ -1609,6 +1628,17 @@
"subtopic_id": "w1-objects-and-names-core",
"subtopic_title": "Objects, Types, Mutability, Assignment, and Names"
},
+ {
+ "id": "manual-objects-aliasing",
+ "kind": "correct",
+ "title": "Aliasing vs slicing copy",
+ "code": "l1 = [1, 2, 3]\nl2 = l1\nl3 = l1[:]\nl1[0] = 99\nprint(l2) # [99, 2, 3]\nprint(l3) # [1, 2, 3]",
+ "why": "For mutable objects, `l2 = l1` aliases the same object; use slicing like `l1[:]` when you need an independent copy.",
+ "output": "",
+ "status": "curated",
+ "subtopic_id": "w1-objects-and-names-core",
+ "subtopic_title": "Objects, Types, Mutability, Assignment, and Names"
+ },
{
"id": "ai-example-8",
"kind": "correct",
@@ -1683,8 +1713,7 @@
],
"key_point_ids": [
"kp-1",
- "kp-2",
- "kp-3"
+ "kp-2"
]
}
}
@@ -2113,8 +2142,7 @@
],
"key_point_ids": [
"kp-1",
- "kp-2",
- "kp-3"
+ "kp-2"
]
}
}
@@ -10069,7 +10097,8 @@
"kp-4",
"kp-5",
"kp-6",
- "kp-7"
+ "kp-7",
+ "kp-manual-string-method-results"
]
}
}
@@ -10357,7 +10386,7 @@
],
"ai_summary": {
"status": "curated",
- "content": "Trace string slicing, search, replacement, splitting, joining, and stripping. Compare `.find` versus `.index`, and remember `join` is called on the separator.",
+ "content": "Trace string slicing, search, replacement, splitting, joining, and stripping. Compare `.find` versus `.index`, and remember string methods return new values unless you reassign the result.",
"generator": "lecture-first-build",
"model": null
},
@@ -10552,6 +10581,23 @@
"subtopic_id": "w4-string-operations-and-methods-core",
"subtopic_title": "Slicing with Step, Search, replace, join, strip, and the string Module",
"details": []
+ },
+ {
+ "id": "kp-manual-string-method-results",
+ "text": "String methods like `replace`, `capitalize`, `split`, and `join` return new values; the original string stays unchanged unless you assign the result.",
+ "status": "curated",
+ "generator": "manual-gap-merge-rm008",
+ "model": null,
+ "subtopic_id": "w4-string-operations-and-methods-core",
+ "subtopic_title": "Slicing with Step, Search, replace, join, strip, and the string Module",
+ "details": [
+ {
+ "id": "kp-manual-string-method-results-d1",
+ "kind": "example",
+ "title": "replace() returns a new string",
+ "code": "number = '020-525-1400'\ncleaned = number.replace('-', '')\nprint(number) # '020-525-1400'\nprint(cleaned) # '0205251400'"
+ }
+ ]
}
],
"ai_examples": [
@@ -10677,7 +10723,7 @@
"id": "w4-string-formatting-core",
"title": "f-strings Basics, Formatting, and Debug Form",
"order": 1,
- "summary": "Use f-strings to embed expressions directly in text. Add format specs after `:` for width, alignment, or precision such as `{n:03d}` and `{x:.2f}`.",
+ "summary": "Use f-strings or `.format(...)` to embed values in text. Add format specs after `:` for width, alignment, or precision such as `{n:03d}` and `{x:.2f}`.",
"item_ids": {
"lecture_snippet_ids": [
"ks-72dda5450c",
@@ -10689,12 +10735,14 @@
"example_ids": [
"ai-example-1",
"ai-example-2",
- "ai-example-3"
+ "ai-example-3",
+ "ai-example-4"
],
"key_point_ids": [
"kp-1",
"kp-2",
- "kp-3"
+ "kp-3",
+ "kp-4"
]
}
}
@@ -10766,7 +10814,7 @@
"notebook_snippets": [],
"ai_summary": {
"status": "curated",
- "content": "Use f-strings to embed expressions directly in text. Add format specs after `:` for width, alignment, or precision such as `{n:03d}` and `{x:.2f}`.",
+ "content": "Use f-strings or `.format(...)` to embed values in text. Add format specs after `:` for width, alignment, or precision such as `{n:03d}` and `{x:.2f}`.",
"generator": "lecture-first-build",
"model": null
},
@@ -10837,6 +10885,23 @@
"code": "num = 7\nprint(f'{num:03d}') # '007'"
}
]
+ },
+ {
+ "id": "kp-4",
+ "text": "Official assessments also use `.format(...)` placeholders. The same width and zero-padding ideas still apply there, for example `'{:04d}'.format(n)`.",
+ "status": "curated",
+ "generator": "manual-gap-merge-rm008",
+ "model": null,
+ "subtopic_id": "w4-string-formatting-core",
+ "subtopic_title": "f-strings Basics, Formatting, and Debug Form",
+ "details": [
+ {
+ "id": "kp-4-d1",
+ "kind": "example",
+ "title": "Padding with `.format(...)`",
+ "code": "score = 91\nprint('Score: {:04d}'.format(score))"
+ }
+ ]
}
],
"ai_examples": [
@@ -10872,6 +10937,17 @@
"status": "curated",
"subtopic_id": "w4-string-formatting-core",
"subtopic_title": "f-strings Basics, Formatting, and Debug Form"
+ },
+ {
+ "id": "ai-example-4",
+ "kind": "correct",
+ "title": "Using `.format(...)` with placeholders",
+ "code": "name = 'Jan'\nscore = 7\nprint('Student {} scored {:03d}'.format(name, score))",
+ "why": "The official resit material still uses `.format(...)`, so it is worth recognizing positional placeholders and width specs alongside f-strings.",
+ "output": "Student Jan scored 007",
+ "status": "curated",
+ "subtopic_id": "w4-string-formatting-core",
+ "subtopic_title": "f-strings Basics, Formatting, and Debug Form"
}
],
"recommended_ids": [
@@ -10928,13 +11004,16 @@
"ai-example-1",
"ai-example-2",
"ai-example-3",
- "ai-example-6"
+ "ai-example-6",
+ "manual-oop-init-defaults",
+ "manual-oop-attrs"
],
"key_point_ids": [
"kp-1",
"kp-2",
"kp-3",
- "kp-4"
+ "kp-4",
+ "kp-manual-init-defaults"
]
}
}
@@ -11211,7 +11290,7 @@
],
"ai_summary": {
"status": "curated",
- "content": "A class defines attributes and methods; `__init__` runs when you create an object and stores instance data on `self`.",
+ "content": "A class defines attributes and methods; `__init__` runs when you create an object, defaults can make constructor arguments optional, and class attributes are shared across instances.",
"generator": "lecture-first-build",
"model": null
},
@@ -11315,6 +11394,29 @@
"subtopic_id": "w4-oop-fundamentals-core",
"subtopic_title": "Class Definition, __init__, self, and Attribute Basics",
"details": []
+ },
+ {
+ "id": "kp-manual-init-defaults",
+ "text": "Constructor defaults can make arguments optional, but mutable per-instance state should start from `None` and be created inside `__init__`.",
+ "status": "curated",
+ "generator": "manual-gap-merge-rm008",
+ "model": null,
+ "subtopic_id": "w4-oop-fundamentals-core",
+ "subtopic_title": "Class Definition, __init__, self, and Attribute Basics",
+ "details": [
+ {
+ "id": "kp-manual-init-defaults-d1",
+ "kind": "example",
+ "title": "Optional constructor argument",
+ "code": "class Vehicle:\n def __init__(self, name, mode='land'):\n self.name = name\n self.mode = mode"
+ },
+ {
+ "id": "kp-manual-init-defaults-d2",
+ "kind": "example",
+ "title": "Fresh list per object",
+ "code": "class Book:\n def __init__(self, title, review_scores=None):\n self.title = title\n self.review_scores = [] if review_scores is None else review_scores"
+ }
+ ]
}
],
"ai_examples": [
@@ -11372,6 +11474,17 @@
"status": "curated",
"subtopic_id": "w4-oop-fundamentals-core",
"subtopic_title": "Class Definition, __init__, self, and Attribute Basics"
+ },
+ {
+ "id": "manual-oop-init-defaults",
+ "kind": "correct",
+ "title": "Safe default state in `__init__`",
+ "code": "class Book:\n def __init__(self, title, review_scores=None):\n self.title = title\n self.review_scores = [] if review_scores is None else review_scores",
+ "output": "",
+ "why": "Constructor defaults can make arguments optional, but mutable per-instance state should start from `None` and be created inside `__init__`.",
+ "status": "curated",
+ "subtopic_id": "w4-oop-fundamentals-core",
+ "subtopic_title": "Class Definition, __init__, self, and Attribute Basics"
}
],
"recommended_ids": [
@@ -11575,6 +11688,23 @@
"code": "def check_positive(n):\n if n < 0:\n raise ValueError('Number must be positive')\n return n"
}
]
+ },
+ {
+ "id": "kp-3",
+ "text": "Catch the specific exception you expect when you know the failure mode. `except ValueError` documents the substring-missing case more clearly than a bare `except:`.",
+ "status": "curated",
+ "generator": "manual-gap-merge-rm008",
+ "model": null,
+ "subtopic_id": "w4-error-handling-core",
+ "subtopic_title": "try/except and raise",
+ "details": [
+ {
+ "id": "kp-3-d1",
+ "kind": "example",
+ "title": "Specific exception handler",
+ "code": "s1 = 'abcdefghabcdefgh'\nneedle = 'i'\ntry:\n position = s1.index(needle)\nexcept ValueError:\n position = -1\nprint(position)"
+ }
+ ]
}
],
"ai_examples": [
@@ -12810,7 +12940,9 @@
"ai-example-5",
"ai-example-6",
"ai-example-7",
- "ai-example-8"
+ "ai-example-8",
+ "manual-working-values-string-vs-map",
+ "manual-working-values-axis-apply"
],
"key_point_ids": [
"kp-1",
@@ -12819,7 +12951,8 @@
"kp-4",
"kp-5",
"kp-6",
- "kp-7"
+ "kp-7",
+ "kp-manual-drop-missing"
]
}
}
@@ -13174,6 +13307,29 @@
"code": "df.fillna('No value') # Replaces all NaNs"
}
]
+ },
+ {
+ "id": "kp-manual-drop-missing",
+ "text": "Use `.drop(...)` to remove labels and `.dropna()` to remove incomplete rows or columns; use `.fillna(...)` when you want to keep the shape and replace the missing values instead.",
+ "status": "curated",
+ "generator": "manual-gap-merge-rm008",
+ "model": null,
+ "subtopic_id": "w5-working-with-values-core",
+ "subtopic_title": "Sorting, Missing Data, Broadcasting, Vectorized Strings, isin, map, and apply",
+ "details": [
+ {
+ "id": "kp-manual-drop-missing-d1",
+ "kind": "example",
+ "title": "Dropping a column by label",
+ "code": "df = df.drop(1, axis=1)"
+ },
+ {
+ "id": "kp-manual-drop-missing-d2",
+ "kind": "example",
+ "title": "Removing rows with missing values",
+ "code": "df.dropna()"
+ }
+ ]
}
],
"ai_examples": [
@@ -13243,6 +13399,28 @@
"subtopic_id": "w5-working-with-values-core",
"subtopic_title": "Sorting, Missing Data, Broadcasting, Vectorized Strings, isin, map, and apply"
},
+ {
+ "id": "manual-working-values-string-vs-map",
+ "kind": "correct",
+ "title": "`.str` methods vs `map(...)`",
+ "code": "s = pd.Series(['Aap', 'Nota', 'MIES'])\nprint(s.map(lambda x: x.lower()))\nprint(s.str.lower())",
+ "why": "Use `.str` for vectorized string operations; `map(...)` is useful when you need a custom per-value transformation.",
+ "output": "",
+ "status": "curated",
+ "subtopic_id": "w5-working-with-values-core",
+ "subtopic_title": "Sorting, Missing Data, Broadcasting, Vectorized Strings, isin, map, and apply"
+ },
+ {
+ "id": "manual-working-values-axis-apply",
+ "kind": "correct",
+ "title": "`apply(axis=0)` vs `apply(axis=1)`",
+ "code": "df.loc['Av'] = df.apply(lambda x: x.mean(), axis=0)\ndf['Avg'] = df.apply(lambda x: x.mean(), axis=1)",
+ "why": "`axis=0` works column by column; `axis=1` works row by row.",
+ "output": "",
+ "status": "curated",
+ "subtopic_id": "w5-working-with-values-core",
+ "subtopic_title": "Sorting, Missing Data, Broadcasting, Vectorized Strings, isin, map, and apply"
+ },
{
"id": "ai-example-7",
"kind": "correct",
@@ -14706,6 +14884,7 @@
"title": "now, Timestamps, strftime, strptime, timedelta, and Date Arithmetic",
"order": 1,
"summary": "Use `datetime.now()` for current time, `strftime` to format, `strptime` to parse, and `timedelta` for date arithmetic.",
+ "summary": "Use `datetime.now()` for current time, `strftime`/`strptime` for formatting and parsing, ISO/week helpers for calendar fields, and `timedelta` for date arithmetic.",
"item_ids": {
"lecture_snippet_ids": [
"ks-e643ee5e77",
@@ -14728,8 +14907,22 @@
"cs-b31e0142c3",
"cs-1887901826"
],
- "example_ids": [],
- "key_point_ids": []
+ "example_ids": [
+ "manual-datetime-format",
+ "manual-datetime-parse",
+ "manual-datetime-delta",
+ "manual-datetime-replace",
+ "manual-datetime-iso",
+ "manual-datetime-day-of-year"
+ ],
+ "key_point_ids": [
+ "kp-manual-datetime-now",
+ "kp-manual-datetime-format",
+ "kp-manual-datetime-delta",
+ "kp-manual-datetime-replace",
+ "kp-manual-datetime-iso",
+ "kp-manual-datetime-day-of-year"
+ ]
}
}
],
@@ -14986,7 +15179,7 @@
],
"ai_summary": {
"status": "curated",
- "content": "Use `datetime.now()` for current time, `strftime` to format, `strptime` to parse, and `timedelta` for date arithmetic.",
+ "content": "Use `datetime.now()` for current time, `strftime`/`strptime` for formatting and parsing, ISO/week helpers for calendar fields, and `timedelta` for date arithmetic.",
"generator": "lecture-first-build",
"model": null
},
@@ -15041,6 +15234,14 @@
{
"id": "kp-manual-datetime-replace",
"text": "Datetime objects are immutable, so `.replace(...)` returns a new datetime instead of modifying the original one."
+ },
+ {
+ "id": "kp-manual-datetime-iso",
+ "text": "Use `isoformat()` for an ISO-style timestamp, `isoweekday()` for Monday=1..Sunday=7, and `isocalendar()` when you need ISO year/week information."
+ },
+ {
+ "id": "kp-manual-datetime-day-of-year",
+ "text": "The day number within the year can be formatted with `%j` or computed with `(dt - datetime(dt.year, 1, 1)).days + 1`."
}
],
"ai_examples": [
@@ -15087,6 +15288,28 @@
"status": "curated",
"subtopic_id": "w6-datetime-core",
"subtopic_title": "now, Timestamps, strftime, strptime, timedelta, and Date Arithmetic"
+ },
+ {
+ "id": "manual-datetime-iso",
+ "kind": "correct",
+ "title": "ISO and week-based helpers",
+ "code": "from datetime import datetime\n\nd = datetime(2024, 5, 20)\nprint(d.isoformat())\nprint(d.isoweekday())\nprint(d.isocalendar()[1])",
+ "output": "",
+ "why": "Use ISO helpers when the exam asks for an ISO string, the weekday with Monday as 1, or the ISO week number.",
+ "status": "curated",
+ "subtopic_id": "w6-datetime-core",
+ "subtopic_title": "now, Timestamps, strftime, strptime, timedelta, and Date Arithmetic"
+ },
+ {
+ "id": "manual-datetime-day-of-year",
+ "kind": "correct",
+ "title": "Compute the day number within the year",
+ "code": "from datetime import datetime\n\ndef day_of_year(dt):\n return (dt - datetime(dt.year, 1, 1)).days + 1\n\nprint(day_of_year(datetime(2024, 5, 20)))",
+ "output": "",
+ "why": "Subtract January 1st of the same year, then add 1 so January 1st becomes day 1.",
+ "status": "curated",
+ "subtopic_id": "w6-datetime-core",
+ "subtopic_title": "now, Timestamps, strftime, strptime, timedelta, and Date Arithmetic"
}
],
"recommended_ids": [
@@ -15410,4 +15633,4 @@
]
}
]
-}
\ No newline at end of file
+}
|