diff --git a/README.md b/README.md
index 4aa06236f41005bfab1417ce3b8afce43e7bf7ea..b84c583918f06d034ceb3c7b9e5653fc7847241d 100644
--- a/README.md
+++ b/README.md
@@ -274,30 +274,74 @@ When this is run, the titles are shown as follows:
 | | | |_ __  _| |_| |  \/_ __ __ _  __| | ___ 
 | | | | '_ \| | __| | __| '__/ _` |/ _` |/ _ \
 | |_| | | | | | |_| |_\ \ | | (_| | (_| |  __/
- \___/|_| |_|_|\__|\____/_|  \__,_|\__,_|\___| v0.1.22, started: 15/06/2022 09:18:15
+ \___/|_| |_|_|\__|\____/_|  \__,_|\__,_|\___| v0.1.27, started: 16/09/2022 14:30:15
 
 CS 102 Report 2 
 Question 1: Week1                                                                                                       
- * q1.1) test_add...................................................................................................PASS
- * q1.2) test_reverse...............................................................................................PASS
+ * q1.1) test_add.................................................................................................FAILED
+ * q1.2) test_reverse.............................................................................................FAILED
  * q1.3) test_output_capture........................................................................................PASS
- * q1)   Total.................................................................................................... 10/10
+======================================================================
+FAIL: test_add (__main__.Week1)
+test_add
+----------------------------------------------------------------------
+Traceback (most recent call last):
+  File "<string>", line 882, in _callTestMethod
+  File "<string>", line 1699, in test_add
+  File "<string>", line 987, in assertEqualC
+  File "<string>", line 975, in wrap_assert
+AssertionError: 4 != 'Key 0 not found in cache; framework files missing. Please run deploy()'
+
+======================================================================
+FAIL: test_reverse (__main__.Week1)
+test_reverse
+----------------------------------------------------------------------
+Traceback (most recent call last):
+  File "<string>", line 882, in _callTestMethod
+  File "<string>", line 1703, in test_reverse
+  File "<string>", line 987, in assertEqualC
+  File "<string>", line 975, in wrap_assert
+AssertionError: [3, 2, 1] != 'Key 0 not found in cache; framework files missing. Please run deploy()'
+
+ * q1)   Total..................................................................................................... 3/10
  
 Question 2: The same problem as before with nicer titles                                                                
- * q2.1) Test the addition method add(a,b)..........................................................................PASS
- * q2.2) Checking if reverse_list([1, 2, 3]) = [3, 2, 1]............................................................PASS
- * q2)   Total...................................................................................................... 6/6
+ * q2.1) Test the addition method add(a,b)........................................................................FAILED
+ * q2.2) test_reverse.............................................................................................FAILED
+======================================================================
+FAIL: test_add (__main__.Week1Titles)
+Test the addition method add(a,b)
+----------------------------------------------------------------------
+Traceback (most recent call last):
+  File "<string>", line 882, in _callTestMethod
+  File "<string>", line 1715, in test_add
+  File "<string>", line 987, in assertEqualC
+  File "<string>", line 975, in wrap_assert
+AssertionError: 4 != 'Key 0 not found in cache; framework files missing. Please run deploy()'
+
+======================================================================
+FAIL: test_reverse (__main__.Week1Titles)
+test_reverse
+----------------------------------------------------------------------
+Traceback (most recent call last):
+  File "<string>", line 882, in _callTestMethod
+  File "<string>", line 1723, in test_reverse
+  File "<string>", line 987, in assertEqualC
+  File "<string>", line 975, in wrap_assert
+AssertionError: [3, 2, 1] != 'Key 0 not found in cache; framework files missing. Please run deploy()'
+
+ * q2)   Total...................................................................................................... 0/6
  
-Total points at 09:18:16 (0 minutes, 0 seconds)....................................................................16/16
+Total points at 14:30:15 (0 minutes, 0 seconds).....................................................................3/16
 
 Including files in upload...
-path.: _NamespacePath(['C:\\Users\\tuhe\\Documents\\unitgrade_private\\examples\\example_framework\\instructor\\cs102', 'C:\\Users\\tuhe\\Documents\\unitgrade_private\\examples\\example_framework\\instructor\\cs102'])
+path.: _NamespacePath(['/home/tuhe/Documents/unitgrade_private/examples/example_framework/instructor/cs102', '/home/tuhe/Documents/unitgrade_private/examples/example_framework/instructor/cs102'])
  * cs102
 > Testing token file integrity...
 Done!
  
 To get credit for your results, please upload the single unmodified file: 
-> C:\Users\tuhe\Documents\unitgrade_private\examples\example_framework\instructor\cs102\Report2_handin_16_of_16.token
+> /home/tuhe/Documents/unitgrade_private/examples/example_framework/instructor/cs102/Report2_handin_3_of_16.token
 
 ```
 What happens behind the scenes when we set `self.title` is that the result is pre-computed on the instructors machine and cached. This means the last test will display the correct result regardless of how `reverse_list` has been implemented by the student. The titles are also shown correctly when the method is run as a unittest. 
diff --git a/devel/example_devel/instructor/cs108/Report2_handin_10_of_10.token b/devel/example_devel/instructor/cs108/Report2_handin_10_of_10.token
deleted file mode 100644
index 8ff976542514ba1b21e85bb39fee4496db182ed2..0000000000000000000000000000000000000000
--- a/devel/example_devel/instructor/cs108/Report2_handin_10_of_10.token
+++ /dev/null
@@ -1,314 +0,0 @@
-# This file contains your results. Do not edit its content. Simply upload it as it is.
----------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
-827e0833f0b9d63e1a7aa2c0fedf6e9c6ca44d4006be322b9b1877819d08c958c8d9c606040d36134177ebdf00517e91f684ba72cfd26949a5e45e94933cd522 55680
----------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
-.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.
\ No newline at end of file
diff --git a/devel/example_devel/instructor/cs108/Report2_handin_25_of_30.token b/devel/example_devel/instructor/cs108/Report2_handin_25_of_30.token
deleted file mode 100644
index 0eca422f340b3fa213d79b1c8be756f7d8b644e4..0000000000000000000000000000000000000000
--- a/devel/example_devel/instructor/cs108/Report2_handin_25_of_30.token
+++ /dev/null
@@ -1,323 +0,0 @@
-# This file contains your results. Do not edit its content. Simply upload it as it is.
----------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
-9b19cbb5fd7bafb60a8378936c7aa5d819133e2d88245e8819be1cb11e123e3d755f690b9056ffc949c3f08e010c60cb2f34128490a3c03b80a3e2699413ca05 57304
----------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
-.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.
\ No newline at end of file
diff --git a/devel/example_devel/instructor/cs108/cache.db b/devel/example_devel/instructor/cs108/cache.db
deleted file mode 100644
index 69012bb84480b8150245b15b506b710974b2008e..0000000000000000000000000000000000000000
Binary files a/devel/example_devel/instructor/cs108/cache.db and /dev/null differ
diff --git a/devel/example_devel/instructor/cs108/db.pkl b/devel/example_devel/instructor/cs108/db.pkl
index d5e7f185526f6f1e94e0a707668bef186d84fad8..4d91d3931e3377cfb0a6de8c39b187956cec0252 100644
Binary files a/devel/example_devel/instructor/cs108/db.pkl and b/devel/example_devel/instructor/cs108/db.pkl differ
diff --git a/devel/example_devel/instructor/cs108/report2_grade.py b/devel/example_devel/instructor/cs108/report2_grade.py
deleted file mode 100644
index 4cdff0e86abcb586c1a413fa3116488ae68ecdbf..0000000000000000000000000000000000000000
--- a/devel/example_devel/instructor/cs108/report2_grade.py
+++ /dev/null
@@ -1,3 +0,0 @@
-''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
-import bz2, base64
-exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/devel/example_devel/instructor/cs108/report_devel_grade.py b/devel/example_devel/instructor/cs108/report_devel_grade.py
index 3a545e1d1275504b96a71bddad66ac6e2a03ea46..e00416ef08e2f8fd7d430525610b77bfc79c3fa9 100644
--- a/devel/example_devel/instructor/cs108/report_devel_grade.py
+++ b/devel/example_devel/instructor/cs108/report_devel_grade.py
@@ -177,8 +177,9 @@ def evaluate_report(report, question=None, qitem=None, passall=False, verbose=Fa
             else:
                 raise Exception("Status not known.")
 
-            nice_title = s.title
-            detail = {**detail, **msg, 'nice_title': nice_title}#['message'] = msg
+            # s can be an '_ErrorHolder' object, which has no title.
+            nice_title = s.title if hasattr(s, 'title') else 's has no title; unitgrade/evaluate.py line 181'
+            detail = {**detail, **msg, 'nice_title': nice_title} #['message'] = msg
             details[key] = detail
 
         # q_[s._testMethodName] = ("pass", None)
@@ -488,8 +489,8 @@ def source_instantiate(name, report1_source, payload):
 
 
 
-report1_source = '# from unitgrade import hide\n# from unitgrade import utils\n# import os\n# import lzma\n# import pickle\n\n# DONT\'t import stuff here since install script requires __version__\n\n# def cache_write(object, file_name, verbose=True):\n#     # raise Exception("bad")\n#     # import compress_pickle\n#     dn = os.path.dirname(file_name)\n#     if not os.path.exists(dn):\n#         os.mkdir(dn)\n#     if verbose: print("Writing cache...", file_name)\n#     with lzma.open(file_name, \'wb\', ) as f:\n#         pickle.dump(object, f)\n#     if verbose: print("Done!")\n#\n#\n# def cache_exists(file_name):\n#     # file_name = cn_(file_name) if cache_prefix else file_name\n#     return os.path.exists(file_name)\n#\n#\n# def cache_read(file_name):\n#     # import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n#     # file_name = cn_(file_name) if cache_prefix else file_name\n#     if os.path.exists(file_name):\n#         try:\n#             with lzma.open(file_name, \'rb\') as f:\n#                 return pickle.load(f)\n#         except Exception as e:\n#             print("Tried to load a bad pickle file at", file_name)\n#             print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n#             print(e)\n#             # return pickle.load(f)\n#     else:\n#         return None\n\n\n\nimport re\nimport sys\nimport threading\nimport time\nimport lzma\nimport hashlib\nimport pickle\nimport base64\nimport os\nfrom collections import namedtuple\nfrom io import StringIO\nimport numpy as np\nimport tqdm\nfrom colorama import Fore\nfrom functools import _make_key\nfrom diskcache import Cache\n\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\ndef gprint(s):\n    print(f"{Fore.LIGHTGREEN_EX}{s}")\n\nmyround = lambda x: np.round(x)  # required for obfuscation.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\n"""\nClean up the various output-related helper classes.\n"""\nclass Logger(object):\n    def __init__(self, buffer, write_to_stdout=True):\n        # assert False\n        self.terminal = sys.stdout\n        self.write_to_stdout = write_to_stdout\n        self.log = buffer\n\n    def write(self, message):\n        if self.write_to_stdout:\n            self.terminal.write(message)\n        self.log.write(message)\n\n    def flush(self):\n        # this flush method is needed for python 3 compatibility.\n        pass\n\n\nclass Capturing(list):\n    def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n        self._stdout = stdout\n        self.unmute = unmute\n        super().__init__(*args, **kwargs)\n\n    def __enter__(self, capture_errors=True):  # don\'t put arguments here.\n        self._stdout = sys.stdout if self._stdout == None else self._stdout\n        self._stringio = StringIO()\n        if self.unmute:\n            sys.stdout = Logger(self._stringio)\n        else:\n            sys.stdout = self._stringio\n\n        if capture_errors:\n            self._sterr = sys.stderr\n            sys.sterr = StringIO()  # memory hole it\n        self.capture_errors = capture_errors\n        return self\n\n    def __exit__(self, *args):\n        self.extend(self._stringio.getvalue().splitlines())\n        del self._stringio  # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n\nclass Capturing2(Capturing):\n    def __exit__(self, *args):\n        lines = self._stringio.getvalue().splitlines()\n        txt = "\\n".join(lines)\n        numbers = extract_numbers(rm_progress_bar(txt))\n        self.extend(lines)\n        del self._stringio  # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n        self.output = txt\n        self.numbers = numbers\n\n\ndef rm_progress_bar(txt):\n    # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n    nlines = []\n    for l in txt.splitlines():\n        pct = l.find("%")\n        ql = False\n        if pct > 0:\n            i = l.find("|", pct + 1)\n            if i > 0 and l.find("|", i + 1) > 0:\n                ql = True\n        if not ql:\n            nlines.append(l)\n    return "\\n".join(nlines)\n\n\nclass ActiveProgress():\n    def __init__(self, t, start=True, title="my progress bar", show_progress_bar=True, file=None, mute_stdout=False):\n        if file == None:\n            file = sys.stdout\n        self.file = file\n        self.mute_stdout = mute_stdout\n        self._running = False\n        self.title = title\n        self.dt = 0.025\n        self.n = max(1, int(np.round(t / self.dt)))\n        self.show_progress_bar = show_progress_bar\n        self.pbar = None\n\n        if start:\n            self.start()\n\n    def start(self):\n        if self.mute_stdout:\n            import io\n            # from unitgrade.utils import Logger\n            self._stdout = sys.stdout\n            sys.stdout = Logger(io.StringIO(), write_to_stdout=False)\n\n        self._running = True\n        if self.show_progress_bar:\n            self.thread = threading.Thread(target=self.run)\n            self.thread.start()\n        self.time_started = time.time()\n\n    def terminate(self):\n        if not self._running:\n            print("Stopping a progress bar which is not running (class unitgrade.utils.ActiveProgress")\n            pass\n            # raise Exception("Stopping a stopped progress bar. ")\n        self._running = False\n        if self.show_progress_bar:\n            self.thread.join()\n        if self.pbar is not None:\n            self.pbar.update(1)\n            self.pbar.close()\n            self.pbar = None\n\n        self.file.flush()\n\n        if self.mute_stdout:\n            import io\n            # from unitgrade.utils import Logger\n            sys.stdout = self._stdout #= sys.stdout\n\n            # sys.stdout = Logger(io.StringIO(), write_to_stdout=False)\n\n        return time.time() - self.time_started\n\n    def run(self):\n        self.pbar = tqdm.tqdm(total=self.n, file=self.file, position=0, leave=False, desc=self.title, ncols=100,\n                              bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')\n        t_ = time.time()\n        for _ in range(self.n - 1):  # Don\'t terminate completely; leave bar at 99% done until terminate.\n            if not self._running:\n                self.pbar.close()\n                self.pbar = None\n                break\n            tc = time.time()\n            tic = max(0, self.dt - (tc - t_))\n            if tic > 0:\n                time.sleep(tic)\n            t_ = time.time()\n            self.pbar.update(1)\n\n\ndef dprint(first, last, nL, extra = "", file=None, dotsym=\'.\', color=\'white\'):\n    if file == None:\n        file = sys.stdout\n    dot_parts = (dotsym * max(0, nL - len(last) - len(first)))\n    print(first + dot_parts, end="", file=file)\n    last += extra\n    print(last, file=file)\n\n\ndef hide(func):\n    return func\n\n\ndef makeRegisteringDecorator(foreignDecorator):\n    """\n        Returns a copy of foreignDecorator, which is identical in every\n        way(*), except also appends a .decorator property to the callable it\n        spits out.\n    """\n\n    def newDecorator(func):\n        # Call to newDecorator(method)\n        # Exactly like old decorator, but output keeps track of what decorated it\n        R = foreignDecorator(func)  # apply foreignDecorator, like call to foreignDecorator(method) would have done\n        R.decorator = newDecorator  # keep track of decorator\n        # R.original = func         # might as well keep track of everything!\n        return R\n\n    newDecorator.__name__ = foreignDecorator.__name__\n    newDecorator.__doc__ = foreignDecorator.__doc__\n    return newDecorator\n\n\nhide = makeRegisteringDecorator(hide)\n\n\ndef extract_numbers(txt):\n    numeric_const_pattern = r\'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n    rx = re.compile(numeric_const_pattern, re.VERBOSE)\n    all = rx.findall(txt)\n    all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n    if len(all) > 500:\n        print(txt)\n        raise Exception("unitgrade_v1.unitgrade_v1.py: Warning, too many numbers!", len(all))\n    return all\n\n\ndef cache(foo, typed=False):\n    """ Magic cache wrapper\n    https://github.com/python/cpython/blob/main/Lib/functools.py\n    """\n    maxsize = None\n    def wrapper(self, *args, **kwargs):\n        key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)))\n        # print(self._cache.keys())\n        # for k in self._cache:\n        #     print(k)\n        if not self._cache_contains(key):\n            value = foo(self, *args, **kwargs)\n            self._cache_put(key, value)\n        else:\n            value = self._cache_get(key)\n            # This appears to be required since there are two caches. Otherwise, when deploy method is run twice,\n            # the cache will not be set correctly.\n            self._cache_put(key, value)\n        return value\n\n    return wrapper\n\n\ndef methodsWithDecorator(cls, decorator):\n    """\n        Returns all methods in CLS with DECORATOR as the\n        outermost decorator.\n\n        DECORATOR must be a "registering decorator"; one\n        can make any decorator "registering" via the\n        makeRegisteringDecorator function.\n\n        import inspect\n        ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n        for f in ls:\n            print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n    """\n    for maybeDecorated in cls.__dict__.values():\n        if hasattr(maybeDecorated, \'decorator\'):\n            if maybeDecorated.decorator == decorator:\n                print(maybeDecorated)\n                yield maybeDecorated\n\n\n""" Methods responsible for turning a dictionary into a string that can be pickled or put into a json file. """\ndef dict2picklestring(dd):\n    """\n    Turns a dictionary into a string with some compression.\n\n    :param dd:\n    :return:\n    """\n    b = lzma.compress(pickle.dumps(dd))\n    b_hash = hashlib.blake2b(b).hexdigest()\n    return base64.b64encode(b).decode("utf-8"), b_hash\n\ndef picklestring2dict(picklestr):\n    """ Reverse of the above method: Turns the string back into a dictionary. """\n    b = base64.b64decode(picklestr)\n    hash = hashlib.blake2b(b).hexdigest()\n    dictionary = pickle.loads(lzma.decompress(b))\n    return dictionary, hash\n\ntoken_sep = "-"*70 + " ..ooO0Ooo.. " + "-"*70\ndef load_token(file_in):\n    """ We put this one here to allow loading of token files for the dashboard. """\n    with open(file_in, \'r\') as f:\n        s = f.read()\n    splt = s.split(token_sep)\n    data = splt[-1]\n    info = splt[-2]\n    head = token_sep.join(splt[:-2])\n    plain_text=head.strip()\n    hash, l1 = info.split(" ")\n    data = "".join( data.strip()[1:-1].splitlines() )\n    l1 = int(l1)\n    dictionary, b_hash = picklestring2dict(data)\n    assert len(data) == l1\n    assert b_hash == hash.strip()\n    return dictionary, plain_text\n\n\n\n## Key/value store related.\nclass DKPupDB:\n    """ This key/value store store artifacts (associated with a specific question) in a dictionary. """\n    def __init__(self, artifact_file, use_pupdb=False):\n        # Make a double-headed disk cache thingy.\n        self.dk = Cache(os.path.dirname(artifact_file)) # Start in this directory.\n        self.name_ = os.path.basename(artifact_file[:-5])\n        if self.name_ not in self.dk:\n            self.dk[self.name_] = dict()\n        self.use_pupdb = use_pupdb\n        if self.use_pupdb:\n            from pupdb.core import PupDB\n            self.db_ = PupDB(artifact_file)\n\n    def __setitem__(self, key, value):\n        if self.use_pupdb:\n            self.db_.set(key, value)\n        with self.dk.transact():\n            d = self.dk[self.name_]\n            d[key] = value\n            self.dk[self.name_] = d\n            self.dk[self.name_ + "-updated"] = True\n\n    def __getitem__(self, item):\n        v = self.dk[self.name_][item]\n        if self.use_pupdb:\n            v2 = self.db_.get(item)\n            if v != v2:\n                print("Mismatch v1, v2 for ", item)\n        return v\n\n    def keys(self): # This one is also deprecated.\n        return tuple(self.dk[self.name_].keys()) #.iterkeys())\n        # return self.db_.keys()\n\n    def set(self, item, value): # This one is deprecated.\n        self[item] = value\n\n    def get(self, item, default=None):\n        return self[item] if item in self else default\n\n    def __contains__(self, item):\n        return item in self.dk[self.name_] #keys()\n        # return item in self.dk\n\n\nimport io\nimport sys\nimport time\nimport unittest\nfrom unittest.runner import _WritelnDecorator\nimport numpy as np\n\n\nclass UTextResult(unittest.TextTestResult):\n    nL = 80\n    number = -1  # HAcky way to set question number.\n    show_progress_bar = True\n    unmute = False # Whether to redirect stdout.\n    cc = None\n    setUpClass_time = 3 # Estimated time to run setUpClass in TestCase. Must be set externally. See key (("ClassName", "setUpClass"), "time") in _cache.\n\n    def __init__(self, stream, descriptions, verbosity):\n        super().__init__(stream, descriptions, verbosity)\n        self.successes = []\n\n    def printErrors(self) -> None:\n        # TODO: Fix here. probably also needs to flush stdout.\n        self.printErrorList(\'ERROR\', [(test, res[\'stderr\']) for test, res in self.errors])\n        self.printErrorList(\'FAIL\',  [(test, res[\'stderr\']) for test, res in self.failures])\n\n    def addError(self, test, err):\n        super(unittest.TextTestResult, self).addError(test, err)\n        err = self.errors[-1][1]\n        if hasattr(sys.stdout, \'log\'):\n            stdout = sys.stdout.log.readlines()  # Only works because we set sys.stdout to a unitgrade.Logger\n        else:\n            stdout = ""\n        self.errors[-1] = (self.errors[-1][0], {\'return\': None,\n                                \'stderr\': err,\n                                \'stdout\': stdout\n                                })\n\n        if not hasattr(self, \'item_title_print\'):\n            # In case setUpClass() fails with an error the short description may not be set. This will fix that problem.\n            self.item_title_print = test.shortDescription()\n            if self.item_title_print is None:  # In case the short description is not set either...\n                self.item_title_print = test.id()\n\n\n        self.cc_terminate(success=False)\n\n    def addFailure(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        err = self.failures[-1][1]\n        stdout = sys.stdout.log.readlines()  # Only works because we set sys.stdout to a unitgrade.Logger\n        self.failures[-1] = (self.failures[-1][0], {\'return\': None,\n                                \'stderr\': err,\n                                \'stdout\': stdout\n                                })\n        self.cc_terminate(success=False)\n\n\n    def addSuccess(self, test: unittest.case.TestCase) -> None:\n        msg = None\n        stdout = sys.stdout.log.readlines() # Only works because we set sys.stdout to a unitgrade.Logger\n\n        if hasattr(test, \'_get_outcome\'):\n            o = test._get_outcome()\n            if isinstance(o, dict):\n                key = (test.cache_id(), "return")\n                if key in o:\n                    msg = test._get_outcome()[key]\n\n        # print(sys.stdout.readlines())\n        self.successes.append((test, None))  # (test, message) (to be consistent with failures and errors).\n        self.successes[-1] = (self.successes[-1][0], {\'return\': msg,\n                                 \'stdout\': stdout,\n                                 \'stderr\': None})\n\n        self.cc_terminate()\n\n    def cc_terminate(self, success=True):\n        if self.show_progress_bar or True:\n            tsecs = np.round(self.cc.terminate(), 2)\n            self.cc.file.flush()\n            ss = self.item_title_print\n\n            state = "PASS" if success else "FAILED"\n\n            dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n            if self.show_progress_bar or True:\n                print(self.item_title_print + dot_parts, end="", file=self.cc.file)\n            else:\n                print(dot_parts, end="", file=self.cc.file)\n\n            if tsecs >= 0.5:\n                state += " (" + str(tsecs) + " seconds)"\n            print(state, file=self.cc.file)\n\n    def startTest(self, test):\n        name = test.__class__.__name__\n        if self.testsRun == 0 and hasattr(test.__class__, \'_cache2\'): # Disable this if the class is pure unittest.TestCase\n            # This is the first time we are running a test. i.e. we can time the time taken to call setupClass.\n            if test.__class__._cache2 is None:\n                test.__class__._cache2 = {}\n            test.__class__._cache2[((name, \'setUpClass\'), \'time\')] = time.time() - self.t_start\n\n        self.testsRun += 1\n        item_title = test.shortDescription()  # Better for printing (get from cache).\n\n        if item_title == None:\n            # For unittest framework where getDescription may return None.\n            item_title = self.getDescription(test)\n        self.item_title_print = " * q%i.%i) %s" % (UTextResult.number + 1, self.testsRun, item_title)\n        # if self.show_progress_bar or True:\n        estimated_time = test.__class__._cache.get(((name, test._testMethodName), \'time\'), 100) if hasattr(test.__class__, \'_cache\') else 4\n        self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar)\n        # else:\n        #     print(self.item_title_print + (\'.\' * max(0, self.nL - 4 - len(self.item_title_print))), end="")\n        self._test = test\n        # if not self.unmute:\n        self._stdout = sys.stdout # Redundant. remove later.\n        sys.stdout = Logger(io.StringIO(), write_to_stdout=self.unmute)\n\n    def stopTest(self, test):\n        # if not self.unmute:\n        buff = sys.stdout.log\n        sys.stdout = self._stdout # redundant.\n        buff.close()\n        super().stopTest(test)\n\n    def _setupStdout(self):\n        if self._previousTestClass == None:\n            self.t_start = time.time()\n            if hasattr(self.__class__, \'q_title_print\'):\n                q_title_print = self.__class__.q_title_print\n            else:\n                q_title_print = "<unnamed test. See unitgrade.framework.py>"\n\n            cc = ActiveProgress(t=self.setUpClass_time, title=q_title_print, show_progress_bar=self.show_progress_bar, mute_stdout=not self.unmute)\n            self.cc = cc\n\n\n    def _restoreStdout(self):  # Used when setting up the test.\n        if self._previousTestClass is None:\n            q_time = self.cc.terminate()\n            q_time = np.round(q_time, 2)\n            sys.stdout.flush()\n            if self.show_progress_bar:\n                print(self.cc.title, end="")\n            print(" " * max(0, self.nL - len(self.cc.title)) + (" (" + str(q_time) + " seconds)" if q_time >= 0.5 else ""))\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        stream = io.StringIO()\n        super().__init__(*args, stream=stream, **kwargs)\n\n    def _makeResult(self):\n        # stream = self.stream # not you!\n        stream = sys.stdout\n        stream = _WritelnDecorator(stream)\n        return self.resultclass(stream, self.descriptions, self.verbosity)\n\nimport importnb\nimport numpy as np\nimport sys\nimport pickle\nimport os\nimport inspect\nimport colorama\nimport unittest\nimport time\nimport textwrap\nimport urllib.parse\nimport requests\nimport ast\nimport numpy\nfrom unittest.case import TestCase\n\n\ncolorama.init(autoreset=True)  # auto resets your settings after every output\nnumpy.seterr(all=\'raise\')\n\ndef setup_dir_by_class(C, base_dir):\n    name = C.__class__.__name__\n    return base_dir, name\n\n\n_DASHBOARD_COMPLETED_MESSAGE = "Dashboard> Evaluation completed."\n\n# Consolidate this code.\nclass classmethod_dashboard(classmethod):\n    def __init__(self, f):\n        def dashboard_wrap(cls: UTestCase):\n            if not cls._generate_artifacts:\n                f(cls)\n                return\n            db = DKPupDB(cls._artifact_file_for_setUpClass())\n            r = np.random.randint(1000 * 1000)\n            db.set(\'run_id\', r)\n            db.set(\'coverage_files_changed\', None)\n\n            state_ = \'fail\'\n            try:\n                _stdout = sys.stdout\n                _stderr = sys.stderr\n                std_capture = StdCapturing(stdout=sys.stdout, stderr=sys.stderr, db=db, mute=False)\n\n                # Run this unittest and record all of the output.\n                # This is probably where we should hijack the stdout output and save it -- after all, this is where the test is actually run.\n                # sys.stdout = stdout_capture\n                sys.stderr = std_capture.dummy_stderr\n                sys.stdout = std_capture.dummy_stdout\n                db.set("state", "running")\n                f(cls)\n                state_ = \'pass\'\n            except Exception as e:\n                from werkzeug.debug.tbtools import DebugTraceback, _process_traceback\n                state_ = \'fail\'\n                db.set(\'state\', state_)\n                exi = e\n                dbt = DebugTraceback(exi)\n                sys.stderr.write(dbt.render_traceback_text())\n                html = dbt.render_traceback_html(include_title="hello world")\n                db.set(\'wz_stacktrace\', html)\n                raise e\n            finally:\n                db.set(\'state\', state_)\n                std_capture.dummy_stdout.write_mute(_DASHBOARD_COMPLETED_MESSAGE)\n                sys.stdout = _stdout\n                sys.stderr = _stderr\n                std_capture.close()\n        super().__init__(dashboard_wrap)\n\nclass Report:\n    title = "report title"\n    abbreviate_questions = False # Should the test items start with \'Question ...\' or just be q1).\n    version = None # A version number of the report (1.0). Used to compare version numbers with online resources.\n    url = None  # Remote location of this problem.\n\n    questions = []\n    pack_imports = []\n    individual_imports = []\n\n    _remote_check_cooldown_seconds = 1  # Seconds between remote check of report.\n    nL = 120  # Maximum line width\n    _config = None  # Private variable. Used when collecting results from student computers. Should only be read/written by teacher and never used for regular evaluation.\n    _setup_mode = False # True if test is being run in setup-mode, i.e. will not fail because of bad configurations, etc.\n\n    @classmethod\n    def reset(cls):\n        for (q, _) in cls.questions:\n            if hasattr(q, \'reset\'):\n                q.reset()\n\n    @classmethod\n    def mfile(clc):\n        return inspect.getfile(clc)\n\n    def _file(self):\n        return inspect.getfile(type(self))\n\n    def _artifact_file(self):\n        """ File for the artifacts DB (thread safe). This file is optinal. Note that it is a pupdb database file.\n        Note the file is shared between all sub-questions. """\n        return os.path.join(os.path.dirname(self._file()), "unitgrade_data/main_config_"+ os.path.basename(self._file()[:-3]) + ".artifacts.pkl")\n\n    def _is_run_in_grade_mode(self):\n        """ True if this report is being run as part of a grade run. """\n        return self._file().endswith("_grade.py") # Not sure I love this convention.\n\n    def _import_base_relative(self):\n        if hasattr(self.pack_imports[0], \'__path__\'):\n            root_dir = self.pack_imports[0].__path__[0]\n        else:\n            root_dir = self.pack_imports[0].__file__\n\n        root_dir = os.path.dirname(root_dir)\n        relative_path = os.path.relpath(self._file(), root_dir)\n        modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n        relative_path = relative_path.replace("\\\\", "/")\n        return root_dir, relative_path, modules\n\n    def __init__(self, strict=False, payload=None):\n        working_directory = os.path.abspath(os.path.dirname(self._file()))\n        self.wdir, self.name = setup_dir_by_class(self, working_directory)\n        # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n        for (q, _) in self.questions:\n            q.nL = self.nL  # Set maximum line length.\n\n        if payload is not None:\n            self.set_payload(payload, strict=strict)\n\n    def main(self, verbosity=1):\n        # Run all tests using standard unittest (nothing fancy).\n        loader = unittest.TestLoader()\n        for q, _ in self.questions:\n            start = time.time()  #\n            suite = loader.loadTestsFromTestCase(q)\n            unittest.TextTestRunner(verbosity=verbosity).run(suite)\n            total = time.time() - start\n            q.time = total\n\n    def _setup_answers(self, with_coverage=False, verbose=True):\n        if with_coverage:\n            for q, _ in self.questions:\n                q._with_coverage = True\n                q._report = self\n        for q, _ in self.questions:\n            q._setup_answers_mode = True\n            # q._generate_artifacts = False # Disable artifact generation when the report is being set up.\n\n        evaluate_report_student(self, unmute=verbose, noprogress=not verbose, generate_artifacts=False) # Disable artifact generation.\n\n        # self.main()  # Run all tests in class just to get that out of the way...\n        report_cache = {}\n        for q, _ in self.questions:\n            # print(self.questions)\n            if hasattr(q, \'_save_cache\'):\n                q()._save_cache()\n                # print("q is", q())\n                report_cache[q.__qualname__] = q._cache2\n            else:\n                report_cache[q.__qualname__] = {\'no cache see _setup_answers in framework.py\': True}\n        if with_coverage:\n            for q, _ in self.questions:\n                q._with_coverage = False\n\n        # report_cache is saved on a per-question basis.\n        # it could also contain additional information such as runtime metadata etc. This may not be appropriate to store with the invidivual questions(?).\n        # In this case, the function should be re-defined.\n        return report_cache\n\n    def set_payload(self, payloads, strict=False):\n        for q, _ in self.questions:\n            q._cache = payloads[q.__qualname__]\n        self._config = payloads[\'config\']\n\n    def _check_remote_versions(self):\n        if self.url is None:\n            return\n        url = self.url\n        if not url.endswith("/"):\n            url += "/"\n        snapshot_file = os.path.dirname(self._file()) + "/unitgrade_data/.snapshot"\n        if os.path.isfile(snapshot_file):\n            with open(snapshot_file, \'r\') as f:\n                t = f.read()\n                if (time.time() - float(t)) < self._remote_check_cooldown_seconds:\n                    return\n\n        if self.url.startswith("https://gitlab"):\n            # Try to turn url into a \'raw\' format.\n            # "https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/raw/master/examples/autolab_example_py_upload/instructor/cs102_autolab/report2_test.py?inline=false"\n            # url = self.url\n            url = url.replace("-/tree", "-/raw")\n            # print(url)\n            # "https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/tree/master/examples/autolab_example_py_upload/instructor/cs102_autolab"\n            # "https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/raw/master/examples/autolab_example_py_upload/instructor/report2_test.py?inline=false"\n            # "https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/raw/master/examples/autolab_example_py_upload/instructor/cs102_autolab/report2_test.py?inline=false"\n            raw_url = urllib.parse.urljoin(url, os.path.basename(self._file()) + "?inline=false")\n            # print("Is this file run in local mode?", self._is_run_in_grade_mode())\n            if self._is_run_in_grade_mode():\n                remote_source = requests.get(raw_url).text\n                with open(self._file(), \'r\') as f:\n                    local_source = f.read()\n                if local_source != remote_source:\n                    print("\\nThe local version of this report is not identical to the remote version which can be found at")\n                    print(self.url)\n                    print("The most likely reason for this is that the remote version was updated by the teacher due to some issue.")\n                    print("You should check if there was an announcement and update the test to the most recent version; most likely")\n                    print("This can be done by running the command")\n                    print("> git pull")\n                    print("You can find the most recent code here:")\n                    print(self.url)\n                    raise Exception(f"Version of grade script does not match the remote version. Please update using git pull")\n            else:\n                text = requests.get(raw_url).text\n                node = ast.parse(text)\n                classes = [n for n in node.body if isinstance(n, ast.ClassDef) if n.name == self.__class__.__name__][0]\n                for b in classes.body:\n                    # print(b.)\n                    if b.targets[0].id == "version":\n                        # print(b)\n                        # print(b.value)\n                        version_remote = b.value.value\n                        break\n                if version_remote != self.version:\n                    print("\\nThe version of this report", self.version, "does not match the version of the report on git", version_remote)\n                    print("The most likely reason for this is that the remote version was updated by the teacher due to some issue.")\n                    print("You should check if there was an announcement and update the test to the most recent version; most likely")\n                    print("This can be done by running the command")\n                    print("> git pull")\n                    print("You can find the most recent code here:")\n                    print(self.url)\n                    raise Exception(f"Version of test on remote is {version_remote}, which is different than this version of the test {self.version}. Please update your test to the most recent version.")\n\n                for (q,_) in self.questions:\n                    qq = q(skip_remote_check=True)\n                    cfile = q._cache_file()\n\n                    relpath = os.path.relpath(cfile, os.path.dirname(self._file()))\n                    relpath = relpath.replace("\\\\", "/")\n                    raw_url = urllib.parse.urljoin(url, relpath + "?inline=false")\n                    # requests.get(raw_url)\n\n                    with open(cfile, \'rb\') as f:\n                        b1 = f.read()\n\n                    b2 = requests.get(raw_url).content\n                    if b1 != b2:\n                        print("\\nQuestion ", qq.title, "relies on the data file", cfile)\n                        print("However, it appears that this file is missing or in a different version than the most recent found here:")\n                        print(self.url)\n                        print("The most likely reason for this is that the remote version was updated by the teacher due to some issue.")\n                        print("You should check if there was an announcement and update the test to the most recent version; most likely")\n                        print("This can be done by simply running the command")\n                        print("> git pull")\n                        print("to avoid running bad tests against good code, the program will now stop. Please update and good luck!")\n                        raise Exception("The data file for the question", qq.title, "did not match remote source found on git. The test will therefore automatically fail. Please update your test/data files.")\n\n                t = time.time()\n                if os.path.isdir(os.path.dirname(self._file()) + "/unitgrade_data"):\n                    with open(snapshot_file, \'w\') as f:\n                        f.write(f"{t}")\n\ndef get_hints(ss):\n    """ Extract all blocks of the forms:\n\n    Hints:\n    bla-bla.\n\n    and returns the content unaltered.\n    """\n    if ss == None:\n        return None\n    try:\n        ss = textwrap.dedent(ss)\n        ss = ss.replace(\'\'\'"""\'\'\', "").strip()\n        hints = ["hints:", "hint:"]\n        indexes = [ss.lower().find(h) for h in hints]\n        j = np.argmax(indexes)\n        if indexes[j] == -1:\n            return None\n        h = hints[j]\n        ss = ss[ss.lower().find(h) + len(h) + 1:]\n        ss = "\\n".join([l for l in ss.split("\\n") if not l.strip().startswith(":")])\n        ss = textwrap.dedent(ss).strip()\n        # if ss.startswith(\'*\'):\n        #     ss = ss[1:].strip()\n        return ss\n    except Exception as e:\n        print("bad hints", ss, e)\n\n\nclass UTestCase(unittest.TestCase):\n    # a = 234\n    _outcome = None  # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n    _cache = None  # Read-only cache. Ensures method always produce same result.\n    _cache2 = None  # User-written cache.\n    _with_coverage = False\n    _covcache = None # Coverage cache. Written to if _with_coverage is true.\n    _report = None  # The report used. This is very, very hacky and should always be None. Don\'t rely on it!\n    _run_in_report_mode = True\n\n    _generate_artifacts = True # Whether the file will generate the artifact .json files. This is used in the _grade-script mode.\n    # If true, the tests will not fail when cache is used. This is necesary since otherwise the cache will not be updated\n    # during setup, and the deploy script must be run many times.\n    _setup_answers_mode = False\n\n    def capture(self):\n        if hasattr(self, \'_stdout\') and self._stdout is not None:\n            file = self._stdout\n        else:\n            file = sys.stdout\n        return Capturing2(stdout=file)\n\n    @classmethod\n    def question_title(cls):\n        """ Return the question title """\n        if cls.__doc__ is not None:\n            title = cls.__doc__.strip().splitlines()[0].strip()\n            if not (title.startswith("Hints:") or title.startswith("Hint:") ):\n                return title\n        return cls.__qualname__\n\n    def run(self, result):\n        # print("Run called in test framework...", self._generate_artifacts)\n        if not self._generate_artifacts:\n            return super().run(result)\n\n        db = DKPupDB(self._artifact_file())\n        db.set("state", "running")\n        db.set(\'run_id\', np.random.randint(1000*1000))\n        db.set(\'coverage_files_changed\', None)\n\n\n        _stdout = sys.stdout\n        _stderr = sys.stderr\n\n        std_capture = StdCapturing(stdout=sys.stdout, stderr=sys.stderr, db=db, mute=False)\n\n        # stderr_capture = StdCapturing(sys.stderr, db=db)\n        # std_err_capture = StdCapturing(sys.stderr, "stderr", db=db)\n        state_ = None\n        try:\n            # Run this unittest and record all of the output.\n            # This is probably where we should hijack the stdout output and save it -- after all, this is where the test is actually run.\n            # sys.stdout = stdout_capture\n            sys.stderr = std_capture.dummy_stderr\n            sys.stdout = std_capture.dummy_stdout\n\n            result_ = TestCase.run(self, result)\n\n            from werkzeug.debug.tbtools import DebugTraceback, _process_traceback\n            # print(result_._excinfo[0])\n            actual_errors = []\n            for test, err in self._error_fed_during_run:\n                if err is None:\n                    continue\n                else:\n                    import traceback\n                    # traceback.print_tb(err[2])\n                    actual_errors.append(err)\n\n            if len(actual_errors) > 0:\n                ex, exi, tb = actual_errors[0]\n                exi.__traceback__ = tb\n                dbt = DebugTraceback(exi)\n                sys.stderr.write(dbt.render_traceback_text())\n                html = dbt.render_traceback_html(include_title="hello world")\n                db.set(\'wz_stacktrace\', html)\n                # db.set(\'state\', \'fail\')\n                state_ = "fail"\n            else:\n                state_ = "pass"\n        except Exception as e:\n            state_ = "fail"\n            import traceback\n            traceback.print_exc()\n            raise e\n        finally:\n            db.set(\'state\', state_)\n            std_capture.dummy_stdout.write_mute(_DASHBOARD_COMPLETED_MESSAGE)\n            sys.stdout = _stdout\n            sys.stderr = _stderr\n            std_capture.close()\n        return result_\n\n    def _callSetUp(self):\n        if self._with_coverage:\n            if self._covcache is None:\n                self._covcache = {}\n            import coverage\n            self.cov = coverage.Coverage(data_file=None)\n            self.cov.start()\n        self.setUp()\n\n    def _callTearDown(self):\n        self.tearDown()\n        # print("Teardown.")\n        if self._with_coverage:\n            # print("with cov")\n            from pathlib import Path\n            from snipper import snipper_main\n            try:\n                self.cov.stop()\n            except Exception as e:\n                print("Something went wrong while tearing down coverage test")\n                print(e)\n            data = self.cov.get_data()\n            base, _, _ = self._report._import_base_relative()\n            for file in data.measured_files():\n                file = os.path.normpath(file)\n                root = Path(base)\n                child = Path(file)\n                if root in child.parents:\n                    # print("Reading file", child)\n                    with open(child, \'r\') as f:\n                        s = f.read()\n                    lines = s.splitlines()\n                    garb = \'GARBAGE\'\n                    lines2 = snipper_main.censor_code(lines, keep=True)\n                    # print("\\n".join(lines2))\n                    if len(lines) != len(lines2):\n                        for k in range(len(lines)):\n                            print(k, ">", lines[k], "::::::::", lines2[k])\n                        print("Snipper failure; line lenghts do not agree. Exiting..")\n                        print(child, "len(lines) == len(lines2)", len(lines), len(lines2))\n                        import sys\n                        sys.exit()\n\n                    assert len(lines) == len(lines2)\n                    for ll in data.contexts_by_lineno(file):\n                        l = ll-1\n                        if l < len(lines2) and lines2[l].strip() == garb:\n                            # print("Got a hit at l", l)\n                            rel = os.path.relpath(child, root)\n                            cc = self._covcache\n                            j = 0\n                            for j in range(l, -1, -1):\n                                if "def" in lines2[j] or "class" in lines2[j]:\n                                    break\n                            from snipper.legacy import gcoms\n\n                            fun = lines2[j]\n                            comments, _ = gcoms("\\n".join(lines2[j:l]))\n                            if rel not in cc:\n                                cc[rel] = {}\n                            cc[rel][fun] = (l, "\\n".join(comments))\n                            # print("found", rel, fun)\n                            self._cache_put((self.cache_id(), \'coverage\'), self._covcache)\n\n    def shortDescriptionStandard(self):\n        sd = super().shortDescription()\n        if sd is None or sd.strip().startswith("Hints:") or sd.strip().startswith("Hint:"):\n            sd = self._testMethodName\n        return sd\n\n    def shortDescription(self):\n        sd = self.shortDescriptionStandard()\n        title = self._cache_get((self.cache_id(), \'title\'), sd)\n        return title if title is not None else sd\n\n    @property\n    def title(self):\n        return self.shortDescription()\n\n    @title.setter\n    def title(self, value):\n        self._cache_put((self.cache_id(), \'title\'), value)\n\n    def _get_outcome(self):\n        if not hasattr(self.__class__, \'_outcome\') or self.__class__._outcome is None:\n            self.__class__._outcome = {}\n        return self.__class__._outcome\n\n    def _callTestMethod(self, testMethod):\n        t = time.time()\n        self._ensure_cache_exists()  # Make sure cache is there.\n        if self._testMethodDoc is not None:\n            self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard())\n\n        self._cache2[(self.cache_id(), \'assert\')] = {}\n        res = testMethod()\n        elapsed = time.time() - t\n        self._get_outcome()[ (self.cache_id(), "return") ] = res\n        self._cache_put((self.cache_id(), "time"), elapsed)\n\n\n    def cache_id(self):\n        c = self.__class__.__qualname__\n        m = self._testMethodName\n        return c, m\n\n    def __init__(self, *args, skip_remote_check=False, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._load_cache()\n        self._assert_cache_index = 0\n        # Perhaps do a sanity check here to see if the cache is up to date? To do that, we must make sure the\n        # cache exists locally.\n        # Find the report class this class is defined within.\n        if skip_remote_check:\n            return\n        import importlib, inspect\n        found_reports = []\n        # print("But do I have report", self._report)\n        # print("I think I am module", self.__module__)\n        # print("Importlib says", importlib.import_module(self.__module__))\n        # This will delegate you to the wrong main clsas when running in grade mode.\n        for name, cls in inspect.getmembers(importlib.import_module(self.__module__), inspect.isclass):\n            # print("checking", cls)\n            if issubclass(cls, Report):\n                for q,_ in cls.questions:\n                    if q == self.__class__:\n                        found_reports.append(cls)\n        if len(found_reports) == 0:\n            pass # This case occurs when the report _grade script is being run.\n            # raise Exception("This question is not a member of a report. Very, very odd.")\n        if len(found_reports) > 1:\n            raise Exception("This question is a member of multiple reports. That should not be the case -- don\'t get too creative.")\n        if len(found_reports) > 0:\n            report = found_reports[0]\n            report()._check_remote_versions()\n\n\n    def _ensure_cache_exists(self):\n        if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n            self.__class__._cache = dict()\n        if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n            self.__class__._cache2 = dict()\n\n    def _cache_get(self, key, default=None):\n        self._ensure_cache_exists()\n        return self.__class__._cache.get(key, default)\n\n    def _cache_put(self, key, value):\n        self._ensure_cache_exists()\n        self.__class__._cache2[key] = value\n\n    def _cache_contains(self, key):\n        self._ensure_cache_exists()\n        return key in self.__class__._cache\n\n    def get_expected_test_value(self):\n        key = (self.cache_id(), \'assert\')\n        id = self._assert_cache_index\n        cache = self._cache_get(key)\n        _expected = cache.get(id, f"Key {id} not found in cache; framework files missing. Please run deploy()")\n        return _expected\n\n    def wrap_assert(self, assert_fun, first, *args, **kwargs):\n        key = (self.cache_id(), \'assert\')\n        if not self._cache_contains(key):\n            print("Warning, framework missing", key)\n            self.__class__._cache[key] = {}  # A new dict. We manually insert it because we have to use that the dict is mutable.\n        cache = self._cache_get(key)\n        id = self._assert_cache_index\n        _expected = cache.get(id, f"Key {id} not found in cache; framework files missing. Please run deploy()")\n        if not id in cache:\n            print("Warning, framework missing cache index", key, "id =", id, " - The test will be skipped for now.")\n            if self._setup_answers_mode:\n                _expected = first # Bypass by setting equal to first. This is in case multiple self.assertEqualC\'s are run in a row and have to be set.\n\n        # The order of these calls is important. If the method assert fails, we should still store the correct result in cache.\n        cache[id] = first\n        self._cache_put(key, cache)\n        self._assert_cache_index += 1\n        if not self._setup_answers_mode:\n            assert_fun(first, _expected, *args, **kwargs)\n        else:\n            try:\n                assert_fun(first, _expected, *args, **kwargs)\n            except Exception as e:\n                print("Mumble grumble. Cache function failed during class setup. Most likely due to old cache. Re-run deploy to check it pass.", id)\n                print("> first", first)\n                print("> expected", _expected)\n                print(e)\n\n\n    def assertEqualC(self, first, msg=None):\n        self.wrap_assert(self.assertEqual, first, msg)\n\n    def _shape_equal(self, first, second):\n        a1 = np.asarray(first).squeeze()\n        a2 = np.asarray(second).squeeze()\n        msg = None\n        msg = "" if msg is None else msg\n        if len(msg) > 0:\n            msg += "\\n"\n        self.assertEqual(a1.shape, a2.shape, msg=msg + "Dimensions of input data does not agree.")\n        assert(np.all(np.isinf(a1) == np.isinf(a2)))  # Check infinite part.\n        a1[np.isinf(a1)] = 0\n        a2[np.isinf(a2)] = 0\n        diff = np.abs(a1 - a2)\n        return diff\n\n    def assertLinf(self, first, second=None, tol=1e-5, msg=None):\n        """ Test in the L_infinity norm.\n        :param first:\n        :param second:\n        :param tol:\n        :param msg:\n        :return:\n        """\n        if second is None:\n            return self.wrap_assert(self.assertLinf, first, tol=tol, msg=msg)\n        else:\n            diff = self._shape_equal(first, second)\n            np.testing.assert_allclose(first, second, atol=tol)\n            \n            max_diff = max(diff.flat)\n            if max_diff >= tol:\n                from unittest.util import safe_repr\n                # msg = f\'{safe_repr(first)} != {safe_repr(second)} : Not equal within tolerance {tol}\'\n                # print(msg)\n                # np.testing.assert_almost_equal\n                # import numpy as np\n                print(f"|first - second|_max = {max_diff} > {tol} ")\n                np.testing.assert_almost_equal(first, second)\n                # If the above fail, make sure to throw an error:\n                self.assertFalse(max_diff >= tol, msg=f\'Input arrays are not equal within tolerance {tol}\')\n                # self.assertEqual(first, second, msg=f\'Not equal within tolerance {tol}\')\n\n    def assertL2(self, first, second=None, tol=1e-5, msg=None, relative=False):\n        if second is None:\n            return self.wrap_assert(self.assertL2, first, tol=tol, msg=msg, relative=relative)\n        else:\n            # We first test using numpys build-in testing method to see if one coordinate deviates a great deal.\n            # This gives us better output, and we know that the coordinate wise difference is lower than the norm difference.\n            if not relative:\n                np.testing.assert_allclose(first, second, atol=tol)\n            diff = self._shape_equal(first, second)\n            diff = ( ( np.asarray( diff.flatten() )**2).sum() )**.5\n\n            scale = (2/(np.linalg.norm(np.asarray(first).flat) + np.linalg.norm(np.asarray(second).flat)) ) if relative else 1\n            max_diff = diff*scale\n            if max_diff >= tol:\n                msg = "" if msg is None else msg\n                print(f"|first - second|_2 = {max_diff} > {tol} ")\n                # Deletage to numpy. Let numpy make nicer messages.\n                np.testing.assert_almost_equal(first, second) # This function does not take a msg parameter.\n                # Make sure to throw an error no matter what.\n                self.assertFalse(max_diff >= tol, msg=f\'Input arrays are not equal within tolerance {tol}\')\n                # self.assertEqual(first, second, msg=msg + f"Not equal within tolerance {tol}")\n\n    @classmethod\n    def _cache_file(cls):\n        return os.path.dirname(inspect.getabsfile(cls)) + "/unitgrade_data/" + cls.__name__ + ".pkl"\n\n    @classmethod\n    def _artifact_file_for_setUpClass(cls):\n        file = os.path.join(os.path.dirname(cls._cache_file()), ""+cls.__name__+"-setUpClass.json")\n        print("_artifact_file_for_setUpClass(cls): will return", file, "__class__", cls)\n        # cf = os.path.dirname(inspect.getabsfile(cls)) + "/unitgrade_data/" + cls.__name__\n        return file\n\n    def _artifact_file(self):\n        """ File for the artifacts DB (thread safe). This file is optinal. Note that it is a pupdb database file.\n        Note the file is shared between all sub-questions. """\n        return os.path.join(os.path.dirname(self.__class__._cache_file()), \'-\'.join(self.cache_id()) + ".json")\n\n    def _save_cache(self):\n        # get the class name (i.e. what to save to).\n        cfile = self.__class__._cache_file()\n        if not os.path.isdir(os.path.dirname(cfile)):\n            os.makedirs(os.path.dirname(cfile))\n\n        if hasattr(self.__class__, \'_cache2\'):\n            with open(cfile, \'wb\') as f:\n                pickle.dump(self.__class__._cache2, f)\n\n    # But you can also set cache explicitly.\n    def _load_cache(self):\n        if self._cache is not None:  # Cache already loaded. We will not load it twice.\n            return\n            # raise Exception("Loaded cache which was already set. What is going on?!")\n        cfile = self.__class__._cache_file()\n        if os.path.exists(cfile):\n            try:\n                with open(cfile, \'rb\') as f:\n                    data = pickle.load(f)\n                self.__class__._cache = data\n            except Exception as e:\n                print("Cache file did not exist:", cfile)\n                print(e)\n        else:\n            print("Warning! data file not found", cfile)\n\n    def _get_coverage_files(self):\n        key = (self.cache_id(), \'coverage\')\n        # CC = None\n        # if self._cache_contains(key):\n        return self._cache_get(key, []) # Anything wrong with the empty list?\n        # return CC\n\n    def _get_hints(self):\n        """\n            This code is run when the test is set up to generate the hints and store them in an artifact file. It may be beneficial to simple compute them beforehand\n            and store them in the local unitgrade pickle file. This code is therefore expected to superceede the alterative code later.\n        """\n        hints = []\n        # print("Getting hint")\n        key = (self.cache_id(), \'coverage\')\n        if self._cache_contains(key):\n            CC = self._cache_get(key)\n            # cl, m = self.cache_id()\n            # print("Getting hint using", CC)\n            # Insert newline to get better formatting.\n            # gprint(\n            #     f"\\n> An error occured during the test: {cl}.{m}. The following files/methods has code in them you are supposed to edit and may therefore be the cause of the problem:")\n            for file in CC:\n                rec = CC[file]\n                # gprint(f">   * {file}")\n                for l in rec:\n                    _, comments = CC[file][l]\n                    hint = get_hints(comments)\n\n                    if hint != None:\n                        hints.append((hint, file, l))\n\n        doc = self._testMethodDoc\n        # print("doc", doc)\n        if doc is not None:\n            hint = get_hints(self._testMethodDoc)\n            if hint is not None:\n                hints = [(hint, None, self.cache_id()[1])] + hints\n\n        return hints\n\n    def _feedErrorsToResult(self, result, errors):\n        """ Use this to show hints on test failure.\n        It feeds error to the result -- so if there are errors, they will crop up here\n        """\n        self._error_fed_during_run = errors.copy() # import to copy the error list.\n\n        # result._test._error_fed_during_run = errors.copy()\n\n        if not isinstance(result, UTextResult):\n            er = [e for e, v in errors if v != None]\n            # print("Errors are", errors)\n            if len(er) > 0:\n                hints = []\n                key = (self.cache_id(), \'coverage\')\n                if self._cache_contains(key):\n                    CC = self._cache_get(key)\n                    cl, m = self.cache_id()\n                    # Insert newline to get better formatting.\n                    gprint(f"\\n> An error occured during the test: {cl}.{m}. The following files/methods has code in them you are supposed to edit and may therefore be the cause of the problem:")\n                    for file in CC:\n                        rec = CC[file]\n                        gprint(f">   * {file}")\n                        for l in rec:\n                            _, comments = CC[file][l]\n                            hint = get_hints(comments)\n\n                            if hint != None:\n                                hints.append((hint, file, l) )\n                            gprint(f">      - {l}")\n\n                er = er[0]\n\n                doc = er._testMethodDoc\n                # print("doc", doc)\n                if doc is not None:\n                    hint = get_hints(er._testMethodDoc)\n                    if hint is not None:\n                        hints = [(hint, None, self.cache_id()[1] )] + hints\n                if len(hints) > 0:\n                    # print(hints)\n                    for hint, file, method in hints:\n                        s = (f"\'{method.strip()}\'" if method is not None else "")\n                        if method is not None and file is not None:\n                            s += " in "\n                        try:\n                            s += (file.strip() if file is not None else "")\n                            gprint(">")\n                            gprint("> Hints (from " + s + ")")\n                            gprint(textwrap.indent(hint, ">   "))\n                        except Exception as e:\n                            print("Bad stuff in hints. ")\n                            print(hints)\n        # result._last_errors = errors\n        super()._feedErrorsToResult(result, errors)\n        b = 234\n\n    def startTestRun(self):\n        super().startTestRun()\n\nclass Required:\n    pass\n\nclass ParticipationTest(UTestCase,Required):\n    max_group_size = None\n    students_in_group = None\n    workload_assignment = {\'Question 1\': [1, 0, 0]}\n\n    def test_students(self):\n        pass\n\n    def test_workload(self):\n        pass\n\n# 817, 705\nclass NotebookTestCase(UTestCase):\n    notebook = None\n    _nb = None\n    @classmethod\n    def setUpClass(cls) -> None:\n        with Capturing():\n            cls._nb = importnb.Notebook.load(cls.notebook)\n\n    @property\n    def nb(self):\n        return self.__class__._nb\n # 870.\n\nimport hashlib\nimport io\nimport tokenize\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\nimport inspect\nimport os\nimport argparse\nimport time\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\',  action="store_true",  help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\',  action="store_true",  help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\',  action="store_true",  help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\',  action="store_true",  help=\'Automatically pass all tests. Useful when debugging.\')\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False,\n                            show_tol_err=False, show_privisional=True, noprogress=None,\n                            generate_artifacts=True):\n    args = parser.parse_args()\n    if noprogress is None:\n        noprogress = args.noprogress\n\n    if question is None and args.q is not None:\n        question = args.q\n        if "." in question:\n            question, qitem = [int(v) for v in question.split(".")]\n        else:\n            question = int(question)\n\n    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n    if unmute is None:\n        unmute = args.unmute\n    if passall is None:\n        passall = args.passall\n\n    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute and not noprogress, qitem=qitem,\n                                          verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n                                          show_tol_err=show_tol_err,\n                                          generate_artifacts=generate_artifacts)\n\n\n    if question is None and show_privisional:\n        print("Provisional evaluation")\n        tabulate(table_data)\n        table = table_data\n        print(tabulate(table))\n        print(" ")\n\n    fr = inspect.getouterframes(inspect.currentframe())[1].filename\n    gfile = os.path.basename(fr)[:-3] + "_grade.py"\n    if os.path.exists(gfile):\n        print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n        print(">>>", gfile)\n        print("In the same manner as you ran this file.")\n\n\n    return results\n\n\ndef upack(q):\n    # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n    h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n    h = np.asarray(h)\n    return h[:,0], h[:,1], h[:,2],\n\nclass SequentialTestLoader(unittest.TestLoader):\n    def getTestCaseNames(self, testCaseClass):\n        test_names = super().getTestCaseNames(testCaseClass)\n        # testcase_methods = list(testCaseClass.__dict__.keys())\n        ls = []\n        for C in testCaseClass.mro():\n            if issubclass(C, unittest.TestCase):\n                ls = list(C.__dict__.keys()) + ls\n        testcase_methods = ls\n        test_names.sort(key=testcase_methods.index)\n        return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n                    show_progress_bar=True,\n                    show_tol_err=False,\n                    generate_artifacts=True, # Generate the artifact .json files. These are exclusively used by the dashboard.\n                    big_header=True):\n\n    now = datetime.now()\n    if big_header:\n        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n        b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n    else:\n        b = "Unitgrade"\n    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n    print(b + " v" + __version__ + ", started: " + dt_string+ "\\n")\n    # print("Started: " + dt_string)\n    report._check_remote_versions() # Check (if report.url is present) that remote files exist and are in sync.\n    s = report.title\n    if hasattr(report, "version") and report.version is not None:\n        s += f" version {report.version}"\n    print(s, "(use --help for options)" if show_help_flag else "")\n    # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n    table_data = []\n    t_start = time.time()\n    score = {}\n    loader = SequentialTestLoader()\n\n    for n, (q, w) in enumerate(report.questions):\n        q._generate_artifacts = generate_artifacts  # Set whether artifact .json files will be generated.\n        if question is not None and n+1 != question:\n            continue\n        suite = loader.loadTestsFromTestCase(q)\n        qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n        if not report.abbreviate_questions:\n            q_title_print = "Question %i: %s"%(n+1, qtitle)\n        else:\n            q_title_print = "q%i) %s" % (n + 1, qtitle)\n\n        print(q_title_print, end="")\n        q.possible = 0\n        q.obtained = 0\n        # q_ = {} # Gather score in this class.\n        UTextResult.q_title_print = q_title_print # Hacky\n        UTextResult.show_progress_bar = show_progress_bar # Hacky.\n        UTextResult.number = n\n        UTextResult.nL = report.nL\n        UTextResult.unmute = unmute # Hacky as well.\n        UTextResult.setUpClass_time = q._cache.get(((q.__name__, \'setUpClass\'), \'time\'), 3) if hasattr(q, \'_cache\') and q._cache is not None else 3\n\n\n        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n        details = {}\n        for s, msg in res.successes + res.failures + res.errors:\n            # from unittest.suite import _ErrorHolder\n            # from unittest import _Err\n            # if isinstance(s, _ErrorHolder)\n            if hasattr(s, \'_testMethodName\'):\n                key = (q.__name__, s._testMethodName)\n            else:\n                # In case s is an _ErrorHolder (unittest.suite)\n                key = (q.__name__, s.id())\n            # key = (q.__name__, s._testMethodName) # cannot use the cache_id method bc. it is not compatible with plain unittest.\n\n            detail = {}\n            if (s,msg) in res.successes:\n                detail[\'status\'] = "pass"\n            elif (s,msg) in res.failures:\n                detail[\'status\'] = \'fail\'\n            elif (s,msg) in res.errors:\n                detail[\'status\'] = \'error\'\n            else:\n                raise Exception("Status not known.")\n\n            nice_title = s.title\n            detail = {**detail, **msg, \'nice_title\': nice_title}#[\'message\'] = msg\n            details[key] = detail\n\n        # q_[s._testMethodName] = ("pass", None)\n        # for (s,msg) in res.failures:\n        #     q_[s._testMethodName] = ("fail", msg)\n        # for (s,msg) in res.errors:\n        #     q_[s._testMethodName] = ("error", msg)\n        # res.successes[0]._get_outcome()\n\n        possible = res.testsRun\n        obtained = len(res.successes)\n\n        # assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun\n\n        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n        score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': details, \'title\': qtitle, \'name\': q.__name__,\n                   }\n        q.obtained = obtained\n        q.possible = possible\n        # print(q._cache)\n        # print(q._covcache)\n        s1 = f" * q{n+1})   Total"\n        s2 = f" {q.obtained}/{w}"\n        print(s1 + ("."* (report.nL-len(s1)-len(s2) )) + s2 )\n        print(" ")\n        table_data.append([f"q{n+1}) Total", f"{q.obtained}/{w}"])\n\n    ws, possible, obtained = upack(score)\n    possible = int( msum(possible) )\n    obtained = int( msum(obtained) ) # Cast to python int\n    report.possible = possible\n    report.obtained = obtained\n    now = datetime.now()\n    dt_string = now.strftime("%H:%M:%S")\n\n    dt = int(time.time()-t_start)\n    minutes = dt//60\n    seconds = dt - minutes*60\n    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n    dprint(first = "Total points at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")",\n           last=""+str(report.obtained)+"/"+str(report.possible), nL = report.nL)\n\n    # print(f"Completed at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +"). Total")\n\n    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n    results = {\'total\': (obtained, possible), \'details\': score}\n    return results, table_data\n\n\ndef python_code_str_id(python_code, strip_comments_and_docstring=True):\n    s = python_code\n\n    if strip_comments_and_docstring:\n        try:\n            s = remove_comments_and_docstrings(s)\n        except Exception as e:\n            print("--"*10)\n            print(python_code)\n            print(e)\n\n    s = "".join([c.strip() for c in s.split()])\n    hash_object = hashlib.blake2b(s.encode())\n    return hash_object.hexdigest()\n\n\ndef file_id(file, strip_comments_and_docstring=True):\n    with open(file, \'r\') as f:\n        # s = f.read()\n        return python_code_str_id(f.read())\n\n\ndef remove_comments_and_docstrings(source):\n    """\n    Returns \'source\' minus comments and docstrings.\n    """\n    io_obj = io.StringIO(source)\n    out = ""\n    prev_toktype = tokenize.INDENT\n    last_lineno = -1\n    last_col = 0\n    for tok in tokenize.generate_tokens(io_obj.readline):\n        token_type = tok[0]\n        token_string = tok[1]\n        start_line, start_col = tok[2]\n        end_line, end_col = tok[3]\n        ltext = tok[4]\n        # The following two conditionals preserve indentation.\n        # This is necessary because we\'re not using tokenize.untokenize()\n        # (because it spits out code with copious amounts of oddly-placed\n        # whitespace).\n        if start_line > last_lineno:\n            last_col = 0\n        if start_col > last_col:\n            out += (" " * (start_col - last_col))\n        # Remove comments:\n        if token_type == tokenize.COMMENT:\n            pass\n        # This series of conditionals removes docstrings:\n        elif token_type == tokenize.STRING:\n            if prev_toktype != tokenize.INDENT:\n        # This is likely a docstring; double-check we\'re not inside an operator:\n                if prev_toktype != tokenize.NEWLINE:\n                    # Note regarding NEWLINE vs NL: The tokenize module\n                    # differentiates between newlines that start a new statement\n                    # and newlines inside of operators such as parens, brackes,\n                    # and curly braces.  Newlines inside of operators are\n                    # NEWLINE and newlines that start new code are NL.\n                    # Catch whole-module docstrings:\n                    if start_col > 0:\n                        # Unlabelled indentation means we\'re inside an operator\n                        out += token_string\n                    # Note regarding the INDENT token: The tokenize module does\n                    # not label indentation inside of an operator (parens,\n                    # brackets, and curly braces) as actual indentation.\n                    # For example:\n                    # def foo():\n                    #     "The spaces before this docstring are tokenize.INDENT"\n                    #     test = [\n                    #         "The spaces before this string do not get a token"\n                    #     ]\n        else:\n            out += token_string\n        prev_toktype = token_type\n        last_col = end_col\n        last_lineno = end_line\n    return out\n\nimport textwrap\nimport bz2\nimport pickle\nimport os\nimport zipfile\nimport io\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n    with getattr(bz2, \'open\')(token, "wt") as f:\n        f.write(json_str)\n\ndef gather_imports(imp):\n    resources = {}\n    m = imp\n    f = m.__file__\n    if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'):\n        top_package = os.path.dirname(m.__file__)\n        module_import = True\n    else:\n        im = __import__(m.__name__.split(\'.\')[0])\n        if isinstance(im, list):\n            print("im is a list")\n            print(im)\n        # the __path__ attribute *may* be a string in some cases. I had to fix this.\n        print("path.:",  __import__(m.__name__.split(\'.\')[0]).__path__)\n        # top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n        top_package = __import__(m.__name__.split(\'.\')[0]).__path__[0]\n        module_import = False\n\n    found_hashes = {}\n    # pycode = {}\n    resources[\'pycode\'] = {}\n    zip_buffer = io.BytesIO()\n    with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n        for root, dirs, files in os.walk(top_package):\n            for file in files:\n                if file.endswith(".py"):\n                    fpath = os.path.join(root, file)\n                    v = os.path.relpath(fpath, os.path.dirname(top_package) if not module_import else top_package)\n                    zip.write(fpath, v)\n                    if not fpath.endswith("_grade.py"): # Exclude grade files.\n                        with open(fpath, \'r\') as f:\n                            s = f.read()\n                        found_hashes[v] = python_code_str_id(s)\n                        resources[\'pycode\'][v] = s\n\n    resources[\'zipfile\'] = zip_buffer.getvalue()\n    resources[\'top_package\'] = top_package\n    resources[\'module_import\'] = module_import\n    resources[\'blake2b_file_hashes\'] = found_hashes\n    return resources, top_package\n\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\',  action="store_true",  help=\'Show Autolab results\')\n\ndef gather_report_source_include(report):\n    sources = {}\n    # print("")\n    # if not args.autolab:\n    if len(report.individual_imports) > 0:\n        print("By uploading the .token file, you verify the files:")\n        for m in report.individual_imports:\n            print(">", m.__file__)\n        print("Are created/modified individually by you in agreement with DTUs exam rules")\n        report.pack_imports += report.individual_imports\n\n    if len(report.pack_imports) > 0:\n        print("Including files in upload...")\n        for k, m in enumerate(report.pack_imports):\n            nimp, top_package = gather_imports(m)\n            _, report_relative_location, module_import = report._import_base_relative()\n\n            nimp[\'report_relative_location\'] = report_relative_location\n            nimp[\'report_module_specification\'] = module_import\n            nimp[\'name\'] = m.__name__\n            sources[k] = nimp\n            print(f" * {m.__name__}")\n    return sources\n\ndef gather_upload_to_campusnet(report, output_dir=None, token_include_plaintext_source=False):\n    # n = report.nL\n    args = parser.parse_args()\n    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n                                          show_progress_bar=not args.noprogress,\n                                          big_header=not args.autolab,\n                                          generate_artifacts=False,\n                                          )\n    print("")\n    sources = {}\n    if not args.autolab:\n        results[\'sources\'] = sources = gather_report_source_include(report)\n\n    token_plain = """\n# This file contains your results. Do not edit its content. Simply upload it as it is. """\n\n    s_include = [token_plain]\n    known_hashes = []\n    cov_files = []\n    use_coverage = True\n    if report._config is not None:\n        known_hashes = report._config[\'blake2b_file_hashes\']\n        for Q, _ in report.questions:\n            use_coverage = use_coverage and isinstance(Q, UTestCase)\n            for key in Q._cache:\n                if len(key) >= 2 and key[1] == "coverage":\n                    for f in Q._cache[key]:\n                        cov_files.append(f)\n\n    for s in sources.values():\n        for f_rel, hash in s[\'blake2b_file_hashes\'].items():\n            if hash in known_hashes and f_rel not in cov_files and use_coverage:\n                print("Skipping", f_rel)\n            else:\n                if token_include_plaintext_source:\n                    s_include.append("#"*3 +" Content of " + f_rel +" " + "#"*3)\n                    s_include.append("")\n                    s_include.append(s[\'pycode\'][f_rel])\n                    s_include.append("")\n\n    if output_dir is None:\n        output_dir = os.getcwd()\n\n    payload_out_base = report.__class__.__name__ + "_handin"\n\n    obtain, possible = results[\'total\']\n    vstring = f"_v{report.version}" if report.version is not None else ""\n    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n    token = os.path.normpath(os.path.join(output_dir, token))\n\n    save_token(results, "\\n".join(s_include), token)\n\n    if not args.autolab:\n        print("> Testing token file integrity...", sep="")\n        load_token(token)\n        print("Done!")\n        print(" ")\n        print("To get credit for your results, please upload the single unmodified file: ")\n        print(">", token)\n\n\ndef save_token(dictionary, plain_text, file_out):\n    if plain_text is None:\n        plain_text = ""\n    if len(plain_text) == 0:\n        plain_text = "Start token file"\n    plain_text = plain_text.strip()\n    b, b_hash = dict2picklestring(dictionary)\n    b_l1 = len(b)\n    b = "."+b+"."\n    b = "\\n".join( textwrap.wrap(b, 180))\n\n    out = [plain_text, token_sep, f"{b_hash} {b_l1}", token_sep, b]\n    with open(file_out, \'w\') as f:\n        f.write("\\n".join(out))\n\n\n\n\ndef source_instantiate(name, report1_source, payload):\n    # print("Executing sources", report1_source)\n    eval("exec")(report1_source, globals())\n    # print("Loaind gpayload..")\n    pl = pickle.loads(bytes.fromhex(payload))\n    report = eval(name)(payload=pl, strict=True)\n    return report\n\n\n__version__ = "0.1.29.0"\n\nfrom cs108.homework1 import add, reverse_list, linear_regression_weights, linear_predict, foo\nimport time\nimport numpy as np\nimport pickle\nimport os\n# from unitgrade.framework import dash\n\ndef mk_bad():\n    with open(os.path.dirname(__file__)+"/db.pkl", \'wb\') as f:\n        d = {\'x1\': 100, \'x2\': 300}\n        pickle.dump(d, f)\n\ndef mk_ok():\n    with open(os.path.dirname(__file__)+"/db.pkl", \'wb\') as f:\n        d = {\'x1\': 1, \'x2\': 2}\n        pickle.dump(d, f)\n\nclass Numpy(UTestCase):\n    z = 234\n\n    # def __getattr__(self, item):\n    #     print("hi there ", item)\n    #     return super().__getattr__(item)\n    #\n    # def __getattribute__(self, item):\n    #     print("oh hello sexy. ", item)\n    #     return super().__getattribute__(item)\n\n    @classmethod_dashboard\n    def setUpClass(cls) -> None:\n        print("Dum di dai, I am running some setup code here.")\n        for i in range(10):\n            print("Hello world", i)\n        print("Set up.") # must be handled seperately.\n        # assert False\n\n    # @cache\n    # def make_primes(self, n):\n    #     return primes(n)\n\n    # def setUp(self) -> None:\n    #     print("We are doing the setup thing.")\n\n    def test_bad(self):\n        """\n        Hints:\n            * Remember to properly de-indent your code.\n            * Do more stuff which works.\n        """\n        # raise Exception("This ended poorly")\n        # print("Here we go")\n        # return\n        # self.assertEqual(1, 1)\n        with open(os.path.dirname(__file__)+"/db.pkl", \'rb\') as f:\n            d = pickle.load(f)\n        # print(d)\n        # assert False\n        # for i in range(10):\n        from tqdm import tqdm\n        for i in tqdm(range(100)):\n            # print("The current number is", i)\n            time.sleep(.01)\n        self.assertEqual(1, d[\'x1\'])\n        for b in range(10):\n            self.assertEqualC(add(3, b))\n\n\n    def test_weights(self):\n        """\n            Hints:\n            * Try harder!\n            * Check the chapter on linear regression.\n        """\n        n = 3\n        m = 2\n        np.random.seed(5)\n        # from numpy import asdfaskdfj\n        # X = np.random.randn(n, m)\n        # y = np.random.randn(n)\n        foo()\n        # assert 2 == 3\n        # raise Exception("Bad exit")\n        # self.assertEqual(2, np.random.randint(1000))\n        # self.assertEqual(2, np.random.randint(1000))\n        # self.assertL2(linear_regression_weights(X, y), msg="the message")\n        self.assertEqual(1, 1)\n        # self.assertEqual(1,2)\n        return "THE RESULT OF THE TEST"\n\n\nclass AnotherTest(UTestCase):\n    def test_more(self):\n        self.assertEqual(2,2)\n\n    def test_even_more(self):\n        self.assertEqual(2,2)\n\nimport cs108\nclass Report2(Report):\n    title = "CS 101 Report 2"\n    questions = [\n        (Numpy, 10), (AnotherTest, 20)\n        ]\n    pack_imports = [cs108]'
-report1_payload = '8004954f040000000000007d94288c054e756d7079947d942868018c0a7365745570436c6173739486948c0474696d65948694473f3bf0000000000068018c08746573745f6261649486948c057469746c6594869468076801680786948c066173736572749486947d94284b004b034b014b044b024b054b034b064b044b074b054b084b064b094b074b0a4b084b0b4b094b0c7568016807869468058694473ff08790000000006801680786948c08636f7665726167659486947d948c1263733130382f686f6d65776f726b312e7079947d948c0e6465662061646428612c62293a20944b128ca12020202022222220476976656e2074776f206e756d626572732060616020616e642060626020746869732066756e6374696f6e2073686f756c642073696d706c792072657475726e2074686569722073756d3a0a202020203e2061646428612c6229203d20612b620a2020202048696e74733a0a20202020202020202a2052656d656d6265722062617369632061726974686d6574696373210a20202020222222948694737368018c0c746573745f7765696768747394869468098694681a6801681a8694680c86947d946801681a869468058694473f407400000000006801681a8694681286947d948c1263733130382f686f6d65776f726b312e7079947d94288c0b64656620666f6f28293a20944b168c162020202022222220436f6d6d656e742e2020202222229486948c0b6465662062617228293a20944b198c009486947573758c0b416e6f7468657254657374947d9428682d6803869468058694473f22700000000000682d8c09746573745f6d6f7265948694680c86947d94682d6831869468058694473f21200000000000682d8c0e746573745f6576656e5f6d6f7265948694680c86947d94682d6837869468058694473f1a700000000000758c06636f6e666967947d948c13626c616b6532625f66696c655f686173686573945d94288c806362363363336235383635306636313037643763663138646136303635666135373835666261626564643135316639653761633335313139323635623039393838623266653335373632303961333932616133656236633134636131316439646335393937343831633531373863313533393665656662313539653163373536948c803434656331613338643134373639626433653234323663386232366539303830356336313361386161653266333966663665633433363133666562363465303739373435323062306536353134353063303637623763633637636631366134313835653736346334383331373763333335303063626563626362336234646466948c803638306336353638323633623832303737313365616434306539323663643265363835336130613936353861386338343738393564363633643730643262343666616163333336396133636564366239623964303436346563316366656465326235306265376432626636313432313638383936663332306338353232313066946573752e'
+report1_source = '# from unitgrade import hide\n# from unitgrade import utils\n# import os\n# import lzma\n# import pickle\n\n# DONT\'t import stuff here since install script requires __version__\n\n# def cache_write(object, file_name, verbose=True):\n#     # raise Exception("bad")\n#     # import compress_pickle\n#     dn = os.path.dirname(file_name)\n#     if not os.path.exists(dn):\n#         os.mkdir(dn)\n#     if verbose: print("Writing cache...", file_name)\n#     with lzma.open(file_name, \'wb\', ) as f:\n#         pickle.dump(object, f)\n#     if verbose: print("Done!")\n#\n#\n# def cache_exists(file_name):\n#     # file_name = cn_(file_name) if cache_prefix else file_name\n#     return os.path.exists(file_name)\n#\n#\n# def cache_read(file_name):\n#     # import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n#     # file_name = cn_(file_name) if cache_prefix else file_name\n#     if os.path.exists(file_name):\n#         try:\n#             with lzma.open(file_name, \'rb\') as f:\n#                 return pickle.load(f)\n#         except Exception as e:\n#             print("Tried to load a bad pickle file at", file_name)\n#             print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n#             print(e)\n#             # return pickle.load(f)\n#     else:\n#         return None\n\n\n\nimport re\nimport sys\nimport threading\nimport time\nimport lzma\nimport hashlib\nimport pickle\nimport base64\nimport os\nfrom collections import namedtuple\nfrom io import StringIO\nimport numpy as np\nimport tqdm\nfrom colorama import Fore\nfrom functools import _make_key\nfrom diskcache import Cache\n\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\ndef gprint(s):\n    print(f"{Fore.LIGHTGREEN_EX}{s}")\n\nmyround = lambda x: np.round(x)  # required for obfuscation.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\n"""\nClean up the various output-related helper classes.\n"""\nclass Logger(object):\n    def __init__(self, buffer, write_to_stdout=True):\n        # assert False\n        self.terminal = sys.stdout\n        self.write_to_stdout = write_to_stdout\n        self.log = buffer\n\n    def write(self, message):\n        if self.write_to_stdout:\n            self.terminal.write(message)\n        self.log.write(message)\n\n    def flush(self):\n        # this flush method is needed for python 3 compatibility.\n        pass\n\n\nclass Capturing(list):\n    def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n        self._stdout = stdout\n        self.unmute = unmute\n        super().__init__(*args, **kwargs)\n\n    def __enter__(self, capture_errors=True):  # don\'t put arguments here.\n        self._stdout = sys.stdout if self._stdout == None else self._stdout\n        self._stringio = StringIO()\n        if self.unmute:\n            sys.stdout = Logger(self._stringio)\n        else:\n            sys.stdout = self._stringio\n\n        if capture_errors:\n            self._sterr = sys.stderr\n            sys.sterr = StringIO()  # memory hole it\n        self.capture_errors = capture_errors\n        return self\n\n    def __exit__(self, *args):\n        self.extend(self._stringio.getvalue().splitlines())\n        del self._stringio  # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n\nclass Capturing2(Capturing):\n    def __exit__(self, *args):\n        lines = self._stringio.getvalue().splitlines()\n        txt = "\\n".join(lines)\n        numbers = extract_numbers(rm_progress_bar(txt))\n        self.extend(lines)\n        del self._stringio  # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n        self.output = txt\n        self.numbers = numbers\n\n\ndef rm_progress_bar(txt):\n    # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n    nlines = []\n    for l in txt.splitlines():\n        pct = l.find("%")\n        ql = False\n        if pct > 0:\n            i = l.find("|", pct + 1)\n            if i > 0 and l.find("|", i + 1) > 0:\n                ql = True\n        if not ql:\n            nlines.append(l)\n    return "\\n".join(nlines)\n\n\nclass ActiveProgress():\n    def __init__(self, t, start=True, title="my progress bar", show_progress_bar=True, file=None, mute_stdout=False):\n        if file == None:\n            file = sys.stdout\n        self.file = file\n        self.mute_stdout = mute_stdout\n        self._running = False\n        self.title = title\n        self.dt = 0.025\n        self.n = max(1, int(np.round(t / self.dt)))\n        self.show_progress_bar = show_progress_bar\n        self.pbar = None\n\n        if start:\n            self.start()\n\n    def start(self):\n        if self.mute_stdout:\n            import io\n            # from unitgrade.utils import Logger\n            self._stdout = sys.stdout\n            sys.stdout = Logger(io.StringIO(), write_to_stdout=False)\n\n        self._running = True\n        if self.show_progress_bar:\n            self.thread = threading.Thread(target=self.run)\n            self.thread.start()\n        self.time_started = time.time()\n\n    def terminate(self):\n        if not self._running:\n            print("Stopping a progress bar which is not running (class unitgrade.utils.ActiveProgress")\n            pass\n            # raise Exception("Stopping a stopped progress bar. ")\n        self._running = False\n        if self.show_progress_bar:\n            self.thread.join()\n        if self.pbar is not None:\n            self.pbar.update(1)\n            self.pbar.close()\n            self.pbar = None\n\n        self.file.flush()\n\n        if self.mute_stdout:\n            import io\n            # from unitgrade.utils import Logger\n            sys.stdout = self._stdout #= sys.stdout\n\n            # sys.stdout = Logger(io.StringIO(), write_to_stdout=False)\n\n        return time.time() - self.time_started\n\n    def run(self):\n        self.pbar = tqdm.tqdm(total=self.n, file=self.file, position=0, leave=False, desc=self.title, ncols=100,\n                              bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')\n        t_ = time.time()\n        for _ in range(self.n - 1):  # Don\'t terminate completely; leave bar at 99% done until terminate.\n            if not self._running:\n                self.pbar.close()\n                self.pbar = None\n                break\n            tc = time.time()\n            tic = max(0, self.dt - (tc - t_))\n            if tic > 0:\n                time.sleep(tic)\n            t_ = time.time()\n            self.pbar.update(1)\n\n\ndef dprint(first, last, nL, extra = "", file=None, dotsym=\'.\', color=\'white\'):\n    if file == None:\n        file = sys.stdout\n    dot_parts = (dotsym * max(0, nL - len(last) - len(first)))\n    print(first + dot_parts, end="", file=file)\n    last += extra\n    print(last, file=file)\n\n\ndef hide(func):\n    return func\n\n\ndef makeRegisteringDecorator(foreignDecorator):\n    """\n        Returns a copy of foreignDecorator, which is identical in every\n        way(*), except also appends a .decorator property to the callable it\n        spits out.\n    """\n\n    def newDecorator(func):\n        # Call to newDecorator(method)\n        # Exactly like old decorator, but output keeps track of what decorated it\n        R = foreignDecorator(func)  # apply foreignDecorator, like call to foreignDecorator(method) would have done\n        R.decorator = newDecorator  # keep track of decorator\n        # R.original = func         # might as well keep track of everything!\n        return R\n\n    newDecorator.__name__ = foreignDecorator.__name__\n    newDecorator.__doc__ = foreignDecorator.__doc__\n    return newDecorator\n\n\nhide = makeRegisteringDecorator(hide)\n\n\ndef extract_numbers(txt):\n    numeric_const_pattern = r\'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n    rx = re.compile(numeric_const_pattern, re.VERBOSE)\n    all = rx.findall(txt)\n    all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n    if len(all) > 500:\n        print(txt)\n        raise Exception("unitgrade_v1.unitgrade_v1.py: Warning, too many numbers!", len(all))\n    return all\n\n\ndef cache(foo, typed=False):\n    """ Magic cache wrapper\n    https://github.com/python/cpython/blob/main/Lib/functools.py\n    """\n    maxsize = None\n    def wrapper(self, *args, **kwargs):\n        key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)))\n        # print(self._cache.keys())\n        # for k in self._cache:\n        #     print(k)\n        if not self._cache_contains(key):\n            value = foo(self, *args, **kwargs)\n            self._cache_put(key, value)\n        else:\n            value = self._cache_get(key)\n            # This appears to be required since there are two caches. Otherwise, when deploy method is run twice,\n            # the cache will not be set correctly.\n            self._cache_put(key, value)\n        return value\n\n    return wrapper\n\n\ndef methodsWithDecorator(cls, decorator):\n    """\n        Returns all methods in CLS with DECORATOR as the\n        outermost decorator.\n\n        DECORATOR must be a "registering decorator"; one\n        can make any decorator "registering" via the\n        makeRegisteringDecorator function.\n\n        import inspect\n        ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n        for f in ls:\n            print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n    """\n    for maybeDecorated in cls.__dict__.values():\n        if hasattr(maybeDecorated, \'decorator\'):\n            if maybeDecorated.decorator == decorator:\n                print(maybeDecorated)\n                yield maybeDecorated\n\n\n""" Methods responsible for turning a dictionary into a string that can be pickled or put into a json file. """\ndef dict2picklestring(dd):\n    """\n    Turns a dictionary into a string with some compression.\n\n    :param dd:\n    :return:\n    """\n    b = lzma.compress(pickle.dumps(dd))\n    b_hash = hashlib.blake2b(b).hexdigest()\n    return base64.b64encode(b).decode("utf-8"), b_hash\n\ndef picklestring2dict(picklestr):\n    """ Reverse of the above method: Turns the string back into a dictionary. """\n    b = base64.b64decode(picklestr)\n    hash = hashlib.blake2b(b).hexdigest()\n    dictionary = pickle.loads(lzma.decompress(b))\n    return dictionary, hash\n\ntoken_sep = "-"*70 + " ..ooO0Ooo.. " + "-"*70\ndef load_token(file_in):\n    """ We put this one here to allow loading of token files for the dashboard. """\n    with open(file_in, \'r\') as f:\n        s = f.read()\n    splt = s.split(token_sep)\n    data = splt[-1]\n    info = splt[-2]\n    head = token_sep.join(splt[:-2])\n    plain_text=head.strip()\n    hash, l1 = info.split(" ")\n    data = "".join( data.strip()[1:-1].splitlines() )\n    l1 = int(l1)\n    dictionary, b_hash = picklestring2dict(data)\n    assert len(data) == l1\n    assert b_hash == hash.strip()\n    return dictionary, plain_text\n\n\n\n## Key/value store related.\nclass DKPupDB:\n    """ This key/value store store artifacts (associated with a specific question) in a dictionary. """\n    def __init__(self, artifact_file, use_pupdb=False):\n        # Make a double-headed disk cache thingy.\n        self.dk = Cache(os.path.dirname(artifact_file)) # Start in this directory.\n        self.name_ = os.path.basename(artifact_file[:-5])\n        if self.name_ not in self.dk:\n            self.dk[self.name_] = dict()\n        self.use_pupdb = use_pupdb\n        if self.use_pupdb:\n            from pupdb.core import PupDB\n            self.db_ = PupDB(artifact_file)\n\n    def __setitem__(self, key, value):\n        if self.use_pupdb:\n            self.db_.set(key, value)\n        with self.dk.transact():\n            d = self.dk[self.name_]\n            d[key] = value\n            self.dk[self.name_] = d\n            self.dk[self.name_ + "-updated"] = True\n\n    def __getitem__(self, item):\n        v = self.dk[self.name_][item]\n        if self.use_pupdb:\n            v2 = self.db_.get(item)\n            if v != v2:\n                print("Mismatch v1, v2 for ", item)\n        return v\n\n    def keys(self): # This one is also deprecated.\n        return tuple(self.dk[self.name_].keys()) #.iterkeys())\n        # return self.db_.keys()\n\n    def set(self, item, value): # This one is deprecated.\n        self[item] = value\n\n    def get(self, item, default=None):\n        return self[item] if item in self else default\n\n    def __contains__(self, item):\n        return item in self.dk[self.name_] #keys()\n        # return item in self.dk\n\n\nimport io\nimport sys\nimport time\nimport unittest\nfrom unittest.runner import _WritelnDecorator\nimport numpy as np\n\n\nclass UTextResult(unittest.TextTestResult):\n    nL = 80\n    number = -1  # HAcky way to set question number.\n    show_progress_bar = True\n    unmute = False # Whether to redirect stdout.\n    cc = None\n    setUpClass_time = 3 # Estimated time to run setUpClass in TestCase. Must be set externally. See key (("ClassName", "setUpClass"), "time") in _cache.\n\n    def __init__(self, stream, descriptions, verbosity):\n        super().__init__(stream, descriptions, verbosity)\n        self.successes = []\n\n    def printErrors(self) -> None:\n        # TODO: Fix here. probably also needs to flush stdout.\n        self.printErrorList(\'ERROR\', [(test, res[\'stderr\']) for test, res in self.errors])\n        self.printErrorList(\'FAIL\',  [(test, res[\'stderr\']) for test, res in self.failures])\n\n    def addError(self, test, err):\n        super(unittest.TextTestResult, self).addError(test, err)\n        err = self.errors[-1][1]\n        if hasattr(sys.stdout, \'log\'):\n            stdout = sys.stdout.log.readlines()  # Only works because we set sys.stdout to a unitgrade.Logger\n        else:\n            stdout = ""\n        self.errors[-1] = (self.errors[-1][0], {\'return\': None,\n                                \'stderr\': err,\n                                \'stdout\': stdout\n                                })\n\n        if not hasattr(self, \'item_title_print\'):\n            # In case setUpClass() fails with an error the short description may not be set. This will fix that problem.\n            self.item_title_print = test.shortDescription()\n            if self.item_title_print is None:  # In case the short description is not set either...\n                self.item_title_print = test.id()\n\n\n        self.cc_terminate(success=False)\n\n    def addFailure(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        err = self.failures[-1][1]\n        stdout = sys.stdout.log.readlines()  # Only works because we set sys.stdout to a unitgrade.Logger\n        self.failures[-1] = (self.failures[-1][0], {\'return\': None,\n                                \'stderr\': err,\n                                \'stdout\': stdout\n                                })\n        self.cc_terminate(success=False)\n\n\n    def addSuccess(self, test: unittest.case.TestCase) -> None:\n        msg = None\n        stdout = sys.stdout.log.readlines() # Only works because we set sys.stdout to a unitgrade.Logger\n\n        if hasattr(test, \'_get_outcome\'):\n            o = test._get_outcome()\n            if isinstance(o, dict):\n                key = (test.cache_id(), "return")\n                if key in o:\n                    msg = test._get_outcome()[key]\n\n        # print(sys.stdout.readlines())\n        self.successes.append((test, None))  # (test, message) (to be consistent with failures and errors).\n        self.successes[-1] = (self.successes[-1][0], {\'return\': msg,\n                                 \'stdout\': stdout,\n                                 \'stderr\': None})\n\n        self.cc_terminate()\n\n    def cc_terminate(self, success=True):\n        if self.show_progress_bar or True:\n            tsecs = np.round(self.cc.terminate(), 2)\n            self.cc.file.flush()\n            ss = self.item_title_print\n\n            state = "PASS" if success else "FAILED"\n\n            dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n            if self.show_progress_bar or True:\n                print(self.item_title_print + dot_parts, end="", file=self.cc.file)\n            else:\n                print(dot_parts, end="", file=self.cc.file)\n\n            if tsecs >= 0.5:\n                state += " (" + str(tsecs) + " seconds)"\n            print(state, file=self.cc.file)\n\n    def startTest(self, test):\n        name = test.__class__.__name__\n        if self.testsRun == 0 and hasattr(test.__class__, \'_cache2\'): # Disable this if the class is pure unittest.TestCase\n            # This is the first time we are running a test. i.e. we can time the time taken to call setupClass.\n            if test.__class__._cache2 is None:\n                test.__class__._cache2 = {}\n            test.__class__._cache2[((name, \'setUpClass\'), \'time\')] = time.time() - self.t_start\n\n        self.testsRun += 1\n        item_title = test.shortDescription()  # Better for printing (get from cache).\n\n        if item_title == None:\n            # For unittest framework where getDescription may return None.\n            item_title = self.getDescription(test)\n        self.item_title_print = " * q%i.%i) %s" % (UTextResult.number + 1, self.testsRun, item_title)\n        # if self.show_progress_bar or True:\n        estimated_time = test.__class__._cache.get(((name, test._testMethodName), \'time\'), 100) if hasattr(test.__class__, \'_cache\') else 4\n        self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar)\n        # else:\n        #     print(self.item_title_print + (\'.\' * max(0, self.nL - 4 - len(self.item_title_print))), end="")\n        self._test = test\n        # if not self.unmute:\n        self._stdout = sys.stdout # Redundant. remove later.\n        sys.stdout = Logger(io.StringIO(), write_to_stdout=self.unmute)\n\n    def stopTest(self, test):\n        # if not self.unmute:\n        buff = sys.stdout.log\n        sys.stdout = self._stdout # redundant.\n        buff.close()\n        super().stopTest(test)\n\n    def _setupStdout(self):\n        if self._previousTestClass == None:\n            self.t_start = time.time()\n            if hasattr(self.__class__, \'q_title_print\'):\n                q_title_print = self.__class__.q_title_print\n            else:\n                q_title_print = "<unnamed test. See unitgrade.framework.py>"\n\n            cc = ActiveProgress(t=self.setUpClass_time, title=q_title_print, show_progress_bar=self.show_progress_bar, mute_stdout=not self.unmute)\n            self.cc = cc\n\n\n    def _restoreStdout(self):  # Used when setting up the test.\n        if self._previousTestClass is None:\n            q_time = self.cc.terminate()\n            q_time = np.round(q_time, 2)\n            sys.stdout.flush()\n            if self.show_progress_bar:\n                print(self.cc.title, end="")\n            print(" " * max(0, self.nL - len(self.cc.title)) + (" (" + str(q_time) + " seconds)" if q_time >= 0.5 else ""))\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        stream = io.StringIO()\n        super().__init__(*args, stream=stream, **kwargs)\n\n    def _makeResult(self):\n        # stream = self.stream # not you!\n        stream = sys.stdout\n        stream = _WritelnDecorator(stream)\n        return self.resultclass(stream, self.descriptions, self.verbosity)\n\nimport importnb\nimport numpy as np\nimport sys\nimport pickle\nimport os\nimport inspect\nimport colorama\nimport unittest\nimport time\nimport textwrap\nimport urllib.parse\nimport requests\nimport ast\nimport numpy\nfrom unittest.case import TestCase\n\n\ncolorama.init(autoreset=True)  # auto resets your settings after every output\nnumpy.seterr(all=\'raise\')\n\ndef setup_dir_by_class(C, base_dir):\n    name = C.__class__.__name__\n    return base_dir, name\n\n\n_DASHBOARD_COMPLETED_MESSAGE = "Dashboard> Evaluation completed."\n\n# Consolidate this code.\nclass classmethod_dashboard(classmethod):\n    def __init__(self, f):\n        def dashboard_wrap(cls: UTestCase):\n            if not cls._generate_artifacts:\n                f(cls)\n                return\n            db = DKPupDB(cls._artifact_file_for_setUpClass())\n            r = np.random.randint(1000 * 1000)\n            db.set(\'run_id\', r)\n            db.set(\'coverage_files_changed\', None)\n\n            state_ = \'fail\'\n            try:\n                _stdout = sys.stdout\n                _stderr = sys.stderr\n                std_capture = StdCapturing(stdout=sys.stdout, stderr=sys.stderr, db=db, mute=False)\n\n                # Run this unittest and record all of the output.\n                # This is probably where we should hijack the stdout output and save it -- after all, this is where the test is actually run.\n                # sys.stdout = stdout_capture\n                sys.stderr = std_capture.dummy_stderr\n                sys.stdout = std_capture.dummy_stdout\n                db.set("state", "running")\n                f(cls)\n                state_ = \'pass\'\n            except Exception as e:\n                from werkzeug.debug.tbtools import DebugTraceback, _process_traceback\n                state_ = \'fail\'\n                db.set(\'state\', state_)\n                exi = e\n                dbt = DebugTraceback(exi)\n                sys.stderr.write(dbt.render_traceback_text())\n                html = dbt.render_traceback_html(include_title="hello world")\n                db.set(\'wz_stacktrace\', html)\n                raise e\n            finally:\n                db.set(\'state\', state_)\n                std_capture.dummy_stdout.write_mute(_DASHBOARD_COMPLETED_MESSAGE)\n                sys.stdout = _stdout\n                sys.stderr = _stderr\n                std_capture.close()\n        super().__init__(dashboard_wrap)\n\nclass Report:\n    title = "report title"\n    abbreviate_questions = False # Should the test items start with \'Question ...\' or just be q1).\n    version = None # A version number of the report (1.0). Used to compare version numbers with online resources.\n    url = None  # Remote location of this problem.\n\n    questions = []\n    pack_imports = []\n    individual_imports = []\n\n    _remote_check_cooldown_seconds = 1  # Seconds between remote check of report.\n    nL = 120  # Maximum line width\n    _config = None  # Private variable. Used when collecting results from student computers. Should only be read/written by teacher and never used for regular evaluation.\n    _setup_mode = False # True if test is being run in setup-mode, i.e. will not fail because of bad configurations, etc.\n\n    @classmethod\n    def reset(cls):\n        for (q, _) in cls.questions:\n            if hasattr(q, \'reset\'):\n                q.reset()\n\n    @classmethod\n    def mfile(clc):\n        return inspect.getfile(clc)\n\n    def _file(self):\n        return inspect.getfile(type(self))\n\n    def _artifact_file(self):\n        """ File for the artifacts DB (thread safe). This file is optinal. Note that it is a pupdb database file.\n        Note the file is shared between all sub-questions. """\n        return os.path.join(os.path.dirname(self._file()), "unitgrade_data/main_config_"+ os.path.basename(self._file()[:-3]) + ".artifacts.pkl")\n\n    def _is_run_in_grade_mode(self):\n        """ True if this report is being run as part of a grade run. """\n        return self._file().endswith("_grade.py") # Not sure I love this convention.\n\n    def _import_base_relative(self):\n        if hasattr(self.pack_imports[0], \'__path__\'):\n            root_dir = self.pack_imports[0].__path__[0]\n        else:\n            root_dir = self.pack_imports[0].__file__\n\n        root_dir = os.path.dirname(root_dir)\n        relative_path = os.path.relpath(self._file(), root_dir)\n        modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n        relative_path = relative_path.replace("\\\\", "/")\n        return root_dir, relative_path, modules\n\n    def __init__(self, strict=False, payload=None):\n        working_directory = os.path.abspath(os.path.dirname(self._file()))\n        self.wdir, self.name = setup_dir_by_class(self, working_directory)\n        # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n        for (q, _) in self.questions:\n            q.nL = self.nL  # Set maximum line length.\n\n        if payload is not None:\n            self.set_payload(payload, strict=strict)\n\n    def main(self, verbosity=1):\n        # Run all tests using standard unittest (nothing fancy).\n        loader = unittest.TestLoader()\n        for q, _ in self.questions:\n            start = time.time()  #\n            suite = loader.loadTestsFromTestCase(q)\n            unittest.TextTestRunner(verbosity=verbosity).run(suite)\n            total = time.time() - start\n            q.time = total\n\n    def _setup_answers(self, with_coverage=False, verbose=True):\n        if with_coverage:\n            for q, _ in self.questions:\n                q._with_coverage = True\n                q._report = self\n        for q, _ in self.questions:\n            q._setup_answers_mode = True\n            # q._generate_artifacts = False # Disable artifact generation when the report is being set up.\n\n        evaluate_report_student(self, unmute=verbose, noprogress=not verbose, generate_artifacts=False) # Disable artifact generation.\n\n        # self.main()  # Run all tests in class just to get that out of the way...\n        report_cache = {}\n        for q, _ in self.questions:\n            # print(self.questions)\n            if hasattr(q, \'_save_cache\'):\n                q()._save_cache()\n                # print("q is", q())\n                report_cache[q.__qualname__] = q._cache2\n            else:\n                report_cache[q.__qualname__] = {\'no cache see _setup_answers in framework.py\': True}\n        if with_coverage:\n            for q, _ in self.questions:\n                q._with_coverage = False\n\n        # report_cache is saved on a per-question basis.\n        # it could also contain additional information such as runtime metadata etc. This may not be appropriate to store with the invidivual questions(?).\n        # In this case, the function should be re-defined.\n        return report_cache\n\n    def set_payload(self, payloads, strict=False):\n        for q, _ in self.questions:\n            q._cache = payloads[q.__qualname__]\n        self._config = payloads[\'config\']\n\n    def _check_remote_versions(self):\n        if self.url is None:\n            return\n        url = self.url\n        if not url.endswith("/"):\n            url += "/"\n        snapshot_file = os.path.dirname(self._file()) + "/unitgrade_data/.snapshot"\n        if os.path.isfile(snapshot_file):\n            with open(snapshot_file, \'r\') as f:\n                t = f.read()\n                if (time.time() - float(t)) < self._remote_check_cooldown_seconds:\n                    return\n\n        if self.url.startswith("https://gitlab"):\n            # Try to turn url into a \'raw\' format.\n            # "https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/raw/master/examples/autolab_example_py_upload/instructor/cs102_autolab/report2_test.py?inline=false"\n            # url = self.url\n            url = url.replace("-/tree", "-/raw")\n            # print(url)\n            # "https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/tree/master/examples/autolab_example_py_upload/instructor/cs102_autolab"\n            # "https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/raw/master/examples/autolab_example_py_upload/instructor/report2_test.py?inline=false"\n            # "https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/raw/master/examples/autolab_example_py_upload/instructor/cs102_autolab/report2_test.py?inline=false"\n            raw_url = urllib.parse.urljoin(url, os.path.basename(self._file()) + "?inline=false")\n            # print("Is this file run in local mode?", self._is_run_in_grade_mode())\n            if self._is_run_in_grade_mode():\n                remote_source = requests.get(raw_url).text\n                with open(self._file(), \'r\') as f:\n                    local_source = f.read()\n                if local_source != remote_source:\n                    print("\\nThe local version of this report is not identical to the remote version which can be found at")\n                    print(self.url)\n                    print("The most likely reason for this is that the remote version was updated by the teacher due to some issue.")\n                    print("You should check if there was an announcement and update the test to the most recent version; most likely")\n                    print("This can be done by running the command")\n                    print("> git pull")\n                    print("You can find the most recent code here:")\n                    print(self.url)\n                    raise Exception(f"Version of grade script does not match the remote version. Please update using git pull")\n            else:\n                text = requests.get(raw_url).text\n                node = ast.parse(text)\n                classes = [n for n in node.body if isinstance(n, ast.ClassDef) if n.name == self.__class__.__name__][0]\n                for b in classes.body:\n                    # print(b.)\n                    if b.targets[0].id == "version":\n                        # print(b)\n                        # print(b.value)\n                        version_remote = b.value.value\n                        break\n                if version_remote != self.version:\n                    print("\\nThe version of this report", self.version, "does not match the version of the report on git", version_remote)\n                    print("The most likely reason for this is that the remote version was updated by the teacher due to some issue.")\n                    print("You should check if there was an announcement and update the test to the most recent version; most likely")\n                    print("This can be done by running the command")\n                    print("> git pull")\n                    print("You can find the most recent code here:")\n                    print(self.url)\n                    raise Exception(f"Version of test on remote is {version_remote}, which is different than this version of the test {self.version}. Please update your test to the most recent version.")\n\n                for (q,_) in self.questions:\n                    qq = q(skip_remote_check=True)\n                    cfile = q._cache_file()\n\n                    relpath = os.path.relpath(cfile, os.path.dirname(self._file()))\n                    relpath = relpath.replace("\\\\", "/")\n                    raw_url = urllib.parse.urljoin(url, relpath + "?inline=false")\n                    # requests.get(raw_url)\n\n                    with open(cfile, \'rb\') as f:\n                        b1 = f.read()\n\n                    b2 = requests.get(raw_url).content\n                    if b1 != b2:\n                        print("\\nQuestion ", qq.title, "relies on the data file", cfile)\n                        print("However, it appears that this file is missing or in a different version than the most recent found here:")\n                        print(self.url)\n                        print("The most likely reason for this is that the remote version was updated by the teacher due to some issue.")\n                        print("You should check if there was an announcement and update the test to the most recent version; most likely")\n                        print("This can be done by simply running the command")\n                        print("> git pull")\n                        print("to avoid running bad tests against good code, the program will now stop. Please update and good luck!")\n                        raise Exception("The data file for the question", qq.title, "did not match remote source found on git. The test will therefore automatically fail. Please update your test/data files.")\n\n                t = time.time()\n                if os.path.isdir(os.path.dirname(self._file()) + "/unitgrade_data"):\n                    with open(snapshot_file, \'w\') as f:\n                        f.write(f"{t}")\n\ndef get_hints(ss):\n    """ Extract all blocks of the forms:\n\n    Hints:\n    bla-bla.\n\n    and returns the content unaltered.\n    """\n    if ss == None:\n        return None\n    try:\n        ss = textwrap.dedent(ss)\n        ss = ss.replace(\'\'\'"""\'\'\', "").strip()\n        hints = ["hints:", "hint:"]\n        indexes = [ss.lower().find(h) for h in hints]\n        j = np.argmax(indexes)\n        if indexes[j] == -1:\n            return None\n        h = hints[j]\n        ss = ss[ss.lower().find(h) + len(h) + 1:]\n        ss = "\\n".join([l for l in ss.split("\\n") if not l.strip().startswith(":")])\n        ss = textwrap.dedent(ss).strip()\n        # if ss.startswith(\'*\'):\n        #     ss = ss[1:].strip()\n        return ss\n    except Exception as e:\n        print("bad hints", ss, e)\n\n\nclass UTestCase(unittest.TestCase):\n    # a = 234\n    _outcome = None  # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n    _cache = None  # Read-only cache. Ensures method always produce same result.\n    _cache2 = None  # User-written cache.\n    _with_coverage = False\n    _covcache = None # Coverage cache. Written to if _with_coverage is true.\n    _report = None  # The report used. This is very, very hacky and should always be None. Don\'t rely on it!\n    _run_in_report_mode = True\n\n    _generate_artifacts = True # Whether the file will generate the artifact .json files. This is used in the _grade-script mode.\n    # If true, the tests will not fail when cache is used. This is necesary since otherwise the cache will not be updated\n    # during setup, and the deploy script must be run many times.\n    _setup_answers_mode = False\n\n    def capture(self):\n        if hasattr(self, \'_stdout\') and self._stdout is not None:\n            file = self._stdout\n        else:\n            file = sys.stdout\n        return Capturing2(stdout=file)\n\n    @classmethod\n    def question_title(cls):\n        """ Return the question title """\n        if cls.__doc__ is not None:\n            title = cls.__doc__.strip().splitlines()[0].strip()\n            if not (title.startswith("Hints:") or title.startswith("Hint:") ):\n                return title\n        return cls.__qualname__\n\n    def run(self, result):\n        # print("Run called in test framework...", self._generate_artifacts)\n        if not self._generate_artifacts:\n            return super().run(result)\n\n        db = DKPupDB(self._artifact_file())\n        db.set("state", "running")\n        db.set(\'run_id\', np.random.randint(1000*1000))\n        db.set(\'coverage_files_changed\', None)\n\n\n        _stdout = sys.stdout\n        _stderr = sys.stderr\n\n        std_capture = StdCapturing(stdout=sys.stdout, stderr=sys.stderr, db=db, mute=False)\n\n        # stderr_capture = StdCapturing(sys.stderr, db=db)\n        # std_err_capture = StdCapturing(sys.stderr, "stderr", db=db)\n        state_ = None\n        try:\n            # Run this unittest and record all of the output.\n            # This is probably where we should hijack the stdout output and save it -- after all, this is where the test is actually run.\n            # sys.stdout = stdout_capture\n            sys.stderr = std_capture.dummy_stderr\n            sys.stdout = std_capture.dummy_stdout\n\n            result_ = TestCase.run(self, result)\n\n            from werkzeug.debug.tbtools import DebugTraceback, _process_traceback\n            # print(result_._excinfo[0])\n            actual_errors = []\n            for test, err in self._error_fed_during_run:\n                if err is None:\n                    continue\n                else:\n                    import traceback\n                    # traceback.print_tb(err[2])\n                    actual_errors.append(err)\n\n            if len(actual_errors) > 0:\n                ex, exi, tb = actual_errors[0]\n                exi.__traceback__ = tb\n                dbt = DebugTraceback(exi)\n                sys.stderr.write(dbt.render_traceback_text())\n                html = dbt.render_traceback_html(include_title="hello world")\n                db.set(\'wz_stacktrace\', html)\n                # db.set(\'state\', \'fail\')\n                state_ = "fail"\n            else:\n                state_ = "pass"\n        except Exception as e:\n            state_ = "fail"\n            import traceback\n            traceback.print_exc()\n            raise e\n        finally:\n            db.set(\'state\', state_)\n            std_capture.dummy_stdout.write_mute(_DASHBOARD_COMPLETED_MESSAGE)\n            sys.stdout = _stdout\n            sys.stderr = _stderr\n            std_capture.close()\n        return result_\n\n    def _callSetUp(self):\n        if self._with_coverage:\n            if self._covcache is None:\n                self._covcache = {}\n            import coverage\n            self.cov = coverage.Coverage(data_file=None)\n            self.cov.start()\n        self.setUp()\n\n\n    def _callTearDown(self):\n        self.tearDown()\n        if self._with_coverage:\n            from pathlib import Path\n            from snipper import snipper_main\n            try:\n                self.cov.stop()\n            except Exception as e:\n                print("Something went wrong while tearing down coverage test")\n                print(e)\n            data = self.cov.get_data()\n            base, _, _ = self._report._import_base_relative()\n            for file in data.measured_files():\n                file = os.path.normpath(file)\n                root = Path(base)\n                child = Path(file)\n                if root in child.parents:\n                    with open(child, \'r\') as f:\n                        s = f.read()\n                    lines = s.splitlines()\n                    garb = \'GARBAGE\'\n                    lines2 = snipper_main.censor_code(lines, keep=True)\n                    if len(lines) != len(lines2):\n                        for k in range(len(lines)):\n                            print(k, ">", lines[k], "::::::::", lines2[k])\n                        print("Snipper failure; line lenghts do not agree. Exiting..")\n                        print(child, "len(lines) == len(lines2)", len(lines), len(lines2))\n                        import sys\n                        sys.exit()\n\n                    assert len(lines) == len(lines2)\n                    for ll in data.contexts_by_lineno(file):\n                        l = ll-1\n                        if l < len(lines2) and lines2[l].strip() == garb:\n                            rel = os.path.relpath(child, root)\n                            cc = self._covcache\n                            j = 0\n                            for j in range(l, -1, -1):\n                                if "def" in lines2[j] or "class" in lines2[j]:\n                                    break\n                            from snipper.legacy import gcoms\n\n                            fun = lines2[j]\n                            comments, _ = gcoms("\\n".join(lines2[j:l]))\n                            if rel not in cc:\n                                cc[rel] = {}\n                            cc[rel][fun] = (l, "\\n".join(comments))\n                            # print("found", rel, fun)\n                            self._cache_put((self.cache_id(), \'coverage\'), self._covcache)\n\n    def shortDescriptionStandard(self):\n        sd = super().shortDescription()\n        if sd is None or sd.strip().startswith("Hints:") or sd.strip().startswith("Hint:"):\n            sd = self._testMethodName\n        return sd\n\n    def shortDescription(self):\n        sd = self.shortDescriptionStandard()\n        title = self._cache_get((self.cache_id(), \'title\'), sd)\n        return title if title is not None else sd\n\n    @property\n    def title(self):\n        return self.shortDescription()\n\n    @title.setter\n    def title(self, value):\n        self._cache_put((self.cache_id(), \'title\'), value)\n\n    def _get_outcome(self):\n        if not hasattr(self.__class__, \'_outcome\') or self.__class__._outcome is None:\n            self.__class__._outcome = {}\n        return self.__class__._outcome\n\n    def _callTestMethod(self, testMethod):\n        t = time.time()\n        self._ensure_cache_exists()  # Make sure cache is there.\n        if self._testMethodDoc is not None:\n            self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard())\n\n        self._cache2[(self.cache_id(), \'assert\')] = {}\n        res = testMethod()\n        elapsed = time.time() - t\n        self._get_outcome()[ (self.cache_id(), "return") ] = res\n        self._cache_put((self.cache_id(), "time"), elapsed)\n\n\n    def cache_id(self):\n        c = self.__class__.__qualname__\n        m = self._testMethodName\n        return c, m\n\n    def __init__(self, *args, skip_remote_check=False, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._load_cache()\n        self._assert_cache_index = 0\n        # Perhaps do a sanity check here to see if the cache is up to date? To do that, we must make sure the\n        # cache exists locally.\n        # Find the report class this class is defined within.\n        if skip_remote_check:\n            return\n        import importlib, inspect\n        found_reports = []\n        # print("But do I have report", self._report)\n        # print("I think I am module", self.__module__)\n        # print("Importlib says", importlib.import_module(self.__module__))\n        # This will delegate you to the wrong main clsas when running in grade mode.\n        for name, cls in inspect.getmembers(importlib.import_module(self.__module__), inspect.isclass):\n            # print("checking", cls)\n            if issubclass(cls, Report):\n                for q,_ in cls.questions:\n                    if q == self.__class__:\n                        found_reports.append(cls)\n        if len(found_reports) == 0:\n            pass # This case occurs when the report _grade script is being run.\n            # raise Exception("This question is not a member of a report. Very, very odd.")\n        if len(found_reports) > 1:\n            raise Exception("This question is a member of multiple reports. That should not be the case -- don\'t get too creative.")\n        if len(found_reports) > 0:\n            report = found_reports[0]\n            report()._check_remote_versions()\n\n\n    def _ensure_cache_exists(self):\n        if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n            self.__class__._cache = dict()\n        if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n            self.__class__._cache2 = dict()\n\n    def _cache_get(self, key, default=None):\n        self._ensure_cache_exists()\n        return self.__class__._cache.get(key, default)\n\n    def _cache_put(self, key, value):\n        self._ensure_cache_exists()\n        self.__class__._cache2[key] = value\n\n    def _cache_contains(self, key):\n        self._ensure_cache_exists()\n        return key in self.__class__._cache\n\n    def get_expected_test_value(self):\n        key = (self.cache_id(), \'assert\')\n        id = self._assert_cache_index\n        cache = self._cache_get(key)\n        _expected = cache.get(id, f"Key {id} not found in cache; framework files missing. Please run deploy()")\n        return _expected\n\n    def wrap_assert(self, assert_fun, first, *args, **kwargs):\n        key = (self.cache_id(), \'assert\')\n        if not self._cache_contains(key):\n            print("Warning, framework missing", key)\n            self.__class__._cache[key] = {}  # A new dict. We manually insert it because we have to use that the dict is mutable.\n        cache = self._cache_get(key)\n        id = self._assert_cache_index\n        _expected = cache.get(id, f"Key {id} not found in cache; framework files missing. Please run deploy()")\n        if not id in cache:\n            print("Warning, framework missing cache index", key, "id =", id, " - The test will be skipped for now.")\n            if self._setup_answers_mode:\n                _expected = first # Bypass by setting equal to first. This is in case multiple self.assertEqualC\'s are run in a row and have to be set.\n\n        # The order of these calls is important. If the method assert fails, we should still store the correct result in cache.\n        cache[id] = first\n        self._cache_put(key, cache)\n        self._assert_cache_index += 1\n        if not self._setup_answers_mode:\n            assert_fun(first, _expected, *args, **kwargs)\n        else:\n            try:\n                assert_fun(first, _expected, *args, **kwargs)\n            except Exception as e:\n                print("Mumble grumble. Cache function failed during class setup. Most likely due to old cache. Re-run deploy to check it pass.", id)\n                print("> first", first)\n                print("> expected", _expected)\n                print(e)\n\n\n    def assertEqualC(self, first, msg=None):\n        self.wrap_assert(self.assertEqual, first, msg)\n\n    def _shape_equal(self, first, second):\n        a1 = np.asarray(first).squeeze()\n        a2 = np.asarray(second).squeeze()\n        msg = None\n        msg = "" if msg is None else msg\n        if len(msg) > 0:\n            msg += "\\n"\n        self.assertEqual(a1.shape, a2.shape, msg=msg + "Dimensions of input data does not agree.")\n        assert(np.all(np.isinf(a1) == np.isinf(a2)))  # Check infinite part.\n        a1[np.isinf(a1)] = 0\n        a2[np.isinf(a2)] = 0\n        diff = np.abs(a1 - a2)\n        return diff\n\n    def assertLinf(self, first, second=None, tol=1e-5, msg=None):\n        """ Test in the L_infinity norm.\n        :param first:\n        :param second:\n        :param tol:\n        :param msg:\n        :return:\n        """\n        if second is None:\n            return self.wrap_assert(self.assertLinf, first, tol=tol, msg=msg)\n        else:\n            diff = self._shape_equal(first, second)\n            np.testing.assert_allclose(first, second, atol=tol)\n            \n            max_diff = max(diff.flat)\n            if max_diff >= tol:\n                from unittest.util import safe_repr\n                # msg = f\'{safe_repr(first)} != {safe_repr(second)} : Not equal within tolerance {tol}\'\n                # print(msg)\n                # np.testing.assert_almost_equal\n                # import numpy as np\n                print(f"|first - second|_max = {max_diff} > {tol} ")\n                np.testing.assert_almost_equal(first, second)\n                # If the above fail, make sure to throw an error:\n                self.assertFalse(max_diff >= tol, msg=f\'Input arrays are not equal within tolerance {tol}\')\n                # self.assertEqual(first, second, msg=f\'Not equal within tolerance {tol}\')\n\n    def assertL2(self, first, second=None, tol=1e-5, msg=None, relative=False):\n        if second is None:\n            return self.wrap_assert(self.assertL2, first, tol=tol, msg=msg, relative=relative)\n        else:\n            # We first test using numpys build-in testing method to see if one coordinate deviates a great deal.\n            # This gives us better output, and we know that the coordinate wise difference is lower than the norm difference.\n            if not relative:\n                np.testing.assert_allclose(first, second, atol=tol)\n            diff = self._shape_equal(first, second)\n            diff = ( ( np.asarray( diff.flatten() )**2).sum() )**.5\n\n            scale = (2/(np.linalg.norm(np.asarray(first).flat) + np.linalg.norm(np.asarray(second).flat)) ) if relative else 1\n            max_diff = diff*scale\n            if max_diff >= tol:\n                msg = "" if msg is None else msg\n                print(f"|first - second|_2 = {max_diff} > {tol} ")\n                # Deletage to numpy. Let numpy make nicer messages.\n                np.testing.assert_almost_equal(first, second) # This function does not take a msg parameter.\n                # Make sure to throw an error no matter what.\n                self.assertFalse(max_diff >= tol, msg=f\'Input arrays are not equal within tolerance {tol}\')\n                # self.assertEqual(first, second, msg=msg + f"Not equal within tolerance {tol}")\n\n    @classmethod\n    def _cache_file(cls):\n        return os.path.dirname(inspect.getabsfile(cls)) + "/unitgrade_data/" + cls.__name__ + ".pkl"\n\n    @classmethod\n    def _artifact_file_for_setUpClass(cls):\n        file = os.path.join(os.path.dirname(cls._cache_file()), ""+cls.__name__+"-setUpClass.json")\n        print("_artifact_file_for_setUpClass(cls): will return", file, "__class__", cls)\n        # cf = os.path.dirname(inspect.getabsfile(cls)) + "/unitgrade_data/" + cls.__name__\n        return file\n\n    def _artifact_file(self):\n        """ File for the artifacts DB (thread safe). This file is optinal. Note that it is a pupdb database file.\n        Note the file is shared between all sub-questions. """\n        return os.path.join(os.path.dirname(self.__class__._cache_file()), \'-\'.join(self.cache_id()) + ".json")\n\n    def _save_cache(self):\n        # get the class name (i.e. what to save to).\n        cfile = self.__class__._cache_file()\n        if not os.path.isdir(os.path.dirname(cfile)):\n            os.makedirs(os.path.dirname(cfile))\n\n        if hasattr(self.__class__, \'_cache2\'):\n            with open(cfile, \'wb\') as f:\n                pickle.dump(self.__class__._cache2, f)\n\n    # But you can also set cache explicitly.\n    def _load_cache(self):\n        if self._cache is not None:  # Cache already loaded. We will not load it twice.\n            return\n            # raise Exception("Loaded cache which was already set. What is going on?!")\n        cfile = self.__class__._cache_file()\n        if os.path.exists(cfile):\n            try:\n                with open(cfile, \'rb\') as f:\n                    data = pickle.load(f)\n                self.__class__._cache = data\n            except Exception as e:\n                print("Cache file did not exist:", cfile)\n                print(e)\n        else:\n            print("Warning! data file not found", cfile)\n\n    def _get_coverage_files(self):\n        key = (self.cache_id(), \'coverage\')\n        # CC = None\n        # if self._cache_contains(key):\n        return self._cache_get(key, []) # Anything wrong with the empty list?\n        # return CC\n\n    def _get_hints(self):\n        """\n            This code is run when the test is set up to generate the hints and store them in an artifact file. It may be beneficial to simple compute them beforehand\n            and store them in the local unitgrade pickle file. This code is therefore expected to superceede the alterative code later.\n        """\n        hints = []\n        # print("Getting hint")\n        key = (self.cache_id(), \'coverage\')\n        if self._cache_contains(key):\n            CC = self._cache_get(key)\n            # cl, m = self.cache_id()\n            # print("Getting hint using", CC)\n            # Insert newline to get better formatting.\n            # gprint(\n            #     f"\\n> An error occured during the test: {cl}.{m}. The following files/methods has code in them you are supposed to edit and may therefore be the cause of the problem:")\n            for file in CC:\n                rec = CC[file]\n                # gprint(f">   * {file}")\n                for l in rec:\n                    _, comments = CC[file][l]\n                    hint = get_hints(comments)\n\n                    if hint != None:\n                        hints.append((hint, file, l))\n\n        doc = self._testMethodDoc\n        # print("doc", doc)\n        if doc is not None:\n            hint = get_hints(self._testMethodDoc)\n            if hint is not None:\n                hints = [(hint, None, self.cache_id()[1])] + hints\n\n        return hints\n\n    def _feedErrorsToResult(self, result, errors):\n        """ Use this to show hints on test failure.\n        It feeds error to the result -- so if there are errors, they will crop up here\n        """\n        self._error_fed_during_run = errors.copy() # import to copy the error list.\n\n        # result._test._error_fed_during_run = errors.copy()\n\n        if not isinstance(result, UTextResult):\n            er = [e for e, v in errors if v != None]\n            # print("Errors are", errors)\n            if len(er) > 0:\n                hints = []\n                key = (self.cache_id(), \'coverage\')\n                if self._cache_contains(key):\n                    CC = self._cache_get(key)\n                    cl, m = self.cache_id()\n                    # Insert newline to get better formatting.\n                    gprint(f"\\n> An error occured during the test: {cl}.{m}. The following files/methods has code in them you are supposed to edit and may therefore be the cause of the problem:")\n                    for file in CC:\n                        rec = CC[file]\n                        gprint(f">   * {file}")\n                        for l in rec:\n                            _, comments = CC[file][l]\n                            hint = get_hints(comments)\n\n                            if hint != None:\n                                hints.append((hint, file, l) )\n                            gprint(f">      - {l}")\n\n                er = er[0]\n\n                doc = er._testMethodDoc\n                # print("doc", doc)\n                if doc is not None:\n                    hint = get_hints(er._testMethodDoc)\n                    if hint is not None:\n                        hints = [(hint, None, self.cache_id()[1] )] + hints\n                if len(hints) > 0:\n                    # print(hints)\n                    for hint, file, method in hints:\n                        s = (f"\'{method.strip()}\'" if method is not None else "")\n                        if method is not None and file is not None:\n                            s += " in "\n                        try:\n                            s += (file.strip() if file is not None else "")\n                            gprint(">")\n                            gprint("> Hints (from " + s + ")")\n                            gprint(textwrap.indent(hint, ">   "))\n                        except Exception as e:\n                            print("Bad stuff in hints. ")\n                            print(hints)\n        # result._last_errors = errors\n        super()._feedErrorsToResult(result, errors)\n        b = 234\n\n    def startTestRun(self):\n        super().startTestRun()\n\nclass Required:\n    pass\n\nclass ParticipationTest(UTestCase,Required):\n    max_group_size = None\n    students_in_group = None\n    workload_assignment = {\'Question 1\': [1, 0, 0]}\n\n    def test_students(self):\n        pass\n\n    def test_workload(self):\n        pass\n\n# 817, 705\nclass NotebookTestCase(UTestCase):\n    notebook = None\n    _nb = None\n    @classmethod\n    def setUpClass(cls) -> None:\n        with Capturing():\n            cls._nb = importnb.Notebook.load(cls.notebook)\n\n    @property\n    def nb(self):\n        return self.__class__._nb\n # 870.\n\nimport hashlib\nimport io\nimport tokenize\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\nimport inspect\nimport os\nimport argparse\nimport time\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\',  action="store_true",  help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\',  action="store_true",  help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\',  action="store_true",  help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\',  action="store_true",  help=\'Automatically pass all tests. Useful when debugging.\')\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False,\n                            show_tol_err=False, show_privisional=True, noprogress=None,\n                            generate_artifacts=True):\n    args = parser.parse_args()\n    if noprogress is None:\n        noprogress = args.noprogress\n\n    if question is None and args.q is not None:\n        question = args.q\n        if "." in question:\n            question, qitem = [int(v) for v in question.split(".")]\n        else:\n            question = int(question)\n\n    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n    if unmute is None:\n        unmute = args.unmute\n    if passall is None:\n        passall = args.passall\n\n    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute and not noprogress, qitem=qitem,\n                                          verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n                                          show_tol_err=show_tol_err,\n                                          generate_artifacts=generate_artifacts)\n\n\n    if question is None and show_privisional:\n        print("Provisional evaluation")\n        tabulate(table_data)\n        table = table_data\n        print(tabulate(table))\n        print(" ")\n\n    fr = inspect.getouterframes(inspect.currentframe())[1].filename\n    gfile = os.path.basename(fr)[:-3] + "_grade.py"\n    if os.path.exists(gfile):\n        print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n        print(">>>", gfile)\n        print("In the same manner as you ran this file.")\n\n\n    return results\n\n\ndef upack(q):\n    # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n    h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n    h = np.asarray(h)\n    return h[:,0], h[:,1], h[:,2],\n\nclass SequentialTestLoader(unittest.TestLoader):\n    def getTestCaseNames(self, testCaseClass):\n        test_names = super().getTestCaseNames(testCaseClass)\n        # testcase_methods = list(testCaseClass.__dict__.keys())\n        ls = []\n        for C in testCaseClass.mro():\n            if issubclass(C, unittest.TestCase):\n                ls = list(C.__dict__.keys()) + ls\n        testcase_methods = ls\n        test_names.sort(key=testcase_methods.index)\n        return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n                    show_progress_bar=True,\n                    show_tol_err=False,\n                    generate_artifacts=True, # Generate the artifact .json files. These are exclusively used by the dashboard.\n                    big_header=True):\n\n    now = datetime.now()\n    if big_header:\n        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n        b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n    else:\n        b = "Unitgrade"\n    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n    print(b + " v" + __version__ + ", started: " + dt_string+ "\\n")\n    # print("Started: " + dt_string)\n    report._check_remote_versions() # Check (if report.url is present) that remote files exist and are in sync.\n    s = report.title\n    if hasattr(report, "version") and report.version is not None:\n        s += f" version {report.version}"\n    print(s, "(use --help for options)" if show_help_flag else "")\n    # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n    table_data = []\n    t_start = time.time()\n    score = {}\n    loader = SequentialTestLoader()\n\n    for n, (q, w) in enumerate(report.questions):\n        q._generate_artifacts = generate_artifacts  # Set whether artifact .json files will be generated.\n        if question is not None and n+1 != question:\n            continue\n        suite = loader.loadTestsFromTestCase(q)\n        qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n        if not report.abbreviate_questions:\n            q_title_print = "Question %i: %s"%(n+1, qtitle)\n        else:\n            q_title_print = "q%i) %s" % (n + 1, qtitle)\n\n        print(q_title_print, end="")\n        q.possible = 0\n        q.obtained = 0\n        # q_ = {} # Gather score in this class.\n        UTextResult.q_title_print = q_title_print # Hacky\n        UTextResult.show_progress_bar = show_progress_bar # Hacky.\n        UTextResult.number = n\n        UTextResult.nL = report.nL\n        UTextResult.unmute = unmute # Hacky as well.\n        UTextResult.setUpClass_time = q._cache.get(((q.__name__, \'setUpClass\'), \'time\'), 3) if hasattr(q, \'_cache\') and q._cache is not None else 3\n\n\n        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n        details = {}\n        for s, msg in res.successes + res.failures + res.errors:\n            # from unittest.suite import _ErrorHolder\n            # from unittest import _Err\n            # if isinstance(s, _ErrorHolder)\n            if hasattr(s, \'_testMethodName\'):\n                key = (q.__name__, s._testMethodName)\n            else:\n                # In case s is an _ErrorHolder (unittest.suite)\n                key = (q.__name__, s.id())\n            # key = (q.__name__, s._testMethodName) # cannot use the cache_id method bc. it is not compatible with plain unittest.\n\n            detail = {}\n            if (s,msg) in res.successes:\n                detail[\'status\'] = "pass"\n            elif (s,msg) in res.failures:\n                detail[\'status\'] = \'fail\'\n            elif (s,msg) in res.errors:\n                detail[\'status\'] = \'error\'\n            else:\n                raise Exception("Status not known.")\n\n            # s can be an \'_ErrorHolder\' object, which has no title.\n            nice_title = s.title if hasattr(s, \'title\') else \'s has no title; unitgrade/evaluate.py line 181\'\n            detail = {**detail, **msg, \'nice_title\': nice_title} #[\'message\'] = msg\n            details[key] = detail\n\n        # q_[s._testMethodName] = ("pass", None)\n        # for (s,msg) in res.failures:\n        #     q_[s._testMethodName] = ("fail", msg)\n        # for (s,msg) in res.errors:\n        #     q_[s._testMethodName] = ("error", msg)\n        # res.successes[0]._get_outcome()\n\n        possible = res.testsRun\n        obtained = len(res.successes)\n\n        # assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun\n\n        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n        score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': details, \'title\': qtitle, \'name\': q.__name__,\n                   }\n        q.obtained = obtained\n        q.possible = possible\n        # print(q._cache)\n        # print(q._covcache)\n        s1 = f" * q{n+1})   Total"\n        s2 = f" {q.obtained}/{w}"\n        print(s1 + ("."* (report.nL-len(s1)-len(s2) )) + s2 )\n        print(" ")\n        table_data.append([f"q{n+1}) Total", f"{q.obtained}/{w}"])\n\n    ws, possible, obtained = upack(score)\n    possible = int( msum(possible) )\n    obtained = int( msum(obtained) ) # Cast to python int\n    report.possible = possible\n    report.obtained = obtained\n    now = datetime.now()\n    dt_string = now.strftime("%H:%M:%S")\n\n    dt = int(time.time()-t_start)\n    minutes = dt//60\n    seconds = dt - minutes*60\n    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n    dprint(first = "Total points at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")",\n           last=""+str(report.obtained)+"/"+str(report.possible), nL = report.nL)\n\n    # print(f"Completed at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +"). Total")\n\n    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n    results = {\'total\': (obtained, possible), \'details\': score}\n    return results, table_data\n\n\ndef python_code_str_id(python_code, strip_comments_and_docstring=True):\n    s = python_code\n\n    if strip_comments_and_docstring:\n        try:\n            s = remove_comments_and_docstrings(s)\n        except Exception as e:\n            print("--"*10)\n            print(python_code)\n            print(e)\n\n    s = "".join([c.strip() for c in s.split()])\n    hash_object = hashlib.blake2b(s.encode())\n    return hash_object.hexdigest()\n\n\ndef file_id(file, strip_comments_and_docstring=True):\n    with open(file, \'r\') as f:\n        # s = f.read()\n        return python_code_str_id(f.read())\n\n\ndef remove_comments_and_docstrings(source):\n    """\n    Returns \'source\' minus comments and docstrings.\n    """\n    io_obj = io.StringIO(source)\n    out = ""\n    prev_toktype = tokenize.INDENT\n    last_lineno = -1\n    last_col = 0\n    for tok in tokenize.generate_tokens(io_obj.readline):\n        token_type = tok[0]\n        token_string = tok[1]\n        start_line, start_col = tok[2]\n        end_line, end_col = tok[3]\n        ltext = tok[4]\n        # The following two conditionals preserve indentation.\n        # This is necessary because we\'re not using tokenize.untokenize()\n        # (because it spits out code with copious amounts of oddly-placed\n        # whitespace).\n        if start_line > last_lineno:\n            last_col = 0\n        if start_col > last_col:\n            out += (" " * (start_col - last_col))\n        # Remove comments:\n        if token_type == tokenize.COMMENT:\n            pass\n        # This series of conditionals removes docstrings:\n        elif token_type == tokenize.STRING:\n            if prev_toktype != tokenize.INDENT:\n        # This is likely a docstring; double-check we\'re not inside an operator:\n                if prev_toktype != tokenize.NEWLINE:\n                    # Note regarding NEWLINE vs NL: The tokenize module\n                    # differentiates between newlines that start a new statement\n                    # and newlines inside of operators such as parens, brackes,\n                    # and curly braces.  Newlines inside of operators are\n                    # NEWLINE and newlines that start new code are NL.\n                    # Catch whole-module docstrings:\n                    if start_col > 0:\n                        # Unlabelled indentation means we\'re inside an operator\n                        out += token_string\n                    # Note regarding the INDENT token: The tokenize module does\n                    # not label indentation inside of an operator (parens,\n                    # brackets, and curly braces) as actual indentation.\n                    # For example:\n                    # def foo():\n                    #     "The spaces before this docstring are tokenize.INDENT"\n                    #     test = [\n                    #         "The spaces before this string do not get a token"\n                    #     ]\n        else:\n            out += token_string\n        prev_toktype = token_type\n        last_col = end_col\n        last_lineno = end_line\n    return out\n\nimport textwrap\nimport bz2\nimport pickle\nimport os\nimport zipfile\nimport io\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n    with getattr(bz2, \'open\')(token, "wt") as f:\n        f.write(json_str)\n\ndef gather_imports(imp):\n    resources = {}\n    m = imp\n    f = m.__file__\n    if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'):\n        top_package = os.path.dirname(m.__file__)\n        module_import = True\n    else:\n        im = __import__(m.__name__.split(\'.\')[0])\n        if isinstance(im, list):\n            print("im is a list")\n            print(im)\n        # the __path__ attribute *may* be a string in some cases. I had to fix this.\n        print("path.:",  __import__(m.__name__.split(\'.\')[0]).__path__)\n        # top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n        top_package = __import__(m.__name__.split(\'.\')[0]).__path__[0]\n        module_import = False\n\n    found_hashes = {}\n    # pycode = {}\n    resources[\'pycode\'] = {}\n    zip_buffer = io.BytesIO()\n    with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n        for root, dirs, files in os.walk(top_package):\n            for file in files:\n                if file.endswith(".py"):\n                    fpath = os.path.join(root, file)\n                    v = os.path.relpath(fpath, os.path.dirname(top_package) if not module_import else top_package)\n                    zip.write(fpath, v)\n                    if not fpath.endswith("_grade.py"): # Exclude grade files.\n                        with open(fpath, \'r\') as f:\n                            s = f.read()\n                        found_hashes[v] = python_code_str_id(s)\n                        resources[\'pycode\'][v] = s\n\n    resources[\'zipfile\'] = zip_buffer.getvalue()\n    resources[\'top_package\'] = top_package\n    resources[\'module_import\'] = module_import\n    resources[\'blake2b_file_hashes\'] = found_hashes\n    return resources, top_package\n\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\',  action="store_true",  help=\'Show Autolab results\')\n\ndef gather_report_source_include(report):\n    sources = {}\n    # print("")\n    # if not args.autolab:\n    if len(report.individual_imports) > 0:\n        print("By uploading the .token file, you verify the files:")\n        for m in report.individual_imports:\n            print(">", m.__file__)\n        print("Are created/modified individually by you in agreement with DTUs exam rules")\n        report.pack_imports += report.individual_imports\n\n    if len(report.pack_imports) > 0:\n        print("Including files in upload...")\n        for k, m in enumerate(report.pack_imports):\n            nimp, top_package = gather_imports(m)\n            _, report_relative_location, module_import = report._import_base_relative()\n\n            nimp[\'report_relative_location\'] = report_relative_location\n            nimp[\'report_module_specification\'] = module_import\n            nimp[\'name\'] = m.__name__\n            sources[k] = nimp\n            print(f" * {m.__name__}")\n    return sources\n\ndef gather_upload_to_campusnet(report, output_dir=None, token_include_plaintext_source=False):\n    # n = report.nL\n    args = parser.parse_args()\n    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n                                          show_progress_bar=not args.noprogress,\n                                          big_header=not args.autolab,\n                                          generate_artifacts=False,\n                                          )\n    print("")\n    sources = {}\n    if not args.autolab:\n        results[\'sources\'] = sources = gather_report_source_include(report)\n\n    token_plain = """\n# This file contains your results. Do not edit its content. Simply upload it as it is. """\n\n    s_include = [token_plain]\n    known_hashes = []\n    cov_files = []\n    use_coverage = True\n    if report._config is not None:\n        known_hashes = report._config[\'blake2b_file_hashes\']\n        for Q, _ in report.questions:\n            use_coverage = use_coverage and isinstance(Q, UTestCase)\n            for key in Q._cache:\n                if len(key) >= 2 and key[1] == "coverage":\n                    for f in Q._cache[key]:\n                        cov_files.append(f)\n\n    for s in sources.values():\n        for f_rel, hash in s[\'blake2b_file_hashes\'].items():\n            if hash in known_hashes and f_rel not in cov_files and use_coverage:\n                print("Skipping", f_rel)\n            else:\n                if token_include_plaintext_source:\n                    s_include.append("#"*3 +" Content of " + f_rel +" " + "#"*3)\n                    s_include.append("")\n                    s_include.append(s[\'pycode\'][f_rel])\n                    s_include.append("")\n\n    if output_dir is None:\n        output_dir = os.getcwd()\n\n    payload_out_base = report.__class__.__name__ + "_handin"\n\n    obtain, possible = results[\'total\']\n    vstring = f"_v{report.version}" if report.version is not None else ""\n    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n    token = os.path.normpath(os.path.join(output_dir, token))\n\n    save_token(results, "\\n".join(s_include), token)\n\n    if not args.autolab:\n        print("> Testing token file integrity...", sep="")\n        load_token(token)\n        print("Done!")\n        print(" ")\n        print("To get credit for your results, please upload the single unmodified file: ")\n        print(">", token)\n\n\ndef save_token(dictionary, plain_text, file_out):\n    if plain_text is None:\n        plain_text = ""\n    if len(plain_text) == 0:\n        plain_text = "Start token file"\n    plain_text = plain_text.strip()\n    b, b_hash = dict2picklestring(dictionary)\n    b_l1 = len(b)\n    b = "."+b+"."\n    b = "\\n".join( textwrap.wrap(b, 180))\n\n    out = [plain_text, token_sep, f"{b_hash} {b_l1}", token_sep, b]\n    with open(file_out, \'w\') as f:\n        f.write("\\n".join(out))\n\n\n\n\ndef source_instantiate(name, report1_source, payload):\n    # print("Executing sources", report1_source)\n    eval("exec")(report1_source, globals())\n    # print("Loaind gpayload..")\n    pl = pickle.loads(bytes.fromhex(payload))\n    report = eval(name)(payload=pl, strict=True)\n    return report\n\n\n__version__ = "0.1.30.2"\n\nfrom cs108.homework1 import add, reverse_list, linear_regression_weights, linear_predict, foo\nimport time\nimport numpy as np\nimport pickle\nimport os\n# from unitgrade.framework import dash\n\ndef mk_bad():\n    with open(os.path.dirname(__file__)+"/db.pkl", \'wb\') as f:\n        d = {\'x1\': 100, \'x2\': 300}\n        pickle.dump(d, f)\n\ndef mk_ok():\n    with open(os.path.dirname(__file__)+"/db.pkl", \'wb\') as f:\n        d = {\'x1\': 1, \'x2\': 2}\n        pickle.dump(d, f)\n\nclass Numpy(UTestCase):\n    z = 234\n\n    # def __getattr__(self, item):\n    #     print("hi there ", item)\n    #     return super().__getattr__(item)\n    #\n    # def __getattribute__(self, item):\n    #     print("oh hello sexy. ", item)\n    #     return super().__getattribute__(item)\n\n    @classmethod_dashboard\n    def setUpClass(cls) -> None:\n        print("Dum di dai, I am running some setup code here.")\n        for i in range(10):\n            print("Hello world", i)\n        print("Set up.") # must be handled seperately.\n        # assert False\n\n    # @cache\n    # def make_primes(self, n):\n    #     return primes(n)\n\n    # def setUp(self) -> None:\n    #     print("We are doing the setup thing.")\n\n    def test_bad(self):\n        """\n        Hints:\n            * Remember to properly de-indent your code.\n            * Do more stuff which works.\n        """\n        # raise Exception("This ended poorly")\n        # print("Here we go")\n        # return\n        # self.assertEqual(1, 1)\n        with open(os.path.dirname(__file__)+"/db.pkl", \'rb\') as f:\n            d = pickle.load(f)\n        # print(d)\n        # assert False\n        # for i in range(10):\n        from tqdm import tqdm\n        for i in tqdm(range(100)):\n            # print("The current number is", i)\n            time.sleep(.01)\n        self.assertEqual(1, d[\'x1\'])\n        for b in range(10):\n            self.assertEqualC(add(3, b))\n\n\n    def test_weights(self):\n        """\n            Hints:\n            * Try harder!\n            * Check the chapter on linear regression.\n        """\n        n = 3\n        m = 2\n        np.random.seed(5)\n        # from numpy import asdfaskdfj\n        # X = np.random.randn(n, m)\n        # y = np.random.randn(n)\n        foo()\n        # assert 2 == 3\n        # raise Exception("Bad exit")\n        # self.assertEqual(2, np.random.randint(1000))\n        # self.assertEqual(2, np.random.randint(1000))\n        # self.assertL2(linear_regression_weights(X, y), msg="the message")\n        self.assertEqual(1, 1)\n        # self.assertEqual(1,2)\n        return "THE RESULT OF THE TEST"\n\n\nclass AnotherTest(UTestCase):\n    def test_more(self):\n        self.assertEqual(2,2)\n\n    def test_even_more(self):\n        self.assertEqual(2,2)\n\nimport cs108\nclass Report2(Report):\n    title = "CS 101 Report 2"\n    questions = [\n        (Numpy, 10), (AnotherTest, 20)\n        ]\n    pack_imports = [cs108]'
+report1_payload = '8004954f040000000000007d94288c054e756d7079947d942868018c0a7365745570436c6173739486948c0474696d65948694473f3368000000000068018c08746573745f6261649486948c057469746c6594869468076801680786948c066173736572749486947d94284b004b034b014b044b024b054b034b064b044b074b054b084b064b094b074b0a4b084b0b4b094b0c7568016807869468058694473ff08006400000006801680786948c08636f7665726167659486947d948c1263733130382f686f6d65776f726b312e7079947d948c0e6465662061646428612c62293a20944b128ca12020202022222220476976656e2074776f206e756d626572732060616020616e642060626020746869732066756e6374696f6e2073686f756c642073696d706c792072657475726e2074686569722073756d3a0a202020203e2061646428612c6229203d20612b620a2020202048696e74733a0a20202020202020202a2052656d656d6265722062617369632061726974686d6574696373210a20202020222222948694737368018c0c746573745f7765696768747394869468098694681a6801681a8694680c86947d946801681a869468058694473f4b5800000000006801681a8694681286947d948c1263733130382f686f6d65776f726b312e7079947d94288c0b64656620666f6f28293a20944b168c162020202022222220436f6d6d656e742e2020202222229486948c0b6465662062617228293a20944b198c009486947573758c0b416e6f7468657254657374947d9428682d6803869468058694473f23d80000000000682d8c09746573745f6d6f7265948694680c86947d94682d6831869468058694473f21280000000000682d8c0e746573745f6576656e5f6d6f7265948694680c86947d94682d6837869468058694473f1a800000000000758c06636f6e666967947d948c13626c616b6532625f66696c655f686173686573945d94288c806362363363336235383635306636313037643763663138646136303635666135373835666261626564643135316639653761633335313139323635623039393838623266653335373632303961333932616133656236633134636131316439646335393937343831633531373863313533393665656662313539653163373536948c803434656331613338643134373639626433653234323663386232366539303830356336313361386161653266333966663665633433363133666562363465303739373435323062306536353134353063303637623763633637636631366134313835653736346334383331373763333335303063626563626362336234646466948c803638306336353638323633623832303737313365616434306539323663643265363835336130613936353861386338343738393564363633643730643262343666616163333336396133636564366239623964303436346563316366656465326235306265376432626636313432313638383936663332306338353232313066946573752e'
 name="Report2"
 
 report = source_instantiate(name, report1_source, report1_payload)
diff --git a/devel/example_devel/instructor/cs108/unitgrade_data/AnotherTest.pkl b/devel/example_devel/instructor/cs108/unitgrade_data/AnotherTest.pkl
index 43a2319d3d9445b0cf1259dfc350ec87a82aecba..eb76b6799fb0255ed459c1f84ad96126dc0b79f2 100644
Binary files a/devel/example_devel/instructor/cs108/unitgrade_data/AnotherTest.pkl and b/devel/example_devel/instructor/cs108/unitgrade_data/AnotherTest.pkl differ
diff --git a/devel/example_devel/instructor/cs108/unitgrade_data/Numpy.pkl b/devel/example_devel/instructor/cs108/unitgrade_data/Numpy.pkl
index 5ab625a286557ef448281e4a58d090bbd744fc8c..edbcd7bca6f04e6e156c6fc48c0a6c3c1d651207 100644
Binary files a/devel/example_devel/instructor/cs108/unitgrade_data/Numpy.pkl and b/devel/example_devel/instructor/cs108/unitgrade_data/Numpy.pkl differ
diff --git a/devel/example_devel/instructor/cs108/unitgrade_data/cache.db b/devel/example_devel/instructor/cs108/unitgrade_data/cache.db
deleted file mode 100644
index a50dc2f94a42cb35bee1de7c32d1bd2eb5b48c86..0000000000000000000000000000000000000000
Binary files a/devel/example_devel/instructor/cs108/unitgrade_data/cache.db and /dev/null differ
diff --git a/devel/example_devel/students/cs108/homework1.py b/devel/example_devel/students/cs108/homework1.py
index 172a445a552511bf84f9b017989bb1ff13683da4..e2215d1c45eeef2887a9fbcdd085ebb50df5e072 100644
--- a/devel/example_devel/students/cs108/homework1.py
+++ b/devel/example_devel/students/cs108/homework1.py
@@ -1,6 +1,6 @@
 import numpy as np
 
-
+a = 245
 def reverse_list(mylist): 
     """
     Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
diff --git a/devel/example_devel/students/cs108/report2_grade.py b/devel/example_devel/students/cs108/report2_grade.py
deleted file mode 100644
index 4cdff0e86abcb586c1a413fa3116488ae68ecdbf..0000000000000000000000000000000000000000
--- a/devel/example_devel/students/cs108/report2_grade.py
+++ /dev/null
@@ -1,3 +0,0 @@
-''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
-import bz2, base64
-exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/devel/example_devel/students/cs108/report_devel.py b/devel/example_devel/students/cs108/report_devel.py
index b80c79585d4ecc5b169b122d4e4d300ea9cebf68..fc8a43a6290a84992741a64bbb84f58e796b4da3 100644
--- a/devel/example_devel/students/cs108/report_devel.py
+++ b/devel/example_devel/students/cs108/report_devel.py
@@ -42,6 +42,9 @@ class Numpy(UTestCase):
     # def make_primes(self, n):
     #     return primes(n)
 
+    # def setUp(self) -> None:
+    #     print("We are doing the setup thing.")
+
     def test_bad(self):
         """
         Hints:
@@ -106,7 +109,6 @@ class Report2(Report):
 
 if __name__ == "__main__":
     # import texttestrunner
-    import unittest
-    unittest.main()
-
-    # evaluate_report_student(Report2())
+    # import unittest
+    # unittest.main()
+    evaluate_report_student(Report2())
diff --git a/devel/example_devel/students/cs108/report_devel_grade.py b/devel/example_devel/students/cs108/report_devel_grade.py
index 587517f9c9590740b26659cbecaa6ea18291e775..e00416ef08e2f8fd7d430525610b77bfc79c3fa9 100644
--- a/devel/example_devel/students/cs108/report_devel_grade.py
+++ b/devel/example_devel/students/cs108/report_devel_grade.py
@@ -177,8 +177,9 @@ def evaluate_report(report, question=None, qitem=None, passall=False, verbose=Fa
             else:
                 raise Exception("Status not known.")
 
-            nice_title = s.title
-            detail = {**detail, **msg, 'nice_title': nice_title}#['message'] = msg
+            # s can be an '_ErrorHolder' object, which has no title.
+            nice_title = s.title if hasattr(s, 'title') else 's has no title; unitgrade/evaluate.py line 181'
+            detail = {**detail, **msg, 'nice_title': nice_title} #['message'] = msg
             details[key] = detail
 
         # q_[s._testMethodName] = ("pass", None)
@@ -488,8 +489,8 @@ def source_instantiate(name, report1_source, payload):
 
 
 
-report1_source = '# from unitgrade import hide\n# from unitgrade import utils\n# import os\n# import lzma\n# import pickle\n\n# DONT\'t import stuff here since install script requires __version__\n\n# def cache_write(object, file_name, verbose=True):\n#     # raise Exception("bad")\n#     # import compress_pickle\n#     dn = os.path.dirname(file_name)\n#     if not os.path.exists(dn):\n#         os.mkdir(dn)\n#     if verbose: print("Writing cache...", file_name)\n#     with lzma.open(file_name, \'wb\', ) as f:\n#         pickle.dump(object, f)\n#     if verbose: print("Done!")\n#\n#\n# def cache_exists(file_name):\n#     # file_name = cn_(file_name) if cache_prefix else file_name\n#     return os.path.exists(file_name)\n#\n#\n# def cache_read(file_name):\n#     # import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n#     # file_name = cn_(file_name) if cache_prefix else file_name\n#     if os.path.exists(file_name):\n#         try:\n#             with lzma.open(file_name, \'rb\') as f:\n#                 return pickle.load(f)\n#         except Exception as e:\n#             print("Tried to load a bad pickle file at", file_name)\n#             print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n#             print(e)\n#             # return pickle.load(f)\n#     else:\n#         return None\n\n\n\nimport re\nimport sys\nimport threading\nimport time\nimport lzma\nimport hashlib\nimport pickle\nimport base64\nfrom collections import namedtuple\nfrom io import StringIO\nimport numpy as np\nimport tqdm\nfrom colorama import Fore\nfrom functools import _make_key\n\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\n\ndef gprint(s):\n    print(f"{Fore.LIGHTGREEN_EX}{s}")\n\n\nmyround = lambda x: np.round(x)  # required for obfuscation.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\n\n"""\nClean up the various output-related helper classes.\n"""\nclass Logger(object):\n    def __init__(self, buffer, write_to_stdout=True):\n        # assert False\n        self.terminal = sys.stdout\n        self.write_to_stdout = write_to_stdout\n        self.log = buffer\n\n    def write(self, message):\n        if self.write_to_stdout:\n            self.terminal.write(message)\n        self.log.write(message)\n\n    def flush(self):\n        # this flush method is needed for python 3 compatibility.\n        pass\n\n\nclass Capturing(list):\n    def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n        self._stdout = stdout\n        self.unmute = unmute\n        super().__init__(*args, **kwargs)\n\n    def __enter__(self, capture_errors=True):  # don\'t put arguments here.\n        self._stdout = sys.stdout if self._stdout == None else self._stdout\n        self._stringio = StringIO()\n        if self.unmute:\n            sys.stdout = Logger(self._stringio)\n        else:\n            sys.stdout = self._stringio\n\n        if capture_errors:\n            self._sterr = sys.stderr\n            sys.sterr = StringIO()  # memory hole it\n        self.capture_errors = capture_errors\n        return self\n\n    def __exit__(self, *args):\n        self.extend(self._stringio.getvalue().splitlines())\n        del self._stringio  # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n\nclass Capturing2(Capturing):\n    def __exit__(self, *args):\n        lines = self._stringio.getvalue().splitlines()\n        txt = "\\n".join(lines)\n        numbers = extract_numbers(rm_progress_bar(txt))\n        self.extend(lines)\n        del self._stringio  # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n        self.output = txt\n        self.numbers = numbers\n\n\ndef rm_progress_bar(txt):\n    # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n    nlines = []\n    for l in txt.splitlines():\n        pct = l.find("%")\n        ql = False\n        if pct > 0:\n            i = l.find("|", pct + 1)\n            if i > 0 and l.find("|", i + 1) > 0:\n                ql = True\n        if not ql:\n            nlines.append(l)\n    return "\\n".join(nlines)\n\n\nclass ActiveProgress():\n    def __init__(self, t, start=True, title="my progress bar", show_progress_bar=True, file=None, mute_stdout=False):\n        if file == None:\n            file = sys.stdout\n        self.file = file\n        self.mute_stdout = mute_stdout\n        self._running = False\n        self.title = title\n        self.dt = 0.025\n        self.n = max(1, int(np.round(t / self.dt)))\n        self.show_progress_bar = show_progress_bar\n        self.pbar = None\n\n        if start:\n            self.start()\n\n    def start(self):\n        if self.mute_stdout:\n            import io\n            # from unitgrade.utils import Logger\n            self._stdout = sys.stdout\n            sys.stdout = Logger(io.StringIO(), write_to_stdout=False)\n\n        self._running = True\n        if self.show_progress_bar:\n            self.thread = threading.Thread(target=self.run)\n            self.thread.start()\n        self.time_started = time.time()\n\n    def terminate(self):\n        if not self._running:\n            print("Stopping a progress bar which is not running (class unitgrade.utils.ActiveProgress")\n            pass\n            # raise Exception("Stopping a stopped progress bar. ")\n        self._running = False\n        if self.show_progress_bar:\n            self.thread.join()\n        if self.pbar is not None:\n            self.pbar.update(1)\n            self.pbar.close()\n            self.pbar = None\n\n        self.file.flush()\n\n        if self.mute_stdout:\n            import io\n            # from unitgrade.utils import Logger\n            sys.stdout = self._stdout #= sys.stdout\n\n            # sys.stdout = Logger(io.StringIO(), write_to_stdout=False)\n\n        return time.time() - self.time_started\n\n    def run(self):\n        self.pbar = tqdm.tqdm(total=self.n, file=self.file, position=0, leave=False, desc=self.title, ncols=100,\n                              bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')\n        t_ = time.time()\n        for _ in range(self.n - 1):  # Don\'t terminate completely; leave bar at 99% done until terminate.\n            if not self._running:\n                self.pbar.close()\n                self.pbar = None\n                break\n            tc = time.time()\n            tic = max(0, self.dt - (tc - t_))\n            if tic > 0:\n                time.sleep(tic)\n            t_ = time.time()\n            self.pbar.update(1)\n\n\ndef dprint(first, last, nL, extra = "", file=None, dotsym=\'.\', color=\'white\'):\n    if file == None:\n        file = sys.stdout\n    dot_parts = (dotsym * max(0, nL - len(last) - len(first)))\n    print(first + dot_parts, end="", file=file)\n    last += extra\n    print(last, file=file)\n\n\ndef hide(func):\n    return func\n\n\ndef makeRegisteringDecorator(foreignDecorator):\n    """\n        Returns a copy of foreignDecorator, which is identical in every\n        way(*), except also appends a .decorator property to the callable it\n        spits out.\n    """\n\n    def newDecorator(func):\n        # Call to newDecorator(method)\n        # Exactly like old decorator, but output keeps track of what decorated it\n        R = foreignDecorator(func)  # apply foreignDecorator, like call to foreignDecorator(method) would have done\n        R.decorator = newDecorator  # keep track of decorator\n        # R.original = func         # might as well keep track of everything!\n        return R\n\n    newDecorator.__name__ = foreignDecorator.__name__\n    newDecorator.__doc__ = foreignDecorator.__doc__\n    return newDecorator\n\n\nhide = makeRegisteringDecorator(hide)\n\n\ndef extract_numbers(txt):\n    numeric_const_pattern = r\'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n    rx = re.compile(numeric_const_pattern, re.VERBOSE)\n    all = rx.findall(txt)\n    all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n    if len(all) > 500:\n        print(txt)\n        raise Exception("unitgrade_v1.unitgrade_v1.py: Warning, too many numbers!", len(all))\n    return all\n\n\ndef cache(foo, typed=False):\n    """ Magic cache wrapper\n    https://github.com/python/cpython/blob/main/Lib/functools.py\n    """\n    maxsize = None\n    def wrapper(self, *args, **kwargs):\n        key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)))\n        # print(self._cache.keys())\n        # for k in self._cache:\n        #     print(k)\n        if not self._cache_contains(key):\n            value = foo(self, *args, **kwargs)\n            self._cache_put(key, value)\n        else:\n            value = self._cache_get(key)\n            # This appears to be required since there are two caches. Otherwise, when deploy method is run twice,\n            # the cache will not be set correctly.\n            self._cache_put(key, value)\n        return value\n\n    return wrapper\n\n\ndef methodsWithDecorator(cls, decorator):\n    """\n        Returns all methods in CLS with DECORATOR as the\n        outermost decorator.\n\n        DECORATOR must be a "registering decorator"; one\n        can make any decorator "registering" via the\n        makeRegisteringDecorator function.\n\n        import inspect\n        ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n        for f in ls:\n            print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n    """\n    for maybeDecorated in cls.__dict__.values():\n        if hasattr(maybeDecorated, \'decorator\'):\n            if maybeDecorated.decorator == decorator:\n                print(maybeDecorated)\n                yield maybeDecorated\n\n\n""" Methods responsible for turning a dictionary into a string that can be pickled or put into a json file. """\ndef dict2picklestring(dd):\n    """\n    Turns a dictionary into a string with some compression.\n\n    :param dd:\n    :return:\n    """\n    b = lzma.compress(pickle.dumps(dd))\n    b_hash = hashlib.blake2b(b).hexdigest()\n    return base64.b64encode(b).decode("utf-8"), b_hash\n\ndef picklestring2dict(picklestr):\n    """ Reverse of the above method: Turns the string back into a dictionary. """\n    b = base64.b64decode(picklestr)\n    hash = hashlib.blake2b(b).hexdigest()\n    dictionary = pickle.loads(lzma.decompress(b))\n    return dictionary, hash\n\ntoken_sep = "-"*70 + " ..ooO0Ooo.. " + "-"*70\ndef load_token(file_in):\n    """ We put this one here to allow loading of token files for the dashboard. """\n    with open(file_in, \'r\') as f:\n        s = f.read()\n    splt = s.split(token_sep)\n    data = splt[-1]\n    info = splt[-2]\n    head = token_sep.join(splt[:-2])\n    plain_text=head.strip()\n    hash, l1 = info.split(" ")\n    data = "".join( data.strip()[1:-1].splitlines() )\n    l1 = int(l1)\n    dictionary, b_hash = picklestring2dict(data)\n    assert len(data) == l1\n    assert b_hash == hash.strip()\n    return dictionary, plain_text\n\nimport io\nimport sys\nimport time\nimport unittest\nfrom unittest.runner import _WritelnDecorator\nimport numpy as np\n\n\nclass UTextResult(unittest.TextTestResult):\n    nL = 80\n    number = -1  # HAcky way to set question number.\n    show_progress_bar = True\n    unmute = False # Whether to redirect stdout.\n    cc = None\n    setUpClass_time = 3 # Estimated time to run setUpClass in TestCase. Must be set externally. See key (("ClassName", "setUpClass"), "time") in _cache.\n\n    def __init__(self, stream, descriptions, verbosity):\n        super().__init__(stream, descriptions, verbosity)\n        self.successes = []\n\n    def printErrors(self) -> None:\n        # TODO: Fix here. probably also needs to flush stdout.\n        self.printErrorList(\'ERROR\', [(test, res[\'stderr\']) for test, res in self.errors])\n        self.printErrorList(\'FAIL\',  [(test, res[\'stderr\']) for test, res in self.failures])\n\n    def addError(self, test, err):\n        super(unittest.TextTestResult, self).addError(test, err)\n        err = self.errors[-1][1]\n        if hasattr(sys.stdout, \'log\'):\n            stdout = sys.stdout.log.readlines()  # Only works because we set sys.stdout to a unitgrade.Logger\n        else:\n            stdout = ""\n        self.errors[-1] = (self.errors[-1][0], {\'return\': None,\n                                \'stderr\': err,\n                                \'stdout\': stdout\n                                })\n\n        if not hasattr(self, \'item_title_print\'):\n            # In case setUpClass() fails with an error the short description may not be set. This will fix that problem.\n            self.item_title_print = test.shortDescription()\n            if self.item_title_print is None:  # In case the short description is not set either...\n                self.item_title_print = test.id()\n\n\n        self.cc_terminate(success=False)\n\n    def addFailure(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        err = self.failures[-1][1]\n        stdout = sys.stdout.log.readlines()  # Only works because we set sys.stdout to a unitgrade.Logger\n        self.failures[-1] = (self.failures[-1][0], {\'return\': None,\n                                \'stderr\': err,\n                                \'stdout\': stdout\n                                })\n        self.cc_terminate(success=False)\n\n\n    def addSuccess(self, test: unittest.case.TestCase) -> None:\n        msg = None\n        stdout = sys.stdout.log.readlines() # Only works because we set sys.stdout to a unitgrade.Logger\n\n        if hasattr(test, \'_get_outcome\'):\n            o = test._get_outcome()\n            if isinstance(o, dict):\n                key = (test.cache_id(), "return")\n                if key in o:\n                    msg = test._get_outcome()[key]\n\n        # print(sys.stdout.readlines())\n        self.successes.append((test, None))  # (test, message) (to be consistent with failures and errors).\n        self.successes[-1] = (self.successes[-1][0], {\'return\': msg,\n                                 \'stdout\': stdout,\n                                 \'stderr\': None})\n\n        self.cc_terminate()\n\n    def cc_terminate(self, success=True):\n        if self.show_progress_bar or True:\n            tsecs = np.round(self.cc.terminate(), 2)\n            self.cc.file.flush()\n            ss = self.item_title_print\n\n            state = "PASS" if success else "FAILED"\n\n            dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n            if self.show_progress_bar or True:\n                print(self.item_title_print + dot_parts, end="", file=self.cc.file)\n            else:\n                print(dot_parts, end="", file=self.cc.file)\n\n            if tsecs >= 0.5:\n                state += " (" + str(tsecs) + " seconds)"\n            print(state, file=self.cc.file)\n\n    def startTest(self, test):\n        name = test.__class__.__name__\n        if self.testsRun == 0 and hasattr(test.__class__, \'_cache2\'): # Disable this if the class is pure unittest.TestCase\n            # This is the first time we are running a test. i.e. we can time the time taken to call setupClass.\n            if test.__class__._cache2 is None:\n                test.__class__._cache2 = {}\n            test.__class__._cache2[((name, \'setUpClass\'), \'time\')] = time.time() - self.t_start\n\n        self.testsRun += 1\n        item_title = test.shortDescription()  # Better for printing (get from cache).\n\n        if item_title == None:\n            # For unittest framework where getDescription may return None.\n            item_title = self.getDescription(test)\n        self.item_title_print = " * q%i.%i) %s" % (UTextResult.number + 1, self.testsRun, item_title)\n        # if self.show_progress_bar or True:\n        estimated_time = test.__class__._cache.get(((name, test._testMethodName), \'time\'), 100) if hasattr(test.__class__, \'_cache\') else 4\n        self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar)\n        # else:\n        #     print(self.item_title_print + (\'.\' * max(0, self.nL - 4 - len(self.item_title_print))), end="")\n        self._test = test\n        # if not self.unmute:\n        self._stdout = sys.stdout # Redundant. remove later.\n        sys.stdout = Logger(io.StringIO(), write_to_stdout=self.unmute)\n\n    def stopTest(self, test):\n        # if not self.unmute:\n        buff = sys.stdout.log\n        sys.stdout = self._stdout # redundant.\n        buff.close()\n        super().stopTest(test)\n\n    def _setupStdout(self):\n        if self._previousTestClass == None:\n            self.t_start = time.time()\n            if hasattr(self.__class__, \'q_title_print\'):\n                q_title_print = self.__class__.q_title_print\n            else:\n                q_title_print = "<unnamed test. See unitgrade.framework.py>"\n\n            cc = ActiveProgress(t=self.setUpClass_time, title=q_title_print, show_progress_bar=self.show_progress_bar, mute_stdout=not self.unmute)\n            self.cc = cc\n\n\n    def _restoreStdout(self):  # Used when setting up the test.\n        if self._previousTestClass is None:\n            q_time = self.cc.terminate()\n            q_time = np.round(q_time, 2)\n            sys.stdout.flush()\n            if self.show_progress_bar:\n                print(self.cc.title, end="")\n            print(" " * max(0, self.nL - len(self.cc.title)) + (" (" + str(q_time) + " seconds)" if q_time >= 0.5 else ""))\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        stream = io.StringIO()\n        super().__init__(*args, stream=stream, **kwargs)\n\n    def _makeResult(self):\n        # stream = self.stream # not you!\n        stream = sys.stdout\n        stream = _WritelnDecorator(stream)\n        return self.resultclass(stream, self.descriptions, self.verbosity)\n\nimport importnb\nimport numpy as np\nimport sys\nimport pickle\nimport os\nimport inspect\nimport colorama\nimport unittest\nimport time\nimport textwrap\nimport urllib.parse\nimport requests\nimport ast\nimport numpy\n\ncolorama.init(autoreset=True)  # auto resets your settings after every output\nnumpy.seterr(all=\'raise\')\n\ndef setup_dir_by_class(C, base_dir):\n    name = C.__class__.__name__\n    return base_dir, name\n\n\n\n\nclass classmethod_dashboard(classmethod):\n    def __init__(self, f):\n        # t = UTestCase()\n        # t._artifact_file_for_setUpClass()\n        def dashboard_wrap(cls: UTestCase):\n            if not cls._generate_artifacts:\n                f(cls)\n                return\n\n            from pupdb.core import PupDB\n            print("Opening as DB:", cls._artifact_file_for_setUpClass())\n            db = PupDB(cls._artifact_file_for_setUpClass())\n\n            db.set(\'run_id\', np.random.randint(1000 * 1000))\n            db.set("state", "running")\n            db.set(\'coverage_files_changed\', None)\n\n            state_ = \'fail\'\n            try:\n                _stdout = sys.stdout\n                _stderr = sys.stderr\n                std_capture = StdCapturing(stdout=sys.stdout, stderr=sys.stderr, db=db, mute=False)\n\n                # Run this unittest and record all of the output.\n                # This is probably where we should hijack the stdout output and save it -- after all, this is where the test is actually run.\n                # sys.stdout = stdout_capture\n                sys.stderr = std_capture.dummy_stderr\n                sys.stdout = std_capture.dummy_stdout\n\n                f(cls)\n                state_ = \'pass\'\n                # result_ = TestCase.run(self, result)\n\n                from werkzeug.debug.tbtools import DebugTraceback, _process_traceback\n                # print(result_._excinfo[0])\n                actual_errors = []\n                # for test, err in self._error_fed_during_run:\n                #     break\n                #     if err is None:\n                #         continue\n                #     else:\n                #         import traceback\n                #         # traceback.print_tb(err[2])\n                #         actual_errors.append(err)\n\n                if len(actual_errors) > 0:\n                    ex, exi, tb = actual_errors[0]\n                    exi.__traceback__ = tb\n                    dbt = DebugTraceback(exi)\n                    sys.stderr.write(dbt.render_traceback_text())\n                    html = dbt.render_traceback_html(include_title="hello world")\n                    db.set(\'wz_stacktrace\', html)\n                    state_ = \'fail\'\n                    # db.set(\'state\', \'fail\')\n                else:\n                    # state\n                    state_ = \'pass\'\n                    # db.set(\'state\', \'pass\')\n            except Exception as e:\n                print("-----------------.///////////////////////////////////////////////////////////////")\n                # db.set("state", "fail")\n                state_ = \'fail\'\n                db.set(\'state\', state_)\n                # ex, exi, tb = actual_errors[0]\n                exi = e\n                # exi.__traceback__ = e.__traceback__\n\n                dbt = DebugTraceback(exi)\n                sys.stderr.write(dbt.render_traceback_text())\n                html = dbt.render_traceback_html(include_title="hello world")\n                db.set(\'wz_stacktrace\', html)\n\n                # import traceback\n                # traceback.print_exc()\n                raise e\n            finally:\n                # state_ = \'fail\'\n                db.set(\'state\', state_)\n                sys.stdout = _stdout\n                sys.stderr = _stderr\n                std_capture.close()\n        super().__init__(dashboard_wrap)\n\nclass Report:\n    title = "report title"\n    abbreviate_questions = False # Should the test items start with \'Question ...\' or just be q1).\n    version = None # A version number of the report (1.0). Used to compare version numbers with online resources.\n    url = None  # Remote location of this problem.\n\n    questions = []\n    pack_imports = []\n    individual_imports = []\n\n    _remote_check_cooldown_seconds = 1  # Seconds between remote check of report.\n    nL = 120  # Maximum line width\n    _config = None  # Private variable. Used when collecting results from student computers. Should only be read/written by teacher and never used for regular evaluation.\n    _setup_mode = False # True if test is being run in setup-mode, i.e. will not fail because of bad configurations, etc.\n\n    @classmethod\n    def reset(cls):\n        for (q, _) in cls.questions:\n            if hasattr(q, \'reset\'):\n                q.reset()\n\n    @classmethod\n    def mfile(clc):\n        return inspect.getfile(clc)\n\n    def _file(self):\n        return inspect.getfile(type(self))\n\n    def _artifact_file(self):\n        """ File for the artifacts DB (thread safe). This file is optinal. Note that it is a pupdb database file.\n        Note the file is shared between all sub-questions. """\n        return os.path.join(os.path.dirname(self._file()), "unitgrade_data/main_config_"+ os.path.basename(self._file()[:-3]) + ".json")\n\n\n    def _is_run_in_grade_mode(self):\n        """ True if this report is being run as part of a grade run. """\n        return self._file().endswith("_grade.py") # Not sure I love this convention.\n\n    def _import_base_relative(self):\n        if hasattr(self.pack_imports[0], \'__path__\'):\n            root_dir = self.pack_imports[0].__path__[0]\n        else:\n            root_dir = self.pack_imports[0].__file__\n\n        root_dir = os.path.dirname(root_dir)\n        relative_path = os.path.relpath(self._file(), root_dir)\n        modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n        relative_path = relative_path.replace("\\\\", "/")\n\n        return root_dir, relative_path, modules\n\n    def __init__(self, strict=False, payload=None):\n        working_directory = os.path.abspath(os.path.dirname(self._file()))\n        self.wdir, self.name = setup_dir_by_class(self, working_directory)\n        # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n        for (q, _) in self.questions:\n            q.nL = self.nL  # Set maximum line length.\n\n        if payload is not None:\n            self.set_payload(payload, strict=strict)\n\n    def main(self, verbosity=1):\n        # Run all tests using standard unittest (nothing fancy).\n        loader = unittest.TestLoader()\n        for q, _ in self.questions:\n            start = time.time()  #\n            suite = loader.loadTestsFromTestCase(q)\n            unittest.TextTestRunner(verbosity=verbosity).run(suite)\n            total = time.time() - start\n            q.time = total\n\n    def _setup_answers(self, with_coverage=False, verbose=True):\n        if with_coverage:\n            for q, _ in self.questions:\n                q._with_coverage = True\n                q._report = self\n        for q, _ in self.questions:\n            q._setup_answers_mode = True\n            # q._generate_artifacts = False # Disable artifact generation when the report is being set up.\n\n        evaluate_report_student(self, unmute=verbose, noprogress=not verbose, generate_artifacts=False) # Disable artifact generation.\n\n        # self.main()  # Run all tests in class just to get that out of the way...\n        report_cache = {}\n        for q, _ in self.questions:\n            # print(self.questions)\n            if hasattr(q, \'_save_cache\'):\n                q()._save_cache()\n                # print("q is", q())\n                report_cache[q.__qualname__] = q._cache2\n            else:\n                report_cache[q.__qualname__] = {\'no cache see _setup_answers in framework.py\': True}\n        if with_coverage:\n            for q, _ in self.questions:\n                q._with_coverage = False\n\n        # report_cache is saved on a per-question basis.\n        # it could also contain additional information such as runtime metadata etc. This may not be appropriate to store with the invidivual questions(?).\n        # In this case, the function should be re-defined.\n        # for q, _ in self.questions:\n        #     q._setup_answers_mode = False\n        #     q._generate_artifacts = True # Disable artifact generation when the report is being set up.\n        return report_cache\n\n    def set_payload(self, payloads, strict=False):\n        for q, _ in self.questions:\n            q._cache = payloads[q.__qualname__]\n        self._config = payloads[\'config\']\n\n    def _check_remote_versions(self):\n        if self.url is None:\n            return\n        url = self.url\n        if not url.endswith("/"):\n            url += "/"\n        snapshot_file = os.path.dirname(self._file()) + "/unitgrade_data/.snapshot"\n        # print("Sanity checking time using snapshot", snapshot_file)\n        # print("and using self-identified file", self._file())\n\n        if os.path.isfile(snapshot_file):\n            with open(snapshot_file, \'r\') as f:\n                t = f.read()\n                if (time.time() - float(t)) < self._remote_check_cooldown_seconds:\n                    return\n        # print("Is this file run in local mode?", self._is_run_in_grade_mode())\n\n        if self.url.startswith("https://gitlab"):\n            # Try to turn url into a \'raw\' format.\n            # "https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/raw/master/examples/autolab_example_py_upload/instructor/cs102_autolab/report2_test.py?inline=false"\n            # url = self.url\n            url = url.replace("-/tree", "-/raw")\n            # print(url)\n            # "https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/tree/master/examples/autolab_example_py_upload/instructor/cs102_autolab"\n            # "https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/raw/master/examples/autolab_example_py_upload/instructor/report2_test.py?inline=false"\n            # "https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/raw/master/examples/autolab_example_py_upload/instructor/cs102_autolab/report2_test.py?inline=false"\n            raw_url = urllib.parse.urljoin(url, os.path.basename(self._file()) + "?inline=false")\n            # print("Is this file run in local mode?", self._is_run_in_grade_mode())\n            if self._is_run_in_grade_mode():\n                remote_source = requests.get(raw_url).text\n                with open(self._file(), \'r\') as f:\n                    local_source = f.read()\n                if local_source != remote_source:\n                    print("\\nThe local version of this report is not identical to the remote version which can be found at")\n                    print(self.url)\n                    print("The most likely reason for this is that the remote version was updated by the teacher due to some issue.")\n                    print("You should check if there was an announcement and update the test to the most recent version; most likely")\n                    print("This can be done by running the command")\n                    print("> git pull")\n                    print("You can find the most recent code here:")\n                    print(self.url)\n                    raise Exception(f"Version of grade script does not match the remote version. Please update using git pull")\n            else:\n                text = requests.get(raw_url).text\n                node = ast.parse(text)\n                classes = [n for n in node.body if isinstance(n, ast.ClassDef) if n.name == self.__class__.__name__][0]\n                for b in classes.body:\n                    # print(b.)\n                    if b.targets[0].id == "version":\n                        # print(b)\n                        # print(b.value)\n                        version_remote = b.value.value\n                        break\n                if version_remote != self.version:\n                    print("\\nThe version of this report", self.version, "does not match the version of the report on git", version_remote)\n                    print("The most likely reason for this is that the remote version was updated by the teacher due to some issue.")\n                    print("You should check if there was an announcement and update the test to the most recent version; most likely")\n                    print("This can be done by running the command")\n                    print("> git pull")\n                    print("You can find the most recent code here:")\n                    print(self.url)\n                    raise Exception(f"Version of test on remote is {version_remote}, which is different than this version of the test {self.version}. Please update your test to the most recent version.")\n\n                for (q,_) in self.questions:\n                    qq = q(skip_remote_check=True)\n                    cfile = q._cache_file()\n\n                    relpath = os.path.relpath(cfile, os.path.dirname(self._file()))\n                    relpath = relpath.replace("\\\\", "/")\n                    raw_url = urllib.parse.urljoin(url, relpath + "?inline=false")\n                    # requests.get(raw_url)\n\n                    with open(cfile, \'rb\') as f:\n                        b1 = f.read()\n\n                    b2 = requests.get(raw_url).content\n                    if b1 != b2:\n                        print("\\nQuestion ", qq.title, "relies on the data file", cfile)\n                        print("However, it appears that this file is missing or in a different version than the most recent found here:")\n                        print(self.url)\n                        print("The most likely reason for this is that the remote version was updated by the teacher due to some issue.")\n                        print("You should check if there was an announcement and update the test to the most recent version; most likely")\n                        print("This can be done by simply running the command")\n                        print("> git pull")\n                        print("to avoid running bad tests against good code, the program will now stop. Please update and good luck!")\n                        raise Exception("The data file for the question", qq.title, "did not match remote source found on git. The test will therefore automatically fail. Please update your test/data files.")\n\n                t = time.time()\n                if os.path.isdir(os.path.dirname(self._file()) + "/unitgrade_data"):\n                    with open(snapshot_file, \'w\') as f:\n                        f.write(f"{t}")\n\ndef get_hints(ss):\n    """ Extract all blocks of the forms:\n\n    Hints:\n    bla-bla.\n\n    and returns the content unaltered.\n    """\n    if ss == None:\n        return None\n    try:\n        ss = textwrap.dedent(ss)\n        ss = ss.replace(\'\'\'"""\'\'\', "").strip()\n        hints = ["hints:", "hint:"]\n        indexes = [ss.lower().find(h) for h in hints]\n        j = np.argmax(indexes)\n        if indexes[j] == -1:\n            return None\n        h = hints[j]\n        ss = ss[ss.lower().find(h) + len(h) + 1:]\n        ss = "\\n".join([l for l in ss.split("\\n") if not l.strip().startswith(":")])\n        ss = textwrap.dedent(ss).strip()\n        # if ss.startswith(\'*\'):\n        #     ss = ss[1:].strip()\n        return ss\n    except Exception as e:\n        print("bad hints", ss, e)\n\n\nclass UTestCase(unittest.TestCase):\n    # a = 234\n    _outcome = None  # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n    _cache = None  # Read-only cache. Ensures method always produce same result.\n    _cache2 = None  # User-written cache.\n    _with_coverage = False\n    _covcache = None # Coverage cache. Written to if _with_coverage is true.\n    _report = None  # The report used. This is very, very hacky and should always be None. Don\'t rely on it!\n    _run_in_report_mode = True\n\n    _generate_artifacts = True # Whether the file will generate the artifact .json files. This is used in the _grade-script mode.\n    # If true, the tests will not fail when cache is used. This is necesary since otherwise the cache will not be updated\n    # during setup, and the deploy script must be run many times.\n    _setup_answers_mode = False\n\n\n\n    def capture(self):\n        if hasattr(self, \'_stdout\') and self._stdout is not None:\n            file = self._stdout\n        else:\n            file = sys.stdout\n        return Capturing2(stdout=file)\n\n    @classmethod\n    def question_title(cls):\n        """ Return the question title """\n        if cls.__doc__ is not None:\n            title = cls.__doc__.strip().splitlines()[0].strip()\n            if not (title.startswith("Hints:") or title.startswith("Hint:") ):\n                return title\n        return cls.__qualname__\n\n    def run(self, result):\n        # print("Run called in test framework...", self._generate_artifacts)\n        if not self._generate_artifacts:\n            return super().run(result)\n        from unittest.case import TestCase\n        from pupdb.core import PupDB\n\n        db = PupDB(self._artifact_file())\n        db.set(\'run_id\', np.random.randint(1000*1000))\n        db.set("state", "running")\n        db.set(\'coverage_files_changed\', None)\n\n        # print("Re-running test")\n        _stdout = sys.stdout\n        _stderr = sys.stderr\n\n        std_capture = StdCapturing(stdout=sys.stdout, stderr=sys.stderr, db=db, mute=False)\n\n        # stderr_capture = StdCapturing(sys.stderr, db=db)\n        # std_err_capture = StdCapturing(sys.stderr, "stderr", db=db)\n\n        try:\n            # Run this unittest and record all of the output.\n            # This is probably where we should hijack the stdout output and save it -- after all, this is where the test is actually run.\n            # sys.stdout = stdout_capture\n            sys.stderr = std_capture.dummy_stderr\n            sys.stdout = std_capture.dummy_stdout\n\n            result_ = TestCase.run(self, result)\n\n            from werkzeug.debug.tbtools import DebugTraceback, _process_traceback\n            # print(result_._excinfo[0])\n            actual_errors = []\n            for test, err in self._error_fed_during_run:\n                if err is None:\n                    continue\n                else:\n                    import traceback\n                    # traceback.print_tb(err[2])\n                    actual_errors.append(err)\n\n            if len(actual_errors) > 0:\n                ex, exi, tb = actual_errors[0]\n                exi.__traceback__ = tb\n                dbt = DebugTraceback(exi)\n                sys.stderr.write(dbt.render_traceback_text())\n                html = dbt.render_traceback_html(include_title="hello world")\n                db.set(\'wz_stacktrace\', html)\n                db.set(\'state\', \'fail\')\n            else:\n                db.set(\'state\', \'pass\')\n        except Exception as e:\n            print("-----------------.///////////////////////////////////////////////////////////////")\n            # print(e)\n            import traceback\n            traceback.print_exc()\n            raise e\n        finally:\n            sys.stdout = _stdout\n            sys.stderr = _stderr\n            std_capture.close()\n        return result_\n\n    def _callSetUp(self):\n        if self._with_coverage:\n            if self._covcache is None:\n                self._covcache = {}\n            import coverage\n            self.cov = coverage.Coverage(data_file=None)\n            self.cov.start()\n        self.setUp()\n\n    def _callTearDown(self):\n        self.tearDown()\n        # print("Teardown.")\n        if self._with_coverage:\n            # print("with cov")\n            from pathlib import Path\n            from snipper import snipper_main\n            try:\n                self.cov.stop()\n            except Exception as e:\n                print("Something went wrong while tearing down coverage test")\n                print(e)\n            data = self.cov.get_data()\n            base, _, _ = self._report._import_base_relative()\n            for file in data.measured_files():\n                file = os.path.normpath(file)\n                root = Path(base)\n                child = Path(file)\n                if root in child.parents:\n                    # print("Reading file", child)\n                    with open(child, \'r\') as f:\n                        s = f.read()\n                    lines = s.splitlines()\n                    garb = \'GARBAGE\'\n                    lines2 = snipper_main.censor_code(lines, keep=True)\n                    # print("\\n".join(lines2))\n                    if len(lines) != len(lines2):\n                        for k in range(len(lines)):\n                            print(k, ">", lines[k], "::::::::", lines2[k])\n                        print("Snipper failure; line lenghts do not agree. Exiting..")\n                        print(child, "len(lines) == len(lines2)", len(lines), len(lines2))\n                        import sys\n                        sys.exit()\n\n                    assert len(lines) == len(lines2)\n                    for ll in data.contexts_by_lineno(file):\n                        l = ll-1\n                        if l < len(lines2) and lines2[l].strip() == garb:\n                            # print("Got a hit at l", l)\n                            rel = os.path.relpath(child, root)\n                            cc = self._covcache\n                            j = 0\n                            for j in range(l, -1, -1):\n                                if "def" in lines2[j] or "class" in lines2[j]:\n                                    break\n                            from snipper.legacy import gcoms\n\n                            fun = lines2[j]\n                            comments, _ = gcoms("\\n".join(lines2[j:l]))\n                            if rel not in cc:\n                                cc[rel] = {}\n                            cc[rel][fun] = (l, "\\n".join(comments))\n                            # print("found", rel, fun)\n                            self._cache_put((self.cache_id(), \'coverage\'), self._covcache)\n\n    def shortDescriptionStandard(self):\n        sd = super().shortDescription()\n        if sd is None or sd.strip().startswith("Hints:") or sd.strip().startswith("Hint:"):\n            sd = self._testMethodName\n        return sd\n\n    def shortDescription(self):\n        sd = self.shortDescriptionStandard()\n        title = self._cache_get((self.cache_id(), \'title\'), sd)\n        return title if title is not None else sd\n\n    @property\n    def title(self):\n        return self.shortDescription()\n\n    @title.setter\n    def title(self, value):\n        self._cache_put((self.cache_id(), \'title\'), value)\n\n    def _get_outcome(self):\n        if not hasattr(self.__class__, \'_outcome\') or self.__class__._outcome is None:\n            self.__class__._outcome = {}\n        return self.__class__._outcome\n\n    def _callTestMethod(self, testMethod):\n        t = time.time()\n        self._ensure_cache_exists()  # Make sure cache is there.\n        if self._testMethodDoc is not None:\n            self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard())\n\n        self._cache2[(self.cache_id(), \'assert\')] = {}\n        res = testMethod()\n        elapsed = time.time() - t\n        self._get_outcome()[ (self.cache_id(), "return") ] = res\n        self._cache_put((self.cache_id(), "time"), elapsed)\n\n\n    def cache_id(self):\n        c = self.__class__.__qualname__\n        m = self._testMethodName\n        return c, m\n\n    def __init__(self, *args, skip_remote_check=False, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._load_cache()\n        self._assert_cache_index = 0\n        # Perhaps do a sanity check here to see if the cache is up to date? To do that, we must make sure the\n        # cache exists locally.\n        # Find the report class this class is defined within.\n        if skip_remote_check:\n            return\n        import importlib, inspect\n        found_reports = []\n        # print("But do I have report", self._report)\n        # print("I think I am module", self.__module__)\n        # print("Importlib says", importlib.import_module(self.__module__))\n        # This will delegate you to the wrong main clsas when running in grade mode.\n        for name, cls in inspect.getmembers(importlib.import_module(self.__module__), inspect.isclass):\n            # print("checking", cls)\n            if issubclass(cls, Report):\n                for q,_ in cls.questions:\n                    if q == self.__class__:\n                        found_reports.append(cls)\n        if len(found_reports) == 0:\n            pass # This case occurs when the report _grade script is being run.\n            # raise Exception("This question is not a member of a report. Very, very odd.")\n        if len(found_reports) > 1:\n            raise Exception("This question is a member of multiple reports. That should not be the case -- don\'t get too creative.")\n        if len(found_reports) > 0:\n            report = found_reports[0]\n            report()._check_remote_versions()\n\n\n    def _ensure_cache_exists(self):\n        if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n            self.__class__._cache = dict()\n        if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n            self.__class__._cache2 = dict()\n\n    def _cache_get(self, key, default=None):\n        self._ensure_cache_exists()\n        return self.__class__._cache.get(key, default)\n\n    def _cache_put(self, key, value):\n        self._ensure_cache_exists()\n        self.__class__._cache2[key] = value\n\n    def _cache_contains(self, key):\n        self._ensure_cache_exists()\n        return key in self.__class__._cache\n\n    def get_expected_test_value(self):\n        key = (self.cache_id(), \'assert\')\n        id = self._assert_cache_index\n        cache = self._cache_get(key)\n        _expected = cache.get(id, f"Key {id} not found in cache; framework files missing. Please run deploy()")\n        return _expected\n\n    def wrap_assert(self, assert_fun, first, *args, **kwargs):\n        key = (self.cache_id(), \'assert\')\n        if not self._cache_contains(key):\n            print("Warning, framework missing", key)\n            self.__class__._cache[key] = {}  # A new dict. We manually insert it because we have to use that the dict is mutable.\n        cache = self._cache_get(key)\n        id = self._assert_cache_index\n        _expected = cache.get(id, f"Key {id} not found in cache; framework files missing. Please run deploy()")\n        if not id in cache:\n            print("Warning, framework missing cache index", key, "id =", id, " - The test will be skipped for now.")\n            if self._setup_answers_mode:\n                _expected = first # Bypass by setting equal to first. This is in case multiple self.assertEqualC\'s are run in a row and have to be set.\n\n        # The order of these calls is important. If the method assert fails, we should still store the correct result in cache.\n        cache[id] = first\n        self._cache_put(key, cache)\n        self._assert_cache_index += 1\n        if not self._setup_answers_mode:\n            assert_fun(first, _expected, *args, **kwargs)\n        else:\n            try:\n                assert_fun(first, _expected, *args, **kwargs)\n            except Exception as e:\n                print("Mumble grumble. Cache function failed during class setup. Most likely due to old cache. Re-run deploy to check it pass.", id)\n                print("> first", first)\n                print("> expected", _expected)\n                print(e)\n\n\n    def assertEqualC(self, first, msg=None):\n        self.wrap_assert(self.assertEqual, first, msg)\n\n    def _shape_equal(self, first, second):\n        a1 = np.asarray(first).squeeze()\n        a2 = np.asarray(second).squeeze()\n        msg = None\n        msg = "" if msg is None else msg\n        if len(msg) > 0:\n            msg += "\\n"\n        self.assertEqual(a1.shape, a2.shape, msg=msg + "Dimensions of input data does not agree.")\n        assert(np.all(np.isinf(a1) == np.isinf(a2)))  # Check infinite part.\n        a1[np.isinf(a1)] = 0\n        a2[np.isinf(a2)] = 0\n        diff = np.abs(a1 - a2)\n        return diff\n\n    def assertLinf(self, first, second=None, tol=1e-5, msg=None):\n        """ Test in the L_infinity norm.\n        :param first:\n        :param second:\n        :param tol:\n        :param msg:\n        :return:\n        """\n        if second is None:\n            return self.wrap_assert(self.assertLinf, first, tol=tol, msg=msg)\n        else:\n            diff = self._shape_equal(first, second)\n            np.testing.assert_allclose(first, second, atol=tol)\n            \n            max_diff = max(diff.flat)\n            if max_diff >= tol:\n                from unittest.util import safe_repr\n                # msg = f\'{safe_repr(first)} != {safe_repr(second)} : Not equal within tolerance {tol}\'\n                # print(msg)\n                # np.testing.assert_almost_equal\n                # import numpy as np\n                print(f"|first - second|_max = {max_diff} > {tol} ")\n                np.testing.assert_almost_equal(first, second)\n                # If the above fail, make sure to throw an error:\n                self.assertFalse(max_diff >= tol, msg=f\'Input arrays are not equal within tolerance {tol}\')\n                # self.assertEqual(first, second, msg=f\'Not equal within tolerance {tol}\')\n\n    def assertL2(self, first, second=None, tol=1e-5, msg=None, relative=False):\n        if second is None:\n            return self.wrap_assert(self.assertL2, first, tol=tol, msg=msg, relative=relative)\n        else:\n            # We first test using numpys build-in testing method to see if one coordinate deviates a great deal.\n            # This gives us better output, and we know that the coordinate wise difference is lower than the norm difference.\n            if not relative:\n                np.testing.assert_allclose(first, second, atol=tol)\n            diff = self._shape_equal(first, second)\n            diff = ( ( np.asarray( diff.flatten() )**2).sum() )**.5\n\n            scale = (2/(np.linalg.norm(np.asarray(first).flat) + np.linalg.norm(np.asarray(second).flat)) ) if relative else 1\n            max_diff = diff*scale\n            if max_diff >= tol:\n                msg = "" if msg is None else msg\n                print(f"|first - second|_2 = {max_diff} > {tol} ")\n                # Deletage to numpy. Let numpy make nicer messages.\n                np.testing.assert_almost_equal(first, second) # This function does not take a msg parameter.\n                # Make sure to throw an error no matter what.\n                self.assertFalse(max_diff >= tol, msg=f\'Input arrays are not equal within tolerance {tol}\')\n                # self.assertEqual(first, second, msg=msg + f"Not equal within tolerance {tol}")\n\n    @classmethod\n    def _cache_file(cls):\n        return os.path.dirname(inspect.getabsfile(cls)) + "/unitgrade_data/" + cls.__name__ + ".pkl"\n\n    @classmethod\n    def _artifact_file_for_setUpClass(cls):\n        file = os.path.join(os.path.dirname(cls._cache_file()), ""+cls.__name__+"-setUpClass.json")\n        print("_artifact_file_for_setUpClass(cls): will return", file, "__class__", cls)\n        # cf = os.path.dirname(inspect.getabsfile(cls)) + "/unitgrade_data/" + cls.__name__\n        return file\n\n    def _artifact_file(self):\n        """ File for the artifacts DB (thread safe). This file is optinal. Note that it is a pupdb database file.\n        Note the file is shared between all sub-questions. """\n        return os.path.join(os.path.dirname(self.__class__._cache_file()), \'-\'.join(self.cache_id()) + ".json")\n\n    def _save_cache(self):\n        # get the class name (i.e. what to save to).\n        cfile = self.__class__._cache_file()\n        if not os.path.isdir(os.path.dirname(cfile)):\n            os.makedirs(os.path.dirname(cfile))\n\n        if hasattr(self.__class__, \'_cache2\'):\n            with open(cfile, \'wb\') as f:\n                pickle.dump(self.__class__._cache2, f)\n\n    # But you can also set cache explicitly.\n    def _load_cache(self):\n        if self._cache is not None:  # Cache already loaded. We will not load it twice.\n            return\n            # raise Exception("Loaded cache which was already set. What is going on?!")\n        cfile = self.__class__._cache_file()\n        if os.path.exists(cfile):\n            try:\n                with open(cfile, \'rb\') as f:\n                    data = pickle.load(f)\n                self.__class__._cache = data\n            except Exception as e:\n                print("Cache file did not exist:", cfile)\n                print(e)\n        else:\n            print("Warning! data file not found", cfile)\n\n    def _get_coverage_files(self):\n        key = (self.cache_id(), \'coverage\')\n        # CC = None\n        # if self._cache_contains(key):\n        return self._cache_get(key, []) # Anything wrong with the empty list?\n        # return CC\n\n    def _get_hints(self):\n        """\n            This code is run when the test is set up to generate the hints and store them in an artifact file. It may be beneficial to simple compute them beforehand\n            and store them in the local unitgrade pickle file. This code is therefore expected to superceede the alterative code later.\n        """\n        hints = []\n        # print("Getting hint")\n        key = (self.cache_id(), \'coverage\')\n        if self._cache_contains(key):\n            CC = self._cache_get(key)\n            # cl, m = self.cache_id()\n            # print("Getting hint using", CC)\n            # Insert newline to get better formatting.\n            # gprint(\n            #     f"\\n> An error occured during the test: {cl}.{m}. The following files/methods has code in them you are supposed to edit and may therefore be the cause of the problem:")\n            for file in CC:\n                rec = CC[file]\n                # gprint(f">   * {file}")\n                for l in rec:\n                    _, comments = CC[file][l]\n                    hint = get_hints(comments)\n\n                    if hint != None:\n                        hints.append((hint, file, l))\n\n        doc = self._testMethodDoc\n        # print("doc", doc)\n        if doc is not None:\n            hint = get_hints(self._testMethodDoc)\n            if hint is not None:\n                hints = [(hint, None, self.cache_id()[1])] + hints\n\n        return hints\n\n    def _feedErrorsToResult(self, result, errors):\n        """ Use this to show hints on test failure.\n        It feeds error to the result -- so if there are errors, they will crop up here\n        """\n        self._error_fed_during_run = errors.copy() # import to copy the error list.\n\n        # result._test._error_fed_during_run = errors.copy()\n\n        if not isinstance(result, UTextResult):\n            er = [e for e, v in errors if v != None]\n            # print("Errors are", errors)\n            if len(er) > 0:\n                hints = []\n                key = (self.cache_id(), \'coverage\')\n                if self._cache_contains(key):\n                    CC = self._cache_get(key)\n                    cl, m = self.cache_id()\n                    # Insert newline to get better formatting.\n                    gprint(f"\\n> An error occured during the test: {cl}.{m}. The following files/methods has code in them you are supposed to edit and may therefore be the cause of the problem:")\n                    for file in CC:\n                        rec = CC[file]\n                        gprint(f">   * {file}")\n                        for l in rec:\n                            _, comments = CC[file][l]\n                            hint = get_hints(comments)\n\n                            if hint != None:\n                                hints.append((hint, file, l) )\n                            gprint(f">      - {l}")\n\n                er = er[0]\n\n                doc = er._testMethodDoc\n                # print("doc", doc)\n                if doc is not None:\n                    hint = get_hints(er._testMethodDoc)\n                    if hint is not None:\n                        hints = [(hint, None, self.cache_id()[1] )] + hints\n                if len(hints) > 0:\n                    # print(hints)\n                    for hint, file, method in hints:\n                        s = (f"\'{method.strip()}\'" if method is not None else "")\n                        if method is not None and file is not None:\n                            s += " in "\n                        try:\n                            s += (file.strip() if file is not None else "")\n                            gprint(">")\n                            gprint("> Hints (from " + s + ")")\n                            gprint(textwrap.indent(hint, ">   "))\n                        except Exception as e:\n                            print("Bad stuff in hints. ")\n                            print(hints)\n        # result._last_errors = errors\n        super()._feedErrorsToResult(result, errors)\n        b = 234\n\n    def startTestRun(self):\n        super().startTestRun()\n\nclass Required:\n    pass\n\nclass ParticipationTest(UTestCase,Required):\n    max_group_size = None\n    students_in_group = None\n    workload_assignment = {\'Question 1\': [1, 0, 0]}\n\n    def test_students(self):\n        pass\n\n    def test_workload(self):\n        pass\n\n# 817, 705\nclass NotebookTestCase(UTestCase):\n    notebook = None\n    _nb = None\n    @classmethod\n    def setUpClass(cls) -> None:\n        with Capturing():\n            cls._nb = importnb.Notebook.load(cls.notebook)\n\n    @property\n    def nb(self):\n        return self.__class__._nb\n\n\nimport hashlib\nimport io\nimport tokenize\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\nimport inspect\nimport os\nimport argparse\nimport time\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\',  action="store_true",  help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\',  action="store_true",  help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\',  action="store_true",  help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\',  action="store_true",  help=\'Automatically pass all tests. Useful when debugging.\')\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False,\n                            show_tol_err=False, show_privisional=True, noprogress=None,\n                            generate_artifacts=True):\n    args = parser.parse_args()\n    if noprogress is None:\n        noprogress = args.noprogress\n\n    if question is None and args.q is not None:\n        question = args.q\n        if "." in question:\n            question, qitem = [int(v) for v in question.split(".")]\n        else:\n            question = int(question)\n\n    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n    if unmute is None:\n        unmute = args.unmute\n    if passall is None:\n        passall = args.passall\n\n    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute and not noprogress, qitem=qitem,\n                                          verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n                                          show_tol_err=show_tol_err,\n                                          generate_artifacts=generate_artifacts)\n\n\n    if question is None and show_privisional:\n        print("Provisional evaluation")\n        tabulate(table_data)\n        table = table_data\n        print(tabulate(table))\n        print(" ")\n\n    fr = inspect.getouterframes(inspect.currentframe())[1].filename\n    gfile = os.path.basename(fr)[:-3] + "_grade.py"\n    if os.path.exists(gfile):\n        print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n        print(">>>", gfile)\n        print("In the same manner as you ran this file.")\n\n\n    return results\n\n\ndef upack(q):\n    # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n    h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n    h = np.asarray(h)\n    return h[:,0], h[:,1], h[:,2],\n\nclass SequentialTestLoader(unittest.TestLoader):\n    def getTestCaseNames(self, testCaseClass):\n        test_names = super().getTestCaseNames(testCaseClass)\n        # testcase_methods = list(testCaseClass.__dict__.keys())\n        ls = []\n        for C in testCaseClass.mro():\n            if issubclass(C, unittest.TestCase):\n                ls = list(C.__dict__.keys()) + ls\n        testcase_methods = ls\n        test_names.sort(key=testcase_methods.index)\n        return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n                    show_progress_bar=True,\n                    show_tol_err=False,\n                    generate_artifacts=True, # Generate the artifact .json files. These are exclusively used by the dashboard.\n                    big_header=True):\n\n    now = datetime.now()\n    if big_header:\n        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n        b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n    else:\n        b = "Unitgrade"\n    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n    print(b + " v" + __version__ + ", started: " + dt_string+ "\\n")\n    # print("Started: " + dt_string)\n    report._check_remote_versions() # Check (if report.url is present) that remote files exist and are in sync.\n    s = report.title\n    if hasattr(report, "version") and report.version is not None:\n        s += f" version {report.version}"\n    print(s, "(use --help for options)" if show_help_flag else "")\n    # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n    table_data = []\n    t_start = time.time()\n    score = {}\n    loader = SequentialTestLoader()\n\n    for n, (q, w) in enumerate(report.questions):\n        q._generate_artifacts = generate_artifacts  # Set whether artifact .json files will be generated.\n        if question is not None and n+1 != question:\n            continue\n        suite = loader.loadTestsFromTestCase(q)\n        qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n        if not report.abbreviate_questions:\n            q_title_print = "Question %i: %s"%(n+1, qtitle)\n        else:\n            q_title_print = "q%i) %s" % (n + 1, qtitle)\n\n        print(q_title_print, end="")\n        q.possible = 0\n        q.obtained = 0\n        # q_ = {} # Gather score in this class.\n        UTextResult.q_title_print = q_title_print # Hacky\n        UTextResult.show_progress_bar = show_progress_bar # Hacky.\n        UTextResult.number = n\n        UTextResult.nL = report.nL\n        UTextResult.unmute = unmute # Hacky as well.\n        UTextResult.setUpClass_time = q._cache.get(((q.__name__, \'setUpClass\'), \'time\'), 3) if hasattr(q, \'_cache\') and q._cache is not None else 3\n\n\n        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n        details = {}\n        for s, msg in res.successes + res.failures + res.errors:\n            # from unittest.suite import _ErrorHolder\n            # from unittest import _Err\n            # if isinstance(s, _ErrorHolder)\n            if hasattr(s, \'_testMethodName\'):\n                key = (q.__name__, s._testMethodName)\n            else:\n                # In case s is an _ErrorHolder (unittest.suite)\n                key = (q.__name__, s.id())\n            # key = (q.__name__, s._testMethodName) # cannot use the cache_id method bc. it is not compatible with plain unittest.\n\n            detail = {}\n            if (s,msg) in res.successes:\n                detail[\'status\'] = "pass"\n            elif (s,msg) in res.failures:\n                detail[\'status\'] = \'fail\'\n            elif (s,msg) in res.errors:\n                detail[\'status\'] = \'error\'\n            else:\n                raise Exception("Status not known.")\n\n            nice_title = s.title\n            detail = {**detail, **msg, \'nice_title\': nice_title}#[\'message\'] = msg\n            details[key] = detail\n\n        # q_[s._testMethodName] = ("pass", None)\n        # for (s,msg) in res.failures:\n        #     q_[s._testMethodName] = ("fail", msg)\n        # for (s,msg) in res.errors:\n        #     q_[s._testMethodName] = ("error", msg)\n        # res.successes[0]._get_outcome()\n\n        possible = res.testsRun\n        obtained = len(res.successes)\n\n        # assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun\n\n        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n        score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': details, \'title\': qtitle, \'name\': q.__name__,\n                   }\n        q.obtained = obtained\n        q.possible = possible\n        # print(q._cache)\n        # print(q._covcache)\n        s1 = f" * q{n+1})   Total"\n        s2 = f" {q.obtained}/{w}"\n        print(s1 + ("."* (report.nL-len(s1)-len(s2) )) + s2 )\n        print(" ")\n        table_data.append([f"q{n+1}) Total", f"{q.obtained}/{w}"])\n\n    ws, possible, obtained = upack(score)\n    possible = int( msum(possible) )\n    obtained = int( msum(obtained) ) # Cast to python int\n    report.possible = possible\n    report.obtained = obtained\n    now = datetime.now()\n    dt_string = now.strftime("%H:%M:%S")\n\n    dt = int(time.time()-t_start)\n    minutes = dt//60\n    seconds = dt - minutes*60\n    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n    dprint(first = "Total points at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")",\n           last=""+str(report.obtained)+"/"+str(report.possible), nL = report.nL)\n\n    # print(f"Completed at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +"). Total")\n\n    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n    results = {\'total\': (obtained, possible), \'details\': score}\n    return results, table_data\n\n\ndef python_code_str_id(python_code, strip_comments_and_docstring=True):\n    s = python_code\n\n    if strip_comments_and_docstring:\n        try:\n            s = remove_comments_and_docstrings(s)\n        except Exception as e:\n            print("--"*10)\n            print(python_code)\n            print(e)\n\n    s = "".join([c.strip() for c in s.split()])\n    hash_object = hashlib.blake2b(s.encode())\n    return hash_object.hexdigest()\n\n\ndef file_id(file, strip_comments_and_docstring=True):\n    with open(file, \'r\') as f:\n        # s = f.read()\n        return python_code_str_id(f.read())\n\n\ndef remove_comments_and_docstrings(source):\n    """\n    Returns \'source\' minus comments and docstrings.\n    """\n    io_obj = io.StringIO(source)\n    out = ""\n    prev_toktype = tokenize.INDENT\n    last_lineno = -1\n    last_col = 0\n    for tok in tokenize.generate_tokens(io_obj.readline):\n        token_type = tok[0]\n        token_string = tok[1]\n        start_line, start_col = tok[2]\n        end_line, end_col = tok[3]\n        ltext = tok[4]\n        # The following two conditionals preserve indentation.\n        # This is necessary because we\'re not using tokenize.untokenize()\n        # (because it spits out code with copious amounts of oddly-placed\n        # whitespace).\n        if start_line > last_lineno:\n            last_col = 0\n        if start_col > last_col:\n            out += (" " * (start_col - last_col))\n        # Remove comments:\n        if token_type == tokenize.COMMENT:\n            pass\n        # This series of conditionals removes docstrings:\n        elif token_type == tokenize.STRING:\n            if prev_toktype != tokenize.INDENT:\n        # This is likely a docstring; double-check we\'re not inside an operator:\n                if prev_toktype != tokenize.NEWLINE:\n                    # Note regarding NEWLINE vs NL: The tokenize module\n                    # differentiates between newlines that start a new statement\n                    # and newlines inside of operators such as parens, brackes,\n                    # and curly braces.  Newlines inside of operators are\n                    # NEWLINE and newlines that start new code are NL.\n                    # Catch whole-module docstrings:\n                    if start_col > 0:\n                        # Unlabelled indentation means we\'re inside an operator\n                        out += token_string\n                    # Note regarding the INDENT token: The tokenize module does\n                    # not label indentation inside of an operator (parens,\n                    # brackets, and curly braces) as actual indentation.\n                    # For example:\n                    # def foo():\n                    #     "The spaces before this docstring are tokenize.INDENT"\n                    #     test = [\n                    #         "The spaces before this string do not get a token"\n                    #     ]\n        else:\n            out += token_string\n        prev_toktype = token_type\n        last_col = end_col\n        last_lineno = end_line\n    return out\n\nimport textwrap\nimport bz2\nimport pickle\nimport os\nimport zipfile\nimport io\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n    with getattr(bz2, \'open\')(token, "wt") as f:\n        f.write(json_str)\n\ndef gather_imports(imp):\n    resources = {}\n    m = imp\n    f = m.__file__\n    if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'):\n        top_package = os.path.dirname(m.__file__)\n        module_import = True\n    else:\n        im = __import__(m.__name__.split(\'.\')[0])\n        if isinstance(im, list):\n            print("im is a list")\n            print(im)\n        # the __path__ attribute *may* be a string in some cases. I had to fix this.\n        print("path.:",  __import__(m.__name__.split(\'.\')[0]).__path__)\n        # top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n        top_package = __import__(m.__name__.split(\'.\')[0]).__path__[0]\n        module_import = False\n\n    found_hashes = {}\n    # pycode = {}\n    resources[\'pycode\'] = {}\n    zip_buffer = io.BytesIO()\n    with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n        for root, dirs, files in os.walk(top_package):\n            for file in files:\n                if file.endswith(".py"):\n                    fpath = os.path.join(root, file)\n                    v = os.path.relpath(fpath, os.path.dirname(top_package) if not module_import else top_package)\n                    zip.write(fpath, v)\n                    if not fpath.endswith("_grade.py"): # Exclude grade files.\n                        with open(fpath, \'r\') as f:\n                            s = f.read()\n                        found_hashes[v] = python_code_str_id(s)\n                        resources[\'pycode\'][v] = s\n\n    resources[\'zipfile\'] = zip_buffer.getvalue()\n    resources[\'top_package\'] = top_package\n    resources[\'module_import\'] = module_import\n    resources[\'blake2b_file_hashes\'] = found_hashes\n    return resources, top_package\n\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\',  action="store_true",  help=\'Show Autolab results\')\n\ndef gather_report_source_include(report):\n    sources = {}\n    # print("")\n    # if not args.autolab:\n    if len(report.individual_imports) > 0:\n        print("By uploading the .token file, you verify the files:")\n        for m in report.individual_imports:\n            print(">", m.__file__)\n        print("Are created/modified individually by you in agreement with DTUs exam rules")\n        report.pack_imports += report.individual_imports\n\n    if len(report.pack_imports) > 0:\n        print("Including files in upload...")\n        for k, m in enumerate(report.pack_imports):\n            nimp, top_package = gather_imports(m)\n            _, report_relative_location, module_import = report._import_base_relative()\n\n            nimp[\'report_relative_location\'] = report_relative_location\n            nimp[\'report_module_specification\'] = module_import\n            nimp[\'name\'] = m.__name__\n            sources[k] = nimp\n            print(f" * {m.__name__}")\n    return sources\n\ndef gather_upload_to_campusnet(report, output_dir=None, token_include_plaintext_source=False):\n    # n = report.nL\n    args = parser.parse_args()\n    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n                                          show_progress_bar=not args.noprogress,\n                                          big_header=not args.autolab,\n                                          generate_artifacts=False,\n                                          )\n    print("")\n    sources = {}\n    if not args.autolab:\n        results[\'sources\'] = sources = gather_report_source_include(report)\n\n    token_plain = """\n# This file contains your results. Do not edit its content. Simply upload it as it is. """\n\n    s_include = [token_plain]\n    known_hashes = []\n    cov_files = []\n    use_coverage = True\n    if report._config is not None:\n        known_hashes = report._config[\'blake2b_file_hashes\']\n        for Q, _ in report.questions:\n            use_coverage = use_coverage and isinstance(Q, UTestCase)\n            for key in Q._cache:\n                if len(key) >= 2 and key[1] == "coverage":\n                    for f in Q._cache[key]:\n                        cov_files.append(f)\n\n    for s in sources.values():\n        for f_rel, hash in s[\'blake2b_file_hashes\'].items():\n            if hash in known_hashes and f_rel not in cov_files and use_coverage:\n                print("Skipping", f_rel)\n            else:\n                if token_include_plaintext_source:\n                    s_include.append("#"*3 +" Content of " + f_rel +" " + "#"*3)\n                    s_include.append("")\n                    s_include.append(s[\'pycode\'][f_rel])\n                    s_include.append("")\n\n    if output_dir is None:\n        output_dir = os.getcwd()\n\n    payload_out_base = report.__class__.__name__ + "_handin"\n\n    obtain, possible = results[\'total\']\n    vstring = f"_v{report.version}" if report.version is not None else ""\n    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n    token = os.path.normpath(os.path.join(output_dir, token))\n\n    save_token(results, "\\n".join(s_include), token)\n\n    if not args.autolab:\n        print("> Testing token file integrity...", sep="")\n        load_token(token)\n        print("Done!")\n        print(" ")\n        print("To get credit for your results, please upload the single unmodified file: ")\n        print(">", token)\n\n\ndef save_token(dictionary, plain_text, file_out):\n    if plain_text is None:\n        plain_text = ""\n    if len(plain_text) == 0:\n        plain_text = "Start token file"\n    plain_text = plain_text.strip()\n    b, b_hash = dict2picklestring(dictionary)\n    b_l1 = len(b)\n    b = "."+b+"."\n    b = "\\n".join( textwrap.wrap(b, 180))\n\n    out = [plain_text, token_sep, f"{b_hash} {b_l1}", token_sep, b]\n    with open(file_out, \'w\') as f:\n        f.write("\\n".join(out))\n\n\n\n\ndef source_instantiate(name, report1_source, payload):\n    # print("Executing sources", report1_source)\n    eval("exec")(report1_source, globals())\n    # print("Loaind gpayload..")\n    pl = pickle.loads(bytes.fromhex(payload))\n    report = eval(name)(payload=pl, strict=True)\n    return report\n\n\n__version__ = "0.1.28.7"\n\nfrom cs108.homework1 import add, reverse_list, linear_regression_weights, linear_predict, foo\nimport time\nimport numpy as np\nimport pickle\nimport os\n# from unitgrade.framework import dash\n\ndef mk_bad():\n    with open(os.path.dirname(__file__)+"/db.pkl", \'wb\') as f:\n        d = {\'x1\': 100, \'x2\': 300}\n        pickle.dump(d, f)\n\ndef mk_ok():\n    with open(os.path.dirname(__file__)+"/db.pkl", \'wb\') as f:\n        d = {\'x1\': 1, \'x2\': 2}\n        pickle.dump(d, f)\n\nclass Numpy(UTestCase):\n    z = 234\n\n    # def __getattr__(self, item):\n    #     print("hi there ", item)\n    #     return super().__getattr__(item)\n    #\n    # def __getattribute__(self, item):\n    #     print("oh hello sexy. ", item)\n    #     return super().__getattribute__(item)\n\n    @classmethod_dashboard\n    def setUpClass(cls) -> None:\n        print("Dum di dai, I am running some setup code here.")\n        for i in range(10):\n            print("Hello world", i)\n        print("Set up.") # must be handled seperately.\n        # assert False\n\n    # @cache\n    # def make_primes(self, n):\n    #     return primes(n)\n\n    def test_bad(self):\n        """\n        Hints:\n            * Remember to properly de-indent your code.\n            * Do more stuff which works.\n        """\n        # raise Exception("This ended poorly")\n        # print("Here we go")\n        # return\n        # self.assertEqual(1, 1)\n        with open(os.path.dirname(__file__)+"/db.pkl", \'rb\') as f:\n            d = pickle.load(f)\n        # print(d)\n        # assert False\n        # for i in range(10):\n        from tqdm import tqdm\n        for i in tqdm(range(100)):\n            # print("The current number is", i)\n            time.sleep(.01)\n        self.assertEqual(1, d[\'x1\'])\n        for b in range(10):\n            self.assertEqualC(add(3, b))\n\n\n    def test_weights(self):\n        """\n            Hints:\n            * Try harder!\n            * Check the chapter on linear regression.\n        """\n        n = 3\n        m = 2\n        np.random.seed(5)\n        # from numpy import asdfaskdfj\n        # X = np.random.randn(n, m)\n        # y = np.random.randn(n)\n        foo()\n        # assert 2 == 3\n        # raise Exception("Bad exit")\n        # self.assertEqual(2, np.random.randint(1000))\n        # self.assertEqual(2, np.random.randint(1000))\n        # self.assertL2(linear_regression_weights(X, y), msg="the message")\n        self.assertEqual(1, 1)\n        # self.assertEqual(1,2)\n        return "THE RESULT OF THE TEST"\n\n\nclass AnotherTest(UTestCase):\n    def test_more(self):\n        self.assertEqual(2,2)\n\n    def test_even_more(self):\n        self.assertEqual(2,2)\n\nimport cs108\nclass Report2(Report):\n    title = "CS 101 Report 2"\n    questions = [\n        (Numpy, 10), (AnotherTest, 20)\n        ]\n    pack_imports = [cs108]'
-report1_payload = '8004954f040000000000007d94288c054e756d7079947d942868018c0a7365745570436c6173739486948c0474696d65948694473fa258a80000000068018c08746573745f6261649486948c057469746c6594869468076801680786948c066173736572749486947d94284b004b034b014b044b024b054b034b064b044b074b054b084b064b094b074b0a4b084b0b4b094b0c7568016807869468058694473ff0b862c00000006801680786948c08636f7665726167659486947d948c1263733130382f686f6d65776f726b312e7079947d948c0e6465662061646428612c62293a20944b128ca12020202022222220476976656e2074776f206e756d626572732060616020616e642060626020746869732066756e6374696f6e2073686f756c642073696d706c792072657475726e2074686569722073756d3a0a202020203e2061646428612c6229203d20612b620a2020202048696e74733a0a20202020202020202a2052656d656d6265722062617369632061726974686d6574696373210a20202020222222948694737368018c0c746573745f7765696768747394869468098694681a6801681a8694680c86947d946801681a869468058694473f667180000000006801681a8694681286947d948c1263733130382f686f6d65776f726b312e7079947d94288c0b64656620666f6f28293a20944b168c162020202022222220436f6d6d656e742e2020202222229486948c0b6465662062617228293a20944b198c009486947573758c0b416e6f7468657254657374947d9428682d6803869468058694473f3c5c0000000000682d8c09746573745f6d6f7265948694680c86947d94682d6831869468058694473f1c000000000000682d8c0e746573745f6576656e5f6d6f7265948694680c86947d94682d6837869468058694473f2f380000000000758c06636f6e666967947d948c13626c616b6532625f66696c655f686173686573945d94288c806533626432393138326330346430393339383337663665656532383132353463633933316664663433633765663532623139303636636161653463623836343739636131303266323234623536353565313732336462306264383035323931303538313161336561626364396234616366663139366435396332386532666261948c803463383365363937356661646561613036306264366663383765346461373936336433323633373839666235336466373930363632316662333966663432636631303336393330396237383165356662643231333736313365613065336339326336396534393237663765626464613563346431383236343863313263363566948c803031623433643134313830383363643939336264313234653433343637373832613035393466313832343039396639376363666231373034313832393737636536356230623537636331393838663565383439336663636361656330646263653834333466386661343539356330373039306265376138326366663536396361946573752e'
+report1_source = '# from unitgrade import hide\n# from unitgrade import utils\n# import os\n# import lzma\n# import pickle\n\n# DONT\'t import stuff here since install script requires __version__\n\n# def cache_write(object, file_name, verbose=True):\n#     # raise Exception("bad")\n#     # import compress_pickle\n#     dn = os.path.dirname(file_name)\n#     if not os.path.exists(dn):\n#         os.mkdir(dn)\n#     if verbose: print("Writing cache...", file_name)\n#     with lzma.open(file_name, \'wb\', ) as f:\n#         pickle.dump(object, f)\n#     if verbose: print("Done!")\n#\n#\n# def cache_exists(file_name):\n#     # file_name = cn_(file_name) if cache_prefix else file_name\n#     return os.path.exists(file_name)\n#\n#\n# def cache_read(file_name):\n#     # import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n#     # file_name = cn_(file_name) if cache_prefix else file_name\n#     if os.path.exists(file_name):\n#         try:\n#             with lzma.open(file_name, \'rb\') as f:\n#                 return pickle.load(f)\n#         except Exception as e:\n#             print("Tried to load a bad pickle file at", file_name)\n#             print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n#             print(e)\n#             # return pickle.load(f)\n#     else:\n#         return None\n\n\n\nimport re\nimport sys\nimport threading\nimport time\nimport lzma\nimport hashlib\nimport pickle\nimport base64\nimport os\nfrom collections import namedtuple\nfrom io import StringIO\nimport numpy as np\nimport tqdm\nfrom colorama import Fore\nfrom functools import _make_key\nfrom diskcache import Cache\n\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\ndef gprint(s):\n    print(f"{Fore.LIGHTGREEN_EX}{s}")\n\nmyround = lambda x: np.round(x)  # required for obfuscation.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\n"""\nClean up the various output-related helper classes.\n"""\nclass Logger(object):\n    def __init__(self, buffer, write_to_stdout=True):\n        # assert False\n        self.terminal = sys.stdout\n        self.write_to_stdout = write_to_stdout\n        self.log = buffer\n\n    def write(self, message):\n        if self.write_to_stdout:\n            self.terminal.write(message)\n        self.log.write(message)\n\n    def flush(self):\n        # this flush method is needed for python 3 compatibility.\n        pass\n\n\nclass Capturing(list):\n    def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n        self._stdout = stdout\n        self.unmute = unmute\n        super().__init__(*args, **kwargs)\n\n    def __enter__(self, capture_errors=True):  # don\'t put arguments here.\n        self._stdout = sys.stdout if self._stdout == None else self._stdout\n        self._stringio = StringIO()\n        if self.unmute:\n            sys.stdout = Logger(self._stringio)\n        else:\n            sys.stdout = self._stringio\n\n        if capture_errors:\n            self._sterr = sys.stderr\n            sys.sterr = StringIO()  # memory hole it\n        self.capture_errors = capture_errors\n        return self\n\n    def __exit__(self, *args):\n        self.extend(self._stringio.getvalue().splitlines())\n        del self._stringio  # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n\nclass Capturing2(Capturing):\n    def __exit__(self, *args):\n        lines = self._stringio.getvalue().splitlines()\n        txt = "\\n".join(lines)\n        numbers = extract_numbers(rm_progress_bar(txt))\n        self.extend(lines)\n        del self._stringio  # free up some memory\n        sys.stdout = self._stdout\n        if self.capture_errors:\n            sys.sterr = self._sterr\n\n        self.output = txt\n        self.numbers = numbers\n\n\ndef rm_progress_bar(txt):\n    # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n    nlines = []\n    for l in txt.splitlines():\n        pct = l.find("%")\n        ql = False\n        if pct > 0:\n            i = l.find("|", pct + 1)\n            if i > 0 and l.find("|", i + 1) > 0:\n                ql = True\n        if not ql:\n            nlines.append(l)\n    return "\\n".join(nlines)\n\n\nclass ActiveProgress():\n    def __init__(self, t, start=True, title="my progress bar", show_progress_bar=True, file=None, mute_stdout=False):\n        if file == None:\n            file = sys.stdout\n        self.file = file\n        self.mute_stdout = mute_stdout\n        self._running = False\n        self.title = title\n        self.dt = 0.025\n        self.n = max(1, int(np.round(t / self.dt)))\n        self.show_progress_bar = show_progress_bar\n        self.pbar = None\n\n        if start:\n            self.start()\n\n    def start(self):\n        if self.mute_stdout:\n            import io\n            # from unitgrade.utils import Logger\n            self._stdout = sys.stdout\n            sys.stdout = Logger(io.StringIO(), write_to_stdout=False)\n\n        self._running = True\n        if self.show_progress_bar:\n            self.thread = threading.Thread(target=self.run)\n            self.thread.start()\n        self.time_started = time.time()\n\n    def terminate(self):\n        if not self._running:\n            print("Stopping a progress bar which is not running (class unitgrade.utils.ActiveProgress")\n            pass\n            # raise Exception("Stopping a stopped progress bar. ")\n        self._running = False\n        if self.show_progress_bar:\n            self.thread.join()\n        if self.pbar is not None:\n            self.pbar.update(1)\n            self.pbar.close()\n            self.pbar = None\n\n        self.file.flush()\n\n        if self.mute_stdout:\n            import io\n            # from unitgrade.utils import Logger\n            sys.stdout = self._stdout #= sys.stdout\n\n            # sys.stdout = Logger(io.StringIO(), write_to_stdout=False)\n\n        return time.time() - self.time_started\n\n    def run(self):\n        self.pbar = tqdm.tqdm(total=self.n, file=self.file, position=0, leave=False, desc=self.title, ncols=100,\n                              bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')\n        t_ = time.time()\n        for _ in range(self.n - 1):  # Don\'t terminate completely; leave bar at 99% done until terminate.\n            if not self._running:\n                self.pbar.close()\n                self.pbar = None\n                break\n            tc = time.time()\n            tic = max(0, self.dt - (tc - t_))\n            if tic > 0:\n                time.sleep(tic)\n            t_ = time.time()\n            self.pbar.update(1)\n\n\ndef dprint(first, last, nL, extra = "", file=None, dotsym=\'.\', color=\'white\'):\n    if file == None:\n        file = sys.stdout\n    dot_parts = (dotsym * max(0, nL - len(last) - len(first)))\n    print(first + dot_parts, end="", file=file)\n    last += extra\n    print(last, file=file)\n\n\ndef hide(func):\n    return func\n\n\ndef makeRegisteringDecorator(foreignDecorator):\n    """\n        Returns a copy of foreignDecorator, which is identical in every\n        way(*), except also appends a .decorator property to the callable it\n        spits out.\n    """\n\n    def newDecorator(func):\n        # Call to newDecorator(method)\n        # Exactly like old decorator, but output keeps track of what decorated it\n        R = foreignDecorator(func)  # apply foreignDecorator, like call to foreignDecorator(method) would have done\n        R.decorator = newDecorator  # keep track of decorator\n        # R.original = func         # might as well keep track of everything!\n        return R\n\n    newDecorator.__name__ = foreignDecorator.__name__\n    newDecorator.__doc__ = foreignDecorator.__doc__\n    return newDecorator\n\n\nhide = makeRegisteringDecorator(hide)\n\n\ndef extract_numbers(txt):\n    numeric_const_pattern = r\'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n    rx = re.compile(numeric_const_pattern, re.VERBOSE)\n    all = rx.findall(txt)\n    all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n    if len(all) > 500:\n        print(txt)\n        raise Exception("unitgrade_v1.unitgrade_v1.py: Warning, too many numbers!", len(all))\n    return all\n\n\ndef cache(foo, typed=False):\n    """ Magic cache wrapper\n    https://github.com/python/cpython/blob/main/Lib/functools.py\n    """\n    maxsize = None\n    def wrapper(self, *args, **kwargs):\n        key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)))\n        # print(self._cache.keys())\n        # for k in self._cache:\n        #     print(k)\n        if not self._cache_contains(key):\n            value = foo(self, *args, **kwargs)\n            self._cache_put(key, value)\n        else:\n            value = self._cache_get(key)\n            # This appears to be required since there are two caches. Otherwise, when deploy method is run twice,\n            # the cache will not be set correctly.\n            self._cache_put(key, value)\n        return value\n\n    return wrapper\n\n\ndef methodsWithDecorator(cls, decorator):\n    """\n        Returns all methods in CLS with DECORATOR as the\n        outermost decorator.\n\n        DECORATOR must be a "registering decorator"; one\n        can make any decorator "registering" via the\n        makeRegisteringDecorator function.\n\n        import inspect\n        ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n        for f in ls:\n            print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n    """\n    for maybeDecorated in cls.__dict__.values():\n        if hasattr(maybeDecorated, \'decorator\'):\n            if maybeDecorated.decorator == decorator:\n                print(maybeDecorated)\n                yield maybeDecorated\n\n\n""" Methods responsible for turning a dictionary into a string that can be pickled or put into a json file. """\ndef dict2picklestring(dd):\n    """\n    Turns a dictionary into a string with some compression.\n\n    :param dd:\n    :return:\n    """\n    b = lzma.compress(pickle.dumps(dd))\n    b_hash = hashlib.blake2b(b).hexdigest()\n    return base64.b64encode(b).decode("utf-8"), b_hash\n\ndef picklestring2dict(picklestr):\n    """ Reverse of the above method: Turns the string back into a dictionary. """\n    b = base64.b64decode(picklestr)\n    hash = hashlib.blake2b(b).hexdigest()\n    dictionary = pickle.loads(lzma.decompress(b))\n    return dictionary, hash\n\ntoken_sep = "-"*70 + " ..ooO0Ooo.. " + "-"*70\ndef load_token(file_in):\n    """ We put this one here to allow loading of token files for the dashboard. """\n    with open(file_in, \'r\') as f:\n        s = f.read()\n    splt = s.split(token_sep)\n    data = splt[-1]\n    info = splt[-2]\n    head = token_sep.join(splt[:-2])\n    plain_text=head.strip()\n    hash, l1 = info.split(" ")\n    data = "".join( data.strip()[1:-1].splitlines() )\n    l1 = int(l1)\n    dictionary, b_hash = picklestring2dict(data)\n    assert len(data) == l1\n    assert b_hash == hash.strip()\n    return dictionary, plain_text\n\n\n\n## Key/value store related.\nclass DKPupDB:\n    """ This key/value store store artifacts (associated with a specific question) in a dictionary. """\n    def __init__(self, artifact_file, use_pupdb=False):\n        # Make a double-headed disk cache thingy.\n        self.dk = Cache(os.path.dirname(artifact_file)) # Start in this directory.\n        self.name_ = os.path.basename(artifact_file[:-5])\n        if self.name_ not in self.dk:\n            self.dk[self.name_] = dict()\n        self.use_pupdb = use_pupdb\n        if self.use_pupdb:\n            from pupdb.core import PupDB\n            self.db_ = PupDB(artifact_file)\n\n    def __setitem__(self, key, value):\n        if self.use_pupdb:\n            self.db_.set(key, value)\n        with self.dk.transact():\n            d = self.dk[self.name_]\n            d[key] = value\n            self.dk[self.name_] = d\n            self.dk[self.name_ + "-updated"] = True\n\n    def __getitem__(self, item):\n        v = self.dk[self.name_][item]\n        if self.use_pupdb:\n            v2 = self.db_.get(item)\n            if v != v2:\n                print("Mismatch v1, v2 for ", item)\n        return v\n\n    def keys(self): # This one is also deprecated.\n        return tuple(self.dk[self.name_].keys()) #.iterkeys())\n        # return self.db_.keys()\n\n    def set(self, item, value): # This one is deprecated.\n        self[item] = value\n\n    def get(self, item, default=None):\n        return self[item] if item in self else default\n\n    def __contains__(self, item):\n        return item in self.dk[self.name_] #keys()\n        # return item in self.dk\n\n\nimport io\nimport sys\nimport time\nimport unittest\nfrom unittest.runner import _WritelnDecorator\nimport numpy as np\n\n\nclass UTextResult(unittest.TextTestResult):\n    nL = 80\n    number = -1  # HAcky way to set question number.\n    show_progress_bar = True\n    unmute = False # Whether to redirect stdout.\n    cc = None\n    setUpClass_time = 3 # Estimated time to run setUpClass in TestCase. Must be set externally. See key (("ClassName", "setUpClass"), "time") in _cache.\n\n    def __init__(self, stream, descriptions, verbosity):\n        super().__init__(stream, descriptions, verbosity)\n        self.successes = []\n\n    def printErrors(self) -> None:\n        # TODO: Fix here. probably also needs to flush stdout.\n        self.printErrorList(\'ERROR\', [(test, res[\'stderr\']) for test, res in self.errors])\n        self.printErrorList(\'FAIL\',  [(test, res[\'stderr\']) for test, res in self.failures])\n\n    def addError(self, test, err):\n        super(unittest.TextTestResult, self).addError(test, err)\n        err = self.errors[-1][1]\n        if hasattr(sys.stdout, \'log\'):\n            stdout = sys.stdout.log.readlines()  # Only works because we set sys.stdout to a unitgrade.Logger\n        else:\n            stdout = ""\n        self.errors[-1] = (self.errors[-1][0], {\'return\': None,\n                                \'stderr\': err,\n                                \'stdout\': stdout\n                                })\n\n        if not hasattr(self, \'item_title_print\'):\n            # In case setUpClass() fails with an error the short description may not be set. This will fix that problem.\n            self.item_title_print = test.shortDescription()\n            if self.item_title_print is None:  # In case the short description is not set either...\n                self.item_title_print = test.id()\n\n\n        self.cc_terminate(success=False)\n\n    def addFailure(self, test, err):\n        super(unittest.TextTestResult, self).addFailure(test, err)\n        err = self.failures[-1][1]\n        stdout = sys.stdout.log.readlines()  # Only works because we set sys.stdout to a unitgrade.Logger\n        self.failures[-1] = (self.failures[-1][0], {\'return\': None,\n                                \'stderr\': err,\n                                \'stdout\': stdout\n                                })\n        self.cc_terminate(success=False)\n\n\n    def addSuccess(self, test: unittest.case.TestCase) -> None:\n        msg = None\n        stdout = sys.stdout.log.readlines() # Only works because we set sys.stdout to a unitgrade.Logger\n\n        if hasattr(test, \'_get_outcome\'):\n            o = test._get_outcome()\n            if isinstance(o, dict):\n                key = (test.cache_id(), "return")\n                if key in o:\n                    msg = test._get_outcome()[key]\n\n        # print(sys.stdout.readlines())\n        self.successes.append((test, None))  # (test, message) (to be consistent with failures and errors).\n        self.successes[-1] = (self.successes[-1][0], {\'return\': msg,\n                                 \'stdout\': stdout,\n                                 \'stderr\': None})\n\n        self.cc_terminate()\n\n    def cc_terminate(self, success=True):\n        if self.show_progress_bar or True:\n            tsecs = np.round(self.cc.terminate(), 2)\n            self.cc.file.flush()\n            ss = self.item_title_print\n\n            state = "PASS" if success else "FAILED"\n\n            dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n            if self.show_progress_bar or True:\n                print(self.item_title_print + dot_parts, end="", file=self.cc.file)\n            else:\n                print(dot_parts, end="", file=self.cc.file)\n\n            if tsecs >= 0.5:\n                state += " (" + str(tsecs) + " seconds)"\n            print(state, file=self.cc.file)\n\n    def startTest(self, test):\n        name = test.__class__.__name__\n        if self.testsRun == 0 and hasattr(test.__class__, \'_cache2\'): # Disable this if the class is pure unittest.TestCase\n            # This is the first time we are running a test. i.e. we can time the time taken to call setupClass.\n            if test.__class__._cache2 is None:\n                test.__class__._cache2 = {}\n            test.__class__._cache2[((name, \'setUpClass\'), \'time\')] = time.time() - self.t_start\n\n        self.testsRun += 1\n        item_title = test.shortDescription()  # Better for printing (get from cache).\n\n        if item_title == None:\n            # For unittest framework where getDescription may return None.\n            item_title = self.getDescription(test)\n        self.item_title_print = " * q%i.%i) %s" % (UTextResult.number + 1, self.testsRun, item_title)\n        # if self.show_progress_bar or True:\n        estimated_time = test.__class__._cache.get(((name, test._testMethodName), \'time\'), 100) if hasattr(test.__class__, \'_cache\') else 4\n        self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar)\n        # else:\n        #     print(self.item_title_print + (\'.\' * max(0, self.nL - 4 - len(self.item_title_print))), end="")\n        self._test = test\n        # if not self.unmute:\n        self._stdout = sys.stdout # Redundant. remove later.\n        sys.stdout = Logger(io.StringIO(), write_to_stdout=self.unmute)\n\n    def stopTest(self, test):\n        # if not self.unmute:\n        buff = sys.stdout.log\n        sys.stdout = self._stdout # redundant.\n        buff.close()\n        super().stopTest(test)\n\n    def _setupStdout(self):\n        if self._previousTestClass == None:\n            self.t_start = time.time()\n            if hasattr(self.__class__, \'q_title_print\'):\n                q_title_print = self.__class__.q_title_print\n            else:\n                q_title_print = "<unnamed test. See unitgrade.framework.py>"\n\n            cc = ActiveProgress(t=self.setUpClass_time, title=q_title_print, show_progress_bar=self.show_progress_bar, mute_stdout=not self.unmute)\n            self.cc = cc\n\n\n    def _restoreStdout(self):  # Used when setting up the test.\n        if self._previousTestClass is None:\n            q_time = self.cc.terminate()\n            q_time = np.round(q_time, 2)\n            sys.stdout.flush()\n            if self.show_progress_bar:\n                print(self.cc.title, end="")\n            print(" " * max(0, self.nL - len(self.cc.title)) + (" (" + str(q_time) + " seconds)" if q_time >= 0.5 else ""))\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n    def __init__(self, *args, **kwargs):\n        stream = io.StringIO()\n        super().__init__(*args, stream=stream, **kwargs)\n\n    def _makeResult(self):\n        # stream = self.stream # not you!\n        stream = sys.stdout\n        stream = _WritelnDecorator(stream)\n        return self.resultclass(stream, self.descriptions, self.verbosity)\n\nimport importnb\nimport numpy as np\nimport sys\nimport pickle\nimport os\nimport inspect\nimport colorama\nimport unittest\nimport time\nimport textwrap\nimport urllib.parse\nimport requests\nimport ast\nimport numpy\nfrom unittest.case import TestCase\n\n\ncolorama.init(autoreset=True)  # auto resets your settings after every output\nnumpy.seterr(all=\'raise\')\n\ndef setup_dir_by_class(C, base_dir):\n    name = C.__class__.__name__\n    return base_dir, name\n\n\n_DASHBOARD_COMPLETED_MESSAGE = "Dashboard> Evaluation completed."\n\n# Consolidate this code.\nclass classmethod_dashboard(classmethod):\n    def __init__(self, f):\n        def dashboard_wrap(cls: UTestCase):\n            if not cls._generate_artifacts:\n                f(cls)\n                return\n            db = DKPupDB(cls._artifact_file_for_setUpClass())\n            r = np.random.randint(1000 * 1000)\n            db.set(\'run_id\', r)\n            db.set(\'coverage_files_changed\', None)\n\n            state_ = \'fail\'\n            try:\n                _stdout = sys.stdout\n                _stderr = sys.stderr\n                std_capture = StdCapturing(stdout=sys.stdout, stderr=sys.stderr, db=db, mute=False)\n\n                # Run this unittest and record all of the output.\n                # This is probably where we should hijack the stdout output and save it -- after all, this is where the test is actually run.\n                # sys.stdout = stdout_capture\n                sys.stderr = std_capture.dummy_stderr\n                sys.stdout = std_capture.dummy_stdout\n                db.set("state", "running")\n                f(cls)\n                state_ = \'pass\'\n            except Exception as e:\n                from werkzeug.debug.tbtools import DebugTraceback, _process_traceback\n                state_ = \'fail\'\n                db.set(\'state\', state_)\n                exi = e\n                dbt = DebugTraceback(exi)\n                sys.stderr.write(dbt.render_traceback_text())\n                html = dbt.render_traceback_html(include_title="hello world")\n                db.set(\'wz_stacktrace\', html)\n                raise e\n            finally:\n                db.set(\'state\', state_)\n                std_capture.dummy_stdout.write_mute(_DASHBOARD_COMPLETED_MESSAGE)\n                sys.stdout = _stdout\n                sys.stderr = _stderr\n                std_capture.close()\n        super().__init__(dashboard_wrap)\n\nclass Report:\n    title = "report title"\n    abbreviate_questions = False # Should the test items start with \'Question ...\' or just be q1).\n    version = None # A version number of the report (1.0). Used to compare version numbers with online resources.\n    url = None  # Remote location of this problem.\n\n    questions = []\n    pack_imports = []\n    individual_imports = []\n\n    _remote_check_cooldown_seconds = 1  # Seconds between remote check of report.\n    nL = 120  # Maximum line width\n    _config = None  # Private variable. Used when collecting results from student computers. Should only be read/written by teacher and never used for regular evaluation.\n    _setup_mode = False # True if test is being run in setup-mode, i.e. will not fail because of bad configurations, etc.\n\n    @classmethod\n    def reset(cls):\n        for (q, _) in cls.questions:\n            if hasattr(q, \'reset\'):\n                q.reset()\n\n    @classmethod\n    def mfile(clc):\n        return inspect.getfile(clc)\n\n    def _file(self):\n        return inspect.getfile(type(self))\n\n    def _artifact_file(self):\n        """ File for the artifacts DB (thread safe). This file is optinal. Note that it is a pupdb database file.\n        Note the file is shared between all sub-questions. """\n        return os.path.join(os.path.dirname(self._file()), "unitgrade_data/main_config_"+ os.path.basename(self._file()[:-3]) + ".artifacts.pkl")\n\n    def _is_run_in_grade_mode(self):\n        """ True if this report is being run as part of a grade run. """\n        return self._file().endswith("_grade.py") # Not sure I love this convention.\n\n    def _import_base_relative(self):\n        if hasattr(self.pack_imports[0], \'__path__\'):\n            root_dir = self.pack_imports[0].__path__[0]\n        else:\n            root_dir = self.pack_imports[0].__file__\n\n        root_dir = os.path.dirname(root_dir)\n        relative_path = os.path.relpath(self._file(), root_dir)\n        modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n        relative_path = relative_path.replace("\\\\", "/")\n        return root_dir, relative_path, modules\n\n    def __init__(self, strict=False, payload=None):\n        working_directory = os.path.abspath(os.path.dirname(self._file()))\n        self.wdir, self.name = setup_dir_by_class(self, working_directory)\n        # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n        for (q, _) in self.questions:\n            q.nL = self.nL  # Set maximum line length.\n\n        if payload is not None:\n            self.set_payload(payload, strict=strict)\n\n    def main(self, verbosity=1):\n        # Run all tests using standard unittest (nothing fancy).\n        loader = unittest.TestLoader()\n        for q, _ in self.questions:\n            start = time.time()  #\n            suite = loader.loadTestsFromTestCase(q)\n            unittest.TextTestRunner(verbosity=verbosity).run(suite)\n            total = time.time() - start\n            q.time = total\n\n    def _setup_answers(self, with_coverage=False, verbose=True):\n        if with_coverage:\n            for q, _ in self.questions:\n                q._with_coverage = True\n                q._report = self\n        for q, _ in self.questions:\n            q._setup_answers_mode = True\n            # q._generate_artifacts = False # Disable artifact generation when the report is being set up.\n\n        evaluate_report_student(self, unmute=verbose, noprogress=not verbose, generate_artifacts=False) # Disable artifact generation.\n\n        # self.main()  # Run all tests in class just to get that out of the way...\n        report_cache = {}\n        for q, _ in self.questions:\n            # print(self.questions)\n            if hasattr(q, \'_save_cache\'):\n                q()._save_cache()\n                # print("q is", q())\n                report_cache[q.__qualname__] = q._cache2\n            else:\n                report_cache[q.__qualname__] = {\'no cache see _setup_answers in framework.py\': True}\n        if with_coverage:\n            for q, _ in self.questions:\n                q._with_coverage = False\n\n        # report_cache is saved on a per-question basis.\n        # it could also contain additional information such as runtime metadata etc. This may not be appropriate to store with the invidivual questions(?).\n        # In this case, the function should be re-defined.\n        return report_cache\n\n    def set_payload(self, payloads, strict=False):\n        for q, _ in self.questions:\n            q._cache = payloads[q.__qualname__]\n        self._config = payloads[\'config\']\n\n    def _check_remote_versions(self):\n        if self.url is None:\n            return\n        url = self.url\n        if not url.endswith("/"):\n            url += "/"\n        snapshot_file = os.path.dirname(self._file()) + "/unitgrade_data/.snapshot"\n        if os.path.isfile(snapshot_file):\n            with open(snapshot_file, \'r\') as f:\n                t = f.read()\n                if (time.time() - float(t)) < self._remote_check_cooldown_seconds:\n                    return\n\n        if self.url.startswith("https://gitlab"):\n            # Try to turn url into a \'raw\' format.\n            # "https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/raw/master/examples/autolab_example_py_upload/instructor/cs102_autolab/report2_test.py?inline=false"\n            # url = self.url\n            url = url.replace("-/tree", "-/raw")\n            # print(url)\n            # "https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/tree/master/examples/autolab_example_py_upload/instructor/cs102_autolab"\n            # "https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/raw/master/examples/autolab_example_py_upload/instructor/report2_test.py?inline=false"\n            # "https://gitlab.compute.dtu.dk/tuhe/unitgrade_private/-/raw/master/examples/autolab_example_py_upload/instructor/cs102_autolab/report2_test.py?inline=false"\n            raw_url = urllib.parse.urljoin(url, os.path.basename(self._file()) + "?inline=false")\n            # print("Is this file run in local mode?", self._is_run_in_grade_mode())\n            if self._is_run_in_grade_mode():\n                remote_source = requests.get(raw_url).text\n                with open(self._file(), \'r\') as f:\n                    local_source = f.read()\n                if local_source != remote_source:\n                    print("\\nThe local version of this report is not identical to the remote version which can be found at")\n                    print(self.url)\n                    print("The most likely reason for this is that the remote version was updated by the teacher due to some issue.")\n                    print("You should check if there was an announcement and update the test to the most recent version; most likely")\n                    print("This can be done by running the command")\n                    print("> git pull")\n                    print("You can find the most recent code here:")\n                    print(self.url)\n                    raise Exception(f"Version of grade script does not match the remote version. Please update using git pull")\n            else:\n                text = requests.get(raw_url).text\n                node = ast.parse(text)\n                classes = [n for n in node.body if isinstance(n, ast.ClassDef) if n.name == self.__class__.__name__][0]\n                for b in classes.body:\n                    # print(b.)\n                    if b.targets[0].id == "version":\n                        # print(b)\n                        # print(b.value)\n                        version_remote = b.value.value\n                        break\n                if version_remote != self.version:\n                    print("\\nThe version of this report", self.version, "does not match the version of the report on git", version_remote)\n                    print("The most likely reason for this is that the remote version was updated by the teacher due to some issue.")\n                    print("You should check if there was an announcement and update the test to the most recent version; most likely")\n                    print("This can be done by running the command")\n                    print("> git pull")\n                    print("You can find the most recent code here:")\n                    print(self.url)\n                    raise Exception(f"Version of test on remote is {version_remote}, which is different than this version of the test {self.version}. Please update your test to the most recent version.")\n\n                for (q,_) in self.questions:\n                    qq = q(skip_remote_check=True)\n                    cfile = q._cache_file()\n\n                    relpath = os.path.relpath(cfile, os.path.dirname(self._file()))\n                    relpath = relpath.replace("\\\\", "/")\n                    raw_url = urllib.parse.urljoin(url, relpath + "?inline=false")\n                    # requests.get(raw_url)\n\n                    with open(cfile, \'rb\') as f:\n                        b1 = f.read()\n\n                    b2 = requests.get(raw_url).content\n                    if b1 != b2:\n                        print("\\nQuestion ", qq.title, "relies on the data file", cfile)\n                        print("However, it appears that this file is missing or in a different version than the most recent found here:")\n                        print(self.url)\n                        print("The most likely reason for this is that the remote version was updated by the teacher due to some issue.")\n                        print("You should check if there was an announcement and update the test to the most recent version; most likely")\n                        print("This can be done by simply running the command")\n                        print("> git pull")\n                        print("to avoid running bad tests against good code, the program will now stop. Please update and good luck!")\n                        raise Exception("The data file for the question", qq.title, "did not match remote source found on git. The test will therefore automatically fail. Please update your test/data files.")\n\n                t = time.time()\n                if os.path.isdir(os.path.dirname(self._file()) + "/unitgrade_data"):\n                    with open(snapshot_file, \'w\') as f:\n                        f.write(f"{t}")\n\ndef get_hints(ss):\n    """ Extract all blocks of the forms:\n\n    Hints:\n    bla-bla.\n\n    and returns the content unaltered.\n    """\n    if ss == None:\n        return None\n    try:\n        ss = textwrap.dedent(ss)\n        ss = ss.replace(\'\'\'"""\'\'\', "").strip()\n        hints = ["hints:", "hint:"]\n        indexes = [ss.lower().find(h) for h in hints]\n        j = np.argmax(indexes)\n        if indexes[j] == -1:\n            return None\n        h = hints[j]\n        ss = ss[ss.lower().find(h) + len(h) + 1:]\n        ss = "\\n".join([l for l in ss.split("\\n") if not l.strip().startswith(":")])\n        ss = textwrap.dedent(ss).strip()\n        # if ss.startswith(\'*\'):\n        #     ss = ss[1:].strip()\n        return ss\n    except Exception as e:\n        print("bad hints", ss, e)\n\n\nclass UTestCase(unittest.TestCase):\n    # a = 234\n    _outcome = None  # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n    _cache = None  # Read-only cache. Ensures method always produce same result.\n    _cache2 = None  # User-written cache.\n    _with_coverage = False\n    _covcache = None # Coverage cache. Written to if _with_coverage is true.\n    _report = None  # The report used. This is very, very hacky and should always be None. Don\'t rely on it!\n    _run_in_report_mode = True\n\n    _generate_artifacts = True # Whether the file will generate the artifact .json files. This is used in the _grade-script mode.\n    # If true, the tests will not fail when cache is used. This is necesary since otherwise the cache will not be updated\n    # during setup, and the deploy script must be run many times.\n    _setup_answers_mode = False\n\n    def capture(self):\n        if hasattr(self, \'_stdout\') and self._stdout is not None:\n            file = self._stdout\n        else:\n            file = sys.stdout\n        return Capturing2(stdout=file)\n\n    @classmethod\n    def question_title(cls):\n        """ Return the question title """\n        if cls.__doc__ is not None:\n            title = cls.__doc__.strip().splitlines()[0].strip()\n            if not (title.startswith("Hints:") or title.startswith("Hint:") ):\n                return title\n        return cls.__qualname__\n\n    def run(self, result):\n        # print("Run called in test framework...", self._generate_artifacts)\n        if not self._generate_artifacts:\n            return super().run(result)\n\n        db = DKPupDB(self._artifact_file())\n        db.set("state", "running")\n        db.set(\'run_id\', np.random.randint(1000*1000))\n        db.set(\'coverage_files_changed\', None)\n\n\n        _stdout = sys.stdout\n        _stderr = sys.stderr\n\n        std_capture = StdCapturing(stdout=sys.stdout, stderr=sys.stderr, db=db, mute=False)\n\n        # stderr_capture = StdCapturing(sys.stderr, db=db)\n        # std_err_capture = StdCapturing(sys.stderr, "stderr", db=db)\n        state_ = None\n        try:\n            # Run this unittest and record all of the output.\n            # This is probably where we should hijack the stdout output and save it -- after all, this is where the test is actually run.\n            # sys.stdout = stdout_capture\n            sys.stderr = std_capture.dummy_stderr\n            sys.stdout = std_capture.dummy_stdout\n\n            result_ = TestCase.run(self, result)\n\n            from werkzeug.debug.tbtools import DebugTraceback, _process_traceback\n            # print(result_._excinfo[0])\n            actual_errors = []\n            for test, err in self._error_fed_during_run:\n                if err is None:\n                    continue\n                else:\n                    import traceback\n                    # traceback.print_tb(err[2])\n                    actual_errors.append(err)\n\n            if len(actual_errors) > 0:\n                ex, exi, tb = actual_errors[0]\n                exi.__traceback__ = tb\n                dbt = DebugTraceback(exi)\n                sys.stderr.write(dbt.render_traceback_text())\n                html = dbt.render_traceback_html(include_title="hello world")\n                db.set(\'wz_stacktrace\', html)\n                # db.set(\'state\', \'fail\')\n                state_ = "fail"\n            else:\n                state_ = "pass"\n        except Exception as e:\n            state_ = "fail"\n            import traceback\n            traceback.print_exc()\n            raise e\n        finally:\n            db.set(\'state\', state_)\n            std_capture.dummy_stdout.write_mute(_DASHBOARD_COMPLETED_MESSAGE)\n            sys.stdout = _stdout\n            sys.stderr = _stderr\n            std_capture.close()\n        return result_\n\n    def _callSetUp(self):\n        if self._with_coverage:\n            if self._covcache is None:\n                self._covcache = {}\n            import coverage\n            self.cov = coverage.Coverage(data_file=None)\n            self.cov.start()\n        self.setUp()\n\n\n    def _callTearDown(self):\n        self.tearDown()\n        if self._with_coverage:\n            from pathlib import Path\n            from snipper import snipper_main\n            try:\n                self.cov.stop()\n            except Exception as e:\n                print("Something went wrong while tearing down coverage test")\n                print(e)\n            data = self.cov.get_data()\n            base, _, _ = self._report._import_base_relative()\n            for file in data.measured_files():\n                file = os.path.normpath(file)\n                root = Path(base)\n                child = Path(file)\n                if root in child.parents:\n                    with open(child, \'r\') as f:\n                        s = f.read()\n                    lines = s.splitlines()\n                    garb = \'GARBAGE\'\n                    lines2 = snipper_main.censor_code(lines, keep=True)\n                    if len(lines) != len(lines2):\n                        for k in range(len(lines)):\n                            print(k, ">", lines[k], "::::::::", lines2[k])\n                        print("Snipper failure; line lenghts do not agree. Exiting..")\n                        print(child, "len(lines) == len(lines2)", len(lines), len(lines2))\n                        import sys\n                        sys.exit()\n\n                    assert len(lines) == len(lines2)\n                    for ll in data.contexts_by_lineno(file):\n                        l = ll-1\n                        if l < len(lines2) and lines2[l].strip() == garb:\n                            rel = os.path.relpath(child, root)\n                            cc = self._covcache\n                            j = 0\n                            for j in range(l, -1, -1):\n                                if "def" in lines2[j] or "class" in lines2[j]:\n                                    break\n                            from snipper.legacy import gcoms\n\n                            fun = lines2[j]\n                            comments, _ = gcoms("\\n".join(lines2[j:l]))\n                            if rel not in cc:\n                                cc[rel] = {}\n                            cc[rel][fun] = (l, "\\n".join(comments))\n                            # print("found", rel, fun)\n                            self._cache_put((self.cache_id(), \'coverage\'), self._covcache)\n\n    def shortDescriptionStandard(self):\n        sd = super().shortDescription()\n        if sd is None or sd.strip().startswith("Hints:") or sd.strip().startswith("Hint:"):\n            sd = self._testMethodName\n        return sd\n\n    def shortDescription(self):\n        sd = self.shortDescriptionStandard()\n        title = self._cache_get((self.cache_id(), \'title\'), sd)\n        return title if title is not None else sd\n\n    @property\n    def title(self):\n        return self.shortDescription()\n\n    @title.setter\n    def title(self, value):\n        self._cache_put((self.cache_id(), \'title\'), value)\n\n    def _get_outcome(self):\n        if not hasattr(self.__class__, \'_outcome\') or self.__class__._outcome is None:\n            self.__class__._outcome = {}\n        return self.__class__._outcome\n\n    def _callTestMethod(self, testMethod):\n        t = time.time()\n        self._ensure_cache_exists()  # Make sure cache is there.\n        if self._testMethodDoc is not None:\n            self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard())\n\n        self._cache2[(self.cache_id(), \'assert\')] = {}\n        res = testMethod()\n        elapsed = time.time() - t\n        self._get_outcome()[ (self.cache_id(), "return") ] = res\n        self._cache_put((self.cache_id(), "time"), elapsed)\n\n\n    def cache_id(self):\n        c = self.__class__.__qualname__\n        m = self._testMethodName\n        return c, m\n\n    def __init__(self, *args, skip_remote_check=False, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._load_cache()\n        self._assert_cache_index = 0\n        # Perhaps do a sanity check here to see if the cache is up to date? To do that, we must make sure the\n        # cache exists locally.\n        # Find the report class this class is defined within.\n        if skip_remote_check:\n            return\n        import importlib, inspect\n        found_reports = []\n        # print("But do I have report", self._report)\n        # print("I think I am module", self.__module__)\n        # print("Importlib says", importlib.import_module(self.__module__))\n        # This will delegate you to the wrong main clsas when running in grade mode.\n        for name, cls in inspect.getmembers(importlib.import_module(self.__module__), inspect.isclass):\n            # print("checking", cls)\n            if issubclass(cls, Report):\n                for q,_ in cls.questions:\n                    if q == self.__class__:\n                        found_reports.append(cls)\n        if len(found_reports) == 0:\n            pass # This case occurs when the report _grade script is being run.\n            # raise Exception("This question is not a member of a report. Very, very odd.")\n        if len(found_reports) > 1:\n            raise Exception("This question is a member of multiple reports. That should not be the case -- don\'t get too creative.")\n        if len(found_reports) > 0:\n            report = found_reports[0]\n            report()._check_remote_versions()\n\n\n    def _ensure_cache_exists(self):\n        if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n            self.__class__._cache = dict()\n        if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n            self.__class__._cache2 = dict()\n\n    def _cache_get(self, key, default=None):\n        self._ensure_cache_exists()\n        return self.__class__._cache.get(key, default)\n\n    def _cache_put(self, key, value):\n        self._ensure_cache_exists()\n        self.__class__._cache2[key] = value\n\n    def _cache_contains(self, key):\n        self._ensure_cache_exists()\n        return key in self.__class__._cache\n\n    def get_expected_test_value(self):\n        key = (self.cache_id(), \'assert\')\n        id = self._assert_cache_index\n        cache = self._cache_get(key)\n        _expected = cache.get(id, f"Key {id} not found in cache; framework files missing. Please run deploy()")\n        return _expected\n\n    def wrap_assert(self, assert_fun, first, *args, **kwargs):\n        key = (self.cache_id(), \'assert\')\n        if not self._cache_contains(key):\n            print("Warning, framework missing", key)\n            self.__class__._cache[key] = {}  # A new dict. We manually insert it because we have to use that the dict is mutable.\n        cache = self._cache_get(key)\n        id = self._assert_cache_index\n        _expected = cache.get(id, f"Key {id} not found in cache; framework files missing. Please run deploy()")\n        if not id in cache:\n            print("Warning, framework missing cache index", key, "id =", id, " - The test will be skipped for now.")\n            if self._setup_answers_mode:\n                _expected = first # Bypass by setting equal to first. This is in case multiple self.assertEqualC\'s are run in a row and have to be set.\n\n        # The order of these calls is important. If the method assert fails, we should still store the correct result in cache.\n        cache[id] = first\n        self._cache_put(key, cache)\n        self._assert_cache_index += 1\n        if not self._setup_answers_mode:\n            assert_fun(first, _expected, *args, **kwargs)\n        else:\n            try:\n                assert_fun(first, _expected, *args, **kwargs)\n            except Exception as e:\n                print("Mumble grumble. Cache function failed during class setup. Most likely due to old cache. Re-run deploy to check it pass.", id)\n                print("> first", first)\n                print("> expected", _expected)\n                print(e)\n\n\n    def assertEqualC(self, first, msg=None):\n        self.wrap_assert(self.assertEqual, first, msg)\n\n    def _shape_equal(self, first, second):\n        a1 = np.asarray(first).squeeze()\n        a2 = np.asarray(second).squeeze()\n        msg = None\n        msg = "" if msg is None else msg\n        if len(msg) > 0:\n            msg += "\\n"\n        self.assertEqual(a1.shape, a2.shape, msg=msg + "Dimensions of input data does not agree.")\n        assert(np.all(np.isinf(a1) == np.isinf(a2)))  # Check infinite part.\n        a1[np.isinf(a1)] = 0\n        a2[np.isinf(a2)] = 0\n        diff = np.abs(a1 - a2)\n        return diff\n\n    def assertLinf(self, first, second=None, tol=1e-5, msg=None):\n        """ Test in the L_infinity norm.\n        :param first:\n        :param second:\n        :param tol:\n        :param msg:\n        :return:\n        """\n        if second is None:\n            return self.wrap_assert(self.assertLinf, first, tol=tol, msg=msg)\n        else:\n            diff = self._shape_equal(first, second)\n            np.testing.assert_allclose(first, second, atol=tol)\n            \n            max_diff = max(diff.flat)\n            if max_diff >= tol:\n                from unittest.util import safe_repr\n                # msg = f\'{safe_repr(first)} != {safe_repr(second)} : Not equal within tolerance {tol}\'\n                # print(msg)\n                # np.testing.assert_almost_equal\n                # import numpy as np\n                print(f"|first - second|_max = {max_diff} > {tol} ")\n                np.testing.assert_almost_equal(first, second)\n                # If the above fail, make sure to throw an error:\n                self.assertFalse(max_diff >= tol, msg=f\'Input arrays are not equal within tolerance {tol}\')\n                # self.assertEqual(first, second, msg=f\'Not equal within tolerance {tol}\')\n\n    def assertL2(self, first, second=None, tol=1e-5, msg=None, relative=False):\n        if second is None:\n            return self.wrap_assert(self.assertL2, first, tol=tol, msg=msg, relative=relative)\n        else:\n            # We first test using numpys build-in testing method to see if one coordinate deviates a great deal.\n            # This gives us better output, and we know that the coordinate wise difference is lower than the norm difference.\n            if not relative:\n                np.testing.assert_allclose(first, second, atol=tol)\n            diff = self._shape_equal(first, second)\n            diff = ( ( np.asarray( diff.flatten() )**2).sum() )**.5\n\n            scale = (2/(np.linalg.norm(np.asarray(first).flat) + np.linalg.norm(np.asarray(second).flat)) ) if relative else 1\n            max_diff = diff*scale\n            if max_diff >= tol:\n                msg = "" if msg is None else msg\n                print(f"|first - second|_2 = {max_diff} > {tol} ")\n                # Deletage to numpy. Let numpy make nicer messages.\n                np.testing.assert_almost_equal(first, second) # This function does not take a msg parameter.\n                # Make sure to throw an error no matter what.\n                self.assertFalse(max_diff >= tol, msg=f\'Input arrays are not equal within tolerance {tol}\')\n                # self.assertEqual(first, second, msg=msg + f"Not equal within tolerance {tol}")\n\n    @classmethod\n    def _cache_file(cls):\n        return os.path.dirname(inspect.getabsfile(cls)) + "/unitgrade_data/" + cls.__name__ + ".pkl"\n\n    @classmethod\n    def _artifact_file_for_setUpClass(cls):\n        file = os.path.join(os.path.dirname(cls._cache_file()), ""+cls.__name__+"-setUpClass.json")\n        print("_artifact_file_for_setUpClass(cls): will return", file, "__class__", cls)\n        # cf = os.path.dirname(inspect.getabsfile(cls)) + "/unitgrade_data/" + cls.__name__\n        return file\n\n    def _artifact_file(self):\n        """ File for the artifacts DB (thread safe). This file is optinal. Note that it is a pupdb database file.\n        Note the file is shared between all sub-questions. """\n        return os.path.join(os.path.dirname(self.__class__._cache_file()), \'-\'.join(self.cache_id()) + ".json")\n\n    def _save_cache(self):\n        # get the class name (i.e. what to save to).\n        cfile = self.__class__._cache_file()\n        if not os.path.isdir(os.path.dirname(cfile)):\n            os.makedirs(os.path.dirname(cfile))\n\n        if hasattr(self.__class__, \'_cache2\'):\n            with open(cfile, \'wb\') as f:\n                pickle.dump(self.__class__._cache2, f)\n\n    # But you can also set cache explicitly.\n    def _load_cache(self):\n        if self._cache is not None:  # Cache already loaded. We will not load it twice.\n            return\n            # raise Exception("Loaded cache which was already set. What is going on?!")\n        cfile = self.__class__._cache_file()\n        if os.path.exists(cfile):\n            try:\n                with open(cfile, \'rb\') as f:\n                    data = pickle.load(f)\n                self.__class__._cache = data\n            except Exception as e:\n                print("Cache file did not exist:", cfile)\n                print(e)\n        else:\n            print("Warning! data file not found", cfile)\n\n    def _get_coverage_files(self):\n        key = (self.cache_id(), \'coverage\')\n        # CC = None\n        # if self._cache_contains(key):\n        return self._cache_get(key, []) # Anything wrong with the empty list?\n        # return CC\n\n    def _get_hints(self):\n        """\n            This code is run when the test is set up to generate the hints and store them in an artifact file. It may be beneficial to simple compute them beforehand\n            and store them in the local unitgrade pickle file. This code is therefore expected to superceede the alterative code later.\n        """\n        hints = []\n        # print("Getting hint")\n        key = (self.cache_id(), \'coverage\')\n        if self._cache_contains(key):\n            CC = self._cache_get(key)\n            # cl, m = self.cache_id()\n            # print("Getting hint using", CC)\n            # Insert newline to get better formatting.\n            # gprint(\n            #     f"\\n> An error occured during the test: {cl}.{m}. The following files/methods has code in them you are supposed to edit and may therefore be the cause of the problem:")\n            for file in CC:\n                rec = CC[file]\n                # gprint(f">   * {file}")\n                for l in rec:\n                    _, comments = CC[file][l]\n                    hint = get_hints(comments)\n\n                    if hint != None:\n                        hints.append((hint, file, l))\n\n        doc = self._testMethodDoc\n        # print("doc", doc)\n        if doc is not None:\n            hint = get_hints(self._testMethodDoc)\n            if hint is not None:\n                hints = [(hint, None, self.cache_id()[1])] + hints\n\n        return hints\n\n    def _feedErrorsToResult(self, result, errors):\n        """ Use this to show hints on test failure.\n        It feeds error to the result -- so if there are errors, they will crop up here\n        """\n        self._error_fed_during_run = errors.copy() # import to copy the error list.\n\n        # result._test._error_fed_during_run = errors.copy()\n\n        if not isinstance(result, UTextResult):\n            er = [e for e, v in errors if v != None]\n            # print("Errors are", errors)\n            if len(er) > 0:\n                hints = []\n                key = (self.cache_id(), \'coverage\')\n                if self._cache_contains(key):\n                    CC = self._cache_get(key)\n                    cl, m = self.cache_id()\n                    # Insert newline to get better formatting.\n                    gprint(f"\\n> An error occured during the test: {cl}.{m}. The following files/methods has code in them you are supposed to edit and may therefore be the cause of the problem:")\n                    for file in CC:\n                        rec = CC[file]\n                        gprint(f">   * {file}")\n                        for l in rec:\n                            _, comments = CC[file][l]\n                            hint = get_hints(comments)\n\n                            if hint != None:\n                                hints.append((hint, file, l) )\n                            gprint(f">      - {l}")\n\n                er = er[0]\n\n                doc = er._testMethodDoc\n                # print("doc", doc)\n                if doc is not None:\n                    hint = get_hints(er._testMethodDoc)\n                    if hint is not None:\n                        hints = [(hint, None, self.cache_id()[1] )] + hints\n                if len(hints) > 0:\n                    # print(hints)\n                    for hint, file, method in hints:\n                        s = (f"\'{method.strip()}\'" if method is not None else "")\n                        if method is not None and file is not None:\n                            s += " in "\n                        try:\n                            s += (file.strip() if file is not None else "")\n                            gprint(">")\n                            gprint("> Hints (from " + s + ")")\n                            gprint(textwrap.indent(hint, ">   "))\n                        except Exception as e:\n                            print("Bad stuff in hints. ")\n                            print(hints)\n        # result._last_errors = errors\n        super()._feedErrorsToResult(result, errors)\n        b = 234\n\n    def startTestRun(self):\n        super().startTestRun()\n\nclass Required:\n    pass\n\nclass ParticipationTest(UTestCase,Required):\n    max_group_size = None\n    students_in_group = None\n    workload_assignment = {\'Question 1\': [1, 0, 0]}\n\n    def test_students(self):\n        pass\n\n    def test_workload(self):\n        pass\n\n# 817, 705\nclass NotebookTestCase(UTestCase):\n    notebook = None\n    _nb = None\n    @classmethod\n    def setUpClass(cls) -> None:\n        with Capturing():\n            cls._nb = importnb.Notebook.load(cls.notebook)\n\n    @property\n    def nb(self):\n        return self.__class__._nb\n # 870.\n\nimport hashlib\nimport io\nimport tokenize\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\nimport inspect\nimport os\nimport argparse\nimport time\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\',  action="store_true",  help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\',  action="store_true",  help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\',  action="store_true",  help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\',  action="store_true",  help=\'Automatically pass all tests. Useful when debugging.\')\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False,\n                            show_tol_err=False, show_privisional=True, noprogress=None,\n                            generate_artifacts=True):\n    args = parser.parse_args()\n    if noprogress is None:\n        noprogress = args.noprogress\n\n    if question is None and args.q is not None:\n        question = args.q\n        if "." in question:\n            question, qitem = [int(v) for v in question.split(".")]\n        else:\n            question = int(question)\n\n    if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n        raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n    if unmute is None:\n        unmute = args.unmute\n    if passall is None:\n        passall = args.passall\n\n    results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute and not noprogress, qitem=qitem,\n                                          verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n                                          show_tol_err=show_tol_err,\n                                          generate_artifacts=generate_artifacts)\n\n\n    if question is None and show_privisional:\n        print("Provisional evaluation")\n        tabulate(table_data)\n        table = table_data\n        print(tabulate(table))\n        print(" ")\n\n    fr = inspect.getouterframes(inspect.currentframe())[1].filename\n    gfile = os.path.basename(fr)[:-3] + "_grade.py"\n    if os.path.exists(gfile):\n        print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n        print(">>>", gfile)\n        print("In the same manner as you ran this file.")\n\n\n    return results\n\n\ndef upack(q):\n    # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n    h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n    h = np.asarray(h)\n    return h[:,0], h[:,1], h[:,2],\n\nclass SequentialTestLoader(unittest.TestLoader):\n    def getTestCaseNames(self, testCaseClass):\n        test_names = super().getTestCaseNames(testCaseClass)\n        # testcase_methods = list(testCaseClass.__dict__.keys())\n        ls = []\n        for C in testCaseClass.mro():\n            if issubclass(C, unittest.TestCase):\n                ls = list(C.__dict__.keys()) + ls\n        testcase_methods = ls\n        test_names.sort(key=testcase_methods.index)\n        return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False,  show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n                    show_progress_bar=True,\n                    show_tol_err=False,\n                    generate_artifacts=True, # Generate the artifact .json files. These are exclusively used by the dashboard.\n                    big_header=True):\n\n    now = datetime.now()\n    if big_header:\n        ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n        b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n    else:\n        b = "Unitgrade"\n    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n    print(b + " v" + __version__ + ", started: " + dt_string+ "\\n")\n    # print("Started: " + dt_string)\n    report._check_remote_versions() # Check (if report.url is present) that remote files exist and are in sync.\n    s = report.title\n    if hasattr(report, "version") and report.version is not None:\n        s += f" version {report.version}"\n    print(s, "(use --help for options)" if show_help_flag else "")\n    # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n    table_data = []\n    t_start = time.time()\n    score = {}\n    loader = SequentialTestLoader()\n\n    for n, (q, w) in enumerate(report.questions):\n        q._generate_artifacts = generate_artifacts  # Set whether artifact .json files will be generated.\n        if question is not None and n+1 != question:\n            continue\n        suite = loader.loadTestsFromTestCase(q)\n        qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n        if not report.abbreviate_questions:\n            q_title_print = "Question %i: %s"%(n+1, qtitle)\n        else:\n            q_title_print = "q%i) %s" % (n + 1, qtitle)\n\n        print(q_title_print, end="")\n        q.possible = 0\n        q.obtained = 0\n        # q_ = {} # Gather score in this class.\n        UTextResult.q_title_print = q_title_print # Hacky\n        UTextResult.show_progress_bar = show_progress_bar # Hacky.\n        UTextResult.number = n\n        UTextResult.nL = report.nL\n        UTextResult.unmute = unmute # Hacky as well.\n        UTextResult.setUpClass_time = q._cache.get(((q.__name__, \'setUpClass\'), \'time\'), 3) if hasattr(q, \'_cache\') and q._cache is not None else 3\n\n\n        res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n        details = {}\n        for s, msg in res.successes + res.failures + res.errors:\n            # from unittest.suite import _ErrorHolder\n            # from unittest import _Err\n            # if isinstance(s, _ErrorHolder)\n            if hasattr(s, \'_testMethodName\'):\n                key = (q.__name__, s._testMethodName)\n            else:\n                # In case s is an _ErrorHolder (unittest.suite)\n                key = (q.__name__, s.id())\n            # key = (q.__name__, s._testMethodName) # cannot use the cache_id method bc. it is not compatible with plain unittest.\n\n            detail = {}\n            if (s,msg) in res.successes:\n                detail[\'status\'] = "pass"\n            elif (s,msg) in res.failures:\n                detail[\'status\'] = \'fail\'\n            elif (s,msg) in res.errors:\n                detail[\'status\'] = \'error\'\n            else:\n                raise Exception("Status not known.")\n\n            # s can be an \'_ErrorHolder\' object, which has no title.\n            nice_title = s.title if hasattr(s, \'title\') else \'s has no title; unitgrade/evaluate.py line 181\'\n            detail = {**detail, **msg, \'nice_title\': nice_title} #[\'message\'] = msg\n            details[key] = detail\n\n        # q_[s._testMethodName] = ("pass", None)\n        # for (s,msg) in res.failures:\n        #     q_[s._testMethodName] = ("fail", msg)\n        # for (s,msg) in res.errors:\n        #     q_[s._testMethodName] = ("error", msg)\n        # res.successes[0]._get_outcome()\n\n        possible = res.testsRun\n        obtained = len(res.successes)\n\n        # assert len(res.successes) +  len(res.errors) + len(res.failures) == res.testsRun\n\n        obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n        score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': details, \'title\': qtitle, \'name\': q.__name__,\n                   }\n        q.obtained = obtained\n        q.possible = possible\n        # print(q._cache)\n        # print(q._covcache)\n        s1 = f" * q{n+1})   Total"\n        s2 = f" {q.obtained}/{w}"\n        print(s1 + ("."* (report.nL-len(s1)-len(s2) )) + s2 )\n        print(" ")\n        table_data.append([f"q{n+1}) Total", f"{q.obtained}/{w}"])\n\n    ws, possible, obtained = upack(score)\n    possible = int( msum(possible) )\n    obtained = int( msum(obtained) ) # Cast to python int\n    report.possible = possible\n    report.obtained = obtained\n    now = datetime.now()\n    dt_string = now.strftime("%H:%M:%S")\n\n    dt = int(time.time()-t_start)\n    minutes = dt//60\n    seconds = dt - minutes*60\n    plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n    dprint(first = "Total points at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")",\n           last=""+str(report.obtained)+"/"+str(report.possible), nL = report.nL)\n\n    # print(f"Completed at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +"). Total")\n\n    table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n    results = {\'total\': (obtained, possible), \'details\': score}\n    return results, table_data\n\n\ndef python_code_str_id(python_code, strip_comments_and_docstring=True):\n    s = python_code\n\n    if strip_comments_and_docstring:\n        try:\n            s = remove_comments_and_docstrings(s)\n        except Exception as e:\n            print("--"*10)\n            print(python_code)\n            print(e)\n\n    s = "".join([c.strip() for c in s.split()])\n    hash_object = hashlib.blake2b(s.encode())\n    return hash_object.hexdigest()\n\n\ndef file_id(file, strip_comments_and_docstring=True):\n    with open(file, \'r\') as f:\n        # s = f.read()\n        return python_code_str_id(f.read())\n\n\ndef remove_comments_and_docstrings(source):\n    """\n    Returns \'source\' minus comments and docstrings.\n    """\n    io_obj = io.StringIO(source)\n    out = ""\n    prev_toktype = tokenize.INDENT\n    last_lineno = -1\n    last_col = 0\n    for tok in tokenize.generate_tokens(io_obj.readline):\n        token_type = tok[0]\n        token_string = tok[1]\n        start_line, start_col = tok[2]\n        end_line, end_col = tok[3]\n        ltext = tok[4]\n        # The following two conditionals preserve indentation.\n        # This is necessary because we\'re not using tokenize.untokenize()\n        # (because it spits out code with copious amounts of oddly-placed\n        # whitespace).\n        if start_line > last_lineno:\n            last_col = 0\n        if start_col > last_col:\n            out += (" " * (start_col - last_col))\n        # Remove comments:\n        if token_type == tokenize.COMMENT:\n            pass\n        # This series of conditionals removes docstrings:\n        elif token_type == tokenize.STRING:\n            if prev_toktype != tokenize.INDENT:\n        # This is likely a docstring; double-check we\'re not inside an operator:\n                if prev_toktype != tokenize.NEWLINE:\n                    # Note regarding NEWLINE vs NL: The tokenize module\n                    # differentiates between newlines that start a new statement\n                    # and newlines inside of operators such as parens, brackes,\n                    # and curly braces.  Newlines inside of operators are\n                    # NEWLINE and newlines that start new code are NL.\n                    # Catch whole-module docstrings:\n                    if start_col > 0:\n                        # Unlabelled indentation means we\'re inside an operator\n                        out += token_string\n                    # Note regarding the INDENT token: The tokenize module does\n                    # not label indentation inside of an operator (parens,\n                    # brackets, and curly braces) as actual indentation.\n                    # For example:\n                    # def foo():\n                    #     "The spaces before this docstring are tokenize.INDENT"\n                    #     test = [\n                    #         "The spaces before this string do not get a token"\n                    #     ]\n        else:\n            out += token_string\n        prev_toktype = token_type\n        last_col = end_col\n        last_lineno = end_line\n    return out\n\nimport textwrap\nimport bz2\nimport pickle\nimport os\nimport zipfile\nimport io\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n    with getattr(bz2, \'open\')(token, "wt") as f:\n        f.write(json_str)\n\ndef gather_imports(imp):\n    resources = {}\n    m = imp\n    f = m.__file__\n    if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'):\n        top_package = os.path.dirname(m.__file__)\n        module_import = True\n    else:\n        im = __import__(m.__name__.split(\'.\')[0])\n        if isinstance(im, list):\n            print("im is a list")\n            print(im)\n        # the __path__ attribute *may* be a string in some cases. I had to fix this.\n        print("path.:",  __import__(m.__name__.split(\'.\')[0]).__path__)\n        # top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n        top_package = __import__(m.__name__.split(\'.\')[0]).__path__[0]\n        module_import = False\n\n    found_hashes = {}\n    # pycode = {}\n    resources[\'pycode\'] = {}\n    zip_buffer = io.BytesIO()\n    with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n        for root, dirs, files in os.walk(top_package):\n            for file in files:\n                if file.endswith(".py"):\n                    fpath = os.path.join(root, file)\n                    v = os.path.relpath(fpath, os.path.dirname(top_package) if not module_import else top_package)\n                    zip.write(fpath, v)\n                    if not fpath.endswith("_grade.py"): # Exclude grade files.\n                        with open(fpath, \'r\') as f:\n                            s = f.read()\n                        found_hashes[v] = python_code_str_id(s)\n                        resources[\'pycode\'][v] = s\n\n    resources[\'zipfile\'] = zip_buffer.getvalue()\n    resources[\'top_package\'] = top_package\n    resources[\'module_import\'] = module_import\n    resources[\'blake2b_file_hashes\'] = found_hashes\n    return resources, top_package\n\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\',  action="store_true",  help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\',  action="store_true",  help=\'Show Autolab results\')\n\ndef gather_report_source_include(report):\n    sources = {}\n    # print("")\n    # if not args.autolab:\n    if len(report.individual_imports) > 0:\n        print("By uploading the .token file, you verify the files:")\n        for m in report.individual_imports:\n            print(">", m.__file__)\n        print("Are created/modified individually by you in agreement with DTUs exam rules")\n        report.pack_imports += report.individual_imports\n\n    if len(report.pack_imports) > 0:\n        print("Including files in upload...")\n        for k, m in enumerate(report.pack_imports):\n            nimp, top_package = gather_imports(m)\n            _, report_relative_location, module_import = report._import_base_relative()\n\n            nimp[\'report_relative_location\'] = report_relative_location\n            nimp[\'report_module_specification\'] = module_import\n            nimp[\'name\'] = m.__name__\n            sources[k] = nimp\n            print(f" * {m.__name__}")\n    return sources\n\ndef gather_upload_to_campusnet(report, output_dir=None, token_include_plaintext_source=False):\n    # n = report.nL\n    args = parser.parse_args()\n    results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n                                          show_progress_bar=not args.noprogress,\n                                          big_header=not args.autolab,\n                                          generate_artifacts=False,\n                                          )\n    print("")\n    sources = {}\n    if not args.autolab:\n        results[\'sources\'] = sources = gather_report_source_include(report)\n\n    token_plain = """\n# This file contains your results. Do not edit its content. Simply upload it as it is. """\n\n    s_include = [token_plain]\n    known_hashes = []\n    cov_files = []\n    use_coverage = True\n    if report._config is not None:\n        known_hashes = report._config[\'blake2b_file_hashes\']\n        for Q, _ in report.questions:\n            use_coverage = use_coverage and isinstance(Q, UTestCase)\n            for key in Q._cache:\n                if len(key) >= 2 and key[1] == "coverage":\n                    for f in Q._cache[key]:\n                        cov_files.append(f)\n\n    for s in sources.values():\n        for f_rel, hash in s[\'blake2b_file_hashes\'].items():\n            if hash in known_hashes and f_rel not in cov_files and use_coverage:\n                print("Skipping", f_rel)\n            else:\n                if token_include_plaintext_source:\n                    s_include.append("#"*3 +" Content of " + f_rel +" " + "#"*3)\n                    s_include.append("")\n                    s_include.append(s[\'pycode\'][f_rel])\n                    s_include.append("")\n\n    if output_dir is None:\n        output_dir = os.getcwd()\n\n    payload_out_base = report.__class__.__name__ + "_handin"\n\n    obtain, possible = results[\'total\']\n    vstring = f"_v{report.version}" if report.version is not None else ""\n    token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n    token = os.path.normpath(os.path.join(output_dir, token))\n\n    save_token(results, "\\n".join(s_include), token)\n\n    if not args.autolab:\n        print("> Testing token file integrity...", sep="")\n        load_token(token)\n        print("Done!")\n        print(" ")\n        print("To get credit for your results, please upload the single unmodified file: ")\n        print(">", token)\n\n\ndef save_token(dictionary, plain_text, file_out):\n    if plain_text is None:\n        plain_text = ""\n    if len(plain_text) == 0:\n        plain_text = "Start token file"\n    plain_text = plain_text.strip()\n    b, b_hash = dict2picklestring(dictionary)\n    b_l1 = len(b)\n    b = "."+b+"."\n    b = "\\n".join( textwrap.wrap(b, 180))\n\n    out = [plain_text, token_sep, f"{b_hash} {b_l1}", token_sep, b]\n    with open(file_out, \'w\') as f:\n        f.write("\\n".join(out))\n\n\n\n\ndef source_instantiate(name, report1_source, payload):\n    # print("Executing sources", report1_source)\n    eval("exec")(report1_source, globals())\n    # print("Loaind gpayload..")\n    pl = pickle.loads(bytes.fromhex(payload))\n    report = eval(name)(payload=pl, strict=True)\n    return report\n\n\n__version__ = "0.1.30.2"\n\nfrom cs108.homework1 import add, reverse_list, linear_regression_weights, linear_predict, foo\nimport time\nimport numpy as np\nimport pickle\nimport os\n# from unitgrade.framework import dash\n\ndef mk_bad():\n    with open(os.path.dirname(__file__)+"/db.pkl", \'wb\') as f:\n        d = {\'x1\': 100, \'x2\': 300}\n        pickle.dump(d, f)\n\ndef mk_ok():\n    with open(os.path.dirname(__file__)+"/db.pkl", \'wb\') as f:\n        d = {\'x1\': 1, \'x2\': 2}\n        pickle.dump(d, f)\n\nclass Numpy(UTestCase):\n    z = 234\n\n    # def __getattr__(self, item):\n    #     print("hi there ", item)\n    #     return super().__getattr__(item)\n    #\n    # def __getattribute__(self, item):\n    #     print("oh hello sexy. ", item)\n    #     return super().__getattribute__(item)\n\n    @classmethod_dashboard\n    def setUpClass(cls) -> None:\n        print("Dum di dai, I am running some setup code here.")\n        for i in range(10):\n            print("Hello world", i)\n        print("Set up.") # must be handled seperately.\n        # assert False\n\n    # @cache\n    # def make_primes(self, n):\n    #     return primes(n)\n\n    # def setUp(self) -> None:\n    #     print("We are doing the setup thing.")\n\n    def test_bad(self):\n        """\n        Hints:\n            * Remember to properly de-indent your code.\n            * Do more stuff which works.\n        """\n        # raise Exception("This ended poorly")\n        # print("Here we go")\n        # return\n        # self.assertEqual(1, 1)\n        with open(os.path.dirname(__file__)+"/db.pkl", \'rb\') as f:\n            d = pickle.load(f)\n        # print(d)\n        # assert False\n        # for i in range(10):\n        from tqdm import tqdm\n        for i in tqdm(range(100)):\n            # print("The current number is", i)\n            time.sleep(.01)\n        self.assertEqual(1, d[\'x1\'])\n        for b in range(10):\n            self.assertEqualC(add(3, b))\n\n\n    def test_weights(self):\n        """\n            Hints:\n            * Try harder!\n            * Check the chapter on linear regression.\n        """\n        n = 3\n        m = 2\n        np.random.seed(5)\n        # from numpy import asdfaskdfj\n        # X = np.random.randn(n, m)\n        # y = np.random.randn(n)\n        foo()\n        # assert 2 == 3\n        # raise Exception("Bad exit")\n        # self.assertEqual(2, np.random.randint(1000))\n        # self.assertEqual(2, np.random.randint(1000))\n        # self.assertL2(linear_regression_weights(X, y), msg="the message")\n        self.assertEqual(1, 1)\n        # self.assertEqual(1,2)\n        return "THE RESULT OF THE TEST"\n\n\nclass AnotherTest(UTestCase):\n    def test_more(self):\n        self.assertEqual(2,2)\n\n    def test_even_more(self):\n        self.assertEqual(2,2)\n\nimport cs108\nclass Report2(Report):\n    title = "CS 101 Report 2"\n    questions = [\n        (Numpy, 10), (AnotherTest, 20)\n        ]\n    pack_imports = [cs108]'
+report1_payload = '8004954f040000000000007d94288c054e756d7079947d942868018c0a7365745570436c6173739486948c0474696d65948694473f3368000000000068018c08746573745f6261649486948c057469746c6594869468076801680786948c066173736572749486947d94284b004b034b014b044b024b054b034b064b044b074b054b084b064b094b074b0a4b084b0b4b094b0c7568016807869468058694473ff08006400000006801680786948c08636f7665726167659486947d948c1263733130382f686f6d65776f726b312e7079947d948c0e6465662061646428612c62293a20944b128ca12020202022222220476976656e2074776f206e756d626572732060616020616e642060626020746869732066756e6374696f6e2073686f756c642073696d706c792072657475726e2074686569722073756d3a0a202020203e2061646428612c6229203d20612b620a2020202048696e74733a0a20202020202020202a2052656d656d6265722062617369632061726974686d6574696373210a20202020222222948694737368018c0c746573745f7765696768747394869468098694681a6801681a8694680c86947d946801681a869468058694473f4b5800000000006801681a8694681286947d948c1263733130382f686f6d65776f726b312e7079947d94288c0b64656620666f6f28293a20944b168c162020202022222220436f6d6d656e742e2020202222229486948c0b6465662062617228293a20944b198c009486947573758c0b416e6f7468657254657374947d9428682d6803869468058694473f23d80000000000682d8c09746573745f6d6f7265948694680c86947d94682d6831869468058694473f21280000000000682d8c0e746573745f6576656e5f6d6f7265948694680c86947d94682d6837869468058694473f1a800000000000758c06636f6e666967947d948c13626c616b6532625f66696c655f686173686573945d94288c806362363363336235383635306636313037643763663138646136303635666135373835666261626564643135316639653761633335313139323635623039393838623266653335373632303961333932616133656236633134636131316439646335393937343831633531373863313533393665656662313539653163373536948c803434656331613338643134373639626433653234323663386232366539303830356336313361386161653266333966663665633433363133666562363465303739373435323062306536353134353063303637623763633637636631366134313835653736346334383331373763333335303063626563626362336234646466948c803638306336353638323633623832303737313365616434306539323663643265363835336130613936353861386338343738393564363633643730643262343666616163333336396133636564366239623964303436346563316366656465326235306265376432626636313432313638383936663332306338353232313066946573752e'
 name="Report2"
 
 report = source_instantiate(name, report1_source, report1_payload)
diff --git a/devel/example_devel/students/cs108/unitgrade_data/AnotherTest.pkl b/devel/example_devel/students/cs108/unitgrade_data/AnotherTest.pkl
index 24c5438e3054311e2708f4b9ded94f4653a2d38b..eb76b6799fb0255ed459c1f84ad96126dc0b79f2 100644
Binary files a/devel/example_devel/students/cs108/unitgrade_data/AnotherTest.pkl and b/devel/example_devel/students/cs108/unitgrade_data/AnotherTest.pkl differ
diff --git a/devel/example_devel/students/cs108/unitgrade_data/Numpy-test_weights.json.lock b/devel/example_devel/students/cs108/unitgrade_data/Numpy-test_weights.json.lock
deleted file mode 100755
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/devel/example_devel/students/cs108/unitgrade_data/Numpy.pkl b/devel/example_devel/students/cs108/unitgrade_data/Numpy.pkl
index 7c5e9c80131e80eb81efb165fc259dddb4775212..edbcd7bca6f04e6e156c6fc48c0a6c3c1d651207 100644
Binary files a/devel/example_devel/students/cs108/unitgrade_data/Numpy.pkl and b/devel/example_devel/students/cs108/unitgrade_data/Numpy.pkl differ
diff --git a/devel/example_devel/students/cs108/unitgrade_data/main_config_report_devel.artifacts.pkl b/devel/example_devel/students/cs108/unitgrade_data/main_config_report_devel.artifacts.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..93e73b00832ec7e5b3272af33d44b4c9612033a1
Binary files /dev/null and b/devel/example_devel/students/cs108/unitgrade_data/main_config_report_devel.artifacts.pkl differ
diff --git a/devel/example_devel/students/cs108/unitgrade_data/main_config_report_devel.json b/devel/example_devel/students/cs108/unitgrade_data/main_config_report_devel.json
deleted file mode 100644
index 9fc7ac2ff6f9dba2721fe6695e4811f5628c40be..0000000000000000000000000000000000000000
--- a/devel/example_devel/students/cs108/unitgrade_data/main_config_report_devel.json
+++ /dev/null
@@ -1 +0,0 @@
-{"encoding_scheme": " from unitgrade_private.hidden_gather_upload import dict2picklestring, picklestring2dict;", "questions": "/Td6WFoAAATm1rRGAgAhARYAAAB0L+Wj4AQcAjVdAEABDm5i8vf61cV4iM6ul0/3ELnVhbfZugbR5l8KiW5BMDZ6L8RzKzXjQq+BhcgH2MCJ1m9+eUsGtZHT9kvtqsxPVkTSO3NwafxFXIS31YBI97jN5gntTcpCbg9t7AU0q//uau3ShvdPaadcLZuF/lN1xnW+JdPnvUDda+75aqeRNDn+kY3o89kwQiwQhudeIbf1KsgHaP3ro1KTBEyGIx+RfVFRmLUamFJv+PaDrgWnfH2G15B/Nw97c00KtNTs8nnKN9mzCxdAcg/ipvo1F9Iq6RqoOykxE//nfhuWxpJFQaIvYGmBXBzVSuJKP9HL5/4OuCCZJxyDdDrb+1Ec0nfy8m+hZpw/HNNA9vdgHpEHsYrqqGaOzF49QL+ZOsYdqe46XdqwI0KykT/fsfKyiaF1y8SoMkrom6BX5hE1iK8VDQgB8wzazLGdon9I90kBgi8J4pLlUgKHOG38Ch8RyvZWdpc/B5KMisnFMlRShbamdtZOpBNTVc9zzOTq7XsQqitkOQxL2ZBO/lUcN5LZne6uxCzM5wxtqDUnQVZONK0QzpXWmJUIdmxmDdX8gXlVM6uxSVd1fx0X0usMqy/syHGMltcQcywlRoYx5WZXtuZiwHbWvt05Jy++cClwYPgC01nUeWpLsULl8s0L0nE7M06h4hzhnZ7duF/cI3rUyWNCu8l3G+SkmMtimYrN9dZ3Nqpshvni0LreBYTO7M/BXNi6jBpHAMxLJGyEA/O1f0LAIuqSmoYAAAAASHWmfOv1ibsAAdEEnQgAAFbVjq6xxGf7AgAAAAAEWVo=", "root_dir": "/home/tuhe/Documents/unitgrade_private/devel/example_devel/instructor", "relative_path": "cs108/report_devel.py", "modules": ["cs108", "report_devel"], "token_stub": "cs108/Report2_handin"}
\ No newline at end of file
diff --git a/devel/example_devel/students/cs108/unitgrade_data/main_config_report_devel.json.lock b/devel/example_devel/students/cs108/unitgrade_data/main_config_report_devel.json.lock
deleted file mode 100755
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/devel/example_devel/students/cs108/unitgrade_data/report_devel.json.lock b/devel/example_devel/students/cs108/unitgrade_data/report_devel.json.lock
deleted file mode 100755
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/docs/presentation2022/beamer_slider_preamble.tex b/docs/presentation2022/beamer_slider_preamble.tex
new file mode 100644
index 0000000000000000000000000000000000000000..02f19efc73e73bfd58d4c48a1651c90a36dc7746
--- /dev/null
+++ b/docs/presentation2022/beamer_slider_preamble.tex
@@ -0,0 +1,93 @@
+% WARNING! This file was automatically generated; see slider/DTU_Beamer_files for original version.
+\usepackage[T1]{fontenc}
+\usepackage[utf8]{inputenc}
+\usepackage[english]{babel}
+\usepackage{pgfplots}
+\pgfplotsset{compat=newest}
+\usepackage{booktabs}
+\usepackage{siunitx}
+
+\usepackage[inkscape=true,inkscapeformat=pdf,inkscapelatex=true]{svg}
+\svgpath{osvgs/}
+
+\usepackage{url}
+\usepackage{pmboxdraw}
+\usepackage{amssymb}
+\usepackage{pgffor}
+	
+\usetheme[department=compute]{DTU}
+\newcommand{\tabitem}{{\color{dtured}$\bullet$} }
+\usepackage[absolute,overlay]{textpos}
+\textblockorigin{0mm}{0mm}
+
+\setlength{\TPHorizModule}{\paperwidth}
+\setlength{\TPVertModule}{\paperheight}
+
+% Latin Modern
+\usepackage{lmodern}
+\newcommand{\overlabel}[1]{ \begin{textblock}{1}(0,0) \url{#1} \end{textblock} }
+
+% Verdana font type
+%\usepackage{verdana}
+% Helvetica
+%\usepackage{helvet}
+% Times (text and math)
+%\usepackage{newtx, newtxmath}
+
+% \usetheme[department=compute]{DTU}
+
+\makeatletter
+
+\def\osvg{\@ifnextchar[{\@with}{\@without} }
+\def\@with[#1]#2{
+	\foreach[count=\n] \x in {#1}{
+		\iftoggle{overlabel_includesvgs}{
+			\IfFileExists{osvgs/x_do_not_edit_#2-l\n_nofonts.pdf}{
+			\begin{textblock}{1}(0,0)
+				\includegraphics<\x>[width=1.0\linewidth]{osvgs/x_do_not_edit_#2-l\n_nofonts}
+			\end{textblock}
+			}{ File: \url{osvgs/x_do_not_edit_#2-l\n_nofonts.pdf} does not exist; bad layer import? Check \url{osvgs/#2.svg} including layer information.
+			}
+		}
+	}
+	\olabel{#2}
+}
+\def\@without#1{
+	% Try to include first 10 layer files if they are there.
+	\foreach[count=\n] \x in {1,...,10}{
+		\iftoggle{overlabel_includesvgs}{
+			\IfFileExists{osvgs/x_do_not_edit_#1-l\n_nofonts.pdf}{
+				\begin{textblock}{1}(0,0)
+					\includegraphics<\n->[width=1.0\linewidth]{osvgs/x_do_not_edit_#1-l\n_nofonts}
+				\end{textblock}
+			}{
+		}
+	}
+	}
+	\olabel{#1}
+}
+\newcommand{\olabel}[1]{
+	\iftoggle{overlabel_includelabels}{
+		\begin{textblock}{1}(0,0) \url{#1} \end{textblock}
+	}{ 
+	\begin{textblock}{1}(0,0) 	{\color{white} \url{#1} } \end{textblock}
+	}
+}
+
+\makeatother
+
+\makeatother
+\ifdefined\bluem
+% nothing.
+\else
+
+\newcommand\bluem[1]{{\textcolor[rgb]{0.20, 0.40, 0.80}{ #1 }}}
+\newcommand\redm[1]{{\textcolor[rgb]{0.60, 0.00, 0.00}{ #1 }}}
+\newcommand\greenm[1]{{\textcolor[HTML]{398E00}{ #1 }}}
+\newcommand\yellowm[1]{{\textcolor[rgb]{1.00, 0.80, 0.00}{ #1 }}}
+				
+\newcommand\bluet[1]{{\textcolor[rgb]{0.20, 0.40, 0.80}{\textbf{#1}}}}
+\newcommand\redt[1]{{\textcolor[rgb]{0.60, 0.00, 0.00}{\textbf{#1}}}}
+\newcommand\greent[1]{{\textcolor[HTML]{398E00}{\textbf{#1}}}}
+\newcommand\yellowt[1]{{\textcolor[rgb]{1.00, 0.80, 0.00}{\textbf{#1}}}}
+\fi
\ No newline at end of file
diff --git a/docs/presentation2022/beamercolorthemeDTU.sty b/docs/presentation2022/beamercolorthemeDTU.sty
new file mode 100644
index 0000000000000000000000000000000000000000..c16cc4968c266afd2ddb82305dc861dfb48960bc
--- /dev/null
+++ b/docs/presentation2022/beamercolorthemeDTU.sty
@@ -0,0 +1,29 @@
+% beamercolorthemeDTU.sty
+% This file is a part of the DTU beamer package and makes sure that
+% the DTU colours are available. This file does neither redefine 
+% beamer settings, nor does it add new configurations. It has to be 
+% maintained for backward compatibility.
+%
+% Changelog
+% 2011-06-23 jowr Replaced the old colour definitions with the new ones from the design guide
+% 2011-07-05 jowr Added alternative colours for the graphs
+% 2011-08-16 jowr Moved colour definitions to resources folder, also used in poster class
+% 2014-09-27 jowr Added documentation and prepared merge to git repository
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Load the file if it exists, throw a warning otherwise
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\InputIfFileExists{dtucolours}{
+    \PackageInfo{dtubeamer}{Successfully loaded the DTU colours.}
+  }{
+    \PackageWarning{dtubeamer}{Could not load the colours from dtucolours.sty. This compilation is likely to fail.}
+  }%
+
+\mode<presentation>
+
+% The new design does not need any adaption here, black is 
+% the default colour. 
+
+\mode<all> 
\ No newline at end of file
diff --git a/docs/presentation2022/beamerfontthemeDTU.sty b/docs/presentation2022/beamerfontthemeDTU.sty
new file mode 100644
index 0000000000000000000000000000000000000000..2030ae7eadb1a09a8d125e99c39bd487a1ca0992
--- /dev/null
+++ b/docs/presentation2022/beamerfontthemeDTU.sty
@@ -0,0 +1,38 @@
+% Copyright 2014 by Remus Mihail Prunescu
+
+% LaTeX Support Group 2014
+% DTU Official Presentation
+
+% For PDFLATEX
+\usefonttheme{professionalfonts}
+
+% Title font
+\setbeamerfont{title}{size=\large, series=\bfseries}
+\setbeamercolor{title}{fg=black}
+
+% Subtitle font
+\setbeamerfont{subtitle}{size=\small, series=\normalfont}
+
+% Author font
+\setbeamerfont{author}{size=\small, series=\normalfont}
+
+% Footline
+\setbeamerfont{framecounter in head/foot}{size=\tiny}
+\setbeamerfont{department in head/foot}{size=\tiny, series=\bfseries}
+\setbeamerfont{title in head/foot}{size=\tiny}
+\setbeamerfont{date in head/foot}{size=\tiny}
+
+% Frametitle
+\setbeamerfont{frametitle}{size=\large, series=\bfseries}
+\setbeamerfont{block body}{size=\small}
+\setbeamerfont{section title}{size=\small}
+\setbeamerfont{block body alerted}{size=\small}
+\setbeamerfont{block body example}{size=\small}
+\setbeamerfont{block title}{size=\large,parent={structure,block body}}
+\setbeamerfont{block title alerted}{parent={block title,alerted text}}
+\setbeamerfont{block title example}{parent={block title,example text}}
+\setbeamerfont{itemize/enumerate body}{size=\small}
+
+% Colors
+\setbeamercolor{frametitle}{fg=black}
+\setbeamercolor{structure}{fg=black}
\ No newline at end of file
diff --git a/docs/presentation2022/beamerinnerthemeDTU.sty b/docs/presentation2022/beamerinnerthemeDTU.sty
new file mode 100644
index 0000000000000000000000000000000000000000..4a2124bf35dac879a71851c642f01433b16c35d6
--- /dev/null
+++ b/docs/presentation2022/beamerinnerthemeDTU.sty
@@ -0,0 +1,52 @@
+% Copyright 2007 by Till Tantau
+% Copyright 2010 by Remus Mihail Prunescu
+
+% LaTeX Support Group 2010
+% DTU Official Presentation
+
+
+\mode<presentation>
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Title page: DTU
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\defbeamertemplate*{title page}{DTU}[1][]
+{
+	% Set bInTitle to true to make sure the right footline is printed
+	\global\edef\bInTitle{true}
+	
+	\linespread{1.45}
+	% Content of the title page
+	
+	% Title + Subtitle
+	\vspace{\dimTitleOffset}
+	\begin{beamercolorbox}[left]{title box}
+		\usebeamerfont{title}\usebeamercolor[fg]{title}\inserttitle\par
+		\ifx\insertsubtitle\@empty
+		\else
+			\vspace{\dimSubtitleOffset}
+			{\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}\insertsubtitle\par}
+		\fi
+	\end{beamercolorbox}
+	
+	\vspace{\dimAuthorOffset}
+	% Author
+	\begin{beamercolorbox}[left]{author box}
+		\usebeamerfont{author}\usebeamercolor[fg]{author}\insertauthor
+	\end{beamercolorbox}
+	
+	\vspace{\dimInstituteOffset}% Institute
+	\begin{beamercolorbox}[left]{institute box}
+		\usebeamerfont{institute}\usebeamercolor[fg]{author}\insertinstitute
+	\end{beamercolorbox}
+
+	% Title graphic
+	{\usebeamercolor[fg]{titlegraphic}\inserttitlegraphic\par}
+	
+	% Fill the space till bottom
+	\vskip0pt plus 1filll
+}
+
+\mode
+<all> 
diff --git a/docs/presentation2022/beamerouterthemeDTU.sty b/docs/presentation2022/beamerouterthemeDTU.sty
new file mode 100644
index 0000000000000000000000000000000000000000..8c8df22022457b287d7328894527deab5bc94d9e
--- /dev/null
+++ b/docs/presentation2022/beamerouterthemeDTU.sty
@@ -0,0 +1,98 @@
+% Copyright 2014 by Remus Mihail Prunescu
+
+% LaTeX Support Group 2014
+% DTU Official Presentation
+
+\mode<presentation>
+
+\setbeamercolor*{framecounter in head/foot}{parent=palette tertiary}
+\setbeamercolor*{department in head/foot}{parent=palette tertiary}
+\setbeamercolor*{title in head/foot}{parent=palette tertiary}
+\setbeamercolor*{date in head/foot}{parent=palette tertiary}
+
+% No navigation symbols
+\setbeamertemplate{navigation symbols}{} 
+
+% Header
+\setbeamertemplate{headline}
+{
+	\ifdefstring{\bDTUWhiteFrame}{true}
+	{
+		\insertFrameDTUWhiteLogo
+	}
+	{
+		\ifdefstring{\bInTitle}{true}
+		{
+			\insertTitleDTULogo
+		}
+		{
+			\insertFrameDTULogo
+		}
+	}
+}
+
+% Footer
+\setbeamertemplate{footline}
+{
+	\ifdefstring{\bInTitle}{true}
+	{
+		\vspace{-0.35\paperheight}
+		\begin{beamercolorbox}[wd=\paperwidth]{title bottom}
+			\vbox{%
+				\makebox[0pt][l]{\hspace{\dimDTUDepLogoXOffset}\insertdepartmentlogoA}%
+				\vbox{%
+					\hspace{\dimDTUFriseXOffset}%
+					\makebox[0pt][l]{\insertDTUFrise}%
+					\vspace{\dimDTUDepFriseOffset}%
+				}%
+			}%
+			\vspace{\dimDTUFriseYOffset}
+		\end{beamercolorbox}
+		\global\def\bInTitle{false}
+	}
+	{
+		\ifdefstring{\bDTUWhiteFrame}{true}
+		{
+		}
+		{ %
+			\hbox{ %
+				\hspace{\dimTextLeftMargin}\hspace{-1.5pt}\insertframenumber %
+				\setlength{\widthframenumber}{2em + \widthof{\insertframenumber}} %
+				\setlength{\widthdepartment}{1em + \widthof{\insertdepartmentandinstitute}} %
+				\setlength{\widthdate}{1em + \widthof{00 00000000 0000}} % Tue: Added extra 0's (2 to 7) to prevent wrap
+				\setlength{\widthtitle}{\textwidth-\widthframenumber-\widthdepartment-\widthdate-\dimTextLeftMargin-\dimTextLeftMargin} %
+				%\parbox[t]{\widthframenumber}{\insertframenumber} %
+				\parbox[t]{\widthdepartment}{\insertdepartmentandinstitute} %
+				\parbox[t]{\widthtitle}{\raggedleft\insertshorttitleinfooter} %
+				\parbox[t]{\widthdate}{\raggedleft\DTUDateFormat\insertdate} %
+				\vspace{\dimFootlineYOffset} %
+			}
+		}
+	}
+}
+
+% Position the frame title so that it would get into the headline
+\setbeamertemplate{frametitle}
+{
+	\vspace{\dimPlaceTitleInHeader}
+	\ifdefstring{\inShowSection}{true}
+	{
+			\usebeamerfont{section title}\color{black!20}%
+			\ifnumcomp{\thesection}{=}{0}{%
+				\ \par%
+			}
+			{%
+				\insertsection\par
+			}
+	}
+	{
+		\vspace{\dimFrameTitleOffset}
+	}
+	\vspace{-1pt}\usebeamerfont{frametitle}%
+	\ifdefstring{\bDTUWhiteFrame}{true}{\color{white}}{\color{black}}%
+	\insertframetitle
+	\vspace{\dimAfterFrameTitleOffset}
+}
+
+\mode
+<all>
diff --git a/docs/presentation2022/beamerthemeDTU.sty b/docs/presentation2022/beamerthemeDTU.sty
new file mode 100644
index 0000000000000000000000000000000000000000..bafcd2e2eecb98490ef826c7e2cee0b5103d5c7b
--- /dev/null
+++ b/docs/presentation2022/beamerthemeDTU.sty
@@ -0,0 +1,255 @@
+% Copyright Remus Mihail Prunescu
+
+% LaTeX Support Group
+% DTU Official Presentation
+
+\mode<presentation>
+
+\RequirePackage{etoolbox}
+\RequirePackage{datetime}
+\RequirePackage{keyval}
+\RequirePackage{calc}
+
+% Enlarge slide size
+\beamer@paperwidth 1.09375\beamer@paperwidth%
+\beamer@paperheight 1.09375\beamer@paperheight%
+
+% Extra package
+\InputIfFileExists{departments}%
+	{\ClassInfo{}{The file departments.tex with department logo file naming has been loaded.}}%
+	{\ClassInfo{}{The file departments.tex is missing. Consult the manual.}%
+}%
+
+% Default values for options
+\newcommand{\inDepartmentShortName}{elektro}
+\newcommand{\inLanguage}{english}
+\newcommand{\inShowSection}{true}
+
+% Check language
+\@ifpackagewith{babel}{danish}{%
+	\renewcommand{\inLanguage}{danish}%
+}{}
+
+
+% Save options
+\DeclareOptionBeamer{department}{\renewcommand{\inDepartmentShortName}{#1}}
+\DeclareOptionBeamer{showsection}{\renewcommand{\inShowSection}{#1}}
+\ProcessOptionsBeamer
+
+% % % % % % % % % % % %
+% Define Dimensions
+% % % % % % % % % % % %
+
+\newcommand{\dimDTULogoWidth}{0.0394\paperwidth} % Percent
+\newcommand{\dimDTULogoHeight}{0.0777\paperheight} % Percent
+\newcommand{\dimDTULogoYOffset}{0.0404\paperheight} % Percent
+\newcommand{\dimDTULogoXOffset}{0.9176\paperwidth} % Percent
+
+\newcommand{\dimDTUDepLogoXOffset}{0.062\paperwidth} % Percent
+\newcommand{\dimDTUDepLogoHeight}{0.0897\paperheight} % Percent
+
+\newcommand{\dimDTUFriseYOffset}{0.03\paperheight} % Percent
+\newcommand{\dimDTUFriseXOffset}{0.418\paperwidth} % Percent
+\newcommand{\dimDTUFriseHeight}{0.3412\paperheight} % Percent
+\newcommand{\dimDTUDepFriseOffset}{0.018\paperheight} % Percent
+
+\newcommand{\dimTitleOffset}{0.148\paperheight}
+\newcommand{\dimSubtitleOffset}{0.0175\paperheight}
+\newcommand{\dimFrameTitleOffset}{0.033\paperheight}
+\newcommand{\dimAfterFrameTitleOffset}{-0.008\paperheight}
+\newcommand{\dimAuthorOffset}{0.06\paperheight}
+\newcommand{\dimInstituteOffset}{0.027\paperheight}
+
+\newcommand{\dimFootlineYOffset}{0.025\paperheight} % Tue: This was 0.0355 in original file
+
+\newcommand{\dimLeftMarginI}{0.02\paperwidth}
+\newcommand{\dimTextLeftMargin}{0.0669\paperwidth} % Percent
+
+\newcommand{\dimPlaceTitleInHeader}{-0.09\paperheight}
+
+
+\makeatletter
+\setbeamersize{text margin left=\dimTextLeftMargin, text margin right=\dimTextLeftMargin}
+\makeatother
+
+% % % % % % % % % % % %
+% End of Dimensions
+% % % % % % % % % % % %
+
+% New commands to be used in the DTU template
+%\newcommand{\insertdepartmentandinstitute}{\departmenttitle , \institutetitle}
+\newcommand{\insertdepartmentandinstitute}{\departmenttitle}
+\newcommand{\insertDTULogo}{\includegraphics[width=\dimDTULogoWidth]{tex_dtu_logo}}
+\newcommand{\insertDTUWhiteLogo}{}
+\newcommand{\inserttitlefootline}{}
+\newcommand{\inserttitleheadline}{}
+\newcommand{\institutetitle}{}
+
+% Internal variable to check if \titlepage was called: false by default
+\def\bInTitle{false}
+\def\bDTUWhiteFrame{false}
+
+% Process language
+% Is it DK or UK?
+\ifdefstring{\inLanguage}{danish}
+{
+	\renewcommand{\institutetitle}{Danmarks Tekniske Universitet}
+	\renewcommand{\insertDTUWhiteLogo}{\includegraphics[height=\dimDTULogoHeight]{tex_dtu_dk_a1_neg}}
+}
+{
+	\ifdefstring{\inLanguage}{english}
+	{
+		\renewcommand{\institutetitle}{Technical University of Denmark}
+		\renewcommand{\insertDTUWhiteLogo}{\includegraphics[height=\dimDTULogoHeight]{tex_dtu_uk_a1_neg}}
+	}
+	{
+		% Undefined language
+		% Default values are used
+	}
+}
+
+\ifcsdef{department@\inDepartmentShortName}
+{
+	\activateDepartmentInfo{\inLanguage}{\inDepartmentShortName}
+}
+{
+	\PackageError{DTU Beamer Template}{Department is undefined. Reverting to default (elektro).}{Check the user guide for defined departments. If you cannot find it then contact support group to add the department.}
+	\activateDepartmentInfo{\inLanguage}{elektro}
+}
+
+% Command for generating the department title
+\newcommand{\departmenttitle}{\thedepartmentNameText}
+% Command for inserting the department logo
+\newcommand{\insertdepartmentlogoA}{%
+	\ifdefstring{\inDepartmentShortName}{admin}
+	{
+	}
+	{
+		\includegraphics[height=\dimDTUDepLogoHeight]{\thedepartmentLogo}
+	}
+}
+% Command for inserting frise
+\newcommand{\insertDTUFrise}{\includegraphics[height=\dimDTUFriseHeight]{\thedepartmentFrise}}
+
+% Command used from frame DTU logo (headline)
+\newcommand{\insertFrameDTULogo}
+{
+	\vspace{\dimDTULogoYOffset}
+	\begin{beamercolorbox}[right]{logo in head/foot}%
+		\insertDTULogo\makebox[\dimDTULogoWidth][]{}
+	\end{beamercolorbox}
+}
+\newcommand{\insertFrameDTUWhiteLogo}
+{
+	\vspace{\dimDTULogoYOffset}
+	\begin{beamercolorbox}[right]{logo in head/foot}%
+		\insertDTUWhiteLogo\makebox[\dimDTULogoWidth][]{}
+	\end{beamercolorbox}
+}
+
+% Command used in title page for inserting the DTU logo in headline
+\newcommand{\insertTitleDTULogo}
+{
+	\insertFrameDTULogo
+}
+
+% Change themes
+\usefonttheme{DTU}
+\useoutertheme{DTU}
+\useinnertheme{DTU}
+\usecolortheme{DTU}
+
+% Left margin for list environment
+\setlength{\leftmargini}{\dimLeftMarginI}
+
+% Adjust bullets placement
+\setlength\labelsep{3pt}
+
+\setbeamersize{text margin left=\dimTextLeftMargin}
+
+% Itemize
+\setbeamertemplate{items}[circle]
+\setbeamercolor{itemize item}{fg=dtured}
+\setbeamercolor{itemize subitem}{fg=dtured}
+
+\setbeamerfont{section in toc}{size=\small}
+\setbeamerfont{subsection in toc}{size=\scriptsize}
+
+\setbeamertemplate{enumerate items}[circle]
+\setbeamercolor{item projected}{fg=white,bg=dtured}
+
+% Table of contents
+\setbeamertemplate{section in toc}{%
+	\color{dtured}$\bullet$  \inserttocsection \par}
+
+\setbeamertemplate{subsection in toc}{
+	\hskip1em{\color{dtured}$\bullet$} \inserttocsubsection \par}
+
+% Fix space between sections and subsections in toc
+\makeatletter
+\patchcmd{\beamer@sectionintoc}
+  {\vfill}
+  {\vskip\itemsep}
+  {}
+  {}
+\pretocmd{\beamer@subsectionintoc}
+  {\vskip0.5\itemsep}
+  {}
+  {}
+\makeatother 
+
+
+% Date format
+\newcommand{\DTUDateFormat}{\DTUDate}
+\newdateformat{DTUDate}{\THEDAY.\THEMONTH.\THEYEAR}
+
+% Customize blocks
+\setbeamertemplate{blocks}[rounded][shadow=true]
+\setbeamercolor{block title}{fg=white,bg=dtured}
+\setbeamerfont{block title}{series=\bfseries\small}
+\setbeamercolor{block body}{fg=black,bg=white}
+
+
+\newcommand{\defaultDTUFrameStyle}{
+	\setbeamertemplate{background}{}
+	\color{black}
+}
+
+% White DTU frame
+\makeatletter
+\define@key{beamerframe}{dtuwhitelogo}[true]{%
+	\global\def\bDTUWhiteFrame{true}
+	\color{white}
+}
+\define@key{beamerframe}{bgfilename}{%
+	\setbeamertemplate{background}{
+		\includegraphics[width=\paperwidth,height=\paperheight,keepaspectratio]{#1}
+	}
+}
+% Default framestyle
+\pretocmd{\beamer@@@@frame}
+{
+	\global\def\bDTUWhiteFrame{false}
+	\defaultDTUFrameStyle
+}
+{}{}
+\makeatother
+
+% Lengths for footer
+\newlength{\widthframenumber}
+\newlength{\widthdepartment}
+\newlength{\widthtitle}
+\newlength{\widthdate}
+
+% Short title for the footer
+\makeatletter
+\newcommand\insertshorttitleinfooter{%
+	\beamer@shorttitle%
+}
+\makeatother
+
+% Description list
+\setbeamercolor{description item}{fg=dtured}
+
+\mode
+<all>
diff --git a/docs/presentation2022/blank.png b/docs/presentation2022/blank.png
new file mode 100644
index 0000000000000000000000000000000000000000..082daebc2e8b00d950bcd22987c75a26f0349d97
Binary files /dev/null and b/docs/presentation2022/blank.png differ
diff --git a/docs/presentation2022/cache.pkl b/docs/presentation2022/cache.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..061fc4dcb97957a0b288a305632cd06858ed3b35
Binary files /dev/null and b/docs/presentation2022/cache.pkl differ
diff --git a/docs/presentation2022/departments.tex b/docs/presentation2022/departments.tex
new file mode 100644
index 0000000000000000000000000000000000000000..09eb3308e6ba9389bb20dadfb8712873235c1c89
--- /dev/null
+++ b/docs/presentation2022/departments.tex
@@ -0,0 +1,130 @@
+% departments.tex
+% This file is a part of the DTU letter package and contains the file path for
+% the grahic file, and text name for the different departments.
+%
+% Changelog
+% 2010-04-07 Added % at the end of each line to make it possible to use the definitions in the documentation
+% 2010-04-09 Added the 5th mandatory argument (long text name)
+% 2010-04-23 Moved the new argument, #6, to #4 and added all info. However two graphic files are missing and I have therefore made a test: if the graphic file is missing the administration logo is used.  
+% 2013-02-11 Added compute and diplom department entries.  Added check to see that the department macros are defined, otherwise an error is printed.
+% 
+%\makeDepartmentInfo{<danish|english>}{<departmentname>}{<text graphic file name>}{<Big department logo file name>}{<department text name>}{<department long text name>}
+%
+
+\RequirePackage{etoolbox}
+
+\newcommand\setDepartmentNameLogo[1]{\def\@departmentNameLogo{#1}}%
+\newcommand\thedepartmentNameLogo{\@departmentNameLogo}%
+\newcommand\setDepartmentNameText[1]{\def\@departmentNameText{#1}}%
+\newcommand\thedepartmentNameText{\@departmentNameText}%
+\newcommand\setDepartmentLongNameText[1]{\def\@departmentLongNameText{#1}}%
+\newcommand\thedepartmentLongNameText{\@departmentLongNameText}%
+\newcommand\setDepartmentLogo[1]{\def\@departmentLogo{#1}}%
+\newcommand\thedepartmentLogo{\@departmentLogo}%
+\newcommand\setDepartmentFrise[1]{\def\@departmentFrise{#1}}%
+\newcommand\thedepartmentFrise{\@departmentFrise}%
+%
+\newcommand\createDepartment[1]{%
+\expandafter\def\csname department@#1\endcsname{#1}}%
+%
+\newcommand\aliasDepartment[2]{%
+\expandafter\def\csname department@#2\endcsname{#1}}%
+%
+\ifundef{\makeDepartmentInfo}{%
+	\newcommand\makeDepartmentInfo[7]{%
+		\def\@departmentcmd{\csname department@#2\endcsname}
+		\createDepartment{#2}
+		\expandafter\def\csname namelogo#1@\@departmentcmd\endcsname{\setDepartmentNameLogo{#3}}%
+		\expandafter\def\csname deplogo#1@\@departmentcmd\endcsname{\setDepartmentLogo{#4}}%
+		\expandafter\def\csname depfrise#1@\@departmentcmd\endcsname{\setDepartmentFrise{#5}}%
+		\expandafter\def\csname nametext#1@\@departmentcmd\endcsname{\setDepartmentNameText{#6}}%
+		\expandafter\def\csname namelongtext#1@\@departmentcmd\endcsname{\setDepartmentLongNameText{#7}}%
+		
+	}%
+}{}%
+%
+\newcommand\activateDepartmentInfo[2]{%
+	\ifcsname department@#2\endcsname%
+		\def\@departmentcmd{\csname department@#2\endcsname}%
+	\else%
+		\def\@departmentcmd{\department@admin}%
+	\fi%
+	\csname namelogo#1@\@departmentcmd\endcsname% TODO test if command exists before executing it
+	\csname nametext#1@\@departmentcmd\endcsname%
+	\csname namelongtext#1@\@departmentcmd\endcsname%
+	\csname deplogo#1@\@departmentcmd\endcsname%
+	\csname depfrise#1@\@departmentcmd\endcsname%
+	% \fromdepartment{\thedepartmentLongNameText}
+}%
+%
+\makeDepartmentInfo{danish} {aqua}{tex_aqua_dk}{tex_dtu_aqua_a}{tex_dtu_aqua_frise}{DTU Aqua}{Institut for Akvatiske Ressourcer}%
+\makeDepartmentInfo{english}{aqua}{tex_aqua_uk}{tex_dtu_aqua_a_uk}{tex_dtu_aqua_frise}{DTU Aqua}{National Institute of Aquatic Resources}%
+
+\makeDepartmentInfo{danish} {byg}{tex_byg_dk}{tex_dtu_byg_a}{tex_dtu_byg_frise}{DTU Byg}{Institut for Byggeri og Anl\ae g}%
+\makeDepartmentInfo{english}{byg}{tex_byg_uk}{tex_dtu_byg_a_uk}{tex_dtu_byg_frise}{DTU Civil Engineering}{Department of Civil Engineering}%
+
+\makeDepartmentInfo{danish}{compute}{tex_compute_uk}{tex_dtu_compute_a}{tex_dtu_frise}{DTU Compute}{Institut for Matematik og Computer Science}
+\makeDepartmentInfo{english}{compute}{tex_compute_uk}{tex_dtu_compute_a_uk}{tex_dtu_frise}{DTU Compute}{Department of Applied Mathematics and Computer Science}
+
+\makeDepartmentInfo{danish} {elektro}{tex_elektro_dk}{tex_dtu_elektro_a}{tex_dtu_frise}{DTU Elektro}{Institut for Elektroteknologi}
+\makeDepartmentInfo{english}{elektro}{tex_elektro_uk}{tex_dtu_elektro_a_uk}{tex_dtu_frise}{DTU Electrical Engineering}{Department of Electrical Engineering}
+
+\makeDepartmentInfo{danish} {energi}{tex_energikonvertering_dk}{tex_dtu_energi_a}{tex_dtu_energi_frise}{DTU Energi}{Institut for Energikonvertering og -lagring}
+\makeDepartmentInfo{english}{energi}{tex_energikonvertering_uk}{tex_dtu_energi_a_uk}{tex_dtu_energi_frise}{DTU Energy}{Department of Energy Conversion and Storage}
+
+\makeDepartmentInfo{danish} {fotonik}{tex_fotonik_dk}{tex_dtu_fotonik_a}{tex_dtu_frise}{DTU Fotonik}{Institut for Fotonik}
+\makeDepartmentInfo{english}{fotonik}{tex_fotonik_uk}{tex_dtu_fotonik_a_uk}{tex_dtu_frise}{DTU Fotonik}{Department of Photonics Engineering}
+
+\makeDepartmentInfo{danish} {fysik}{tex_fysik_dk}{tex_dtu_fysik_a}{tex_dtu_fysik_frise}{DTU Fysik}{Institut for Fysik}
+\makeDepartmentInfo{english}{fysik}{tex_fysik_uk}{tex_dtu_fysik_a_uk}{tex_dtu_fysik_frise}{DTU Physics}{Department of Physics}
+
+\makeDepartmentInfo{danish} {food}{tex_fodevareinstituttet_dk}{tex_dtu_fdevareinstituttet_a}{tex_dtu_frise}{DTU F\o devareinstituttet}{F\o devareinstituttet}
+\makeDepartmentInfo{english}{food}{tex_fodevareinstituttet_uk}{tex_dtu_fdevareinstituttet_a_uk}{tex_dtu_frise}{DTU Food}{National Food Institute}
+
+\makeDepartmentInfo{danish} {kemi}{tex_kemi_dk}{tex_dtu_kemi_a}{tex_dtu_kemi_frise}{DTU Kemi}{Institut for Kemi}
+\makeDepartmentInfo{english}{kemi}{tex_kemi_uk}{tex_dtu_kemi_a_uk}{tex_dtu_kemi_frise}{DTU Chemistry}{Department of Chemistry}
+
+\makeDepartmentInfo{danish} {kemiteknik}{tex_kemiteknik_dk}{tex_dtu_kemiteknik_a}{tex_dtu_kemiteknik_frise}{DTU Kemiteknik}{Institut for Kemiteknik}
+\makeDepartmentInfo{english}{kemiteknik}{tex_kemiteknik_uk}{tex_dtu_kemiteknik_a_uk}{tex_dtu_kemiteknik_frise}{DTU Chemical Engineering}{Department of Chemical and Biochemical Engineering}
+
+\makeDepartmentInfo{danish} {management}{tex_management_dk}{tex_dtu_management_a}{tex_dtu_frise}{DTU Management}{Institut for Systemer, Produktion og Ledelse}
+\makeDepartmentInfo{english}{management}{tex_management_uk}{tex_dtu_management_a_uk}{tex_dtu_frise}{DTU Management Engineering}{Department of Management Engineering}
+
+\makeDepartmentInfo{danish} {mekanik}{tex_mekanik_dk}{tex_dtu_mekanik_a}{tex_dtu_mek_frise}{DTU Mekanik}{Institut for Mekanisk Teknologi}
+\makeDepartmentInfo{english}{mekanik}{tex_mekanik_uk}{tex_dtu_mekanik_a_uk}{tex_dtu_mek_frise}{DTU Mechanical Engineering}{Department of Mechanical Engineering}
+
+\makeDepartmentInfo{danish} {miljo}{tex_miljo_dk}{tex_dtu_milj_a}{tex_dtu_miljoe_frise}{DTU Milj\o}{Institut for Vand og Milj\o teknologi}
+\makeDepartmentInfo{english}{environmentalEng}{tex_miljo_uk}{tex_dtu_milj_a_uk}{tex_dtu_miljoe_frise}{DTU Environment}{Department of Environmental Engineering}
+
+\makeDepartmentInfo{danish} {nanotek}{tex_nanotek_dk}{tex_dtu_nanotek_a}{tex_dtu_frise}{DTU Nanotek}{Institut for Mikro- og Nanoteknologi}
+\makeDepartmentInfo{english}{nanotek}{tex_nanotek_uk}{tex_dtu_nanotek_a_uk}{tex_dtu_frise}{DTU Nanotech}{Department of Micro- and Nanotechnology}
+
+\makeDepartmentInfo{danish} {space}{tex_space_dk}{tex_dtu_space_a}{tex_dtu_space_frise}{DTU Space}{Institut for Rumforskning og Rumteknologi}
+\makeDepartmentInfo{english}{space}{tex_space_uk}{tex_dtu_space_a_uk}{tex_dtu_space_frise}{DTU Space}{National Space Institute}
+
+\makeDepartmentInfo{danish} {systembiologi}{}{tex_dtu_systembiologi_a}{tex_dtu_frise}{DTU Systembiologi}{Institut for Systembiologi}
+\makeDepartmentInfo{english}{systembiologi}{}{tex_dtu_systembiologi_a_uk}{tex_dtu_frise}{DTU Systems Biology}{Department of Systems Biology}
+
+\makeDepartmentInfo{danish} {transport}{tex_transport_dk}{tex_dtu_transport_a}{tex_dtu_transport_frise}{DTU Transport}{Institut for Transport}
+\makeDepartmentInfo{english}{transport}{tex_transport_uk}{tex_dtu_transport_a_uk}{tex_dtu_transport_frise}{DTU Transport}{Department of Transport}
+
+\makeDepartmentInfo{danish} {vaterinaerinstituttet}{tex_veterinaertinstituttet_dk}{tex_dtu_veterinerinstituttet_a}{tex_dtu_vet_frise}{DTU Veterin\ae rinstituttet}{Veterin\ae rinstituttet}
+\makeDepartmentInfo{english}{vaterinaerinstituttet}{tex_veterinaertinstituttet_uk}{tex_dtu_veterinerinstituttet_a_uk}{tex_dtu_vet_frise}{DTU Vet}{National Veterinary Institute}
+
+\makeDepartmentInfo{danish} {vindenergi}{tex_vindenergi_dk}{tex_dtu_vindenergi_a}{tex_dtu_vindenergi_frise}{DTU Vindenergi}{Institut for Vindenergi}
+\makeDepartmentInfo{english}{vindenergi}{tex_vindenergi_uk}{tex_dtu_vindenergi_a_uk}{tex_dtu_vindenergi_frise}{DTU Wind Energy}{Department of Wind Energy}
+
+
+% Extra
+\makeDepartmentInfo{danish} {bibliotek}{tex_bibliotek_dk}{tex_dtu_bibliotek_a}{tex_dtu_bibliotek_frise}{DTU Bibliotek}{Danmarks Tekniske Informationcenter}%
+\makeDepartmentInfo{english}{bibliotek}{tex_bibliotek_uk}{tex_dtu_bibliotek_uk_a}{tex_dtu_bibliotek_frise}{DTU Library}{Technical Information Center of Denmark}%
+
+\makeDepartmentInfo{danish} {admin}{tex_dtu_navn_dk}{}{tex_dtu_frise}{Danmarks Tekniske Universitet}{}%
+\makeDepartmentInfo{english}{admin}{tex_dtu_navn_uk}{}{tex_dtu_frise}{Technical University of Denmark}{}%
+
+\makeDepartmentInfo{danish} {riso}{tex_riso_dk}{tex_ris_dtu_a}{tex_dtu_frise}{Ris\o\ DTU}{Nationallaboratoriet for B\ae redygtig Energi}
+\makeDepartmentInfo{english}{riso}{tex_riso_uk}{tex_ris_dtu_a_uk}{tex_dtu_frise}{Ris\o\ DTU}{National Laboratory for Sustainable Energy}
+
+\makeDepartmentInfo{danish}{diplom}{tex_diplom_dk}{tex_dtu_diplom_a}{tex_dtu_frise}{Center for Diplomingeni\o ruddannelse}{DTU Diplom}
+\makeDepartmentInfo{english}{diplom}{tex_diplom_dk}{tex_dtu_diplom_a_uk}{tex_dtu_frise}{Center for Diplomingeni\o ruddannelse}{DTU Diplom}
+
diff --git a/docs/presentation2022/dtucolours.tex b/docs/presentation2022/dtucolours.tex
new file mode 100644
index 0000000000000000000000000000000000000000..731dcb44b697f7d88b6a1356886a33470bd4e3ae
--- /dev/null
+++ b/docs/presentation2022/dtucolours.tex
@@ -0,0 +1,83 @@
+% dtucolours.sty
+% This file has been a part of the DTU beamer package and is now
+% moved to the resources folder because there are other parts of the 
+% DTU package that need the colours as well.
+%
+% Changelog
+% 2011-06-23 jowr Replaced the old colour definitions with the new ones from the design guide
+% 2011-07-05 jowr Added alternative colours for the graphs
+% 2011-08-16 jowr Moved colour definitions to resources folder, also used in poster class
+% 2012-06-19 jowr Added colours for cooperation with IPU
+% 2014-09-27 jowr Replaced definecolor with providecolor, do not overwrite custom colour definitions
+%
+%
+\RequirePackage{xcolor}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Define primary colours (designguide v2.3, page 13)
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\providecolor{dtured}       {rgb}{0.60, 0.00, 0.00} % Primærfarve 1 - CMYK:   0/ 91/ 72/ 23 - RGB: 153/  0/  0
+\providecolor{dtugrey}      {rgb}{0.60, 0.60, 0.60} % Primærfarve 2 - CMYK:   0/  0/  0/ 56 - RGB: 153/153/153
+% 
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Define secondary colours  (designguide v2.3, page 13)
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Please note that dtured and dtubrown have the same rgb and hex values and only differ in cmyk and pms notation.
+\providecolor{dtuyellow}    {rgb}{1.00, 0.80, 0.00} % Sekundærfarve 12 - CMYK:   0/ 25/100/  0 - RGB: 255/204/  0 - HEX: FFCC00
+\providecolor{dtuorange}    {rgb}{1.00, 0.60, 0.00} % Sekundærfarve 1  - CMYK:   0/ 50/100/  0 - RGB: 255/153/  0 - HEX: FF9900
+\providecolor{dtulightred}  {rgb}{1.00, 0.00, 0.00} % Sekundærfarve 3  - CMYK:   0/100/100/  0 - RGB: 255/  0/  0 - HEX: FF0000
+\providecolor{dtubrown}     {rgb}{0.60, 0.00, 0.00} % Sekundærfarve 4  - CMYK:   0/100/100/ 50 - RGB: 153/  0/  0 - HEX: 990000
+\providecolor{dtupurple}    {rgb}{0.80, 0.20, 0.60} % Sekundærfarve 6  - CMYK:  25/100/  0/  0 - RGB: 204/ 51/153 - HEX: CC3399
+\providecolor{dtuviolet}    {rgb}{0.40, 0.00, 0.60} % Sekundærfarve 9  - CMYK:  75/ 75/  0/  0 - RGB: 102/  0/153 - HEX: 660099
+\providecolor{dtudarkblue}  {rgb}{0.20, 0.40, 0.80} % Sekundærfarve 13 - CMYK:  75/ 50/  0/  0 - RGB:  51/102/204 - HEX: 3366CC
+\providecolor{dtulightblue} {rgb}{0.20, 0.80, 1.00} % Sekundærfarve 10 - CMYK:  50/  0/  0/  0 - RGB:  51/204/255 - HEX: 33CCFF
+\providecolor{dtulightgreen}{rgb}{0.60, 0.80, 0.20} % Sekundærfarve 11 - CMYK:  25/  0/100/  0 - RGB: 153/204/ 51 - HEX: 99CC33
+\providecolor{dtudarkgreen} {rgb}{0.40, 0.80, 0.00} % Sekundærfarve 14 - CMYK:  50/  0/100/  0 - RGB: 102/204/  0 - HEX: 66CC00
+\providecolor{dtucoolgrey}  {rgb}{0.59, 0.58, 0.57} % Farve til poster - CMYK:   0/  1/  5/ 39 - RGB: 150/148/145 - HEX: 969491
+% 
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Define colours for drawings and graphs (designguide v2.3, page 14)
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\providecolor{graph01}{named}{dtuorange}
+\providecolor{graph02}{named}{dtupurple}
+\providecolor{graph03}{named}{dtulightblue}
+\providecolor{graph04}{named}{dtubrown}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Define alternate colours for drawings and graphs 
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Define alternate colours for graphs, which are compatible with black 
+% and white printers. The initial set of colours makes it hard to distinguish 
+% between the two lighter and the two darker colours.
+\providecolor{graph01alt}{named}{dtuviolet}
+\providecolor{graph02alt}{named}{dtuyellow}
+\providecolor{graph03alt}{named}{dtulightred}
+\providecolor{graph04alt}{named}{dtulightgreen}
+\providecolor{graph05alt}{named}{dtugrey}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Define colours for IPU related documents, from IPU Designguide (16.09.2008)
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\providecolor{ipugreen}     {rgb}{0.00, 0.40, 0.20} % Dark green, 1st  standard colour  - CMYK: 088/000/095/026 - RGB: 000/102/051
+\providecolor{ipugrey}      {rgb}{0.45, 0.47, 0.49} % Dark grey, 2nd standard colour    - CMYK: 015/000/000/075 - RGB: 114/121/126
+\providecolor{ipulightgreen}{rgb}{0.36, 0.67, 0.15} % Light green, 1sr secondary colour - CMYK: 070/000/100/000 - RGB: 091/172/038
+\providecolor{ipulightgrey} {rgb}{0.85, 0.86, 0.87} % Light grey, 2nd secondary colour  - CMYK: 003/000/003/020 - RGB: 217/220/222
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Old definitions
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \providecolor{dtured}       {cmyk}{0.00, 0.95, 0.72, 0.27}
+% \providecolor{dtudarkgray}  {cmyk}{0.00, 0.00, 0.00, 0.56}
+% \providecolor{dtugray}      {cmyk}{0.00, 0.00, 0.00, 0.37}
+% \providecolor{dtulightgray} {cmyk}{0.00, 0.00, 0.00, 0.19}
+% \providecolor{dtudarkblue}  {cmyk}{1.00, 0.72, 0.00, 0.38}
+% \providecolor{dtublue}      {cmyk}{0.60, 0.44, 0.00, 0.24}
+% \providecolor{dtulightblue} {cmyk}{0.30, 0.22, 0.00, 0.12}
+% \providecolor{dtudarkgreen} {cmyk}{1.00, 0.00, 0.83, 0.47}
+% \providecolor{dtugreen}     {cmyk}{0.725,0.004,1.00, 0.004}
+% \providecolor{dtuyellow}    {cmyk}{0.00, 0.00, 1.00, 0.00}
+% \providecolor{dtuorange}    {cmyk}{0.00, 0.34, 0.91, 0.00}
+% \providecolor{dtudarkorange}{cmyk}{0.00, 0.51, 1.00, 0.00}
+% \providecolor{dtupurpur}    {cmyk}{0.00, 0.94, 0.00, 0.43}
+% \providecolor{dtupurple}    {cmyk}{0.83, 1.00, 0.00, 0.23}
+%
diff --git a/docs/presentation2022/index.aux b/docs/presentation2022/index.aux
new file mode 100644
index 0000000000000000000000000000000000000000..3dbfe028af878e33e552013122201b0d6e1af9ce
--- /dev/null
+++ b/docs/presentation2022/index.aux
@@ -0,0 +1,59 @@
+\relax 
+\providecommand\hyper@newdestlabel[2]{}
+\providecommand{\transparent@use}[1]{}
+\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
+\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
+\global\let\oldcontentsline\contentsline
+\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
+\global\let\oldnewlabel\newlabel
+\gdef\newlabel#1#2{\newlabelxx{#1}#2}
+\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
+\AtEndDocument{\ifx\hyper@anchor\@undefined
+\let\contentsline\oldcontentsline
+\let\newlabel\oldnewlabel
+\fi}
+\fi}
+\global\let\hyper@last\relax 
+\gdef\HyperFirstAtBeginDocument#1{#1}
+\providecommand\HyField@AuxAddToFields[1]{}
+\providecommand\HyField@AuxAddToCoFields[2]{}
+\providecommand\babel@aux[2]{}
+\@nameuse{bbl@beforestart}
+\babel@aux{english}{}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {3}{3}}}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {4}{4}}}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {5}{5}}}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {6}{6}}}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {7}{7}}}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {8}{8}}}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {9}{9}}}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {10}{10}}}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {11}{11}}}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {12}{12}}}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {13}{13}}}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {14}{14}}}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {15}{15}}}
+\@writefile{nav}{\headcommand {\beamer@partpages {1}{15}}}
+\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{15}}}
+\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{15}}}
+\@writefile{nav}{\headcommand {\beamer@documentpages {15}}}
+\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {15}}}
+\gdef\svg@ink@ver@settings{{\m@ne }{inkscape}{1}}
+\gdef \@abspage@last{15}
diff --git a/docs/presentation2022/index.fdb_latexmk b/docs/presentation2022/index.fdb_latexmk
new file mode 100644
index 0000000000000000000000000000000000000000..13ccf3cf768e8600c2a801b41282cd24102cea95
--- /dev/null
+++ b/docs/presentation2022/index.fdb_latexmk
@@ -0,0 +1,316 @@
+# Fdb version 3
+["pdflatex"] 1664187002 "index.tex" "index.pdf" "index" 1664187004
+  "/dev/null" 1663937585 0 d41d8cd98f00b204e9800998ecf8427e ""
+  "/etc/texmf/web2c/texmf.cnf" 1661854897 475 c0e671620eb5563b2130f56340a5fde8 ""
+  "/usr/share/texlive/texmf-dist/fonts/map/fontname/texfonts.map" 1577235249 3524 cb3e574dea2d1052e39280babc910dc8 ""
+  "/usr/share/texlive/texmf-dist/fonts/tfm/jknappen/ec/ecss1095.tfm" 1136768653 3584 8ece407347b270c252c46fdfaef5a9ef ""
+  "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm" 1246382020 916 f87d7c45f9c908e672703b83b72241a3 ""
+  "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam7.tfm" 1246382020 928 2dc8d444221b7a635bb58038579b861a ""
+  "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm" 1246382020 908 2921f8a10601f252058503cc6570e581 ""
+  "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm7.tfm" 1246382020 940 228d6584342e91276bf566bcf9716b83 ""
+  "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr10.tfm" 1136768653 1296 45809c5a464d5f32c8f98ba97c1bb47f ""
+  "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmss10.tfm" 1136768653 1316 b636689f1933f24d1294acdf6041daaa ""
+  "/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii" 1461363279 71627 94eb9990bed73c364d7f53f960cc8c5b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty" 1575674566 24708 5584a51a7101caf7e6bbf1fc27d8f7b1 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf" 1496785618 7008 9ff5fdcc865b01beca2b0fe4a46231d4 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty" 1643231327 147419 2058c0f5e6893b19c8f3ce95d177646c ""
+  "/usr/share/texlive/texmf-dist/tex/generic/babel/txtbabel.def" 1643231327 5233 d5e383ed66bf272b71b1a90b596e21c6 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty" 1576625341 40635 c40361e206be584d448876bba8a64a3b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty" 1576016050 33961 6b5c75130e435b2bfdb9f480a09a39f9 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty" 1576016007 8622 63834878edeb14dd71d58d8f22bc3e06 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty" 1576625273 7734 b98cbb34c81f667027c1e3ebdbfce34b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty" 1576625223 8371 9d55b8bd010bc717624922fb3477d92e ""
+  "/usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty" 1572645307 492 1994775aa15b0d1289725a0b1bbc2d4c ""
+  "/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty" 1572645307 480 5778104efadad304ced77548ca2184b1 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty" 1583617216 6501 4011d89d9621e0b0901138815ba5ff29 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty" 1572645307 1057 525c2192b5febbd8c1f662c9468335bb ""
+  "/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty" 1575499628 8356 7bbb2c2373aa810be568c29e333da8ed ""
+  "/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty" 1576625065 31769 002a487f55041f8e805cfbf6385ffd97 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty" 1576878844 5412 d5a2436094cd7be85769db90f29250a6 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty" 1576624944 13807 952b0226d4efca026f0e19dd266dcc22 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty" 1600895880 17859 4409f8f50cd365c68e684407e5350b1b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty" 1576015897 19007 15924f7228aca6c6d184b115f4baa231 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty" 1593379760 20089 80423eac55aa175305d35b49e04fe23b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex" 1601326656 992 855ff26741653ab54814101ca36e153c ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex" 1601326656 43820 1fef971b75380574ab35a0d37fd92608 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex" 1601326656 19324 f4e4c6403dd0f1605fd20ed22fa79dea ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex" 1601326656 6038 ccb406740cc3f03bbfb58ad504fe8c27 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex" 1601326656 6944 e12f8f7a7364ddf66f93ba30fb3a3742 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex" 1601326656 4883 42daaf41e27c3735286e23e48d2d7af9 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex" 1601326656 2544 8c06d2a7f0f469616ac9e13db6d2f842 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex" 1601326656 44195 5e390c414de027626ca5e2df888fa68d ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.tex" 1601326656 17311 2ef6b2e29e2fc6a2fc8d6d652176e257 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex" 1601326656 21302 788a79944eb22192a4929e46963a3067 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex" 1601326656 9690 01feb7cde25d4293ef36eef45123eb80 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex" 1601326656 33335 dd1fa4814d4e51f18be97d88bf0da60c ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex" 1601326656 2965 4c2b1f4e0826925746439038172e5d6f ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex" 1601326656 5196 2cc249e0ee7e03da5f5f6589257b1e5b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex" 1601326656 20726 d4c8db1e2e53b72721d29916314a22ea ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex" 1601326656 35249 abd4adf948f960299a4b3d27c5dddf46 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.tex" 1601326656 21989 fdc867d05d228316de137a9fc5ec3bbe ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex" 1601326656 8893 e851de2175338fdf7c17f3e091d94618 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.code.tex" 1601326656 5493 23e371e6fe3e7e42533d6d6c15662e0d ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.pathmorphing.code.tex" 1601326656 321 cdd11262840e01e25374a2d458f15e99 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.pathreplacing.code.tex" 1601326656 1319 0b2de5126c6cbc295f0eb77f7344b34d ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryplotmarks.code.tex" 1601326656 325 36322b0789619b270aec5993d5a9ed08 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarytopaths.code.tex" 1608933718 11518 738408f795261b70ce8dd47459171309 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex" 1621110968 186007 6e7dfe0bd57520fd5f91641aa72dcac8 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathmorphing.code.tex" 1601326656 8843 5533436db3e30fbad1e0440db6027dac ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathreplacing.code.tex" 1601326656 7474 f05a7223b140f230922562ac6a9fede5 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryfpu.code.tex" 1608933718 85938 8e4ba97c5906e1c0d158aea81fe29af7 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.tex" 1601326656 32995 ac577023e12c0e4bd8aa420b2e852d1a ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplotmarks.code.tex" 1601326656 14524 e1074042dc8f19d631452e43073ea3ba ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex" 1557692582 3063 8c415c68a0f3394e45cfeca0b65f6ee6 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex" 1601326656 521 8e224a7af69b7fee4451d1bf76b46654 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex" 1601326656 13391 84d29568c13bdce4133ab4a214711112 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex" 1601326656 104935 184ed87524e76d4957860df4ce0cd1c3 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex" 1601326656 10165 cec5fa73d49da442e56efc2d605ef154 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex" 1601326656 28178 41c17713108e0795aac6fef3d275fbca ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex" 1601326656 9989 c55967bf45126ff9b061fa2ca0c4694f ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.tex" 1601326656 3865 ac538ab80c5cf82b345016e474786549 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics.code.tex" 1557692582 3177 27d85c44fbfe09ff3b2cf2879e3ea434 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex" 1621110968 11024 0179538121bc2dba172013a3ef89519f ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex" 1608933718 7854 4176998eeefd8745ac6d2d4bd9c98451 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex" 1601326656 3379 781797a101f647bab82741a99944a229 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code.tex" 1601326656 92405 f515f31275db273f97b9d8f52e1b0736 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex" 1601326656 37376 11cd75aac3da1c1b152b2848f30adc14 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex" 1601326656 8471 c2883569d03f69e8e1cabfef4999cfd7 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduledecorations.code.tex" 1601326656 71722 aa25655703db0306f6401798e312b7b8 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex" 1601326656 21201 08d231a2386e2b61d64641c50dc15abd ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex" 1601326656 16121 346f9013d34804439f7436ff6786cef7 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex" 1621110968 44784 cedaa399d15f95e68e22906e2cc09ef8 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex" 1621110968 465 d68603f8b820ea4a08cce534944db581 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg" 1601326656 926 2963ea0dcf6cc6c0a770b69ec46a477b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def" 1601326656 5546 f3f24d7898386cb7daac70bdd2c4d6dc ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-luatex.def" 1606168878 13244 6674e4de0678d77c2d7465acc4ea20d7 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def" 1601326656 12601 4786e597516eddd82097506db7cfa098 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex" 1621110968 61163 9b2eefc24e021323e0fc140e9826d016 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex" 1601326656 1896 b8e0ca0ac371d74c0ca05583f6313c91 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex" 1601326656 7778 53c8b5623d80238f6a20aa1df1868e63 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex" 1606168878 23997 a4bed72405fa644418bea7eac2887006 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex" 1621110968 37060 797782f0eb50075c9bc952374d9a659a ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex" 1601326656 37431 9abe862035de1b29c7a677f3205e3d9f ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex" 1601326656 4494 af17fb7efeafe423710479858e42fa7e ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex" 1601326656 7251 fb18c67117e09c64de82267e12cd8aa4 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex" 1621110968 29274 e15c5b7157d21523bd9c9f1dfa146b8e ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def" 1621110968 6825 a2b0ea5b539dda0625e99dd15785ab59 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplots.surfshading.code.tex" 1452211337 22701 5fab7b8ebb90b053dc067d1bd37e43c2 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/libs/pgfplotslibrary.code.tex" 1422740226 3047 aa82404aec57311271f4991c44bd71dc ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.contourlua.code.tex" 1620507943 2931 5d52092da9e839accd7c9026062fe5c3 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsarray.code.tex" 1496704190 23537 54be8160344d894595f6d145b1311658 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsdeque.code.tex" 1262481251 4288 b8d6247899b21e3bb66bb11b24d30f2c ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsliststructure.code.tex" 1452211337 13828 11d1b09335a4a8baa693dd1e6cac3edf ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsliststructureext.code.tex" 1496704190 24373 6544c1554e5da33118301011eb03058d ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsmatrix.code.tex" 1364427911 18861 7dc35832c8ccea3aa73cdcd75ec0a60b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstableshared.code.tex" 1583276309 83469 f77a7d8a23834d4c2472f8dba8e67bff ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_loader.code.tex" 1583276309 12347 43d867ea29e34d528123d9ef750aa146 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.code.tex" 1620507943 485274 aafeb7052fbed4c8aba6fcc36c94ea72 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.errorbars.code.tex" 1452211337 22428 72578a4c9324bc5dfafe23fe64f64024 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.markers.code.tex" 1583276309 12489 859c23df41fb9067128ef5a64b01c0a4 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.paths.code.tex" 1583276309 3533 973f376afa5a4526f16b11630b9931b4 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.revision.tex" 1621284213 520 2a55e10851bbb34fb49a8e1d6b50a09b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.scaling.code.tex" 1523216742 123680 d33fda4929d7200c3e6f0ec83c006aef ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotscoordprocessing.code.tex" 1583276309 367035 be5ad6faf030b5e07b899b712359f9d2 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotscore.code.tex" 1470951798 19944 7957349fbe31c4e8dea9de4cd41cb086 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsmeshplothandler.code.tex" 1496704190 133871 7247b31742a2240343a6739cb76d6821 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsmeshplotimage.code.tex" 1620507943 25239 bf1615252744653354985789b73e7404 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsplothandlers.code.tex" 1620507943 120954 bdf135670013db80411b2fb0f95876ac ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex" 1620507943 26393 a7d9bbecdd0db20d652c909dac892e25 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsticks.code.tex" 1583276309 91244 1a0e9e49b7a2d10d1b1a610306ba4f8c ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/sys/pgflibrarypgfplots.surfshading.pgfsys-pdftex.def" 1470951798 5907 9dc460712c23e5b3338820499d47608c ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/sys/pgfplotssysgeneric.code.tex" 1351287374 3095 c82d281b748902a65be2ccca97360b11 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotsbinary.code.tex" 1430688073 23050 a369aa910ef860a3621fe0459faa335c ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotsbinary.data.code.tex" 1346285630 26859 7a4ee9d206fb0a0daa0d3108445afb57 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotscolor.code.tex" 1380839021 23958 1b96260863091af1669c3a38b1c4c9af ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotscolormap.code.tex" 1496704190 88956 018b2512ef27998e97af72e8b1dcdbd5 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.code.tex" 1620507943 71792 dba1b75b15201895eb36f142f13b3238 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.verb.code.tex" 1312159636 3286 c17079ba50483e1ac1721268ea016041 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty" 1576624663 7008 f92eaa0a3872ed622bbf538217cd2ab7 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex" 1605910342 19231 3cbf682090baecad8e17a66b7a271ed1 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex" 1605910342 7677 cf3e6aa6a8d444f55327f61df80bfa0c ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty" 1591045760 12594 0d51ac3a545aaaa555021326ff22a6cc ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty" 1359763108 5949 3f3fd50a8cc94c3d4cbf4fc66cd3df1c ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty" 1359763108 13829 94730e64147574077f8ecfea9bb69af4 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd" 1359763108 961 6518c6525a34feb5e8250ffa91731cff ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd" 1359763108 961 d02606146ba5601b5645f987c92e6193 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty" 1622667781 2222 da905dc1db75412efd2d8f67739f0596 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty" 1622667781 4173 bc0410bcccdff806d6132d3c1ef35481 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty" 1636758526 87648 07fbb6e9169e00cb2a2f40b31b2dbf3c ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty" 1636758526 4128 8eea906621b6639f7ba476a472036bbe ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty" 1636758526 2444 926f379cc60fcf0c6e3fee2223b4370d ""
+  "/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty" 1576191570 19336 ce7ae9438967282886b3b036cfad1e4d ""
+  "/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty" 1576625391 3935 57aa3c3e203a5c2effb4d2bd2efbc323 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty" 1636758526 3034 3bfb87122e6fa8758225c0dd3cbaceba ""
+  "/usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty" 1636758526 2462 754d6b31b2ab5a09bb72c348ace2ec75 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty" 1622581934 4946 461cc78f6f26901410d9f1d725079cc6 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty" 1622581934 5157 f308c7c04889e16c588e78aa42599fae ""
+  "/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty" 1622581934 5049 969aec05d5f39c43f8005910498fcf90 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo" 1636758526 8464 74db94825c407b51399ca17d9bd38a3d ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls" 1642805339 12310 2b9d5ca8ca1cc18adf963d2ae2e8b18a ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty" 1634676111 24160 45a13ef4310e1e6ae8a2702a712b5f37 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty" 1642805339 7344 4b669c019e50a1be48999086dfa79ba1 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty" 1642805339 12589 c2e8a707f95e114b40e2be10f5aefffa ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty" 1634676111 26232 66f0c0fc1c3ea04aadb9c1402292d0ac ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty" 1563915504 9407 98317d4428bbbc4430035c0c0e3898d5 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty" 1634676111 13642 ba13518fbcbdad62e3935775004ddea2 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty" 1642805339 25568 b143e4d6d4d09120b7bab4bac96b2093 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty" 1642805339 12171 76b69a0f505c817a764f41b6d7fb98e1 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty" 1642805339 9209 8a4ea3057cafb3e094ef6fcec6ff5abc ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty" 1612994634 17622 85760d86f730e8faf1f7378f6e67e409 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty" 1519256047 8313 358d4bb860bd9098eb24099f36b27af1 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty" 1616189216 7574 6d0e29b16443d86a896479ec2aabff07 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty" 1519256047 29020 6cae2187b2d2bc4f39b6bb5bddbcf031 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty" 1634676111 5712 f2473ee53b8c7edb3cfb0b157f067562 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty" 1500070590 1753 c10ec1df45e4b4c7ee05e306d23f95d7 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty" 1595450012 27425 7f090822023c1cb57d609b70b5e7cc42 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty" 1500070590 1593 48c3729494fa250d34789fd6af677f99 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty" 1616189216 13527 6266cecef9dcaa294ba1dc5ff2d8a798 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty" 1500070590 5753 fbf8c2f7c7d6d5d1d2b900c353f094e8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty" 1500070590 1140 cdaff8d445bd2a4e7afdec5190a758c0 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty" 1500070590 4548 cdde9ae4b614ce5ea4cf7a232ceeb6a8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty" 1563915504 5356 d32dea458460fce4541d4f9aa765b876 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty" 1634676111 7755 23d097ce0f5b45524f920565fe65e8ae ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty" 1483400771 637 685bd3d40aca2fa87965a39bc31aca7f ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty" 1595450012 1808 098e1772761e9b4a016e74f1a4c1cb74 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty" 1519256047 4026 1ba2c6a2acf275d63cb85d60d8597fe8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty" 1535061494 7089 c34bc77851d46db7348b94bd5e51168a ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty" 1519256047 4236 21e590075d6781cc58fee783316ee268 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty" 1513642141 333 48f83c1a5bf00cbab1ca9013199d6da1 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonarticle.20.pdf" 1513642141 2958 4e0c4a6e994e5c4d9da11c477e927f0f ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonarticle.pdf" 1513642141 2936 6cc3ef0682cbb62be8aa1b19f0a84ed6 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonbook.20.pdf" 1513642141 2734 0bcf939051dd2a936cdfe5982f7c233b ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonbook.pdf" 1513642141 2667 7624351b441ffe4bd2d14e08fbcf063d ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamericononline.20.pdf" 1513642141 24451 195d2c060e84f339954bc6d9b52131d7 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamericononline.pdf" 1513642141 24611 df07010540266b2b205b492a4d02e7e1 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty" 1642805339 13080 71b38252cbe3d689bcd03161d205eb84 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty" 1642805339 6946 ef0e875be97ab827b5cf3232042f1628 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty" 1513642141 355 75c98e7b8f427eb7c625ed391b140c5b ""
+  "/usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty" 1579038678 6078 f1cb470c9199e7110a27851508ed7a5c ""
+  "/usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty" 1427500626 4105 4c80eaed8cd4f9a80cc6244c0adeb81f ""
+  "/usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty" 1427500626 27587 b023ffe1328fa89e7f133201d87029de ""
+  "/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty" 1579991033 13886 d1306dcf79a944f6988e688c1785f9ce ""
+  "/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty" 1601931149 46845 3b58f70c6e861a13d927bff09d35ecbc ""
+  "/usr/share/texlive/texmf-dist/tex/latex/fmtcount/fc-english.def" 1580337424 14353 f66b7dd28616119c2519cd5cc4dcae14 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty" 1580337424 12389 43a81443714469abac77ce09f44ad2e2 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty" 1580337424 12098 5c732241af77b5f0e56e640b7d538395 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty" 1582668197 30872 ed70d543c537f19c96fc753321f1c3cc ""
+  "/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty" 1578002852 41601 9cf6c5257b1bc7af01a58859749dd37a ""
+  "/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg" 1459978653 1213 620bba36b25224fa9b7e1ccb4ecb76fd ""
+  "/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg" 1465944070 1224 978390e9c2234eab29404bc21b268d1e ""
+  "/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def" 1601931164 19103 48d29b6e2a64cb717117ef65f107b404 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty" 1639603921 7197 eb6c1ebf41667a05cb50c23c19d5e8bc ""
+  "/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty" 1622581934 18399 7e40f80366dffb22c0e7b70517db5cb4 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty" 1636758526 7996 a8fb260d598dcaf305a7ae7b9c3e3229 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty" 1622581934 2671 4de6781a30211fe0ea4c672e4a2a8166 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty" 1636758526 4009 187ea2dc3194cd5a76cd99a8d7a6c4d0 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty" 1580250785 17914 4c28a13fc3d975e6e81c9bea1d697276 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def" 1623096352 49890 0bb76a5b745d92e86aed6f3f93e334f0 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def" 1623096352 1777 940b1aa83773bc035eb882e8d6842769 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty" 1623096352 230915 97a8817f13de4e61bbc3592cb2caa995 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty" 1612734870 13242 133e617c5eebffdd05e421624022b267 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def" 1623096352 14132 c9404e8e78123ef0d1007c34d1d6da51 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def" 1623096352 117004 86586f287ddfad919a0a4bd68934277a ""
+  "/usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty" 1507930826 3910 e04f6a6d983bdbdb024917b7ccc80262 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty" 1637529091 99856 6cbb9d59d820d727b2acbf2edddcf8c8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty" 1637529091 11081 5538240709a5dbcdc97e4d1524f034a8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty" 1637529091 3225 54deb0fdd4552a94c6525a4a8ff74efc ""
+  "/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty" 1637529091 1954 94f3677c5f3a58b3854eb25278202694 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty" 1602274869 22521 d2fceb764a442a2001d257ef11db7618 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def" 1642022539 29921 f0f4f870357ebfb8fe58ed9ed4ee9b92 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty" 1642805374 6107 429b3b241150e53f86ce666eb492861e ""
+  "/usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty" 1642022539 4674 ac560df2ef76ab2c406a4948a48f79f8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg" 1279039959 678 4792914a8f45be57bb98413425e4c7af ""
+  "/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty" 1575499565 5766 13a9e8766c47f30327caf893ece86ac8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty" 1601326656 1090 bae35ef70b3168089ef166db3e66f5b2 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty" 1601326656 410 615550c46f918fcbee37641b02a862d9 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty" 1601326656 21013 f4ff83d25bb56552493b030f27c075ae ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty" 1601326656 989 c49c8ae06d96f8b15869da7428047b1e ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty" 1601326656 339 c2e180022e3afdb99c7d0ea5ce469b7d ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty" 1601326656 306 c56a323ca5bf9242f54474ced10fca71 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty" 1601326656 443 8c872229db56122037e86bcda49e14f3 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty" 1601326656 348 ee405e64380c11319f0e249fed57e6c5 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty" 1601326656 274 5ae372b7df79135d240456a1c6f2cf9a ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty" 1601326656 325 f9f16d12354225b7dd52a3321f085955 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty" 1601326656 2232 b9a67bccba736ed334b4b1a860a85c6f ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty" 1496704190 4904 ee78b44e85d6fccf08cd99370557481e ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty" 1575674250 85722 674bb1bdd5ee2d78383a11e280d8251f ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdrawenc.dfu" 1575674250 7980 7af90c90876992fc604543eb1fde4107 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty" 1576624809 9878 9e94e8fa600d95f9c7731bb21dfb67a4 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty" 1575674187 9715 b051d5b493d9fe5f4bc251462d039e5f ""
+  "/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty" 1580595219 4282 5d27280ace1239baaa4a225df16125ff ""
+  "/usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty" 1643838064 278240 d4b89a1802011f3ee8109ec59cd1f876 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty" 1606428179 43468 671ae75b3a15019004495eff4c0911e8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty" 1601156499 12834 212c11575fd736fdcf1f0fd8e72900f5 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/tools/array.sty" 1636758526 12694 6c23725d50ab9d1e2d3ce482c58ffcf3 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty" 1622581934 10214 00ce62e730d0cfe22b35e8f1c84949c7 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty" 1622581934 3468 068d84ef9735e15f11c5a120c0a1a139 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty" 1622581934 4118 0f286eca74ee36b7743ff20320e5479f ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translations/translations-basic-dictionary-english.trsl" 1641504762 5594 be2b9cd9ef9fd98fdd85c0156600daf9 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty" 1641504762 44107 6f2f3317a642c086712536af0abfcbd8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary-English.dict" 1596662134 3535 7dc96051305a7e943219126c49c44cd6 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dictionary-English.dict" 1512078926 903 c6d17f0656e9e1abb172b4faebabd617 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dictionary-English.dict" 1512078926 433 bfb8d1c2c020defd2de8e5c276710094 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionary-English.dict" 1512078926 1337 9a6c05e8f0c8b3c5f27cbd0e455cf475 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictionary-English.dict" 1512078926 1638 2bf1a1dea98f8a4d28033fce76e9cc67 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictionary-English.dict" 1512078926 3523 1f9d9b91f7d78b73e74c7e97bca30fb0 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty" 1622492733 8765 56d370785f0143111ff9898b5adfe08e ""
+  "/usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty" 1575152205 4155 541de118e0abc42fce3317addc90afb0 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty" 1253232110 1380 971a51b00a14503ddf754cab24c3f209 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/url/url.sty" 1388531844 12796 8edb7d69a20b857904dd0ea757c14ec9 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty" 1635798903 56029 3f7889dab51d620aa43177c391b7b190 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty" 1605910342 4902 efb3d66683a2da2a232f71e3a571a899 ""
+  "/usr/share/texlive/texmf-dist/web2c/texmf.cnf" 1644012257 39432 7155514e09a3d69036fac785183a21c2 ""
+  "/usr/share/texmf/fonts/enc/dvips/lm/lm-ec.enc" 1254938640 2375 baa924870cfb487815765f9094cf3728 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/ec-lmss10.tfm" 1254938640 11176 53ebf7a171df1f9447b387b178768bb5 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/ec-lmss12.tfm" 1254938640 11232 955a7245396175d9219648eadc654ac9 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/ec-lmss8.tfm" 1254938640 11180 705632ac6b4fb69204ad970192cdf4e5 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/ec-lmssbx10.tfm" 1254938640 11168 06d87f5698fd1b642d96449b7c8d90b0 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/ec-lmtt10.tfm" 1254938640 1372 2ef2c2b492b3c4cd7879fe083abbb061 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/lmex10.tfm" 1254938640 992 ce925c9346c7613270a79afbee98c070 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/lmmi10.tfm" 1254938640 1528 6d36b2385e0ca062a654de6ac59cb34f ""
+  "/usr/share/texmf/fonts/tfm/public/lm/lmmi6.tfm" 1254938640 1512 94a3fd88c6f27dbd9ecb46987e297a4e ""
+  "/usr/share/texmf/fonts/tfm/public/lm/lmmi8.tfm" 1254938640 1520 a3fe5596932db2db2cbda300920dd4e9 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/lmsy10.tfm" 1254938640 1308 02cc510f9dd6012e5815d0c0ffbf6869 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/lmsy6.tfm" 1254938640 1300 b0605d44c16c22d99dc001808e4f24ea ""
+  "/usr/share/texmf/fonts/tfm/public/lm/lmsy8.tfm" 1254938640 1304 cdc9a17df9ef0d2dc320eff37bbab1c4 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/rm-lmr10.tfm" 1254938640 11868 4f81e9b6033c032bdaf9884f4d7ef412 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/rm-lmr6.tfm" 1254938640 11836 e3b6ce3e601aec94f64a536e7f4224d5 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/rm-lmr8.tfm" 1254938640 11864 309fd7f43e4a0ba39f6f7644d76e8edf ""
+  "/usr/share/texmf/fonts/type1/public/lm/lmss10.pfb" 1254938640 97408 f595704ec2a07246c2d6f7b602587452 ""
+  "/usr/share/texmf/fonts/type1/public/lm/lmss8.pfb" 1254938640 94400 e33ecfb646a9f148e2e53da01a9168fe ""
+  "/usr/share/texmf/fonts/type1/public/lm/lmssbx10.pfb" 1254938640 119663 e82fa1a58f98ccd89bdbd77311ac9cf1 ""
+  "/usr/share/texmf/fonts/type1/public/lm/lmtt10.pfb" 1254938640 113227 1010e11451afc2822c95dae77c390042 ""
+  "/usr/share/texmf/tex/latex/lm/lmodern.sty" 1256929440 1606 c17281c7cff2bbd7ff0173e1433487ec ""
+  "/usr/share/texmf/tex/latex/lm/omllmm.fd" 1256929440 888 44447a3a3af84a22454ef89500942d93 ""
+  "/usr/share/texmf/tex/latex/lm/omslmsy.fd" 1256929440 805 af340a8260c447aa315cfc740ff0152f ""
+  "/usr/share/texmf/tex/latex/lm/omxlmex.fd" 1256929440 566 a94661f7b66063f191960bb7935b6ba2 ""
+  "/usr/share/texmf/tex/latex/lm/ot1lmr.fd" 1256929440 1880 bae7b659316f7344a86218ad38b01d91 ""
+  "/usr/share/texmf/tex/latex/lm/t1lmss.fd" 1256929440 1639 ba1c66ef577aa5cadc2c0fdc691a26ee ""
+  "/usr/share/texmf/tex/latex/lm/t1lmtt.fd" 1256929440 2681 354015af3b61e7be30009f084986375a ""
+  "/usr/share/texmf/web2c/texmf.cnf" 1644012257 39432 7155514e09a3d69036fac785183a21c2 ""
+  "/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map" 1661855397 4076253 38befb6d6b6e65b49c50e6f58e595c43 ""
+  "/var/lib/texmf/web2c/pdftex/pdflatex.fmt" 1661855409 1511258 48b331477fc99ed5ad6f4a5dd0889b17 ""
+  "beamer_slider_preamble.tex" 1664186994 2728 dd84392bcc98cbdc080fd45d3291136a ""
+  "beamercolorthemeDTU.sty" 1664186994 1181 7ab9734d3304a1004f2d9e1737bd3023 ""
+  "beamerfontthemeDTU.sty" 1664186994 1259 711cf5a5686863499f78b39f42a55f2a ""
+  "beamerinnerthemeDTU.sty" 1664186994 1413 443050b5e9bf0131334a4dd368ae135d ""
+  "beamerouterthemeDTU.sty" 1664186994 2587 ef6b483247d69fb58cb5fae2db9f1840 ""
+  "beamerthemeDTU.sty" 1664186994 7254 017a52b2de7ff8eb9becb7a433e0dca2 ""
+  "departments.tex" 1664186994 9638 46ca44325622949c043b61db8bfa9b5e ""
+  "dtucolours.tex" 1664186994 5683 ab2862d4c2b577922d042e90ebfdfadd ""
+  "index.aux" 1664187004 1412 2d0a9582e28c65e3f8629db6ea0ea185 "pdflatex"
+  "index.nav" 1664187004 395 640a03f4d3f0f705896c1d8375ddfa75 "pdflatex"
+  "index.out" 1664187003 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex"
+  "index.tex" 1664186994 783 bb039df7271c9afdc3120a19fc26b265 ""
+  "osvgs/x_do_not_edit_myoverlay-l1_nofonts.pdf" 1664187000 18229 24ece65440377912392d4a88ba2efb65 ""
+  "tex_dtu_compute_a_uk.pdf" 1664186994 13504 7ae3ecb9b649001643f902e32d3a8cca ""
+  "tex_dtu_frise.pdf" 1664186994 32488 57c0f48ec5395d976ac1e57718922c22 ""
+  "tex_dtu_logo.pdf" 1664186994 1830 e452da49133969a7656f3882c11e9b04 ""
+  (generated)
+  "index.aux"
+  "index.log"
+  "index.nav"
+  "index.out"
+  "index.pdf"
+  "index.snm"
+  "index.toc"
diff --git a/docs/presentation2022/index.fls b/docs/presentation2022/index.fls
new file mode 100644
index 0000000000000000000000000000000000000000..49f37bdb41bdc300fe403d0b58fd23394592f79f
--- /dev/null
+++ b/docs/presentation2022/index.fls
@@ -0,0 +1,1882 @@
+PWD /home/tuhe/Documents/unitgrade_private/docs/presentation2022
+INPUT /etc/texmf/web2c/texmf.cnf
+INPUT /usr/share/texmf/web2c/texmf.cnf
+INPUT /usr/share/texlive/texmf-dist/web2c/texmf.cnf
+INPUT /var/lib/texmf/web2c/pdftex/pdflatex.fmt
+INPUT index.tex
+OUTPUT index.log
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/size11.clo
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/size11.clo
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/size11.clo
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/size11.clo
+INPUT /usr/share/texlive/texmf-dist/fonts/map/fontname/texfonts.map
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr10.tfm
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmss10.tfm
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonbook.pdf
+OUTPUT index.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonbook.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonbook.20.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonbook.20.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonarticle.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonarticle.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonarticle.20.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonarticle.20.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericononline.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericononline.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericononline.20.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericononline.20.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT ./beamer_slider_preamble.tex
+INPUT beamer_slider_preamble.tex
+INPUT ./beamer_slider_preamble.tex
+INPUT beamer_slider_preamble.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/jknappen/ec/ecss1095.tfm
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/txtbabel.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.revision.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.revision.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.revision.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-luatex.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-luatex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarytopaths.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarytopaths.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotscore.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/sys/pgfplotssysgeneric.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/libs/pgfplotslibrary.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_loader.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryfpu.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryfpu.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryfpu.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsliststructure.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsliststructureext.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsarray.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsmatrix.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstableshared.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsdeque.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotsbinary.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotsbinary.data.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.verb.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplots.surfshading.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/sys/pgflibrarypgfplots.surfshading.pgfsys-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/sys/pgflibrarypgfplots.surfshading.pgfsys-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotscolormap.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotscolor.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsplothandlers.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsmeshplothandler.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsmeshplotimage.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.scaling.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotscoordprocessing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.errorbars.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.markers.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsticks.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.paths.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduledecorations.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.pathmorphing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.pathmorphing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathmorphing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathmorphing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.pathreplacing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.pathreplacing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathreplacing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathreplacing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.contourlua.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.contourlua.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryplotmarks.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryplotmarks.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplotmarks.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplotmarks.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /dev/null
+INPUT /dev/null
+INPUT /dev/null
+INPUT ./index.w18
+INPUT index.w18
+INPUT index.w18
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdrawenc.dfu
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdrawenc.dfu
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdrawenc.dfu
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdrawenc.dfu
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT ./beamerthemeDTU.sty
+INPUT ./beamerthemeDTU.sty
+INPUT beamerthemeDTU.sty
+INPUT ./beamerthemeDTU.sty
+INPUT ./beamerthemeDTU.sty
+INPUT ./beamerthemeDTU.sty
+INPUT ./beamerthemeDTU.sty
+INPUT ./beamerthemeDTU.sty
+INPUT beamerthemeDTU.sty
+INPUT ./beamerthemeDTU.sty
+INPUT beamerthemeDTU.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fc-english.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fc-english.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fc-english.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fc-english.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT ./departments.tex
+INPUT ./departments.tex
+INPUT ./departments.tex
+INPUT departments.tex
+INPUT ./departments.tex
+INPUT ./departments.tex
+INPUT departments.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT ./beamerfontthemeDTU.sty
+INPUT ./beamerfontthemeDTU.sty
+INPUT beamerfontthemeDTU.sty
+INPUT ./beamerfontthemeDTU.sty
+INPUT ./beamerfontthemeDTU.sty
+INPUT ./beamerfontthemeDTU.sty
+INPUT ./beamerfontthemeDTU.sty
+INPUT ./beamerfontthemeDTU.sty
+INPUT beamerfontthemeDTU.sty
+INPUT ./beamerfontthemeDTU.sty
+INPUT beamerfontthemeDTU.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT ./beamerouterthemeDTU.sty
+INPUT ./beamerouterthemeDTU.sty
+INPUT beamerouterthemeDTU.sty
+INPUT ./beamerouterthemeDTU.sty
+INPUT ./beamerouterthemeDTU.sty
+INPUT ./beamerouterthemeDTU.sty
+INPUT ./beamerouterthemeDTU.sty
+INPUT ./beamerouterthemeDTU.sty
+INPUT beamerouterthemeDTU.sty
+INPUT ./beamerouterthemeDTU.sty
+INPUT beamerouterthemeDTU.sty
+INPUT ./beamerinnerthemeDTU.sty
+INPUT ./beamerinnerthemeDTU.sty
+INPUT beamerinnerthemeDTU.sty
+INPUT ./beamerinnerthemeDTU.sty
+INPUT ./beamerinnerthemeDTU.sty
+INPUT ./beamerinnerthemeDTU.sty
+INPUT ./beamerinnerthemeDTU.sty
+INPUT ./beamerinnerthemeDTU.sty
+INPUT beamerinnerthemeDTU.sty
+INPUT ./beamerinnerthemeDTU.sty
+INPUT beamerinnerthemeDTU.sty
+INPUT ./beamercolorthemeDTU.sty
+INPUT ./beamercolorthemeDTU.sty
+INPUT beamercolorthemeDTU.sty
+INPUT ./beamercolorthemeDTU.sty
+INPUT ./beamercolorthemeDTU.sty
+INPUT ./beamercolorthemeDTU.sty
+INPUT ./beamercolorthemeDTU.sty
+INPUT ./beamercolorthemeDTU.sty
+INPUT beamercolorthemeDTU.sty
+INPUT ./beamercolorthemeDTU.sty
+INPUT beamercolorthemeDTU.sty
+INPUT ./dtucolours.tex
+INPUT ./dtucolours.tex
+INPUT ./dtucolours.tex
+INPUT dtucolours.tex
+INPUT ./dtucolours.tex
+INPUT ./dtucolours.tex
+INPUT dtucolours.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/t1lmss.fd
+INPUT /usr/share/texmf/tex/latex/lm/t1lmss.fd
+INPUT /usr/share/texmf/tex/latex/lm/t1lmss.fd
+INPUT /usr/share/texmf/tex/latex/lm/t1lmss.fd
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmss10.tfm
+INPUT ./index.aux
+INPUT index.aux
+INPUT index.aux
+OUTPUT index.aux
+INPUT /usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
+INPUT /usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
+INPUT /usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
+INPUT /usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT ./index.out
+INPUT index.out
+INPUT ./index.out
+INPUT index.out
+INPUT ./index.out
+INPUT index.out
+INPUT ./index.out
+INPUT index.out
+INPUT ./index.out
+INPUT ./index.out
+OUTPUT index.out
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations-basic-dictionary-english.trsl
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations-basic-dictionary-english.trsl
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations-basic-dictionary-english.trsl
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations-basic-dictionary-english.trsl
+INPUT ./index.nav
+INPUT index.nav
+INPUT index.nav
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmss8.tfm
+INPUT ./tex_dtu_logo.pdf
+INPUT tex_dtu_logo.pdf
+INPUT ./tex_dtu_logo.pdf
+INPUT ./tex_dtu_logo.pdf
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmss12.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmssbx10.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmss10.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmss8.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmss8.tfm
+INPUT ./tex_dtu_logo.pdf
+INPUT tex_dtu_logo.pdf
+INPUT ./tex_dtu_logo.pdf
+INPUT ./tex_dtu_compute_a_uk.pdf
+INPUT tex_dtu_compute_a_uk.pdf
+INPUT ./tex_dtu_compute_a_uk.pdf
+INPUT ./tex_dtu_compute_a_uk.pdf
+INPUT ./tex_dtu_frise.pdf
+INPUT tex_dtu_frise.pdf
+INPUT ./tex_dtu_frise.pdf
+INPUT ./tex_dtu_frise.pdf
+INPUT /var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map
+INPUT ./osvgs/x_do_not_edit_myoverlay-l1_nofonts.pdf
+INPUT osvgs/x_do_not_edit_myoverlay-l1_nofonts.pdf
+INPUT ./osvgs/x_do_not_edit_myoverlay-l1_nofonts.pdf
+INPUT osvgs/x_do_not_edit_myoverlay-l1_nofonts.pdf
+INPUT ./osvgs/x_do_not_edit_myoverlay-l1_nofonts.pdf
+INPUT ./osvgs/x_do_not_edit_myoverlay-l1_nofonts.pdf
+INPUT /usr/share/texmf/tex/latex/lm/t1lmtt.fd
+INPUT /usr/share/texmf/tex/latex/lm/t1lmtt.fd
+INPUT /usr/share/texmf/tex/latex/lm/t1lmtt.fd
+INPUT /usr/share/texmf/tex/latex/lm/t1lmtt.fd
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmtt10.tfm
+INPUT /usr/share/texmf/tex/latex/lm/ot1lmr.fd
+INPUT /usr/share/texmf/tex/latex/lm/ot1lmr.fd
+INPUT /usr/share/texmf/tex/latex/lm/ot1lmr.fd
+INPUT /usr/share/texmf/tex/latex/lm/ot1lmr.fd
+INPUT /usr/share/texmf/fonts/tfm/public/lm/rm-lmr10.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/rm-lmr8.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/rm-lmr6.tfm
+INPUT /usr/share/texmf/tex/latex/lm/omllmm.fd
+INPUT /usr/share/texmf/tex/latex/lm/omllmm.fd
+INPUT /usr/share/texmf/tex/latex/lm/omllmm.fd
+INPUT /usr/share/texmf/tex/latex/lm/omllmm.fd
+INPUT /usr/share/texmf/fonts/tfm/public/lm/lmmi10.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/lmmi8.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/lmmi6.tfm
+INPUT /usr/share/texmf/tex/latex/lm/omslmsy.fd
+INPUT /usr/share/texmf/tex/latex/lm/omslmsy.fd
+INPUT /usr/share/texmf/tex/latex/lm/omslmsy.fd
+INPUT /usr/share/texmf/tex/latex/lm/omslmsy.fd
+INPUT /usr/share/texmf/fonts/tfm/public/lm/lmsy10.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/lmsy8.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/lmsy6.tfm
+INPUT /usr/share/texmf/tex/latex/lm/omxlmex.fd
+INPUT /usr/share/texmf/tex/latex/lm/omxlmex.fd
+INPUT /usr/share/texmf/tex/latex/lm/omxlmex.fd
+INPUT /usr/share/texmf/tex/latex/lm/omxlmex.fd
+INPUT /usr/share/texmf/fonts/tfm/public/lm/lmex10.tfm
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam7.tfm
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm7.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmssbx10.tfm
+INPUT ./tex_dtu_logo.pdf
+INPUT tex_dtu_logo.pdf
+INPUT ./tex_dtu_logo.pdf
+OUTPUT index.nav
+OUTPUT index.toc
+OUTPUT index.snm
+INPUT index.aux
+INPUT ./index.out
+INPUT ./index.out
+INPUT /usr/share/texmf/fonts/enc/dvips/lm/lm-ec.enc
+INPUT /usr/share/texmf/fonts/type1/public/lm/lmss10.pfb
+INPUT /usr/share/texmf/fonts/type1/public/lm/lmss8.pfb
+INPUT /usr/share/texmf/fonts/type1/public/lm/lmssbx10.pfb
+INPUT /usr/share/texmf/fonts/type1/public/lm/lmtt10.pfb
diff --git a/docs/presentation2022/index.nav b/docs/presentation2022/index.nav
new file mode 100644
index 0000000000000000000000000000000000000000..00c131b28c95e06d4851a04dc84ad09af6bd95a3
--- /dev/null
+++ b/docs/presentation2022/index.nav
@@ -0,0 +1,35 @@
+\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}
+\headcommand {\beamer@framepages {1}{1}}
+\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}
+\headcommand {\beamer@framepages {2}{2}}
+\headcommand {\slideentry {0}{0}{3}{3/3}{}{0}}
+\headcommand {\beamer@framepages {3}{3}}
+\headcommand {\slideentry {0}{0}{4}{4/4}{}{0}}
+\headcommand {\beamer@framepages {4}{4}}
+\headcommand {\slideentry {0}{0}{5}{5/5}{}{0}}
+\headcommand {\beamer@framepages {5}{5}}
+\headcommand {\slideentry {0}{0}{6}{6/6}{}{0}}
+\headcommand {\beamer@framepages {6}{6}}
+\headcommand {\slideentry {0}{0}{7}{7/7}{}{0}}
+\headcommand {\beamer@framepages {7}{7}}
+\headcommand {\slideentry {0}{0}{8}{8/8}{}{0}}
+\headcommand {\beamer@framepages {8}{8}}
+\headcommand {\slideentry {0}{0}{9}{9/9}{}{0}}
+\headcommand {\beamer@framepages {9}{9}}
+\headcommand {\slideentry {0}{0}{10}{10/10}{}{0}}
+\headcommand {\beamer@framepages {10}{10}}
+\headcommand {\slideentry {0}{0}{11}{11/11}{}{0}}
+\headcommand {\beamer@framepages {11}{11}}
+\headcommand {\slideentry {0}{0}{12}{12/12}{}{0}}
+\headcommand {\beamer@framepages {12}{12}}
+\headcommand {\slideentry {0}{0}{13}{13/13}{}{0}}
+\headcommand {\beamer@framepages {13}{13}}
+\headcommand {\slideentry {0}{0}{14}{14/14}{}{0}}
+\headcommand {\beamer@framepages {14}{14}}
+\headcommand {\slideentry {0}{0}{15}{15/15}{}{0}}
+\headcommand {\beamer@framepages {15}{15}}
+\headcommand {\beamer@partpages {1}{15}}
+\headcommand {\beamer@subsectionpages {1}{15}}
+\headcommand {\beamer@sectionpages {1}{15}}
+\headcommand {\beamer@documentpages {15}}
+\headcommand {\gdef \inserttotalframenumber {15}}
diff --git a/devel/example_devel/students/cs108/unitgrade_data/AnotherTest-test_even_more.json.lock b/docs/presentation2022/index.out
old mode 100755
new mode 100644
similarity index 100%
rename from devel/example_devel/students/cs108/unitgrade_data/AnotherTest-test_even_more.json.lock
rename to docs/presentation2022/index.out
diff --git a/docs/presentation2022/index.pdf b/docs/presentation2022/index.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..79e3d2ccd48a67437fbe4321ec77d0e3683f39d7
Binary files /dev/null and b/docs/presentation2022/index.pdf differ
diff --git a/devel/example_devel/students/cs108/unitgrade_data/AnotherTest-test_more.json.lock b/docs/presentation2022/index.snm
old mode 100755
new mode 100644
similarity index 100%
rename from devel/example_devel/students/cs108/unitgrade_data/AnotherTest-test_more.json.lock
rename to docs/presentation2022/index.snm
diff --git a/docs/presentation2022/index.synctex.gz b/docs/presentation2022/index.synctex.gz
new file mode 100644
index 0000000000000000000000000000000000000000..2e1a200518f177d60460a244d59383256efe8f50
Binary files /dev/null and b/docs/presentation2022/index.synctex.gz differ
diff --git a/docs/presentation2022/index.tex b/docs/presentation2022/index.tex
new file mode 100644
index 0000000000000000000000000000000000000000..9d8749197f856ce176a5a44c1910bcc1ae64d2f6
--- /dev/null
+++ b/docs/presentation2022/index.tex
@@ -0,0 +1,250 @@
+ 
+\documentclass[aspectratio=43]{beamer}
+\usepackage{etoolbox}
+\newtoggle{overlabel_includesvgs}
+\newtoggle{overlabel_includelabels}
+\toggletrue{overlabel_includesvgs}
+\toggletrue{overlabel_includelabels}
+\input{beamer_slider_preamble.tex}
+
+\title{Example slide show}
+\author{Author}
+\date{April 1st, 2022}
+\begin{document}
+\begin{frame}
+\maketitle
+\end{frame}
+% This slideshow is made using slider. Install using: pip install beamer-slider 
+% check http://gitlab.compute.dtu.dk/tuhe/slider for more information. 
+\begin{frame}%\osvg{myoverlay} % Use the \osvg{labelname} - tag to create new overlays. Run the command `slider` in the terminal and check the ./osvgs directory for the svg files!
+\frametitle{Observations about online autograders}
+\begin{itemize}
+\item They do many things
+\begin{itemize}
+	\item Exercise descriptions
+	\item Administrative tasks (student onboarding, grading, exports)
+	\item Calendar-tasks (due-date, handling delays)
+	\item Assignment handin
+	\item Plagiarism checking
+	\item An IDE
+	\item A CI/CD system (upload code and run)
+	\item Various forms of automation/ideas about organizing exercises
+	\item A test system
+\end{itemize}
+\item I find them hard to use
+\begin{itemize}
+	\item First you parse these 5 numbers from stdin...
+	\item Blackbox
+\end{itemize}
+\end{itemize}
+\end{frame}
+%\begin{frame}
+%\frametitle{Advantages of automatic assessment}
+%Main advantage lies in feedback
+%\end{frame}
+\begin{frame}	
+\frametitle{My goals}
+\begin{itemize}
+\item \redt{Best} allow students to find errors and solve their programming problems
+\item Make the course \redt{software} and \redt{written material} easily maintainable in anticipation of future changes
+\begin{itemize}
+	\item Write things in one place
+	\item Update concurrently 
+	\item Make sure things don't break
+\end{itemize}
+%\item In this presentation: Inspiration; I am fully aware I did not solve everything.
+\end{itemize}
+\end{frame}
+\begin{frame}
+	\begin{itemize}
+		\item ldasf
+	\end{itemize}
+\end{frame}
+\begin{frame}
+	\frametitle{Best test system for students}
+\begin{itemize}
+	\item Which test system best allows students to fix problems in their homework?
+	\item Which test system best allow \redt{me} to fix problems in \redt{my code}
+	\item Web-based tests
+	\begin{itemize}
+		\item No debugger
+		\item Local/remote code (upload or edit in bad online IDE)
+		\item Increased run-time (can tests be run in isolation?)
+		\item Blackboxing (environment, packages, file locations, how code is called)
+		\begin{itemize}
+			\item Drivers
+			\item Preprocessors
+			\item Postprocessors
+			\item Hacks (\textrm{cat}, \textrm{fix-floats}, etc.)
+		\end{itemize}
+		\item Tendency of tests to adopt conventions from the tool (is reading from stdin really something we do?)
+	\end{itemize}
+\item Unittests
+\begin{itemize}
+	\item Debugger
+	\item Favorite IDE+autocomplete
+	\item Plugins to all IDEs
+	\item Student learns relevant skills (unittesting)
+	\item Test runable in isolation
+	\item Transparency; everything is python
+	\item Speed
+	\item Everything can be unittested
+\end{itemize}
+\end{itemize}	
+\end{frame}
+
+\begin{frame}
+	\frametitle{Casestudy: 02465}
+	\begin{itemize}
+		\item 13 exercise + 3 projects (3 group + individual)
+		\item Fairly involved code (many dependencies)
+		\item 
+	\end{itemize}
+\end{frame}
+
+\begin{frame}
+	\frametitle{Casestudy: Introduction to python (Vedrana)}
+	\begin{itemize}
+		\item Exam set with 4 problems (Python). Showcase automatic generation of test answers. 
+	\end{itemize}
+\begin{columns}
+\begin{column}{.5\linewidth}
+Codejudge
+\begin{itemize}
+	\item 5 problems
+	\item 11 tests per problem
+	\item 60 files
+	\item 282 lines of code
+\end{itemize}
+	\end{column}
+\begin{column}{.5\linewidth}
+Unitgrade
+\begin{itemize}
+	\item 5 problems
+	\item 11 tests per problem
+	\item 3 files
+	\item n lines of code
+\end{itemize}
+Bonus: My version contains a handout stub for students to work with.
+\end{column}
+\end{columns}
+\end{frame}
+
+\begin{frame}
+\frametitle{Casestudy: Problem set 6}
+\begin{itemize}
+	\item Problem set 6, create a Fraction class with addition
+\end{itemize}
+
+
+\begin{columns}
+	\begin{column}{.5\linewidth}
+		Codejudge
+		\begin{itemize}
+			\item 1 problem
+			\item 8 files (.in, .ans)
+			\item 2 tests
+			\item 12 lines of code (input, output; but more code in LaTeX)
+		\end{itemize}
+	\end{column}
+	\begin{column}{.5\linewidth}
+		Unitgrade
+		\begin{itemize}
+			\item 1 problems					
+			\item 2 files 
+			\item 6 tests
+			\item 86 lines of code
+		\end{itemize}
+		Bonus: My version contains more specific tests, generates handout files, contains a solution, and allows automatic checks of implementation for later refactoring.
+	\end{column}
+\end{columns}
+
+\end{frame}
+
+
+\begin{frame}
+	\frametitle{Casestudy: Exam set 2021}
+	\begin{itemize}
+		\item Exam set for 2021
+	\end{itemize}
+	\begin{columns}
+		\begin{column}{.5\linewidth}
+			Codejudge
+			\begin{itemize}
+	\item 4 problems					
+	\item 72 files (!) 
+	\item 16 .yml files
+	\item 18 .ans files
+	\item N tests
+	\item 552 lines of code (excluding .ans files)
+\end{itemize}
+		\end{column}
+		\begin{column}{.5\linewidth}
+			Unitgrade
+			\begin{itemize}
+	\item 4 problems					
+	\item 6 files (4 problems + 1 test + 1 deploy)
+	\item N tests
+	\item 116 lines of code
+\end{itemize}			
+Bonus: Automatic checks. 
+		\end{column}
+	\end{columns}
+	
+\end{frame}
+
+
+\begin{frame}
+\frametitle{Unittests}
+\begin{itemize}
+\item asdf
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Developing tests}
+\begin{itemize}
+\item Add a report class + deploy script and it works. 
+\item Security and evaluation: Docker + scripts (Download from learn, evaluate/run automatic)
+\item Support hidden tests
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Test development}
+\begin{itemize}
+\item No-configuration files approach
+\item Don't duplicate information
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Test development}
+\begin{itemize}
+\item No-configuration files approach
+\item Don't duplicate information
+\end{itemize}
+\end{frame}
+
+
+\begin{frame}
+	\frametitle{Test development}
+	\begin{itemize}
+		\item No-configuration files approach
+		\item Don't duplicate information
+	\end{itemize}
+\end{frame}
+
+\begin{frame}
+	* I think it is important to introduce simplest method first: Test and evaluation. Perhaps use the homework as an example?
+	* you could also use the python course as an example (one problem).
+	* Admin; grading. Setup automatically and evaluate.
+	* Show automatic evaluation directly. print to excel file and .pkl. show autograding. show hidden tests. Show plagiarism checks with moss. Show failed evaluation+log+fix. 
+	
+	
+Points of the examples: (seperate?)
+ * 	
+\end{frame}
+
+
+\end{document}
diff --git a/docs/presentation2022/index.toc b/docs/presentation2022/index.toc
new file mode 100644
index 0000000000000000000000000000000000000000..9fbdd18a8c9adf55ec0285e8532d13207dc20bf7
--- /dev/null
+++ b/docs/presentation2022/index.toc
@@ -0,0 +1 @@
+\babel@toc {english}{}\relax 
diff --git a/docs/presentation2022/osvgs/myoverlay.svg b/docs/presentation2022/osvgs/myoverlay.svg
new file mode 100644
index 0000000000000000000000000000000000000000..f6a7523bedc7eb1e6239b2e83c044152efc10d64
--- /dev/null
+++ b/docs/presentation2022/osvgs/myoverlay.svg
@@ -0,0 +1,381 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns:sodipodi = "http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape = "http://www.inkscape.org/namespaces/inkscape" 
+ height="297.638pt" version="1.2" viewBox="0 0 396.85 297.638" width="396.85pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><metadata></metadata>
+<g inkscape:groupmode="layer" id="layer1" inkscape:label="bg_layer" style="display:inline" sodipodi:insensitive="true">
+<image
+xlink:href="tmp/myoverlay.png"
+width="100%"
+height="100%"
+preserveAspectRatio="none"
+style="image-rendering:optimizeQuality"
+id="image4444th"
+x="0"
+y="0" />
+</g>
+<g inkscape:groupmode="layer"
+id="layer2"
+inkscape:label="Layer 1"
+style="display:inline">
+
+<defs>
+<g>
+<symbol id="glyph0-0" overflow="visible">
+<path d="" style="stroke:none;"/>
+</symbol>
+<symbol id="glyph0-1" overflow="visible">
+<path d="M 6.546875 -2.390625 C 6.546875 -3.71875 5.5625 -4.734375 4.375 -5 L 3.21875 -5.265625 C 2.953125 -5.328125 2.21875 -5.59375 2.21875 -6.28125 C 2.21875 -7.296875 3.234375 -7.3125 3.640625 -7.3125 C 4.3125 -7.3125 4.90625 -7.15625 5.484375 -6.59375 C 5.6875 -6.40625 5.6875 -6.40625 5.734375 -6.40625 C 5.8125 -6.40625 5.875 -6.4375 5.90625 -6.609375 L 6.09375 -7.65625 C 6.109375 -7.75 6.109375 -7.765625 6.109375 -7.8125 C 6.109375 -7.90625 6.09375 -7.921875 5.796875 -8.0625 C 4.953125 -8.484375 4.25 -8.546875 3.640625 -8.546875 C 2.578125 -8.546875 0.734375 -8.296875 0.734375 -6.0625 C 0.734375 -5.21875 1.171875 -4.671875 1.390625 -4.421875 C 2 -3.8125 2.5625 -3.6875 3.5 -3.46875 C 4.171875 -3.3125 4.421875 -3.265625 4.6875 -3.015625 C 4.8125 -2.90625 5.0625 -2.65625 5.0625 -2.203125 C 5.0625 -1.078125 4.03125 -1.03125 3.640625 -1.03125 C 2.640625 -1.03125 1.765625 -1.4375 1.171875 -1.984375 C 1.03125 -2.125 1 -2.125 0.953125 -2.125 C 0.890625 -2.125 0.828125 -2.09375 0.78125 -1.90625 L 0.609375 -0.875 C 0.578125 -0.78125 0.578125 -0.75 0.578125 -0.71875 C 0.578125 -0.46875 1.828125 -0.03125 1.890625 -0.015625 C 2.6875 0.234375 3.328125 0.265625 3.640625 0.265625 C 5.4375 0.265625 6.546875 -0.53125 6.546875 -2.390625 Z M 6.546875 -2.390625 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph0-2" overflow="visible">
+<path d="M 2.3125 -0.578125 L 2.3125 -7.71875 C 2.3125 -8.09375 2.234375 -8.28125 1.75 -8.28125 L 1.296875 -8.28125 C 0.875 -8.28125 0.734375 -8.15625 0.734375 -7.71875 L 0.734375 -0.578125 C 0.734375 -0.140625 0.859375 0 1.296875 0 L 1.75 0 C 2.203125 0 2.3125 -0.15625 2.3125 -0.578125 Z M 2.3125 -0.578125 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph0-3" overflow="visible">
+<path d="M 2.3125 -0.578125 L 2.3125 -4.890625 C 2.3125 -5.28125 2.234375 -5.46875 1.75 -5.46875 L 1.296875 -5.46875 C 0.875 -5.46875 0.734375 -5.34375 0.734375 -4.890625 L 0.734375 -0.578125 C 0.734375 -0.140625 0.859375 0 1.296875 0 L 1.75 0 C 2.203125 0 2.3125 -0.15625 2.3125 -0.578125 Z M 2.40625 -7.234375 L 2.40625 -7.46875 C 2.40625 -7.84375 2.3125 -8.03125 1.828125 -8.03125 L 1.21875 -8.03125 C 0.765625 -8.03125 0.640625 -7.875 0.640625 -7.46875 L 0.640625 -7.234375 C 0.640625 -6.890625 0.703125 -6.65625 1.21875 -6.65625 L 1.828125 -6.65625 C 2.328125 -6.65625 2.40625 -6.875 2.40625 -7.234375 Z M 2.40625 -7.234375 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph0-4" overflow="visible">
+<path d="M 5.953125 -0.578125 L 5.953125 -7.71875 C 5.953125 -8.09375 5.875 -8.28125 5.390625 -8.28125 L 4.9375 -8.28125 C 4.484375 -8.28125 4.375 -8.125 4.375 -7.71875 L 4.375 -5 C 3.828125 -5.515625 3.234375 -5.59375 2.859375 -5.59375 C 0.4375 -5.59375 0.4375 -3.3125 0.4375 -2.71875 C 0.4375 -2.171875 0.4375 0.125 2.8125 0.125 C 3.3125 0.125 3.8125 -0.015625 4.328125 -0.5625 C 4.328125 -0.125 4.5 0 4.90625 0 L 5.390625 0 C 5.84375 0 5.953125 -0.15625 5.953125 -0.578125 Z M 4.328125 -1.5 C 4.328125 -1.296875 4.328125 -1.1875 3.984375 -0.9375 C 3.6875 -0.75 3.421875 -0.734375 3.265625 -0.734375 C 2.0625 -0.734375 2.0625 -1.828125 2.0625 -2.71875 C 2.0625 -3.609375 2.0625 -4.734375 3.40625 -4.734375 C 3.75 -4.734375 4.078125 -4.625 4.328125 -4.375 Z M 4.328125 -1.5 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph0-5" overflow="visible">
+<path d="M 5.71875 -3.109375 C 5.71875 -4.640625 5 -5.671875 3.21875 -5.671875 C 1.3125 -5.671875 0.375 -4.59375 0.375 -2.78125 C 0.375 -0.828125 1.5 0.125 3.375 0.125 C 3.828125 0.125 4.515625 0.078125 5.296875 -0.328125 C 5.5625 -0.453125 5.640625 -0.484375 5.640625 -0.625 C 5.640625 -0.71875 5.609375 -1.0625 5.59375 -1.15625 C 5.546875 -1.53125 5.53125 -1.546875 5.4375 -1.546875 C 5.390625 -1.546875 5.359375 -1.546875 5.234375 -1.421875 C 4.53125 -0.8125 3.8125 -0.734375 3.421875 -0.734375 C 2.078125 -0.734375 1.9375 -1.796875 1.890625 -2.546875 L 5.140625 -2.546875 C 5.421875 -2.546875 5.71875 -2.5625 5.71875 -3.109375 Z M 4.390625 -3.1875 L 1.90625 -3.1875 C 1.953125 -3.921875 2.1875 -4.8125 3.21875 -4.8125 C 4.171875 -4.8125 4.359375 -4.125 4.390625 -3.1875 Z M 4.390625 -3.1875 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph0-6" overflow="visible">
+<path d="M 8.578125 -5.140625 C 8.546875 -5.46875 8.328125 -5.46875 7.96875 -5.46875 C 7.40625 -5.46875 7.265625 -5.4375 7.09375 -4.8125 L 6.125 -1.34375 L 5.109375 -4.9375 C 5.03125 -5.1875 4.953125 -5.46875 4.40625 -5.46875 C 4.21875 -5.46875 3.953125 -5.46875 3.78125 -5.1875 C 3.671875 -5.015625 3.15625 -2.953125 2.734375 -1.546875 L 1.78125 -4.9375 C 1.65625 -5.34375 1.53125 -5.46875 1.03125 -5.46875 L 0.796875 -5.46875 C 0.578125 -5.46875 0.328125 -5.46875 0.28125 -5.140625 L 1.546875 -0.546875 C 1.703125 0 2.015625 0 2.3125 0 L 2.65625 0 C 3.21875 0 3.3125 -0.171875 3.4375 -0.65625 C 3.71875 -1.640625 4.140625 -3.15625 4.1875 -3.765625 L 4.203125 -3.78125 C 4.28125 -3.109375 4.796875 -1.21875 4.953125 -0.65625 C 5.078125 -0.234375 5.140625 0 5.734375 0 L 6.546875 0 C 7.0625 0 7.1875 -0.140625 7.3125 -0.546875 Z M 8.578125 -5.140625 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph0-7" overflow="visible">
+<path d="M 4.453125 -0.5625 C 4.453125 -0.59375 4.421875 -0.6875 4.359375 -0.9375 C 4.296875 -1.171875 4.28125 -1.234375 4.171875 -1.234375 C 4.109375 -1.234375 4.09375 -1.234375 4.015625 -1.15625 C 3.890625 -1.0625 3.5625 -0.796875 3.0625 -0.796875 C 2.78125 -0.796875 2.609375 -1 2.609375 -1.796875 L 2.609375 -4.609375 L 3.671875 -4.609375 C 3.8125 -4.609375 4.234375 -4.609375 4.234375 -5.03125 C 4.234375 -5.46875 3.8125 -5.46875 3.671875 -5.46875 L 2.609375 -5.46875 L 2.609375 -6.453125 C 2.609375 -6.84375 2.515625 -7.03125 2.03125 -7.03125 L 1.65625 -7.03125 C 1.234375 -7.03125 1.09375 -6.90625 1.09375 -6.453125 L 1.09375 -5.46875 L 0.8125 -5.46875 C 0.6875 -5.46875 0.234375 -5.46875 0.234375 -5.03125 C 0.234375 -4.609375 0.671875 -4.609375 0.8125 -4.609375 L 1.046875 -4.609375 L 1.046875 -1.59375 C 1.046875 -0.375 1.484375 0.125 2.296875 0.125 C 2.40625 0.125 2.9375 0.125 3.5625 -0.0625 C 3.765625 -0.125 4.453125 -0.328125 4.453125 -0.5625 Z M 4.453125 -0.5625 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph0-8" overflow="visible">
+<path d="M 5.96875 -0.578125 L 5.96875 -3.875 C 5.96875 -5.109375 5.4375 -5.59375 4.21875 -5.59375 C 3.03125 -5.59375 2.484375 -4.78125 2.3125 -4.4375 L 2.296875 -4.4375 L 2.296875 -7.71875 C 2.296875 -8.09375 2.21875 -8.28125 1.734375 -8.28125 L 1.296875 -8.28125 C 0.859375 -8.28125 0.71875 -8.15625 0.71875 -7.71875 L 0.71875 -0.578125 C 0.71875 -0.140625 0.84375 0 1.296875 0 L 1.765625 0 C 2.21875 0 2.34375 -0.15625 2.34375 -0.578125 L 2.34375 -3.21875 C 2.34375 -4.25 3.03125 -4.734375 3.65625 -4.734375 C 4.21875 -4.734375 4.34375 -4.46875 4.34375 -3.859375 L 4.34375 -0.578125 C 4.34375 -0.1875 4.421875 0 4.921875 0 L 5.390625 0 C 5.84375 0 5.96875 -0.15625 5.96875 -0.578125 Z M 5.96875 -0.578125 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph0-9" overflow="visible">
+<path d="M 5.65625 -0.578125 L 5.65625 -3.765625 C 5.65625 -5.65625 3.84375 -5.671875 3.25 -5.671875 C 2.6875 -5.671875 2.09375 -5.625 1.296875 -5.28125 C 1.03125 -5.1875 0.984375 -5.140625 0.984375 -5.015625 C 0.984375 -4.9375 1.046875 -4.234375 1.0625 -4.140625 C 1.078125 -4.078125 1.140625 -4.015625 1.21875 -4.015625 C 1.28125 -4.015625 1.3125 -4.046875 1.34375 -4.078125 C 1.859375 -4.625 2.453125 -4.875 3.203125 -4.875 C 3.84375 -4.875 4.03125 -4.484375 4.03125 -3.78125 L 4.03125 -3.359375 C 3.609375 -3.359375 0.484375 -3.34375 0.484375 -1.59375 C 0.484375 -0.75 1.15625 0.125 2.203125 0.125 C 2.609375 0.125 3.515625 0.015625 4.078125 -0.8125 L 4.078125 -0.578125 C 4.078125 -0.1875 4.15625 0 4.640625 0 L 5.078125 0 C 5.53125 0 5.65625 -0.15625 5.65625 -0.578125 Z M 4.03125 -1.84375 C 4.03125 -0.734375 2.90625 -0.734375 2.859375 -0.734375 C 2.359375 -0.734375 2.046875 -1.15625 2.046875 -1.609375 C 2.046875 -2.78125 3.703125 -2.859375 4.03125 -2.875 Z M 4.03125 -1.84375 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph0-10" overflow="visible">
+<path d="M 5.96875 -0.578125 L 5.96875 -3.875 C 5.96875 -5.109375 5.4375 -5.59375 4.21875 -5.59375 C 2.96875 -5.59375 2.4375 -4.6875 2.28125 -4.375 L 2.265625 -4.375 L 2.265625 -4.96875 C 2.265625 -5.34375 2.1875 -5.53125 1.6875 -5.53125 L 1.296875 -5.53125 C 0.859375 -5.53125 0.71875 -5.40625 0.71875 -4.96875 L 0.71875 -0.578125 C 0.71875 -0.140625 0.84375 0 1.296875 0 L 1.765625 0 C 2.21875 0 2.34375 -0.15625 2.34375 -0.578125 L 2.34375 -3.21875 C 2.34375 -4.25 3.03125 -4.734375 3.65625 -4.734375 C 4.21875 -4.734375 4.34375 -4.46875 4.34375 -3.859375 L 4.34375 -0.578125 C 4.34375 -0.1875 4.421875 0 4.921875 0 L 5.390625 0 C 5.84375 0 5.96875 -0.15625 5.96875 -0.578125 Z M 5.96875 -0.578125 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph0-11" overflow="visible">
+<path d="M 6.1875 -2.6875 C 6.1875 -4.640625 5.234375 -5.671875 3.28125 -5.671875 C 1.296875 -5.671875 0.375 -4.609375 0.375 -2.6875 C 0.375 -0.734375 1.390625 0.125 3.265625 0.125 C 5.140625 0.125 6.1875 -0.734375 6.1875 -2.6875 Z M 4.5625 -2.828125 C 4.5625 -1.890625 4.5625 -0.796875 3.28125 -0.796875 C 2 -0.796875 2 -1.875 2 -2.828125 C 2 -3.75 2 -4.8125 3.265625 -4.8125 C 4.5625 -4.8125 4.5625 -3.765625 4.5625 -2.828125 Z M 4.5625 -2.828125 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph0-12" overflow="visible">
+<path d="M 5.640625 -5.140625 C 5.640625 -5.46875 5.34375 -5.46875 5.171875 -5.46875 L 4.921875 -5.46875 C 4.421875 -5.46875 4.28125 -5.28125 4.171875 -4.953125 L 3 -1.34375 L 1.8125 -4.953125 C 1.734375 -5.203125 1.640625 -5.46875 1.078125 -5.46875 L 0.78125 -5.46875 C 0.609375 -5.46875 0.3125 -5.46875 0.3125 -5.140625 C 0.3125 -5.09375 0.3125 -5.078125 0.375 -4.90625 L 1.796875 -0.5 C 1.953125 0 2.328125 0 2.546875 0 L 3.421875 0 C 3.625 0 4 0 4.171875 -0.5 L 5.59375 -4.90625 C 5.640625 -5.078125 5.640625 -5.09375 5.640625 -5.140625 Z M 5.640625 -5.140625 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph0-13" overflow="visible">
+<path d="M 4.25 -4.71875 L 4.25 -5.28125 C 4.25 -5.515625 4.25 -5.59375 4.03125 -5.59375 C 3.703125 -5.59375 2.828125 -5.484375 2.265625 -4.1875 L 2.25 -4.1875 L 2.25 -4.96875 C 2.25 -5.34375 2.171875 -5.53125 1.6875 -5.53125 L 1.296875 -5.53125 C 0.875 -5.53125 0.734375 -5.40625 0.734375 -4.96875 L 0.734375 -0.578125 C 0.734375 -0.140625 0.859375 0 1.296875 0 L 1.75 0 C 2.203125 0 2.3125 -0.15625 2.3125 -0.578125 L 2.3125 -2.75 C 2.3125 -3.875 3.265625 -4.34375 4.015625 -4.390625 C 4.21875 -4.40625 4.25 -4.40625 4.25 -4.71875 Z M 4.25 -4.71875 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph0-14" overflow="visible">
+<path d="M 5.640625 -5.140625 C 5.640625 -5.46875 5.328125 -5.46875 5.171875 -5.46875 L 4.90625 -5.46875 C 4.71875 -5.46875 4.453125 -5.46875 4.28125 -5.1875 C 4.234375 -5.140625 3.265625 -2.5 3.21875 -1.6875 L 3.203125 -1.6875 C 3.140625 -2.28125 2.65625 -3.390625 2.140625 -4.53125 C 1.796875 -5.28125 1.71875 -5.46875 1.125 -5.46875 L 0.8125 -5.46875 C 0.640625 -5.46875 0.34375 -5.46875 0.34375 -5.15625 C 0.34375 -5.109375 0.375 -5.03125 0.40625 -4.96875 L 2.65625 0 C 2.5625 0.25 2.53125 0.375 2.5 0.5 C 2.359375 0.890625 2.15625 1.4375 1.5 1.4375 C 1.109375 1.4375 0.828125 1.265625 0.703125 1.1875 C 0.640625 1.140625 0.625 1.140625 0.578125 1.140625 C 0.53125 1.140625 0.4375 1.171875 0.4375 1.3125 C 0.4375 1.40625 0.5 2.234375 0.53125 2.28125 C 0.640625 2.421875 1.296875 2.453125 1.484375 2.453125 C 2.953125 2.453125 3.546875 1.03125 3.640625 0.75 L 5.59375 -4.90625 C 5.640625 -5.0625 5.640625 -5.078125 5.640625 -5.140625 Z M 5.640625 -5.140625 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph1-0" overflow="visible">
+<path d="" style="stroke:none;"/>
+</symbol>
+<symbol id="glyph1-1" overflow="visible">
+<path d="M 7.015625 -6.78125 L 7.015625 -7.5 L 0.390625 -7.5 L 0.390625 -6.78125 L 1.84375 -6.78125 C 1.984375 -6.78125 2.109375 -6.796875 2.25 -6.796875 L 3.21875 -6.796875 L 3.21875 0 L 4.1875 0 L 4.1875 -6.796875 L 5.15625 -6.796875 C 5.296875 -6.796875 5.421875 -6.78125 5.546875 -6.78125 Z M 7.015625 -6.78125 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph1-2" overflow="visible">
+<path d="M 4.734375 0 L 4.734375 -3.25 C 4.734375 -3.96875 4.578125 -4.953125 3.25 -4.953125 C 2.5625 -4.953125 2.046875 -4.625 1.703125 -4.171875 L 1.703125 -7.5625 L 0.875 -7.5625 L 0.875 0 L 1.734375 0 L 1.734375 -2.671875 C 1.734375 -3.390625 2 -4.296875 2.828125 -4.296875 C 3.875 -4.296875 3.890625 -3.515625 3.890625 -3.171875 L 3.890625 0 Z M 4.734375 0 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph1-3" overflow="visible">
+<path d="M 1.703125 0 L 1.703125 -4.828125 L 0.875 -4.828125 L 0.875 0 Z M 1.78125 -6.171875 L 1.78125 -7.140625 L 0.8125 -7.140625 L 0.8125 -6.171875 Z M 1.78125 -6.171875 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph1-4" overflow="visible">
+<path d="M 3.921875 -1.390625 C 3.921875 -2 3.515625 -2.359375 3.5 -2.390625 C 3.078125 -2.78125 2.78125 -2.84375 2.234375 -2.9375 C 1.640625 -3.0625 1.125 -3.171875 1.125 -3.703125 C 1.125 -4.375 1.921875 -4.375 2.0625 -4.375 C 2.40625 -4.375 2.984375 -4.328125 3.609375 -3.96875 L 3.734375 -4.671875 C 3.171875 -4.9375 2.71875 -5.015625 2.171875 -5.015625 C 1.890625 -5.015625 0.359375 -5.015625 0.359375 -3.59375 C 0.359375 -3.0625 0.671875 -2.71875 0.953125 -2.5 C 1.28125 -2.265625 1.53125 -2.21875 2.125 -2.109375 C 2.515625 -2.03125 3.140625 -1.890625 3.140625 -1.3125 C 3.140625 -0.5625 2.28125 -0.5625 2.125 -0.5625 C 1.234375 -0.5625 0.625 -0.96875 0.4375 -1.09375 L 0.3125 -0.359375 C 0.65625 -0.1875 1.25 0.125 2.140625 0.125 C 2.328125 0.125 2.921875 0.125 3.390625 -0.234375 C 3.734375 -0.484375 3.921875 -0.921875 3.921875 -1.390625 Z M 3.921875 -1.390625 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph1-5" overflow="visible">
+<path d="M 5.109375 -2.390625 C 5.109375 -3.859375 4.015625 -5.015625 2.71875 -5.015625 C 1.390625 -5.015625 0.328125 -3.828125 0.328125 -2.390625 C 0.328125 -0.953125 1.4375 0.125 2.71875 0.125 C 4.015625 0.125 5.109375 -0.984375 5.109375 -2.390625 Z M 4.265625 -2.5 C 4.265625 -1.21875 3.515625 -0.578125 2.71875 -0.578125 C 1.953125 -0.578125 1.171875 -1.1875 1.171875 -2.5 C 1.171875 -3.828125 2 -4.359375 2.71875 -4.359375 C 3.46875 -4.359375 4.265625 -3.796875 4.265625 -2.5 Z M 4.265625 -2.5 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph1-6" overflow="visible">
+<path d="M 7.765625 0 L 7.765625 -3.25 C 7.765625 -3.96875 7.59375 -4.953125 6.265625 -4.953125 C 5.625 -4.953125 5.046875 -4.65625 4.65625 -4.0625 C 4.359375 -4.890625 3.609375 -4.953125 3.25 -4.953125 C 2.46875 -4.953125 1.953125 -4.515625 1.671875 -4.109375 L 1.671875 -4.90625 L 0.875 -4.90625 L 0.875 0 L 1.734375 0 L 1.734375 -2.671875 C 1.734375 -3.40625 2.03125 -4.296875 2.828125 -4.296875 C 3.84375 -4.296875 3.90625 -3.578125 3.90625 -3.171875 L 3.90625 0 L 4.75 0 L 4.75 -2.671875 C 4.75 -3.40625 5.046875 -4.296875 5.84375 -4.296875 C 6.859375 -4.296875 6.921875 -3.578125 6.921875 -3.171875 L 6.921875 0 Z M 7.765625 0 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph1-7" overflow="visible">
+<path d="M 4.515625 -2.390625 C 4.515625 -2.75 4.5 -3.578125 4.078125 -4.21875 C 3.625 -4.90625 2.96875 -5.015625 2.5625 -5.015625 C 1.359375 -5.015625 0.375 -3.859375 0.375 -2.46875 C 0.375 -1.03125 1.421875 0.125 2.734375 0.125 C 3.421875 0.125 4.046875 -0.140625 4.46875 -0.453125 L 4.40625 -1.15625 C 3.71875 -0.59375 3 -0.546875 2.75 -0.546875 C 1.875 -0.546875 1.171875 -1.3125 1.140625 -2.390625 Z M 3.890625 -2.984375 L 1.203125 -2.984375 C 1.375 -3.8125 1.953125 -4.359375 2.5625 -4.359375 C 3.140625 -4.359375 3.75 -3.984375 3.890625 -2.984375 Z M 3.890625 -2.984375 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph1-8" overflow="visible">
+<path d="M 5.015625 0 L 2.828125 -2.5 L 4.828125 -4.828125 L 3.9375 -4.828125 L 2.46875 -3.03125 L 0.96875 -4.828125 L 0.0625 -4.828125 L 2.109375 -2.5 L 0 0 L 0.890625 0 L 2.46875 -2.046875 L 4.109375 0 Z M 5.015625 0 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph1-9" overflow="visible">
+<path d="M 4.453125 0 L 4.453125 -3.140625 C 4.453125 -4.265625 3.65625 -5.015625 2.65625 -5.015625 C 1.953125 -5.015625 1.453125 -4.84375 0.953125 -4.546875 L 1.015625 -3.828125 C 1.578125 -4.234375 2.125 -4.375 2.65625 -4.375 C 3.171875 -4.375 3.609375 -3.9375 3.609375 -3.140625 L 3.609375 -2.671875 C 1.96875 -2.640625 0.59375 -2.1875 0.59375 -1.234375 C 0.59375 -0.765625 0.875 0.125 1.828125 0.125 C 1.984375 0.125 3 0.09375 3.640625 -0.390625 L 3.640625 0 Z M 3.609375 -1.4375 C 3.609375 -1.234375 3.609375 -0.953125 3.234375 -0.75 C 2.921875 -0.5625 2.5 -0.546875 2.390625 -0.546875 C 1.859375 -0.546875 1.375 -0.796875 1.375 -1.25 C 1.375 -2.015625 3.140625 -2.09375 3.609375 -2.109375 Z M 3.609375 -1.4375 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph1-10" overflow="visible">
+<path d="M 5.234375 -2.421875 C 5.234375 -3.734375 4.546875 -4.953125 3.5 -4.953125 C 2.84375 -4.953125 2.203125 -4.734375 1.703125 -4.296875 L 1.703125 -4.828125 L 0.890625 -4.828125 L 0.890625 2.109375 L 1.75 2.109375 L 1.75 -0.5 C 2.078125 -0.1875 2.5625 0.125 3.21875 0.125 C 4.265625 0.125 5.234375 -0.953125 5.234375 -2.421875 Z M 4.375 -2.421875 C 4.375 -1.3125 3.609375 -0.546875 2.78125 -0.546875 C 2.359375 -0.546875 2.0625 -0.765625 1.84375 -1.0625 C 1.75 -1.21875 1.75 -1.234375 1.75 -1.4375 L 1.75 -3.625 C 2 -4 2.421875 -4.265625 2.890625 -4.265625 C 3.71875 -4.265625 4.375 -3.4375 4.375 -2.421875 Z M 4.375 -2.421875 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph1-11" overflow="visible">
+<path d="M 1.703125 0 L 1.703125 -7.5625 L 0.875 -7.5625 L 0.875 0 Z M 1.703125 0 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph1-12" overflow="visible">
+<path d="M 3.609375 -0.296875 L 3.4375 -0.9375 C 3.15625 -0.703125 2.8125 -0.578125 2.46875 -0.578125 C 2.0625 -0.578125 1.90625 -0.90625 1.90625 -1.484375 L 1.90625 -4.203125 L 3.4375 -4.203125 L 3.4375 -4.828125 L 1.90625 -4.828125 L 1.90625 -6.21875 L 1.15625 -6.21875 L 1.15625 -4.828125 L 0.203125 -4.828125 L 0.203125 -4.203125 L 1.125 -4.203125 L 1.125 -1.296875 C 1.125 -0.640625 1.28125 0.125 2.03125 0.125 C 2.78125 0.125 3.34375 -0.15625 3.609375 -0.296875 Z M 3.609375 -0.296875 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph1-13" overflow="visible">
+<path d="M 2.1875 -7.5625 L 1.28125 -7.5625 L 1.375 -2.375 L 1.375 -1.90625 L 2.109375 -1.90625 L 2.109375 -2.375 Z M 2.1875 0 L 2.1875 -0.90625 L 1.28125 -0.90625 L 1.28125 0 Z M 2.1875 0 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-0" overflow="visible">
+<path d="" style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-1" overflow="visible">
+<path d="M 2.84375 0 L 2.84375 -0.453125 L 1.6875 -0.453125 C 1.625 -0.453125 1.546875 -0.453125 1.46875 -0.453125 L 0.796875 -0.453125 L 1.71875 -1.265625 C 1.828125 -1.359375 2.125 -1.59375 2.234375 -1.6875 C 2.5 -1.921875 2.84375 -2.234375 2.84375 -2.75 C 2.84375 -3.421875 2.34375 -4.046875 1.5 -4.046875 C 0.859375 -4.046875 0.46875 -3.703125 0.265625 -3.09375 L 0.546875 -2.734375 C 0.6875 -3.234375 0.890625 -3.625 1.40625 -3.625 C 1.90625 -3.625 2.296875 -3.28125 2.296875 -2.734375 C 2.296875 -2.25 2 -1.96875 1.640625 -1.625 C 1.515625 -1.5 1.203125 -1.234375 1.078125 -1.109375 C 0.90625 -0.96875 0.484375 -0.5625 0.3125 -0.40625 L 0.3125 0 Z M 2.84375 0 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-2" overflow="visible">
+<path d="M 4.21875 -2.03125 C 4.21875 -3.203125 3.34375 -4.140625 2.28125 -4.140625 L 0.578125 -4.140625 L 0.578125 0 L 2.28125 0 C 3.359375 0 4.21875 -0.90625 4.21875 -2.03125 Z M 3.640625 -2.046875 C 3.640625 -0.9375 2.90625 -0.359375 2.125 -0.359375 L 1.171875 -0.359375 L 1.171875 -3.796875 L 2.125 -3.796875 C 2.9375 -3.796875 3.640625 -3.140625 3.640625 -2.046875 Z M 3.640625 -2.046875 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-3" overflow="visible">
+<path d="M 4.09375 -3.6875 L 4.09375 -4.09375 L 0.234375 -4.09375 L 0.234375 -3.6875 L 1.09375 -3.6875 C 1.15625 -3.6875 1.234375 -3.6875 1.296875 -3.6875 L 1.859375 -3.6875 L 1.859375 0 L 2.46875 0 L 2.46875 -3.6875 L 3.03125 -3.6875 C 3.09375 -3.6875 3.171875 -3.6875 3.234375 -3.6875 Z M 4.09375 -3.6875 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-4" overflow="visible">
+<path d="M 3.765625 -1.390625 L 3.765625 -4.140625 L 3.25 -4.140625 L 3.25 -1.390625 C 3.25 -0.59375 2.703125 -0.234375 2.203125 -0.234375 C 1.6875 -0.234375 1.1875 -0.59375 1.1875 -1.390625 L 1.1875 -4.140625 L 0.578125 -4.140625 L 0.578125 -1.390625 C 0.578125 -0.515625 1.328125 0.125 2.1875 0.125 C 3.046875 0.125 3.765625 -0.53125 3.765625 -1.390625 Z M 3.765625 -1.390625 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-5" overflow="visible">
+<path d="M 3.71875 -0.28125 L 3.6875 -0.734375 C 3.5 -0.609375 3.3125 -0.484375 3.09375 -0.421875 C 2.890625 -0.359375 2.671875 -0.359375 2.453125 -0.359375 C 2.0625 -0.359375 1.6875 -0.546875 1.421875 -0.859375 C 1.140625 -1.1875 1 -1.625 1 -2.078125 C 1 -2.515625 1.140625 -2.953125 1.421875 -3.28125 C 1.6875 -3.59375 2.0625 -3.796875 2.453125 -3.796875 C 2.65625 -3.796875 2.84375 -3.765625 3.03125 -3.71875 C 3.21875 -3.65625 3.390625 -3.5625 3.5625 -3.453125 L 3.65625 -4 C 3.46875 -4.0625 3.265625 -4.125 3.0625 -4.15625 C 2.859375 -4.203125 2.65625 -4.203125 2.453125 -4.203125 C 1.90625 -4.203125 1.390625 -3.96875 1 -3.578125 C 0.609375 -3.171875 0.40625 -2.625 0.40625 -2.078125 C 0.40625 -1.515625 0.609375 -0.96875 1 -0.5625 C 1.390625 -0.171875 1.90625 0.0625 2.453125 0.0625 C 2.6875 0.0625 2.90625 0.046875 3.109375 0 C 3.328125 -0.0625 3.53125 -0.15625 3.71875 -0.28125 Z M 3.71875 -0.28125 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-6" overflow="visible">
+<path d="M 2.984375 -1.3125 C 2.984375 -2.09375 2.359375 -2.734375 1.578125 -2.734375 C 0.8125 -2.734375 0.171875 -2.09375 0.171875 -1.3125 C 0.171875 -0.546875 0.8125 0.0625 1.578125 0.0625 C 2.359375 0.0625 2.984375 -0.546875 2.984375 -1.3125 Z M 2.46875 -1.375 C 2.46875 -0.6875 2.046875 -0.359375 1.578125 -0.359375 C 1.109375 -0.359375 0.703125 -0.703125 0.703125 -1.375 C 0.703125 -2.046875 1.140625 -2.34375 1.578125 -2.34375 C 2.03125 -2.34375 2.46875 -2.03125 2.46875 -1.375 Z M 2.46875 -1.375 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-7" overflow="visible">
+<path d="M 4.53125 0 L 4.53125 -1.765625 C 4.53125 -2.234375 4.40625 -2.703125 3.671875 -2.703125 C 3.15625 -2.703125 2.859375 -2.421875 2.703125 -2.21875 C 2.65625 -2.390625 2.5 -2.703125 1.90625 -2.703125 C 1.5625 -2.703125 1.234375 -2.578125 0.96875 -2.25 L 0.96875 -2.6875 L 0.5 -2.6875 L 0.5 0 L 1.015625 0 L 1.015625 -1.453125 C 1.015625 -1.84375 1.1875 -2.3125 1.640625 -2.3125 C 2.25 -2.3125 2.25 -1.890625 2.25 -1.71875 L 2.25 0 L 2.78125 0 L 2.78125 -1.453125 C 2.78125 -1.84375 2.9375 -2.3125 3.40625 -2.3125 C 4.015625 -2.3125 4.015625 -1.890625 4.015625 -1.71875 L 4.015625 0 Z M 4.53125 0 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-8" overflow="visible">
+<path d="M 3.0625 -1.328125 C 3.0625 -2.046875 2.65625 -2.703125 2.078125 -2.703125 C 1.796875 -2.703125 1.359375 -2.625 1.015625 -2.359375 L 1.015625 -2.65625 L 0.5 -2.65625 L 0.5 1.15625 L 1.03125 1.15625 L 1.03125 -0.28125 C 1.34375 0 1.6875 0.0625 1.890625 0.0625 C 2.515625 0.0625 3.0625 -0.546875 3.0625 -1.328125 Z M 2.53125 -1.328125 C 2.53125 -0.734375 2.09375 -0.328125 1.625 -0.328125 C 1.53125 -0.328125 1.390625 -0.34375 1.234375 -0.46875 C 1.046875 -0.609375 1.03125 -0.703125 1.03125 -0.8125 L 1.03125 -1.984375 C 1.15625 -2.15625 1.390625 -2.296875 1.6875 -2.296875 C 2.15625 -2.296875 2.53125 -1.859375 2.53125 -1.328125 Z M 2.53125 -1.328125 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-9" overflow="visible">
+<path d="M 2.78125 0 L 2.78125 -2.65625 L 2.25 -2.65625 L 2.25 -0.921875 C 2.25 -0.4375 1.84375 -0.296875 1.5 -0.296875 C 1.0625 -0.296875 1.015625 -0.40625 1.015625 -0.6875 L 1.015625 -2.65625 L 0.5 -2.65625 L 0.5 -0.65625 C 0.5 -0.125 0.734375 0.0625 1.140625 0.0625 C 1.390625 0.0625 1.921875 0.015625 2.28125 -0.28125 L 2.28125 0 Z M 2.78125 0 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-10" overflow="visible">
+<path d="M 2.109375 -0.15625 L 2.015625 -0.546875 C 1.8125 -0.40625 1.609375 -0.359375 1.4375 -0.359375 C 1.1875 -0.359375 1.125 -0.59375 1.125 -0.875 L 1.125 -2.28125 L 2 -2.28125 L 2 -2.65625 L 1.125 -2.65625 L 1.125 -3.40625 L 0.65625 -3.40625 L 0.65625 -2.65625 L 0.125 -2.65625 L 0.125 -2.28125 L 0.640625 -2.28125 L 0.640625 -0.765625 C 0.640625 -0.359375 0.75 0.0625 1.171875 0.0625 C 1.609375 0.0625 1.9375 -0.078125 2.109375 -0.15625 Z M 2.109375 -0.15625 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-11" overflow="visible">
+<path d="M 2.625 -1.3125 C 2.625 -1.578125 2.59375 -1.984375 2.359375 -2.328125 C 2.15625 -2.625 1.796875 -2.734375 1.5 -2.734375 C 0.765625 -2.734375 0.203125 -2.09375 0.203125 -1.34375 C 0.203125 -0.578125 0.8125 0.0625 1.59375 0.0625 C 1.9375 0.0625 2.296875 -0.046875 2.609375 -0.234375 L 2.5625 -0.65625 C 2.234375 -0.40625 1.859375 -0.328125 1.59375 -0.328125 C 1.078125 -0.328125 0.6875 -0.765625 0.671875 -1.3125 Z M 2.265625 -1.671875 L 0.703125 -1.671875 C 0.84375 -2.140625 1.203125 -2.34375 1.5 -2.34375 C 1.765625 -2.34375 2.15625 -2.21875 2.265625 -1.671875 Z M 2.265625 -1.671875 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-12" overflow="visible">
+<path d="M 3.53125 0 L 3.53125 -0.46875 L 3 -0.46875 L 1.5 -0.453125 L 1.1875 -0.453125 L 1.1875 -1.953125 L 3.265625 -1.953125 L 3.265625 -2.34375 L 1.1875 -2.34375 L 1.1875 -3.71875 L 2.046875 -3.71875 C 2.125 -3.71875 2.203125 -3.703125 2.265625 -3.703125 L 3.4375 -3.703125 L 3.4375 -4.125 L 0.578125 -4.125 L 0.578125 0 Z M 3.53125 0 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-13" overflow="visible">
+<path d="M 2.921875 0 L 1.65625 -1.359375 L 2.8125 -2.65625 L 2.28125 -2.65625 L 1.4375 -1.671875 L 0.578125 -2.65625 L 0.03125 -2.65625 L 1.234375 -1.359375 L 0 0 L 0.53125 0 L 1.4375 -1.125 L 2.375 0 Z M 2.921875 0 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-14" overflow="visible">
+<path d="M 2.609375 0 L 2.609375 -1.71875 C 2.609375 -2.328125 2.140625 -2.734375 1.546875 -2.734375 C 1.171875 -2.734375 0.890625 -2.65625 0.546875 -2.484375 L 0.578125 -2.046875 C 0.78125 -2.171875 1.078125 -2.359375 1.546875 -2.359375 C 1.8125 -2.359375 2.078125 -2.15625 2.078125 -1.71875 L 2.078125 -1.46875 C 1.203125 -1.4375 0.328125 -1.265625 0.328125 -0.703125 C 0.328125 -0.40625 0.53125 0.0625 1.0625 0.0625 C 1.3125 0.0625 1.78125 0 2.09375 -0.234375 L 2.09375 0 Z M 2.078125 -0.84375 C 2.078125 -0.734375 2.078125 -0.578125 1.875 -0.453125 C 1.6875 -0.34375 1.453125 -0.328125 1.390625 -0.328125 C 1.0625 -0.328125 0.8125 -0.484375 0.8125 -0.703125 C 0.8125 -1.09375 1.8125 -1.125 2.078125 -1.140625 Z M 2.078125 -0.84375 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-15" overflow="visible">
+<path d="M 1 0 L 1 -4.140625 L 0.5 -4.140625 L 0.5 0 Z M 1 0 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-16" overflow="visible">
+<path d="M 2.28125 -0.78125 C 2.28125 -0.890625 2.28125 -1.109375 2.015625 -1.34375 C 1.796875 -1.546875 1.59375 -1.578125 1.296875 -1.640625 C 0.953125 -1.703125 0.671875 -1.75 0.671875 -2.015625 C 0.671875 -2.359375 1.109375 -2.359375 1.203125 -2.359375 C 1.546875 -2.359375 1.796875 -2.28125 2.09375 -2.125 L 2.171875 -2.546875 C 1.765625 -2.71875 1.46875 -2.734375 1.265625 -2.734375 C 1.109375 -2.734375 0.203125 -2.734375 0.203125 -1.953125 C 0.203125 -1.671875 0.359375 -1.515625 0.4375 -1.4375 C 0.65625 -1.234375 0.90625 -1.1875 1.21875 -1.125 C 1.5 -1.0625 1.828125 -1.015625 1.828125 -0.71875 C 1.828125 -0.34375 1.328125 -0.34375 1.234375 -0.34375 C 0.859375 -0.34375 0.5 -0.484375 0.265625 -0.65625 L 0.171875 -0.203125 C 0.375 -0.09375 0.75 0.0625 1.234375 0.0625 C 1.515625 0.0625 1.765625 0.015625 2 -0.140625 C 2.21875 -0.3125 2.28125 -0.578125 2.28125 -0.78125 Z M 2.28125 -0.78125 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-17" overflow="visible">
+<path d="M 1 0 L 1 -2.65625 L 0.5 -2.65625 L 0.5 0 Z M 1.0625 -3.34375 L 1.0625 -3.953125 L 0.453125 -3.953125 L 0.453125 -3.34375 Z M 1.0625 -3.34375 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-18" overflow="visible">
+<path d="M 2.765625 0 L 2.765625 -4.140625 L 2.265625 -4.140625 L 2.265625 -2.390625 C 1.875 -2.671875 1.5 -2.703125 1.3125 -2.703125 C 0.6875 -2.703125 0.21875 -2.078125 0.21875 -1.328125 C 0.21875 -0.5625 0.6875 0.0625 1.296875 0.0625 C 1.671875 0.0625 2.015625 -0.109375 2.25 -0.3125 L 2.25 0 Z M 2.25 -0.734375 C 2.09375 -0.5 1.875 -0.328125 1.578125 -0.328125 C 1.15625 -0.328125 0.734375 -0.625 0.734375 -1.3125 C 0.734375 -2.0625 1.234375 -2.3125 1.640625 -2.3125 C 1.890625 -2.3125 2.09375 -2.21875 2.25 -2.015625 Z M 2.25 -0.734375 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-19" overflow="visible">
+<path d="M 2.78125 0 L 2.78125 -1.765625 C 2.78125 -2.234375 2.640625 -2.703125 1.90625 -2.703125 C 1.390625 -2.703125 1.109375 -2.40625 1 -2.28125 L 1 -4.140625 L 0.5 -4.140625 L 0.5 0 L 1.015625 0 L 1.015625 -1.453125 C 1.015625 -1.84375 1.1875 -2.3125 1.640625 -2.3125 C 2.25 -2.3125 2.25 -1.890625 2.25 -1.71875 L 2.25 0 Z M 2.78125 0 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-20" overflow="visible">
+<path d="M 4.234375 -2.65625 L 3.765625 -2.65625 L 3.203125 -0.859375 C 3.15625 -0.6875 3.09375 -0.484375 3.078125 -0.359375 L 3.0625 -0.359375 C 3.03125 -0.59375 2.828125 -1.234375 2.8125 -1.28125 L 2.375 -2.65625 L 1.921875 -2.65625 C 1.75 -2.140625 1.296875 -0.796875 1.25 -0.359375 L 1.234375 -0.359375 C 1.1875 -0.78125 0.75 -2.109375 0.65625 -2.390625 C 0.609375 -2.53125 0.609375 -2.546875 0.578125 -2.65625 L 0.09375 -2.65625 L 0.96875 0 L 1.46875 0 L 1.84375 -1.15625 C 1.921875 -1.453125 2.109375 -2.015625 2.140625 -2.28125 L 2.140625 -2.296875 C 2.15625 -2.171875 2.1875 -2.03125 2.234375 -1.890625 L 2.359375 -1.4375 L 2.8125 0 L 3.359375 0 Z M 4.234375 -2.65625 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-21" overflow="visible">
+<path d="M 4.046875 0 L 2.40625 -4.140625 L 1.828125 -4.140625 L 0.171875 0 L 0.671875 0 L 1.140625 -1.1875 L 2.953125 -1.1875 L 3.421875 0 Z M 2.796875 -1.53125 L 1.28125 -1.53125 L 2.046875 -3.6875 Z M 2.796875 -1.53125 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-22" overflow="visible">
+<path d="M 2.078125 -2.265625 L 2.078125 -2.703125 C 1.5625 -2.703125 1.203125 -2.453125 0.96875 -2.140625 L 0.96875 -2.6875 L 0.5 -2.6875 L 0.5 0 L 1.015625 0 L 1.015625 -1.265625 C 1.015625 -1.921875 1.546875 -2.265625 2.078125 -2.265625 Z M 2.078125 -2.265625 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-23" overflow="visible">
+<path d="M 2.703125 0 L 2.703125 -0.375 L 1.921875 -0.375 L 1.921875 -4.046875 L 1.78125 -4.046875 C 1.390625 -3.6875 0.90625 -3.65625 0.546875 -3.640625 L 0.546875 -3.265625 C 0.78125 -3.28125 1.078125 -3.28125 1.375 -3.40625 L 1.375 -0.375 L 0.578125 -0.375 L 0.578125 0 Z M 2.703125 0 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-24" overflow="visible">
+<path d="M 1.140625 0 L 1.140625 -0.53125 L 0.609375 -0.53125 L 0.609375 0 L 0.78125 0 L 0.609375 0.765625 L 0.875 0.765625 Z M 1.140625 0 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph2-25" overflow="visible">
+<path d="M 2.90625 -1.9375 C 2.90625 -2.21875 2.90625 -2.921875 2.625 -3.421875 C 2.328125 -3.953125 1.875 -4.046875 1.578125 -4.046875 C 1.3125 -4.046875 0.84375 -3.953125 0.546875 -3.4375 C 0.265625 -2.96875 0.25 -2.3125 0.25 -1.9375 C 0.25 -1.5 0.28125 -0.953125 0.53125 -0.5 C 0.78125 -0.015625 1.234375 0.125 1.578125 0.125 C 2.171875 0.125 2.5 -0.21875 2.6875 -0.59375 C 2.890625 -1.015625 2.90625 -1.5625 2.90625 -1.9375 Z M 2.390625 -2.015625 C 2.390625 -1.625 2.390625 -1.171875 2.25 -0.796875 C 2.078125 -0.359375 1.78125 -0.265625 1.578125 -0.265625 C 1.328125 -0.265625 1.046875 -0.40625 0.890625 -0.84375 C 0.78125 -1.203125 0.765625 -1.578125 0.765625 -2.015625 C 0.765625 -2.5625 0.765625 -3.640625 1.578125 -3.640625 C 2.390625 -3.640625 2.390625 -2.5625 2.390625 -2.015625 Z M 2.390625 -2.015625 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph3-0" overflow="visible">
+<path d="" style="stroke:none;"/>
+</symbol>
+<symbol id="glyph3-1" overflow="visible">
+<path d="M 5.625 -0.328125 C 5.625 -0.671875 5.390625 -0.671875 5 -0.671875 L 5 -3.296875 C 5 -3.515625 5 -4.765625 4.03125 -4.765625 C 3.703125 -4.765625 3.25 -4.625 2.953125 -4.1875 C 2.78125 -4.5625 2.484375 -4.765625 2.125 -4.765625 C 1.78125 -4.765625 1.453125 -4.609375 1.1875 -4.359375 C 1.171875 -4.6875 0.953125 -4.6875 0.75 -4.6875 L 0.40625 -4.6875 C 0.234375 -4.6875 -0.046875 -4.6875 -0.046875 -4.359375 C -0.046875 -4.03125 0.1875 -4.03125 0.578125 -4.03125 L 0.578125 -0.671875 C 0.1875 -0.671875 -0.046875 -0.671875 -0.046875 -0.328125 C -0.046875 0 0.25 0 0.40625 0 L 1.359375 0 C 1.53125 0 1.8125 0 1.8125 -0.328125 C 1.8125 -0.671875 1.578125 -0.671875 1.1875 -0.671875 L 1.1875 -2.609375 C 1.1875 -3.578125 1.640625 -4.09375 2.078125 -4.09375 C 2.328125 -4.09375 2.484375 -3.90625 2.484375 -3.203125 L 2.484375 -0.671875 C 2.28125 -0.671875 2 -0.671875 2 -0.328125 C 2 0 2.296875 0 2.453125 0 L 3.265625 0 C 3.4375 0 3.71875 0 3.71875 -0.328125 C 3.71875 -0.671875 3.484375 -0.671875 3.09375 -0.671875 L 3.09375 -2.609375 C 3.09375 -3.578125 3.546875 -4.09375 3.984375 -4.09375 C 4.234375 -4.09375 4.390625 -3.90625 4.390625 -3.203125 L 4.390625 -0.671875 C 4.1875 -0.671875 3.90625 -0.671875 3.90625 -0.328125 C 3.90625 0 4.203125 0 4.359375 0 L 5.171875 0 C 5.34375 0 5.625 0 5.625 -0.328125 Z M 5.625 -0.328125 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph3-2" overflow="visible">
+<path d="M 5.453125 -4.359375 C 5.453125 -4.6875 5.1875 -4.6875 5.015625 -4.6875 L 3.734375 -4.6875 C 3.578125 -4.6875 3.296875 -4.6875 3.296875 -4.359375 C 3.296875 -4.03125 3.5625 -4.03125 3.734375 -4.03125 L 4.046875 -4.03125 L 3.25 -1.703125 C 3.109375 -1.3125 3.046875 -1.109375 2.96875 -0.765625 C 2.90625 -0.984375 2.8125 -1.203125 2.734375 -1.421875 L 1.71875 -4.03125 L 2 -4.03125 C 2.15625 -4.03125 2.421875 -4.03125 2.421875 -4.359375 C 2.421875 -4.6875 2.171875 -4.6875 2 -4.6875 L 0.71875 -4.6875 C 0.546875 -4.6875 0.28125 -4.6875 0.28125 -4.359375 C 0.28125 -4.03125 0.5625 -4.03125 0.71875 -4.03125 L 1.0625 -4.03125 L 2.609375 -0.140625 C 2.640625 -0.03125 2.640625 0 2.640625 0 C 2.640625 0 2.375 0.921875 2.234375 1.1875 C 1.921875 1.78125 1.53125 1.8125 1.359375 1.8125 C 1.359375 1.8125 1.421875 1.71875 1.421875 1.578125 C 1.421875 1.3125 1.21875 1.109375 0.953125 1.109375 C 0.65625 1.109375 0.46875 1.3125 0.46875 1.59375 C 0.46875 2.046875 0.84375 2.484375 1.375 2.484375 C 2.46875 2.484375 2.953125 1.046875 3 0.921875 L 4.6875 -4.03125 L 5.015625 -4.03125 C 5.171875 -4.03125 5.453125 -4.03125 5.453125 -4.359375 Z M 5.453125 -4.359375 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph3-3" overflow="visible">
+<path d="M 5.09375 -2.359375 C 5.09375 -3.71875 4.078125 -4.796875 2.859375 -4.796875 C 1.640625 -4.796875 0.625 -3.71875 0.625 -2.359375 C 0.625 -0.96875 1.65625 0.0625 2.859375 0.0625 C 4.046875 0.0625 5.09375 -0.984375 5.09375 -2.359375 Z M 4.328125 -2.421875 C 4.328125 -1.421875 3.65625 -0.59375 2.859375 -0.59375 C 2.046875 -0.59375 1.375 -1.421875 1.375 -2.421875 C 1.375 -3.421875 2.078125 -4.125 2.859375 -4.125 C 3.640625 -4.125 4.328125 -3.421875 4.328125 -2.421875 Z M 4.328125 -2.421875 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph3-4" overflow="visible">
+<path d="M 5.453125 -4.359375 C 5.453125 -4.6875 5.1875 -4.6875 5.015625 -4.6875 L 3.734375 -4.6875 C 3.578125 -4.6875 3.296875 -4.6875 3.296875 -4.359375 C 3.296875 -4.03125 3.5625 -4.03125 3.734375 -4.03125 L 4.046875 -4.03125 L 2.859375 -0.515625 L 1.671875 -4.03125 L 1.96875 -4.03125 C 2.140625 -4.03125 2.40625 -4.03125 2.40625 -4.359375 C 2.40625 -4.6875 2.140625 -4.6875 1.96875 -4.6875 L 0.703125 -4.6875 C 0.515625 -4.6875 0.265625 -4.6875 0.265625 -4.359375 C 0.265625 -4.03125 0.53125 -4.03125 0.703125 -4.03125 L 1.03125 -4.03125 L 2.28125 -0.328125 C 2.40625 0.046875 2.625 0.046875 2.859375 0.046875 C 3.0625 0.046875 3.3125 0.046875 3.4375 -0.3125 L 4.6875 -4.03125 L 5.015625 -4.03125 C 5.171875 -4.03125 5.453125 -4.03125 5.453125 -4.359375 Z M 5.453125 -4.359375 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph3-5" overflow="visible">
+<path d="M 5.046875 -1.1875 C 5.046875 -1.484375 4.734375 -1.484375 4.671875 -1.484375 C 4.46875 -1.484375 4.390625 -1.453125 4.3125 -1.25 C 4.078125 -0.703125 3.484375 -0.59375 3.1875 -0.59375 C 2.359375 -0.59375 1.546875 -1.140625 1.375 -2.078125 L 4.625 -2.078125 C 4.84375 -2.078125 5.046875 -2.078125 5.046875 -2.484375 C 5.046875 -3.71875 4.359375 -4.796875 2.9375 -4.796875 C 1.640625 -4.796875 0.59375 -3.703125 0.59375 -2.359375 C 0.59375 -1.03125 1.703125 0.0625 3.109375 0.0625 C 4.546875 0.0625 5.046875 -0.921875 5.046875 -1.1875 Z M 4.28125 -2.734375 L 1.390625 -2.734375 C 1.53125 -3.53125 2.171875 -4.125 2.9375 -4.125 C 3.5 -4.125 4.1875 -3.859375 4.28125 -2.734375 Z M 4.28125 -2.734375 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph3-6" overflow="visible">
+<path d="M 5.296875 -4.078125 C 5.296875 -4.296875 5.171875 -4.765625 4.265625 -4.765625 C 3.71875 -4.765625 3.015625 -4.5625 2.421875 -3.875 L 2.421875 -4.25 C 2.421875 -4.578125 2.359375 -4.6875 1.984375 -4.6875 L 0.78125 -4.6875 C 0.625 -4.6875 0.34375 -4.6875 0.34375 -4.359375 C 0.34375 -4.03125 0.609375 -4.03125 0.78125 -4.03125 L 1.671875 -4.03125 L 1.671875 -0.671875 L 0.78125 -0.671875 C 0.625 -0.671875 0.34375 -0.671875 0.34375 -0.34375 C 0.34375 0 0.609375 0 0.78125 0 L 3.625 0 C 3.796875 0 4.078125 0 4.078125 -0.328125 C 4.078125 -0.671875 3.796875 -0.671875 3.625 -0.671875 L 2.421875 -0.671875 L 2.421875 -2.03125 C 2.421875 -3.046875 3.0625 -4.09375 4.375 -4.09375 C 4.390625 -3.828125 4.578125 -3.609375 4.84375 -3.609375 C 5.09375 -3.609375 5.296875 -3.796875 5.296875 -4.078125 Z M 5.296875 -4.078125 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph3-7" overflow="visible">
+<path d="M 5.09375 -0.328125 C 5.09375 -0.671875 4.828125 -0.671875 4.65625 -0.671875 L 3.234375 -0.671875 L 3.234375 -6.203125 C 3.234375 -6.546875 3.171875 -6.65625 2.796875 -6.65625 L 1.078125 -6.65625 C 0.90625 -6.65625 0.625 -6.65625 0.625 -6.3125 C 0.625 -5.984375 0.921875 -5.984375 1.0625 -5.984375 L 2.484375 -5.984375 L 2.484375 -0.671875 L 1.078125 -0.671875 C 0.90625 -0.671875 0.625 -0.671875 0.625 -0.328125 C 0.625 0 0.921875 0 1.0625 0 L 4.65625 0 C 4.8125 0 5.09375 0 5.09375 -0.328125 Z M 5.09375 -0.328125 " style="stroke:none;"/>
+</symbol>
+<symbol id="glyph3-8" overflow="visible">
+<path d="M 5.65625 -0.34375 C 5.65625 -0.671875 5.375 -0.671875 5.21875 -0.671875 C 4.765625 -0.671875 4.65625 -0.71875 4.5625 -0.75 L 4.5625 -3.109375 C 4.5625 -3.875 3.96875 -4.796875 2.40625 -4.796875 C 1.9375 -4.796875 0.828125 -4.796875 0.828125 -4 C 0.828125 -3.671875 1.0625 -3.5 1.3125 -3.5 C 1.484375 -3.5 1.78125 -3.59375 1.796875 -4 C 1.796875 -4.078125 1.8125 -4.09375 2.03125 -4.109375 C 2.171875 -4.125 2.3125 -4.125 2.421875 -4.125 C 3.25 -4.125 3.8125 -3.796875 3.8125 -3.015625 C 1.890625 -2.984375 0.546875 -2.4375 0.546875 -1.390625 C 0.546875 -0.640625 1.234375 0.0625 2.34375 0.0625 C 2.75 0.0625 3.421875 -0.015625 3.9375 -0.34375 C 4.171875 -0.015625 4.6875 0 5.109375 0 C 5.40625 0 5.65625 0 5.65625 -0.34375 Z M 3.8125 -1.453125 C 3.8125 -1.203125 3.8125 -0.984375 3.390625 -0.78125 C 3 -0.59375 2.5 -0.59375 2.421875 -0.59375 C 1.75 -0.59375 1.296875 -0.96875 1.296875 -1.390625 C 1.296875 -1.921875 2.234375 -2.328125 3.8125 -2.375 Z M 3.8125 -1.453125 " style="stroke:none;"/>
+</symbol>
+</g>
+<clipPath id="clip1">
+<path d="M 0.167969 0 L 396.535156 0 L 396.535156 297.277344 L 0.167969 297.277344 Z M 0.167969 0 "/>
+</clipPath>
+<clipPath id="clip3">
+<path d="M 1 0.0117188 L 15.917969 0.0117188 L 15.917969 9 L 1 9 Z M 1 0.0117188 "/>
+</clipPath>
+<clipPath id="clip4">
+<path d="M 0.300781 10 L 15.917969 10 L 15.917969 22.789062 L 0.300781 22.789062 Z M 0.300781 10 "/>
+</clipPath>
+<clipPath id="clip2">
+<rect height="23" width="16" x="0" y="0"/>
+</clipPath>
+<g clip-path="url(#clip2)" id="surface5">
+<g clip-path="url(#clip3)" clip-rule="nonzero">
+<path d="M 1.308594 0.0117188 C 1.246094 0.0117188 1.207031 0.03125 1.179688 0.0585938 C 1.152344 0.0859375 1.132812 0.121094 1.132812 0.1875 L 1.132812 8.109375 C 1.132812 8.171875 1.152344 8.210938 1.179688 8.238281 C 1.207031 8.265625 1.246094 8.285156 1.308594 8.285156 L 3.378906 8.285156 C 4.1875 8.285156 4.675781 8.101562 4.972656 7.714844 C 5.414062 7.1875 5.429688 6.339844 5.429688 5.035156 L 5.429688 3.257812 C 5.429688 1.957031 5.414062 1.109375 4.972656 0.578125 C 4.675781 0.195312 4.1875 0.0117188 3.378906 0.0117188 Z M 2.449219 0.976562 L 3.179688 0.976562 C 3.503906 0.976562 3.695312 1.03125 3.84375 1.210938 C 4.074219 1.484375 4.09375 2.042969 4.09375 3.167969 L 4.09375 5.128906 C 4.09375 6.25 4.074219 6.808594 3.84375 7.085938 C 3.695312 7.261719 3.503906 7.316406 3.179688 7.316406 L 2.449219 7.316406 Z M 15.039062 0.1875 C 15.039062 0.121094 15.019531 0.0859375 14.996094 0.0585938 C 14.964844 0.03125 14.929688 0.0117188 14.867188 0.0117188 L 13.898438 0.0117188 C 13.835938 0.0117188 13.796875 0.03125 13.769531 0.0585938 C 13.742188 0.0859375 13.722656 0.121094 13.722656 0.1875 L 13.722656 6.035156 C 13.722656 6.644531 13.675781 7.007812 13.480469 7.226562 C 13.34375 7.375 13.15625 7.445312 12.890625 7.445312 C 12.644531 7.445312 12.464844 7.382812 12.320312 7.226562 C 12.136719 7.019531 12.078125 6.667969 12.078125 6.035156 L 12.078125 0.1875 C 12.078125 0.121094 12.058594 0.0859375 12.03125 0.0546875 C 12.003906 0.03125 11.96875 0.0117188 11.902344 0.0117188 L 10.933594 0.0117188 C 10.875 0.0117188 10.835938 0.03125 10.808594 0.0546875 C 10.78125 0.0859375 10.761719 0.121094 10.761719 0.1875 L 10.761719 6.035156 C 10.761719 6.890625 10.878906 7.421875 11.214844 7.796875 C 11.566406 8.183594 12.101562 8.386719 12.90625 8.386719 C 13.722656 8.386719 14.246094 8.167969 14.566406 7.792969 C 14.949219 7.355469 15.039062 6.828125 15.039062 6.035156 Z M 8.785156 8.109375 C 8.785156 8.171875 8.765625 8.210938 8.738281 8.238281 C 8.710938 8.265625 8.671875 8.285156 8.613281 8.285156 L 7.550781 8.285156 C 7.488281 8.285156 7.453125 8.265625 7.425781 8.238281 C 7.398438 8.210938 7.378906 8.171875 7.378906 8.109375 L 7.378906 1.058594 L 6.132812 1.058594 C 6.070312 1.058594 6.035156 1.039062 6.007812 1.011719 C 5.976562 0.984375 5.960938 0.945312 5.960938 0.882812 L 5.960938 0.1875 C 5.960938 0.121094 5.976562 0.0859375 6.007812 0.0585938 C 6.035156 0.03125 6.070312 0.0117188 6.132812 0.0117188 L 10.027344 0.0117188 C 10.09375 0.0117188 10.128906 0.03125 10.15625 0.0585938 C 10.183594 0.0859375 10.203125 0.121094 10.203125 0.1875 L 10.203125 0.882812 C 10.203125 0.945312 10.183594 0.984375 10.15625 1.011719 C 10.128906 1.039062 10.09375 1.058594 10.027344 1.058594 L 8.785156 1.058594 L 8.785156 8.109375 " style=" stroke:none;fill-rule:nonzero;fill:rgb(43.920898%,43.920898%,43.920898%);fill-opacity:1;"/>
+</g>
+<g clip-path="url(#clip4)" clip-rule="nonzero">
+<path d="M 15.917969 12.421875 L 12.59375 14.167969 C 8.289062 12.496094 7.929688 12.496094 3.625 14.167969 L 0.300781 12.421875 L 3.625 10.675781 C 7.929688 12.351562 8.289062 12.351562 12.59375 10.675781 Z M 15.917969 16.734375 L 12.59375 18.480469 C 8.289062 16.804688 7.929688 16.804688 3.625 18.480469 L 0.300781 16.734375 L 3.625 14.988281 C 7.929688 16.664062 8.289062 16.664062 12.59375 14.988281 Z M 15.917969 21.046875 L 12.59375 22.789062 C 8.289062 21.117188 7.929688 21.117188 3.625 22.789062 L 0.300781 21.046875 L 3.625 19.300781 C 7.929688 20.976562 8.289062 20.976562 12.59375 19.300781 L 15.917969 21.046875 " style=" stroke:none;fill-rule:nonzero;fill:rgb(59.999084%,0%,0%);fill-opacity:1;"/>
+</g>
+</g>
+<clipPath id="clip5">
+<path d="M 0.167969 0 L 52 0 L 52 10 L 0.167969 10 Z M 0.167969 0 "/>
+</clipPath>
+</defs>
+<g id="surface1">
+<g clip-path="url(#clip1)" clip-rule="nonzero">
+<path d="M 0.167969 297.277344 L 396.535156 297.277344 L 396.535156 0 L 0.167969 0 Z M 0.167969 297.277344 " style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;"/>
+</g>
+<use transform="matrix(1,0,0,1,365,12)" xlink:href="#surface5"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="26.680883" xlink:href="#glyph0-1" y="32.514455"/>
+<use x="33.97783" xlink:href="#glyph0-2" y="32.514455"/>
+<use x="37.028673" xlink:href="#glyph0-3" y="32.514455"/>
+<use x="40.079516" xlink:href="#glyph0-4" y="32.514455"/>
+<use x="46.77943" xlink:href="#glyph0-5" y="32.514455"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="57.264539" xlink:href="#glyph0-6" y="32.514455"/>
+<use x="66.153179" xlink:href="#glyph0-3" y="32.514455"/>
+<use x="69.204022" xlink:href="#glyph0-7" y="32.514455"/>
+<use x="74.030444" xlink:href="#glyph0-8" y="32.514455"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="85.100646" xlink:href="#glyph0-9" y="32.514455"/>
+<use x="91.369501" xlink:href="#glyph0-10" y="32.514455"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="102.451644" xlink:href="#glyph0-11" y="32.514455"/>
+<use x="109.019016" xlink:href="#glyph0-12" y="32.514455"/>
+<use x="114.989355" xlink:href="#glyph0-5" y="32.514455"/>
+<use x="121.092235" xlink:href="#glyph0-13" y="32.514455"/>
+<use x="125.536555" xlink:href="#glyph0-2" y="32.514455"/>
+<use x="128.587398" xlink:href="#glyph0-9" y="32.514455"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="134.498034" xlink:href="#glyph0-14" y="32.514455"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="26.680883" xlink:href="#glyph1-1" y="140.605989"/>
+<use x="34.096597" xlink:href="#glyph1-2" y="140.605989"/>
+<use x="39.726481" xlink:href="#glyph1-3" y="140.605989"/>
+<use x="42.329499" xlink:href="#glyph1-4" y="140.605989"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="50.134195" xlink:href="#glyph1-3" y="140.605989"/>
+<use x="52.737213" xlink:href="#glyph1-4" y="140.605989"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="60.552805" xlink:href="#glyph1-4" y="140.605989"/>
+<use x="64.729184" xlink:href="#glyph1-5" y="140.605989"/>
+<use x="70.177108" xlink:href="#glyph1-6" y="140.605989"/>
+<use x="78.833859" xlink:href="#glyph1-7" y="140.605989"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="87.305381" xlink:href="#glyph1-7" y="140.605989"/>
+<use x="92.148585" xlink:href="#glyph1-8" y="140.605989"/>
+<use x="97.172661" xlink:href="#glyph1-9" y="140.605989"/>
+<use x="102.409205" xlink:href="#glyph1-6" y="140.605989"/>
+<use x="111.065957" xlink:href="#glyph1-10" y="140.605989"/>
+<use x="116.695841" xlink:href="#glyph1-11" y="140.605989"/>
+<use x="119.298859" xlink:href="#glyph1-7" y="140.605989"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="127.770381" xlink:href="#glyph1-12" y="140.605989"/>
+<use x="131.704872" xlink:href="#glyph1-7" y="140.605989"/>
+<use x="136.548076" xlink:href="#glyph1-8" y="140.605989"/>
+<use x="141.572152" xlink:href="#glyph1-12" y="140.605989"/>
+<use x="145.506643" xlink:href="#glyph1-13" y="140.605989"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="27.303126" xlink:href="#glyph2-1" y="288.685888"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="38.934539" xlink:href="#glyph2-2" y="288.685888"/>
+<use x="43.516177" xlink:href="#glyph2-3" y="288.685888"/>
+<use x="47.848852" xlink:href="#glyph2-4" y="288.685888"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="54.315923" xlink:href="#glyph2-5" y="288.685888"/>
+<use x="58.368589" xlink:href="#glyph2-6" y="288.685888"/>
+<use x="61.540033" xlink:href="#glyph2-7" y="288.685888"/>
+<use x="66.577207" xlink:href="#glyph2-8" y="288.685888"/>
+<use x="69.852535" xlink:href="#glyph2-9" y="288.685888"/>
+<use x="73.127863" xlink:href="#glyph2-10" y="288.685888"/>
+<use x="75.418682" xlink:href="#glyph2-11" y="288.685888"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="262.315356" xlink:href="#glyph2-12" y="288.685888"/>
+<use x="266.119656" xlink:href="#glyph2-13" y="288.685888"/>
+<use x="269.042733" xlink:href="#glyph2-14" y="288.685888"/>
+<use x="272.089994" xlink:href="#glyph2-7" y="288.685888"/>
+<use x="277.127169" xlink:href="#glyph2-8" y="288.685888"/>
+<use x="280.402497" xlink:href="#glyph2-15" y="288.685888"/>
+<use x="281.915978" xlink:href="#glyph2-11" y="288.685888"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="286.848671" xlink:href="#glyph2-16" y="288.685888"/>
+<use x="289.28039" xlink:href="#glyph2-15" y="288.685888"/>
+<use x="290.793871" xlink:href="#glyph2-17" y="288.685888"/>
+<use x="292.307352" xlink:href="#glyph2-18" y="288.685888"/>
+<use x="295.58268" xlink:href="#glyph2-11" y="288.685888"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="300.515374" xlink:href="#glyph2-16" y="288.685888"/>
+<use x="302.947092" xlink:href="#glyph2-19" y="288.685888"/>
+<use x="306.22242" xlink:href="#glyph2-6" y="288.685888"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="309.220724" xlink:href="#glyph2-20" y="288.685888"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="331.548" xlink:href="#glyph2-21" y="288.685888"/>
+<use x="335.777387" xlink:href="#glyph2-8" y="288.685888"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="338.879575" xlink:href="#glyph2-22" y="288.685888"/>
+<use x="341.045614" xlink:href="#glyph2-17" y="288.685888"/>
+<use x="342.559095" xlink:href="#glyph2-15" y="288.685888"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="346.186076" xlink:href="#glyph2-23" y="288.685888"/>
+<use x="349.35752" xlink:href="#glyph2-16" y="288.685888"/>
+<use x="351.789239" xlink:href="#glyph2-10" y="288.685888"/>
+<use x="354.080058" xlink:href="#glyph2-24" y="288.685888"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="357.955404" xlink:href="#glyph2-1" y="288.685888"/>
+<use x="361.126848" xlink:href="#glyph2-25" y="288.685888"/>
+<use x="364.298292" xlink:href="#glyph2-1" y="288.685888"/>
+<use x="367.469736" xlink:href="#glyph2-1" y="288.685888"/>
+</g>
+<g clip-path="url(#clip5)" clip-rule="nonzero">
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+<use x="0.166131" xlink:href="#glyph3-1" y="6.527062"/>
+<use x="5.886451" xlink:href="#glyph3-2" y="6.527062"/>
+<use x="11.606771" xlink:href="#glyph3-3" y="6.527062"/>
+<use x="17.327091" xlink:href="#glyph3-4" y="6.527062"/>
+<use x="23.047412" xlink:href="#glyph3-5" y="6.527062"/>
+<use x="28.767732" xlink:href="#glyph3-6" y="6.527062"/>
+<use x="34.488052" xlink:href="#glyph3-7" y="6.527062"/>
+<use x="40.208372" xlink:href="#glyph3-8" y="6.527062"/>
+<use x="45.928692" xlink:href="#glyph3-2" y="6.527062"/>
+</g>
+</g>
+</g>
+</g></svg>
\ No newline at end of file
diff --git a/docs/presentation2022/osvgs/tmp/myoverlay.png b/docs/presentation2022/osvgs/tmp/myoverlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..383bc80399de2a1895f70ee770ea1ff108d23c64
Binary files /dev/null and b/docs/presentation2022/osvgs/tmp/myoverlay.png differ
diff --git a/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.aux b/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.aux
new file mode 100644
index 0000000000000000000000000000000000000000..bf24296eba99000a64412a47963f238227a552fb
--- /dev/null
+++ b/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.aux
@@ -0,0 +1,33 @@
+\relax 
+\providecommand\hyper@newdestlabel[2]{}
+\providecommand{\transparent@use}[1]{}
+\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
+\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
+\global\let\oldcontentsline\contentsline
+\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
+\global\let\oldnewlabel\newlabel
+\gdef\newlabel#1#2{\newlabelxx{#1}#2}
+\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
+\AtEndDocument{\ifx\hyper@anchor\@undefined
+\let\contentsline\oldcontentsline
+\let\newlabel\oldnewlabel
+\fi}
+\fi}
+\global\let\hyper@last\relax 
+\gdef\HyperFirstAtBeginDocument#1{#1}
+\providecommand\HyField@AuxAddToFields[1]{}
+\providecommand\HyField@AuxAddToCoFields[2]{}
+\providecommand\babel@aux[2]{}
+\@nameuse{bbl@beforestart}
+\babel@aux{english}{}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {1}{1}}}
+\@writefile{nav}{\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}}
+\@writefile{nav}{\headcommand {\beamer@framepages {2}{2}}}
+\@writefile{nav}{\headcommand {\beamer@partpages {1}{2}}}
+\@writefile{nav}{\headcommand {\beamer@subsectionpages {1}{2}}}
+\@writefile{nav}{\headcommand {\beamer@sectionpages {1}{2}}}
+\@writefile{nav}{\headcommand {\beamer@documentpages {2}}}
+\@writefile{nav}{\headcommand {\gdef \inserttotalframenumber {2}}}
+\gdef\svg@ink@ver@settings{{\m@ne }{inkscape}{1}}
+\gdef \@abspage@last{2}
diff --git a/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.fdb_latexmk b/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.fdb_latexmk
new file mode 100644
index 0000000000000000000000000000000000000000..7d61dd258e3e19012bf59d7714f1ac961c4d44c1
--- /dev/null
+++ b/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.fdb_latexmk
@@ -0,0 +1,315 @@
+# Fdb version 3
+["pdflatex"] 1664186997 "index_NO_SVGS.tex" "index_NO_SVGS.pdf" "index_NO_SVGS" 1664186999
+  "/dev/null" 1663937585 0 d41d8cd98f00b204e9800998ecf8427e ""
+  "/etc/texmf/web2c/texmf.cnf" 1661854897 475 c0e671620eb5563b2130f56340a5fde8 ""
+  "/usr/share/texlive/texmf-dist/fonts/map/fontname/texfonts.map" 1577235249 3524 cb3e574dea2d1052e39280babc910dc8 ""
+  "/usr/share/texlive/texmf-dist/fonts/tfm/jknappen/ec/ecss1095.tfm" 1136768653 3584 8ece407347b270c252c46fdfaef5a9ef ""
+  "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm" 1246382020 916 f87d7c45f9c908e672703b83b72241a3 ""
+  "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam7.tfm" 1246382020 928 2dc8d444221b7a635bb58038579b861a ""
+  "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm" 1246382020 908 2921f8a10601f252058503cc6570e581 ""
+  "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm7.tfm" 1246382020 940 228d6584342e91276bf566bcf9716b83 ""
+  "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr10.tfm" 1136768653 1296 45809c5a464d5f32c8f98ba97c1bb47f ""
+  "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmss10.tfm" 1136768653 1316 b636689f1933f24d1294acdf6041daaa ""
+  "/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii" 1461363279 71627 94eb9990bed73c364d7f53f960cc8c5b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty" 1575674566 24708 5584a51a7101caf7e6bbf1fc27d8f7b1 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf" 1496785618 7008 9ff5fdcc865b01beca2b0fe4a46231d4 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty" 1643231327 147419 2058c0f5e6893b19c8f3ce95d177646c ""
+  "/usr/share/texlive/texmf-dist/tex/generic/babel/txtbabel.def" 1643231327 5233 d5e383ed66bf272b71b1a90b596e21c6 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty" 1576625341 40635 c40361e206be584d448876bba8a64a3b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty" 1576016050 33961 6b5c75130e435b2bfdb9f480a09a39f9 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty" 1576016007 8622 63834878edeb14dd71d58d8f22bc3e06 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty" 1576625273 7734 b98cbb34c81f667027c1e3ebdbfce34b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty" 1576625223 8371 9d55b8bd010bc717624922fb3477d92e ""
+  "/usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty" 1572645307 492 1994775aa15b0d1289725a0b1bbc2d4c ""
+  "/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty" 1572645307 480 5778104efadad304ced77548ca2184b1 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty" 1583617216 6501 4011d89d9621e0b0901138815ba5ff29 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty" 1572645307 1057 525c2192b5febbd8c1f662c9468335bb ""
+  "/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty" 1575499628 8356 7bbb2c2373aa810be568c29e333da8ed ""
+  "/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty" 1576625065 31769 002a487f55041f8e805cfbf6385ffd97 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty" 1576878844 5412 d5a2436094cd7be85769db90f29250a6 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty" 1576624944 13807 952b0226d4efca026f0e19dd266dcc22 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty" 1600895880 17859 4409f8f50cd365c68e684407e5350b1b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty" 1576015897 19007 15924f7228aca6c6d184b115f4baa231 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty" 1593379760 20089 80423eac55aa175305d35b49e04fe23b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex" 1601326656 992 855ff26741653ab54814101ca36e153c ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex" 1601326656 43820 1fef971b75380574ab35a0d37fd92608 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex" 1601326656 19324 f4e4c6403dd0f1605fd20ed22fa79dea ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex" 1601326656 6038 ccb406740cc3f03bbfb58ad504fe8c27 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex" 1601326656 6944 e12f8f7a7364ddf66f93ba30fb3a3742 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex" 1601326656 4883 42daaf41e27c3735286e23e48d2d7af9 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex" 1601326656 2544 8c06d2a7f0f469616ac9e13db6d2f842 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex" 1601326656 44195 5e390c414de027626ca5e2df888fa68d ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.tex" 1601326656 17311 2ef6b2e29e2fc6a2fc8d6d652176e257 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex" 1601326656 21302 788a79944eb22192a4929e46963a3067 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex" 1601326656 9690 01feb7cde25d4293ef36eef45123eb80 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex" 1601326656 33335 dd1fa4814d4e51f18be97d88bf0da60c ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex" 1601326656 2965 4c2b1f4e0826925746439038172e5d6f ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex" 1601326656 5196 2cc249e0ee7e03da5f5f6589257b1e5b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex" 1601326656 20726 d4c8db1e2e53b72721d29916314a22ea ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex" 1601326656 35249 abd4adf948f960299a4b3d27c5dddf46 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.tex" 1601326656 21989 fdc867d05d228316de137a9fc5ec3bbe ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex" 1601326656 8893 e851de2175338fdf7c17f3e091d94618 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.code.tex" 1601326656 5493 23e371e6fe3e7e42533d6d6c15662e0d ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.pathmorphing.code.tex" 1601326656 321 cdd11262840e01e25374a2d458f15e99 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.pathreplacing.code.tex" 1601326656 1319 0b2de5126c6cbc295f0eb77f7344b34d ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryplotmarks.code.tex" 1601326656 325 36322b0789619b270aec5993d5a9ed08 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarytopaths.code.tex" 1608933718 11518 738408f795261b70ce8dd47459171309 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex" 1621110968 186007 6e7dfe0bd57520fd5f91641aa72dcac8 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathmorphing.code.tex" 1601326656 8843 5533436db3e30fbad1e0440db6027dac ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathreplacing.code.tex" 1601326656 7474 f05a7223b140f230922562ac6a9fede5 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryfpu.code.tex" 1608933718 85938 8e4ba97c5906e1c0d158aea81fe29af7 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.tex" 1601326656 32995 ac577023e12c0e4bd8aa420b2e852d1a ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplotmarks.code.tex" 1601326656 14524 e1074042dc8f19d631452e43073ea3ba ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex" 1557692582 3063 8c415c68a0f3394e45cfeca0b65f6ee6 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex" 1601326656 521 8e224a7af69b7fee4451d1bf76b46654 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex" 1601326656 13391 84d29568c13bdce4133ab4a214711112 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex" 1601326656 104935 184ed87524e76d4957860df4ce0cd1c3 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex" 1601326656 10165 cec5fa73d49da442e56efc2d605ef154 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex" 1601326656 28178 41c17713108e0795aac6fef3d275fbca ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex" 1601326656 9989 c55967bf45126ff9b061fa2ca0c4694f ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.tex" 1601326656 3865 ac538ab80c5cf82b345016e474786549 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics.code.tex" 1557692582 3177 27d85c44fbfe09ff3b2cf2879e3ea434 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex" 1621110968 11024 0179538121bc2dba172013a3ef89519f ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex" 1608933718 7854 4176998eeefd8745ac6d2d4bd9c98451 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex" 1601326656 3379 781797a101f647bab82741a99944a229 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code.tex" 1601326656 92405 f515f31275db273f97b9d8f52e1b0736 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex" 1601326656 37376 11cd75aac3da1c1b152b2848f30adc14 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex" 1601326656 8471 c2883569d03f69e8e1cabfef4999cfd7 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduledecorations.code.tex" 1601326656 71722 aa25655703db0306f6401798e312b7b8 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex" 1601326656 21201 08d231a2386e2b61d64641c50dc15abd ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex" 1601326656 16121 346f9013d34804439f7436ff6786cef7 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex" 1621110968 44784 cedaa399d15f95e68e22906e2cc09ef8 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex" 1621110968 465 d68603f8b820ea4a08cce534944db581 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg" 1601326656 926 2963ea0dcf6cc6c0a770b69ec46a477b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def" 1601326656 5546 f3f24d7898386cb7daac70bdd2c4d6dc ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-luatex.def" 1606168878 13244 6674e4de0678d77c2d7465acc4ea20d7 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def" 1601326656 12601 4786e597516eddd82097506db7cfa098 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex" 1621110968 61163 9b2eefc24e021323e0fc140e9826d016 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex" 1601326656 1896 b8e0ca0ac371d74c0ca05583f6313c91 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex" 1601326656 7778 53c8b5623d80238f6a20aa1df1868e63 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex" 1606168878 23997 a4bed72405fa644418bea7eac2887006 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex" 1621110968 37060 797782f0eb50075c9bc952374d9a659a ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex" 1601326656 37431 9abe862035de1b29c7a677f3205e3d9f ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex" 1601326656 4494 af17fb7efeafe423710479858e42fa7e ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex" 1601326656 7251 fb18c67117e09c64de82267e12cd8aa4 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex" 1621110968 29274 e15c5b7157d21523bd9c9f1dfa146b8e ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def" 1621110968 6825 a2b0ea5b539dda0625e99dd15785ab59 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplots.surfshading.code.tex" 1452211337 22701 5fab7b8ebb90b053dc067d1bd37e43c2 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/libs/pgfplotslibrary.code.tex" 1422740226 3047 aa82404aec57311271f4991c44bd71dc ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.contourlua.code.tex" 1620507943 2931 5d52092da9e839accd7c9026062fe5c3 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsarray.code.tex" 1496704190 23537 54be8160344d894595f6d145b1311658 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsdeque.code.tex" 1262481251 4288 b8d6247899b21e3bb66bb11b24d30f2c ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsliststructure.code.tex" 1452211337 13828 11d1b09335a4a8baa693dd1e6cac3edf ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsliststructureext.code.tex" 1496704190 24373 6544c1554e5da33118301011eb03058d ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsmatrix.code.tex" 1364427911 18861 7dc35832c8ccea3aa73cdcd75ec0a60b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstableshared.code.tex" 1583276309 83469 f77a7d8a23834d4c2472f8dba8e67bff ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_loader.code.tex" 1583276309 12347 43d867ea29e34d528123d9ef750aa146 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.code.tex" 1620507943 485274 aafeb7052fbed4c8aba6fcc36c94ea72 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.errorbars.code.tex" 1452211337 22428 72578a4c9324bc5dfafe23fe64f64024 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.markers.code.tex" 1583276309 12489 859c23df41fb9067128ef5a64b01c0a4 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.paths.code.tex" 1583276309 3533 973f376afa5a4526f16b11630b9931b4 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.revision.tex" 1621284213 520 2a55e10851bbb34fb49a8e1d6b50a09b ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.scaling.code.tex" 1523216742 123680 d33fda4929d7200c3e6f0ec83c006aef ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotscoordprocessing.code.tex" 1583276309 367035 be5ad6faf030b5e07b899b712359f9d2 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotscore.code.tex" 1470951798 19944 7957349fbe31c4e8dea9de4cd41cb086 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsmeshplothandler.code.tex" 1496704190 133871 7247b31742a2240343a6739cb76d6821 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsmeshplotimage.code.tex" 1620507943 25239 bf1615252744653354985789b73e7404 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsplothandlers.code.tex" 1620507943 120954 bdf135670013db80411b2fb0f95876ac ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex" 1620507943 26393 a7d9bbecdd0db20d652c909dac892e25 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsticks.code.tex" 1583276309 91244 1a0e9e49b7a2d10d1b1a610306ba4f8c ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/sys/pgflibrarypgfplots.surfshading.pgfsys-pdftex.def" 1470951798 5907 9dc460712c23e5b3338820499d47608c ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/sys/pgfplotssysgeneric.code.tex" 1351287374 3095 c82d281b748902a65be2ccca97360b11 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotsbinary.code.tex" 1430688073 23050 a369aa910ef860a3621fe0459faa335c ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotsbinary.data.code.tex" 1346285630 26859 7a4ee9d206fb0a0daa0d3108445afb57 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotscolor.code.tex" 1380839021 23958 1b96260863091af1669c3a38b1c4c9af ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotscolormap.code.tex" 1496704190 88956 018b2512ef27998e97af72e8b1dcdbd5 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.code.tex" 1620507943 71792 dba1b75b15201895eb36f142f13b3238 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.verb.code.tex" 1312159636 3286 c17079ba50483e1ac1721268ea016041 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty" 1576624663 7008 f92eaa0a3872ed622bbf538217cd2ab7 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex" 1605910342 19231 3cbf682090baecad8e17a66b7a271ed1 ""
+  "/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex" 1605910342 7677 cf3e6aa6a8d444f55327f61df80bfa0c ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty" 1591045760 12594 0d51ac3a545aaaa555021326ff22a6cc ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty" 1359763108 5949 3f3fd50a8cc94c3d4cbf4fc66cd3df1c ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty" 1359763108 13829 94730e64147574077f8ecfea9bb69af4 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd" 1359763108 961 6518c6525a34feb5e8250ffa91731cff ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd" 1359763108 961 d02606146ba5601b5645f987c92e6193 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty" 1622667781 2222 da905dc1db75412efd2d8f67739f0596 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty" 1622667781 4173 bc0410bcccdff806d6132d3c1ef35481 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty" 1636758526 87648 07fbb6e9169e00cb2a2f40b31b2dbf3c ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty" 1636758526 4128 8eea906621b6639f7ba476a472036bbe ""
+  "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty" 1636758526 2444 926f379cc60fcf0c6e3fee2223b4370d ""
+  "/usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty" 1576191570 19336 ce7ae9438967282886b3b036cfad1e4d ""
+  "/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty" 1576625391 3935 57aa3c3e203a5c2effb4d2bd2efbc323 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty" 1636758526 3034 3bfb87122e6fa8758225c0dd3cbaceba ""
+  "/usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty" 1636758526 2462 754d6b31b2ab5a09bb72c348ace2ec75 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty" 1622581934 4946 461cc78f6f26901410d9f1d725079cc6 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty" 1622581934 5157 f308c7c04889e16c588e78aa42599fae ""
+  "/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty" 1622581934 5049 969aec05d5f39c43f8005910498fcf90 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo" 1636758526 8464 74db94825c407b51399ca17d9bd38a3d ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls" 1642805339 12310 2b9d5ca8ca1cc18adf963d2ae2e8b18a ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty" 1634676111 24160 45a13ef4310e1e6ae8a2702a712b5f37 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty" 1642805339 7344 4b669c019e50a1be48999086dfa79ba1 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty" 1642805339 12589 c2e8a707f95e114b40e2be10f5aefffa ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty" 1634676111 26232 66f0c0fc1c3ea04aadb9c1402292d0ac ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty" 1563915504 9407 98317d4428bbbc4430035c0c0e3898d5 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty" 1634676111 13642 ba13518fbcbdad62e3935775004ddea2 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty" 1642805339 25568 b143e4d6d4d09120b7bab4bac96b2093 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty" 1642805339 12171 76b69a0f505c817a764f41b6d7fb98e1 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty" 1642805339 9209 8a4ea3057cafb3e094ef6fcec6ff5abc ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty" 1612994634 17622 85760d86f730e8faf1f7378f6e67e409 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty" 1519256047 8313 358d4bb860bd9098eb24099f36b27af1 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty" 1616189216 7574 6d0e29b16443d86a896479ec2aabff07 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty" 1519256047 29020 6cae2187b2d2bc4f39b6bb5bddbcf031 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty" 1634676111 5712 f2473ee53b8c7edb3cfb0b157f067562 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty" 1500070590 1753 c10ec1df45e4b4c7ee05e306d23f95d7 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty" 1595450012 27425 7f090822023c1cb57d609b70b5e7cc42 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty" 1500070590 1593 48c3729494fa250d34789fd6af677f99 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty" 1616189216 13527 6266cecef9dcaa294ba1dc5ff2d8a798 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty" 1500070590 5753 fbf8c2f7c7d6d5d1d2b900c353f094e8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty" 1500070590 1140 cdaff8d445bd2a4e7afdec5190a758c0 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty" 1500070590 4548 cdde9ae4b614ce5ea4cf7a232ceeb6a8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty" 1563915504 5356 d32dea458460fce4541d4f9aa765b876 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty" 1634676111 7755 23d097ce0f5b45524f920565fe65e8ae ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty" 1483400771 637 685bd3d40aca2fa87965a39bc31aca7f ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty" 1595450012 1808 098e1772761e9b4a016e74f1a4c1cb74 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty" 1519256047 4026 1ba2c6a2acf275d63cb85d60d8597fe8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty" 1535061494 7089 c34bc77851d46db7348b94bd5e51168a ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty" 1519256047 4236 21e590075d6781cc58fee783316ee268 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty" 1513642141 333 48f83c1a5bf00cbab1ca9013199d6da1 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonarticle.20.pdf" 1513642141 2958 4e0c4a6e994e5c4d9da11c477e927f0f ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonarticle.pdf" 1513642141 2936 6cc3ef0682cbb62be8aa1b19f0a84ed6 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonbook.20.pdf" 1513642141 2734 0bcf939051dd2a936cdfe5982f7c233b ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonbook.pdf" 1513642141 2667 7624351b441ffe4bd2d14e08fbcf063d ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamericononline.20.pdf" 1513642141 24451 195d2c060e84f339954bc6d9b52131d7 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamericononline.pdf" 1513642141 24611 df07010540266b2b205b492a4d02e7e1 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty" 1642805339 13080 71b38252cbe3d689bcd03161d205eb84 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty" 1642805339 6946 ef0e875be97ab827b5cf3232042f1628 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty" 1513642141 355 75c98e7b8f427eb7c625ed391b140c5b ""
+  "/usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty" 1579038678 6078 f1cb470c9199e7110a27851508ed7a5c ""
+  "/usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty" 1427500626 4105 4c80eaed8cd4f9a80cc6244c0adeb81f ""
+  "/usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty" 1427500626 27587 b023ffe1328fa89e7f133201d87029de ""
+  "/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty" 1579991033 13886 d1306dcf79a944f6988e688c1785f9ce ""
+  "/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty" 1601931149 46845 3b58f70c6e861a13d927bff09d35ecbc ""
+  "/usr/share/texlive/texmf-dist/tex/latex/fmtcount/fc-english.def" 1580337424 14353 f66b7dd28616119c2519cd5cc4dcae14 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty" 1580337424 12389 43a81443714469abac77ce09f44ad2e2 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty" 1580337424 12098 5c732241af77b5f0e56e640b7d538395 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty" 1582668197 30872 ed70d543c537f19c96fc753321f1c3cc ""
+  "/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty" 1578002852 41601 9cf6c5257b1bc7af01a58859749dd37a ""
+  "/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg" 1459978653 1213 620bba36b25224fa9b7e1ccb4ecb76fd ""
+  "/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg" 1465944070 1224 978390e9c2234eab29404bc21b268d1e ""
+  "/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def" 1601931164 19103 48d29b6e2a64cb717117ef65f107b404 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty" 1639603921 7197 eb6c1ebf41667a05cb50c23c19d5e8bc ""
+  "/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty" 1622581934 18399 7e40f80366dffb22c0e7b70517db5cb4 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty" 1636758526 7996 a8fb260d598dcaf305a7ae7b9c3e3229 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty" 1622581934 2671 4de6781a30211fe0ea4c672e4a2a8166 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty" 1636758526 4009 187ea2dc3194cd5a76cd99a8d7a6c4d0 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty" 1580250785 17914 4c28a13fc3d975e6e81c9bea1d697276 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def" 1623096352 49890 0bb76a5b745d92e86aed6f3f93e334f0 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def" 1623096352 1777 940b1aa83773bc035eb882e8d6842769 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty" 1623096352 230915 97a8817f13de4e61bbc3592cb2caa995 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty" 1612734870 13242 133e617c5eebffdd05e421624022b267 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def" 1623096352 14132 c9404e8e78123ef0d1007c34d1d6da51 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def" 1623096352 117004 86586f287ddfad919a0a4bd68934277a ""
+  "/usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty" 1507930826 3910 e04f6a6d983bdbdb024917b7ccc80262 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty" 1637529091 99856 6cbb9d59d820d727b2acbf2edddcf8c8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty" 1637529091 11081 5538240709a5dbcdc97e4d1524f034a8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty" 1637529091 3225 54deb0fdd4552a94c6525a4a8ff74efc ""
+  "/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty" 1637529091 1954 94f3677c5f3a58b3854eb25278202694 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty" 1602274869 22521 d2fceb764a442a2001d257ef11db7618 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def" 1642022539 29921 f0f4f870357ebfb8fe58ed9ed4ee9b92 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty" 1642805374 6107 429b3b241150e53f86ce666eb492861e ""
+  "/usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty" 1642022539 4674 ac560df2ef76ab2c406a4948a48f79f8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg" 1279039959 678 4792914a8f45be57bb98413425e4c7af ""
+  "/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty" 1575499565 5766 13a9e8766c47f30327caf893ece86ac8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty" 1601326656 1090 bae35ef70b3168089ef166db3e66f5b2 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty" 1601326656 410 615550c46f918fcbee37641b02a862d9 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty" 1601326656 21013 f4ff83d25bb56552493b030f27c075ae ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty" 1601326656 989 c49c8ae06d96f8b15869da7428047b1e ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty" 1601326656 339 c2e180022e3afdb99c7d0ea5ce469b7d ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty" 1601326656 306 c56a323ca5bf9242f54474ced10fca71 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty" 1601326656 443 8c872229db56122037e86bcda49e14f3 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty" 1601326656 348 ee405e64380c11319f0e249fed57e6c5 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty" 1601326656 274 5ae372b7df79135d240456a1c6f2cf9a ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty" 1601326656 325 f9f16d12354225b7dd52a3321f085955 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty" 1601326656 2232 b9a67bccba736ed334b4b1a860a85c6f ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty" 1496704190 4904 ee78b44e85d6fccf08cd99370557481e ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty" 1575674250 85722 674bb1bdd5ee2d78383a11e280d8251f ""
+  "/usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdrawenc.dfu" 1575674250 7980 7af90c90876992fc604543eb1fde4107 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty" 1576624809 9878 9e94e8fa600d95f9c7731bb21dfb67a4 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty" 1575674187 9715 b051d5b493d9fe5f4bc251462d039e5f ""
+  "/usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty" 1580595219 4282 5d27280ace1239baaa4a225df16125ff ""
+  "/usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty" 1643838064 278240 d4b89a1802011f3ee8109ec59cd1f876 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty" 1606428179 43468 671ae75b3a15019004495eff4c0911e8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty" 1601156499 12834 212c11575fd736fdcf1f0fd8e72900f5 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/tools/array.sty" 1636758526 12694 6c23725d50ab9d1e2d3ce482c58ffcf3 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty" 1622581934 10214 00ce62e730d0cfe22b35e8f1c84949c7 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty" 1622581934 3468 068d84ef9735e15f11c5a120c0a1a139 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty" 1622581934 4118 0f286eca74ee36b7743ff20320e5479f ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translations/translations-basic-dictionary-english.trsl" 1641504762 5594 be2b9cd9ef9fd98fdd85c0156600daf9 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty" 1641504762 44107 6f2f3317a642c086712536af0abfcbd8 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary-English.dict" 1596662134 3535 7dc96051305a7e943219126c49c44cd6 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dictionary-English.dict" 1512078926 903 c6d17f0656e9e1abb172b4faebabd617 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dictionary-English.dict" 1512078926 433 bfb8d1c2c020defd2de8e5c276710094 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionary-English.dict" 1512078926 1337 9a6c05e8f0c8b3c5f27cbd0e455cf475 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictionary-English.dict" 1512078926 1638 2bf1a1dea98f8a4d28033fce76e9cc67 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictionary-English.dict" 1512078926 3523 1f9d9b91f7d78b73e74c7e97bca30fb0 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty" 1622492733 8765 56d370785f0143111ff9898b5adfe08e ""
+  "/usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty" 1575152205 4155 541de118e0abc42fce3317addc90afb0 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty" 1253232110 1380 971a51b00a14503ddf754cab24c3f209 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/url/url.sty" 1388531844 12796 8edb7d69a20b857904dd0ea757c14ec9 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty" 1635798903 56029 3f7889dab51d620aa43177c391b7b190 ""
+  "/usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty" 1605910342 4902 efb3d66683a2da2a232f71e3a571a899 ""
+  "/usr/share/texlive/texmf-dist/web2c/texmf.cnf" 1644012257 39432 7155514e09a3d69036fac785183a21c2 ""
+  "/usr/share/texmf/fonts/enc/dvips/lm/lm-ec.enc" 1254938640 2375 baa924870cfb487815765f9094cf3728 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/ec-lmss10.tfm" 1254938640 11176 53ebf7a171df1f9447b387b178768bb5 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/ec-lmss12.tfm" 1254938640 11232 955a7245396175d9219648eadc654ac9 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/ec-lmss8.tfm" 1254938640 11180 705632ac6b4fb69204ad970192cdf4e5 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/ec-lmssbx10.tfm" 1254938640 11168 06d87f5698fd1b642d96449b7c8d90b0 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/ec-lmtt10.tfm" 1254938640 1372 2ef2c2b492b3c4cd7879fe083abbb061 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/lmex10.tfm" 1254938640 992 ce925c9346c7613270a79afbee98c070 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/lmmi10.tfm" 1254938640 1528 6d36b2385e0ca062a654de6ac59cb34f ""
+  "/usr/share/texmf/fonts/tfm/public/lm/lmmi6.tfm" 1254938640 1512 94a3fd88c6f27dbd9ecb46987e297a4e ""
+  "/usr/share/texmf/fonts/tfm/public/lm/lmmi8.tfm" 1254938640 1520 a3fe5596932db2db2cbda300920dd4e9 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/lmsy10.tfm" 1254938640 1308 02cc510f9dd6012e5815d0c0ffbf6869 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/lmsy6.tfm" 1254938640 1300 b0605d44c16c22d99dc001808e4f24ea ""
+  "/usr/share/texmf/fonts/tfm/public/lm/lmsy8.tfm" 1254938640 1304 cdc9a17df9ef0d2dc320eff37bbab1c4 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/rm-lmr10.tfm" 1254938640 11868 4f81e9b6033c032bdaf9884f4d7ef412 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/rm-lmr6.tfm" 1254938640 11836 e3b6ce3e601aec94f64a536e7f4224d5 ""
+  "/usr/share/texmf/fonts/tfm/public/lm/rm-lmr8.tfm" 1254938640 11864 309fd7f43e4a0ba39f6f7644d76e8edf ""
+  "/usr/share/texmf/fonts/type1/public/lm/lmss10.pfb" 1254938640 97408 f595704ec2a07246c2d6f7b602587452 ""
+  "/usr/share/texmf/fonts/type1/public/lm/lmss8.pfb" 1254938640 94400 e33ecfb646a9f148e2e53da01a9168fe ""
+  "/usr/share/texmf/fonts/type1/public/lm/lmssbx10.pfb" 1254938640 119663 e82fa1a58f98ccd89bdbd77311ac9cf1 ""
+  "/usr/share/texmf/fonts/type1/public/lm/lmtt10.pfb" 1254938640 113227 1010e11451afc2822c95dae77c390042 ""
+  "/usr/share/texmf/tex/latex/lm/lmodern.sty" 1256929440 1606 c17281c7cff2bbd7ff0173e1433487ec ""
+  "/usr/share/texmf/tex/latex/lm/omllmm.fd" 1256929440 888 44447a3a3af84a22454ef89500942d93 ""
+  "/usr/share/texmf/tex/latex/lm/omslmsy.fd" 1256929440 805 af340a8260c447aa315cfc740ff0152f ""
+  "/usr/share/texmf/tex/latex/lm/omxlmex.fd" 1256929440 566 a94661f7b66063f191960bb7935b6ba2 ""
+  "/usr/share/texmf/tex/latex/lm/ot1lmr.fd" 1256929440 1880 bae7b659316f7344a86218ad38b01d91 ""
+  "/usr/share/texmf/tex/latex/lm/t1lmss.fd" 1256929440 1639 ba1c66ef577aa5cadc2c0fdc691a26ee ""
+  "/usr/share/texmf/tex/latex/lm/t1lmtt.fd" 1256929440 2681 354015af3b61e7be30009f084986375a ""
+  "/usr/share/texmf/web2c/texmf.cnf" 1644012257 39432 7155514e09a3d69036fac785183a21c2 ""
+  "/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map" 1661855397 4076253 38befb6d6b6e65b49c50e6f58e595c43 ""
+  "/var/lib/texmf/web2c/pdftex/pdflatex.fmt" 1661855409 1511258 48b331477fc99ed5ad6f4a5dd0889b17 ""
+  "beamer_slider_preamble.tex" 1664186994 2728 dd84392bcc98cbdc080fd45d3291136a ""
+  "beamercolorthemeDTU.sty" 1664186994 1181 7ab9734d3304a1004f2d9e1737bd3023 ""
+  "beamerfontthemeDTU.sty" 1664186994 1259 711cf5a5686863499f78b39f42a55f2a ""
+  "beamerinnerthemeDTU.sty" 1664186994 1413 443050b5e9bf0131334a4dd368ae135d ""
+  "beamerouterthemeDTU.sty" 1664186994 2587 ef6b483247d69fb58cb5fae2db9f1840 ""
+  "beamerthemeDTU.sty" 1664186994 7254 017a52b2de7ff8eb9becb7a433e0dca2 ""
+  "departments.tex" 1664186994 9638 46ca44325622949c043b61db8bfa9b5e ""
+  "dtucolours.tex" 1664186994 5683 ab2862d4c2b577922d042e90ebfdfadd ""
+  "index_NO_SVGS.aux" 1664186999 1412 2d0a9582e28c65e3f8629db6ea0ea185 "pdflatex"
+  "index_NO_SVGS.nav" 1664186999 395 640a03f4d3f0f705896c1d8375ddfa75 "pdflatex"
+  "index_NO_SVGS.out" 1664186998 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex"
+  "index_NO_SVGS.tex" 1664186994 866 3d0378f228ccca1ee114e2d0d47816c2 ""
+  "tex_dtu_compute_a_uk.pdf" 1664186994 13504 7ae3ecb9b649001643f902e32d3a8cca ""
+  "tex_dtu_frise.pdf" 1664186994 32488 57c0f48ec5395d976ac1e57718922c22 ""
+  "tex_dtu_logo.pdf" 1664186994 1830 e452da49133969a7656f3882c11e9b04 ""
+  (generated)
+  "index_NO_SVGS.aux"
+  "index_NO_SVGS.log"
+  "index_NO_SVGS.nav"
+  "index_NO_SVGS.out"
+  "index_NO_SVGS.pdf"
+  "index_NO_SVGS.snm"
+  "index_NO_SVGS.toc"
diff --git a/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.fls b/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.fls
new file mode 100644
index 0000000000000000000000000000000000000000..291d4099c9057f0281f59b402364ec36ab7f228f
--- /dev/null
+++ b/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.fls
@@ -0,0 +1,1876 @@
+PWD /home/tuhe/Documents/unitgrade_private/docs/presentation2022
+INPUT /etc/texmf/web2c/texmf.cnf
+INPUT /usr/share/texmf/web2c/texmf.cnf
+INPUT /usr/share/texlive/texmf-dist/web2c/texmf.cnf
+INPUT /var/lib/texmf/web2c/pdftex/pdflatex.fmt
+INPUT index_NO_SVGS.tex
+OUTPUT index_NO_SVGS.log
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamer.cls
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemodes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasedecode.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/size11.clo
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/size11.clo
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/size11.clo
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/size11.clo
+INPUT /usr/share/texlive/texmf-dist/fonts/map/fontname/texfonts.map
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr10.tfm
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/xxcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaserequires.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecompatibility.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasefont.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/sansmathaccent/sansmathaccent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetranslator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasemisc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetwoscreens.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseoverlay.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetitle.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasesection.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframe.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseverbatim.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframesize.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseframecomponents.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasecolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenotes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetoc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseauxtemplates.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaseboxes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbaselocalstructure.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasenavigation.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasetheorems.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerbasethemes.sty
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmss10.tfm
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamercolorthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerinnerthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonbook.pdf
+OUTPUT index_NO_SVGS.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonbook.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonbook.20.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonbook.20.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonarticle.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonarticle.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonarticle.20.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericonarticle.20.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericononline.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericononline.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericononline.20.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamericononline.20.pdf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerouterthemedefault.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT ./beamer_slider_preamble.tex
+INPUT beamer_slider_preamble.tex
+INPUT ./beamer_slider_preamble.tex
+INPUT beamer_slider_preamble.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/jknappen/ec/ecss1095.tfm
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel/txtbabel.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf
+INPUT /usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgfplots/pgfplots.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.revision.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.revision.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.revision.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-luatex.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-luatex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarytopaths.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarytopaths.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotscore.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/sys/pgfplotssysgeneric.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/libs/pgfplotslibrary.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplotsoldpgfsupp_loader.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryfpu.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryfpu.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryfpu.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsliststructure.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsliststructureext.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsarray.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsmatrix.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstableshared.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/liststructure/pgfplotsdeque.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotsbinary.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotsbinary.data.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.verb.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplots.surfshading.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/sys/pgflibrarypgfplots.surfshading.pgfsys-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/sys/pgflibrarypgfplots.surfshading.pgfsys-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotscolormap.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/util/pgfplotscolor.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsplothandlers.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsmeshplothandler.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsmeshplotimage.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.scaling.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotscoordprocessing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.errorbars.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.markers.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplotsticks.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/pgfplots.paths.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduledecorations.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.pathmorphing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.pathmorphing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathmorphing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathmorphing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.pathreplacing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarydecorations.pathreplacing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathreplacing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathreplacing.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.contourlua.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplots.contourlua.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryplotmarks.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryplotmarks.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplotmarks.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplotmarks.code.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/booktabs/booktabs.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/siunitx/siunitx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/svg/svg.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/ifplatform/ifplatform.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/shellesc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/catchfile/catchfile.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /dev/null
+INPUT /dev/null
+INPUT /dev/null
+INPUT ./index_NO_SVGS.w18
+INPUT index_NO_SVGS.w18
+INPUT index_NO_SVGS.w18
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/transparent/transparent.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdraw.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdrawenc.dfu
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdrawenc.dfu
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdrawenc.dfu
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pmboxdraw/pmboxdrawenc.dfu
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT ./beamerthemeDTU.sty
+INPUT ./beamerthemeDTU.sty
+INPUT beamerthemeDTU.sty
+INPUT ./beamerthemeDTU.sty
+INPUT ./beamerthemeDTU.sty
+INPUT ./beamerthemeDTU.sty
+INPUT ./beamerthemeDTU.sty
+INPUT ./beamerthemeDTU.sty
+INPUT beamerthemeDTU.sty
+INPUT ./beamerthemeDTU.sty
+INPUT beamerthemeDTU.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex
+INPUT /usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcprefix.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fcnumparser.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fc-english.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fc-english.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fc-english.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fc-english.def
+INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/datetime/datetime-defaults.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/fmtcount/fmtcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty
+INPUT ./departments.tex
+INPUT ./departments.tex
+INPUT ./departments.tex
+INPUT departments.tex
+INPUT ./departments.tex
+INPUT ./departments.tex
+INPUT departments.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT ./beamerfontthemeDTU.sty
+INPUT ./beamerfontthemeDTU.sty
+INPUT beamerfontthemeDTU.sty
+INPUT ./beamerfontthemeDTU.sty
+INPUT ./beamerfontthemeDTU.sty
+INPUT ./beamerfontthemeDTU.sty
+INPUT ./beamerfontthemeDTU.sty
+INPUT ./beamerfontthemeDTU.sty
+INPUT beamerfontthemeDTU.sty
+INPUT ./beamerfontthemeDTU.sty
+INPUT beamerfontthemeDTU.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/beamer/beamerfontthemeprofessionalfonts.sty
+INPUT ./beamerouterthemeDTU.sty
+INPUT ./beamerouterthemeDTU.sty
+INPUT beamerouterthemeDTU.sty
+INPUT ./beamerouterthemeDTU.sty
+INPUT ./beamerouterthemeDTU.sty
+INPUT ./beamerouterthemeDTU.sty
+INPUT ./beamerouterthemeDTU.sty
+INPUT ./beamerouterthemeDTU.sty
+INPUT beamerouterthemeDTU.sty
+INPUT ./beamerouterthemeDTU.sty
+INPUT beamerouterthemeDTU.sty
+INPUT ./beamerinnerthemeDTU.sty
+INPUT ./beamerinnerthemeDTU.sty
+INPUT beamerinnerthemeDTU.sty
+INPUT ./beamerinnerthemeDTU.sty
+INPUT ./beamerinnerthemeDTU.sty
+INPUT ./beamerinnerthemeDTU.sty
+INPUT ./beamerinnerthemeDTU.sty
+INPUT ./beamerinnerthemeDTU.sty
+INPUT beamerinnerthemeDTU.sty
+INPUT ./beamerinnerthemeDTU.sty
+INPUT beamerinnerthemeDTU.sty
+INPUT ./beamercolorthemeDTU.sty
+INPUT ./beamercolorthemeDTU.sty
+INPUT beamercolorthemeDTU.sty
+INPUT ./beamercolorthemeDTU.sty
+INPUT ./beamercolorthemeDTU.sty
+INPUT ./beamercolorthemeDTU.sty
+INPUT ./beamercolorthemeDTU.sty
+INPUT ./beamercolorthemeDTU.sty
+INPUT beamercolorthemeDTU.sty
+INPUT ./beamercolorthemeDTU.sty
+INPUT beamercolorthemeDTU.sty
+INPUT ./dtucolours.tex
+INPUT ./dtucolours.tex
+INPUT ./dtucolours.tex
+INPUT dtucolours.tex
+INPUT ./dtucolours.tex
+INPUT ./dtucolours.tex
+INPUT dtucolours.tex
+INPUT /usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/textpos/textpos.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/lmodern.sty
+INPUT /usr/share/texmf/tex/latex/lm/t1lmss.fd
+INPUT /usr/share/texmf/tex/latex/lm/t1lmss.fd
+INPUT /usr/share/texmf/tex/latex/lm/t1lmss.fd
+INPUT /usr/share/texmf/tex/latex/lm/t1lmss.fd
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmss10.tfm
+INPUT ./index_NO_SVGS.aux
+INPUT index_NO_SVGS.aux
+INPUT index_NO_SVGS.aux
+OUTPUT index_NO_SVGS.aux
+INPUT /usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
+INPUT /usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
+INPUT /usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
+INPUT /usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT ./index_NO_SVGS.out
+INPUT index_NO_SVGS.out
+INPUT ./index_NO_SVGS.out
+INPUT index_NO_SVGS.out
+INPUT ./index_NO_SVGS.out
+INPUT index_NO_SVGS.out
+INPUT ./index_NO_SVGS.out
+INPUT index_NO_SVGS.out
+INPUT ./index_NO_SVGS.out
+INPUT ./index_NO_SVGS.out
+OUTPUT index_NO_SVGS.out
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-basic-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-bibliography-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-environment-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-months-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-numbers-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translator/translator-theorem-dictionary-English.dict
+INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations-basic-dictionary-english.trsl
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations-basic-dictionary-english.trsl
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations-basic-dictionary-english.trsl
+INPUT /usr/share/texlive/texmf-dist/tex/latex/translations/translations-basic-dictionary-english.trsl
+INPUT ./index_NO_SVGS.nav
+INPUT index_NO_SVGS.nav
+INPUT index_NO_SVGS.nav
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmss8.tfm
+INPUT ./tex_dtu_logo.pdf
+INPUT tex_dtu_logo.pdf
+INPUT ./tex_dtu_logo.pdf
+INPUT ./tex_dtu_logo.pdf
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmss12.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmssbx10.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmss10.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmss8.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmss8.tfm
+INPUT ./tex_dtu_logo.pdf
+INPUT tex_dtu_logo.pdf
+INPUT ./tex_dtu_logo.pdf
+INPUT ./tex_dtu_compute_a_uk.pdf
+INPUT tex_dtu_compute_a_uk.pdf
+INPUT ./tex_dtu_compute_a_uk.pdf
+INPUT ./tex_dtu_compute_a_uk.pdf
+INPUT ./tex_dtu_frise.pdf
+INPUT tex_dtu_frise.pdf
+INPUT ./tex_dtu_frise.pdf
+INPUT ./tex_dtu_frise.pdf
+INPUT /var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map
+INPUT /usr/share/texmf/tex/latex/lm/t1lmtt.fd
+INPUT /usr/share/texmf/tex/latex/lm/t1lmtt.fd
+INPUT /usr/share/texmf/tex/latex/lm/t1lmtt.fd
+INPUT /usr/share/texmf/tex/latex/lm/t1lmtt.fd
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmtt10.tfm
+INPUT /usr/share/texmf/tex/latex/lm/ot1lmr.fd
+INPUT /usr/share/texmf/tex/latex/lm/ot1lmr.fd
+INPUT /usr/share/texmf/tex/latex/lm/ot1lmr.fd
+INPUT /usr/share/texmf/tex/latex/lm/ot1lmr.fd
+INPUT /usr/share/texmf/fonts/tfm/public/lm/rm-lmr10.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/rm-lmr8.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/rm-lmr6.tfm
+INPUT /usr/share/texmf/tex/latex/lm/omllmm.fd
+INPUT /usr/share/texmf/tex/latex/lm/omllmm.fd
+INPUT /usr/share/texmf/tex/latex/lm/omllmm.fd
+INPUT /usr/share/texmf/tex/latex/lm/omllmm.fd
+INPUT /usr/share/texmf/fonts/tfm/public/lm/lmmi10.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/lmmi8.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/lmmi6.tfm
+INPUT /usr/share/texmf/tex/latex/lm/omslmsy.fd
+INPUT /usr/share/texmf/tex/latex/lm/omslmsy.fd
+INPUT /usr/share/texmf/tex/latex/lm/omslmsy.fd
+INPUT /usr/share/texmf/tex/latex/lm/omslmsy.fd
+INPUT /usr/share/texmf/fonts/tfm/public/lm/lmsy10.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/lmsy8.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/lmsy6.tfm
+INPUT /usr/share/texmf/tex/latex/lm/omxlmex.fd
+INPUT /usr/share/texmf/tex/latex/lm/omxlmex.fd
+INPUT /usr/share/texmf/tex/latex/lm/omxlmex.fd
+INPUT /usr/share/texmf/tex/latex/lm/omxlmex.fd
+INPUT /usr/share/texmf/fonts/tfm/public/lm/lmex10.tfm
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam7.tfm
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
+INPUT /usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm
+INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm7.tfm
+INPUT /usr/share/texmf/fonts/tfm/public/lm/ec-lmssbx10.tfm
+INPUT ./tex_dtu_logo.pdf
+INPUT tex_dtu_logo.pdf
+INPUT ./tex_dtu_logo.pdf
+OUTPUT index_NO_SVGS.nav
+OUTPUT index_NO_SVGS.toc
+OUTPUT index_NO_SVGS.snm
+INPUT index_NO_SVGS.aux
+INPUT ./index_NO_SVGS.out
+INPUT ./index_NO_SVGS.out
+INPUT /usr/share/texmf/fonts/enc/dvips/lm/lm-ec.enc
+INPUT /usr/share/texmf/fonts/type1/public/lm/lmss10.pfb
+INPUT /usr/share/texmf/fonts/type1/public/lm/lmss8.pfb
+INPUT /usr/share/texmf/fonts/type1/public/lm/lmssbx10.pfb
+INPUT /usr/share/texmf/fonts/type1/public/lm/lmtt10.pfb
diff --git a/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.nav b/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.nav
new file mode 100644
index 0000000000000000000000000000000000000000..9033d8ba0cd2afbd30fe6ab857d8374468715862
--- /dev/null
+++ b/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.nav
@@ -0,0 +1,9 @@
+\headcommand {\slideentry {0}{0}{1}{1/1}{}{0}}
+\headcommand {\beamer@framepages {1}{1}}
+\headcommand {\slideentry {0}{0}{2}{2/2}{}{0}}
+\headcommand {\beamer@framepages {2}{2}}
+\headcommand {\beamer@partpages {1}{2}}
+\headcommand {\beamer@subsectionpages {1}{2}}
+\headcommand {\beamer@sectionpages {1}{2}}
+\headcommand {\beamer@documentpages {2}}
+\headcommand {\gdef \inserttotalframenumber {2}}
diff --git a/devel/example_devel/students/cs108/unitgrade_data/Numpy-setUpClass.json.lock b/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.out
old mode 100755
new mode 100644
similarity index 100%
rename from devel/example_devel/students/cs108/unitgrade_data/Numpy-setUpClass.json.lock
rename to docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.out
diff --git a/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.pdf b/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..f596647998da77ffc7f6255b9cede48f5f635a25
Binary files /dev/null and b/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.pdf differ
diff --git a/devel/example_devel/students/cs108/unitgrade_data/Numpy-test_bad.json.lock b/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.snm
old mode 100755
new mode 100644
similarity index 100%
rename from devel/example_devel/students/cs108/unitgrade_data/Numpy-test_bad.json.lock
rename to docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.snm
diff --git a/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.tex b/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.tex
new file mode 100644
index 0000000000000000000000000000000000000000..91128bf6bd18cc44088034f8a2b58d778165ade5
--- /dev/null
+++ b/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.tex
@@ -0,0 +1,27 @@
+ 
+\documentclass[handout,aspectratio=43]{beamer}
+\usepackage{etoolbox}
+\newtoggle{overlabel_includesvgs}
+\newtoggle{overlabel_includelabels}
+\toggletrue{overlabel_includesvgs}
+\toggletrue{overlabel_includelabels}
+\input{beamer_slider_preamble.tex}
+
+\title{Example slide show}
+\author{Author}
+\date{April 1st, 2022}
+ \togglefalse{overlabel_includesvgs}
+\toggletrue{overlabel_includelabels}
+
+\begin{document}
+\begin{frame}
+\maketitle
+\end{frame}
+% This slideshow is made using slider. Install using: pip install beamer-slider 
+% check http://gitlab.compute.dtu.dk/tuhe/slider for more information. 
+\begin{frame}\osvg{myoverlay} % Use the \osvg{labelname} - tag to create new overlays. Run the command `slider` in the terminal and check the ./osvgs directory for the svg files!
+\frametitle{Slide with an overlay}
+This is some example text!
+\end{frame}
+
+\end{document}
diff --git a/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.toc b/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.toc
new file mode 100644
index 0000000000000000000000000000000000000000..9fbdd18a8c9adf55ec0285e8532d13207dc20bf7
--- /dev/null
+++ b/docs/presentation2022/osvgs/tmp/no_svg_tmp/index_NO_SVGS.toc
@@ -0,0 +1 @@
+\babel@toc {english}{}\relax 
diff --git a/docs/presentation2022/osvgs/x_do_not_edit_myoverlay-l1_nofonts.pdf b/docs/presentation2022/osvgs/x_do_not_edit_myoverlay-l1_nofonts.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..06129376d475dd570f17ce1a108b38b19f7066cd
Binary files /dev/null and b/docs/presentation2022/osvgs/x_do_not_edit_myoverlay-l1_nofonts.pdf differ
diff --git a/docs/presentation2022/tex_compute_uk.pdf b/docs/presentation2022/tex_compute_uk.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..1488ea4bb66ad14ada91789909d4f3b9448e1103
Binary files /dev/null and b/docs/presentation2022/tex_compute_uk.pdf differ
diff --git a/docs/presentation2022/tex_dtu_compute_a_uk.pdf b/docs/presentation2022/tex_dtu_compute_a_uk.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..d0d2f4efcdd8ace82a3d969627865501743c2671
Binary files /dev/null and b/docs/presentation2022/tex_dtu_compute_a_uk.pdf differ
diff --git a/docs/presentation2022/tex_dtu_frise.pdf b/docs/presentation2022/tex_dtu_frise.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..a099312f58e8adc076799f45f00699408020fcc2
Binary files /dev/null and b/docs/presentation2022/tex_dtu_frise.pdf differ
diff --git a/docs/presentation2022/tex_dtu_logo.pdf b/docs/presentation2022/tex_dtu_logo.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..862fbcd41103ab0c721cdcf46f52131c89dfbe03
Binary files /dev/null and b/docs/presentation2022/tex_dtu_logo.pdf differ
diff --git a/docs/presentation_ideas.odt b/docs/presentation_ideas.odt
new file mode 100644
index 0000000000000000000000000000000000000000..d9674a2266d8da65322ffcaf7176e2aed64e9551
Binary files /dev/null and b/docs/presentation_ideas.odt differ
diff --git a/docs/snips/deploy.txt b/docs/snips/deploy.txt
index 9c9f5f667e004436d9a0da31dc8d1e8cc3b9160f..82510eb9271c1e41bf9841a347cbf34643ba3aed 100644
--- a/docs/snips/deploy.txt
+++ b/docs/snips/deploy.txt
@@ -3,7 +3,7 @@
 | | | |_ __  _| |_| |  \/_ __ __ _  __| | ___ 
 | | | | '_ \| | __| | __| '__/ _` |/ _` |/ _ \
 | |_| | | | | | |_| |_\ \ | | (_| | (_| |  __/
- \___/|_| |_|_|\__|\____/_|  \__,_|\__,_|\___| v0.1.27, started: 16/09/2022 14:30:15
+ \___/|_| |_|_|\__|\____/_|  \__,_|\__,_|\___| v0.1.27, started: 16/09/2022 17:07:34
 
 CS 102 Report 2 
 Question 1: Week1                                                                                                       
@@ -61,7 +61,7 @@ AssertionError: [3, 2, 1] != 'Key 0 not found in cache; framework files missing.
 
  * q2)   Total...................................................................................................... 0/6
  
-Total points at 14:30:15 (0 minutes, 0 seconds).....................................................................3/16
+Total points at 17:07:34 (0 minutes, 0 seconds).....................................................................3/16
 
 Including files in upload...
 path.: _NamespacePath(['/home/tuhe/Documents/unitgrade_private/examples/example_framework/instructor/cs102', '/home/tuhe/Documents/unitgrade_private/examples/example_framework/instructor/cs102'])
diff --git a/examples/presentation/Latex/02465shared_preamble.tex b/examples/presentation/Latex/02465shared_preamble.tex
new file mode 100644
index 0000000000000000000000000000000000000000..91b6c297eca86bcb56f98667097c1a129f70d6a8
--- /dev/null
+++ b/examples/presentation/Latex/02465shared_preamble.tex
@@ -0,0 +1,315 @@
+% This preamble should be shared between lectures and exercises. Use it to define stuff
+% WARNING: only edit this file if it is found in the /shared/ folder. Otherwise changes will be overwritten!
+
+% This preamble file is supposed to be shared with the slides.
+\usepackage{amsmath}
+\usepackage{amssymb}
+\usepackage{tcolorbox}
+\usepackage{etoolbox}
+\usepackage{url}
+\usepackage{xspace}
+%\usepackage{cleveref}
+
+\newcommand{\m}[1]{\boldsymbol{ #1}}
+\newcommand{\mt}[1]{\boldsymbol{\tilde{ #1}}}
+\newcommand{\mh}[1]{\boldsymbol{\hat{ #1}}}
+
+\newcommand{\pp}[1]{ {({ #1})}}
+
+\makeatletter
+\newcommand{\@pgstar}[2]{\left(#1\;\middle|\;#2\right)}
+\newcommand{\@pgnostar}[3][]{#1(#2\;#1|\;#3#1)}
+\newcommand{\pg}{\@ifstar\@pgstar\@pgnostar}
+\makeatother
+
+\makeatletter
+\newcommand{\@bgstar}[2]{\left\{#1\;\middle|\;#2\right\}}
+\newcommand{\@bgnostar}[3][]{#1\left\{#2\;#1|\;#3#1\right\} }
+\newcommand{\bg}{\@ifstar\@bgstar\@bgnostar}
+\makeatother
+
+\makeatletter
+\newcommand{\@sbgstar}[2]{\left[#1\;\middle|\;#2\right]}
+\newcommand{\@sbgnostar}[3][]{#1\left[#2\;#1|\;#3#1\right] }
+\newcommand{\sbg}{\@ifstar\@sbgstar\@sbgnostar}
+\makeatother
+
+\newcommand{\mcal}[1]{\mathcal{ #1}}
+\newcommand{\n}[1]{\textsf{#1}}
+
+\newcommand{\C}{\mcal{C}}
+\newcommand{\f}{\m f}
+\newcommand{\X}{\m X}
+\newcommand{\x}{\m x}
+\newcommand{\y}{\m y}
+
+\newcommand{\Frobenius}{\text{Fr\"{o}benius}\xspace}
+\newcommand{\train}{\text{train}}
+\newcommand{\test}{\text{test}}
+\newcommand{\gen}{\text{gen}}
+\newcommand{\val}{\text{val}}
+\newcommand{\parset}{\text{par}}
+\newcommand{\Naive}{\text{Na\"{\i}ve}\xspace}
+\newcommand{\naive}{\text{na\"{\i}ve}\xspace}
+\newcommand{\Kmeans}{$K$-means\xspace}
+\newcommand{\Hac}{Hierarchical agglomerative clustering\xspace}
+\newcommand{\hac}{hierarchical agglomerative clustering\xspace}
+
+
+\newcommand{\Beta}{\textrm{Beta}}
+\newcommand{\Bern}{\textrm{Bernouilli}}
+\newcommand{\Cat}{\textrm{Catagorical}}
+\newcommand{\Multi}{\textrm{Multinomial}}
+
+
+\newcommand{\MI}{\mathrm{MI}}
+\newcommand{\NMI}{\mathrm{NMI}}
+
+\newcommand{\cdf}{\mathrm{cdf}}
+\newcommand{\cdfi}{\mathrm{cdf}^{-1}}
+
+\newcommand{\ClError}{\mathrm{ClassError}}
+\newcommand{\Gini}{\mathrm{Gini}}
+\newcommand{\Entropy}{\mathrm{Entropy}}
+
+\newcommand{\logt}{\log_2}
+
+\definecolor{red}{rgb}{1,0,0}
+\definecolor{blue}{rgb}{0,0,1}
+\definecolor{darkgreen}{rgb}{0,0.5,0}
+
+\newcommand{\EE}{\mathbb{E}}
+\newcommand{\Var}{\operatorname{Var} }
+\newcommand{\std}{\operatorname{std} }
+\newcommand{\median}{\operatorname{median}}
+\newcommand{\sign}{\operatorname{sign}}
+\newcommand{\cor}{\operatorname{cor}}
+\newcommand{\cov}{\operatorname{cov}}
+
+\newcommand{\RR}{\mathbb{R}}
+
+\newcommand{\ks}{ {k^*} }
+\newcommand{\Mks}{\mcal M_{k^*} }
+\newcommand{\Mk}{\mcal M_{k} }
+
+\newcommand{\qand}{\quad \text{ and } \quad }
+\newcommand{\qor}{\quad \text{ or } \quad }
+
+
+\newcommand{\softmax}{\textrm{softmax}}
+\newcommand{\SMC}{\textrm{SMC}}
+\newcommand{\J}{J}
+\newcommand{\EJ}{\textrm{EJ}}
+
+\newcommand{\supp}{\textrm{supp}}
+\newcommand{\conf}{\textrm{conf}}
+
+\newcommand{\TP}{\textrm{TP}}
+\newcommand{\FP}{\textrm{FP}}
+\newcommand{\TN}{\textrm{TN}}
+\newcommand{\FN}{\textrm{FN}}
+
+\newcommand{\starred}{$\bigstar$}
+
+\newcommand{\TPt}{\textrm{TP}_\theta}
+\newcommand{\FPt}{\textrm{FP}_\theta}
+\newcommand{\TNt}{\textrm{TN}_\theta}
+\newcommand{\FNt}{\textrm{FN}_\theta}
+
+\newcommand{\TPRt}{\textrm{TPR}_\theta}
+\newcommand{\FPRt}{\textrm{FPR}_\theta}
+\newcommand{\Bt}{Bayes' theorem\xspace}
+
+\newcommand{\old}{\text{old}}
+
+\newcommand{\starsection}{${}^\bigstar$}
+
+\newcommand{\trace}{\mathrm{trace}}
+\newcommand{\Vspan}{\mathrm{span}}
+
+\DeclareMathOperator*{\argmax}{arg\,max}
+\DeclareMathOperator*{\argmin}{arg\,min}
+
+\newcommand{\density}{\textrm{density}}
+\newcommand{\ard}{\textrm{ard}}
+
+\newcommand{\setupI}{\textbf{setup I}\xspace}
+\newcommand{\setupII}{\textbf{setup II}\xspace}
+\newcommand{\usetupI}{\textbf{Setup I}\xspace}
+\newcommand{\usetupII}{\textbf{Setup II}\xspace}
+\newcommand{\McNemars}{McNemars\xspace}
+
+
+\newtoggle{notes}
+\toggletrue{notes}
+\togglefalse{notes}
+
+
+
+\DeclareMathOperator{\states}{\mcal S}
+\DeclareMathOperator{\actions}{\mcal A}
+
+\makeatletter
+\newcommand{\@pgstarr}[2]{\operatorname{Pr}\left\{#1\;\middle|\;#2\right\}}
+\newcommand{\@pgnostarr}[3][]{#1(#2\;#1|\;#3#1)}
+\newcommand{\Pc}{\@pgstarr}
+\makeatother
+
+\newcommand{\TD}{\mathrm{TD}}
+\newcommand{\TDl}{\mathrm{TD(\lambda)}}
+\newcommand{\Sarsa}{\mathrm{Sarsa}}
+\newcommand{\SarsaL}{\mathrm{Sarsa}(\lambda)}
+
+\newcommand{\mathpage}{
+\begin{textblock}{1}(.75,0)
+	\includegraphics[width=3.5cm]{figures/mathbook}
+\end{textblock}
+}
+
+\DeclareMathOperator{\uv}{\m u}
+\DeclareMathOperator{\xv}{\m x}
+\DeclareMathOperator{\uo}{\overline{ \m u } }
+\DeclareMathOperator{\xo}{\overline{ \m x } }
+
+
+\newcommand{\pyi}[1]{\mintinline{python}{#1}}
+\newcommand{\bai}[1]{\mintinline{bash}{#1}}
+
+%\usepackage{libertine}
+\usepackage{fontawesome5}
+\newcommand{\mmovie}[1]{\noindent\faIcon{gamepad}\bai{#1}}
+
+
+\usepackage{xr-hyper}
+\usepackage{hyperref}
+\usepackage{cleveref}
+
+\definecolor{LightGray}{HTML}{EEEEEE}
+\usepackage{minted}
+\setminted{
+	frame=lines,
+	framesep=1mm,
+	baselinestretch=1.0,
+	bgcolor=LightGray,
+	fontsize=\scriptsize,
+	linenos
+}
+
+\makeatother
+\ifdefined\bluem
+% nothing.
+\else
+\newcommand\bluem[1]{{\textcolor[rgb]{0.20, 0.40, 0.80}{ #1 }}}
+\newcommand\redm[1]{{\textcolor[rgb]{0.60, 0.00, 0.00}{ #1 }}}
+\newcommand\greenm[1]{{\textcolor[HTML]{398E00}{ #1 }}}
+\newcommand\yellowm[1]{{\textcolor[rgb]{1.00, 0.80, 0.00}{ #1 }}}
+
+\newcommand\bluet[1]{{\textcolor[rgb]{0.20, 0.40, 0.80}{\textbf{#1}}}}
+\newcommand\redt[1]{{\textcolor[rgb]{0.60, 0.00, 0.00}{\textbf{#1}}}}
+\newcommand\greent[1]{{\textcolor[HTML]{398E00}{\textbf{#1}}}}
+\newcommand\yellowt[1]{{\textcolor[rgb]{1.00, 0.80, 0.00}{\textbf{#1}}}}
+\fi
+
+\usepackage{xspace}
+\usepackage{algorithm}
+%\usepackage{algpseudocode}
+%\usepackage[linesnumbered,ruled]{algorithm2e}
+%\usepackage{algorithmic}[1]
+\usepackage{algorithmicx}
+\usepackage{algpseudocode}
+\usepackage{booktabs}
+\usepackage{tabularx,ragged2e}
+
+%% TABLES
+\newcolumntype{C}{>{\Centering\arraybackslash}X} % centered "X" column
+
+%% ALGORITHMS TYPESETTING 
+\algnewcommand{\IIf}[1]{\State\algorithmicif\ #1\ \algorithmicthen}
+\algnewcommand{\EndIIf}{\unskip\ \algorithmicend\ \algorithmicif}
+\newcommand{\MLComment}[2][.33\linewidth]{ \Comment{\parbox[t]{#1}{  #2 } } }
+\newcommand{\kw}[1]{\index{#1}\textbf{#1}\marginpar[{\footnotesize \textsc{#1}}]{}\xspace}
+
+%% ALGORITHMS SEARCH %%
+\newcommand{\akw}[1]{\text{\small #1}}
+\newcommand{\node}[4]{\Call{Node}{\akw{state}\!\!=\!#1, \akw{cost}\!=\!#2, \akw{action}\!=\!#3, \akw{parent}\!=\!#4}}
+\newcommand{\front}{\textit{frontier}\xspace}
+\newcommand{\nodes}{\textit{nodes}\xspace}
+\newcommand{\qpop}{\Call{Pop}{\front}}	
+\newcommand{\qinsert}[1]{\Call{Insert}{\front, #1}}	
+%% ALGORITHMS GAMES %%
+
+\newcommand{\gplayer}{\textsc{Player}}	
+\newcommand{\gterminal}{\textsc{Terminal-Test}}	
+\newcommand{\gutility}{\textsc{Utility}}	
+
+
+%% Margin symbols, etc.
+
+%\usepackage{sidenotes} %This package has a problem with the slides
+\usepackage{float} 
+\usepackage{pifont}
+\usepackage{manfnt}
+\reversemarginpar
+\newcommand\implement{\raisebox{0pt}[0cm][0cm]{ {\makebox[-1cm][r]{ \Huge\ding{43}  } }	 } 	  }
+\newcommand{\keyproblem}{\marginpar{\hfill\dbend}}
+
+\usepackage{bbding}
+\newcommand{\onestar}{ {\large{\DavidStarSolid} } }
+\newcommand{\twostar}{ {\large{\DavidStarSolid}\large{\DavidStarSolid} } }
+
+
+	
+\newcommand{\iid}{i.i.d.}
+\newcommand{\cost}{c}
+\newcommand{\pol}{\pi}
+\newcommand{\st}{\bm{x}}
+\newcommand{\cst}{\bm{p}} % costate
+\newcommand{\stdot}{\dot{\bm{x}}}
+\newcommand{\ac}{\bm{u}}
+\newcommand{\ob}{\bm{y}}
+\newcommand{\ad}{\bm{d}}
+\newcommand{\param}{\bm{\theta}} %vector of parameters 
+\newcommand{\hyp}{\bm{y}}
+\newcommand{\feat}{\bm{\phi}}
+
+\newcommand{\stdim}{n}
+\newcommand{\acdim}{m}
+\newcommand{\obdim}{l}
+\newcommand{\datdim}{d}
+
+
+\newcommand{\statespace}{\mathcal{X}}
+\newcommand{\actionspace}{\mathcal{U}}
+
+\newcommand{\h}{h} %used for measurement model
+
+\newcommand{\md}[1]{ { \dot {\m #1}} }
+\newcommand{\mb}[1]{ { \bar {\m #1}} }
+\newcommand{\dm}[1]{ { \delta {\m #1}} }
+
+\newcommand{\w}{\bm{\omega}} %process noise
+\newcommand{\wob}{\bm{\nu}} %measurement noise
+\newcommand{\W}{\Sigma_{\omega}} %measurement covar
+\newcommand{\V}{\Sigma_{\nu}} %measurement noise
+\newcommand{\I}{\bm{i}} %information vector
+
+
+\newcommand{\ham}{\mathcal{H}} %information vector
+
+\newcommand{\R}{\mathbb{R}}
+\newcommand{\E}{\mathbb{E}}
+\newcommand{\tr}{\text{tr}}
+\newcommand{\N}{\mathcal{N}}
+
+
+\newcommand\munderbar[1]{ \underaccent{\bar}{#1}}
+
+\newcommand{\vv}{\textrm{Vec}}
+\newcommand{\diag}{\textrm{diag}}
+
+
+
+\newcommand{\unitgrade}{\textsc{unitgrade}\xspace} 
+
+\newcolumntype{Z}{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}X}
+	
\ No newline at end of file
diff --git a/examples/presentation/Latex/_minted-index/1C8C4C316CEECF02BD7FFC63EFD497326F77AD3888A7BF17566D124427769365.pygtex b/examples/presentation/Latex/_minted-index/1C8C4C316CEECF02BD7FFC63EFD497326F77AD3888A7BF17566D124427769365.pygtex
new file mode 100644
index 0000000000000000000000000000000000000000..5c0dcd1195e6272c5a99925a9f378187ea516806
--- /dev/null
+++ b/examples/presentation/Latex/_minted-index/1C8C4C316CEECF02BD7FFC63EFD497326F77AD3888A7BF17566D124427769365.pygtex
@@ -0,0 +1,15 @@
+\begin{Verbatim}[commandchars=\\\{\}]
+\PYGZgt{}\PYGZgt{}\PYGZgt{}
+\PYGZgt{}\PYGZgt{}\PYGZgt{} \PYG{n+nv}{f1} \PYG{o}{=} Fraction\PYG{o}{(}\PYG{l+m}{1}, \PYG{l+m}{2}\PYG{o}{)}  \PYG{c+c1}{\PYGZsh{} Represents 1/2}
+\PYGZgt{}\PYGZgt{}\PYGZgt{} \PYG{n+nv}{f2} \PYG{o}{=} Fraction\PYG{o}{(}\PYG{l+m}{3}, \PYG{l+m}{5}\PYG{o}{)}  \PYG{c+c1}{\PYGZsh{} Represents 3/5}
+\PYGZgt{}\PYGZgt{}\PYGZgt{} print\PYG{o}{(}f\PYG{l+s+s2}{\PYGZdq{}Result of \PYGZob{}f1\PYGZcb{} + \PYGZob{}f2\PYGZcb{} is\PYGZdq{}}, f1 + f2\PYG{o}{)}
+Result of \PYG{o}{(}\PYG{l+m}{1} / \PYG{l+m}{2}\PYG{o}{)} + \PYG{o}{(}\PYG{l+m}{3} / \PYG{l+m}{5}\PYG{o}{)} is \PYG{o}{(}\PYG{l+m}{11} / \PYG{l+m}{2}\PYG{o}{)}
+\PYGZgt{}\PYGZgt{}\PYGZgt{}
+\PYGZgt{}\PYGZgt{}\PYGZgt{} \PYG{c+c1}{\PYGZsh{} Now do some compound tests:}
+\PYGZgt{}\PYGZgt{}\PYGZgt{} \PYG{n+nv}{s} \PYG{o}{=} \PYG{l+s+s2}{\PYGZdq{} 1 / 4 * 1 / 2\PYGZdq{}}
+\PYGZgt{}\PYGZgt{}\PYGZgt{} print\PYG{o}{(}\PYG{l+s+s2}{\PYGZdq{}Result of\PYGZdq{}}, s, \PYG{l+s+s2}{\PYGZdq{}is\PYGZdq{}}, from\PYGZus{}string\PYG{o}{(}s\PYG{o}{))}
+Result of  \PYG{l+m}{1} / \PYG{l+m}{4} * \PYG{l+m}{1} / \PYG{l+m}{2} is \PYG{o}{(}\PYG{l+m}{1} / \PYG{l+m}{8}\PYG{o}{)}
+\PYGZgt{}\PYGZgt{}\PYGZgt{} \PYG{n+nv}{s} \PYG{o}{=} \PYG{l+s+s2}{\PYGZdq{}5 / 2 div 10 / 3\PYGZdq{}}
+\PYGZgt{}\PYGZgt{}\PYGZgt{} print\PYG{o}{(}\PYG{l+s+s2}{\PYGZdq{}Result of\PYGZdq{}}, s, \PYG{l+s+s2}{\PYGZdq{}is\PYGZdq{}}, from\PYGZus{}string\PYG{o}{(}s\PYG{o}{))}
+Result of \PYG{l+m}{5} / \PYG{l+m}{2} div \PYG{l+m}{10} / \PYG{l+m}{3} is \PYG{o}{(}\PYG{l+m}{15} / \PYG{l+m}{20}\PYG{o}{)}
+\end{Verbatim}
diff --git a/examples/presentation/Latex/_minted-index/4B904B38547539E6886F45285B55E17B8B9AA2C25CD7E542150F54FA151BF004.pygtex b/examples/presentation/Latex/_minted-index/4B904B38547539E6886F45285B55E17B8B9AA2C25CD7E542150F54FA151BF004.pygtex
new file mode 100644
index 0000000000000000000000000000000000000000..6dfa740abd97b8c43300bb43ca5ce25ac5eb4992
--- /dev/null
+++ b/examples/presentation/Latex/_minted-index/4B904B38547539E6886F45285B55E17B8B9AA2C25CD7E542150F54FA151BF004.pygtex
@@ -0,0 +1,3 @@
+\begin{Verbatim}[commandchars=\\\{\}]
+\PYG{n}{f1}\PYG{o}{.}\PYG{n+nf+fm}{\PYGZus{}\PYGZus{}add\PYGZus{}\PYGZus{}}\PYG{p}{(}\PYG{n}{f2}\PYG{p}{)}
+\end{Verbatim}
diff --git a/examples/presentation/Latex/_minted-index/617F95B3C9B5986EE47AB06464B25A4656A75F0008C42025054395883EB49E2F.pygtex b/examples/presentation/Latex/_minted-index/617F95B3C9B5986EE47AB06464B25A4656A75F0008C42025054395883EB49E2F.pygtex
new file mode 100644
index 0000000000000000000000000000000000000000..c93aef079dc1753a8f78bc969dd8d81b5c2da180
--- /dev/null
+++ b/examples/presentation/Latex/_minted-index/617F95B3C9B5986EE47AB06464B25A4656A75F0008C42025054395883EB49E2F.pygtex
@@ -0,0 +1,4 @@
+\begin{Verbatim}[commandchars=\\\{\}]
+Result of  1 / 4 * 1 / 2 is (1 / 8)
+Result of 5 / 2 div 10 / 3 is (15 / 20)
+\end{Verbatim}
diff --git a/examples/presentation/Latex/_minted-index/A9FD9E7563778CEBB343C798E256BFB3E06A867B43241B82760D148E01351E67.pygtex b/examples/presentation/Latex/_minted-index/A9FD9E7563778CEBB343C798E256BFB3E06A867B43241B82760D148E01351E67.pygtex
new file mode 100644
index 0000000000000000000000000000000000000000..049d43805e5243942620d90abada4340318effaa
--- /dev/null
+++ b/examples/presentation/Latex/_minted-index/A9FD9E7563778CEBB343C798E256BFB3E06A867B43241B82760D148E01351E67.pygtex
@@ -0,0 +1,6 @@
+\begin{Verbatim}[commandchars=\\\{\}]
+\PYG{c+c1}{\PYGZsh{} cpp\PYGZus{}course/fractions.py}
+    \PYG{n}{f1} \PYG{o}{=} \PYG{n}{Fraction}\PYG{p}{(}\PYG{l+m+mi}{1}\PYG{p}{,} \PYG{l+m+mi}{2}\PYG{p}{)}  \PYG{c+c1}{\PYGZsh{} Represents 1/2 }
+    \PYG{n}{f2} \PYG{o}{=} \PYG{n}{Fraction}\PYG{p}{(}\PYG{l+m+mi}{3}\PYG{p}{,} \PYG{l+m+mi}{5}\PYG{p}{)} \PYG{c+c1}{\PYGZsh{} Represents 3/5}
+    \PYG{n+nb}{print}\PYG{p}{(}\PYG{l+s+sa}{f}\PYG{l+s+s2}{\PYGZdq{}Result of }\PYG{l+s+si}{\PYGZob{}}\PYG{n}{f1}\PYG{l+s+si}{\PYGZcb{}}\PYG{l+s+s2}{ + }\PYG{l+s+si}{\PYGZob{}}\PYG{n}{f2}\PYG{l+s+si}{\PYGZcb{}}\PYG{l+s+s2}{ is\PYGZdq{}}\PYG{p}{,} \PYG{n}{f1}\PYG{o}{+}\PYG{n}{f2}\PYG{p}{)} 
+\end{Verbatim}
diff --git a/examples/presentation/Latex/_minted-index/BCD13D83EF8F0B75CF4482552AC78D628B9AA2C25CD7E542150F54FA151BF004.pygtex b/examples/presentation/Latex/_minted-index/BCD13D83EF8F0B75CF4482552AC78D628B9AA2C25CD7E542150F54FA151BF004.pygtex
new file mode 100644
index 0000000000000000000000000000000000000000..548aebfecad42db75f489dfc3b21312b5d1b9c06
--- /dev/null
+++ b/examples/presentation/Latex/_minted-index/BCD13D83EF8F0B75CF4482552AC78D628B9AA2C25CD7E542150F54FA151BF004.pygtex
@@ -0,0 +1,3 @@
+\begin{Verbatim}[commandchars=\\\{\}]
+\PYG{n}{from\PYGZus{}string}
+\end{Verbatim}
diff --git a/examples/presentation/Latex/_minted-index/C30DBA8197A1560649606EA4745E9D048B9AA2C25CD7E542150F54FA151BF004.pygtex b/examples/presentation/Latex/_minted-index/C30DBA8197A1560649606EA4745E9D048B9AA2C25CD7E542150F54FA151BF004.pygtex
new file mode 100644
index 0000000000000000000000000000000000000000..431ad9c667f5162a78e01919d9975b1cfcab5644
--- /dev/null
+++ b/examples/presentation/Latex/_minted-index/C30DBA8197A1560649606EA4745E9D048B9AA2C25CD7E542150F54FA151BF004.pygtex
@@ -0,0 +1,3 @@
+\begin{Verbatim}[commandchars=\\\{\}]
+\PYG{o}{+}
+\end{Verbatim}
diff --git a/examples/presentation/Latex/_minted-index/C337567ABBC0041A183DD819B579D62B0A1306BEF7ABBA8E6F738A7935C17A00.pygtex b/examples/presentation/Latex/_minted-index/C337567ABBC0041A183DD819B579D62B0A1306BEF7ABBA8E6F738A7935C17A00.pygtex
new file mode 100644
index 0000000000000000000000000000000000000000..b043bed919dc271835799a763924e3f553021d99
--- /dev/null
+++ b/examples/presentation/Latex/_minted-index/C337567ABBC0041A183DD819B579D62B0A1306BEF7ABBA8E6F738A7935C17A00.pygtex
@@ -0,0 +1,23 @@
+\begin{Verbatim}[commandchars=\\\{\}]
+\PYG{c+c1}{\PYGZsh{} cpp\PYGZus{}course/fractions.py}
+\PYG{k}{class} \PYG{n+nc}{Fraction}\PYG{p}{:} 
+    \PYG{k}{def} \PYG{n+nf+fm}{\PYGZus{}\PYGZus{}init\PYGZus{}\PYGZus{}}\PYG{p}{(}\PYG{n+nb+bp}{self}\PYG{p}{,} \PYG{n}{n}\PYG{p}{,} \PYG{n}{m}\PYG{p}{):}
+        \PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{n} \PYG{o}{=} \PYG{n}{n}
+        \PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{m} \PYG{o}{=} \PYG{n}{m}
+
+    \PYG{k}{def} \PYG{n+nf+fm}{\PYGZus{}\PYGZus{}add\PYGZus{}\PYGZus{}}\PYG{p}{(}\PYG{n+nb+bp}{self}\PYG{p}{,} \PYG{n}{other}\PYG{p}{):} 
+        \PYG{c+c1}{\PYGZsh{} Computes f = f1 + f2 (where f1 and f2 are both Fraction\PYGZhy{}objects and f1=self, f2=other) }
+        \PYG{k}{return} \PYG{n}{f} 
+
+    \PYG{k}{def} \PYG{n+nf+fm}{\PYGZus{}\PYGZus{}mul\PYGZus{}\PYGZus{}}\PYG{p}{(}\PYG{n+nb+bp}{self}\PYG{p}{,} \PYG{n}{other}\PYG{p}{):} 
+        \PYG{c+c1}{\PYGZsh{} Overwrite to implement f = f1 * f2 }
+        \PYG{k}{return} \PYG{n}{f} 
+
+    \PYG{k}{def} \PYG{n+nf+fm}{\PYGZus{}\PYGZus{}truediv\PYGZus{}\PYGZus{}}\PYG{p}{(}\PYG{n+nb+bp}{self}\PYG{p}{,} \PYG{n}{other}\PYG{p}{):} 
+        \PYG{c+c1}{\PYGZsh{} Overwrite to implement f = f1/f2, or more specifically self/other. }
+        \PYG{k}{return} \PYG{n}{f} 
+
+    \PYG{k}{def} \PYG{n+nf+fm}{\PYGZus{}\PYGZus{}str\PYGZus{}\PYGZus{}}\PYG{p}{(}\PYG{n+nb+bp}{self}\PYG{p}{):}
+        \PYG{l+s+sd}{\PYGZdq{}\PYGZdq{}\PYGZdq{} Creates a string representation. You can use it as `print(str(Fraction(1,2))) to output 1/2\PYGZdq{}\PYGZdq{}\PYGZdq{}}
+        \PYG{k}{return} \PYG{l+s+sa}{f}\PYG{l+s+s2}{\PYGZdq{}(}\PYG{l+s+si}{\PYGZob{}}\PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{n}\PYG{l+s+si}{\PYGZcb{}}\PYG{l+s+s2}{ / }\PYG{l+s+si}{\PYGZob{}}\PYG{n+nb+bp}{self}\PYG{o}{.}\PYG{n}{m}\PYG{l+s+si}{\PYGZcb{}}\PYG{l+s+s2}{)\PYGZdq{}} 
+\end{Verbatim}
diff --git a/examples/presentation/Latex/_minted-index/D3ECD3ACDA87B14881FB480CA410F52E81B27360F55ECAEF0E03CEF63D4338FD.pygtex b/examples/presentation/Latex/_minted-index/D3ECD3ACDA87B14881FB480CA410F52E81B27360F55ECAEF0E03CEF63D4338FD.pygtex
new file mode 100644
index 0000000000000000000000000000000000000000..e622fcd83fb1abbd849929ab19667115e1f4d95d
--- /dev/null
+++ b/examples/presentation/Latex/_minted-index/D3ECD3ACDA87B14881FB480CA410F52E81B27360F55ECAEF0E03CEF63D4338FD.pygtex
@@ -0,0 +1,3 @@
+\begin{Verbatim}[commandchars=\\\{\}]
+Result of (1 / 2) + (3 / 5) is (11 / 2)
+\end{Verbatim}
diff --git a/examples/presentation/Latex/_minted-index/FEF03B3FE84AFC5182847D2D4A3A88C51B6ACA4E9AADC1E15C7889930E3355D6.pygtex b/examples/presentation/Latex/_minted-index/FEF03B3FE84AFC5182847D2D4A3A88C51B6ACA4E9AADC1E15C7889930E3355D6.pygtex
new file mode 100644
index 0000000000000000000000000000000000000000..bb11e458741a03adc5264a48b860b1757a7f1967
--- /dev/null
+++ b/examples/presentation/Latex/_minted-index/FEF03B3FE84AFC5182847D2D4A3A88C51B6ACA4E9AADC1E15C7889930E3355D6.pygtex
@@ -0,0 +1,7 @@
+\begin{Verbatim}[commandchars=\\\{\}]
+\PYG{c+c1}{\PYGZsh{} cpp\PYGZus{}course/fractions.py}
+    \PYG{n}{s} \PYG{o}{=} \PYG{l+s+s2}{\PYGZdq{} 1 / 4 * 1 / 2\PYGZdq{}} 
+    \PYG{n+nb}{print}\PYG{p}{(}\PYG{l+s+s2}{\PYGZdq{}Result of\PYGZdq{}}\PYG{p}{,} \PYG{n}{s}\PYG{p}{,} \PYG{l+s+s2}{\PYGZdq{}is\PYGZdq{}}\PYG{p}{,} \PYG{n}{from\PYGZus{}string}\PYG{p}{(}\PYG{n}{s}\PYG{p}{))}
+    \PYG{n}{s} \PYG{o}{=}  \PYG{l+s+s2}{\PYGZdq{}5 / 2 div 10 / 3\PYGZdq{}}
+    \PYG{n+nb}{print}\PYG{p}{(}\PYG{l+s+s2}{\PYGZdq{}Result of\PYGZdq{}}\PYG{p}{,} \PYG{n}{s}\PYG{p}{,} \PYG{l+s+s2}{\PYGZdq{}is\PYGZdq{}}\PYG{p}{,} \PYG{n}{from\PYGZus{}string}\PYG{p}{(}\PYG{n}{s}\PYG{p}{))} 
+\end{Verbatim}
diff --git a/examples/presentation/Latex/_minted-index/default.pygstyle b/examples/presentation/Latex/_minted-index/default.pygstyle
new file mode 100644
index 0000000000000000000000000000000000000000..211763d1d4e4c090ba3a286634a9a96c7fae303b
--- /dev/null
+++ b/examples/presentation/Latex/_minted-index/default.pygstyle
@@ -0,0 +1,101 @@
+
+\makeatletter
+\def\PYG@reset{\let\PYG@it=\relax \let\PYG@bf=\relax%
+    \let\PYG@ul=\relax \let\PYG@tc=\relax%
+    \let\PYG@bc=\relax \let\PYG@ff=\relax}
+\def\PYG@tok#1{\csname PYG@tok@#1\endcsname}
+\def\PYG@toks#1+{\ifx\relax#1\empty\else%
+    \PYG@tok{#1}\expandafter\PYG@toks\fi}
+\def\PYG@do#1{\PYG@bc{\PYG@tc{\PYG@ul{%
+    \PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}}
+\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}}
+
+\@namedef{PYG@tok@w}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}}
+\@namedef{PYG@tok@c}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
+\@namedef{PYG@tok@cp}{\def\PYG@tc##1{\textcolor[rgb]{0.61,0.40,0.00}{##1}}}
+\@namedef{PYG@tok@k}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
+\@namedef{PYG@tok@kp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
+\@namedef{PYG@tok@kt}{\def\PYG@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}}
+\@namedef{PYG@tok@o}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
+\@namedef{PYG@tok@ow}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}}
+\@namedef{PYG@tok@nb}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
+\@namedef{PYG@tok@nf}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
+\@namedef{PYG@tok@nc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
+\@namedef{PYG@tok@nn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
+\@namedef{PYG@tok@ne}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.80,0.25,0.22}{##1}}}
+\@namedef{PYG@tok@nv}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
+\@namedef{PYG@tok@no}{\def\PYG@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}}
+\@namedef{PYG@tok@nl}{\def\PYG@tc##1{\textcolor[rgb]{0.46,0.46,0.00}{##1}}}
+\@namedef{PYG@tok@ni}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.44,0.44,0.44}{##1}}}
+\@namedef{PYG@tok@na}{\def\PYG@tc##1{\textcolor[rgb]{0.41,0.47,0.13}{##1}}}
+\@namedef{PYG@tok@nt}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
+\@namedef{PYG@tok@nd}{\def\PYG@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}}
+\@namedef{PYG@tok@s}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
+\@namedef{PYG@tok@sd}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
+\@namedef{PYG@tok@si}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.64,0.35,0.47}{##1}}}
+\@namedef{PYG@tok@se}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.67,0.36,0.12}{##1}}}
+\@namedef{PYG@tok@sr}{\def\PYG@tc##1{\textcolor[rgb]{0.64,0.35,0.47}{##1}}}
+\@namedef{PYG@tok@ss}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
+\@namedef{PYG@tok@sx}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
+\@namedef{PYG@tok@m}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
+\@namedef{PYG@tok@gh}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
+\@namedef{PYG@tok@gu}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}}
+\@namedef{PYG@tok@gd}{\def\PYG@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}}
+\@namedef{PYG@tok@gi}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.52,0.00}{##1}}}
+\@namedef{PYG@tok@gr}{\def\PYG@tc##1{\textcolor[rgb]{0.89,0.00,0.00}{##1}}}
+\@namedef{PYG@tok@ge}{\let\PYG@it=\textit}
+\@namedef{PYG@tok@gs}{\let\PYG@bf=\textbf}
+\@namedef{PYG@tok@gp}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}}
+\@namedef{PYG@tok@go}{\def\PYG@tc##1{\textcolor[rgb]{0.44,0.44,0.44}{##1}}}
+\@namedef{PYG@tok@gt}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}}
+\@namedef{PYG@tok@err}{\def\PYG@bc##1{{\setlength{\fboxsep}{\string -\fboxrule}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}}}
+\@namedef{PYG@tok@kc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
+\@namedef{PYG@tok@kd}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
+\@namedef{PYG@tok@kn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
+\@namedef{PYG@tok@kr}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
+\@namedef{PYG@tok@bp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}}
+\@namedef{PYG@tok@fm}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}}
+\@namedef{PYG@tok@vc}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
+\@namedef{PYG@tok@vg}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
+\@namedef{PYG@tok@vi}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
+\@namedef{PYG@tok@vm}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}}
+\@namedef{PYG@tok@sa}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
+\@namedef{PYG@tok@sb}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
+\@namedef{PYG@tok@sc}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
+\@namedef{PYG@tok@dl}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
+\@namedef{PYG@tok@s2}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
+\@namedef{PYG@tok@sh}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
+\@namedef{PYG@tok@s1}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}}
+\@namedef{PYG@tok@mb}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
+\@namedef{PYG@tok@mf}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
+\@namedef{PYG@tok@mh}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
+\@namedef{PYG@tok@mi}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
+\@namedef{PYG@tok@il}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
+\@namedef{PYG@tok@mo}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
+\@namedef{PYG@tok@ch}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
+\@namedef{PYG@tok@cm}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
+\@namedef{PYG@tok@cpf}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
+\@namedef{PYG@tok@c1}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
+\@namedef{PYG@tok@cs}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}}
+
+\def\PYGZbs{\char`\\}
+\def\PYGZus{\char`\_}
+\def\PYGZob{\char`\{}
+\def\PYGZcb{\char`\}}
+\def\PYGZca{\char`\^}
+\def\PYGZam{\char`\&}
+\def\PYGZlt{\char`\<}
+\def\PYGZgt{\char`\>}
+\def\PYGZsh{\char`\#}
+\def\PYGZpc{\char`\%}
+\def\PYGZdl{\char`\$}
+\def\PYGZhy{\char`\-}
+\def\PYGZsq{\char`\'}
+\def\PYGZdq{\char`\"}
+\def\PYGZti{\char`\~}
+% for compatibility with earlier versions
+\def\PYGZat{@}
+\def\PYGZlb{[}
+\def\PYGZrb{]}
+\makeatother
+
diff --git a/examples/presentation/Latex/index.aux b/examples/presentation/Latex/index.aux
new file mode 100644
index 0000000000000000000000000000000000000000..f23ca482232de422e9ae244e1c40e1cecbac91fc
--- /dev/null
+++ b/examples/presentation/Latex/index.aux
@@ -0,0 +1,43 @@
+\relax 
+\providecommand\hyper@newdestlabel[2]{}
+\providecommand\zref@newlabel[2]{}
+\providecommand{\transparent@use}[1]{}
+\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
+\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
+\global\let\oldcontentsline\contentsline
+\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}}
+\global\let\oldnewlabel\newlabel
+\gdef\newlabel#1#2{\newlabelxx{#1}#2}
+\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
+\AtEndDocument{\ifx\hyper@anchor\@undefined
+\let\contentsline\oldcontentsline
+\let\newlabel\oldnewlabel
+\fi}
+\fi}
+\global\let\hyper@last\relax 
+\gdef\HyperFirstAtBeginDocument#1{#1}
+\providecommand\HyField@AuxAddToFields[1]{}
+\providecommand\HyField@AuxAddToCoFields[2]{}
+\providecommand\babel@aux[2]{}
+\@nameuse{bbl@beforestart}
+\babel@aux{english}{}
+\@writefile{toc}{\contentsline {section}{\numberline {1}Working with fractions (\texttt  {fractions.py})}{1}{section.1}\protected@file@percent }
+\newlabel{fractions}{{1}{1}{Working with fractions (\texttt {fractions.py})}{section.1}{}}
+\newlabel{fractions@cref}{{[section][1][]1}{[1][1][]1}}
+\bibstyle{alpha}
+\bibdata{pensum}
+\gdef\minted@oldcachelist{,
+  default.pygstyle,
+  C337567ABBC0041A183DD819B579D62B0A1306BEF7ABBA8E6F738A7935C17A00.pygtex,
+  C30DBA8197A1560649606EA4745E9D048B9AA2C25CD7E542150F54FA151BF004.pygtex,
+  4B904B38547539E6886F45285B55E17B8B9AA2C25CD7E542150F54FA151BF004.pygtex,
+  A9FD9E7563778CEBB343C798E256BFB3E06A867B43241B82760D148E01351E67.pygtex,
+  D3ECD3ACDA87B14881FB480CA410F52E81B27360F55ECAEF0E03CEF63D4338FD.pygtex,
+  BCD13D83EF8F0B75CF4482552AC78D628B9AA2C25CD7E542150F54FA151BF004.pygtex,
+  FEF03B3FE84AFC5182847D2D4A3A88C51B6ACA4E9AADC1E15C7889930E3355D6.pygtex,
+  617F95B3C9B5986EE47AB06464B25A4656A75F0008C42025054395883EB49E2F.pygtex,
+  1C8C4C316CEECF02BD7FFC63EFD497326F77AD3888A7BF17566D124427769365.pygtex}
+\newlabel{eq:fraction}{{1}{2}{Working with fractions (\texttt {fractions.py})}{equation.1.1}{}}
+\newlabel{eq:fraction@cref}{{[equation][1][]1}{[1][2][]2}}
+\gdef\svg@ink@ver@settings{{\m@ne }{inkscape}{1}}
+\gdef \@abspage@last{2}
diff --git a/examples/presentation/Latex/index.bbl b/examples/presentation/Latex/index.bbl
new file mode 100644
index 0000000000000000000000000000000000000000..9b431fad0d4079afd902592878894a32b623a159
--- /dev/null
+++ b/examples/presentation/Latex/index.bbl
@@ -0,0 +1,3 @@
+\begin{thebibliography}{}
+
+\end{thebibliography}
diff --git a/examples/presentation/Latex/index.blg b/examples/presentation/Latex/index.blg
new file mode 100644
index 0000000000000000000000000000000000000000..d24b6c56a430c5cd2b67756ef6b5964259f311d2
--- /dev/null
+++ b/examples/presentation/Latex/index.blg
@@ -0,0 +1,53 @@
+This is BibTeX, Version 0.99d (TeX Live 2022/dev/Debian)
+Capacity: max_strings=200000, hash_size=200000, hash_prime=170003
+The top-level auxiliary file: index.aux
+The style file: alpha.bst
+I couldn't open database file pensum.bib
+---line 24 of file index.aux
+ : \bibdata{pensum
+ :                }
+I'm skipping whatever remains of this command
+I found no \citation commands---while reading file index.aux
+I found no database files---while reading file index.aux
+You've used 0 entries,
+            2543 wiz_defined-function locations,
+            558 strings with 4435 characters,
+and the built_in function-call counts, 24 in all, are:
+= -- 0
+> -- 0
+< -- 0
++ -- 0
+- -- 0
+* -- 2
+:= -- 10
+add.period$ -- 0
+call.type$ -- 0
+change.case$ -- 0
+chr.to.int$ -- 0
+cite$ -- 0
+duplicate$ -- 0
+empty$ -- 1
+format.name$ -- 0
+if$ -- 2
+int.to.chr$ -- 1
+int.to.str$ -- 0
+missing$ -- 0
+newline$ -- 3
+num.names$ -- 0
+pop$ -- 0
+preamble$ -- 1
+purify$ -- 0
+quote$ -- 0
+skip$ -- 2
+stack$ -- 0
+substring$ -- 0
+swap$ -- 0
+text.length$ -- 0
+text.prefix$ -- 0
+top$ -- 0
+type$ -- 0
+warning$ -- 0
+while$ -- 0
+width$ -- 0
+write$ -- 2
+(There were 3 error messages)
diff --git a/examples/presentation/Latex/index.out b/examples/presentation/Latex/index.out
new file mode 100644
index 0000000000000000000000000000000000000000..975b635f770a49d8106292563c5b0bc731738dfd
--- /dev/null
+++ b/examples/presentation/Latex/index.out
@@ -0,0 +1 @@
+\BOOKMARK [1][-]{section.1}{\376\377\000W\000o\000r\000k\000i\000n\000g\000\040\000w\000i\000t\000h\000\040\000f\000r\000a\000c\000t\000i\000o\000n\000s\000\040\000\050\000f\000r\000a\000c\000t\000i\000o\000n\000s\000.\000p\000y\000\051}{}% 1
diff --git a/examples/presentation/Latex/index.pdf b/examples/presentation/Latex/index.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..0a1c5ccd718870ca4501b780ebef55dd61b165b2
Binary files /dev/null and b/examples/presentation/Latex/index.pdf differ
diff --git a/examples/presentation/Latex/index.synctex.gz b/examples/presentation/Latex/index.synctex.gz
new file mode 100644
index 0000000000000000000000000000000000000000..08e39c4630eac66987ea8bd6fffdbfb957e68474
Binary files /dev/null and b/examples/presentation/Latex/index.synctex.gz differ
diff --git a/examples/presentation/Latex/index.tex b/examples/presentation/Latex/index.tex
new file mode 100644
index 0000000000000000000000000000000000000000..86f18fa742605fdbe2db55c432ec66071bbb4cc2
--- /dev/null
+++ b/examples/presentation/Latex/index.tex
@@ -0,0 +1,171 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% DO NOT EDIT THIS FILE. IT WILL BE AUTOMATICALLY OVERWRITTEN
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+% TeX-command-extra-options: "-shell-escape"
+
+
+\documentclass[12pt,twoside]{article}
+\usepackage[table]{xcolor} % important to avoid options clash.
+%\input{book_preamble}
+\input{02465shared_preamble}
+\usepackage{cleveref}
+\input{structure.tex}
+\usepackage{url}
+\usepackage{graphics}
+%\usepackage{fancybox}
+\usepackage{multicol}
+\usepackage{rotate}
+%\usepackage{epsf}
+\usepackage{rotating}
+%\usepackage{color}
+\usepackage{booktabs}
+\usepackage{hyperref}
+\usepackage{pifont}
+\usepackage{latexsym}
+\usepackage[english]{babel}
+\usepackage{epstopdf}
+\usepackage{etoolbox}
+%\usepackage{epsfig}
+\usepackage{amsmath}
+\usepackage{amssymb}
+\usepackage{multirow,epstopdf}
+%\usepackage{cite}
+\usepackage{fancyhdr}
+\usepackage{booktabs}
+%\usepackage[most]{tcolorbox}
+\definecolor{LightGray}{HTML}{EEEEEE}
+
+\usepackage{todonotes}
+\pagestyle{fancy}
+\usepackage{minted}
+%\usepackage{natbib}
+%\bibliographystyle{unsrtnat}
+
+\usepackage[inkscape=true,inkscapeformat=pdf,inkscapelatex=true]{svg}
+\svgpath{./}
+
+%\usepackage{xr}
+
+	
+		 % problem when citing sutton. I got no idea why.
+%\externaldocument{ ../../../Notes/Latex/02465_Notes}
+
+
+\setminted{
+	frame=lines,
+	framesep=2mm,
+	baselinestretch=1.2,
+	bgcolor=LightGray,
+	fontsize=\footnotesize,
+	linenos
+}
+%\newcommand*\lref[2]{lecture~#1~eq.~(\ref{l#1#2})}	
+%\newcommand*\nref[1]{\cite[\cref{#1}]{herlau}}	
+
+\usepackage{xr-hyper}
+\usepackage{hyperref}
+
+%\IfFileExists{../../../../Lectures/Lecture_1/Latex/Lecture_1.aux}{
+% \externaldocument[l1]{../../../../Lectures/Lecture_1/Latex/Lecture_1} 
+% }
+%
+%\IfFileExists{../../../../Lectures/Lecture_2/Latex/Lecture_2.aux}{
+% \externaldocument[l2]{../../../../Lectures/Lecture_2/Latex/Lecture_2} 
+% }
+%
+%\IfFileExists{../../../../Lectures/Lecture_3/Latex/Lecture_3.aux}{
+% \externaldocument[l3]{../../../../Lectures/Lecture_3/Latex/Lecture_3} 
+% }
+%
+%\IfFileExists{../../../../Lectures/Lecture_4/Latex/Lecture_4.aux}{
+% \externaldocument[l4]{../../../../Lectures/Lecture_4/Latex/Lecture_4} 
+% }
+%
+%\IfFileExists{../../../../Lectures/Lecture_5/Latex/Lecture_5.aux}{
+% \externaldocument[l5]{../../../../Lectures/Lecture_5/Latex/Lecture_5} 
+% }
+%
+%\IfFileExists{../../../../Lectures/Lecture_6/Latex/Lecture_6.aux}{
+% \externaldocument[l6]{../../../../Lectures/Lecture_6/Latex/Lecture_6} 
+% }
+%
+%\IfFileExists{../../../../Lectures/Lecture_7/Latex/Lecture_7.aux}{
+% \externaldocument[l7]{../../../../Lectures/Lecture_7/Latex/Lecture_7} 
+% }
+%
+%\IfFileExists{../../../../Lectures/Lecture_8/Latex/Lecture_8.aux}{
+% \externaldocument[l8]{../../../../Lectures/Lecture_8/Latex/Lecture_8} 
+% }
+%
+%\IfFileExists{../../../../Lectures/Lecture_9/Latex/Lecture_9.aux}{
+% \externaldocument[l9]{../../../../Lectures/Lecture_9/Latex/Lecture_9} 
+% }
+%
+%\IfFileExists{../../../../Lectures/Lecture_10/Latex/Lecture_10.aux}{
+% \externaldocument[l10]{../../../../Lectures/Lecture_10/Latex/Lecture_10} 
+% }
+%
+%\IfFileExists{../../../../Lectures/Lecture_11/Latex/Lecture_11.aux}{
+% \externaldocument[l11]{../../../../Lectures/Lecture_11/Latex/Lecture_11} 
+% }
+%
+%\IfFileExists{../../../../Lectures/Lecture_12/Latex/Lecture_12.aux}{
+% \externaldocument[l12]{../../../../Lectures/Lecture_12/Latex/Lecture_12} 
+% }
+
+	
+
+
+ 	
+\fancyhf{}
+
+\lhead{ Unitgrade  } 
+	
+
+ \rhead{ \today  } %  
+\title{  Examples }
+ \author{Tue Herlau\\ \texttt{tuhe@dtu.dk} } % Author name and email address
+
+%\date{University of Inaba --- \today} % University, school and/or
+
+	
+\begin{document}
+	\maketitle
+ 	
+		
+\section{Working with fractions (\texttt{fractions.py})} \label{fractions}
+In this problem, you have to implement the methods in the following class:
+\inputminted{python}{output/fractions.py}
+
+When done, you should be able to create two fractions objects and add them using the \pyi{+}-operator, which will be transformed to a call of the form \pyi{f1.__add__(f2)} as so:
+\inputminted{python}{output/fractions_a.py}
+
+This fragment will produce the terminal output:
+\inputminted{text}{output/fractions_a.txt}
+
+You may find it convenient to use the formula:
+\begin{align}
+\frac{a}{b} + \frac{n}{m} = \frac{am + bn}{bm} \label{eq:fraction}
+\end{align}
+%\input{project_body} 
+
+When done, implement the \pyi{from_string} function, that can simplify string expressions to fractions:
+
+\inputminted{python}{output/fractions_b.py}
+This fragment will produce the following terminal output:
+\inputminted{text}{output/fractions_b.txt}
+
+
+\inputminted{shell}{output/fragment.shell}
+
+
+%\bibliographystyle{alpha}
+%\bibliography{pensum}
+
+  
+\bibliographystyle{alpha}
+\bibliography{pensum}
+						
+\end{document}
\ No newline at end of file
diff --git a/examples/presentation/Latex/output/fractions.py b/examples/presentation/Latex/output/fractions.py
new file mode 100644
index 0000000000000000000000000000000000000000..9e1874a3f2452df2566126d3bf2ec63cad11b30b
--- /dev/null
+++ b/examples/presentation/Latex/output/fractions.py
@@ -0,0 +1,21 @@
+# cpp_course/fractions.py
+class Fraction: 
+    def __init__(self, n, m):
+        self.n = n
+        self.m = m
+
+    def __add__(self, other): 
+        # Computes f = f1 + f2 (where f1 and f2 are both Fraction-objects and f1=self, f2=other) 
+        return f 
+
+    def __mul__(self, other): 
+        # Overwrite to implement f = f1 * f2 
+        return f 
+
+    def __truediv__(self, other): 
+        # Overwrite to implement f = f1/f2, or more specifically self/other. 
+        return f 
+
+    def __str__(self):
+        """ Creates a string representation. You can use it as `print(str(Fraction(1,2))) to output 1/2"""
+        return f"{self.n} / {self.m}" 
\ No newline at end of file
diff --git a/examples/presentation/Latex/output/fractions_a.py b/examples/presentation/Latex/output/fractions_a.py
new file mode 100644
index 0000000000000000000000000000000000000000..bb5506d26d441c1bd20788dd5dda40235b7b2867
--- /dev/null
+++ b/examples/presentation/Latex/output/fractions_a.py
@@ -0,0 +1,4 @@
+# cpp_course/fractions.py
+    f1 = Fraction(1, 2)  # Represents 1/2 
+    f2 = Fraction(3, 5) # Represents 3/5
+    print(f"Result of {f1} + {f2} is", f1+f2) 
\ No newline at end of file
diff --git a/examples/presentation/Latex/output/fractions_a.txt b/examples/presentation/Latex/output/fractions_a.txt
new file mode 100644
index 0000000000000000000000000000000000000000..31814adcec2e62cb7ae4840b4ab13d9b572c80e1
--- /dev/null
+++ b/examples/presentation/Latex/output/fractions_a.txt
@@ -0,0 +1 @@
+Result of 1 / 2 + 3 / 5 is 11 / 2
diff --git a/examples/presentation/Latex/output/fractions_b.py b/examples/presentation/Latex/output/fractions_b.py
new file mode 100644
index 0000000000000000000000000000000000000000..01f53792d07831bda412856be312a087d6ba6663
--- /dev/null
+++ b/examples/presentation/Latex/output/fractions_b.py
@@ -0,0 +1,5 @@
+# cpp_course/fractions.py
+    s = " 1 / 4 * 1 / 2" 
+    print("Result of", s, "is", from_string(s))
+    s =  "5 / 2 div 10 / 3"
+    print("Result of", s, "is", from_string(s)) 
\ No newline at end of file
diff --git a/examples/presentation/Latex/output/fractions_b.txt b/examples/presentation/Latex/output/fractions_b.txt
new file mode 100644
index 0000000000000000000000000000000000000000..08f496a1fba38c9bc4feb81321896d16eb4bc993
--- /dev/null
+++ b/examples/presentation/Latex/output/fractions_b.txt
@@ -0,0 +1,2 @@
+Result of  1 / 4 * 1 / 2 is 1 / 8
+Result of 5 / 2 div 10 / 3 is 15 / 20
diff --git a/examples/presentation/Latex/output/fragment.shell b/examples/presentation/Latex/output/fragment.shell
new file mode 100644
index 0000000000000000000000000000000000000000..a932c98a3e80e14c84e14bcd06086202d651a5d9
--- /dev/null
+++ b/examples/presentation/Latex/output/fragment.shell
@@ -0,0 +1,13 @@
+>>>
+>>> f1 = Fraction(1, 2)  # Represents 1/2
+>>> f2 = Fraction(3, 5)  # Represents 3/5
+>>> print(f"Result of {f1} + {f2} is", f1 + f2)
+Result of 1 / 2 + 3 / 5 is 11 / 2
+>>>
+>>> # Now do some compound tests:
+>>> s = " 1 / 4 * 1 / 2"
+>>> print("Result of", s, "is", from_string(s))
+Result of  1 / 4 * 1 / 2 is 1 / 8
+>>> s = "5 / 2 div 10 / 3"
+>>> print("Result of", s, "is", from_string(s))
+Result of 5 / 2 div 10 / 3 is 15 / 20
\ No newline at end of file
diff --git a/examples/presentation/Latex/output/problem1_vectors.py b/examples/presentation/Latex/output/problem1_vectors.py
new file mode 100644
index 0000000000000000000000000000000000000000..ae39282359c7ef13f48c375128e1a26497b749a3
--- /dev/null
+++ b/examples/presentation/Latex/output/problem1_vectors.py
@@ -0,0 +1,12 @@
+# cpp_exam/problem1_vectors.py
+    A = createField(3, 3, Vector(1,2)) 
+    A[1][1] = Vector(2,2)
+    print(displayField(A))
+    print( )
+    B = createField(3, 3, Vector(2,-2))
+    B[0][0] = B[2][2] = Vector(9, 8)
+    print(displayField(B))
+    print( )
+    print(displayField(addFields(A, B)))
+    print("Result of scaling A by 2")
+    print(displayField(scaleField(A, 2))) 
\ No newline at end of file
diff --git a/examples/presentation/Latex/output/problem1_vectors.txt b/examples/presentation/Latex/output/problem1_vectors.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c64c795333ebe0e33d4b9caf7de7a53c17624e66
--- /dev/null
+++ b/examples/presentation/Latex/output/problem1_vectors.txt
@@ -0,0 +1,15 @@
+(1,2) (1,2) (1,2)
+(1,2) (2,2) (1,2)
+(1,2) (1,2) (1,2)
+
+(9,8) (2,-2) (2,-2)
+(2,-2) (2,-2) (2,-2)
+(2,-2) (2,-2) (9,8)
+
+(10,10) (3,0) (3,0)
+(3,0) (4,0) (3,0)
+(3,0) (3,0) (10,10)
+Result of scaling A by 2
+(2,4) (2,4) (2,4)
+(2,4) (4,4) (2,4)
+(2,4) (2,4) (2,4)
diff --git a/examples/presentation/Latex/pensum.bib b/examples/presentation/Latex/pensum.bib
new file mode 100644
index 0000000000000000000000000000000000000000..f7471d2efce4e5e0e95db1189150d91a8b6eee7a
--- /dev/null
+++ b/examples/presentation/Latex/pensum.bib
@@ -0,0 +1,289 @@
+@unpublished{herlau,
+	author  = {Tue Herlau},
+	title   = {Sequential Decision Making},
+	year    = {2021},
+	note    = {(See \textbf{02465\_Notes.pdf})}
+}
+@misc{brown2020combining,
+	title={Combining Deep Reinforcement Learning and Search for Imperfect-Information Games}, 
+	author={Noam Brown and Anton Bakhtin and Adam Lerer and Qucheng Gong},
+	year={2020},
+	eprint={2007.13544},
+	archivePrefix={arXiv},
+	primaryClass={cs.GT}
+}
+@unpublished{aa203,
+	author  = {James Harrison},
+	title   = {Optimal and Learning-based Control Combined Course Notes},
+	year    = {2020},
+	note    = {(See \textbf{AA203combined.pdf})},	
+	url = {https://github.com/StanfordASL/AA203-Notes/}
+}
+@book{bertsekasII,
+	author = {Bertsekas, Dimitri P.},
+	title = {Dynamic Programming and Optimal Control, Vol. II},
+	year = {2007},
+	isbn = {1886529302},
+	publisher = {Athena Scientific},
+	edition = {3rd},
+	abstract = {A major revision of the second volume of a textbook on the far-ranging algorithmic methododogy of Dynamic Programming, which can be used for optimal control, Markovian decision problems, planning and sequential decision making under uncertainty, and discrete/combinatorial optimization. The second volume is oriented towards mathematical analysis and computation, and treats infinite horizon problems extensively. New features of the 3rd edition are: 1) A major enlargement in size and scope: the length has increased by more than 50%, and most of the old material has been restructured and/or revised. 2) Extensive coverage (more than 100 pages) of recent research on simulation-based approximate dynamic programming (neuro-dynamic programming), which allow the practical application of dynamic programming to large and complex problems. 3) An in-depth development of the average cost problem (more than 100 pages), including a full analysis of multichain problems, and an extensive analysis of infinite-spaces problems. 4) An introduction to infinite state space stochastic shortest path problems. 5) Expansion of the theory and use of contraction mappings in infinite state space problems and in neuro-dynamic programming. 6) A substantive appendix on the mathematical measure-theoretic issues that must be addressed for a rigorous theory of stochastic dynamic programming. Much supplementary material can be found in the book's web page: http://www.athenasc.com/dpbook.html}
+}
+@article{rosolia2018data,
+	title={Data-driven predictive control for autonomous systems},
+	author={Rosolia, Ugo and Zhang, Xiaojing and Borrelli, Francesco},
+	journal={Annual Review of Control, Robotics, and Autonomous Systems},
+	volume={1},
+	pages={259--286},
+	year={2018},
+	publisher={Annual Reviews}
+}
+@article{rosolia2017learning2,
+	title={Learning model predictive control for iterative tasks: A computationally efficient approach for linear system},
+	author={Rosolia, Ugo and Borrelli, Francesco},
+	journal={IFAC-PapersOnLine},
+	volume={50},
+	number={1},
+	pages={3142--3147},
+	year={2017},
+	publisher={Elsevier}
+}
+
+@article{rosolia2017learning,
+	title={Learning model predictive control for iterative tasks. a data-driven control framework},
+	author={Rosolia, Ugo and Borrelli, Francesco},
+	journal={IEEE Transactions on Automatic Control},
+	volume={63},
+	number={7},
+	pages={1883--1896},
+	year={2017},
+	publisher={IEEE}
+}
+
+
+@book{caldentey,
+	author = {René Caldentey},
+	publisher = {Stern School of Business, New York University},
+	title = {Dynamic Programming with Applications},
+	year = {2011},
+	note= {(see \textbf{caldentey.pdf})},	
+	url = {http://people.stern.nyu.edu/rcaldent/courses/DP-ClassNotes-HEC.pdf}
+}  
+
+@book{herlau02450,
+	author = {Herlau, Tue and Mørup, Morten and Schmidt, Mikkel N.},
+	publisher = {02450 Lecture notes},
+	title = {Introduction to Machine Learning and Data Mining},
+	year = {2020},
+	note= {(See \textbf{02450Book.pdf})},	
+}  
+@inproceedings{rosolia,
+	title={Autonomous racing using learning model predictive control},
+	author={Rosolia, Ugo and Carvalho, Ashwin and Borrelli, Francesco},
+	booktitle={2017 American Control Conference (ACC)},
+	pages={5115--5120},
+	year={2017},
+	organization={IEEE},
+	note= {(See \textbf{rosolia2017.pdf})},
+}
+@book{sutton,
+	added-at = {2019-07-13T10:11:53.000+0200},
+	author = {Sutton, Richard S. and Barto, Andrew G.},
+	edition = {Second},
+	keywords = {},
+	publisher = {The MIT Press},
+	timestamp = {2019-07-13T10:11:53.000+0200},
+	title = {Reinforcement Learning: An Introduction},
+	url = {http://incompleteideas.net/book/the-book-2nd.html},
+	year = {2018 },
+	note= {(See \textbf{sutton2018.pdf})},	
+}
+
+@unpublished{cemgil,
+	author  = {Ali Taylan Cemgil},
+	title   = {A Tutorial Introduction to Monte Carlo methods, Markov Chain Monte Carlo and Particle Filtering},
+	year    = {2012},
+	note    = {(See \textbf{cemgil2012.pdf})},	
+	url = {https://www.cmpe.boun.edu.tr/~cemgil/Courses/cmpe548/cmpe58n-lecture-notes.pdf},
+}
+
+@article{kelly,
+	title={An introduction to trajectory optimization: How to do your own direct collocation},
+	author={Kelly, Matthew},
+	journal={SIAM Review},
+	volume={59},
+	number={4},
+	pages={849--904},
+	year={2017},
+	publisher={SIAM},
+	url = {https://epubs.siam.org/doi/pdf/10.1137/16M1062569},
+	note    = {(See \textbf{kelly2017.pdf})},	
+}
+
+
+@article{bertsekas,
+	title={Reinforcement learning and optimal control},
+	author={Bertsekas, Dimitri P},
+	journal={Athena Scientific},
+	year={2019},
+	url={http://web.mit.edu/dimitrib/www/RL_1-SHORT-INTERNET-POSTED.pdf},
+	note= {(See \textbf{bertsekas2019.pdf})},	
+}
+
+@inproceedings{tassa,
+	title={Synthesis and stabilization of complex behaviors through online trajectory optimization},
+	author={Tassa, Yuval and Erez, Tom and Todorov, Emanuel},
+	booktitle={2012 IEEE/RSJ International Conference on Intelligent Robots and Systems},
+	pages={4906--4913},
+	year={2012},
+	organization={IEEE},
+	url={https://ieeexplore.ieee.org/abstract/document/6386025},
+	note= {(See \textbf{tassa2012.pdf})},	
+}
+
+
+@book{betts2010practical,
+	title={Practical methods for optimal control and estimation using nonlinear programming},
+	author={Betts, John T},
+	volume={19},
+	year={2010},
+	publisher={Siam}
+}
+
+@book{bertsekas1995dynamic,
+	title={Dynamic programming and optimal control},
+	author={Bertsekas, Dimitri P and Bertsekas, Dimitri P and Bertsekas, Dimitri P and Bertsekas, Dimitri P},
+	volume={1},
+	number={2},
+	year={1995},
+	publisher={Athena scientific Belmont, MA}
+}
+
+@article{bellman1957markovian,
+	title={A Markovian decision process},
+	author={Bellman, Richard},
+	journal={Journal of mathematics and mechanics},
+	pages={679--684},
+	year={1957},
+	publisher={JSTOR}
+}
+
+@inproceedings{bertsekas2010distributed,
+	title={Distributed asynchronous policy iteration in dynamic programming},
+	author={Bertsekas, Dimitri P and Yu, Huizhen},
+	booktitle={2010 48th Annual Allerton Conference on Communication, Control, and Computing (Allerton)},
+	pages={1368--1375},
+	year={2010},
+	organization={IEEE}
+}
+@inproceedings{Gal2016,
+  title={Improving {PILCO} with {B}ayesian neural network dynamics models},
+  author={Gal, Yarin and McAllister, Rowan and Rasmussen, Carl Edward},
+  booktitle={Data-Efficient Machine Learning workshop, International Conference on Machine Learning},
+  year={2016},
+  note= {(See \textbf{gal2016.pdf})},	
+}
+
+@book{bertsekasvolI,
+	title={Dynamic Programming and Optimal Control},
+	author={Bertsekas, D.P.},
+	number={v. 1},
+	isbn={9781886529267},
+	lccn={lc00091281},
+	series={Athena Scientific optimization and computation series},
+	year={2005},
+	publisher={Athena Scientific}
+}
+
+@book{russell2002artificial,
+	title={Artificial Intelligence: a modern approach},
+	author={Russell, Stuart J. and Norvig, Peter},
+	edition={3},
+	year={2009},
+	publisher={Pearson}
+}
+
+
+
+% Deep learning related
+@inproceedings{hessel2018rainbow,
+	title={Rainbow: Combining improvements in deep reinforcement learning},
+	author={Hessel, Matteo and Modayil, Joseph and Van Hasselt, Hado and Schaul, Tom and Ostrovski, Georg and Dabney, Will and Horgan, Dan and Piot, Bilal and Azar, Mohammad and Silver, David},
+	booktitle={Thirty-Second AAAI Conference on Artificial Intelligence},
+	year={2018}
+}
+@article{wang2015dueling,
+	title={Dueling network architectures for deep reinforcement learning},
+	author={Wang, Ziyu and Schaul, Tom and Hessel, Matteo and Van Hasselt, Hado and Lanctot, Marc and De Freitas, Nando},
+	journal={arXiv preprint arXiv:1511.06581},
+	year={2015}
+}
+
+
+
+% MC intro chapter:
+
+
+@article{metropolisrrtt53,
+	added-at = {2011-05-09T23:10:52.000+0200},
+	author = {Metropolis, A. W. and Rosenbluth, A. W. and Rosenbluth, M. N. and Teller, A. H. and Teller, E.},
+	biburl = {https://www.bibsonomy.org/bibtex/24b3752b2936a9c524e2f0ca70e63d537/josephausterwei},
+	interhash = {09015548d3568943e67d50619297521e},
+	intrahash = {4b3752b2936a9c524e2f0ca70e63d537},
+	journal = {Journal of Chemical Physics},
+	keywords = {imported},
+	pages = {1087-1092},
+	timestamp = {2011-05-10T10:42:42.000+0200},
+	title = {Equations of state calculations by fast computing machines},
+	volume = 21,
+	year = 1953
+}
+@book{brooksmcbook,
+	added-at = {2019-11-27T16:57:20.000+0100},
+	author = {Brooks, Steve and Gelman, Andrew and Jones, Galin L. and Meng, Xiao-Li},
+	biburl = {https://www.bibsonomy.org/bibtex/221d785dfbbec4874e3aa0b1e4df45639/kirk86},
+	description = {Handbook of Markov Chain Monte Carlo},
+	interhash = {0b127e40d41a970274484b65a7e0744f},
+	intrahash = {21d785dfbbec4874e3aa0b1e4df45639},
+	keywords = {book mcmc},
+	timestamp = {2019-11-27T16:59:18.000+0100},
+	title = {Handbook of Markov Chain Monte Carlo
+	},
+	publisher={Chapman \& Hall},
+	url = {http://www.mcmchandbook.net/HandbookTableofContents.html},
+	year = 2011
+}
+
+@book{GVK516124188,
+	added-at = {2009-08-21T12:21:08.000+0200},
+	address = {Singapore [u.a.]},
+	author = {Rosenthal, {Jeffrey S.}},
+	biburl = {https://www.bibsonomy.org/bibtex/21ebbf183aa3295652ca2ac4e29dea8a8/fbw_hannover},
+	edition = {Reprinted},
+	interhash = {6b3625b54aac7aa32af07e7d91994cd3},
+	intrahash = {1ebbf183aa3295652ca2ac4e29dea8a8},
+	isbn = {9810243030},
+	keywords = {Wahrscheinlichkeitsrechnung Wahrscheinlichkeitstheorie},
+	pagetotal = {XIV, 177},
+	ppn_gvk = {516124188},
+	publisher = {World Scientific},
+	timestamp = {2009-08-21T12:21:56.000+0200},
+	title = {A first look at rigorous probability theory},
+	url = {http://gso.gbv.de/DB=2.1/CMD?ACT=SRCHA&SRT=YOP&IKT=1016&TRM=ppn+516124188&sourceid=fbw_bibsonomy},
+	year = 2005
+}
+
+@article{MET49,
+	added-at = {2009-03-03T17:19:04.000+0100},
+	author = {Metropolis, N. and Ulam, S.},
+	biburl = {https://www.bibsonomy.org/bibtex/23a9872b3a3572e446d5cedf42f2dc7d3/bronckobuster},
+	interhash = {f23e8d1798ee5feb71cd41eea30d830d},
+	intrahash = {3a9872b3a3572e446d5cedf42f2dc7d3},
+	journal = {J.~Am.~Stat.~Assoc.},
+	keywords = {imported},
+	nota = {mm:},
+	pages = 335,
+	timestamp = {2009-03-03T17:19:30.000+0100},
+	title = {The Monte Carlo method},
+	volume = 44,
+	year = 1949
+}
diff --git a/examples/presentation/Latex/structure.tex b/examples/presentation/Latex/structure.tex
new file mode 100644
index 0000000000000000000000000000000000000000..54ed7b332f1f02843a7a0ab341681b1500d58318
--- /dev/null
+++ b/examples/presentation/Latex/structure.tex
@@ -0,0 +1,320 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% see https://www.latextemplates.com/template/lachaise-assignment
+% Lachaise Assignment
+% Structure Specification File
+% Version 1.0 (26/6/2018)
+%
+% This template originates from:
+% http://www.LaTeXTemplates.com
+%
+% Authors:
+% Marion Lachaise & François Févotte
+% Vel (vel@LaTeXTemplates.com)
+%
+% License:
+% CC BY-NC-SA 3.0 (http://creativecommons.org/licenses/by-nc-sa/3.0/)
+% 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%----------------------------------------------------------------------------------------
+%	PACKAGES AND OTHER DOCUMENT CONFIGURATIONS
+%----------------------------------------------------------------------------------------
+
+\usepackage{amsmath,amsfonts,stmaryrd,amssymb} % Math packages
+
+\usepackage{enumerate} % Custom item numbers for enumerations
+
+%\usepackage[ruled]{algorithm2e} % Algorithms
+
+\usepackage[framemethod=tikz]{mdframed} % Allows defining custom boxed/framed environments
+
+\usepackage{listings} % File listings, with syntax highlighting
+\lstset{
+	basicstyle=\ttfamily, % Typeset listings in monospace font
+}
+
+%----------------------------------------------------------------------------------------
+%	DOCUMENT MARGINS
+%----------------------------------------------------------------------------------------
+
+\usepackage{geometry} % Required for adjusting page dimensions and margins
+
+\geometry{
+	paper=a4paper, % Paper size, change to letterpaper for US letter size
+	top=2.5cm, % Top margin
+	bottom=3cm, % Bottom margin
+	left=2.5cm, % Left margin
+	right=2.5cm, % Right margin
+	headheight=14pt, % Header height
+	footskip=1.5cm, % Space from the bottom margin to the baseline of the footer
+	headsep=1.2cm, % Space from the top margin to the baseline of the header
+	%showframe, % Uncomment to show how the type block is set on the page
+}
+
+%----------------------------------------------------------------------------------------
+%	FONTS
+%----------------------------------------------------------------------------------------
+
+\usepackage[utf8]{inputenc} % Required for inputting international characters
+\usepackage[T1]{fontenc} % Output font encoding for international characters
+
+\usepackage{XCharter} % Use the XCharter fonts
+
+%----------------------------------------------------------------------------------------
+%	COMMAND LINE ENVIRONMENT
+%----------------------------------------------------------------------------------------
+
+% Usage:
+% \begin{commandline}
+%	\begin{verbatim}
+%		$ ls
+%		
+%		Applications	Desktop	...
+%	\end{verbatim}
+% \end{commandline}
+
+\mdfdefinestyle{commandline}{
+	font=\footnotesize,
+	leftmargin=+1cm,
+	rightmargin=+1cm,
+	innerleftmargin=5pt,
+	middlelinecolor=black!50!white,
+	middlelinewidth=2pt,
+	frametitlerule=false,
+	backgroundcolor=black!5!white,
+	frametitle={Command Line},
+	frametitlefont={\normalfont\sffamily\color{white}\hspace{.5em}},
+	frametitlebackgroundcolor=black!50!white,
+	nobreak,
+}
+
+% Define a custom environment for command-line snapshots
+\newenvironment{commandline}{
+	\medskip
+	\begin{mdframed}[style=commandline]
+	}{
+	\end{mdframed}
+	\medskip
+}
+
+%----------------------------------------------------------------------------------------
+%	FILE CONTENTS ENVIRONMENT
+%----------------------------------------------------------------------------------------
+
+% Usage:
+% \begin{file}[optional filename, defaults to "File"]
+%	File contents, for example, with a listings environment
+% \end{file}
+
+\mdfdefinestyle{file}{
+	innertopmargin=1.6\baselineskip,
+	innerbottommargin=0.8\baselineskip,
+	topline=false, bottomline=false,
+	leftline=false, rightline=false,
+	leftmargin=2cm,
+	rightmargin=2cm,
+	singleextra={%
+		\draw[fill=black!10!white](P)++(0,-1.2em)rectangle(P-|O);
+		\node[anchor=north west]
+		at(P-|O){\ttfamily\mdfilename};
+		%
+		\def\l{3em}
+		\draw(O-|P)++(-\l,0)--++(\l,\l)--(P)--(P-|O)--(O)--cycle;
+		\draw(O-|P)++(-\l,0)--++(0,\l)--++(\l,0);
+	},
+	nobreak,
+}
+
+% Define a custom environment for file contents
+\newenvironment{file}[1][File]{ % Set the default filename to "File"
+	\medskip
+	\newcommand{\mdfilename}{#1}
+	\begin{mdframed}[style=file]
+	}{
+	\end{mdframed}
+	\medskip
+}
+
+%----------------------------------------------------------------------------------------
+%	NUMBERED QUESTIONS ENVIRONMENT
+%----------------------------------------------------------------------------------------
+
+% Usage:
+% \begin{question}[optional title]
+%	Question contents
+% \end{question}
+
+\mdfdefinestyle{question}{
+	innertopmargin=1.2\baselineskip,
+	innerbottommargin=0.8\baselineskip,
+	roundcorner=5pt,
+	nobreak,
+	singleextra={%
+		\draw(P-|O)node[xshift=1em,anchor=west,fill=white,draw,rounded corners=5pt]{%
+			Problem \theProblem\questionTitle};
+	},
+}
+
+\newcounter{Problem} % Stores the current question number that gets iterated with each new question
+\crefname{Problem}{problem}{problems}
+\Crefname{Problem}{Problem}{Problems}
+
+% Define a custom environment for numbered questions
+\newenvironment{question}[1][\unskip]{
+	\bigskip
+	\refstepcounter{Problem}
+	\newcommand{\questionTitle}{~#1}
+	\begin{mdframed}[style=question]
+	}{
+	\end{mdframed}
+	\medskip
+}
+
+%----------------------------------------------------------------------------------------
+%	WARNING TEXT ENVIRONMENT
+%----------------------------------------------------------------------------------------
+
+% Usage:
+% \begin{warn}[optional title, defaults to "Warning:"]
+%	Contents
+% \end{warn}
+
+\mdfdefinestyle{warning}{
+	topline=false, bottomline=false,
+	leftline=false, rightline=false,
+	nobreak,
+	singleextra={%
+		\draw(P-|O)++(-0.5em,0)node(tmp1){};
+		\draw(P-|O)++(0.5em,0)node(tmp2){};
+		\fill[black,rotate around={45:(P-|O)}](tmp1)rectangle(tmp2);
+		\node at(P-|O){\color{white}\scriptsize\bf !};
+		\draw[very thick](P-|O)++(0,-1em)--(O);%--(O-|P);
+	}
+}
+
+% Define a custom environment for warning text
+\newenvironment{warn}[1][Warning:]{ % Set the default warning to "Warning:"
+	\medskip
+	\begin{mdframed}[style=warning]
+		\noindent{\textbf{#1}}
+	}{
+	\end{mdframed}
+}
+
+%----------------------------------------------------------------------------------------
+%	INFORMATION ENVIRONMENT
+%----------------------------------------------------------------------------------------
+
+% Usage:
+% \begin{info}[optional title, defaults to "Info:"]
+% 	contents
+% 	\end{info}
+
+\mdfdefinestyle{info}{%
+	topline=false, bottomline=false,
+	leftline=false, rightline=false,
+	nobreak,
+	singleextra={%
+		\fill[black](P-|O)circle[radius=0.4em];
+		\node at(P-|O){\color{white}\scriptsize\bf i};
+		\draw[very thick](P-|O)++(0,-0.8em)--(O);%--(O-|P);
+	}
+}
+
+% Define a custom environment for information
+\newenvironment{info}[1][Info:]{ % Set the default title to "Info:"
+	\medskip
+	\begin{mdframed}[style=info]
+		\noindent{\textbf{#1}}
+	}{
+	\end{mdframed}
+}
+
+
+\mdfdefinestyle{answer}{%
+	topline=false, bottomline=false,
+	leftline=false, rightline=false,
+	nobreak,
+	singleextra={%
+		\fill[black](P-|O)circle[radius=0.4em];
+		\node at(P-|O){\color{white}\scriptsize\bf A};
+		\draw[very thick](P-|O)++(0,-0.8em)--(O);%--(O-|P);
+	}
+}
+
+% Define a custom environment for information
+\newenvironment{answer}[1][Answer:]{ % Set the default title to "Info:"
+	\medskip
+	\begin{mdframed}[style=answer]
+		\noindent{\textbf{#1}}
+	}{
+	\end{mdframed}
+}
+
+\usepackage{url}
+\usepackage{graphics}
+%\usepackage{fancybox}
+\usepackage{multicol}
+\usepackage{rotate}
+\usepackage{epsf}
+\usepackage{rotating}
+%\usepackage{color}
+\usepackage{xcolor}
+\usepackage{booktabs}
+\usepackage{hyperref}
+\usepackage{pifont}
+\usepackage{latexsym}
+\usepackage[english]{babel}
+\usepackage{epstopdf}
+\usepackage{etoolbox}
+%\usepackage{epsfig}
+\usepackage{amsmath}
+\usepackage{amssymb}
+\usepackage{multirow,epstopdf}
+\usepackage{cite}
+\usepackage{fancyhdr}
+\usepackage{booktabs}
+%\usepackage[most]{tcolorbox}
+\definecolor{LightGray}{HTML}{EEEEEE}
+\usepackage{cleveref}
+\usepackage{todonotes}
+\pagestyle{fancy}
+\usepackage{minted}
+\usepackage{commath}
+
+\setminted{
+	breaklines,
+	frame=lines,
+	framesep=2mm,
+	baselinestretch=1.2,
+	bgcolor=LightGray,
+	fontsize=\footnotesize,
+	linenos
+}
+
+
+%\newcommand{\pyi}[1]{\mintinline{python}{#1}}
+%\newcommand{\bai}[1]{\mintinline{bash}{#1}}
+
+\newif\ifsolution   
+\solutiontrue
+\definecolor{sol}{RGB}{192,16,16}
+\NewEnviron{solution}{
+	\ifsolution
+		\iftoggle{show_solutions}{ 
+	\par\noindent{\color{sol}{\bfseries Solution:}
+		\BODY}
+	\fi}{ }
+}
+\NewEnviron{insolution}{  \ifsolution{\color{sol}\BODY}\fi}
+
+\newif\ifsolutionstub   
+\solutionstubtrue
+\NewEnviron{solutionstub}{
+	\ifsolutionstub
+	\iftoggle{show_stubs}{ 
+	\par\noindent{\color{sol}
+		\BODY }
+	\fi}{ }
+}
+\NewEnviron{insolutionstub}{  \ifsolutionstub{\color{sol}\BODY}   \fi}
\ No newline at end of file
diff --git a/examples/presentation/instructor/cpp_course/Week6_handin_20_of_20.token b/examples/presentation/instructor/cpp_course/Week6_handin_20_of_20.token
new file mode 100644
index 0000000000000000000000000000000000000000..5fd08540f6b6ce7e46d4e1f318cdaf8046d5f272
--- /dev/null
+++ b/examples/presentation/instructor/cpp_course/Week6_handin_20_of_20.token
@@ -0,0 +1,198 @@
+# This file contains your results. Do not edit its content. Simply upload it as it is.
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+f8eb3b6572bc8f883a9f10e7a79456c7bbe6efe5fde36391ae02264708993425c8b8048665e74f5ed4c19f218fb815467d918384f70bc4b2da4cd78b4a347d47 34792
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+.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.
\ No newline at end of file
diff --git a/examples/presentation/instructor/cpp_course/fractions.py b/examples/presentation/instructor/cpp_course/fractions.py
new file mode 100644
index 0000000000000000000000000000000000000000..c32cb9b42cd2742c1c4f49fa69a5457bccbbba7b
--- /dev/null
+++ b/examples/presentation/instructor/cpp_course/fractions.py
@@ -0,0 +1,51 @@
+class Fraction: #!s
+    def __init__(self, n, m):
+        self.n = n
+        self.m = m
+
+    def __add__(self, other): #!f f should be the result of adding fraction 'other' to this fraction.
+        # Computes f = f1 + f2 (where f1 and f2 are both Fraction-objects and f1=self, f2=other) #!s
+        f = Fraction(other.m * self.n + other.n * self.m, self.n * self.m)
+        return f #!s
+
+    def __mul__(self, other): #!f f should be the result of multiplying fraction 'other' to this fraction.
+        # Overwrite to implement f = f1 * f2 #!s
+        f = Fraction(other.n * self.n, other.m*self.m)
+        return f #!s
+
+    def __truediv__(self, other): #!f f should be the result of dividing this fraction with 'other'
+        # Overwrite to implement f = f1/f2, or more specifically self/other. #!s
+        f = self.__mul__(Fraction(other.m, other.n))
+        return f #!s
+
+    def __str__(self):
+        """ Creates a string representation. You can use it as `print(str(Fraction(1,2))) to output 1/2"""
+        return f"{self.n} / {self.m}" #!s
+
+
+def from_string(s):
+    """ Convert the string s to a Fraction(a, b) object. """
+    if '+' in s: #!b
+        l = [from_string(ss.strip()) for ss in s.split("+")]
+        return l[0] + l[1]
+    if 'div' in s:
+        l = [from_string(ss.strip()) for ss in s.split("div")]
+        return l[0] / l[1]
+    if '*' in s:
+        l = [from_string(ss.strip()) for ss in s.split("*")]
+        return l[0] * l[1]
+    if '/' in s:
+        return Fraction(*[int(ss.strip()) for ss in s.split("/")]) #!b Compute and return a Fraction(a,b) object corresponding to s.
+
+
+if __name__ == "__main__": #!o=a
+    f1 = Fraction(1, 2)  # Represents 1/2 #!s=a
+    f2 = Fraction(3, 5) # Represents 3/5
+    print(f"Result of {f1} + {f2} is", f1+f2) #!s=a
+    #!o=a
+    # Now do some compound tests:
+    s = " 1 / 4 * 1 / 2" #!s=b #!o=b
+    print("Result of", s, "is", from_string(s))
+    s =  "5 / 2 div 10 / 3"
+    print("Result of", s, "is", from_string(s)) #!s=b #!o=b
+
diff --git a/examples/presentation/instructor/cpp_course/fragment.py b/examples/presentation/instructor/cpp_course/fragment.py
new file mode 100644
index 0000000000000000000000000000000000000000..c682cc3c727a4d03d6ce4319eb5f116b140a1364
--- /dev/null
+++ b/examples/presentation/instructor/cpp_course/fragment.py
@@ -0,0 +1,18 @@
+
+
+from cpp_course.fractions import Fraction, from_string
+
+f1 = Fraction(1, 2)  # Represents 1/2  #!i
+f2 = Fraction(3, 5)  # Represents 3/5
+print(f"Result of {f1} + {f2} is", f1 + f2)
+
+# Now do some compound tests:
+s = " 1 / 4 * 1 / 2"
+print("Result of", s, "is", from_string(s))
+s = "5 / 2 div 10 / 3"
+print("Result of", s, "is", from_string(s))
+pass
+#!i
+
+
+
diff --git a/examples/presentation/instructor/cpp_course/tests_ex6.py b/examples/presentation/instructor/cpp_course/tests_ex6.py
new file mode 100644
index 0000000000000000000000000000000000000000..8cc6174659c097f70516cbf045da3ef8eb51ad8c
--- /dev/null
+++ b/examples/presentation/instructor/cpp_course/tests_ex6.py
@@ -0,0 +1,54 @@
+from unitgrade import UTestCase, Report, cache
+from cpp_course.fractions import from_string, Fraction
+
+class Fractions_from_string(UTestCase):
+    def test_from_string_manual(self):
+        self.assertEqual(str(from_string("2 / 3 + 4 / 5")), "22/6")
+
+    def test_from_string_smarter(self):
+        self.assertEqualC(str(from_string("2 / 3 + 4 / 5")))
+
+    @cache
+    def output(self, problem):
+        return from_string(problem)
+
+    def test_from_string_smartest(self):
+        problems = """
+        2 / 3 + 4 / 5
+        1 / 2 * 3 / 4
+        1 / 2 div 1 / 2
+        1 / 4 + 1 / 2
+        1 / 2 * 2 / 4
+        1 / 2 div 4 / 2"""
+        print("\nTesting a bunch of problems...")
+        for l in problems.strip().splitlines():
+            l = l.strip() # Remove trailing spaces
+            print(f"Testing from_string({l}), output ought to be: {self.output(l)}")
+            self.assertEqualC(str(from_string(l))) # Actually perform the test.
+
+class Fractions_Basics(UTestCase):
+    def test_addition(self):
+        f1 = Fraction(1, 2)  # Represents 1/2
+        f2 = Fraction(3, 5)  # Represents 3/5
+        self.assertEqualC(str(f1 + f2))
+
+    def test_multiplication(self):
+        f1 = Fraction(1, 2)  # Represents 1/2
+        f2 = Fraction(3, 5)  # Represents 3/5
+        self.assertEqualC(str(f1 * f2))
+
+    def test_division(self):
+        f1 = Fraction(1, 2)  # Represents 1/2
+        f2 = Fraction(3, 5)  # Represents 3/5
+        self.assertEqualC(str(f1 / f2))
+
+
+import cpp_course
+class Week6(Report):
+    title = "02393 Programming in C++: Problem set 6"
+    pack_imports = [cpp_course]
+    questions = [(Fractions_from_string, 10), (Fractions_Basics, 10)]
+
+if __name__ == "__main__":
+    from unitgrade import evaluate_report_student
+    evaluate_report_student(Week6())
diff --git a/examples/presentation/instructor/cpp_course/tests_ex6_grade.py b/examples/presentation/instructor/cpp_course/tests_ex6_grade.py
new file mode 100644
index 0000000000000000000000000000000000000000..7c7e2a4862eeeb9ff895be658668664128d8b954
--- /dev/null
+++ b/examples/presentation/instructor/cpp_course/tests_ex6_grade.py
@@ -0,0 +1,4 @@
+# cpp_course/tests_ex6.py
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/presentation/instructor/cpp_course/unitgrade_data/FractionsFromString.pkl b/examples/presentation/instructor/cpp_course/unitgrade_data/FractionsFromString.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..edbf9b4ce6afbdbf3c87213a781f93eeffeafc67
Binary files /dev/null and b/examples/presentation/instructor/cpp_course/unitgrade_data/FractionsFromString.pkl differ
diff --git a/examples/presentation/instructor/cpp_course/unitgrade_data/FractionsFunctions.pkl b/examples/presentation/instructor/cpp_course/unitgrade_data/FractionsFunctions.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..e203f8a9cdc5234575b7882a181d38f22f6ea17c
Binary files /dev/null and b/examples/presentation/instructor/cpp_course/unitgrade_data/FractionsFunctions.pkl differ
diff --git a/examples/presentation/instructor/cpp_course/unitgrade_data/Fractions_Basics.pkl b/examples/presentation/instructor/cpp_course/unitgrade_data/Fractions_Basics.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..399069ef78aabbd5c563ea3c29de826589501450
Binary files /dev/null and b/examples/presentation/instructor/cpp_course/unitgrade_data/Fractions_Basics.pkl differ
diff --git a/examples/presentation/instructor/cpp_course/unitgrade_data/Fractions_from_string.pkl b/examples/presentation/instructor/cpp_course/unitgrade_data/Fractions_from_string.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..b01491f2121c122ac1e340a69286cd1a20b39b59
Binary files /dev/null and b/examples/presentation/instructor/cpp_course/unitgrade_data/Fractions_from_string.pkl differ
diff --git a/examples/presentation/instructor/cpp_course/unitgrade_data/cache.db b/examples/presentation/instructor/cpp_course/unitgrade_data/cache.db
new file mode 100644
index 0000000000000000000000000000000000000000..95dc06a9fec7ebbf6d2fc0e8bcd9122012a98401
Binary files /dev/null and b/examples/presentation/instructor/cpp_course/unitgrade_data/cache.db differ
diff --git a/examples/presentation/instructor/cpp_course/unitgrade_data/main_config_tests_ex6.artifacts.pkl b/examples/presentation/instructor/cpp_course/unitgrade_data/main_config_tests_ex6.artifacts.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..d9f67346343978b015fde99b56b6ab5c85017ca5
Binary files /dev/null and b/examples/presentation/instructor/cpp_course/unitgrade_data/main_config_tests_ex6.artifacts.pkl differ
diff --git a/examples/presentation/instructor/cpp_exam/ExamMay2021_handin_80_of_80.token b/examples/presentation/instructor/cpp_exam/ExamMay2021_handin_80_of_80.token
new file mode 100644
index 0000000000000000000000000000000000000000..7964d3f67eaf2351f90390d2240ae4e269465009
--- /dev/null
+++ b/examples/presentation/instructor/cpp_exam/ExamMay2021_handin_80_of_80.token
@@ -0,0 +1,243 @@
+# This file contains your results. Do not edit its content. Simply upload it as it is.
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+b2e96741c45cd551dff5295344eda77b02d258207f7c4084ce4c6ae3126082da671cbe6c1932c819992c838755b4f3568994f65093fa849bd0ce59db9a39e380 42840
+---------------------------------------------------------------------- ..ooO0Ooo.. ----------------------------------------------------------------------
+.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
+=.
\ No newline at end of file
diff --git a/examples/presentation/instructor/cpp_exam/problem1_vectors.py b/examples/presentation/instructor/cpp_exam/problem1_vectors.py
new file mode 100644
index 0000000000000000000000000000000000000000..8b9ed262123b2c5fa4c6af58548cebdad3188b72
--- /dev/null
+++ b/examples/presentation/instructor/cpp_exam/problem1_vectors.py
@@ -0,0 +1,30 @@
+class Vector:
+    def __init__(self, x, y):
+        self.x, self.y = x, y
+
+def createField(m, n, v): #!f Create and return a field of the form [ [v11, v12,...], [v21, v22,...],...] here
+    return [[Vector(v.x, v.y) for j in range(n)] for i in range(m)]
+
+def displayField(A): #!f Compute and return a string representation of A (see problem description)
+    return "\n".join([' '.join([f"({v.x},{v.y})" for v in c]) for c in A])
+
+def addFields(A, B): #!f Create and return a new field corresponding to A+B (element-wise)
+    return [ [Vector(v1.x + v2.x, v1.y+v2.y) for v1, v2 in zip(c1,c2) ] for c1,c2 in zip(A,B)]
+
+def scaleField(A, s):  #!f Create and return a new field corresponding to A*s (element-wise)
+    return [[Vector(v1.x * s, v1.y*s) for v1 in c1] for c1 in A]
+
+if __name__ == "__main__":
+    A = createField(3, 3, Vector(1,2)) #!s #!o
+    A[1][1] = Vector(2,2)
+    print(displayField(A))
+    print( )
+    B = createField(3, 3, Vector(2,-2))
+    B[0][0] = B[2][2] = Vector(9, 8)
+    print(displayField(B))
+    print( )
+    print(displayField(addFields(A, B)))
+    print("Result of scaling A by 2")
+    print(displayField(scaleField(A, 2))) #!s #!o
+
+
diff --git a/examples/presentation/instructor/cpp_exam/problem2_rle.py b/examples/presentation/instructor/cpp_exam/problem2_rle.py
new file mode 100644
index 0000000000000000000000000000000000000000..5fe11d582fe2081927c15a5a1fea9603ccc80041
--- /dev/null
+++ b/examples/presentation/instructor/cpp_exam/problem2_rle.py
@@ -0,0 +1,39 @@
+class Elem:
+    def __init__(self, value, times, next):
+        self.value = value
+        self.times = times
+        self.next = next
+
+def displayRLEList(l):
+    if l is None: return ""
+    return f" {l.value} (x{l.times})" +  displayRLEList(l.next)
+
+def reverse(l): #!f
+    prev = None
+    current = l
+    while current is not None:
+        n = current.next
+        prev = Elem(current.value, current.times, prev)
+        current = n
+    return prev
+
+def concatenate(l1, l2): #!f
+    hd = l1
+    while l1.next is not None:
+        l1 = l1.next
+    l1.next = l2
+    return hd
+
+def rle_sum(l): #!f
+    return 0 if l is None else (l.value * l.times + rle_sum(l.next))
+
+if __name__ == "__main__":
+    l1 = Elem(4, 10, Elem(12, 6, Elem(10, 5, None)))
+    l2 = Elem(1, 1, Elem(2, 2, Elem(3, 3, None)))
+
+    print("The RLE list is: ", displayRLEList(l1))
+    print("Other is: ", displayRLEList(l2))
+
+    print("The reversed list is: ", displayRLEList(reverse(l1)))
+    print("After concatenation, the list is: ", displayRLEList(concatenate(l1, l2)))
+    print("The sum of its elements is: ", rle_sum(l1))
diff --git a/examples/presentation/instructor/cpp_exam/problem3_groceries.py b/examples/presentation/instructor/cpp_exam/problem3_groceries.py
new file mode 100644
index 0000000000000000000000000000000000000000..60885e341688f1fa29767acf345484ad8a0561d0
--- /dev/null
+++ b/examples/presentation/instructor/cpp_exam/problem3_groceries.py
@@ -0,0 +1,33 @@
+class GroceryList:
+    def __init__(self):
+        # Populate the items:
+        self.items = {'Lasagne': (1, "With eggs if available"), "Salmon": (500, "Smoked if available"),
+                      "Spinach": (300, "Fresh"),                "Dessert": (8, "Maybe lagkage?"), }
+
+    def add(self, name, quantity=1, notes=""): #!f
+        if name in self.items:
+            item = self.items[name]
+            self.items[name] = (item[0] + quantity, item[1] + ";" + notes)
+        else:
+            self.items[name] = (quantity, notes)
+
+    def remove(self, name, quantity=1): #!f
+        if name not in self.items:
+            return False
+        else:
+            self.items[name] = (self.items[name][0]-quantity, self.items[name][1])
+            if self.items[name][0] <= 0:
+                del self.items[name]
+            return True
+
+    def copyEntry(self, name, new_name): #!f
+        if name not in self.items or new_name in self.items:
+            return False
+        else:
+            self.items[new_name] = self.items[name]
+            return True
+
+    def display(self): # Don't edit this function; it is used for the test.
+        s = [f"> {name=};{quantity=};{notes=}" for name, (quantity, notes) in self.items.items()]
+        print("\n".join(s))
+        return s
diff --git a/examples/presentation/instructor/cpp_exam/problem4_filter.py b/examples/presentation/instructor/cpp_exam/problem4_filter.py
new file mode 100644
index 0000000000000000000000000000000000000000..34f9bec3695bc9ae0f6682d33340a072aac8192a
--- /dev/null
+++ b/examples/presentation/instructor/cpp_exam/problem4_filter.py
@@ -0,0 +1,39 @@
+class Buffer:
+    def __init__(self, default=-999): #!f
+        self.buffer = []
+        self.known = set()
+        self.default = default
+
+    def write(self, n): #!f
+        if n not in self.known:
+            self.buffer.insert(0, n)
+            self.known.add(n)
+
+    def reset(self): #!f
+        self.buffer.clear()
+        self.known.clear()
+
+    def occupancy(self): #!f
+        return len(set(self.buffer))
+
+    def read(self): #!f
+        return self.buffer.pop() if len(self.buffer) > 0 else self.default
+
+if __name__ == "__main__":
+    b = Buffer()
+    print("Current buffer occupancy: ", b.occupancy())
+    print("Reading from the buffer returns: ", b.read())
+
+    for i in range(10):
+        b.write(i*10)
+
+    print("Current buffer occupancy: ", b.occupancy())
+    for i in range(10):
+        b.write(20)
+    print("Current buffer occupancy: ", b.occupancy())
+    for _ in range(3):
+        print("Reading from the buffer returns: ", b.read())
+    print("Current buffer occupancy: ", b.occupancy())
+    b.reset()
+    print("Current buffer occupancy: ", b.occupancy())
+    print("Reading from the buffer returns: ", b.read())
diff --git a/examples/presentation/instructor/cpp_exam/tests_exam.py b/examples/presentation/instructor/cpp_exam/tests_exam.py
new file mode 100644
index 0000000000000000000000000000000000000000..b68bfbe3c62c770d66c894a06112d2d30f9c4b80
--- /dev/null
+++ b/examples/presentation/instructor/cpp_exam/tests_exam.py
@@ -0,0 +1,263 @@
+from unitgrade import UTestCase, Report
+import cpp_exam
+from cpp_exam.problem1_vectors import Vector, createField, displayField, scaleField, addFields
+from cpp_exam.problem2_rle import Elem, rle_sum, reverse, concatenate, displayRLEList
+from cpp_exam.problem3_groceries import GroceryList
+from cpp_exam.problem4_filter import Buffer
+
+# class Q1Vectors_Examples(UTestCase):
+#     def test_correct_format(self):
+#         """ Test your field is in the right format.
+#             Hints:
+#                 * If this test fails, all subsequent tests will fail. Make sure it works!
+#         """
+#         A = createField(3, 3, Vector(1, 2))
+#         self.assertEqual(len(A), 3) # Check there are 3 rows in A
+#         self.assertEqual(len(A[0]), 3)  # Check there are 3 columns in A
+#         v = A[1][1]                 # Should be a Vector(1, 2) element.
+#         self.assertEqual(v.x, 1)  # Check that first coordinate is 1
+#         self.assertEqual(v.y, 2)  # Check that first coordinate is 1
+#
+#     def test_displayField(self):
+#         A = createField(3, 3, Vector(1, 2))
+#         A[1][1] = Vector(2, 2)
+#         self.assertEqualC(displayField(A).strip())
+#
+#     def test_addFields(self):
+#         A = createField(3, 3, Vector(1, 2))
+#         A[1][1] = Vector(2, 2)
+#         B = createField(3, 3, Vector(2, -2))
+#         B[0][0] = B[2][2] = Vector(9, 8)
+#         self.assertEqualC(displayField(addFields(A, B)).strip())
+#
+#     def test_scaleFields(self):
+#         A = createField(3, 3, Vector(1, 2))
+#         A[1][1] = Vector(2, 2)
+#         self.assertEqualC(displayField(scaleField(A, 2)).strip())
+
+def vector2string(v):
+    return f"({v.x},{v.y})"
+
+def check_field(self, A):
+    print("\nChecking size and type of field...")
+    self.assertIsInstance(A, list)
+    self.assertIsInstance(A[0], list)
+    self.assertIsInstance(A[0][0], Vector)
+    print("Checking all elements of field...")
+    for i, r in enumerate(A):
+        for j, a in enumerate(r):
+            # if i > 3 or j > 3: continue
+            print(f"Checking that A[{i}][{j}] = {self.get_expected_test_value()};", "your value was", vector2string(A[i][j]))
+            self.assertEqualC(vector2string(A[i][j]))
+
+class Q1Vectors(UTestCase):
+    def test_correct_format(self):
+        """ Test your field is in the right format.
+            Hints:
+                * If this test fails, all subsequent tests will fail. Make sure it works!
+        """
+        A = createField(3, 3, Vector(1, 2))
+        self.assertEqual(len(A), 3) # Check there are 3 rows in A
+        self.assertEqual(len(A[0]), 3)  # Check there are 3 columns in A
+        v = A[1][1]                 # Should be a Vector(1, 2) element.
+        self.assertEqual(v.x, 1)  # Check that first coordinate is 1
+        self.assertEqual(v.y, 2)  # Check that first coordinate is 1
+
+    def test_createField_small(self):
+        # Test a 4x4 field
+        check_field(self, createField(4, 4, Vector(1,2)))
+        # Test an 8x8 field
+        check_field(self, createField(8, 8, Vector(3,8)))
+
+    def test_display_field(self):
+        A = createField(4, 3, Vector(1,2))
+        A[0][0] = A[1][1] = A[2][2] = Vector(0,0)
+        self.assertEqualC(displayField(A))
+
+        B = createField(6,8, Vector(3, -9))
+        B[0][1] = B[2][1] = B[3][2] = B[4][5] = B[5][6] = Vector(0,0)
+        self.assertEqualC(displayField(B))
+
+    def test_add_fields(self):
+        A = createField(4, 3, Vector(1,2))
+        B = createField(4, 3, Vector(3, -9))
+        check_field(self, addFields(A, B))
+
+    def test_scale_fields(self):
+        A = createField(2, 4, Vector(1,2))
+        check_field(self, scaleField(A, 2))
+        A = createField(6, 6, Vector(3, 1))
+        check_field(self, scaleField(A, 3))
+
+def make_rle1():
+    return Elem(4, 10, Elem(12, 6, Elem(10, 5, None)))
+
+def make_rle2():
+    return Elem(4, 2, Elem(5, 3, Elem(3, 5, None)))
+
+def make_rle3():
+    return Elem(6, 3, Elem(7, 5, Elem(8, 5, None)))
+
+class Q2RLE(UTestCase):
+    def test_reverse_empty(self):
+        self.assertEqual(reverse(None), None)
+
+    def test_reverse(self):
+        self.assertEqualC(displayRLEList(reverse(make_rle1())))
+        l = make_rle1() # Test reversal of the tail
+        self.assertEqualC(displayRLEList(reverse(l.next)))
+
+    def test_concatenate_with_empty(self):
+        l = make_rle1()
+        print(f"Concatenating {displayRLEList(l)} with empty list")
+        self.assertEqualC(displayRLEList(concatenate(l, None)))
+
+        l = make_rle2()
+        print(f"Concatenating {displayRLEList(l)} with empty list")
+        self.assertEqualC(displayRLEList(concatenate(l, None)))
+
+    def test_concatenate_with_another(self):
+        l1, l2 = make_rle1(), make_rle2()
+        print(f"Concatenating {displayRLEList(l1)} with {displayRLEList(l2)}")
+        self.assertEqualC(displayRLEList(concatenate(l1, l2)))
+
+    def test_concatenate_three_lists(self):
+        l1, l2, l3 = make_rle1(), make_rle2(), make_rle3()
+        print(f"Concatenating {displayRLEList(l1)} with {displayRLEList(l2)} and {displayRLEList(l3)}")
+        self.assertEqualC(displayRLEList(concatenate(l1, concatenate(l2, l3))))
+
+    def test_sum_empty(self):
+        print(f"Computing sum of empty list")
+        self.assertEqual(rle_sum(None), 0)
+
+    def test_sum_nonempty(self):
+        for l in [ make_rle1(),  make_rle2(),  make_rle3()]:
+            print(f"Computing sum of {displayRLEList(l)}")
+            self.assertEqualC(rle_sum(l), 0)
+
+class Q3Groceries(UTestCase):
+    def test_add(self):
+        gl = GroceryList()
+        print("Initial list")
+        gl.display()
+        print("After adding cheddar:")
+        gl.add("Cheddar", 500, "Not too mature")
+        gl.display()
+        print("After adding more spinach:")
+        gl.add("Spinach", 200, "Baby spinach if available")
+        gl.display()
+        print("After adding even more spinach:")
+        gl.add("Spinach", 200, "Frozen is OK")
+        gl.display()
+
+    def test_remove1(self):
+        gl = GroceryList()
+        gl.display()
+        print("After removing spinach")
+        self.assertTrue(gl.remove("Spinach", 200))
+        self.assertEqualC(gl.display())
+
+        print("After removing more spinach")
+        self.assertTrue(gl.remove("Spinach", 100))
+        self.assertEqualC(gl.display())
+
+        print("Trying to remove even more spinach:")
+        self.assertFalse(gl.remove("Spinach", 100))
+
+        print("Trying to remove cheddar:")
+        self.assertFalse(gl.remove("Cheddar", 100))
+
+    def test_copy(self):
+        gl = GroceryList()
+        print("Initial grocery list:")
+        gl.display()
+        print("After copying spinach into baby spinach:")
+        self.assertTrue(gl.copyEntry("Spinach", "Baby spinach"))
+        self.assertEqualC(gl.display())
+        print("After copying baby spinach into dessert:")
+        self.assertFalse(gl.copyEntry("Baby spinach", "Dessert"))
+        print("After copying Cheddar into Spinach")
+        self.assertFalse( gl.copyEntry("Cheddar", "Spinach"))
+
+class Q4FilterBuffer(UTestCase):
+    def test_if_compiles(self):
+        b = Buffer()
+        b.write(42)
+        b.write(42)
+        b.occupancy()
+        b.read()
+        print("None of the functions crashed! Congrats!")
+
+    def test_occupancy(self):
+        b = Buffer()
+        print("Current occupancy", b.occupancy())
+        self.assertEqual(b.occupancy(), 0)
+        for i in range(7):
+            b.write(i*10)
+        print("Current buffer occupancy: ", b.occupancy())
+        self.assertEqual(b.occupancy(), 7)
+        for i in range(5, 10):
+            b.write(i*10)
+        print("Current buffer occupancy: ", b.occupancy())
+        self.assertEqual(b.occupancy(), 10)
+
+    def test_read(self):
+        b = Buffer()
+        print("Current buffer occupancy: ", b.occupancy())
+        print(f"Reading from empty buffer should return default value of {b.default}")
+        self.assertEqual(b.read(), -999)
+
+        for i in range(5):
+            b.write(i*10)
+
+        print("Current buffer occupancy: ", b.occupancy() )
+        self.assertEqual(b.occupancy(), 5)
+        for i in range(3):
+            r = b.read()
+            print("Reading from the buffer returns: ", r)
+            self.assertEqual(r, i*10)
+        print("Current buffer occupancy: ", b.occupancy() )
+        self.assertEqualC(b.occupancy())
+
+        for i in range(8):
+            b.write(i * 10)
+        print("Current buffer occupancy: ", b.occupancy())
+        self.assertEqualC(b.occupancy())
+
+        for i in range(6):
+            r = b.read()
+            print("Reading from the buffer returns: ", r)
+            self.assertEqualC(r)
+
+    def test_reset(self):
+        b = Buffer()
+
+        for i in range(5):
+            b.write(i*10)
+        print("Current buffer occupancy: ", b.occupancy() )
+        self.assertEqual(b.occupancy(), 5)
+        for i in range(3):
+            r = b.read()
+            print("Reading from the buffer returns: ", r)
+            self.assertEqual(r, i*10)
+        print("Current buffer occupancy: ", b.occupancy() )
+        self.assertEqualC(b.occupancy())
+        b.reset()
+        for i in range(8):
+            b.write(i * 10)
+        print("Current buffer occupancy: ", b.occupancy())
+        self.assertEqualC(b.occupancy())
+
+        for i in range(3):
+            r = b.read()
+            print("Reading from the buffer returns: ", r)
+            self.assertEqualC(r)
+
+class ExamMay2021(Report):
+    title = "Programming in C++: Exam May 2021"
+    pack_imports = [cpp_exam]
+    questions = [(Q1Vectors, 25), (Q2RLE, 25), (Q3Groceries, 25), (Q4FilterBuffer, 25)]
+
+if __name__ == "__main__":
+    from unitgrade import evaluate_report_student
+    evaluate_report_student(ExamMay2021())
diff --git a/examples/presentation/instructor/cpp_exam/tests_exam_grade.py b/examples/presentation/instructor/cpp_exam/tests_exam_grade.py
new file mode 100644
index 0000000000000000000000000000000000000000..6aa0d1911e814bbe3106605c7a6a01d9c5b5a669
--- /dev/null
+++ b/examples/presentation/instructor/cpp_exam/tests_exam_grade.py
@@ -0,0 +1,4 @@
+# cpp_exam/tests_exam.py
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors.pkl b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..1bb470ade1775939b45fbd6f3102d136b7f49eea
Binary files /dev/null and b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors.pkl differ
diff --git a/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors_Examples.pkl b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors_Examples.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..51e256915163451ebd567efcb7a1039f78ae5bad
Binary files /dev/null and b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors_Examples.pkl differ
diff --git a/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors_addFields.pkl b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors_addFields.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..3326845c855d89d7c2fea74ac07c7a21a6d8bfdc
Binary files /dev/null and b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors_addFields.pkl differ
diff --git a/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors_createField.pkl b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors_createField.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..348b69dde62d9b6720650cb1e881fdea85ff77d0
Binary files /dev/null and b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors_createField.pkl differ
diff --git a/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors_displayField.pkl b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors_displayField.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..5361fe4e4fbbef8c5a57f45e24f5a457c423452e
Binary files /dev/null and b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors_displayField.pkl differ
diff --git a/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors_scaleFields.pkl b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors_scaleFields.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..f47470647432cbf04aa8ef3bf469a64d45a3712f
Binary files /dev/null and b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q1Vectors_scaleFields.pkl differ
diff --git a/examples/presentation/instructor/cpp_exam/unitgrade_data/Q2RLE.pkl b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q2RLE.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..20cb684a1956677afbd6991a2e1805751ba9b13f
Binary files /dev/null and b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q2RLE.pkl differ
diff --git a/examples/presentation/instructor/cpp_exam/unitgrade_data/Q2RLE_concatenate.pkl b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q2RLE_concatenate.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..d90a8b22d42fdfadc872470bbd7d9bb190bf2992
Binary files /dev/null and b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q2RLE_concatenate.pkl differ
diff --git a/examples/presentation/instructor/cpp_exam/unitgrade_data/Q2RLE_reverse.pkl b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q2RLE_reverse.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..b2fb05d0c12b4fdf1319747e8ed922ed2d6a3015
Binary files /dev/null and b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q2RLE_reverse.pkl differ
diff --git a/examples/presentation/instructor/cpp_exam/unitgrade_data/Q2RLE_sum.pkl b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q2RLE_sum.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..5a2393c3f39e225413d9441f4a0d43d76b80d833
Binary files /dev/null and b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q2RLE_sum.pkl differ
diff --git a/examples/presentation/instructor/cpp_exam/unitgrade_data/Q3Groceries.pkl b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q3Groceries.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..7bc62d9208bce50dc506d849658a180725a812db
Binary files /dev/null and b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q3Groceries.pkl differ
diff --git a/examples/presentation/instructor/cpp_exam/unitgrade_data/Q3Groceries_add.pkl b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q3Groceries_add.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..1b7aa58d2e66f889086a04e840df628fc67eda51
Binary files /dev/null and b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q3Groceries_add.pkl differ
diff --git a/examples/presentation/instructor/cpp_exam/unitgrade_data/Q3Groceries_remove.pkl b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q3Groceries_remove.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..d82e05e8321c1139321aa4c4b10c24b94464ad6a
Binary files /dev/null and b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q3Groceries_remove.pkl differ
diff --git a/examples/presentation/instructor/cpp_exam/unitgrade_data/Q4FilterBuffer.pkl b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q4FilterBuffer.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..46b03afee78f6a519772733cb725d16b7c852dc8
Binary files /dev/null and b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q4FilterBuffer.pkl differ
diff --git a/examples/presentation/instructor/cpp_exam/unitgrade_data/Q4FilterBuffer_Group1.pkl b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q4FilterBuffer_Group1.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..4b7982addb2bf20a1e79464dd1a3e4799d5791aa
Binary files /dev/null and b/examples/presentation/instructor/cpp_exam/unitgrade_data/Q4FilterBuffer_Group1.pkl differ
diff --git a/examples/presentation/instructor/cpp_exam/unitgrade_data/main_config_tests_exam.artifacts.pkl b/examples/presentation/instructor/cpp_exam/unitgrade_data/main_config_tests_exam.artifacts.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..b43d1e606afee1a7104752bf3b3d699e30cee16e
Binary files /dev/null and b/examples/presentation/instructor/cpp_exam/unitgrade_data/main_config_tests_exam.artifacts.pkl differ
diff --git a/examples/presentation/instructor/deploy.py b/examples/presentation/instructor/deploy.py
new file mode 100644
index 0000000000000000000000000000000000000000..7877f57ece4dedf9fa180ab05c00178150c28751
--- /dev/null
+++ b/examples/presentation/instructor/deploy.py
@@ -0,0 +1,13 @@
+from unitgrade_private import setup_grade_file_report
+from snipper import snip_dir
+from cpp_course.tests_ex6 import Week6
+from cpp_exam.tests_exam import ExamMay2021
+
+
+
+if __name__ == "__main__":
+    from intro_python.exam import Exam2021
+    setup_grade_file_report(Week6, with_coverage=True, minify=False, obfuscate=False,bzip=True)
+    setup_grade_file_report(ExamMay2021, with_coverage=True, minify=False, obfuscate=False,bzip=True)
+    setup_grade_file_report(Exam2021, with_coverage=True, minify=False, obfuscate=False,bzip=True)
+    snip_dir("./", "../students", clean_destination_dir=True, exclude=['*.token', 'deploy.py'], output_dir="../Latex/output")
diff --git a/examples/presentation/instructor/intro_python/exam.py b/examples/presentation/instructor/intro_python/exam.py
new file mode 100644
index 0000000000000000000000000000000000000000..02b54dc010ec0b19a666967b5b4adf2978a5cbb6
--- /dev/null
+++ b/examples/presentation/instructor/intro_python/exam.py
@@ -0,0 +1,99 @@
+import numpy as np
+from unitgrade import UTestCase, Report, hide
+import intro_python
+from intro_python.problems import water_height, tictactoe, time_angle, astronomical_season, standardize_address
+
+class Q1_WaterHeight(UTestCase):
+    def test1(self):
+        h0 = 5
+        r = np.array([4.5, 0, 1.5, 0, 0, 0.5, 1, 2, 5])
+        h = water_height(h0, r)
+        print("Water height computed to be", h, "should be", self.get_expected_test_value())
+        self.assertEqual(h, 3.0) # Check the height is 3.0
+
+    @hide
+    def test_water_height_hidden(self):
+        checks = [(120, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]),
+                  (12, []), (14.2, [8.8]), (0, [0.8]),
+                  (3, [0, 1, 2, 0, 0, 5.2, 6.5, 7.1, 0, 0, 0.1, 1, 2.9, 0.13, 0, 2, 0, 0]),
+                  (0, [0, 5, 2, 0, 0, 5.2, 6.5, 7.1, 0, 0, 0.1, 1, 2.9, 0.13, 0, 1.2, 0, 1.2, 7.5, 0]),
+                  (0, [0, 0, 2, 2.1, 2.4, 2.2, 2.5]), (18, [30, 1, 28.8]), (1, [0.5]), (2, [])]
+        for h0, r in checks:
+            self.assertEqualC(water_height(h0, r))
+
+class Q2_AstronomicalSeason(UTestCase):
+    def test_seasons(self):
+        season = astronomical_season('09/12-2020')
+        print("Season was computed to be", season, "it was supposed to be", self.get_expected_test_value())
+        self.assertEqualC(season)
+
+    @hide
+    def test_seasons_hidden(self):
+        for d in ['27/12-1998', '21/06-2108', '08/05-1998', '07/08-1945', '22/12-1208', '19/03-2001', '23/09-2018', '21/06-2008','12/04-1964', '13/01-1900']:
+            self.assertEqualC(astronomical_season(d))
+
+
+class Q3_TimeAngle(UTestCase):
+    def test_angle(self):
+        a = time_angle(hour=8, minute=20)
+        print("Angle was", a, "it was supposed to be", self.get_expected_test_value())
+        self.assertEqualC(a)
+
+    @hide
+    def test_angle_extended(self):
+        for minute in [0, 15, 18, 20, 34, 50, 59]:
+            for hour in [0, 1, 5, 6, 10, 12]:
+                self.assertEqualC(time_angle(hour, minute))
+
+class Q4_TicTacToe(UTestCase):
+    def test_tic_tac(self):
+        board = np.array([[2, 1, 1],
+                          [1, 1, 2],
+                          [2, 0, 0]])
+        score = tictactoe(board)
+        print("Score for board was", score, "it is supposed to be", self.get_expected_test_value())
+        self.assertEqualC(score)
+
+    @hide
+    def test_tic_tac_hidden(self):
+        boards = [[[1, 2, 0], [1, 2, 0], [1, 2, 0]],
+                  [[1, 1, 1], [2, 1, 2], [2, 2, 1]],
+                  [[2, 0, 1], [2, 1, 0], [0, 0, 2]],
+                  [[1, 0, 2], [0, 1, 0], [2, 0, 1]],
+                  [[2, 0, 1], [0, 2, 1], [0, 0, 1]],
+                  [[0, 1, 0], [0, 1, 1], [2, 2, 2]],
+                  [[1, 1, 2], [0, 2, 0], [2, 1, 0]],
+                  [[1, 1, 1], [0, 2, 0], [0, 0, 0]],
+                  [[1, 2, 1], [2, 1, 0], [2, 0, 1]],
+                  [[0, 0, 0], [0, 1, 0], [0, 0, 0]],
+                  [[2, 1, 1], [1, 1, 2], [2, 0, 0]]]
+        for board in boards:
+            self.assertEqualC(tictactoe(np.asarray(board)))
+
+
+class Q5_StandardizeAddress(UTestCase):
+    def test_standardize_address(self):
+        s = standardize_address('New York 10001')
+        print("Address computed to be", s, "was supposed to be", self.get_expected_test_value())
+        self.assertEqualC(s)
+
+    @hide
+    def test_standardize_address_hidden(self):
+        for address in ['Kongens_Lyngby_2800', '10000_Zagreb','43500 Daruvar','Egtved_6040','Vejle 7200', '02108_Boston',
+                  'Pasadena_91001', '90001_Los_Angeles', 'San_Francisco_94016', 'Rio_de_Jainero_22775']:
+            self.assertEqualC(standardize_address(address))
+
+
+
+class Exam2021(Report):
+    title = "Introduction to Python: Exam spring 2021"
+    pack_imports = [intro_python]
+    questions = [(Q1_WaterHeight, 20),
+                 (Q2_AstronomicalSeason, 20),
+                 (Q3_TimeAngle, 20),
+                 (Q4_TicTacToe, 20),
+                 (Q5_StandardizeAddress, 20)]
+
+if __name__ == "__main__":
+    from unitgrade import evaluate_report_student
+    evaluate_report_student(Exam2021())
diff --git a/examples/presentation/instructor/intro_python/exam_grade.py b/examples/presentation/instructor/intro_python/exam_grade.py
new file mode 100644
index 0000000000000000000000000000000000000000..b5478483bcc6f0eb8a174cd68889350a6681af80
--- /dev/null
+++ b/examples/presentation/instructor/intro_python/exam_grade.py
@@ -0,0 +1,4 @@
+# intro_python/exam.py
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/presentation/instructor/intro_python/problems.py b/examples/presentation/instructor/intro_python/problems.py
new file mode 100644
index 0000000000000000000000000000000000000000..8a96886c56f8b41320f896f7c93b464c6996f053
--- /dev/null
+++ b/examples/presentation/instructor/intro_python/problems.py
@@ -0,0 +1,86 @@
+import numpy as np
+
+def astronomical_season(date):
+    """ Problem 1. Given a date (as a string) return the season (as a string)
+    Hints:
+        * The date is a string in the format <dd> <mm>, for instance '18 04' is the 18th of March.
+        * The season must be a string which can be either 'winter', 'spring', 'summer' or 'autumn'.
+    """
+    dd = int(date[0:2]) #!b
+    mm = int(date[3:5])
+    if mm<3 or (mm==3 and dd<20):
+        season = 'winter'
+    elif mm<6 or (mm==6 and dd<21):
+        season = 'spring'
+    elif mm<9 or (mm==9 and dd<23):
+        season = 'summer'
+    elif mm<12 or (mm==12 and dd<21):
+        season = 'autumn'
+    else:
+        season = 'winter' #!b Compute the season here.
+    return season
+
+
+def standardize_address(address):
+    """ Given an address, return a standardized version (see question text)
+
+    Hints:
+        * The function s.isnumeric() may be of help to check if a string s is a number.
+    """
+    s = address.replace('_', ' ') #!b
+    if not s[0].isnumeric():
+        i = s[-1::-1].find(' ')
+        i = len(s) - 1 - i
+        s = s[i+1:] + s[i] + s[:i] #!b Compute the address here
+    return s
+
+def tictactoe(board):
+    """ Given a tic-tac-toc board configuration, return whether it is valid or not.
+
+    Hints:
+        * Remember that 'board' is a numpy array. Check what the function np.all(A, axis) does.
+        * You can 'flatten' an array using A.ravel().
+    """
+    def wins(b): #!b
+        return np.all(b, axis=0).sum() + np.all(b, axis=1).sum() + np.all(b.ravel()[[0, 4, 8]]) + np.all(b.ravel()[[2, 4, 6]])
+
+    ones_wins = wins(board == 1)
+    twos_wins = wins(board == 2)
+    d = np.sum(board == 1) - np.sum(board == 2)  # 0 or 1 for a valid board
+    if d < 0 or d > 1 or (ones_wins + twos_wins) > 1:
+        score = -1
+    elif ones_wins:
+        score = 1
+    elif twos_wins:
+        score = 2
+    else:
+        score = 0 #!b compute the board score (an integer, either 0, 1 or 2)
+    return score
+
+def time_angle(hour, minute):
+    """ Given hours and minutes (integers), return the angle of the small hand.
+
+    Hints:
+        * The angle is between 0 and 360.
+        * Noon and midnight, 12:00 and 24:00, is both 0
+        * Use % for remainder. For instance 8 % 5 is 2 and 24 % 10 = 4 (see lecture notes)
+    """
+    hour = hour % 12 #!b
+    hour_hand = 360 * (hour + minute / 60) / 12
+    minute_hand = 360 * minute / 60
+    a = hour_hand - minute_hand
+    if a < 0:
+        a = a + 360 #!b Compute the angle of the small hand here
+    return a
+
+def water_height(h0, r):
+    """ Problem 1: Compute the water height.
+
+    Hints:
+        * Remember the height must be a non-negative number.
+    """
+    h = h0 #!b
+    for ri in r:
+        h = max(h + ri - 2, 0) #!b Compute the water height h here.
+    return h
+
diff --git a/examples/presentation/instructor/intro_python/unitgrade_data/Problem1.pkl b/examples/presentation/instructor/intro_python/unitgrade_data/Problem1.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..15baef336eff2b1034fdb3e6def2a77b7b19b5ac
Binary files /dev/null and b/examples/presentation/instructor/intro_python/unitgrade_data/Problem1.pkl differ
diff --git a/examples/presentation/instructor/intro_python/unitgrade_data/Q1_WaterHeight.pkl b/examples/presentation/instructor/intro_python/unitgrade_data/Q1_WaterHeight.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..959b3da92d0109166386114384e2283c87bb0c86
Binary files /dev/null and b/examples/presentation/instructor/intro_python/unitgrade_data/Q1_WaterHeight.pkl differ
diff --git a/examples/presentation/instructor/intro_python/unitgrade_data/Q2_AstronomicalSeason.pkl b/examples/presentation/instructor/intro_python/unitgrade_data/Q2_AstronomicalSeason.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..ded5dd0d2b52198997ef58794fc3ffaec0fe37b7
Binary files /dev/null and b/examples/presentation/instructor/intro_python/unitgrade_data/Q2_AstronomicalSeason.pkl differ
diff --git a/examples/presentation/instructor/intro_python/unitgrade_data/Q3_TimeAngle.pkl b/examples/presentation/instructor/intro_python/unitgrade_data/Q3_TimeAngle.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..50090e6cc4db269029576997d4da40c4176dd3c2
Binary files /dev/null and b/examples/presentation/instructor/intro_python/unitgrade_data/Q3_TimeAngle.pkl differ
diff --git a/examples/presentation/instructor/intro_python/unitgrade_data/Q4_TicTacToe.pkl b/examples/presentation/instructor/intro_python/unitgrade_data/Q4_TicTacToe.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..8c6eb03977b19b14b4341b68c8a96b0b1baa5808
Binary files /dev/null and b/examples/presentation/instructor/intro_python/unitgrade_data/Q4_TicTacToe.pkl differ
diff --git a/examples/presentation/instructor/intro_python/unitgrade_data/Q5_StandardizeAddress.pkl b/examples/presentation/instructor/intro_python/unitgrade_data/Q5_StandardizeAddress.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..e013c45a0f8b0e56fbf974cd7ff8bba3583dfe5d
Binary files /dev/null and b/examples/presentation/instructor/intro_python/unitgrade_data/Q5_StandardizeAddress.pkl differ
diff --git a/examples/presentation/instructor/intro_python/unitgrade_data/main_config_exam.artifacts.pkl b/examples/presentation/instructor/intro_python/unitgrade_data/main_config_exam.artifacts.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..e45319db9112fdae5426c258ccf3b595dcb2df0f
Binary files /dev/null and b/examples/presentation/instructor/intro_python/unitgrade_data/main_config_exam.artifacts.pkl differ
diff --git a/examples/presentation/output/fractions_a.py b/examples/presentation/output/fractions_a.py
new file mode 100644
index 0000000000000000000000000000000000000000..bb5506d26d441c1bd20788dd5dda40235b7b2867
--- /dev/null
+++ b/examples/presentation/output/fractions_a.py
@@ -0,0 +1,4 @@
+# cpp_course/fractions.py
+    f1 = Fraction(1, 2)  # Represents 1/2 
+    f2 = Fraction(3, 5) # Represents 3/5
+    print(f"Result of {f1} + {f2} is", f1+f2) 
\ No newline at end of file
diff --git a/examples/presentation/output/fractions_a.txt b/examples/presentation/output/fractions_a.txt
new file mode 100644
index 0000000000000000000000000000000000000000..97eea37083243059b6197d25c1ae413972d8278a
--- /dev/null
+++ b/examples/presentation/output/fractions_a.txt
@@ -0,0 +1 @@
+Result of (1 / 2) + (3 / 5) is (11 / 2)
diff --git a/examples/presentation/output/fractions_b.py b/examples/presentation/output/fractions_b.py
new file mode 100644
index 0000000000000000000000000000000000000000..01f53792d07831bda412856be312a087d6ba6663
--- /dev/null
+++ b/examples/presentation/output/fractions_b.py
@@ -0,0 +1,5 @@
+# cpp_course/fractions.py
+    s = " 1 / 4 * 1 / 2" 
+    print("Result of", s, "is", from_string(s))
+    s =  "5 / 2 div 10 / 3"
+    print("Result of", s, "is", from_string(s)) 
\ No newline at end of file
diff --git a/examples/presentation/output/fractions_b.txt b/examples/presentation/output/fractions_b.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6cfc0ea9c7b543eea3daf62488da5719bec95fff
--- /dev/null
+++ b/examples/presentation/output/fractions_b.txt
@@ -0,0 +1,2 @@
+Result of  1 / 4 * 1 / 2 is (1 / 8)
+Result of 5 / 2 div 10 / 3 is (15 / 20)
diff --git a/examples/presentation/output/problem1_vectors.py b/examples/presentation/output/problem1_vectors.py
new file mode 100644
index 0000000000000000000000000000000000000000..ae39282359c7ef13f48c375128e1a26497b749a3
--- /dev/null
+++ b/examples/presentation/output/problem1_vectors.py
@@ -0,0 +1,12 @@
+# cpp_exam/problem1_vectors.py
+    A = createField(3, 3, Vector(1,2)) 
+    A[1][1] = Vector(2,2)
+    print(displayField(A))
+    print( )
+    B = createField(3, 3, Vector(2,-2))
+    B[0][0] = B[2][2] = Vector(9, 8)
+    print(displayField(B))
+    print( )
+    print(displayField(addFields(A, B)))
+    print("Result of scaling A by 2")
+    print(displayField(scaleField(A, 2))) 
\ No newline at end of file
diff --git a/examples/presentation/output/problem1_vectors.txt b/examples/presentation/output/problem1_vectors.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c64c795333ebe0e33d4b9caf7de7a53c17624e66
--- /dev/null
+++ b/examples/presentation/output/problem1_vectors.txt
@@ -0,0 +1,15 @@
+(1,2) (1,2) (1,2)
+(1,2) (2,2) (1,2)
+(1,2) (1,2) (1,2)
+
+(9,8) (2,-2) (2,-2)
+(2,-2) (2,-2) (2,-2)
+(2,-2) (2,-2) (9,8)
+
+(10,10) (3,0) (3,0)
+(3,0) (4,0) (3,0)
+(3,0) (3,0) (10,10)
+Result of scaling A by 2
+(2,4) (2,4) (2,4)
+(2,4) (4,4) (2,4)
+(2,4) (2,4) (2,4)
diff --git a/examples/presentation/setup_presentation.py b/examples/presentation/setup_presentation.py
new file mode 100644
index 0000000000000000000000000000000000000000..3d73eecdb95db483646f53af4f83806765b9b1d6
--- /dev/null
+++ b/examples/presentation/setup_presentation.py
@@ -0,0 +1,15 @@
+import os
+
+if __name__ == "__main__":
+
+
+    from unitgrade_private.pipelines.process_65 import process_by_zip_file
+    from unitgrade_private.pipelines.dummy_handins import make_dummies
+
+    cdir = os.path.dirname(__file__)
+
+    make_dummies(zip_file_path=cdir + "/handin/project1.zip", n_handins=3, screwups=4, student_base_dir=cdir+"/students", student_grade_file=cdir+"/students/intro_python/exam_grade.py")
+    # student base directory.
+
+
+    pass
\ No newline at end of file
diff --git a/examples/presentation/students/cpp_course/fractions.py b/examples/presentation/students/cpp_course/fractions.py
new file mode 100644
index 0000000000000000000000000000000000000000..6c3082856804b6a7cfc394a3acb8b68ca4331e09
--- /dev/null
+++ b/examples/presentation/students/cpp_course/fractions.py
@@ -0,0 +1,40 @@
+class Fraction: 
+    def __init__(self, n, m):
+        self.n = n
+        self.m = m
+
+    def __add__(self, other): 
+        # TODO: 2 lines missing.
+        raise NotImplementedError("f should be the result of adding fraction 'other' to this fraction.")
+        return f
+
+    def __mul__(self, other): 
+        # TODO: 2 lines missing.
+        raise NotImplementedError("f should be the result of multiplying fraction 'other' to this fraction.")
+        return f
+
+    def __truediv__(self, other): 
+        # TODO: 2 lines missing.
+        raise NotImplementedError("f should be the result of dividing this fraction with 'other'")
+        return f
+
+    def __str__(self):
+        """ Creates a string representation. You can use it as `print(str(Fraction(1,2))) to output 1/2"""
+        return f"{self.n} / {self.m}" 
+
+
+def from_string(s):
+    """ Convert the string s to a Fraction(a, b) object. """
+    # TODO: 10 lines missing.
+    raise NotImplementedError("Compute and return a Fraction(a,b) object corresponding to s.")
+
+
+if __name__ == "__main__": 
+    f1 = Fraction(1, 2)  # Represents 1/2 
+    f2 = Fraction(3, 5) # Represents 3/5
+    print(f"Result of {f1} + {f2} is", f1+f2) 
+    # Now do some compound tests:
+    s = " 1 / 4 * 1 / 2" 
+    print("Result of", s, "is", from_string(s))
+    s =  "5 / 2 div 10 / 3"
+    print("Result of", s, "is", from_string(s)) 
diff --git a/examples/presentation/students/cpp_course/fragment.py b/examples/presentation/students/cpp_course/fragment.py
new file mode 100644
index 0000000000000000000000000000000000000000..d213567d25faf0f13d3e8c4be32bedc353784bb9
--- /dev/null
+++ b/examples/presentation/students/cpp_course/fragment.py
@@ -0,0 +1,14 @@
+from cpp_course.fractions import Fraction, from_string
+
+f1 = Fraction(1, 2)  # Represents 1/2  
+f2 = Fraction(3, 5)  # Represents 3/5
+print(f"Result of {f1} + {f2} is", f1 + f2)
+
+# Now do some compound tests:
+s = " 1 / 4 * 1 / 2"
+print("Result of", s, "is", from_string(s))
+s = "5 / 2 div 10 / 3"
+print("Result of", s, "is", from_string(s))
+pass
+#!i
+
diff --git a/examples/presentation/students/cpp_course/tests_ex6.py b/examples/presentation/students/cpp_course/tests_ex6.py
new file mode 100644
index 0000000000000000000000000000000000000000..8cc6174659c097f70516cbf045da3ef8eb51ad8c
--- /dev/null
+++ b/examples/presentation/students/cpp_course/tests_ex6.py
@@ -0,0 +1,54 @@
+from unitgrade import UTestCase, Report, cache
+from cpp_course.fractions import from_string, Fraction
+
+class Fractions_from_string(UTestCase):
+    def test_from_string_manual(self):
+        self.assertEqual(str(from_string("2 / 3 + 4 / 5")), "22/6")
+
+    def test_from_string_smarter(self):
+        self.assertEqualC(str(from_string("2 / 3 + 4 / 5")))
+
+    @cache
+    def output(self, problem):
+        return from_string(problem)
+
+    def test_from_string_smartest(self):
+        problems = """
+        2 / 3 + 4 / 5
+        1 / 2 * 3 / 4
+        1 / 2 div 1 / 2
+        1 / 4 + 1 / 2
+        1 / 2 * 2 / 4
+        1 / 2 div 4 / 2"""
+        print("\nTesting a bunch of problems...")
+        for l in problems.strip().splitlines():
+            l = l.strip() # Remove trailing spaces
+            print(f"Testing from_string({l}), output ought to be: {self.output(l)}")
+            self.assertEqualC(str(from_string(l))) # Actually perform the test.
+
+class Fractions_Basics(UTestCase):
+    def test_addition(self):
+        f1 = Fraction(1, 2)  # Represents 1/2
+        f2 = Fraction(3, 5)  # Represents 3/5
+        self.assertEqualC(str(f1 + f2))
+
+    def test_multiplication(self):
+        f1 = Fraction(1, 2)  # Represents 1/2
+        f2 = Fraction(3, 5)  # Represents 3/5
+        self.assertEqualC(str(f1 * f2))
+
+    def test_division(self):
+        f1 = Fraction(1, 2)  # Represents 1/2
+        f2 = Fraction(3, 5)  # Represents 3/5
+        self.assertEqualC(str(f1 / f2))
+
+
+import cpp_course
+class Week6(Report):
+    title = "02393 Programming in C++: Problem set 6"
+    pack_imports = [cpp_course]
+    questions = [(Fractions_from_string, 10), (Fractions_Basics, 10)]
+
+if __name__ == "__main__":
+    from unitgrade import evaluate_report_student
+    evaluate_report_student(Week6())
diff --git a/examples/presentation/students/cpp_course/tests_ex6_grade.py b/examples/presentation/students/cpp_course/tests_ex6_grade.py
new file mode 100644
index 0000000000000000000000000000000000000000..7c7e2a4862eeeb9ff895be658668664128d8b954
--- /dev/null
+++ b/examples/presentation/students/cpp_course/tests_ex6_grade.py
@@ -0,0 +1,4 @@
+# cpp_course/tests_ex6.py
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('QlpoOTFBWSZTWa+0MfEAaBz/gH/2xFZ7/////+///v////5geD73h3Pq9ea8C+yqhZqvVZw1kApR2xOhhKtnuYR3XcKg2yA52DEjdfPvDXTz6Db73jqKVpvdzoLZ6AB1X03t92w9vpPZWjss9O7l3gN17d6H32SPVPdW7zLHd6Uvu9bu7Lsy7re6w7tuH0oO3Xreve491aU+8+b07WSHG9dScMVqQneOavb164IdsnvsLvTcN72rvvoBQoAO9uh7wLr7hl8u+b77cNk+33bsO4dvvdbu49ttZpq103j245b2++09WVStb3PL3vcDhzpvu92s9h1u99mlePJiamB9bujXIjbQtt9u99zXzz3x5zPu+PvZ3vty5vuZ1ggrnfHTqTz7PXGKHrL191gdO1Pe74HXxE224GHe+6973efWl9VrU0rp65L3ubtb5nO++EpoggAmgECaaAE1PTRT000yU/VPUyeptTIfoobU0NAGmnlNBKaBBEEEGpggRpk0o9NNT1HqP1IaPKG1DaQAaAAABKYkJGhNFMnqGIzUp+TKI3qE2TUB6mg/VAAGg0Bo09TQMEmkiIgJppMU2k2jU0NRvSU9Tanqepp6j9UPUaPUxB6anqNBoAB6TQRJECBMQaAmhMJkMjRNTZTyU8aQPUm1NNqaeaoM1GgaBhJqQhAI000JT8QKn+pPSNNqn5NJPTSGnqHqZDQNGQAD1BoDoV/aRX1hFFQntpR+NiRinuiAAH1wYEFCQkpJ8FFiqi/Tf6r78LqoWmvr/HIUv+EOj+xX/zv/jt7smx9f+j/vFYxMXP65z1vq9G/5IWK10YXvdRUkKlXb/lOHPH+qsXexrltrlMVzyrcVCMqR1Fie9DVtXmHYr1vwscd6xIKa+n8OxjnnhKFu2hLgi/FNXv2sLUVoytIsh8ESQ5AnJ2E5nLHnB/E/QSnH2/35YAuLs+nCIi1uNv4ypulTOsvDJDAq+/cbgBFTeQURQe0UE9rEWQJBJEkCEGQVkWJAD5yFRFkQRX60lggAFv82FACBEgqBIqiYYRYbDG0VCVs5VpJra7kxGS/o6L5OCuk9NprgdybSdtIFSgVYJBVlkaKqCin9xhYMRUBVIKggIqsBbVRI/Z1n6eGp3Bbp1z8nYK59T8n5b660q4s2BN00OrQIlDVqbZq+xxaXEbOhobxvd7Hb35m6ytEdQbBDEhjXJwuWLxbbk5unhmYX2gks+fWYhF8OidfSPmmKD5T0vrteeO20umhIiaKI33vYuxCITJG6jzlFsvPuP+5kVLBUZuhfp/lXC5hawz+Wcf1Yf41/XZTpw6e+WwiUaf4StyxmHRsVRv6HxSP/cmCX7M4/cUv6Wo37YYyhMdiPcn5/H2TPT4++i/i7eIjEZjHA7C9z6Kd0H0wnEmP8K6ytnnZw/q+D+fnX2tk0xGNz4lAcvEOj52QYzlZbH8sIgTP8rsLrVIzd6s4fNzBI83ERNrwkHt9QmjH42tQyDFHey2eGjrSmPzM3BwSZlVROP0fcb+ZV6++s08PY2z24L+f+U2tmBbVgRGlJI9xDXV6a63xtoJRbcPzHH3Efo93pHwOvb2Dy0fzejy0n/B3aTVebed5/CGebP4MCZej6q6en4VIt/jd692c49Y8xz5zMCRNreA8l5N6WgIkpxLlKy17ly/hccuDX7RGAXqjvdV2zDedsWg8kwYx/Riljvk21yLJgtytmtWnfiU0m3nxf4lxELf9HZafRXffpoU13j88N0E83KmPHu//T1kZ7VqlIeIl6/Xz351HfM1j3T59CrvL55a7h7+Gct9ZSbHDgo2J6Za764ZGhHdvnne80WolZG7m8HW/ZfF+NG8+H2y6K5+OTFKvjajHjVkLmKifW5PkOHvJ8/MspHc09+mkX5dPVWitdoJz2OMUa7ce3hqMMPuGhjrp0b4gjsj17mFtI2/OojKF3eMGrJmTC5lOTTP6W1+b1D8Lv6n6S2koTu+FcbSXq+cupYmq+M8ExPkiOx5FiY1WKZS8RXS4AvO0eQ/qF9PgOup3ZnqhARMzsnbxMwMi+0KzGhyENEDJoE1uNJllHSipOGqrCBl+1F2VvuSNpfZr4cEwgEnfLYWjiwSoXwxj8+QHMshFITfIrmZ6ZwCEl01HAcTkiUBidNDsh0hpQkMlZtuC3Z3kuZGVfnqvAyFrD0b8GUug6LNrIRIUK2eNXe5msm4v0pBQRERVBNGgfenB6yteMt8tA0u7nfTmR4xrgNCWm4sKCxpUtebYu1QH30H354yd/vXUhZYyLA8kOab2E93u28uikTkZHJIcezfZ9F5aMSnQdFyfSVsqDam6NsMLiHURoF8oRj1+U+6Uo2flxmutucqQqNZNWNcNj1VmB8u1fN1s7s2+yOGxgg0QIfkgZyuhBxusYfrdSf7qhBLw0V8zMLnH1sCD6queojhYSNLPnMkImL+IOPrIvwYmzj5tqTEpqe6+AnJn/kcngqcRMwigj7yA0oXowTZQMIZpmQ3CS+uUrClDppiuTYTGWV2dVc+VD4XQbU1wvSfEVrYJ91PM90ZM1udtrnZi/Pb6dygexXrGICw9xWFy72rDGe1BiDqIwK1L92r5V0i8hZXhaYGBuJ4S1sJae26R77t2WN3tbO4mzCY4HIXp3D07eElLw0deK3tMnZ4q7aQ469WfM3qIXXpPSn2z8c/QRhNB8skmQ299Jc1vU6N1JFIz91LJOISJZXRCapyTm/lOLDELjqq6zmqFXOmBSZjN/3q49lPkXVvJD89gglKwk/TpGUq5WhrQMttcsSSZ5TuEby/1OWENLpjHE/5YDlZcJRvxpq8gV+6npNJm/dmWEr7XuhyzCXrxdvwXeXf23ZNPHnsKwEdPBtcUYRqMXFu43NTm0/z5/2KCFb7h285u/mHgSLy4bcayxZs5rmEGVjEiL0HeWVDJG02lVuMYxwLnE3gcS6LyM7b1LJoPmmeVxZYztBzd2EzWnsl+m8YM6S1LLSl5hpppwmV9PCNxaXC31YtLCr6OYMO9xgfowmzViMmRywO2KPWS1CUnvPaQ2E5EOJrHONWDt8Z7o82b5WtY9X8czqcCrjtDl7LLnsfpN/GJgqUVpcaKjTeXEz157oPw2Mi0yyW7HH+ksg58h+o4yj2zWZrRv2V0EhIWfVpF2ltGmzYoeySaoLqWaZ9G0NJq7gYl2FesZFSJ03YlheafLE0RjgkgBCQgyTV1VpdSTIpUtfHk1qCKXT5+a2CnXjWyQ4cTdX1z1NO90t+pULnVseZ7rw3J0V1eHd2VFE2XbV847vNXz4zmUqpijFGJCZqB4eCtJxUTFm+A49Gkxi40Eow/lNGaPfFysW6eJA+j/GUk3SlaElOMcH06UKMXnAfYv8YOVuZu82pl1axxb4w+UiZTSwp90pFN2t3jJGZpNbTLfta8qff260NBzQMxfUZk8bOW0jMua1MtL5GG234G33LRyK8CunXnBfpU9s450Q7Y+YhqbuEjqU1Qa3jRLnOGdj45DsdenTnG1MzEzRMH5L4NZPoBGeDBPxRSAhEZxM0rarf9aSSZ9831792s25t4IDrw2ZJRAIEky3BJ5g6CWwjzor5I+rR68Xl3RqDTDrLdvitIOOl3qaM6sbOycZLPV9Ob0zOezSMw7oH/L92dJ3fg/LfAs6jSb7Ew6iv57dEs2sXOA18Fl+9sznHvPA1g7rzIZ/HKePXdppWZu9uGhXR/g8rbNn0jsMTNtBSMn78r9LJyrm2taM/xmmRQkTDRGRjN42Ol5gVexVlpaZZ06yLvd027cUjW23QH6LOZxN5Em6smbKMy12/Nc4xSxfWVf7cHyqFb+XIRbNp0lEWPNTbrWf2ZlllOtCrrdrk4Z6ctjZo6YWfSsAzcp2I810eJoscqj8CbLsshh3Lb8V1QvGrkkcQhA6AQqathfXse0sc4Jty71YiLaMbNrPZm1XbPXLtwz73yjiYFTbLfkzT3o+L/Ax3i1ZgxirkKv1jlUU7t44o8l5YXD7IrhDS7saXjjMmoUO4MT5drtfyu9h7tEFHzN5zQvI+qCHXCtDSFcFQIlF5c6vvH8BfPFa4b40eqSt2YDQd9ciYN42Y2bJXlDnRaFHjnPXeOgiQh8a83NzyVDHcH9pH8Kwmm4waO5ATSj81Ip7qSiIg2yjodJggqi21ko3+updm9xTSI222gLrAmb6xKeEaL1hNDdrhaEBPAxHXfnFWbbAzJNjuYe5pyLpTLQyQWxmeByZCELGz7cctwuCBZ9c9ibvqH8Bbbu+I6tRDN3PLVjlHfrunzDbSe0vS2J9aweN0zOloHZncb1IKv2OObONEBXgoItuxAWaLjspxymnah2JKPRJM1WcUPx3s1sbq/H5Drtp5IzK93c/gQQXjizznO3fQdKjg6flfriscBXbdhsaWAk7I2LR5Zl4bSe6TV3bzcZlmrmjWlWlVS3DqZN7zC1tYNNCmW2VhLDrBrvxC0LtLiukiTBvR+Yx9prqbZPeOMSYmmRHGI5ChUdyDtXX2Xi6tg+dnVPETTE9Zrk0aHSddfLTBz35ivDxR4obFZRJCl0ce9SrFVjwRNTu7uvLZNVPpqPNaUER409975gyQeF+9pOVz1D2LIjItoEieVVNyk3zK2y0w2vb5ltxO3VziZvQl1xqWYvWHHpM3TKIyd2Lk7HbaHGBYHW7WdJCNrLc7W4zNrre0xwGs0ua8kcM8MSc67a46wtMS9BbOYZMpsmGQXbjffA7qcTzJv7FfOnKAlhpiSIQujtNBYQhHj5SbMItNbyLJLqho5E53iNcBkRxk9jlL351Ge8Pq9HI60cOWoWtfr2PeWWiMSKRxVyaeu25ec+rjyr3T0N5M5KNV2vNzsfkFAW+uGrF1hwdOEwUZxR9pvhqMU7a79ux19V7vtntXst25NBcJp10Hiq/NilAl4RB5T4tgvMiZDW3q9ldS3u/KLIQw4dILhGNo21YwGG1yJ6nceEQdlh59XbRltZxJPR3l97uAmaCb+NlIg5Y8zB38u4ft+UsjRryIsG9cRpB1ONw+BGwYotvueiwpCKTRvNq3vbbD8NHsrjF+DTxNtWsgx95ThBhO2u+J+SbTUU52MHdTXgjvvnRoxfRk1MvUIwOeT5wyvyfknR59ZnfhozyMnTdDFH1D+5a6uA7PpKywmNzPomX83qgvOsQgttatP06y5mdrZNq561vq7Cv8Ic59TOzjtci6yFgXuYG6VGsljj0zi22j0Umxd89Kx/e7Z0llLdJErhPuNNzFr5N1PGhZg9A6yxww72g1FWzAzLZE+BxKhMQgICjOYOK+vAUNayPzHA9xiepyZ2Gw9LfgZMZTYDhwl+C3qniw35/0SL7PKu3d4V3cNoiib+f3Hw0cBy8ghQm7gR+j4jtMQhEywGqfU5yvEemuOFmhJrpGyOhfNMMmf/P+0Wz1UafA0Ho0cKgicV/NZR51a+nktGK0GxSnwtnYFLZCsRCLJrvynjOShM6euz4vS/Rf1Zim73njjkWu+zybd57DTXNOzj2n0H6iLra5f8Xsng32398fCeSw13bpTlv39/CRijwUWUvorZfjvt0pNU2+n0XRjdZjpdyNIwlO26pvMDApMywvVllbFXX3V1xpblW+6PTbwteU7apkLBaT0gs+B8gQ59qb2TMIbzocOAYYM2UzujyFPoO3R/p5Tm+dPp8ieEuGYa8ChB2frn6tNrvt7u/2XGeuWN+mGyief07h7Z054d9cc+T7Y8Cx2aj3vvXtPcL3VSh67j6exRkKbiaBko9bbr0Z9im5CpESFpQ5GoBkQUqPSwbZMQ/y/y2TW/1GS5ycmppJmWakVSlCC7J2dHpTemHzTHFHFEJuC1XjX3KLKHGVf06cd2vxe8uVi5/3b/lI79jPuzyzTO6OZDOaaOEEOQKAQ0v3DLBENOjKMbsoGCaaOiRKo4jomCft8oKfrQ+ALlWQwM5xk+txXaaX9lhpdcZJri3Lu7+Oa28bqM0rFAWcSiUovn2csWFCCf9rGjbYeBNtXnVYKu/qE0H6ryErOHUMYKpGJVr66xqYi7dOyd02lDjlYP7peDKSWExVx2mW6PwoxodDGypeYWrsDZgECP/Oy0TkB6Cj3nk/pcSxgUn3mJS/f6Pl8v9H9yHl2+0mHy/JfFU54BWBvsLkQkVKtr/AtF5Cbcz71/jNRy93xakRVVRWMDoQh2dnXqle3jhUTzGUZFiqqyTfNgHKHPO8Qzx8nMDQofhVFIKH1xkK9isKzG2lRtlRtjEKoklVA7XGYwYgFYjCv9VphmZIKGuh/X7DMaBnSbCzE1BaxUK+T8H6SZmCuEXHhQGARDbCIqKREk0PjaC6jpnHkN0lYuDrGeJKowqZ041KIY93d3rnjDF9et7pS4bdv1Z1uG6luzpctbLqlZUqizLeh7NE0yLHrE7Ybd5SPI2x5/Qw8+bicVvHUwu++qpUzFbeObilusQWYfGHe05bU5Ur+zcsseUfgh0WIWEatTLvuu2JKl9Yicw6SmnfHwaj8GKFWfhIUNY/gh2kfZHLK0+6vCLK5meA4jSYE2Q1pmEyM/qPcjDc+OP8i1ovU/URJ0Ec4wbMj4ard76WWhJW8ck54qt7s831bT20CKPOZvlDIqd9f2lgUW5tF4Q2W+ae5l6dZc6GZWlIWLwNuR4hYh3mQ3Du7bkHT5M3oes+Z8C4JM00Do0abg7uQThoHgEZhhOw3hy+rehLbDTUm+JyGjwkTnKJeyc2df0zjZ31TjdO8p7ooW8HoV98TxuH2dFrhVjU17DQtrdYYG6RYY5ibg2xHy6qj6zQxpQHRoFy0ESVYdpp7shLEwZ1IU9DOxE4S03kts2o8teQvYSMCOx8xn2txxl3ZJ+utNJSavYohFRHCuc6hvQde5Diym/lvt8pKOU644fgUkpzcWXMXLUx0lvjbjX2e85tr8fWm+Luya5rNDkRmJQT9dOfVsTk4VOco07DeG9YbXYFrVJ25KhQHIwrGdSk9CB8l0sSeSgRB6EV6C9+m13uiR02n0feOSyMntqZ/r/L6LZm7KzTOZSjv+Scq5ZV43p+MnJa1i936Ly9jlcfN4yIyXmiIwSjNcs8lROSHIK+ETmKcKP3LlZKz8H6PZgtJdZumF+JOqTcm/pZ/ho/JbVy75UfdBPKcR+lon1zjpgysfDjcPRxpm9hL+pUajDhy93T18zn1puaOEPVZddeJlju5PDpWIdMFEfWIyWbrdsHjK4n4rxXHCeA/d3fLmw5LNl07LNmwJ70Q8sCRYU5SO0aF1XFe0UQjkRC4l+dqDSnC5Wk6H1MBcqzzSfJ5oxXuVt84SFRwe/DjjLaRfpjhdhe9dDukahyDbRai37mo6rCUHTDBfr7euPJraonTGI7iBy26X18J99z2McWE3E4cobjs5AoLXqgibsW5cbTTCQqFLHiBTR4W+isj1p+r7avbhETvHvh74NRwpXuqiekUcVSmX10+qZFyU7us1PVTYjSY5OzY5CoKzKrumtXX4OmXL5u0amYKNknI4XjfTfW9uJvlmW8TyZzNLTuS2nqUvMsUN9mdjbJrrydlt7MggydK6+SLP9PjzrS6u+Wa0z55SdEpYu9k3/ui85WUXSTpeh7KySVXNuVDhlSySrl4PE1iY8fKfbmb6FLAnfUrSPfT8j4vDs5nr7r8VZaU/bKCJTgcsxulWfCjlOzGA7trukjtwZ1vXr5RcSSM6HjnhTWsuCcVkucm3915Bb2e+8vnQnlfKzbz61klZnV1DxWXXweRufGruljfIuWFKLK2dOCneua6eamcq9bct3fTkV2qYKFqUvhyVVFboh7rNJ+Ntsr/QaXUv5Xb4t3U9mtfZKprJ2Bxa+zCJndOKzeFOKwNhLlwkeKsEYXrwsO6IE/3XPFfU/EVHHeTFqfTrXpl6d0hax8HZOb6CLvLmuG+Jg9GqsimsfJeUXTNLtfhDB8UqRK6UP4PJRivKWuCtzftjGCaBRTlXDtqeNMkWJSh3SEgivb2wUPb0bjw40vzYludhoJbz7CQN8vfZU42oO4TqzJrRRxCUnD7VoE6GTWMBYaCZhIQgM8pxu81Iml6CQ4U4y56er6O9g/mvYbpQR/TkzYokJ0BhxdMyZuzaJyohnpZ6LN9XlV64x23vUVKDkC8IayykD4VJJJjyv5tYrxNvku3lZhzmz3ro3/TWzF8xy7/48pbW6nDsb3osT7X1Zt6ulFdMu7yV98+Svt+MNOjzbFMr46Iie1QJS2qU6k94U9V4V3GeZPpZXzW2aTfJsEcMykIxss5KVkHx0sJVxkohleSZpyn6/duN1NLOcOkyvTp1oiC948KsVkHUlZC7CNo0JvMHHYWnHv4YE0Y5PAmew7NPChfa+a5WQdZe6LcKY4Y2FPpSsOVic1Iy00sjabbwdy+18a2KGM6WGQSzyh6UeZKDYsbCkqcMspEuywL25Y5zb4vRhrHTWHLYMCemtSpesrnJaQQUJRDmrQS0Qq2VIJNk4QmTMRMdsDC6Fa4jXpZgu3uqYWDnHXb12g622yetHx3Vv9/hk0OvOz4Nxo1bj+voczWtef0dVXdPrZaYZ48/sO1BW3z7nvvHY7kXmGsTvnBtv1wWHYze/Wd75IsvBJbtizEPs8IaEEDvz87+WmDx6Yae/EgOvOy0kJ+wo0m49Ed98i1GtXC5DQi5uzPPnMKzx6eHhi7Dj0WeXqT1MRkf4UbT2XCjWUQF/tZL88mN9G8UMkgvFwm1vvvPqq3FEG6/2nMuA58rLAsR30GxL/EtsN9gXiHpidfmsDFztV1XiLyBxxO732fRX1k4+yrxnKFQ7yupHEL7oaSqIMKfqwmbarsrfsiSFmeyVahweSrip58L6+KuJo3+57EUQzlbvXuPkc35WNHsb3+0SE6Pl8gyPadM8w8hPNCeaTCOBObPVPFDnV2Z6m8C32XPNn083+Z6fE/blqj4aJMLcPmTGOmC5MXO40umzJtNbfZWlHv80r7qF7Sx8cYwvHw82e+UzllbLymkmR7k7CiqoSnidqPcT490OJm/jxb8faybk3o3l1TkOjhrdnw64ho0pWo1It+zHEbDVmsJO45tBMZK61SGhN27OjKLriFm2Ti2Qm07F4McGaKYen0zk5AM9BOk8wUot6IuivJMF/eak8AzvibIoQiPTcrYYxg4SoxjKwnMJljheVr/u5ejMrkzAj8gQNkxOc4FHftzLkyCiVQkQ4D3xXsM5me9Lm3O4LRMHNOE6H2UJCG49onmKoYUI5F8EDcFoxIMGCp+3q3FAUZCBHk9Y5Ne9m4yRpU90miM3b4uop4MolkHwZKO9gXDvOAVoGUxnSgih69RqDwyMiM6q65uDZAkxAeOzJQQpOx0O7CC0JMfkm2WZLcCTx0OaSlA6HXiUHGP7De1N7CDucsvC6y0Osk0WU1BsZSSXqrp7p2qjJMCtCn1Od/Me9kILH7OUWppQ54dMIOULzwzMNc1+YNXv6dQa5fg+GX9nJs3OuUCQhVKQcOY7VOTFYZFB255sA5aplZiiXgTOzt81sZEa1cy92SwhVTeODltmWQIg3E3jCwTiN+lCD4mbMHA7wNTedugTtPpGNmwD6Gr3ndsApg4Ps1uBQMCQcYGkD4z7WtJnv0+QXWlgQdQ2CA/EPOXcgvG+tua/E4y+32UP612T/ck84ol9PrS1t/hRqzwXOMgwNOzbt41fpfR9tgogYsJv2a5Ym+LERxS0wU/Jahd/9cxMtXBzDLAMnZU0GMwPwSmwMpajvytIyIRzRuXzcAxrFOnph0N4J+uYc5QGv7iplAP0RkRoxMRFjHdvPIelPw9nku3+gKCgJU9zU31swlFT4PS+yPMVrPSQXUPpceP1aztU2kki+kQ9zboz6cmdN+1ZAYy2m7aCUZ9DZh54ZAFWL7g5o6UnZps3O1u0igcq1lvrwd8uO+LIpDLgdCwhkZCHSGTQzBwL2sOQaDXf45Oec7H3N6Ce7h2R9MyuaYtU5e38TpeMddGyeNXulVw1abLOQY8enyOuapbvFpj4GF/R6970wwfEKdToFn1Ng9Lm6Ot3B5jaT3OknTtJ2zsDuvDEYgxTyLQ2njLbnEJj3UxVVVVXx0QoMIeibLOoUO1cgvbs06syJIb6dp72q6vL5p5yq4vnejMLQeh6A7jnuZbxuFjEDXNJjNjuXVOlouxtgk3fnjngn7eva4Kua+Zzt2vUToTzibRlPE4xd4mamiCVQ4rRlvuqJ1EM8Y2sGqTtSGtjYhChx0hrwS8tWzOX1STu76dMkhaWpq5tkJFVSe9VNs8PUzh4fFTBcyh6mxRmLUamMVeLKkYmbTzEup0o0tRiBNeWaENT5xTCoB8OQiHZMzVGo1DEq8UQmQ2nYZxmrVkarOs4rQoelRGrellYrLw2siMwlq8FTGrzrKDWdZx2dPUE5w1BsEj1NGxMh0dVnvyWmw3JJIqKqdwMKagGm0jgJ4tUVkwC9rSYBzaYIGIDgxWgNyY0CvMxu4Xz1xtvNJNrB1xS505w6B0vNaBUVizW0iqPh2d2tPDbQqRUagUpQfCwsjBkhGAw5MlLevFu0a56HTqG37nGAqXZlpNfONCTm5miz4ZZvwi/CIdsmvw1lXIpe+U6wUYZYjmc9m1OqxEM2WWtxGnM3h/HOJd6TxzF1OtHLRYJjakSe5zTpLczN5gi0mRiLeMRgnFb2+qeltmreBsG9NlhoyHtNzw9xRbwavZJWATUlfC17zLWzZ3P4+KXPHMa4jrvrhpv3tWDpbNHAWDBygj68IsXw2qmQOIPGyGsM30PnDYikxCY5G2qrHVzb1mtoMzS13NuMJItNo7pqjS1/Pyd5DKGE1TSSX+xyzwynDrpmo1pmB0A3g/UrQwgaEEJoa+49dIDsq2BRTtEChIhUZAycXJcHGIRgWClzmXRr1dWS55Lq4DnqcwiMuJS0JqJazWObDU5i4jhmgI6oyyNHHQiJYWxttTM7UCRu2NtDShn7HjzxVbbYakGrh+9txAxhZh+es9Gtm4WcFshtjJ+HCtNFXVnMDZb9yZg9uDX4ZA7CpDzYbb3Zh3EiE7WTxmVDEsRI4ejlNHs8OlMRWpqikLbOiHQKl4quds1TzAeHRa1E7mcPmZQrtJqJUFL3fKHHWeMgcWTqNHDDhwHblq7U1jNjDs01zzI0uzjI422eP2G09b8NxtlL1yDoBcxwqJEyZmaU3HDHfY32eQXfvX6Eket/2R+m6Xb9z2o/8/qf524Kkk9V+iPui4p+EDYeWF9cuXxqz7qpHWUfLC0h3FE+6yfgfj6vSfdT3/ZsY/nnhw4xe2ekMfzigQ1IlBo5OadxJ9RN3aym8/7h/5DT8w+mDkJ5zTY/2R54vGYwTug2g7YtLsWOD/Jw96PhjPwn0yOafJAOm+SAJUIEqiK+/vTO3WYU02A82SpPlSHZlVcT2Taa6K41SRpbZsPRfQnoy+SFidXtyZkgNI5ePShf0Mz0TC+mIc0u0xDKGIaTy4hGGltKelE8VGVbW/dfjQTQ72J1l/3Q6Vb7flnaM1j7JiZ++b9JjkU+p+8jqs4x+RT/Fg8PDV815ZfrVS+KC41ias5mD3z4/cj6fqBjb2R7+jdcK7mfYH/i/Fiwiwj/fpFrIskqv+EpYH87o1YSGgNFhFkgCgFZA0ihCoChBYONkkWEhUFDGBjIoKQhkRD+qIBcl71KwCyNojIgeU1bA9HpkZE3er9KZdkcQQ3texmjOdNImLOngfHH06WeO2OJmkGYw2HS4zsHwWkh5JxOjyREzdHlGMRN6w9FuRTy11IokiX+9eBeMGLyPmM5MQqlFxkcRDyTGvOp1i4Uy8TLf3uzn61xjh423ImOOMXiCrE64hP/QZhrlYWccDI8OfltYmxGqr1IINddJ6zifn7dJ1lfRw3IadBtFSeGScpRz+3By2DWDNbgldTR7otKvD+EjNCQ3Fmz63dlVHEYocn3jv30ReS71iPML5Nmi2L1MdpIjxDtANRyxfgyZrn6DAxiJRb0sU2a9npmUjkZF8bPmqtVeX7sHXz6GxnxiXfyfo/8Hw+x/J/z/afbz6gNhQUcxkOOLKx+k4qjyfllPWS3zilL/F+2wODpPznAdHfVN2h5A1UclWDPhIvYEkhrysPbWIX2amxik+/+klTmzqmc1WDZD4fb+8O+1VSCqvll0ENKO4E2zDg40N7Tt0PBxzsPh9zbQH4JLf/HGTVawOl1x9vj5BN+RhQw8nRrtBmhgRRuHx0GyyKUJ3HyHUWaKK/vlwgHjJ1u81/4B/HhkZczuPyCXVt7tIJjo9/aEQgXLA8pIIDuNfAEmJ1TJMhI8TcQR5P5mgfmAcdBOcfa2f8g9Uplh+Vp0GspZdNCE6w855n1pgmShMoSaxIZlFHlJknP1yHMMBJ64KjARIjAQgFvJxuR5bTMZ4jH4dPi3lzYhxzulTEsb9av5NxCBm3BIf+LL0pJjWRadm/oKjnn6pvRvNpTpyBNmybJAfunXecQS3p3FeDDjDAsxPT6vMEd3OG93mj4xPmhyAhtDrapIHH47Fs2Rnn9a63A+fDacx8RUynjhsv1/c38jRkCRUoEPyLYTIUhi3Ohq3yDrAOkYmts4soIhUsfysIUZpomj41dhcuKp8oV2lokkSTwTz+iULcfO2qlVVmcBfRAPgYZJ30vuCywUO4/EZmvoIYofbgUM7W6ftHZxc2RC/XRtLFEN55gamnbizemv1sgiiv1SV928Tb/rTK4StMYG3Y6+zWjyX7V5+QVKHlELDl1AknIROB7wtWysfUX56IqpvrfDR2zsowRZ/amNyZ/jPY3qZou0+kn/nPcfYt+j/s7sJ9lKr9iSTuO8g0XqRkIIX77bbZR3UgmYg7i0yH7HnfJO9OUojl87JmtOhtDn1SvZH8JDt/Xezc0B0/ox5nL0d+sEr8ES2Z+y8MTFxP4ND/i4X8Cnr3Z60yfovbAZ6bnUO24sHNxJyx+7cMH+UEGghhxL5tGMEDzQ6TC6mz6sDWAz937ilp4/YzIDGjUqijXoWrn2+QZCWKBkBoP4wPGd9D3pzivOuqcmoeENsguKnwlJfveX7U1LSVnp8JE4zXH4MOTSK7SizvVJOGAYzPC9zgxQEpJifi9LJ8nH0pXw/NzVn8aMTgFp+Puu7zU2vOXunHhyx1Z39+TN14Qb1EeEdIexcZmJhUnRK/li7k6eGE/M0kg5RaHp/C7hfjWOrk9MzUkcPcnMRRdpbxiMXjdjZUoahKB9eEwZy97xL2lEOchnQzC+1hmuKGL5mZUSbEu39H+f4h+HTAZduvNEy3t9P5umb1ie0OkKFbm1NpqTXDwjHg4jydnRNPzDHRkbU2IdNvzj5S8cYnSPv4iaqLi4JV627E1r4XV+X2ThrXS9YTUG+QsweTURP9B+VmfF47IkrooDK30eMrm+cPI6tloiGwgjrTQmSEy6p6qfhLdeuPREiDOanovnvkXWcJoXI+kWp0qhz4OYWEPI9cwQ03HHaobEwK5MxNT7mU+7BeOcxj25xLq9ZmrxOGE+Kl7cl6y+6Sp3w+KrtDqx+U6NePuIkFQ+oSwoW1ahfZ67sScxJQWQR9ZnE3leiR809cMbHFhfVVbjDy64yInhOtly9XXdPju838MJXRjSOLfp4s+G2ixcTjK+IlhXTvR2bp838Nx8OheiRGRer3nFwdZjoSUfPTK2VNVhCnjkrmvdPFbzgakfFrRdLWPv7dG18U00V28as267aku+hJQ7bU7McJ8y2RnbdHKyYuHhiVu073bJHKECF52ij3t1Z1ezVRIz5fkyHYyaRRibW0Sy/UWbdorhBU+6PWffsrVc4yonq5fLj8GnIjF5zw1rrxZkfRSkEYsxqLyOYVF7E6EKqHaWTjQjoh0jDOMFJb7fLO/GgTh8bBxWOCVOBRTJ1ZdY7d33ILBRGszU66FEhwQki2v2D13PhEmDRB8UGUbFIflSeyVSZ171zz4V4V9lfhXepSR8eY09UfwLCJR5JnFt8wI/e/bfbmbh2+1DfN1n3yFolC4iP1eXMHfHfOatBldM4stZY/U94xK8RwXB9iqYz4lb32UCfYTmCAxve5PW6+dDw5Oe0hWnpQ371vsyh7yIx1f1LHiYccfJNLg71fhiKjxrODwgd6LtiGh17EDRxTVhzN7disxqIrzdmpJ2kmY9CGLvM9OKN74zaVVMniqio+t/JP+yvkpJx9cZW15w9L7MxV1PMV6t1tFWQDsrvZ7Mu7fzU62OV181K2WFL2tm0jlMs4rvhjt9Eo8YexVOx6Xyifmw/LK15z0HM92twUoxFDfpLv5zisHlXB244xeSqB2lRA7OJzxjX014nfDXDhrzdJt6/L7qtgiRhHEg9fE361iy97EWdOsH9t218q3deXPnZrz52EjSd8Qh90UeMFzoVCqZBu7XaDsdPB9L+q8i1hPintOJQ9hFHEyrSJmxS8/t/6fRZLxCZMNzFWB9jsPxzafA/HqnW4iZzjEJsZwiKqGpH218XttfdbGZA9rf0FBcwgpkmJGAyEzUuSc5mppGaZNofR+IIHegMfFPJKmfo9rQwGAyAOqRGSr0f3nrO8neJ8p8xBgXCgDPEm2rgmAXDD1P6wzEfi1AYG8yf26akC7b4FPKYtAUyZrHa4hMVDFJUWWCloPocjQgGBoZJk5egyDsRDjUU00SRSQm0dA9gfqHm2Jn1mI6+40csk7TJYqCpt20SmSaB+EC0lkWTQ+IrjkGBj7hk2w8pvQkvWBds8y44JfUETA1n7T/jqnIjnzmlrbrl4alvQUFGMUiIzeHz1sIR2D9TzaUw4DHA2aih2dETADaUE7tlHOeRIdgdWq5vHfgSGthTTLHEecch6zEE4EIDoJJuk4Tf2Zi5hVRRGORt0nFbAyFBQfs6ySprNdG8LabVUU70LZZE3FTh7LwOrcZ2aKNjGwhSrQ9Wo8liB3h4mQcwZZGSdkrWjiBBgWSBaahLB2Gw6AwHEiLyDgQD0kALCGiwPlEgahzdbt1dgXtbEYW6Qs7xj27up3umg346kNTzXccWQrbodp3eZPRWpKf0FJT3/R19y9ptmnfy02bMWL5amOc7XJ5BsidQfaSgiWWakyH0hT70YdiCw9nMPaMJ7PrXTLXt7ZustldmRggrBRoxGAoieoDvAzO7zBgk1AdAQ1BpGlGHDsOzM2RTEpVvyBwoExFzuhkMKwTI4VADxQtLhXxlHeIZKKMOd/MsJjJ6gt/Bpfng5OyGkhNSpDhwLFuoqJRwSB5TcZWGIGQerXAKoofAh+wiMIMQSEFkVXoCaYP0lGIRSKQiKWMz1ftfW3jzQSgNy+5aH5LoN/o7Pps/JwPjN5AaPqqxwq5CwLFIsYgoQ6M+aqAemuEAmDJhEUGICROmF52GiFewzBBBE0yrtIqrAqAgMYWlWIX9ew3PSRVEBBeLUWH+ssJ0z7tSglUUgduSQMYHloOQDunZvgquyDJn1inu/5W4YfPksMgfvlkRDZ1YayTgKVimIXPYcPNJxKI5Y0hPNfq9feWxIlRxYWKyOsq02EJCOxKhdstyx2HWnWkQW434qDRxTqKnkI2GPUmKG5+souQBogSRSRYjGIQlKFCkOeYTwlFBkWMe8uSxpZN4O3FV+0gQjJ1RTyxTtdXIg6AmoLlBUTh1XGbtJuzoNQoTVzGaF4YAGpLPIElmFud4prROtDapeAu0T1k8DfPFYUbAl02FBwN9z74iCcjiHgflVAQPFlYkyYqxg9QmQA9/T+Uo/OF+5YYPQG8U/3hBTgMQiEiD2lsR1u8qUlRhHjAckyXdrhIJqMt4c5QneEAKYJZhjC81Lgq/NZ7s2O8Iwe5WzaqlSgiMKSITEQ7X+WFKPrMMneeAhGEFGMAUAZGBBANf2l9lbuQcIWQFX4RhYPT8+NcvRKA7XqZYRYB5g32DppYG3QSPEo04SmwMIKy6kupB52gPWex/NT0TCTJLOW2AgMhQ9mQxIUhiwYw1sDlNTm6mA95T9iXszRgoD0G+dCTAMJDH+XqzDtkOOdulHE8JSw9ExaZyhuUM3iQwwPmhiQyPKq40B6h0Et1fh2lESvqC52buvWRJUAvzB/QEXcofNAfVaQaqJwRLFjLr1+fxEup22cZwpNXL8B032FUVuGqI/UK2yRFlq7CLMQtcMbJAccZbzYH4Lf/Kn17aC/cfZ/OXc02PHIHY4Q0njbXNL7LJhUMRo2RNf6iHc3M/azMvvQsPpJ7ox0NlEGhST92BeXtPb8cNxRD2JWDO18iUgH6EmcVwJcAi7CG/u/yrpwB6vLcHtJiBsUdlEqCqQ3lrFiKRANBPVts+odDLkHgIYGIe/z187cfAdiieJ6TsMoC4AWAFa7pmKb2joTfPr7TQjOdxFSYIZ8Sj8+b8tjCFY5bsa0D+cgf4oh+l9S18cfapGcxx8U8B7aHiYHn+VnmNfI+1zAsD+myouVZKCMAVN2BrVCaZI/dkBoIgM6dVDtMNRmg1kwh0ZQUhxUYpHzhe846PRUtpk0MOPr+q/qQN/sy4p9UA6T6Q85iT54ikysKD3MtsmDJSUApk47pPAQMcExISEgpIX6U0KoHV7Oc8WzA2mpNvPUZMA6DaKoUvrsh7rp6NTjnzczyDjcsuchIx3UJTEhEYEQGWEcbB+UM+G9T98Gw7N3N8TOO/GiyCcLGXeNUck9BawEVBD5kofCqF3c2SD7T7oXOzd7bBGWzl6ZpTUsJKGl7vEJgHZPnvBBm6FOmUEO5+DgM6S44P8hkCUQHEffLEIxY4E4dlXIlzFUOVQSzdgcA/zDAPRc/j76yFhuGwO8LaU/H2WHaAD3HwX4BuMkz83wlpQ3hbCoxYRkVBChLJD7kpFkmQZQg8gTyPQEQzJhmkioHqLjY0ivaVugPFUNVyOz4EZsSswEPmNHPNYptuSqQPFktsQSMrWmcYa2w5wybaWaoYnHFhbQWGkym3CIw1hSZqmY0BMwK7edkoM2M3lGCEvu5qcWgDy5lFNN2GnEY4FoNKiNx3qVXjHH8loaLFd2zg61dP+tqpxgKyCJFpFN8JRwUpUWhV5mTT8jAsEJ+PvUgR+gpP4p9sbxXFz2VuA1UQaKgUO7iGUMi4lSDicbh0CGBjn1b7SGEAzAM3QTIM4Jg2lKXCDTQ6j5kuvk1vr7LHnj6N9sdUfHFzIlmASVR4h2qhqhV7hVw+3dWCfttiwoFhAXMIQ2DzvdCHYmE+DijMylGDkQ88oCQxNAiNQwGYA2SJWGOAYCFJSm+gx9zRjD6nU6OjykkPP8jxiJ6MmlRzVxRwxyKogrlbVG2VG2SNs+9oPsh8mRR3bs47Cg3ljADz7juItQSGId4LTbeGrnU6dD9hI3t0Z93J/yVVCxGEH2ia5dwXPN5VUrO7Vg2UUF8IFHeHvDYdc5nOUljIn8nnKH2EA7prCTrULV5IUPgaFiIY+GSus+kEM/4p+bqNcNXfzsdglw8QqhQELDFN5Fo6+yxoR8VVI+UmY4UZncQ6KaJXBsEcEZSk89vD8xgYJ+cT17DqWB10DJJpgkgNtOxbMFsc/i6fA93pFT6R+ndPH71jKVjfnxsvKoMCuM4o1KLalfslIyIMWqwbzdqaOD6AmkhFusYMHMcYezGIlBhEI3lxpMvSSBCOWfRne80sMnwRzHDDYsX5YhusfSKAWzLc8jjiKL4xje/pfBY7jvf4Oz6Z6bhG1rT9Eco2mTxxycuXyjkQbWVUcg5hty2QdDWZEk0K0CocRnUH7kH9Kwffi4+8V15gvuFC8Un6Tl+ncy4rYpxdsP07msFZNPySGEQJJtu4ny5jDbNRg56avg0Y0d00VfkQMcNrxjsdEZLykJoL5x2R0x4QxsOuyZEWbhmDjFbvpnYWcw428m6LI1nJzpEslaZe7Cdo2dA4htIY8ENgbfDjm21DQ47Zd0c4jrO4MCIenrqcdN07ZcswPkh/BbNwUHKEGMiwh2HZ90ECjGXO+Os4omQQHVjDeROPlY/Drjup7s3bywYrrvrA+WZ9ihbbX2TozZtQmWXpoDtCMF92+arNoBjawyCsuRRcRQe/G2bM2hyU8OTZBopOU2kUMtyz2ZggvA5AWTBZJSbDvi6ZBRIVa7SVjpvGZ5wQW9ITMuFI08US6aojV03GKz8k+dYfMwQShzwTM8A+0y/Ycc5u87m3Yd0OmRDumRSqXSTRMi0UlFpcxic8dOk2lRw87rjpraiR0YHfKjBlENF1qcYqELLkP7902VaDTm4YQhP2d8yq3PWdOD2GXfFjkD0ohsohik+KrQVNwCkti94JUAsou3Qn2oIlyIqB5cVkM1Ct3rWHgSc/mF2ZH7bcvt5xmHFj5NFePDZnGQ8zwTG+GckEKLJvKmWeYO/bdxdjFtYIambM+RswNoFY3gFmhMIEchqqTJgMwU2zIKN2YaB+qDxep+psvcJrbXgkGIz9ZSYuaPU9iHEnFGmhlHfR1zS+Hp42sk0c0wtO/F4SgSe1mXEyTND2oWUYqbn1yZUYTWkuDHyGYRHb2N4eNVpfCM35mybfLMIwRIOjxyxRChOjSMYcDQk1ta3OY1hm6scjhsPENaoHEdEQLoz8o4gmW1xNGBNiEKx6Qj4N0ytLvnGofVBC4w9I7qtJd7lbwkUTe3iM1uN3UEFPp9HMkKNPQ9Q+S1caxEb1hp9lLvVqs/l0Z1prmRGIFYwEgIgMW4WBODklJQaDcDFNkGBEo3OQ4A7HBoCDASEgBvCgjwNBzTINHUZglwcEuGZdBoLjYCwYNWCkO9hc2FDiOohApcwhoLcoNNYUF7QXvhUixHCKaaY/lNzcTBwgUa1cAyP9YQwPnIHICLxNTsFMQ4Cn/KIaWiRkIJCCgxOTJx/NghSCKkJ3mAdvYHdGHNqOCwW6hmz0mzvOTLWSe9HrVdZqtNi4IEHCHGGssREZTroxdMhbvAlJ9BT1GR1uTsxwartQsI49RxEjE5StDEDeQNeYTdegud71k2nPDvN4IB1wdIZjm7RzsSDueJSGAceJYtHMgnuw/msKcsNs2Iijf3Geb0cTX3m4gh/cEHRCZCf2xGQX3moHWB8Pp6zSPjHYayM5QlBIECCOHg8HkXs3Trigqw8edgj1OS9VAyTPkZkM0z33iFBwaVhQRhJRCoiWAVhJfXB6n4j9GKhlCfXsH6pUrpozDHMez+z0As2O5Q8qwzOXX8IUFHW9JhaC5bxoAwTlcsTWDCrhpoeoGx3VoTMLsJZIVxC/bGA253XILQRQ7CKiyCBRQ4bhAwHWPpDJcSJlvF3Xnd6Z8KbjuIOrtD8R2lGlSqU61RviBEqjQIZzgPQKl5HNhJ+eYRBzpGcLfFtryoAwY00BswEMQVmCsPeOCEYUSxycBAgsI7AA601PIII55FRwEJiiXYGpLWP26OmiytxAG4jzDGjoJsOsBneMRSIpDS5dE/g/hrol99sFKFisS31Ho7SgukoTYB/iRBNyqcGcWwXhXDq7MZfp6rnybcr3ZnNSh7UFkk6gKEYHc/UBn7iQoV23GtbZ8M30Mi0zsjZCDEJGrduVK0VDkU/0uTvTan3xQjL6BtGB2YwWNbDXMMnTrL4uMOzwONVpJODiNrKstOm4uOu9xMDno33MyBjOhuEokDqkNoCkRFgAnJGDVhPdFdwVUYisEIsVkiBBIA+HqsWhE2goY7FshYLtDV086yRIMYRIBvy6z+MSiI/V+3AyCYlBCJBQ841ZwNkdIBmREJRPHPQSGHziWAvixxliH8oixAEIsOAF8Meyj83jLntIAcFQOMBIzEMA+osB7uY5Q+8gUI6JuHnvhrG4ImDfvTbASbgI96Kt6wxBPlifAP5P/W+HsD4nZO37DdYcB8RQVhTzsSlJUrvVPiRYuBZKQ8Fdf+JSDIg/Oebrjyyt5ew+6B8p3J8bJrgQvglRGUUJUEYrVLR7LQxsEKhGkJrLJ4GN0yGkIKjBErRkAqiSpFApVKAolsKKDCAkYiKiRZba0Ch/zcLVhQYgiiYWkxmDDEsYU+jfEnEJQCEkH1qI/Eh/rE7ah0LmeDG5MNRAtipJtsIYRV4xAUtEQhAV14GK2QA8a8kqxdp++N39Cfob/ikYJTELDEpYEBIhAkQuoZGjVGrnLPCfhDnOIBUAYed/PTAieMiGtK6R/BPOltoug+EBFYgMhkh2gfANZX4K9uvte/zz47pvJJgQWOAe/w+RCEyfnfIuEOO/hwllBNXvOjzIgvDwJQieJdjFRuILJcBAg0geGL4AyQMNiJEYzq05NTDSSiCJGfacOFzInI4ltX9Q1GKsRWRItxNRMg2W45Rj0gzuZ0TtPOyit+2n1fx7M8cat3T+b8F4RlD2uevZ4jSaqhBkzIi27RRFsq6121TmCD2yHWeZDMePS6M/yfK9pRpAzm6sEbdhmQNDLu+flQ6p13veiI9eGsjqaKWaHqmsOsmzBk+29Ik/L+c+B9R4k+EEyl/C1MtIHgISimFJWBMYSUjEBgoqIeIwPvn1nMo+QagcIYHJkwKNkZJsOht1rKUyDBg8MevdZh3yQOqOAuIQSMUWFF3qlKnjb89c9dYb9JkHkQ17gtJzYYmjEjCr6biJjQqJKUQrMYe7s4OD0kPM6vo7c2Fl4oZDyGWMB1W22EKaBnAknhxq07yROKFFIMBIMScC28KJCbjBfUbUEIIyKkIEL0ia7GfU+Tns2hnVrL6mJNaCzCtQBS2jBJLEkX1QahAHS0GeQ2YMgIUs7e6ck3DuTgIGurKNGzYaZRAZ2Mo1fMh9bA+CBZcE1EsTtIMikJthUVQLGoigNWICiMkFhUKMIjJWjFoKEntBACmKAatX9msf34JIwgnqLm4DYBiM0h3oMDmsYBmKJZS1gyd8DTA783uPjPAL3XPpnRHUl8AbHb2z02DJJw6+/01LvEcZX6Ms7E4w2xEURRBFIxiIoxFZEhNpfntBig4XoRLKn6ZGQYKrtRDeJsYmJaQScOt7FbSR/m1dj9zGpIhKHeJY7C1gh5QufzeXs1hUbNpXrR/ZCtqkijjRv9lWINYTkeC/ctsMPgI6H3rpAiRA8h1dfR3YPZeykBYFzmUfLt4G2DMjlxYHzHEOj4OrPt8HDzfJPlF50aqyOOJxYS/TLIRVY1THn0txqxDSST16b0rqyY21i7SSxmtSi46Y/u60VjZXDEdDTElHna5EmNrOcS9MaWXwTPXTjYVvJRywqFaigUd28vXKmkwyC1lfZdxWGsjLIvDIe8CHmJD0RDoOIHwGwfHe4+5e1dH1X0DuNgnvDaRUsHvmKJ/AiJUFfRFsREAwhrCKtb/EXSZBexEkCRXj6DsDfgAJ/PPV9GBQGE2nuPUllV94wCQzzNliLg+TckGYHVpROhjYNumqdeDpkdJA2y/PIFt6KD1l1uiCnuK4REkEJAPRBQkJAkVfoiHZBLp6T7sshBSaFBhpIwSB8nr5j5zxDvIuEBza0GNC6hVDa5BQTjnKspepMOYMw6CZxGQAoEdQfMYas6889Jy4UUwOFreUki3MDLzs+gikeeMRN+t4/EFP3mLbDOUTp9yqbTf291dATUw9vPW2TA2TYyQ3yaDIRMKXPHn6ecXpMP8E58UIvII+eVEtHYBAzfzB3dRkQYIaLJAniNZICzqWktoQtp+QuZuLGfyFoGkE7AthrRPYJJRUnTO2QxOUXVXCNNhFnmuVkE6EJEEisFEVixFVVkIsFkYxSCDIAwGCKCEEFSSMOe09wkh9af/yDQ9j4WHNt2pDAAOlAPl1kAoU7QQ2qhzwIpGCwkGKwkRCMQiyMYMUioxYiGK7p9yTvndCeAiNLkBxXUf1dgl19XlDzkSiSbu5CyOBmRIMEbAxxJdJyS97FRC4kOMeqSVDjSn+3Ee6FIeV6z2+nA6AP0Sqok1bEHkgP2kQ9cHhzcOfojdOYBToQ8eY8xu1O4V1BRlQai0NRCW13IXB8T2JpkIiAfD3de+jsWH4CgOpR5jCk7Qo593s2bd5gmJgU2IsiGhneYbN6wp0h7DKmpCyX6VRvgGSAHZ79zxZETUFAZoWiiGJc+o4JCg9G4qISRjGPsKKLbQOIdD/g413OAfMd5chLmJs3UENJsgP9rMShiRLXhscJzqjyhUKEuHlT67c7JFCpZ2lNFZoT1RM7i6sOlOdCJUMiFiUQ2gYiF++UmB+/ZpiVzJDvOZTLKz4y+/a7xbSoKwQFqpWVmB+5OQsx0ROHhVyaLl3gxwyFsVLy9sqEapLxdm2ECHy5xOidolk0IOSNsd6b4Dvb3n+p8hyn6OoHKPkKPigQIDzeOe5PMMUchMPfHY9P6OQhBAQYxjFWCRBhAQZDs7DL7Ppv3+P2U/8IO6k5SbVsQMiDcODEsiDrRuCZJqIO0lDRPV7HPnx4DWH3Ld1gjaNFWWlWqPtZs4LNG5YRYc5UOKt/eLWHLwoYXeUAUFkTRmQxdFRrURRJRCKVUsSKDaStUOLUUjnMwEllNiLEsNZIqURoNLZLUqJenPGPDUYGRhwAMhSRJDiBNhh7f1mECG83GUNPR6d+wTJ74r908IraHaEDWRgcUm+KQgG4ItQ2rzjsMF4mBZEUec+UuQIcWjE1YrrE4HdRIePuK+QuEC6UhPu8mIYO1kHTpXKTKh0XfHph5r08wDh3nONCwbprbERRYCnMGF0G9BDiNZRKtEkKGTkY3fi1lk5BbsQLEQtLdZYLyZwXi+6AkWNRvMdvUoHFXpMSqxvD5vYbB4s1m5wVN0ORIHIoDo+vj7XftEduvUXEsSUsvQRZtp5XChvjaQQQgkhGADCdu5gJGAUasrCtkSsUGhXJXmG1jPhy6zcO0PkjyFurHTLp5Lp1YeVZSROXkQdtfMcx2Meyr6bPu2uIKWN5gTRs7qXfRnCLi0oWBIebpOmWQcKb0IeT49OI83EtLTG4OPCdd9c1lqWt5rNf6ijNd+vKxswbZXTYXUoXD7BIFTsXd96VIDZEmn9DEEJvUVC8IaMWwCUkJjS+f2nOWOc66nroT55gQ4p2PORZE6u4L7xF9CWIltoiFEtSKxkESiCg0kUJWEUiMSQWo2slbBIETPlaUeDL+OuGsAoiFc5SCAyCTM0g4wMjYeii2FIX6pxtZek5FqcKyAm3MrkptroenyW0ZeJqDn5xNSps4jgumRRNpuKC8Lkj4HaWeeHkqjAvXU89I+LZB2wDkbiA82QRrBGloFPxgqkijSYY4NkWym4k0IKp8jtw9CMfUtU3J2HKw8N3yUMzcVNJG3AoLg2ItER5mnr7Rv3m/Xz/kAoKW6NlrBuxttIY5UXFv6r6b8ZyyoIILzGmaMmRsNZtQ2Q1hSaHRN4mg2+yOAhphcs9iIaWqzWcBj8QhkyUsN1Cz7cqpgY2CEsG1MkuAOzjXMs04qGSZpKagkRIJUZNsGZmBQpSCBlCqoqjCJN5mnSK1tZRqOi7NbOwdFTRsTGUZMAXMQiJWKLXGMvpRog7bpDQJsIuaoELhkQjd5icJKGoChRgYMAxgqAyFSiCYGaZmlFFHVyCE0JA+Tsdw4nSuoXd6xfZsOxbrWroTadkZmSkpqkqGG+DDFGa1YEU1oSeg74koNTpDzFUEj2QuZBFz1thsgrjBbQ1wWiMiXia4qFr0jeKIXtxK+IuYJIDZNw4joBcL3LLYINhCoUBRUYgk0SjF9Wvb3Fd75zWZoIgLFMHEQF0opP28jK5jOBXFkgqjFZ23KH0J0W5kd6mBb0VOAemYbIdqBVg6UC4p3F22mA4yLIBjCnUUiUY0CXYJdZo0TUZBErGahLImqCQwjQpNJgcQJkNAkMDZYFKY0ZKRMQGIERYqCgpFIKAsiwQQBgxkAMSkEhal2g0K0im1uB0kHG4xCGqSOgkUS0RZJFAdEM6gCJf18dH30ee9AxwATcHYkUYmnz8Ar/IivBogA7rblCX5qTh2bu7A/iQj4rv2EgALtiRiSIVtOXEKh9uu/xo9g2E8EsW2BahQZJO0YIyACgj2NM8EOWOWUsa/JsLyrMAThFxqPwrbBfX4Sk8iH3T2+yfMDE9eGB8hYVYVBZAqZwZwasN0bAKJIWH8/EgYQMAYgsBAhEBBAYALJBEiwEYRZC0RJQ0NBBBBGUhQpSWhaTIz2mtTCw51cAYLG0lYoxiAgiRjEx201V4uSc3iqE9IA3osZjBXN6oYgPEo7+Q9X4dwUn0JN++4lt6Jf1WQRiN63XGs5/SNBmKCF0CyQxE+I2dxqw+zLZ03KAUzxOEL7C+A5OugpdYA/pIxYjPgNO1hrOLGLO7SGOEeS8wukuo5HoLSA+Mo9qlDIto0EBq4PXAkjA3I4NzrtdQwA/M8okgAZHZ7g7aUKIyEjCVTSkC6mqlXpNEMhB6TWp1CZAL+v+CL7PrObuIwUHmUgwVERiDEhNh9YXOgvDqyPGIYnS1iTdBbHAvZW4UZEiRD33KVftgoeUdYQizvSFIhyCDMLiSWhYRCoUqqkMRQJMBEZAMSdT2Fk0EQ2EUcRA/cri5UJGVk0qFogtqoS6GjY98MkE4Ya4byCURC6bi7887ug5wyMQ3HWWNyN5FTv3LoRaiXcMGu9AuBcNduFLD10oZEn6UhjDMC1hOUBRENZQiMjBkxltmkLpQFd0koj2JKKHyWbmp0kgdDkvOwoX+JDBw6tStYWJLgJc2w+3AMYYwyBJQODYGaqyCnQInWRUHcQBAoCCIX8YMPA/A/X+yn3k0j9QWVKKriSUcYoLVeheQmpgERDTogBw6YAPhCEAaiB/fFC0E33UgV2Jw9qEHMciYBQ0kIDRRW0tifW//CDGBRflqTtg5PX2BIwIDqo0RewVc1fFNWt7T9nzWSRUvCRew9pn+h1iLWEWCySNCjIX1H4/pwFJU8+hVP07wDj4r56haT4mCkCus7DtKjklhD20pQi2bUFPA9hhUWNkyLfR8PpwI+eBYvukBf7bOJ0x2iZxTEacPQhsVDadSJmIMhJoBIDQGEzJiSAfJoDLZQpGBiD6mxkMyULteQIHX3kA7h5EewIFAJA98K3t9uXyCgMRDgeYBA+MzLCMXMLxR5/vB/okeLaXvM/NeP50kKJ8vUsRNsji7Id2qOhmqKYgqpcYVw0d8Iq8ZvH4rkOxFBqQnNOSpzqdhAI8ngof0ilFztEO+yJzwzBkNKTBLWp4DXND3fbvs9cMIlj9zRxxDAL9DY33llQ6YQm4FIMRffzVsNNFQy3GxSSBcIpbq5gHBXcmeR+EJMA46Ni1GJFRWEWAsBBhBkSCwBBgCyCxFCACKsWQSIyRIKRRGCMFuX2D06J0WPA6btq6U+q1hso04ieyfh751dlQhQqJQldQ9MzE6yqI8YJw6KDBwVFeeVikYU+O55D8B7cZzkSF/Cx6bVEy/+0Skih3En1TxhGiUJ7xTRQUU4iGyqhyka04Rp0aw8PbOO9y0v9rags/fGrxZaNo1Twisp+GzmC8p+QPYO4OO4CD0QSiCHMRYrQjX8Tv6Ojo+AlgLKclNChIFNKQIRCiJYVwzDSMSU5Ne1lEutRALwk3SJEdCpEQoSDcMfaIni3QJgO/xx0hiFOPWT+G1j7kq73OcBIwWRT5HPxt6OStode1YpCgg/uA47XVckhvl/gKhbMvmS3qlRPgvNooR9bJc5j4oiR27r5hv2IEJMC5M3qHCQ1c9YZjRKMYSEmLxMtNCHv8SLuhV7DIOsWx1Hf3JIN2mfTVUR90vJu8S2wpwWDmyCS2N/CMzLSLBgkR0hsusCGmAwSxuykBJBJWFGNsUiwUcQppxPA1ALr2lwOcn06sYl0qGOyVVFwZaoaaEq0QCTEBwZLNlXBJzcU46w7REXbExJTQpeGpMUwhgohE2ZMBUcKLgbNTU1TlDA0WzYJuTMepMydLTRU24qnVmsLGjyWKCwQw0GhLMWg+0Ip9ZGEfvXZA9SN94hgKgBPpkce9/Zvcn4ET36sX6tmEICLTdDsCpv+mQLwk0BETsaFAiqKJ5Br27vIHJDmMHIQ0BZBA0LiQIUFSrGA59ho1pruiUKZaNN0KUwWwy5KfKeG8usEqSxwLTeayQpA/PPQQ+7ZtLD9J3POpg9HseXZc5iIcfJIu83lJwZWGhOwwwEi4sCY3gLYDb6IdhI9yF54ID0OzjeA52Wv2nRhz3VHYENzd2FagyKBxHOQnICRT6ffcIHczMJ3xQMEBkOx4SrqzQOUdMTEWwfRg4waEWiuYcAYen53lKE863amk3k1+Y1y2dVdSRID35HhViUHXRsv9ECqoKYGqF2RjO0DmtlrrhF+2FPlhut4LOoyQGZhO5VQ+S3t8qdENIUayeHlZpq8/mpqIjE0NCtfsTMf6XHK2tWyOigh4eIduCaXQl8TZqtXvnqB6WRxO9vIHDwISH1g6d7wSfGzjCHzZeI4o4lYKgkiwiNMBpgBiig3KBfWAHtAf2sJ4H9eQGoDVFhqPkgEGCyFiLE799K4AxL1BBJBJ8ShW4IPwNHVEM4FRSQjEQ+UV97EeZ6sXbJ39Za059A9qC/ZzegOk5j3mnQinwimSHUdJYC4SDFkkkBGS5KIiupmFfW6RJUbhhAUqkKLA0ixQQiElIE7thA3IajNISsKyRYSsgUGWlksBgQRCKRiVJaDYLCRZCQUWKBSBYyyiBYMBCgMQsgIBECEEIxCLT2B2pBYKSASI6Gz1ln42E8UYJMT6ChmWJPgUvUPvXu7jVpRMOXKVEFip2UIhD7t/IJ+vFTIrRsWfcPLdV6OWofZ+h1864JoYm2c+9kSNTMZx5cOWNuBsd9s+Rj5odGIIRa4WwWJpCD+fqMM4xpXBx5MHmjnNYKr3J2rDJEfI93coyzT/I2DAafmr87Zn4HbGhxvod9OUMXr8CpGDOGCMckNg6EtBPix2ItBxY6gu8h0EGGdRgZ0BwO5lHCjjNRCTFB7SlHCJ2ceLm4U44MDQLKbsmHTcopM20e1dMjs/LqLgv+SzM+CpNbYc6I1LZgpFcTRZLlTj++fId206Sw/XEzItSV03h2UieI57WNGlrjSQ0pptU1Wi9VB4cFbev738DDgjwRhM3RzLNck2ti3JeHe4pu8ilQv1Elo3xzu6VRD48BYNXhZky8LZ4RwrDYYM1E8axp5y7ytY1GZ1DUpV9735DDZssDjNit1uOIaONZ3QfbjFYRxbRmaNbusQTFZM7sDc6bB45FDQZd0kKo8Nvjm5WcJOysp9Ow/O6zGaqdFlG0oeEAwDzmmm82NyGoNkLKjlbgFwowwsGhbMJqFHfdS/xcjIuaGwKBBN/rZumotfrxQsugdKOfI6MYuLzGFccxGB8ODw6FTqFDUvGTv5bvVHkJC2nQjcoqGNR/5Vtc1ZktK7cKhnHcb0NGTFzweFdsVbFLzm+KcPDFFnQ1xgmucw5t9NIOhU6kiLXq8qiaS4fUGYejBCyyqZ8zeZSAhYSCMu4Dct5tx9R8GE25BodrBi6XPsJcUgeK1s4WVbvsYbY4er8ekyDZlk7yd8/NH5oBrUIa8ChzNvAiuvYUNXRrMlBhTVtSl2mGQRum/XNFJkLD2QxKWcJREViCDAXC0BTi2CwjoBVGUDeywJaTAm9QrHcDYFkoNDQZnpZuIEi8N9Fm1PJ8c3btIWsTD7DkU2bC9REJIJ/B50XPPMxlQouFlthH46ojvUsHYCpUWDEBmqRQuFK1hUahmaNAFDSOvvx1pNS4u2i4lU1QxbSy0u24Xe9a3diplzCvVGymeTFmr0o4iF3QaiuVFUFUUq5IVpZa6bUNAzEnGYYKs84eyT0n9Zh9/DkPNvoUt4PGMIKGkA1QC6movBJKCqrr+Wtkh32O3FymMxtVlssJ7TwfQKmxDeLA5OJyZJImAo+6DIelVRFYqx51twQr04/obKXcjvywZPTmIjrOohyZCUVCydnCsPQGeIsYghhgHyARQxhKNR2DYsjvYLPx2VbC46rKhLACOtGtaoeKQkU2WX8Q3MG2hrcNGpFO2BY6vPR1nPWNNGEKRvB5KBN2srC8AfXABroMLJGTqj3v6U1ZgxuRFRkFBEWKCIjyKxzAyHwEyZCkRKJRrKgQQkQQEAUJBH1UKrD2QgWTIGWBZL61xlMT1huzwZLJlsmzONQrOB0hRYg6yUwWqIjDLUtCwmFrjCYwCsJcwbhIBUxEg7lsSMnAzxLJOjO/C03xoRaSttR7am9Lo4k9WfoNDkF7ulUaBonbDetuy2zoHU60mHSGjBHGnFJWRRLyWGOikYkoFeqI8TRYouqVCFFVRzO0It27f6dgCl7EgFaxa0GeT8gDpkParJpuMOmLUNwtR0JkHuZ8toVNTG8kSi62srS5CmBiQ5wyDmhAYgWzDuoPCO0dQRLBu5XxHGkkA8rIWyJwqUCBthyQh8k8YMQue/b3LuNZRiF9aWqkTUKxgkCKgdIPZ5d118fm7rwday8Vc816jw0ajnE89Gyvvt8rhx7U93nMaAsVWGfcqhhYp2ynW210vEaM7HPNMsTGZ4PxiQNajEJN1F6nfcRgy0ZDLBOESfppsWhJNNhIu7zkzEIirgcpyzDkayXI4Doev0OHGjdsWYssn6qcCWEb4Byao7yxMDoLTN12uCyV0ffGcmKYw5qMEyXQU0szuO7c9NwKgcQ0rQmORBlZtxAmI2mQbhh3DpBWnwzRNuTtjmIYQxL5cmJyzjPjMNxRhhC3JSYdurm4sIIGVW+zDiWJpYdxuILYy0WcFBNr9GcQPCeir6RgaUAhAAWJgdMzaGBZZ1FOnic+GDR23jSchYgUKbIYdNUmcUJKMUSdFHkuByzHjigcQ1Uo1OtJzXOXcw1o2biE6Jgzo7YbN71OJ84ryu4yIfMxxNTRUJJ6kcUad+be7gjDakgcl5EK5hiS5lpjDscZB2ZsD2evRiyjenKN5WJGXFZJLdHD9JbTxUjsMi+U5Os7UeMhsYJGM4LRjDk0cUhrRLgXaCjEJpIylDPkDWhE7ZTZg1A2bkgcSkAbUipUEm8DWlC43V4xShqoUzqXiiN9Zitbh8VnFRhx72MBcMJMzYZHcbChshNBkqjCMmbDJRhYB2znjFgtXSUedWbISnRlo4Ia1oYWlBm1sl7WyzhJpbLp5a7GsNFgOgaWTMIjCUxhIkdC29jGDdNl74hJCJRdxb2GgsMSLcsN0sUXHYEDw8PjNtcBMHPXDignDic2nd5dtjAqsYXIcxHAl5oXqKmrpUSIWOABgAfi7qdN9BeQgLIq5BoWLDn5piZcsjFOCcniDc1BgihCKjYw20UQrkUxMo5TDOHTA0IhplGMEiJYjhYUshYsFkVqZcRQTQIWQ0hbaCMkmoYUJTCZJhgdodrQ9k8eTpySulbSoq0zIYJqU0jBFzLcAdzsaLQzBCY+cPaU3Kb+m0sQbcMGZCLQZwK8di7IyRudMp1MahciReIb5iQrqnu10a1WSb05AxiIlgitCel68ql8FWloxDPbaIaAHUZParMS/KU9MGAk4AYmvqompIVgrlDOYVOzp5GDjAmwiSfMqBSpUBWiHfFKQzVBMbQtSlhMn7nJGivWSwwXDMDQMMdORFBjgDB5zciQcGBjKOTgmvroxeoKSD3Hl2BVgKhUOHPTegiBjSUZJmPqNm3p7qR8Oii10qDicbQnJBvJgXALUa41gpkkwiXimgxFGbduEpJo3gUQZoNZDUsJYjYqt06AgfDW5vv5zx/g6+VGUjNdsEqZguMYo5+l802OmvFYvGGSE8ZDvBkPRCSHaDA43p4eRDBoGUEO53JJObAmwgnYqqr5iHgKOpOPfMWojCu38Z2bw2PQ9Vltgbyqoqw6EKURh5CYB2kCw9klBR5HEruDTZbYvXW6K3bJl5G6QmoECyprosB2ZGkM+o7xMxTouWNQEUkCAIAyTyPoNeOpVgy8c8pD6hDRIE4QIoOQuIcuJqD5P08e7y0dtoMIURohCrQ13DxPH0mUvgEwUc6te8KFYaBVM0sFKg1jdZxkyQxLuYWhvAMYNKJDWoCXmGjClNXqQ5O3h26aSeRsnmuDBSUElBRNwlCB6w3AbQOQYi31zeK2BQsgChmAgUHADq3wsbc3eyCdfcKImNGPfVyWPHiIdqe74keUUsHFC1Nl60TpOUcyd8VzhhvCKmYw0s0QhgFC0kVYKjGIjCbjUDTbajOpEmv/swSIkgI38+ZEORANdgrBDID1j7bgYo7BXQnIMhe2KkCSD72AsIPMj/XlqhD5wNE6wGQ/3mzvtEVCIjSlSUqkIVQ8qTa7qGkHIuD4h7IHpqw+HkpieCdCRXry/V8sIHtZgVTYSTY7j/+69tCKqS/MWXuZP0pBLWNUAwI6TuQ7Fcmw+hYWM0Xsgq4BZMa8rAJCyQe0qxIhyCTAm4b998YD5DtwcHcghhNeWgA34oThkAX7qwJGEe0zPImJEht2V0QNgQHeMTuC+c+f+0+9vv9EgG0YL/RaqplsygURgKCxEgRSJDdCM0gZ6ZZKCAxEuy0gzy7A2dHD9hBCEzFLntK+7tunxcqmDXccqPrnwDAfWL/KEUkcTtPIGma8ZJIwjPGHUnottv38KMWOAVgyhZCwfX2lwAy8Gfr8Siya3jEz89wtCdqlVFm+D732wLohpI5dJA6SgYrEHZjfoO+Bz1VbCCRZn9QWDLPGj7i6YsMhpMhsKNDsPgDkB2z0GRkHkMjAXkEfjMIQhREaSlHFLiAWj2zVUDi/k8a+j0eLldHzfjyyyxqZm74TthRZPkJ4AHiUDnW+aTfkaLJmRjA/WJq1BE8vupynidJ4hsOrt8iWoCPhIS+bRdDz0MVCDJBWRQKIQrJCiehAYowUIChLMh5RQSGR4HjcjnZC9Qx9DjQfm+fQTIjRi39saNYrDpvsTFI/ILOoLRj7x2waoMKNvo+4XVEdHbQ5wNDLK0J5Q1v4dlFhglQdU2GrHkEsGVMuzdOufj41xyZUxingl0cRHYUSnO5k0oHbPEbBqSLwIHmsieIXETfrRMsHKGiGSi6GRw15CJcPvOoDMiu42+b00d/Yeyz3wk6R2lyz4VIif7p8iGbohXqPgFjM+FfQOTNTJhekLwHGCUjvEb/QepMOj+G4eI9JU/Qde5rSlTgeHn/Ga2phj8Rox+gWcqOLDoVlUv/2V+X1+n8y/OLuSKcKEhX2hj4g==')))
\ No newline at end of file
diff --git a/examples/presentation/students/cpp_course/unitgrade_data/FractionsFromString.pkl b/examples/presentation/students/cpp_course/unitgrade_data/FractionsFromString.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..edbf9b4ce6afbdbf3c87213a781f93eeffeafc67
Binary files /dev/null and b/examples/presentation/students/cpp_course/unitgrade_data/FractionsFromString.pkl differ
diff --git a/examples/presentation/students/cpp_course/unitgrade_data/FractionsFunctions.pkl b/examples/presentation/students/cpp_course/unitgrade_data/FractionsFunctions.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..e203f8a9cdc5234575b7882a181d38f22f6ea17c
Binary files /dev/null and b/examples/presentation/students/cpp_course/unitgrade_data/FractionsFunctions.pkl differ
diff --git a/examples/presentation/students/cpp_course/unitgrade_data/Fractions_Basics.pkl b/examples/presentation/students/cpp_course/unitgrade_data/Fractions_Basics.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..399069ef78aabbd5c563ea3c29de826589501450
Binary files /dev/null and b/examples/presentation/students/cpp_course/unitgrade_data/Fractions_Basics.pkl differ
diff --git a/examples/presentation/students/cpp_course/unitgrade_data/Fractions_from_string.pkl b/examples/presentation/students/cpp_course/unitgrade_data/Fractions_from_string.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..b01491f2121c122ac1e340a69286cd1a20b39b59
Binary files /dev/null and b/examples/presentation/students/cpp_course/unitgrade_data/Fractions_from_string.pkl differ
diff --git a/examples/presentation/students/cpp_course/unitgrade_data/main_config_tests_ex6.artifacts.pkl b/examples/presentation/students/cpp_course/unitgrade_data/main_config_tests_ex6.artifacts.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..d9f67346343978b015fde99b56b6ab5c85017ca5
Binary files /dev/null and b/examples/presentation/students/cpp_course/unitgrade_data/main_config_tests_ex6.artifacts.pkl differ
diff --git a/examples/presentation/students/cpp_exam/problem1_vectors.py b/examples/presentation/students/cpp_exam/problem1_vectors.py
new file mode 100644
index 0000000000000000000000000000000000000000..a4b277fa5db046db88d5288a7170b37196310f22
--- /dev/null
+++ b/examples/presentation/students/cpp_exam/problem1_vectors.py
@@ -0,0 +1,32 @@
+class Vector:
+    def __init__(self, x, y):
+        self.x, self.y = x, y
+
+def createField(m, n, v): 
+    # TODO: 1 lines missing.
+    raise NotImplementedError("Create and return a field of the form [ [v11, v12,...], [v21, v22,...],...] here")
+
+def displayField(A): 
+    # TODO: 1 lines missing.
+    raise NotImplementedError("Compute and return a string representation of A (see problem description)")
+
+def addFields(A, B): 
+    # TODO: 1 lines missing.
+    raise NotImplementedError("Create and return a new field corresponding to A+B (element-wise)")
+
+def scaleField(A, s):  
+    # TODO: 1 lines missing.
+    raise NotImplementedError("Create and return a new field corresponding to A*s (element-wise)")
+
+if __name__ == "__main__":
+    A = createField(3, 3, Vector(1,2)) 
+    A[1][1] = Vector(2,2)
+    print(displayField(A))
+    print( )
+    B = createField(3, 3, Vector(2,-2))
+    B[0][0] = B[2][2] = Vector(9, 8)
+    print(displayField(B))
+    print( )
+    print(displayField(addFields(A, B)))
+    print("Result of scaling A by 2")
+    print(displayField(scaleField(A, 2))) 
diff --git a/examples/presentation/students/cpp_exam/problem2_rle.py b/examples/presentation/students/cpp_exam/problem2_rle.py
new file mode 100644
index 0000000000000000000000000000000000000000..edbe09ee163d229a6ff8018d359a519a152435af
--- /dev/null
+++ b/examples/presentation/students/cpp_exam/problem2_rle.py
@@ -0,0 +1,34 @@
+class Elem:
+    def __init__(self, value, times, next):
+        self.value = value
+        self.times = times
+        self.next = next
+
+def displayRLEList(l):
+    if l is None: return ""
+    return f" {l.value} (x{l.times})" +  displayRLEList(l.next)
+
+def reverse(l): 
+    # TODO: 6 lines missing.
+    raise NotImplementedError("Implement function body")
+    return prev
+
+def concatenate(l1, l2): 
+    # TODO: 4 lines missing.
+    raise NotImplementedError("Implement function body")
+    return hd
+
+def rle_sum(l): 
+    # TODO: 1 lines missing.
+    raise NotImplementedError("Implement function body")
+
+if __name__ == "__main__":
+    l1 = Elem(4, 10, Elem(12, 6, Elem(10, 5, None)))
+    l2 = Elem(1, 1, Elem(2, 2, Elem(3, 3, None)))
+
+    print("The RLE list is: ", displayRLEList(l1))
+    print("Other is: ", displayRLEList(l2))
+
+    print("The reversed list is: ", displayRLEList(reverse(l1)))
+    print("After concatenation, the list is: ", displayRLEList(concatenate(l1, l2)))
+    print("The sum of its elements is: ", rle_sum(l1))
diff --git a/examples/presentation/students/cpp_exam/problem3_groceries.py b/examples/presentation/students/cpp_exam/problem3_groceries.py
new file mode 100644
index 0000000000000000000000000000000000000000..cbfcaf9cd9751345817e599562c661192feed8dd
--- /dev/null
+++ b/examples/presentation/students/cpp_exam/problem3_groceries.py
@@ -0,0 +1,24 @@
+class GroceryList:
+    def __init__(self):
+        # Populate the items:
+        self.items = {'Lasagne': (1, "With eggs if available"), "Salmon": (500, "Smoked if available"),
+                      "Spinach": (300, "Fresh"),                "Dessert": (8, "Maybe lagkage?"), }
+
+    def add(self, name, quantity=1, notes=""): 
+        # TODO: 5 lines missing.
+        raise NotImplementedError("Implement function body")
+
+    def remove(self, name, quantity=1): 
+        # TODO: 6 lines missing.
+        raise NotImplementedError("Implement function body")
+        return True
+
+    def copyEntry(self, name, new_name): 
+        # TODO: 4 lines missing.
+        raise NotImplementedError("Implement function body")
+        return True
+
+    def display(self): # Don't edit this function; it is used for the test.
+        s = [f"> {name=};{quantity=};{notes=}" for name, (quantity, notes) in self.items.items()]
+        print("\n".join(s))
+        return s
diff --git a/examples/presentation/students/cpp_exam/problem4_filter.py b/examples/presentation/students/cpp_exam/problem4_filter.py
new file mode 100644
index 0000000000000000000000000000000000000000..a22f51fae2bfc617683976f493b1fc9b850ed030
--- /dev/null
+++ b/examples/presentation/students/cpp_exam/problem4_filter.py
@@ -0,0 +1,39 @@
+class Buffer:
+    def __init__(self, default=-999): 
+        # TODO: 3 lines missing.
+        raise NotImplementedError("Implement function body")
+
+    def write(self, n): 
+        # TODO: 3 lines missing.
+        raise NotImplementedError("Implement function body")
+
+    def reset(self): 
+        # TODO: 2 lines missing.
+        raise NotImplementedError("Implement function body")
+
+    def occupancy(self): 
+        # TODO: 1 lines missing.
+        raise NotImplementedError("Implement function body")
+
+    def read(self): 
+        # TODO: 1 lines missing.
+        raise NotImplementedError("Implement function body")
+
+if __name__ == "__main__":
+    b = Buffer()
+    print("Current buffer occupancy: ", b.occupancy())
+    print("Reading from the buffer returns: ", b.read())
+
+    for i in range(10):
+        b.write(i*10)
+
+    print("Current buffer occupancy: ", b.occupancy())
+    for i in range(10):
+        b.write(20)
+    print("Current buffer occupancy: ", b.occupancy())
+    for _ in range(3):
+        print("Reading from the buffer returns: ", b.read())
+    print("Current buffer occupancy: ", b.occupancy())
+    b.reset()
+    print("Current buffer occupancy: ", b.occupancy())
+    print("Reading from the buffer returns: ", b.read())
diff --git a/examples/presentation/students/cpp_exam/tests_exam.py b/examples/presentation/students/cpp_exam/tests_exam.py
new file mode 100644
index 0000000000000000000000000000000000000000..b68bfbe3c62c770d66c894a06112d2d30f9c4b80
--- /dev/null
+++ b/examples/presentation/students/cpp_exam/tests_exam.py
@@ -0,0 +1,263 @@
+from unitgrade import UTestCase, Report
+import cpp_exam
+from cpp_exam.problem1_vectors import Vector, createField, displayField, scaleField, addFields
+from cpp_exam.problem2_rle import Elem, rle_sum, reverse, concatenate, displayRLEList
+from cpp_exam.problem3_groceries import GroceryList
+from cpp_exam.problem4_filter import Buffer
+
+# class Q1Vectors_Examples(UTestCase):
+#     def test_correct_format(self):
+#         """ Test your field is in the right format.
+#             Hints:
+#                 * If this test fails, all subsequent tests will fail. Make sure it works!
+#         """
+#         A = createField(3, 3, Vector(1, 2))
+#         self.assertEqual(len(A), 3) # Check there are 3 rows in A
+#         self.assertEqual(len(A[0]), 3)  # Check there are 3 columns in A
+#         v = A[1][1]                 # Should be a Vector(1, 2) element.
+#         self.assertEqual(v.x, 1)  # Check that first coordinate is 1
+#         self.assertEqual(v.y, 2)  # Check that first coordinate is 1
+#
+#     def test_displayField(self):
+#         A = createField(3, 3, Vector(1, 2))
+#         A[1][1] = Vector(2, 2)
+#         self.assertEqualC(displayField(A).strip())
+#
+#     def test_addFields(self):
+#         A = createField(3, 3, Vector(1, 2))
+#         A[1][1] = Vector(2, 2)
+#         B = createField(3, 3, Vector(2, -2))
+#         B[0][0] = B[2][2] = Vector(9, 8)
+#         self.assertEqualC(displayField(addFields(A, B)).strip())
+#
+#     def test_scaleFields(self):
+#         A = createField(3, 3, Vector(1, 2))
+#         A[1][1] = Vector(2, 2)
+#         self.assertEqualC(displayField(scaleField(A, 2)).strip())
+
+def vector2string(v):
+    return f"({v.x},{v.y})"
+
+def check_field(self, A):
+    print("\nChecking size and type of field...")
+    self.assertIsInstance(A, list)
+    self.assertIsInstance(A[0], list)
+    self.assertIsInstance(A[0][0], Vector)
+    print("Checking all elements of field...")
+    for i, r in enumerate(A):
+        for j, a in enumerate(r):
+            # if i > 3 or j > 3: continue
+            print(f"Checking that A[{i}][{j}] = {self.get_expected_test_value()};", "your value was", vector2string(A[i][j]))
+            self.assertEqualC(vector2string(A[i][j]))
+
+class Q1Vectors(UTestCase):
+    def test_correct_format(self):
+        """ Test your field is in the right format.
+            Hints:
+                * If this test fails, all subsequent tests will fail. Make sure it works!
+        """
+        A = createField(3, 3, Vector(1, 2))
+        self.assertEqual(len(A), 3) # Check there are 3 rows in A
+        self.assertEqual(len(A[0]), 3)  # Check there are 3 columns in A
+        v = A[1][1]                 # Should be a Vector(1, 2) element.
+        self.assertEqual(v.x, 1)  # Check that first coordinate is 1
+        self.assertEqual(v.y, 2)  # Check that first coordinate is 1
+
+    def test_createField_small(self):
+        # Test a 4x4 field
+        check_field(self, createField(4, 4, Vector(1,2)))
+        # Test an 8x8 field
+        check_field(self, createField(8, 8, Vector(3,8)))
+
+    def test_display_field(self):
+        A = createField(4, 3, Vector(1,2))
+        A[0][0] = A[1][1] = A[2][2] = Vector(0,0)
+        self.assertEqualC(displayField(A))
+
+        B = createField(6,8, Vector(3, -9))
+        B[0][1] = B[2][1] = B[3][2] = B[4][5] = B[5][6] = Vector(0,0)
+        self.assertEqualC(displayField(B))
+
+    def test_add_fields(self):
+        A = createField(4, 3, Vector(1,2))
+        B = createField(4, 3, Vector(3, -9))
+        check_field(self, addFields(A, B))
+
+    def test_scale_fields(self):
+        A = createField(2, 4, Vector(1,2))
+        check_field(self, scaleField(A, 2))
+        A = createField(6, 6, Vector(3, 1))
+        check_field(self, scaleField(A, 3))
+
+def make_rle1():
+    return Elem(4, 10, Elem(12, 6, Elem(10, 5, None)))
+
+def make_rle2():
+    return Elem(4, 2, Elem(5, 3, Elem(3, 5, None)))
+
+def make_rle3():
+    return Elem(6, 3, Elem(7, 5, Elem(8, 5, None)))
+
+class Q2RLE(UTestCase):
+    def test_reverse_empty(self):
+        self.assertEqual(reverse(None), None)
+
+    def test_reverse(self):
+        self.assertEqualC(displayRLEList(reverse(make_rle1())))
+        l = make_rle1() # Test reversal of the tail
+        self.assertEqualC(displayRLEList(reverse(l.next)))
+
+    def test_concatenate_with_empty(self):
+        l = make_rle1()
+        print(f"Concatenating {displayRLEList(l)} with empty list")
+        self.assertEqualC(displayRLEList(concatenate(l, None)))
+
+        l = make_rle2()
+        print(f"Concatenating {displayRLEList(l)} with empty list")
+        self.assertEqualC(displayRLEList(concatenate(l, None)))
+
+    def test_concatenate_with_another(self):
+        l1, l2 = make_rle1(), make_rle2()
+        print(f"Concatenating {displayRLEList(l1)} with {displayRLEList(l2)}")
+        self.assertEqualC(displayRLEList(concatenate(l1, l2)))
+
+    def test_concatenate_three_lists(self):
+        l1, l2, l3 = make_rle1(), make_rle2(), make_rle3()
+        print(f"Concatenating {displayRLEList(l1)} with {displayRLEList(l2)} and {displayRLEList(l3)}")
+        self.assertEqualC(displayRLEList(concatenate(l1, concatenate(l2, l3))))
+
+    def test_sum_empty(self):
+        print(f"Computing sum of empty list")
+        self.assertEqual(rle_sum(None), 0)
+
+    def test_sum_nonempty(self):
+        for l in [ make_rle1(),  make_rle2(),  make_rle3()]:
+            print(f"Computing sum of {displayRLEList(l)}")
+            self.assertEqualC(rle_sum(l), 0)
+
+class Q3Groceries(UTestCase):
+    def test_add(self):
+        gl = GroceryList()
+        print("Initial list")
+        gl.display()
+        print("After adding cheddar:")
+        gl.add("Cheddar", 500, "Not too mature")
+        gl.display()
+        print("After adding more spinach:")
+        gl.add("Spinach", 200, "Baby spinach if available")
+        gl.display()
+        print("After adding even more spinach:")
+        gl.add("Spinach", 200, "Frozen is OK")
+        gl.display()
+
+    def test_remove1(self):
+        gl = GroceryList()
+        gl.display()
+        print("After removing spinach")
+        self.assertTrue(gl.remove("Spinach", 200))
+        self.assertEqualC(gl.display())
+
+        print("After removing more spinach")
+        self.assertTrue(gl.remove("Spinach", 100))
+        self.assertEqualC(gl.display())
+
+        print("Trying to remove even more spinach:")
+        self.assertFalse(gl.remove("Spinach", 100))
+
+        print("Trying to remove cheddar:")
+        self.assertFalse(gl.remove("Cheddar", 100))
+
+    def test_copy(self):
+        gl = GroceryList()
+        print("Initial grocery list:")
+        gl.display()
+        print("After copying spinach into baby spinach:")
+        self.assertTrue(gl.copyEntry("Spinach", "Baby spinach"))
+        self.assertEqualC(gl.display())
+        print("After copying baby spinach into dessert:")
+        self.assertFalse(gl.copyEntry("Baby spinach", "Dessert"))
+        print("After copying Cheddar into Spinach")
+        self.assertFalse( gl.copyEntry("Cheddar", "Spinach"))
+
+class Q4FilterBuffer(UTestCase):
+    def test_if_compiles(self):
+        b = Buffer()
+        b.write(42)
+        b.write(42)
+        b.occupancy()
+        b.read()
+        print("None of the functions crashed! Congrats!")
+
+    def test_occupancy(self):
+        b = Buffer()
+        print("Current occupancy", b.occupancy())
+        self.assertEqual(b.occupancy(), 0)
+        for i in range(7):
+            b.write(i*10)
+        print("Current buffer occupancy: ", b.occupancy())
+        self.assertEqual(b.occupancy(), 7)
+        for i in range(5, 10):
+            b.write(i*10)
+        print("Current buffer occupancy: ", b.occupancy())
+        self.assertEqual(b.occupancy(), 10)
+
+    def test_read(self):
+        b = Buffer()
+        print("Current buffer occupancy: ", b.occupancy())
+        print(f"Reading from empty buffer should return default value of {b.default}")
+        self.assertEqual(b.read(), -999)
+
+        for i in range(5):
+            b.write(i*10)
+
+        print("Current buffer occupancy: ", b.occupancy() )
+        self.assertEqual(b.occupancy(), 5)
+        for i in range(3):
+            r = b.read()
+            print("Reading from the buffer returns: ", r)
+            self.assertEqual(r, i*10)
+        print("Current buffer occupancy: ", b.occupancy() )
+        self.assertEqualC(b.occupancy())
+
+        for i in range(8):
+            b.write(i * 10)
+        print("Current buffer occupancy: ", b.occupancy())
+        self.assertEqualC(b.occupancy())
+
+        for i in range(6):
+            r = b.read()
+            print("Reading from the buffer returns: ", r)
+            self.assertEqualC(r)
+
+    def test_reset(self):
+        b = Buffer()
+
+        for i in range(5):
+            b.write(i*10)
+        print("Current buffer occupancy: ", b.occupancy() )
+        self.assertEqual(b.occupancy(), 5)
+        for i in range(3):
+            r = b.read()
+            print("Reading from the buffer returns: ", r)
+            self.assertEqual(r, i*10)
+        print("Current buffer occupancy: ", b.occupancy() )
+        self.assertEqualC(b.occupancy())
+        b.reset()
+        for i in range(8):
+            b.write(i * 10)
+        print("Current buffer occupancy: ", b.occupancy())
+        self.assertEqualC(b.occupancy())
+
+        for i in range(3):
+            r = b.read()
+            print("Reading from the buffer returns: ", r)
+            self.assertEqualC(r)
+
+class ExamMay2021(Report):
+    title = "Programming in C++: Exam May 2021"
+    pack_imports = [cpp_exam]
+    questions = [(Q1Vectors, 25), (Q2RLE, 25), (Q3Groceries, 25), (Q4FilterBuffer, 25)]
+
+if __name__ == "__main__":
+    from unitgrade import evaluate_report_student
+    evaluate_report_student(ExamMay2021())
diff --git a/examples/presentation/students/cpp_exam/tests_exam_grade.py b/examples/presentation/students/cpp_exam/tests_exam_grade.py
new file mode 100644
index 0000000000000000000000000000000000000000..6aa0d1911e814bbe3106605c7a6a01d9c5b5a669
--- /dev/null
+++ b/examples/presentation/students/cpp_exam/tests_exam_grade.py
@@ -0,0 +1,4 @@
+# cpp_exam/tests_exam.py
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors.pkl b/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..1bb470ade1775939b45fbd6f3102d136b7f49eea
Binary files /dev/null and b/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors.pkl differ
diff --git a/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors_Examples.pkl b/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors_Examples.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..51e256915163451ebd567efcb7a1039f78ae5bad
Binary files /dev/null and b/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors_Examples.pkl differ
diff --git a/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors_addFields.pkl b/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors_addFields.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..3326845c855d89d7c2fea74ac07c7a21a6d8bfdc
Binary files /dev/null and b/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors_addFields.pkl differ
diff --git a/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors_createField.pkl b/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors_createField.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..348b69dde62d9b6720650cb1e881fdea85ff77d0
Binary files /dev/null and b/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors_createField.pkl differ
diff --git a/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors_displayField.pkl b/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors_displayField.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..5361fe4e4fbbef8c5a57f45e24f5a457c423452e
Binary files /dev/null and b/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors_displayField.pkl differ
diff --git a/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors_scaleFields.pkl b/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors_scaleFields.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..f47470647432cbf04aa8ef3bf469a64d45a3712f
Binary files /dev/null and b/examples/presentation/students/cpp_exam/unitgrade_data/Q1Vectors_scaleFields.pkl differ
diff --git a/examples/presentation/students/cpp_exam/unitgrade_data/Q2RLE.pkl b/examples/presentation/students/cpp_exam/unitgrade_data/Q2RLE.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..20cb684a1956677afbd6991a2e1805751ba9b13f
Binary files /dev/null and b/examples/presentation/students/cpp_exam/unitgrade_data/Q2RLE.pkl differ
diff --git a/examples/presentation/students/cpp_exam/unitgrade_data/Q2RLE_concatenate.pkl b/examples/presentation/students/cpp_exam/unitgrade_data/Q2RLE_concatenate.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..d90a8b22d42fdfadc872470bbd7d9bb190bf2992
Binary files /dev/null and b/examples/presentation/students/cpp_exam/unitgrade_data/Q2RLE_concatenate.pkl differ
diff --git a/examples/presentation/students/cpp_exam/unitgrade_data/Q2RLE_reverse.pkl b/examples/presentation/students/cpp_exam/unitgrade_data/Q2RLE_reverse.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..b2fb05d0c12b4fdf1319747e8ed922ed2d6a3015
Binary files /dev/null and b/examples/presentation/students/cpp_exam/unitgrade_data/Q2RLE_reverse.pkl differ
diff --git a/examples/presentation/students/cpp_exam/unitgrade_data/Q2RLE_sum.pkl b/examples/presentation/students/cpp_exam/unitgrade_data/Q2RLE_sum.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..5a2393c3f39e225413d9441f4a0d43d76b80d833
Binary files /dev/null and b/examples/presentation/students/cpp_exam/unitgrade_data/Q2RLE_sum.pkl differ
diff --git a/examples/presentation/students/cpp_exam/unitgrade_data/Q3Groceries.pkl b/examples/presentation/students/cpp_exam/unitgrade_data/Q3Groceries.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..7bc62d9208bce50dc506d849658a180725a812db
Binary files /dev/null and b/examples/presentation/students/cpp_exam/unitgrade_data/Q3Groceries.pkl differ
diff --git a/examples/presentation/students/cpp_exam/unitgrade_data/Q3Groceries_add.pkl b/examples/presentation/students/cpp_exam/unitgrade_data/Q3Groceries_add.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..1b7aa58d2e66f889086a04e840df628fc67eda51
Binary files /dev/null and b/examples/presentation/students/cpp_exam/unitgrade_data/Q3Groceries_add.pkl differ
diff --git a/examples/presentation/students/cpp_exam/unitgrade_data/Q3Groceries_remove.pkl b/examples/presentation/students/cpp_exam/unitgrade_data/Q3Groceries_remove.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..d82e05e8321c1139321aa4c4b10c24b94464ad6a
Binary files /dev/null and b/examples/presentation/students/cpp_exam/unitgrade_data/Q3Groceries_remove.pkl differ
diff --git a/examples/presentation/students/cpp_exam/unitgrade_data/Q4FilterBuffer.pkl b/examples/presentation/students/cpp_exam/unitgrade_data/Q4FilterBuffer.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..46b03afee78f6a519772733cb725d16b7c852dc8
Binary files /dev/null and b/examples/presentation/students/cpp_exam/unitgrade_data/Q4FilterBuffer.pkl differ
diff --git a/examples/presentation/students/cpp_exam/unitgrade_data/Q4FilterBuffer_Group1.pkl b/examples/presentation/students/cpp_exam/unitgrade_data/Q4FilterBuffer_Group1.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..4b7982addb2bf20a1e79464dd1a3e4799d5791aa
Binary files /dev/null and b/examples/presentation/students/cpp_exam/unitgrade_data/Q4FilterBuffer_Group1.pkl differ
diff --git a/examples/presentation/students/cpp_exam/unitgrade_data/main_config_tests_exam.artifacts.pkl b/examples/presentation/students/cpp_exam/unitgrade_data/main_config_tests_exam.artifacts.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..b43d1e606afee1a7104752bf3b3d699e30cee16e
Binary files /dev/null and b/examples/presentation/students/cpp_exam/unitgrade_data/main_config_tests_exam.artifacts.pkl differ
diff --git a/examples/presentation/students/intro_python/exam.py b/examples/presentation/students/intro_python/exam.py
new file mode 100644
index 0000000000000000000000000000000000000000..02b54dc010ec0b19a666967b5b4adf2978a5cbb6
--- /dev/null
+++ b/examples/presentation/students/intro_python/exam.py
@@ -0,0 +1,99 @@
+import numpy as np
+from unitgrade import UTestCase, Report, hide
+import intro_python
+from intro_python.problems import water_height, tictactoe, time_angle, astronomical_season, standardize_address
+
+class Q1_WaterHeight(UTestCase):
+    def test1(self):
+        h0 = 5
+        r = np.array([4.5, 0, 1.5, 0, 0, 0.5, 1, 2, 5])
+        h = water_height(h0, r)
+        print("Water height computed to be", h, "should be", self.get_expected_test_value())
+        self.assertEqual(h, 3.0) # Check the height is 3.0
+
+    @hide
+    def test_water_height_hidden(self):
+        checks = [(120, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]),
+                  (12, []), (14.2, [8.8]), (0, [0.8]),
+                  (3, [0, 1, 2, 0, 0, 5.2, 6.5, 7.1, 0, 0, 0.1, 1, 2.9, 0.13, 0, 2, 0, 0]),
+                  (0, [0, 5, 2, 0, 0, 5.2, 6.5, 7.1, 0, 0, 0.1, 1, 2.9, 0.13, 0, 1.2, 0, 1.2, 7.5, 0]),
+                  (0, [0, 0, 2, 2.1, 2.4, 2.2, 2.5]), (18, [30, 1, 28.8]), (1, [0.5]), (2, [])]
+        for h0, r in checks:
+            self.assertEqualC(water_height(h0, r))
+
+class Q2_AstronomicalSeason(UTestCase):
+    def test_seasons(self):
+        season = astronomical_season('09/12-2020')
+        print("Season was computed to be", season, "it was supposed to be", self.get_expected_test_value())
+        self.assertEqualC(season)
+
+    @hide
+    def test_seasons_hidden(self):
+        for d in ['27/12-1998', '21/06-2108', '08/05-1998', '07/08-1945', '22/12-1208', '19/03-2001', '23/09-2018', '21/06-2008','12/04-1964', '13/01-1900']:
+            self.assertEqualC(astronomical_season(d))
+
+
+class Q3_TimeAngle(UTestCase):
+    def test_angle(self):
+        a = time_angle(hour=8, minute=20)
+        print("Angle was", a, "it was supposed to be", self.get_expected_test_value())
+        self.assertEqualC(a)
+
+    @hide
+    def test_angle_extended(self):
+        for minute in [0, 15, 18, 20, 34, 50, 59]:
+            for hour in [0, 1, 5, 6, 10, 12]:
+                self.assertEqualC(time_angle(hour, minute))
+
+class Q4_TicTacToe(UTestCase):
+    def test_tic_tac(self):
+        board = np.array([[2, 1, 1],
+                          [1, 1, 2],
+                          [2, 0, 0]])
+        score = tictactoe(board)
+        print("Score for board was", score, "it is supposed to be", self.get_expected_test_value())
+        self.assertEqualC(score)
+
+    @hide
+    def test_tic_tac_hidden(self):
+        boards = [[[1, 2, 0], [1, 2, 0], [1, 2, 0]],
+                  [[1, 1, 1], [2, 1, 2], [2, 2, 1]],
+                  [[2, 0, 1], [2, 1, 0], [0, 0, 2]],
+                  [[1, 0, 2], [0, 1, 0], [2, 0, 1]],
+                  [[2, 0, 1], [0, 2, 1], [0, 0, 1]],
+                  [[0, 1, 0], [0, 1, 1], [2, 2, 2]],
+                  [[1, 1, 2], [0, 2, 0], [2, 1, 0]],
+                  [[1, 1, 1], [0, 2, 0], [0, 0, 0]],
+                  [[1, 2, 1], [2, 1, 0], [2, 0, 1]],
+                  [[0, 0, 0], [0, 1, 0], [0, 0, 0]],
+                  [[2, 1, 1], [1, 1, 2], [2, 0, 0]]]
+        for board in boards:
+            self.assertEqualC(tictactoe(np.asarray(board)))
+
+
+class Q5_StandardizeAddress(UTestCase):
+    def test_standardize_address(self):
+        s = standardize_address('New York 10001')
+        print("Address computed to be", s, "was supposed to be", self.get_expected_test_value())
+        self.assertEqualC(s)
+
+    @hide
+    def test_standardize_address_hidden(self):
+        for address in ['Kongens_Lyngby_2800', '10000_Zagreb','43500 Daruvar','Egtved_6040','Vejle 7200', '02108_Boston',
+                  'Pasadena_91001', '90001_Los_Angeles', 'San_Francisco_94016', 'Rio_de_Jainero_22775']:
+            self.assertEqualC(standardize_address(address))
+
+
+
+class Exam2021(Report):
+    title = "Introduction to Python: Exam spring 2021"
+    pack_imports = [intro_python]
+    questions = [(Q1_WaterHeight, 20),
+                 (Q2_AstronomicalSeason, 20),
+                 (Q3_TimeAngle, 20),
+                 (Q4_TicTacToe, 20),
+                 (Q5_StandardizeAddress, 20)]
+
+if __name__ == "__main__":
+    from unitgrade import evaluate_report_student
+    evaluate_report_student(Exam2021())
diff --git a/examples/presentation/students/intro_python/exam_grade.py b/examples/presentation/students/intro_python/exam_grade.py
new file mode 100644
index 0000000000000000000000000000000000000000..b5478483bcc6f0eb8a174cd68889350a6681af80
--- /dev/null
+++ b/examples/presentation/students/intro_python/exam_grade.py
@@ -0,0 +1,4 @@
+# intro_python/exam.py
+''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. '''
+import bz2, base64
+exec(bz2.decompress(base64.b64decode('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')))
\ No newline at end of file
diff --git a/examples/presentation/students/intro_python/problems.py b/examples/presentation/students/intro_python/problems.py
new file mode 100644
index 0000000000000000000000000000000000000000..79d59871b998b1e7d9e6080cad8fa18f72a6f924
--- /dev/null
+++ b/examples/presentation/students/intro_python/problems.py
@@ -0,0 +1,55 @@
+import numpy as np
+
+def astronomical_season(date):
+    """ Problem 1. Given a date (as a string) return the season (as a string)
+    Hints:
+        * The date is a string in the format <dd> <mm>, for instance '18 04' is the 18th of March.
+        * The season must be a string which can be either 'winter', 'spring', 'summer' or 'autumn'.
+    """
+    # TODO: 12 lines missing.
+    raise NotImplementedError("Compute the season here.")
+    return season
+
+
+def standardize_address(address):
+    """ Given an address, return a standardized version (see question text)
+
+    Hints:
+        * The function s.isnumeric() may be of help to check if a string s is a number.
+    """
+    # TODO: 5 lines missing.
+    raise NotImplementedError("Compute the address here")
+    return s
+
+def tictactoe(board):
+    """ Given a tic-tac-toc board configuration, return whether it is valid or not.
+
+    Hints:
+        * Remember that 'board' is a numpy array. Check what the function np.all(A, axis) does.
+        * You can 'flatten' an array using A.ravel().
+    """
+    # TODO: 14 lines missing.
+    raise NotImplementedError("compute the board score (an integer, either 0, 1 or 2)")
+    return score
+
+def time_angle(hour, minute):
+    """ Given hours and minutes (integers), return the angle of the small hand.
+
+    Hints:
+        * The angle is between 0 and 360.
+        * Noon and midnight, 12:00 and 24:00, is both 0
+        * Use % for remainder. For instance 8 % 5 is 2 and 24 % 10 = 4 (see lecture notes)
+    """
+    # TODO: 6 lines missing.
+    raise NotImplementedError("Compute the angle of the small hand here")
+    return a
+
+def water_height(h0, r):
+    """ Problem 1: Compute the water height.
+
+    Hints:
+        * Remember the height must be a non-negative number.
+    """
+    # TODO: 3 lines missing.
+    raise NotImplementedError("Compute the water height h here.")
+    return h
diff --git a/examples/presentation/students/intro_python/unitgrade_data/Problem1.pkl b/examples/presentation/students/intro_python/unitgrade_data/Problem1.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..15baef336eff2b1034fdb3e6def2a77b7b19b5ac
Binary files /dev/null and b/examples/presentation/students/intro_python/unitgrade_data/Problem1.pkl differ
diff --git a/examples/presentation/students/intro_python/unitgrade_data/Q1_WaterHeight.pkl b/examples/presentation/students/intro_python/unitgrade_data/Q1_WaterHeight.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..959b3da92d0109166386114384e2283c87bb0c86
Binary files /dev/null and b/examples/presentation/students/intro_python/unitgrade_data/Q1_WaterHeight.pkl differ
diff --git a/examples/presentation/students/intro_python/unitgrade_data/Q2_AstronomicalSeason.pkl b/examples/presentation/students/intro_python/unitgrade_data/Q2_AstronomicalSeason.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..ded5dd0d2b52198997ef58794fc3ffaec0fe37b7
Binary files /dev/null and b/examples/presentation/students/intro_python/unitgrade_data/Q2_AstronomicalSeason.pkl differ
diff --git a/examples/presentation/students/intro_python/unitgrade_data/Q3_TimeAngle.pkl b/examples/presentation/students/intro_python/unitgrade_data/Q3_TimeAngle.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..50090e6cc4db269029576997d4da40c4176dd3c2
Binary files /dev/null and b/examples/presentation/students/intro_python/unitgrade_data/Q3_TimeAngle.pkl differ
diff --git a/examples/presentation/students/intro_python/unitgrade_data/Q4_TicTacToe.pkl b/examples/presentation/students/intro_python/unitgrade_data/Q4_TicTacToe.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..8c6eb03977b19b14b4341b68c8a96b0b1baa5808
Binary files /dev/null and b/examples/presentation/students/intro_python/unitgrade_data/Q4_TicTacToe.pkl differ
diff --git a/examples/presentation/students/intro_python/unitgrade_data/Q5_StandardizeAddress.pkl b/examples/presentation/students/intro_python/unitgrade_data/Q5_StandardizeAddress.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..e013c45a0f8b0e56fbf974cd7ff8bba3583dfe5d
Binary files /dev/null and b/examples/presentation/students/intro_python/unitgrade_data/Q5_StandardizeAddress.pkl differ
diff --git a/examples/presentation/students/intro_python/unitgrade_data/main_config_exam.artifacts.pkl b/examples/presentation/students/intro_python/unitgrade_data/main_config_exam.artifacts.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..e45319db9112fdae5426c258ccf3b595dcb2df0f
Binary files /dev/null and b/examples/presentation/students/intro_python/unitgrade_data/main_config_exam.artifacts.pkl differ
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/01.Tests - example/ex01-main.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/01.Tests - example/ex01-main.ans
new file mode 100644
index 0000000000000000000000000000000000000000..8bae553ea99de802f41aec5ed5b503c5d7afa538
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/01.Tests - example/ex01-main.ans	
@@ -0,0 +1,19 @@
+Vector field A:
+(1,2) (1,2) (1,2)
+(1,2) (2,2) (1,2)
+(1,2) (1,2) (1,2)
+
+Vector field B:
+(9,8) (2,-2) (2,-2)
+(2,-2) (2,-2) (2,-2)
+(2,-2) (2,-2) (9,8)
+
+Result of A + B:
+(10,10) (3,0) (3,0)
+(3,0) (4,0) (3,0)
+(3,0) (3,0) (10,10)
+
+Result of scaling A by 2:
+(2,4) (2,4) (2,4)
+(2,4) (4,4) (2,4)
+(2,4) (2,4) (2,4)
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/01.Tests - example/ex01-main.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/01.Tests - example/ex01-main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2219761963ad1cb6939c840baeccb8711070ccef
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/01.Tests - example/ex01-main.cpp	
@@ -0,0 +1,34 @@
+#include <iostream>
+#include "ex01-library.h"
+using namespace std;
+
+int main() {
+    Vector c = {1, 2};
+    Vector d = {2, -2};
+
+    Vector **A = createField(3, 3, c);
+    A[1][1] = {2, 2};
+    cout << "Vector field A:" << endl;
+    displayField(A, 3, 3);
+    cout << endl;
+
+    Vector **B = createField(3, 3, d);
+    B[0][0] = B[2][2] = {9, 8};
+    cout << "Vector field B:" << endl;
+    displayField(B, 3, 3);
+    cout << endl;
+
+    Vector **R = createField(3, 3, {0,0});
+    cout << "Result of A + B:" << endl;
+    addFields(A, B, R, 3, 3);
+    displayField(R, 3, 3);
+    cout << endl;
+
+    cout << "Result of scaling A by 2:" << endl;
+    scaleField(A, 2, 3, 3);
+    displayField(A, 3, 3);
+
+    deleteField(A, 3); deleteField(B, 3);
+    deleteField(R, 3);
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/01.Tests - example/overwrites/ex01-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/01.Tests - example/overwrites/ex01-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..bd131b135c6a448ac477ccf9279ab12fd3a3c366
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/01.Tests - example/overwrites/ex01-library.h	
@@ -0,0 +1,16 @@
+#ifndef EX01_LIBRARY_H_
+#define EX01_LIBRARY_H_
+
+struct Vector {
+    double x;
+    double y;
+};
+
+Vector **createField(unsigned int m, unsigned int n, Vector v);
+void displayField(Vector **A, unsigned int m, unsigned int n);
+void addFields(Vector **A, Vector **B, Vector **C,
+               unsigned int m, unsigned int n);
+void scaleField(Vector **A, double c, unsigned int m, unsigned int n);
+void deleteField(Vector **A, unsigned int nRows);
+
+#endif /* EX01_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/01.Tests - example/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/01.Tests - example/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0f31cb4818945ba9470772ab85cb853ef78a6bce
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/01.Tests - example/testgroup.yml	
@@ -0,0 +1,4 @@
+name: Tests - example
+onTestGroupFailure: Continue
+feedback: Full
+onTestFailure: Continue
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/02.Tests - task (a)/ex01-test-a.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/02.Tests - task (a)/ex01-test-a.ans
new file mode 100644
index 0000000000000000000000000000000000000000..ba6d4a21b84cc3663ce63edf10e8ebe84760d060
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/02.Tests - task (a)/ex01-test-a.ans	
@@ -0,0 +1,9 @@
+A[0][0] = (1,2)
+A[3][0] = (1,2)
+A[0][3] = (1,2)
+A[3][3] = (1,2)
+
+B[1][2] = (3,9)
+B[2][5] = (3,9)
+B[4][6] = (3,9)
+B[7][7] = (3,9)
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/02.Tests - task (a)/ex01-test-a.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/02.Tests - task (a)/ex01-test-a.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..11696ec03bbaf87c7d505cccec1cd9f17fea063b
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/02.Tests - task (a)/ex01-test-a.cpp	
@@ -0,0 +1,26 @@
+#include <iostream>
+#include <string>
+#include "ex01-library.h"
+
+using namespace std;
+
+int main() {
+    Vector v = {1, 2};
+    Vector **A = createField(4, 4, v);
+    cout << "A[0][0] = (" << A[0][0].x << "," << A[0][0].y << ")" << endl;
+    cout << "A[3][0] = (" << A[3][0].x << "," << A[3][0].y << ")" << endl;
+    cout << "A[0][3] = (" << A[0][3].x << "," << A[0][3].y << ")" << endl;
+    cout << "A[3][3] = (" << A[3][3].x << "," << A[3][3].y << ")" << endl;
+
+    cout << endl;
+    
+    Vector v2 = {3, 9};
+    Vector **B = createField(8, 8, v2);
+    cout << "B[1][2] = (" << B[1][2].x << "," << B[1][2].y << ")" << endl;
+    cout << "B[2][5] = (" << B[2][5].x << "," << B[2][5].y << ")" << endl;
+    cout << "B[4][6] = (" << B[4][6].x << "," << B[4][6].y << ")" << endl;
+    cout << "B[7][7] = (" << B[7][7].x << "," << B[7][7].y << ")" << endl;
+
+    deleteField(A, 4); deleteField(B, 3);
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/02.Tests - task (a)/overwrites/ex01-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/02.Tests - task (a)/overwrites/ex01-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..bd131b135c6a448ac477ccf9279ab12fd3a3c366
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/02.Tests - task (a)/overwrites/ex01-library.h	
@@ -0,0 +1,16 @@
+#ifndef EX01_LIBRARY_H_
+#define EX01_LIBRARY_H_
+
+struct Vector {
+    double x;
+    double y;
+};
+
+Vector **createField(unsigned int m, unsigned int n, Vector v);
+void displayField(Vector **A, unsigned int m, unsigned int n);
+void addFields(Vector **A, Vector **B, Vector **C,
+               unsigned int m, unsigned int n);
+void scaleField(Vector **A, double c, unsigned int m, unsigned int n);
+void deleteField(Vector **A, unsigned int nRows);
+
+#endif /* EX01_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/02.Tests - task (a)/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/02.Tests - task (a)/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7bb02ec4f06cb63db4dd2fcdae44210ab8619333
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/02.Tests - task (a)/testgroup.yml	
@@ -0,0 +1,3 @@
+name: Tests - task (a)
+onTestGroupFailure: Continue
+feedback: Full
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/03.Tests - task (b)/ex01-test-b.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/03.Tests - task (b)/ex01-test-b.ans
new file mode 100644
index 0000000000000000000000000000000000000000..8cb90c83fb151a1307de5d2115a31312a7077313
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/03.Tests - task (b)/ex01-test-b.ans	
@@ -0,0 +1,11 @@
+(0,0) (1,2) (1,2)
+(1,2) (0,0) (1,2)
+(1,2) (1,2) (0,0)
+(1,2) (1,2) (1,2)
+
+(3,-9) (0,0) (3,-9) (3,-9) (3,-9) (3,-9) (3,-9) (3,-9)
+(3,-9) (3,-9) (3,-9) (3,-9) (3,-9) (3,-9) (3,-9) (3,-9)
+(3,-9) (0,0) (3,-9) (3,-9) (3,-9) (3,-9) (3,-9) (3,-9)
+(3,-9) (3,-9) (0,0) (3,-9) (3,-9) (3,-9) (3,-9) (3,-9)
+(3,-9) (3,-9) (3,-9) (3,-9) (3,-9) (0,0) (3,-9) (3,-9)
+(3,-9) (3,-9) (3,-9) (3,-9) (3,-9) (3,-9) (0,0) (3,-9)
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/03.Tests - task (b)/ex01-test-b.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/03.Tests - task (b)/ex01-test-b.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f0090cea2757362eca1efc3a639149a2377130f9
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/03.Tests - task (b)/ex01-test-b.cpp	
@@ -0,0 +1,51 @@
+#include <iostream>
+#include <string>
+#include "ex01-library.h"
+
+using namespace std;
+
+// %%%CJ_HIDE_START%%%
+Vector **__02393_createField(unsigned int m, unsigned int n, Vector v) {
+    // Write your code here
+    Vector **A = new Vector*[m];
+    for (unsigned int i = 0; i < m; i++) {
+        A[i] = new Vector[n];
+        for (unsigned int j = 0; j < n; j++) {
+            A[i][j] = v;
+        }
+    }
+    return A;
+}
+// %%%CJ_HIDE_END%%%
+int main() {
+    Vector v = {1, 2};
+    Vector **A = nullptr;
+
+    // HIDDEN CODE that allocates matrix A.  If you have completed task (a),
+    // you can run this code on your computer by uncommenting the line:  
+    // A = createField(4, 3, v);
+    // %%%CJ_HIDE_START%%%
+    A = __02393_createField(4, 3, v);
+    // %%%CJ_HIDE_END%%%
+
+    A[0][0] = A[1][1] = A[2][2] = {0, 0};
+    displayField(A, 4, 3);
+
+    cout << endl;
+
+    Vector d = {3, -9};
+    Vector **B = nullptr;
+
+    // HIDDEN CODE that allocates matrix B.  If you have completed task (a),
+    // you can run this code on your computer by uncommenting the line:  
+    // B = createField(6, 8, d);
+    // %%%CJ_HIDE_START%%%
+    B = __02393_createField(6, 8, d);
+    // %%%CJ_HIDE_END%%%
+
+    B[0][1] = B[2][1] = B[3][2] = B[4][5] = B[5][6] = {0, 0};
+    displayField(B, 6, 8);
+
+    deleteField(A, 4); deleteField(B, 6);
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/03.Tests - task (b)/overwrites/ex01-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/03.Tests - task (b)/overwrites/ex01-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..bd131b135c6a448ac477ccf9279ab12fd3a3c366
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/03.Tests - task (b)/overwrites/ex01-library.h	
@@ -0,0 +1,16 @@
+#ifndef EX01_LIBRARY_H_
+#define EX01_LIBRARY_H_
+
+struct Vector {
+    double x;
+    double y;
+};
+
+Vector **createField(unsigned int m, unsigned int n, Vector v);
+void displayField(Vector **A, unsigned int m, unsigned int n);
+void addFields(Vector **A, Vector **B, Vector **C,
+               unsigned int m, unsigned int n);
+void scaleField(Vector **A, double c, unsigned int m, unsigned int n);
+void deleteField(Vector **A, unsigned int nRows);
+
+#endif /* EX01_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/03.Tests - task (b)/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/03.Tests - task (b)/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..05676bf5dc65a42cff635871efe35e2401a7257e
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/03.Tests - task (b)/testgroup.yml	
@@ -0,0 +1,3 @@
+name: Tests - task (b)
+onTestGroupFailure: Continue
+feedback: Full
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/04.Tests - task (c)/ex01-test-c.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/04.Tests - task (c)/ex01-test-c.ans
new file mode 100644
index 0000000000000000000000000000000000000000..2d9805fe9f821528d0b3dbf5958e0324f205add4
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/04.Tests - task (c)/ex01-test-c.ans	
@@ -0,0 +1,4 @@
+M[0][0] = (4,6)
+M[0][1] = (4,6)
+M[1][0] = (4,6)
+M[1][2] = (4,6)
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/04.Tests - task (c)/ex01-test-c.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/04.Tests - task (c)/ex01-test-c.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..097a543cf88ec6edeab63fe5a5cddc693fc5cd5a
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/04.Tests - task (c)/ex01-test-c.cpp	
@@ -0,0 +1,46 @@
+#include <iostream>
+#include <string>
+#include "ex01-library.h"
+
+using namespace std;
+
+// %%%CJ_HIDE_START%%%
+Vector **__02393_createField(unsigned int m, unsigned int n, Vector v) {
+    // Write your code here
+    Vector **A = new Vector*[m];
+    for (unsigned int i = 0; i < m; i++) {
+        A[i] = new Vector[n];
+        for (unsigned int j = 0; j < n; j++) {
+            A[i][j] = v;
+        }
+    }
+    return A;
+}
+// %%%CJ_HIDE_END%%%
+int main() {
+    Vector u = {1, 2};
+    Vector v = {3, 4};
+    Vector **A = nullptr, **B = nullptr, **M = nullptr;
+
+    // HIDDEN CODE that allocates matrices A, B, and N.
+    // If you have completed task (a), you can run this code on your computer
+    // by uncommenting the lines:
+    // A = createField(2, 3, u);
+    // B = createField(2, 3, v);
+    // M = createField(2, 3, {0,0});
+    // %%%CJ_HIDE_START%%%
+    A = __02393_createField(2, 3, u);
+    B = __02393_createField(2, 3, v);
+    M = __02393_createField(2, 3, {0,0});
+    // %%%CJ_HIDE_END%%%
+
+    addFields(A, B, M, 2, 3);
+
+    cout << "M[0][0] = (" << M[0][0].x << "," << M[0][0].y << ")" << endl;
+    cout << "M[0][1] = (" << M[0][1].x << "," << M[0][1].y << ")" << endl;
+    cout << "M[1][0] = (" << M[1][0].x << "," << M[1][0].y << ")" << endl;
+    cout << "M[1][2] = (" << M[1][2].x << "," << M[1][2].y << ")" << endl;
+
+    deleteField(A, 3); deleteField(B, 3); deleteField(M, 3);
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/04.Tests - task (c)/overwrites/ex01-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/04.Tests - task (c)/overwrites/ex01-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..bd131b135c6a448ac477ccf9279ab12fd3a3c366
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/04.Tests - task (c)/overwrites/ex01-library.h	
@@ -0,0 +1,16 @@
+#ifndef EX01_LIBRARY_H_
+#define EX01_LIBRARY_H_
+
+struct Vector {
+    double x;
+    double y;
+};
+
+Vector **createField(unsigned int m, unsigned int n, Vector v);
+void displayField(Vector **A, unsigned int m, unsigned int n);
+void addFields(Vector **A, Vector **B, Vector **C,
+               unsigned int m, unsigned int n);
+void scaleField(Vector **A, double c, unsigned int m, unsigned int n);
+void deleteField(Vector **A, unsigned int nRows);
+
+#endif /* EX01_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/04.Tests - task (c)/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/04.Tests - task (c)/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a98ad2bd57a77f42fbde86f2b444ea90fcc261c0
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/04.Tests - task (c)/testgroup.yml	
@@ -0,0 +1,3 @@
+name: Tests - task (c)
+onTestGroupFailure: Continue
+feedback: Full
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/05.Tests - task (d)/ex01-test-d.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/05.Tests - task (d)/ex01-test-d.ans
new file mode 100644
index 0000000000000000000000000000000000000000..c69540bac9498ed90dee19e5ee222b55ba233d6e
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/05.Tests - task (d)/ex01-test-d.ans	
@@ -0,0 +1,9 @@
+A[0][0] = (2,4)
+A[0][1] = (2,4)
+A[1][0] = (2,4)
+A[1][2] = (2,4)
+
+B[0][0] = (9,3)
+B[0][1] = (9,3)
+B[1][3] = (9,3)
+B[5][5] = (9,3)
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/05.Tests - task (d)/ex01-test-d.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/05.Tests - task (d)/ex01-test-d.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0488cec4aab3ecf1177065776d6757f2cd4e70d9
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/05.Tests - task (d)/ex01-test-d.cpp	
@@ -0,0 +1,53 @@
+#include <iostream>
+#include <string>
+#include "ex01-library.h"
+
+using namespace std;
+
+// %%%CJ_HIDE_START%%%
+Vector **__02393_createField(unsigned int m, unsigned int n, Vector v) {
+    // Write your code here
+    Vector **A = new Vector*[m];
+    for (unsigned int i = 0; i < m; i++) {
+        A[i] = new Vector[n];
+        for (unsigned int j = 0; j < n; j++) {
+            A[i][j] = v;
+        }
+    }
+    return A;
+}
+// %%%CJ_HIDE_END%%%
+int main() {
+    Vector u = {1, 2};
+    Vector v = {3, 1};
+    Vector **A = nullptr, **B = nullptr;
+
+    // HIDDEN CODE that allocates matrices A, B, and N.
+    // If you have completed task (a), you can run this code on your computer
+    // by uncommenting the lines:
+    // A = createField(2, 3, u);
+    // B = createField(6, 6, v);
+    // %%%CJ_HIDE_START%%%
+    A = __02393_createField(2, 3, u);
+    B = __02393_createField(6, 6, v);
+    // %%%CJ_HIDE_END%%%
+
+    scaleField(A, 2, 2, 3);
+
+    cout << "A[0][0] = (" << A[0][0].x << "," << A[0][0].y << ")" << endl;
+    cout << "A[0][1] = (" << A[0][1].x << "," << A[0][1].y << ")" << endl;
+    cout << "A[1][0] = (" << A[1][0].x << "," << A[1][0].y << ")" << endl;
+    cout << "A[1][2] = (" << A[1][2].x << "," << A[1][2].y << ")" << endl;
+
+    cout << endl;
+    
+    scaleField(B, 3, 6, 6);
+
+    cout << "B[0][0] = (" << B[0][0].x << "," << B[0][0].y << ")" << endl;
+    cout << "B[0][1] = (" << B[0][1].x << "," << B[0][1].y << ")" << endl;
+    cout << "B[1][3] = (" << B[1][3].x << "," << B[1][3].y << ")" << endl;
+    cout << "B[5][5] = (" << B[5][5].x << "," << B[5][5].y << ")" << endl;
+
+    deleteField(A, 3); deleteField(B, 6);
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/05.Tests - task (d)/overwrites/ex01-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/05.Tests - task (d)/overwrites/ex01-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..bd131b135c6a448ac477ccf9279ab12fd3a3c366
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/05.Tests - task (d)/overwrites/ex01-library.h	
@@ -0,0 +1,16 @@
+#ifndef EX01_LIBRARY_H_
+#define EX01_LIBRARY_H_
+
+struct Vector {
+    double x;
+    double y;
+};
+
+Vector **createField(unsigned int m, unsigned int n, Vector v);
+void displayField(Vector **A, unsigned int m, unsigned int n);
+void addFields(Vector **A, Vector **B, Vector **C,
+               unsigned int m, unsigned int n);
+void scaleField(Vector **A, double c, unsigned int m, unsigned int n);
+void deleteField(Vector **A, unsigned int nRows);
+
+#endif /* EX01_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/05.Tests - task (d)/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/05.Tests - task (d)/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1a74a19d3ff3fe273263dcb0c2ff86cd37b410a5
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/05.Tests - task (d)/testgroup.yml	
@@ -0,0 +1,3 @@
+name: Tests - task (d)
+onTestGroupFailure: Continue
+feedback: Full
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/exercise.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/exercise.yml
new file mode 100644
index 0000000000000000000000000000000000000000..749d46ceb16e672f124f96702137afc29853fb1f
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/01.Exercise 1. Vector Fields/exercise.yml	
@@ -0,0 +1,6 @@
+name: Exercise 1. Vector Fields
+suggestedSolutionVisibility: AfterSolved
+languages: 1
+description: See details on the May 2021 reexam paper.
+customSuggestedSolution: ''
+onTestFailure: Continue
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/01.Tests - example/ex01-main.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/01.Tests - example/ex01-main.ans
new file mode 100644
index 0000000000000000000000000000000000000000..3f6a84b2766d49310dbc72ccedcbc35fba06ed3f
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/01.Tests - example/ex01-main.ans	
@@ -0,0 +1,7 @@
+The RLE list is: 
+ 4 (x10) 12 (x6) 10 (x5)
+The reversed list is:
+ 10 (x5) 12 (x6) 4 (x10)
+After concatenation, the list is:
+ 10 (x5) 12 (x6) 4 (x10) 101 (x9) 4 (x3) 100 (x7)
+The sum of its elements is: 1783
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/01.Tests - example/ex01-main.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/01.Tests - example/ex01-main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e1aae6b94689069f3ac885b01869405de12475d8
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/01.Tests - example/ex01-main.cpp	
@@ -0,0 +1,32 @@
+#include <iostream>
+#include "ex02-library.h"
+using namespace std;
+
+int main() {
+    Elem e0 = {10, 5, nullptr};
+    Elem e1 = {12, 6, &e0};
+    Elem e2 = {4, 10, &e1};
+
+    Elem e4 = {100, 7, nullptr};
+    Elem e5 = {4,   3, &e4};
+    Elem e6 = {101, 9, &e5};
+    
+    cout << "The RLE list is: " << endl;
+    displayRLEList(&e2);
+    cout << endl;
+
+    cout << "The reversed list is:" << endl;
+    Elem *r = reverse(&e2);
+    displayRLEList(r);
+
+    cout << endl;
+
+    cout << "After concatenation, the list is:" << endl;
+    Elem *l = concatenate(r, &e6);
+    displayRLEList(l);
+    cout << endl;
+
+    cout << "The sum of its elements is: " << sum(l) << endl;
+    
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/01.Tests - example/overwrites/ex02-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/01.Tests - example/overwrites/ex02-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..d5bf2f612324a91d34074a389aa195e40466ceb8
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/01.Tests - example/overwrites/ex02-library.h	
@@ -0,0 +1,16 @@
+#ifndef EX02_LIBRARY_H_
+#define EX02_LIBRARY_H_
+
+struct Elem {
+    int value;
+    unsigned int times; // Number of repetitions
+    Elem *next;
+};
+
+void displayRLEList(Elem *list);
+
+Elem* reverse(Elem *list);
+Elem* concatenate(Elem *list1, Elem *list2);
+int sum(Elem *list);
+
+#endif /* EX02_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/01.Tests - example/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/01.Tests - example/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0f31cb4818945ba9470772ab85cb853ef78a6bce
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/01.Tests - example/testgroup.yml	
@@ -0,0 +1,4 @@
+name: Tests - example
+onTestGroupFailure: Continue
+feedback: Full
+onTestFailure: Continue
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/02.Tests - task (a)/ex02-test-a.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/02.Tests - task (a)/ex02-test-a.ans
new file mode 100644
index 0000000000000000000000000000000000000000..6ec5ae8b4f367625d373a7ecda80c9ebafd338d2
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/02.Tests - task (a)/ex02-test-a.ans	
@@ -0,0 +1,3 @@
+Reverse of an empty RLE list: 
+Reverse of RLE list starting with e0: 10 (x5)
+Reverse of RLE list starting with e2: 10 (x5) 12 (x6) 4 (x10)
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/02.Tests - task (a)/ex02-test-a.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/02.Tests - task (a)/ex02-test-a.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4f2b4add1d979a21defe6f02973403e9643a56b4
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/02.Tests - task (a)/ex02-test-a.cpp	
@@ -0,0 +1,23 @@
+#include <iostream>
+#include <string>
+#include "ex02-library.h"
+
+using namespace std;
+
+int main() {
+    Elem e0 = {10, 5, nullptr};
+    Elem e1 = {12, 6, &e0};
+    Elem e2 = {4, 10, &e1};
+
+    cout << "Reverse of an empty RLE list: ";
+    displayRLEList(reverse(nullptr));
+
+    cout << endl << "Reverse of RLE list starting with e0:";
+    displayRLEList(reverse(&e0));
+
+    cout << endl << "Reverse of RLE list starting with e2:";
+    displayRLEList(reverse(&e2));
+    cout << endl;
+
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/02.Tests - task (a)/overwrites/ex02-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/02.Tests - task (a)/overwrites/ex02-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..d5bf2f612324a91d34074a389aa195e40466ceb8
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/02.Tests - task (a)/overwrites/ex02-library.h	
@@ -0,0 +1,16 @@
+#ifndef EX02_LIBRARY_H_
+#define EX02_LIBRARY_H_
+
+struct Elem {
+    int value;
+    unsigned int times; // Number of repetitions
+    Elem *next;
+};
+
+void displayRLEList(Elem *list);
+
+Elem* reverse(Elem *list);
+Elem* concatenate(Elem *list1, Elem *list2);
+int sum(Elem *list);
+
+#endif /* EX02_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/02.Tests - task (a)/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/02.Tests - task (a)/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4a07b238640fc76c7020c83aba639a61b337bf98
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/02.Tests - task (a)/testgroup.yml	
@@ -0,0 +1,4 @@
+name: Tests - task (a)
+onTestGroupFailure: Continue
+feedback: Full
+onTestFailure: Break
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/03.Tests - task (b)/ex02-test-b.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/03.Tests - task (b)/ex02-test-b.ans
new file mode 100644
index 0000000000000000000000000000000000000000..a420b72c30a8415ce7843fde15f70fccbe0fad4d
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/03.Tests - task (b)/ex02-test-b.ans	
@@ -0,0 +1,10 @@
+Initial list:
+ 1 (x9) 2 (x6) 3 (x5)
+Result of concatenation with an empty list (1):
+ 1 (x9) 2 (x6) 3 (x5)
+Result of concatenation with an empty list (2):
+ 1 (x9) 2 (x6) 3 (x5)
+Result of concatenation with e6:
+ 1 (x9) 2 (x6) 3 (x5) 4 (x2) 5 (x3) 6 (x7)
+Result of concatenation with e9:
+ 1 (x9) 2 (x6) 3 (x5) 4 (x2) 5 (x3) 6 (x10) 7 (x5) 8 (x5)
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/03.Tests - task (b)/ex02-test-b.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/03.Tests - task (b)/ex02-test-b.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c84407890434a95f731567488e3aff1e2cf76e9d
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/03.Tests - task (b)/ex02-test-b.cpp	
@@ -0,0 +1,45 @@
+#include <iostream>
+#include <string>
+#include "ex02-library.h"
+
+using namespace std;
+
+int main() {
+    Elem e0 = {3, 5, nullptr};
+    Elem e1 = {2, 6, &e0};
+    Elem e2 = {1, 9, &e1};
+
+    Elem e4 = {6, 7, nullptr};
+    Elem e5 = {5, 3, &e4};
+    Elem e6 = {4, 2, &e5};
+
+    Elem e7 = {8, 5, nullptr};
+    Elem e8 = {7, 5, &e7};
+    Elem e9 = {6, 3, &e8};
+
+    cout << "Initial list:" << endl;
+    displayRLEList(&e2);
+    cout << endl;
+
+    cout << "Result of concatenation with an empty list (1):" << endl;
+    Elem *c0 = concatenate(nullptr, &e2);
+    displayRLEList(c0);
+    cout << endl;
+
+    cout << "Result of concatenation with an empty list (2):" << endl;
+    Elem *c1 = concatenate(c0, nullptr);
+    displayRLEList(c1);
+    cout << endl;
+
+    cout << "Result of concatenation with e6:" << endl;
+    Elem *c2 = concatenate(c1, &e6);
+    displayRLEList(c2);
+    cout << endl;
+
+    cout << "Result of concatenation with e9:" << endl;
+    Elem *c3 = concatenate(c2, &e9);
+    displayRLEList(c3);
+    cout << endl;
+
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/03.Tests - task (b)/overwrites/ex02-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/03.Tests - task (b)/overwrites/ex02-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..d5bf2f612324a91d34074a389aa195e40466ceb8
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/03.Tests - task (b)/overwrites/ex02-library.h	
@@ -0,0 +1,16 @@
+#ifndef EX02_LIBRARY_H_
+#define EX02_LIBRARY_H_
+
+struct Elem {
+    int value;
+    unsigned int times; // Number of repetitions
+    Elem *next;
+};
+
+void displayRLEList(Elem *list);
+
+Elem* reverse(Elem *list);
+Elem* concatenate(Elem *list1, Elem *list2);
+int sum(Elem *list);
+
+#endif /* EX02_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/03.Tests - task (b)/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/03.Tests - task (b)/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..05676bf5dc65a42cff635871efe35e2401a7257e
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/03.Tests - task (b)/testgroup.yml	
@@ -0,0 +1,3 @@
+name: Tests - task (b)
+onTestGroupFailure: Continue
+feedback: Full
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/04.Tests - task (c)/ex02-test-c.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/04.Tests - task (c)/ex02-test-c.ans
new file mode 100644
index 0000000000000000000000000000000000000000..c7c349e95466d678b1dfbab86e9d8fe31603f79f
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/04.Tests - task (c)/ex02-test-c.ans	
@@ -0,0 +1,4 @@
+The sum of the elements of an empty list is: 0
+The sum of the elements of e0 is: 50
+The sum of the elements of e1 is: 122
+The sum of the elements of e2 is: 162
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/04.Tests - task (c)/ex02-test-c.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/04.Tests - task (c)/ex02-test-c.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..221c0c99a8f2a953ebb594be02769536eb3a4343
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/04.Tests - task (c)/ex02-test-c.cpp	
@@ -0,0 +1,22 @@
+#include <iostream>
+#include <string>
+#include "ex02-library.h"
+
+using namespace std;
+
+int main() {
+    Elem e0 = {10, 5, nullptr};
+    Elem e1 = {12, 6, &e0};
+    Elem e2 = {4, 10, &e1};
+
+    cout << "The sum of the elements of an empty list is: " << sum(nullptr);
+    cout << endl;
+
+    cout << "The sum of the elements of e0 is: " << sum(&e0) << endl;
+
+    cout << "The sum of the elements of e1 is: " << sum(&e1) << endl;
+
+    cout << "The sum of the elements of e2 is: " << sum(&e2) << endl;
+
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/04.Tests - task (c)/overwrites/ex02-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/04.Tests - task (c)/overwrites/ex02-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..d5bf2f612324a91d34074a389aa195e40466ceb8
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/04.Tests - task (c)/overwrites/ex02-library.h	
@@ -0,0 +1,16 @@
+#ifndef EX02_LIBRARY_H_
+#define EX02_LIBRARY_H_
+
+struct Elem {
+    int value;
+    unsigned int times; // Number of repetitions
+    Elem *next;
+};
+
+void displayRLEList(Elem *list);
+
+Elem* reverse(Elem *list);
+Elem* concatenate(Elem *list1, Elem *list2);
+int sum(Elem *list);
+
+#endif /* EX02_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/04.Tests - task (c)/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/04.Tests - task (c)/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a98ad2bd57a77f42fbde86f2b444ea90fcc261c0
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/04.Tests - task (c)/testgroup.yml	
@@ -0,0 +1,3 @@
+name: Tests - task (c)
+onTestGroupFailure: Continue
+feedback: Full
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/exercise.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/exercise.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2132df367447b4d3593d5761624f6fce1eb2a613
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02.Exercise 2. RLE Linked List/exercise.yml	
@@ -0,0 +1,5 @@
+name: Exercise 2. RLE Linked List
+suggestedSolutionVisibility: AfterSolved
+languages: 1
+description: See details on the May 2021 reexam paper.
+customSuggestedSolution: ''
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex01/ex01-library.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex01/ex01-library.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7ab7ee5c948f7f5fb31b4ebe1c741d28840689ba
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex01/ex01-library.cpp
@@ -0,0 +1,34 @@
+#include <iostream>
+#include "ex01-library.h"
+
+using namespace std;
+
+// Task 1(a).  Implement this function
+Vector **createField(unsigned int m, unsigned int n, Vector v) {
+    // Write your code here
+}
+
+// Task 1(b).  Implement this function
+void displayField(Vector **A, unsigned int m, unsigned int n) {
+    // Write your code here
+}
+
+// Task 1(c).  Implement this function
+void addFields(Vector **A, Vector **B, Vector **C,
+               unsigned int m, unsigned int n) {
+    // Write your code here
+}
+
+// Task 1(d).  Implement this function
+void scaleField(Vector **A, double c,
+                unsigned int m, unsigned int n) {
+    // Write your code here
+}
+
+// Do not modify
+void deleteField(Vector **A, unsigned int nRows) {
+    for (unsigned int i = 0; i < nRows; ++i) {
+        delete[] A[i];
+    }
+    delete[] A;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex01/ex01-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex01/ex01-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..bd131b135c6a448ac477ccf9279ab12fd3a3c366
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex01/ex01-library.h
@@ -0,0 +1,16 @@
+#ifndef EX01_LIBRARY_H_
+#define EX01_LIBRARY_H_
+
+struct Vector {
+    double x;
+    double y;
+};
+
+Vector **createField(unsigned int m, unsigned int n, Vector v);
+void displayField(Vector **A, unsigned int m, unsigned int n);
+void addFields(Vector **A, Vector **B, Vector **C,
+               unsigned int m, unsigned int n);
+void scaleField(Vector **A, double c, unsigned int m, unsigned int n);
+void deleteField(Vector **A, unsigned int nRows);
+
+#endif /* EX01_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex01/ex01-main.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex01/ex01-main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2219761963ad1cb6939c840baeccb8711070ccef
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex01/ex01-main.cpp
@@ -0,0 +1,34 @@
+#include <iostream>
+#include "ex01-library.h"
+using namespace std;
+
+int main() {
+    Vector c = {1, 2};
+    Vector d = {2, -2};
+
+    Vector **A = createField(3, 3, c);
+    A[1][1] = {2, 2};
+    cout << "Vector field A:" << endl;
+    displayField(A, 3, 3);
+    cout << endl;
+
+    Vector **B = createField(3, 3, d);
+    B[0][0] = B[2][2] = {9, 8};
+    cout << "Vector field B:" << endl;
+    displayField(B, 3, 3);
+    cout << endl;
+
+    Vector **R = createField(3, 3, {0,0});
+    cout << "Result of A + B:" << endl;
+    addFields(A, B, R, 3, 3);
+    displayField(R, 3, 3);
+    cout << endl;
+
+    cout << "Result of scaling A by 2:" << endl;
+    scaleField(A, 2, 3, 3);
+    displayField(A, 3, 3);
+
+    deleteField(A, 3); deleteField(B, 3);
+    deleteField(R, 3);
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex02/ex02-library.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex02/ex02-library.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..085d968c671ea3861adf13f710927f54acbf4d44
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex02/ex02-library.cpp
@@ -0,0 +1,27 @@
+#include <iostream>
+#include "ex02-library.h"
+using namespace std;
+
+// Task 2(a).  Implement this function
+Elem* reverse(Elem *list) {
+    // Write your code here
+}
+
+// Task 2(b).  Implement this function
+Elem* concatenate(Elem *list1, Elem *list2) {
+    // Write your code here
+}
+
+// Task 2(c).  Implement this function
+int sum(Elem *list) {
+    // Write your code here
+}
+
+// Do not modify
+void displayRLEList(Elem *list) {
+    if (list == nullptr) {
+        return;
+    }
+    cout << " " << list->value << " (x" << list->times << ")";
+    displayRLEList(list->next);
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex02/ex02-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex02/ex02-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..d5bf2f612324a91d34074a389aa195e40466ceb8
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex02/ex02-library.h
@@ -0,0 +1,16 @@
+#ifndef EX02_LIBRARY_H_
+#define EX02_LIBRARY_H_
+
+struct Elem {
+    int value;
+    unsigned int times; // Number of repetitions
+    Elem *next;
+};
+
+void displayRLEList(Elem *list);
+
+Elem* reverse(Elem *list);
+Elem* concatenate(Elem *list1, Elem *list2);
+int sum(Elem *list);
+
+#endif /* EX02_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex02/ex02-main.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex02/ex02-main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e1aae6b94689069f3ac885b01869405de12475d8
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex02/ex02-main.cpp
@@ -0,0 +1,32 @@
+#include <iostream>
+#include "ex02-library.h"
+using namespace std;
+
+int main() {
+    Elem e0 = {10, 5, nullptr};
+    Elem e1 = {12, 6, &e0};
+    Elem e2 = {4, 10, &e1};
+
+    Elem e4 = {100, 7, nullptr};
+    Elem e5 = {4,   3, &e4};
+    Elem e6 = {101, 9, &e5};
+    
+    cout << "The RLE list is: " << endl;
+    displayRLEList(&e2);
+    cout << endl;
+
+    cout << "The reversed list is:" << endl;
+    Elem *r = reverse(&e2);
+    displayRLEList(r);
+
+    cout << endl;
+
+    cout << "After concatenation, the list is:" << endl;
+    Elem *l = concatenate(r, &e6);
+    displayRLEList(l);
+    cout << endl;
+
+    cout << "The sum of its elements is: " << sum(l) << endl;
+    
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex03/ex03-library.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex03/ex03-library.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b26e8e1a18b906d4c39dd364d5e4c9f694c9b74e
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex03/ex03-library.cpp
@@ -0,0 +1,44 @@
+#include <iostream>
+#include "ex03-library.h"
+using namespace std;
+
+// Do not modify
+GroceryList::GroceryList() {
+    this->items.push_back("Lasagne");
+    this->itemsInfo["Lasagne"] = {1, "With eggs if available"};
+
+    this->items.push_back("Salmon");
+    this->itemsInfo["Salmon"] = {500, "Smoked if available"};
+
+    this->items.push_back("Spinach");
+    this->itemsInfo["Spinach"] = {300, "Fresh"};
+
+    this->items.push_back("Dessert");
+    this->itemsInfo["Dessert"] = {8, "Maybe lagkage?"};
+}
+
+// Task 3(a).  Implement this method
+void GroceryList::add(string name, unsigned int quantity, string notes) {
+    // Write your code here
+}
+
+// Task 3(b).  Implement this method
+bool GroceryList::remove(string name, unsigned int quantity) {
+    // Write your code here
+}
+
+// Task 3(c).  Implement this method
+bool GroceryList::copyEntry(string name, string newName) {
+    // Write your code here
+}
+
+// Do not modify
+void GroceryList::display() {
+    // Write your code here
+    for (auto it = this->items.begin(); it != this->items.end(); it++) {
+        Info &item = this->itemsInfo[*it];
+        cout << "name='" << *it << "'; ";
+        cout << "quantity=" << item.quantity << "; ";
+        cout << "notes='" << item.notes << "'" << endl;
+    }
+}
\ No newline at end of file
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex03/ex03-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex03/ex03-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..bf9faf5a45d34064bd23e6ed8b16cd522c244d1c
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex03/ex03-library.h
@@ -0,0 +1,26 @@
+#ifndef EX03_LIBRARY_H_
+#define EX03_LIBRARY_H_
+
+#include <string>
+#include <vector>
+#include <map>
+using namespace std;
+
+struct Info {
+    unsigned int quantity;
+    string notes;
+};
+
+class GroceryList {
+private:
+    vector<string> items;
+    map<string,Info> itemsInfo;
+public:
+    GroceryList();
+    void add(string name, unsigned int quantity, string notes);
+    bool remove(string name, unsigned int quantity);
+    bool copyEntry(string name, string newName);
+    void display();
+};
+
+#endif /* EX03_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex03/ex03-main.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex03/ex03-main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9ff9106ffb6932cc5eae7f6c559f5b11fcc37f79
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex03/ex03-main.cpp
@@ -0,0 +1,30 @@
+#include <iostream>
+#include "ex03-library.h"
+using namespace std;
+
+int main() {
+    GroceryList gl = GroceryList();
+
+    cout << "Initial grocery list:" << endl;
+    gl.display();
+
+    cout << endl << "After adding cheddar:" << endl;
+    gl.add("Cheddar", 500, "Not too mature");
+    gl.display();
+
+    cout << endl << "After removing some spinach:" << endl;
+    if (gl.remove("Spinach", 200)) {
+        gl.display();
+    } else {
+        cout << "FAILED! (this should not happen)" << endl;
+    }
+
+    cout << endl << "After copying salmon into haddock:" << endl;
+    if (gl.copyEntry("Salmon", "Haddock")) {
+        gl.display();
+    } else {
+        cout << "FAILED! (this should not happen)" << endl;
+    }
+
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex04/ex04-library.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex04/ex04-library.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6aad768fc01cd3d387327eb4dbf2ec93b5fe9fde
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex04/ex04-library.cpp
@@ -0,0 +1,15 @@
+#include "ex04-library.h"
+
+// Task 4(a).  Write a placeholder implementation of FilteringBuffer's
+//             constructor and methods
+
+// Task 4(b).  Write a working implementation of write() and occupancy()
+
+// Task 4(c).  Write a working implementation of read()
+
+// Task 4(d).  Write a working implementation of reset()
+
+// Do not modify
+Buffer::~Buffer() {
+    // Empty destructor
+}
\ No newline at end of file
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex04/ex04-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex04/ex04-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..aee4813dfe90efdd1c6b18f8f3a486d650f43cce
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex04/ex04-library.h
@@ -0,0 +1,16 @@
+#ifndef EX04_LIBRARY_H_
+#define EX04_LIBRARY_H_
+
+class Buffer {
+public:
+    virtual void write(int v) = 0;
+    virtual int read() = 0;
+    virtual unsigned int occupancy() = 0;
+    virtual void reset() = 0;
+    virtual ~Buffer();
+};
+
+// Task 4(a).  Declare the class FilteringBuffer, by extending Buffer
+// Write your code here
+
+#endif /* EX04_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex04/ex04-main.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex04/ex04-main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7416e521e180a090932f371c806643dd14a2bfbc
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/02393-exam-may21/code/ex04/ex04-main.cpp
@@ -0,0 +1,32 @@
+#include <iostream>
+#include "ex04-library.h"
+using namespace std;
+
+int main() {
+    Buffer *b = new FilteringBuffer(-999);
+
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+    cout << "Reading from the buffer returns: " << b->read() << endl;
+
+    for (unsigned int i = 0; i < 10; i++) {
+        b->write(i * 10);
+    }
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+
+    for (unsigned int i = 0; i < 10; i++) {
+        b->write(20);
+    }
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+
+    for (unsigned int i = 0; i < 3; i++) {
+      cout << "Reading from the buffer returns: " << b->read() << endl;
+    }
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+
+    b->reset();
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+    cout << "Reading from the buffer returns: " << b->read() << endl;
+    
+    delete b;
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/01.Tests - example/ex03-main.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/01.Tests - example/ex03-main.ans
new file mode 100644
index 0000000000000000000000000000000000000000..c01494c36df41b891b67060ecfaf25d23daa430a
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/01.Tests - example/ex03-main.ans	
@@ -0,0 +1,27 @@
+Initial grocery list:
+name='Lasagne'; quantity=1; notes='With eggs if available'
+name='Salmon'; quantity=500; notes='Smoked if available'
+name='Spinach'; quantity=300; notes='Fresh'
+name='Dessert'; quantity=8; notes='Maybe lagkage?'
+
+After adding cheddar:
+name='Lasagne'; quantity=1; notes='With eggs if available'
+name='Salmon'; quantity=500; notes='Smoked if available'
+name='Spinach'; quantity=300; notes='Fresh'
+name='Dessert'; quantity=8; notes='Maybe lagkage?'
+name='Cheddar'; quantity=500; notes='Not too mature'
+
+After removing some spinach:
+name='Lasagne'; quantity=1; notes='With eggs if available'
+name='Salmon'; quantity=500; notes='Smoked if available'
+name='Spinach'; quantity=100; notes='Fresh'
+name='Dessert'; quantity=8; notes='Maybe lagkage?'
+name='Cheddar'; quantity=500; notes='Not too mature'
+
+After copying salmon into haddock:
+name='Lasagne'; quantity=1; notes='With eggs if available'
+name='Salmon'; quantity=500; notes='Smoked if available'
+name='Spinach'; quantity=100; notes='Fresh'
+name='Dessert'; quantity=8; notes='Maybe lagkage?'
+name='Cheddar'; quantity=500; notes='Not too mature'
+name='Haddock'; quantity=500; notes='Smoked if available'
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/01.Tests - example/ex03-main.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/01.Tests - example/ex03-main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9ff9106ffb6932cc5eae7f6c559f5b11fcc37f79
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/01.Tests - example/ex03-main.cpp	
@@ -0,0 +1,30 @@
+#include <iostream>
+#include "ex03-library.h"
+using namespace std;
+
+int main() {
+    GroceryList gl = GroceryList();
+
+    cout << "Initial grocery list:" << endl;
+    gl.display();
+
+    cout << endl << "After adding cheddar:" << endl;
+    gl.add("Cheddar", 500, "Not too mature");
+    gl.display();
+
+    cout << endl << "After removing some spinach:" << endl;
+    if (gl.remove("Spinach", 200)) {
+        gl.display();
+    } else {
+        cout << "FAILED! (this should not happen)" << endl;
+    }
+
+    cout << endl << "After copying salmon into haddock:" << endl;
+    if (gl.copyEntry("Salmon", "Haddock")) {
+        gl.display();
+    } else {
+        cout << "FAILED! (this should not happen)" << endl;
+    }
+
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/01.Tests - example/overwrites/ex03-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/01.Tests - example/overwrites/ex03-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..bf9faf5a45d34064bd23e6ed8b16cd522c244d1c
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/01.Tests - example/overwrites/ex03-library.h	
@@ -0,0 +1,26 @@
+#ifndef EX03_LIBRARY_H_
+#define EX03_LIBRARY_H_
+
+#include <string>
+#include <vector>
+#include <map>
+using namespace std;
+
+struct Info {
+    unsigned int quantity;
+    string notes;
+};
+
+class GroceryList {
+private:
+    vector<string> items;
+    map<string,Info> itemsInfo;
+public:
+    GroceryList();
+    void add(string name, unsigned int quantity, string notes);
+    bool remove(string name, unsigned int quantity);
+    bool copyEntry(string name, string newName);
+    void display();
+};
+
+#endif /* EX03_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/01.Tests - example/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/01.Tests - example/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0f31cb4818945ba9470772ab85cb853ef78a6bce
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/01.Tests - example/testgroup.yml	
@@ -0,0 +1,4 @@
+name: Tests - example
+onTestGroupFailure: Continue
+feedback: Full
+onTestFailure: Continue
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/02.Tests - task (a)/ex03-test-a.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/02.Tests - task (a)/ex03-test-a.ans
new file mode 100644
index 0000000000000000000000000000000000000000..56a145d34e6a2b0ca0435bc91b7be6e8e0de8062
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/02.Tests - task (a)/ex03-test-a.ans	
@@ -0,0 +1,26 @@
+Initial grocery list:
+name='Lasagne'; quantity=1; notes='With eggs if available'
+name='Salmon'; quantity=500; notes='Smoked if available'
+name='Spinach'; quantity=300; notes='Fresh'
+name='Dessert'; quantity=8; notes='Maybe lagkage?'
+
+After adding cheddar:
+name='Lasagne'; quantity=1; notes='With eggs if available'
+name='Salmon'; quantity=500; notes='Smoked if available'
+name='Spinach'; quantity=300; notes='Fresh'
+name='Dessert'; quantity=8; notes='Maybe lagkage?'
+name='Cheddar'; quantity=500; notes='Not too mature'
+
+After adding more spinach:
+name='Lasagne'; quantity=1; notes='With eggs if available'
+name='Salmon'; quantity=500; notes='Smoked if available'
+name='Spinach'; quantity=500; notes='Fresh;Baby spinach if available'
+name='Dessert'; quantity=8; notes='Maybe lagkage?'
+name='Cheddar'; quantity=500; notes='Not too mature'
+
+After adding more spinach:
+name='Lasagne'; quantity=1; notes='With eggs if available'
+name='Salmon'; quantity=500; notes='Smoked if available'
+name='Spinach'; quantity=700; notes='Fresh;Baby spinach if available;Frozen is OK'
+name='Dessert'; quantity=8; notes='Maybe lagkage?'
+name='Cheddar'; quantity=500; notes='Not too mature'
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/02.Tests - task (a)/ex03-test-a.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/02.Tests - task (a)/ex03-test-a.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b882a1d94544d5f0732ae1f6e5cbf1c3129c5d3c
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/02.Tests - task (a)/ex03-test-a.cpp	
@@ -0,0 +1,26 @@
+#include <iostream>
+#include "ex03-library.h"
+
+using namespace std;
+
+int main() {
+    GroceryList gl = GroceryList();
+
+    cout << "Initial grocery list:" << endl;
+    gl.display();
+
+    cout << endl << "After adding cheddar:" << endl;
+    gl.add("Cheddar", 500, "Not too mature");
+    gl.display();
+
+    cout << endl << "After adding more spinach:" << endl;
+    gl.add("Spinach", 200, "Baby spinach if available");
+    gl.display();
+
+    cout << endl << "After adding more spinach:" << endl;
+    gl.add("Spinach", 200, "Frozen is OK");
+    gl.display();
+
+    return 0;
+}
+
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/02.Tests - task (a)/overwrites/ex03-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/02.Tests - task (a)/overwrites/ex03-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..bf9faf5a45d34064bd23e6ed8b16cd522c244d1c
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/02.Tests - task (a)/overwrites/ex03-library.h	
@@ -0,0 +1,26 @@
+#ifndef EX03_LIBRARY_H_
+#define EX03_LIBRARY_H_
+
+#include <string>
+#include <vector>
+#include <map>
+using namespace std;
+
+struct Info {
+    unsigned int quantity;
+    string notes;
+};
+
+class GroceryList {
+private:
+    vector<string> items;
+    map<string,Info> itemsInfo;
+public:
+    GroceryList();
+    void add(string name, unsigned int quantity, string notes);
+    bool remove(string name, unsigned int quantity);
+    bool copyEntry(string name, string newName);
+    void display();
+};
+
+#endif /* EX03_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/02.Tests - task (a)/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/02.Tests - task (a)/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7bb02ec4f06cb63db4dd2fcdae44210ab8619333
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/02.Tests - task (a)/testgroup.yml	
@@ -0,0 +1,3 @@
+name: Tests - task (a)
+onTestGroupFailure: Continue
+feedback: Full
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/03.Tests - task (b)/ex03-test-b.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/03.Tests - task (b)/ex03-test-b.ans
new file mode 100644
index 0000000000000000000000000000000000000000..32544746049df9c11a6fc994d192eb0073822bf0
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/03.Tests - task (b)/ex03-test-b.ans	
@@ -0,0 +1,22 @@
+Initial grocery list:
+name='Lasagne'; quantity=1; notes='With eggs if available'
+name='Salmon'; quantity=500; notes='Smoked if available'
+name='Spinach'; quantity=300; notes='Fresh'
+name='Dessert'; quantity=8; notes='Maybe lagkage?'
+
+After removing some spinach:
+name='Lasagne'; quantity=1; notes='With eggs if available'
+name='Salmon'; quantity=500; notes='Smoked if available'
+name='Spinach'; quantity=100; notes='Fresh'
+name='Dessert'; quantity=8; notes='Maybe lagkage?'
+
+After removing more spinach:
+name='Lasagne'; quantity=1; notes='With eggs if available'
+name='Salmon'; quantity=500; notes='Smoked if available'
+name='Dessert'; quantity=8; notes='Maybe lagkage?'
+
+Trying to remove even more spinach:
+FAILED! (this is correct)
+
+Trying to remove cheddar:
+FAILED! (this is correct)
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/03.Tests - task (b)/ex03-test-b.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/03.Tests - task (b)/ex03-test-b.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0e9005df57d678cf8f89c56289baa1bb9f06c079
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/03.Tests - task (b)/ex03-test-b.cpp	
@@ -0,0 +1,41 @@
+#include <iostream>
+#include "ex03-library.h"
+
+using namespace std;
+
+int main() {
+    GroceryList gl = GroceryList();
+
+    cout << "Initial grocery list:" << endl;
+    gl.display();
+
+    cout << endl << "After removing some spinach:" << endl;
+    if (gl.remove("Spinach", 200)) {
+        gl.display();
+    } else {
+        cout << "FAILED! (this should not happen)" << endl;
+    }
+
+    cout << endl << "After removing more spinach:" << endl;
+    if (gl.remove("Spinach", 100)) {
+        gl.display();
+    } else {
+        cout << "FAILED! (this should not happen)" << endl;
+    }
+
+    cout << endl << "Trying to remove even more spinach:" << endl;
+    if (gl.remove("Spinach", 100)) {
+        gl.display();
+    } else {
+        cout << "FAILED! (this is correct)" << endl;
+    }
+
+    cout << endl << "Trying to remove cheddar:" << endl;
+    if (gl.remove("Cheddar", 100)) {
+        gl.display();
+    } else {
+        cout << "FAILED! (this is correct)" << endl;
+    }
+
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/03.Tests - task (b)/overwrites/ex03-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/03.Tests - task (b)/overwrites/ex03-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..bf9faf5a45d34064bd23e6ed8b16cd522c244d1c
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/03.Tests - task (b)/overwrites/ex03-library.h	
@@ -0,0 +1,26 @@
+#ifndef EX03_LIBRARY_H_
+#define EX03_LIBRARY_H_
+
+#include <string>
+#include <vector>
+#include <map>
+using namespace std;
+
+struct Info {
+    unsigned int quantity;
+    string notes;
+};
+
+class GroceryList {
+private:
+    vector<string> items;
+    map<string,Info> itemsInfo;
+public:
+    GroceryList();
+    void add(string name, unsigned int quantity, string notes);
+    bool remove(string name, unsigned int quantity);
+    bool copyEntry(string name, string newName);
+    void display();
+};
+
+#endif /* EX03_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/03.Tests - task (b)/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/03.Tests - task (b)/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..05676bf5dc65a42cff635871efe35e2401a7257e
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/03.Tests - task (b)/testgroup.yml	
@@ -0,0 +1,3 @@
+name: Tests - task (b)
+onTestGroupFailure: Continue
+feedback: Full
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/04.Tests - task (c)/ex03-test-c.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/04.Tests - task (c)/ex03-test-c.ans
new file mode 100644
index 0000000000000000000000000000000000000000..7e3a928ee0c7ac14aebb1638c86b539fd9fbbc36
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/04.Tests - task (c)/ex03-test-c.ans	
@@ -0,0 +1,18 @@
+Initial grocery list:
+name='Lasagne'; quantity=1; notes='With eggs if available'
+name='Salmon'; quantity=500; notes='Smoked if available'
+name='Spinach'; quantity=300; notes='Fresh'
+name='Dessert'; quantity=8; notes='Maybe lagkage?'
+
+After copying spinach into baby spinach:
+name='Lasagne'; quantity=1; notes='With eggs if available'
+name='Salmon'; quantity=500; notes='Smoked if available'
+name='Spinach'; quantity=300; notes='Fresh'
+name='Dessert'; quantity=8; notes='Maybe lagkage?'
+name='Baby spinach'; quantity=300; notes='Fresh'
+
+After copying baby spinach into dessert:
+FAILED! (this is correct)
+
+After copying cheddar into spinach:
+FAILED! (this is correct)
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/04.Tests - task (c)/ex03-test-c.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/04.Tests - task (c)/ex03-test-c.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8eaa80433dfe72085ec88af167522a40663a6696
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/04.Tests - task (c)/ex03-test-c.cpp	
@@ -0,0 +1,35 @@
+#include <iostream>
+#include <string>
+#include "ex03-library.h"
+
+using namespace std;
+
+int main() {
+    GroceryList gl = GroceryList();
+
+    cout << "Initial grocery list:" << endl;
+    gl.display();
+
+    cout << endl << "After copying spinach into baby spinach:" << endl;
+    if (gl.copyEntry("Spinach", "Baby spinach")) {
+        gl.display();
+    } else {
+        cout << "FAILED! (this should not happen)" << endl;
+    }
+
+    cout << endl << "After copying baby spinach into dessert:" << endl;
+    if (gl.copyEntry("Baby spinach", "Dessert")) {
+        gl.display();
+    } else {
+        cout << "FAILED! (this is correct)" << endl;
+    }
+
+    cout << endl << "After copying cheddar into spinach:" << endl;
+    if (gl.copyEntry("Cheddar", "Spinach")) {
+        gl.display();
+    } else {
+        cout << "FAILED! (this is correct)" << endl;
+    }
+
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/04.Tests - task (c)/overwrites/ex03-library.h b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/04.Tests - task (c)/overwrites/ex03-library.h
new file mode 100644
index 0000000000000000000000000000000000000000..bf9faf5a45d34064bd23e6ed8b16cd522c244d1c
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/04.Tests - task (c)/overwrites/ex03-library.h	
@@ -0,0 +1,26 @@
+#ifndef EX03_LIBRARY_H_
+#define EX03_LIBRARY_H_
+
+#include <string>
+#include <vector>
+#include <map>
+using namespace std;
+
+struct Info {
+    unsigned int quantity;
+    string notes;
+};
+
+class GroceryList {
+private:
+    vector<string> items;
+    map<string,Info> itemsInfo;
+public:
+    GroceryList();
+    void add(string name, unsigned int quantity, string notes);
+    bool remove(string name, unsigned int quantity);
+    bool copyEntry(string name, string newName);
+    void display();
+};
+
+#endif /* EX03_LIBRARY_H_ */
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/04.Tests - task (c)/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/04.Tests - task (c)/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a98ad2bd57a77f42fbde86f2b444ea90fcc261c0
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/04.Tests - task (c)/testgroup.yml	
@@ -0,0 +1,3 @@
+name: Tests - task (c)
+onTestGroupFailure: Continue
+feedback: Full
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/exercise.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/exercise.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9d69938ce41214de4591fc21913ec54e57a26e57
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/03.Exercise 3. Grocery List/exercise.yml	
@@ -0,0 +1,5 @@
+name: Exercise 3. Grocery List
+suggestedSolutionVisibility: AfterSolved
+languages: 1
+description: See details on the May 2021 reexam paper.
+customSuggestedSolution: ''
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/01.Tests - example/ex04-main.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/01.Tests - example/ex04-main.ans
new file mode 100644
index 0000000000000000000000000000000000000000..10e061c898d5bda1b19d1ba122ff6d21b08e05ec
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/01.Tests - example/ex04-main.ans	
@@ -0,0 +1,10 @@
+Current buffer occupancy: 0
+Reading from the buffer returns: -999
+Current buffer occupancy: 10
+Current buffer occupancy: 10
+Reading from the buffer returns: 0
+Reading from the buffer returns: 10
+Reading from the buffer returns: 20
+Current buffer occupancy: 7
+Current buffer occupancy: 0
+Reading from the buffer returns: -999
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/01.Tests - example/ex04-main.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/01.Tests - example/ex04-main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7416e521e180a090932f371c806643dd14a2bfbc
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/01.Tests - example/ex04-main.cpp	
@@ -0,0 +1,32 @@
+#include <iostream>
+#include "ex04-library.h"
+using namespace std;
+
+int main() {
+    Buffer *b = new FilteringBuffer(-999);
+
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+    cout << "Reading from the buffer returns: " << b->read() << endl;
+
+    for (unsigned int i = 0; i < 10; i++) {
+        b->write(i * 10);
+    }
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+
+    for (unsigned int i = 0; i < 10; i++) {
+        b->write(20);
+    }
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+
+    for (unsigned int i = 0; i < 3; i++) {
+      cout << "Reading from the buffer returns: " << b->read() << endl;
+    }
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+
+    b->reset();
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+    cout << "Reading from the buffer returns: " << b->read() << endl;
+    
+    delete b;
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/01.Tests - example/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/01.Tests - example/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..450b501e8984a5807777029ef9ceced48fa2a44d
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/01.Tests - example/testgroup.yml	
@@ -0,0 +1,4 @@
+name: Tests - example
+onTestGroupFailure: Continue
+feedback: Full
+cppTestMode: SourceBased
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/02.Tests - task (a)/ex04-test-a.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/02.Tests - task (a)/ex04-test-a.ans
new file mode 100644
index 0000000000000000000000000000000000000000..d720e01f2780a1ff85fdfb71f97847c95359f117
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/02.Tests - task (a)/ex04-test-a.ans	
@@ -0,0 +1 @@
+It compiles! Test passed!
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/02.Tests - task (a)/ex04-test-a.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/02.Tests - task (a)/ex04-test-a.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..626121fa1d54336c7678e7dc0d4ad4cd22d0238e
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/02.Tests - task (a)/ex04-test-a.cpp	
@@ -0,0 +1,17 @@
+#include <iostream>
+#include "ex04-library.h"
+using namespace std;
+
+int main() {
+    Buffer *b = new FilteringBuffer(-999);
+
+    b->write(42);
+    b->write(42);
+    unsigned int test1 = b->occupancy();
+    int test2 = b->read();
+
+    cout << "It compiles! Test passed!" << endl;
+
+    delete b;
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/02.Tests - task (a)/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/02.Tests - task (a)/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f9b593c7de2e170c6339d17c47983aa247460b1a
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/02.Tests - task (a)/testgroup.yml	
@@ -0,0 +1,4 @@
+name: Tests - task (a)
+onTestGroupFailure: Continue
+feedback: Full
+cppTestMode: SourceBased
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/03.Tests - task (b)/ex04-test-b.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/03.Tests - task (b)/ex04-test-b.ans
new file mode 100644
index 0000000000000000000000000000000000000000..8b82315d6c6da536ae775a05ff2139c863f80b21
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/03.Tests - task (b)/ex04-test-b.ans	
@@ -0,0 +1,3 @@
+Current buffer occupancy: 0
+Current buffer occupancy: 7
+Current buffer occupancy: 10
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/03.Tests - task (b)/ex04-test-b.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/03.Tests - task (b)/ex04-test-b.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0b6119ede1dceaecca24154626fccba56c1705c6
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/03.Tests - task (b)/ex04-test-b.cpp	
@@ -0,0 +1,22 @@
+#include <iostream>
+#include "ex04-library.h"
+using namespace std;
+
+int main() {
+    Buffer *b = new FilteringBuffer(-999);
+
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+    
+    for (unsigned int i = 0; i < 7; i++) {
+        b->write(i * 10);
+    }
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+
+    for (unsigned int i = 5; i < 10; i++) {
+        b->write(i * 10);
+    }
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+
+    delete b;
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/03.Tests - task (b)/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/03.Tests - task (b)/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..13127feff047981aa2bf6ca4d8f445a834cea357
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/03.Tests - task (b)/testgroup.yml	
@@ -0,0 +1,4 @@
+name: Tests - task (b)
+onTestGroupFailure: Continue
+feedback: Full
+cppTestMode: SourceBased
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/04.Tests - task (c)/ex04-test-c.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/04.Tests - task (c)/ex04-test-c.ans
new file mode 100644
index 0000000000000000000000000000000000000000..5653e5fa78bc7e1fbce27d16756d7a6706bc4ee4
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/04.Tests - task (c)/ex04-test-c.ans	
@@ -0,0 +1,14 @@
+Current buffer occupancy: 0
+Reading from the buffer returns: -999
+Current buffer occupancy: 5
+Reading from the buffer returns: 0
+Reading from the buffer returns: 10
+Reading from the buffer returns: 20
+Current buffer occupancy: 2
+Current buffer occupancy: 5
+Reading from the buffer returns: 30
+Reading from the buffer returns: 40
+Reading from the buffer returns: 50
+Reading from the buffer returns: 60
+Reading from the buffer returns: 70
+Reading from the buffer returns: -999
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/04.Tests - task (c)/ex04-test-c.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/04.Tests - task (c)/ex04-test-c.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..105fd8529e71960c14c166a6150eedb67ca52cbc
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/04.Tests - task (c)/ex04-test-c.cpp	
@@ -0,0 +1,31 @@
+#include <iostream>
+#include "ex04-library.h"
+using namespace std;
+
+int main() {
+    Buffer *b = new FilteringBuffer(-999);
+
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+    cout << "Reading from the buffer returns: " << b->read() << endl;
+
+    for (unsigned int i = 0; i < 5; i++) {
+        b->write(i * 10);
+    }
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+
+    for (unsigned int i = 0; i < 3; i++) {
+      cout << "Reading from the buffer returns: " << b->read() << endl;
+    }
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+
+    for (unsigned int i = 0; i < 8; i++) {
+        b->write(i * 10);
+    }
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+    for (unsigned int i = 0; i < 6; i++) {
+      cout << "Reading from the buffer returns: " << b->read() << endl;
+    }
+
+    delete b;
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/04.Tests - task (c)/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/04.Tests - task (c)/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3b6e1b1db30997b17e06270f5db937d19054ba5e
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/04.Tests - task (c)/testgroup.yml	
@@ -0,0 +1,4 @@
+name: Tests - task (c)
+onTestGroupFailure: Continue
+feedback: Full
+cppTestMode: SourceBased
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/05.Tests - task (d)/ex04-test-d.ans b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/05.Tests - task (d)/ex04-test-d.ans
new file mode 100644
index 0000000000000000000000000000000000000000..f5a72ffe6530c04e6f0475ed2163ae1829ef81e7
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/05.Tests - task (d)/ex04-test-d.ans	
@@ -0,0 +1,10 @@
+Current buffer occupancy: 5
+Reading from the buffer returns: 0
+Reading from the buffer returns: 10
+Reading from the buffer returns: 20
+Current buffer occupancy: 2
+Buffer occupancy after reset: 0
+Current buffer occupancy: 8
+Reading from the buffer returns: 0
+Reading from the buffer returns: 10
+Reading from the buffer returns: 20
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/05.Tests - task (d)/ex04-test-d.cpp b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/05.Tests - task (d)/ex04-test-d.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..263b311af5170dc413766e37a09d03b30c042960
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/05.Tests - task (d)/ex04-test-d.cpp	
@@ -0,0 +1,31 @@
+#include <iostream>
+#include "ex04-library.h"
+using namespace std;
+
+int main() {
+    Buffer *b = new FilteringBuffer(-999);
+
+    for (unsigned int i = 0; i < 5; i++) {
+        b->write(i * 10);
+    }
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+
+    for (unsigned int i = 0; i < 3; i++) {
+      cout << "Reading from the buffer returns: " << b->read() << endl;
+    }
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+
+    b->reset();
+    cout << "Buffer occupancy after reset: " << b->occupancy() << endl;
+
+    for (unsigned int i = 0; i < 8; i++) {
+        b->write(i * 10);
+    }
+    cout << "Current buffer occupancy: " << b->occupancy() << endl;
+    for (unsigned int i = 0; i < 3; i++) {
+      cout << "Reading from the buffer returns: " << b->read() << endl;
+    }
+
+    delete b;
+    return 0;
+}
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/05.Tests - task (d)/testgroup.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/05.Tests - task (d)/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..66b1d832704c4a4e699a3f0dcd14ca9ac3196d5a
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/05.Tests - task (d)/testgroup.yml	
@@ -0,0 +1,4 @@
+name: Tests - task (d)
+onTestGroupFailure: Continue
+feedback: Full
+cppTestMode: SourceBased
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/exercise.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/exercise.yml
new file mode 100644
index 0000000000000000000000000000000000000000..116ae956f918552de4ab5abea3d54af7e9222e2e
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/04.Exercise 4. Filtering Buffer/exercise.yml	
@@ -0,0 +1,5 @@
+name: Exercise 4. Filtering Buffer
+suggestedSolutionVisibility: AfterSolved
+languages: 1
+description: See details on the May 2021 reexam paper.
+customSuggestedSolution: ''
diff --git a/examples/presentation/to_import/02393-exam-may21-codejudge/collection.yml b/examples/presentation/to_import/02393-exam-may21-codejudge/collection.yml
new file mode 100644
index 0000000000000000000000000000000000000000..08187b214c2d6e5b820fee57096403878554badc
--- /dev/null
+++ b/examples/presentation/to_import/02393-exam-may21-codejudge/collection.yml
@@ -0,0 +1,4 @@
+name: 'Exam sample: May 2021 (re-exam)'
+visibleFrom: 2021-11-30T18:00:00.0000000
+type: ExerciseGroup
+visibleToAuthors: true
diff --git a/examples/presentation/to_import/02393-exercise-set-6/codejudge.tex b/examples/presentation/to_import/02393-exercise-set-6/codejudge.tex
new file mode 100644
index 0000000000000000000000000000000000000000..b27f96c9786faa37b861f388d39ef2e4b0479c13
--- /dev/null
+++ b/examples/presentation/to_import/02393-exercise-set-6/codejudge.tex
@@ -0,0 +1,6 @@
+{\bf To be handed in via CodeJudge} ---
+%\url{https://dtu.codejudge.net/02393-e18/assignment/}\\
+%\url{https://dtu.codejudge.net/02393-e19/assignments/}\\
+%\url{https://dtu.codejudge.net/02393-e20/assignments}\\
+%\url{https://dtu.codejudge.net/02393-e21/assignments}
+\url{https://dtu.codejudge.net/02393-e22/assignments}
diff --git a/examples/presentation/to_import/02393-exercise-set-6/main.tex b/examples/presentation/to_import/02393-exercise-set-6/main.tex
new file mode 100644
index 0000000000000000000000000000000000000000..be4b617d31543343d3b683aef954dabfae4e6b1d
--- /dev/null
+++ b/examples/presentation/to_import/02393-exercise-set-6/main.tex
@@ -0,0 +1,130 @@
+\documentclass{article}
+\usepackage{a4wide}
+\usepackage{url}
+\usepackage{amsmath}
+\usepackage{graphicx}
+\usepackage{listings}
+\usepackage{hyperref}
+
+\title{\ \\[-14ex]02393 C++ Programming Exercises\\[-2ex]}
+\date{Assignment 6}
+
+\begin{document}
+\maketitle
+\thispagestyle{empty}
+%\vspace{-5ex}
+
+%\noindent{\bf\Large{Programming exercise}}
+
+\noindent
+%{\bf Hand-in via \url{https://dtu.codejudge.net/02393-e17/assignment/}}
+\input{codejudge}
+
+\section{A class for fractions of integers}
+
+The goal of this assignment is to implement a class of fractions of integers supporting some basic operations like addition and multiplication. You can use the following interface for the class as a starting point and modify it at will:
+
+{\footnotesize
+\begin{verbatim}
+class fraction {
+    
+private:
+    // Internal representation of a fraction as two integers
+    int numerator;
+    int denominator;
+
+public:
+    // Class constructor
+    fraction(int n, int d);
+    
+    // Methods to update the fraction
+    void add(fraction f);
+    void mult(fraction f);
+    void div(fraction f);
+    
+    // Display method
+    void display(void);
+};
+\end{verbatim}
+}
+
+The main idea for the class above is that a fraction $\frac{a}{b}$ is represented by two integers (the numerator $a$ and the denominator $b$) and several methods are provided to support arithmetic operations on fractions. For example:
+
+\begin{itemize}
+
+\item \verb|fraction(int n, int m)| constructs the fraction
+  $\frac{n}{m}$;
+  
+\item \verb|void add(fraction f)| updates a fraction by adding fraction $f$ to it. 
+  
+\item \verb|void mult(fraction f)| updates a fraction by multiplying it by fraction $f$. 
+
+\item \verb|void div(fraction f)| updates a fraction by dividing it by fraction $f$. 
+
+\end{itemize}
+
+\paragraph{Your task.} Write a program that reads sequences of simple expressions from \texttt{cin}, each having one of the following forms:
+\begin{itemize}
+\item \texttt{a / b + c / d}
+\item \texttt{a / b * c / d}
+\item \texttt{a / b div c / d}
+\end{itemize}
+After each expression, the program must provide the result of the given operation as a simplified fraction. For example, if the input is\\
+
+\texttt{1 / 4 + 1 / 2}\\
+
+\noindent then your program should provide the following output to \texttt{cout}:\\
+
+\texttt{3 / 4} \qquad(which results from $\frac{1 \cdot 2 + 1 \cdot 4}{4 \cdot 2} = \frac{6}{8}$ which after simplification is $\frac{3}{4}$)\\
+
+\noindent%
+The program must keep reading more expressions until \texttt{cin.fail()} returns \texttt{true}.
+
+\paragraph{Challenge.} The suggested internal representation poses some limits on the actual domain of integral numbers that the fraction class can cover. For example, the largest number would be $\frac{\mathtt{INT\_MAX}}{1}$ and the smallest positive fraction would be $\frac{1}{\mathtt{INT\_MAX}}$. A possible remedy to mitigate this would be to leverage the fact that every integer can be represented by a product of prime numbers.\footnote{See e.g.: \url{https://en.wikipedia.org/wiki/Fundamental_theorem_of_arithmetic}}  This was indeed what we did in assignment 2.  For example:
+\[
+137200 \;=\; 2\cdot 2\cdot 2\cdot 2\cdot 5\cdot 5\cdot 7\cdot 7\cdot 7
+\]
+To avoid repeating the same prime number many times, we could
+equivalently represent $137200$ with exponentiation of prime numbers:
+\[
+  137200 \;=\; 2^4\cdot 5^2\cdot 7^3\
+\]
+
+We could thus represent all the exponents in an array of exponents,
+where the $i$-th element of the array represents how many times the
+$i$-th prime number occurs.\footnote{Formally, the factorization
+  of a natural number $n>0$ consists of the (uniquely determined)
+  exponents $k_1,k_2,\ldots$ such that $n=p_1^{k_1}\cdot p_2^{k_2}
+  \cdot \ldots$ where $p_1,p_2,\ldots$ are the prime numbers.}
+So the representation of $137200$ would be:
+\newcommand{\bx}[1]{\multicolumn{1}{|l|}{#1}}
+\[
+\begin{array}{lllllllll}
+  \text{array index} & 0 & 1 & 2 & 3 & 4 & 5 & \ldots\\
+  \cline{2-8}
+  \text{array}       & \bx4 & \bx0 & \bx2 & \bx3 & \bx0 & \bx0 & \ldots\\
+  \cline{2-8}
+  \text{corresponding prime number}& 2 & 3 & 5 & 7 & 11 & 13 & \ldots
+\end{array}
+\]
+
+Arithmetic operations can also exploit such representation. For instance, the multiplication of two numbers in such representation can be obtained by adding the corresponding exponents. For instance, multiplying the factorizations of $12$ and $10$ would be done as follows:
+  \begin{displaymath}
+    \begin{array}{lllll}
+      \text{primes} & 2 & 3 & 5 \\
+      \cline{2-4}
+      12 & \bx2 & \bx1 & \bx0 \\
+      \cline{2-4}
+      10 & \bx1 & \bx0 & \bx1 \\
+      \cline{2-4}
+      \multicolumn{5}{l}{\text{Adding exponents gives:}}\\
+      \cline{2-4}
+      120 & \bx3 & \bx1 & \bx1 \\
+      \cline{2-4}
+    \end{array}
+  \end{displaymath}
+  
+Division can be obtained in a similar manner, by subtracting the exponents. Addition may be more involved.
+
+The challenge is to implement the class of fractions with this representation technique.
+\end{document}
diff --git a/examples/presentation/to_import/Alceste/01.Fractions/01.Tests/test1.ans b/examples/presentation/to_import/Alceste/01.Fractions/01.Tests/test1.ans
new file mode 100644
index 0000000000000000000000000000000000000000..358ad85d03c069aa144a356ce56d8e3ef1c37ad3
--- /dev/null
+++ b/examples/presentation/to_import/Alceste/01.Fractions/01.Tests/test1.ans
@@ -0,0 +1,3 @@
+22 / 15
+3 / 8
+1 / 1
diff --git a/examples/presentation/to_import/Alceste/01.Fractions/01.Tests/test1.in b/examples/presentation/to_import/Alceste/01.Fractions/01.Tests/test1.in
new file mode 100644
index 0000000000000000000000000000000000000000..ecaed32360406ea886e3d3f29c40a4aa55027845
--- /dev/null
+++ b/examples/presentation/to_import/Alceste/01.Fractions/01.Tests/test1.in
@@ -0,0 +1,3 @@
+2 / 3 + 4 / 5
+1 / 2 * 3 / 4
+1 / 2 div 1 / 2
diff --git a/examples/presentation/to_import/Alceste/01.Fractions/01.Tests/test2.ans b/examples/presentation/to_import/Alceste/01.Fractions/01.Tests/test2.ans
new file mode 100644
index 0000000000000000000000000000000000000000..17d9fb2fcd8c729cbc44729aafcae0eeb22adc02
--- /dev/null
+++ b/examples/presentation/to_import/Alceste/01.Fractions/01.Tests/test2.ans
@@ -0,0 +1,3 @@
+3 / 4
+1 / 4
+1 / 4
diff --git a/examples/presentation/to_import/Alceste/01.Fractions/01.Tests/test2.in b/examples/presentation/to_import/Alceste/01.Fractions/01.Tests/test2.in
new file mode 100644
index 0000000000000000000000000000000000000000..4be97f5a509983ffd5402dc21f3d3f1afd4d4fb6
--- /dev/null
+++ b/examples/presentation/to_import/Alceste/01.Fractions/01.Tests/test2.in
@@ -0,0 +1,3 @@
+1 / 4 + 1 / 2
+1 / 2 * 2 / 4
+1 / 2 div 4 / 2
diff --git a/examples/presentation/to_import/Alceste/01.Fractions/01.Tests/testgroup.yml b/examples/presentation/to_import/Alceste/01.Fractions/01.Tests/testgroup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b86095832affe4e7b98ecaac338590c2a40b18ec
--- /dev/null
+++ b/examples/presentation/to_import/Alceste/01.Fractions/01.Tests/testgroup.yml
@@ -0,0 +1,5 @@
+name: Tests
+feedback: Full
+cpuTimeLimit: 1000
+onTestFailure: Continue
+useControlTokens: true
diff --git a/examples/presentation/to_import/Alceste/01.Fractions/exercise.yml b/examples/presentation/to_import/Alceste/01.Fractions/exercise.yml
new file mode 100644
index 0000000000000000000000000000000000000000..99cf8b91373b68d53e1939bd478edb4f7cd67a27
--- /dev/null
+++ b/examples/presentation/to_import/Alceste/01.Fractions/exercise.yml
@@ -0,0 +1,6 @@
+name: Fractions
+suggestedSolutionVisibility: AfterSolved
+useCustomSuggestedSolution: true
+languages: 1,102
+description: See CampusNet description.
+customSuggestedSolution: ''
diff --git a/examples/presentation/to_import/Alceste/02393-exam-may21-code.zip b/examples/presentation/to_import/Alceste/02393-exam-may21-code.zip
new file mode 100644
index 0000000000000000000000000000000000000000..2480d02dbe8d19d7a39fc5f37f4a971db72287d1
Binary files /dev/null and b/examples/presentation/to_import/Alceste/02393-exam-may21-code.zip differ
diff --git a/examples/presentation/to_import/Alceste/02393-exam-may21-codejudge.zip b/examples/presentation/to_import/Alceste/02393-exam-may21-codejudge.zip
new file mode 100644
index 0000000000000000000000000000000000000000..3eaf1cd0d1c61089efc593eec565ebd1efb13f23
Binary files /dev/null and b/examples/presentation/to_import/Alceste/02393-exam-may21-codejudge.zip differ
diff --git a/examples/presentation/to_import/Alceste/02393-exam-may21.pdf b/examples/presentation/to_import/Alceste/02393-exam-may21.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..1393070e9708ba868ed57786dec3dbfdafa07278
Binary files /dev/null and b/examples/presentation/to_import/Alceste/02393-exam-may21.pdf differ
diff --git a/examples/presentation/to_import/Alceste/02393-exercise-set-6-codejudge.zip b/examples/presentation/to_import/Alceste/02393-exercise-set-6-codejudge.zip
new file mode 100644
index 0000000000000000000000000000000000000000..43e4ecd3cfffafdd1dbef254d19677f65b96c4f5
Binary files /dev/null and b/examples/presentation/to_import/Alceste/02393-exercise-set-6-codejudge.zip differ
diff --git a/examples/presentation/to_import/Alceste/02393-exercise-set-6.pdf b/examples/presentation/to_import/Alceste/02393-exercise-set-6.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..5829bd78d316799e16b5e0536cac20a4daa176d8
Binary files /dev/null and b/examples/presentation/to_import/Alceste/02393-exercise-set-6.pdf differ
diff --git a/examples/presentation/to_import/Alceste/collection.yml b/examples/presentation/to_import/Alceste/collection.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4ea0deca2dadd532891b8f77f7299cc410e4c2a3
--- /dev/null
+++ b/examples/presentation/to_import/Alceste/collection.yml
@@ -0,0 +1,8 @@
+name: Set 6 (week 6)
+visibleFrom: 2021-09-26T08:00:00.0000000
+description: Check details in ex06.pdf in the weekly assignments on DTU Learn.
+groupsAllowed: false
+commentsAllowed: false
+visibleToAuthors: true
+due: 2021-10-12T17:00:00.0000000
+postSubmissionsAllowed: true
diff --git a/examples/presentation/to_import/Vedrana/June2022-English-Python.pdf b/examples/presentation/to_import/Vedrana/June2022-English-Python.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..2a54953cdbe072e4f3f05ca03adae69eacea861e
Binary files /dev/null and b/examples/presentation/to_import/Vedrana/June2022-English-Python.pdf differ
diff --git a/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test01.py b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test01.py
new file mode 100644
index 0000000000000000000000000000000000000000..29aef5a3838740e819078b0ed7027efa160af5c7
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test01.py
@@ -0,0 +1,3 @@
+date = '27/12-1998'
+season = astronomical_season(date)
+print(season)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test02.py b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test02.py
new file mode 100644
index 0000000000000000000000000000000000000000..5dcd2c6ea8a0bc02e291d35afad4acef1c6be570
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test02.py
@@ -0,0 +1,3 @@
+date = '21/06-2108'
+season = astronomical_season(date)
+print(season)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test03.py b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test03.py
new file mode 100644
index 0000000000000000000000000000000000000000..4d905050ed1faeace96a368ad93d68b4425c965b
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test03.py
@@ -0,0 +1,3 @@
+date = '08/05-1998'
+season = astronomical_season(date)
+print(season)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test04.py b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test04.py
new file mode 100644
index 0000000000000000000000000000000000000000..bf44361c04d8751388beb014ebaef6e2fcd6dce8
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test04.py
@@ -0,0 +1,3 @@
+date = '07/08-1945'
+season = astronomical_season(date)
+print(season)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test05.py b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test05.py
new file mode 100644
index 0000000000000000000000000000000000000000..b87d6dbb9da608321ed06df92ffcf4200bb73837
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test05.py
@@ -0,0 +1,3 @@
+date = '22/12-1208'
+season = astronomical_season(date)
+print(season)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test06.py b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test06.py
new file mode 100644
index 0000000000000000000000000000000000000000..3608d5bdd60becfdfccffa87b080018c8ff01d54
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test06.py
@@ -0,0 +1,3 @@
+date = '19/03-2001'
+season = astronomical_season(date)
+print(season)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test07.py b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test07.py
new file mode 100644
index 0000000000000000000000000000000000000000..cfbdafb60699b08c33235f2141c969761e837f9c
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test07.py
@@ -0,0 +1,3 @@
+date = '23/09-2018'
+season = astronomical_season(date)
+print(season)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test08.py b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test08.py
new file mode 100644
index 0000000000000000000000000000000000000000..ded65f37fbd3751775be30838890d0f50646006b
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test08.py
@@ -0,0 +1,3 @@
+date = '21/06-2008'
+season = astronomical_season(date)
+print(season)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test09.py b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test09.py
new file mode 100644
index 0000000000000000000000000000000000000000..3bb3a967ece72efc1e67d4373e1d6166e4806884
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test09.py
@@ -0,0 +1,3 @@
+date = '12/04-1964'
+season = astronomical_season(date)
+print(season)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test10.py b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test10.py
new file mode 100644
index 0000000000000000000000000000000000000000..435f2c0eb094577deca70e315f0069e19713616a
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/astronomical_season/Evaluation/Test10.py
@@ -0,0 +1,3 @@
+date = '13/01-1900'
+season = astronomical_season(date)
+print(season)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/astronomical_season/Tests/Test1.py b/examples/presentation/to_import/Vedrana/astronomical_season/Tests/Test1.py
new file mode 100644
index 0000000000000000000000000000000000000000..245a6d14a5c8b5b183940f01dc54568fe759a61e
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/astronomical_season/Tests/Test1.py
@@ -0,0 +1,3 @@
+date = '09/12-2020'
+season = astronomical_season(date)
+print(season)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/astronomical_season/astronomical_season.py b/examples/presentation/to_import/Vedrana/astronomical_season/astronomical_season.py
new file mode 100644
index 0000000000000000000000000000000000000000..c6951ea933d40dc3b34d18798670c48ec93ce90a
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/astronomical_season/astronomical_season.py
@@ -0,0 +1,14 @@
+def astronomical_season(date):
+    dd = int(date[0:2])
+    mm = int(date[3:5])
+    if mm<3 or (mm==3 and dd<20):
+        season = 'winter'
+    elif mm<6 or (mm==6 and dd<21):
+        season = 'spring'
+    elif mm<9 or (mm==9 and dd<23):
+        season = 'summer'
+    elif mm<12 or (mm==12 and dd<21):
+        season = 'autumn'
+    else:
+        season = 'winter'
+    return season
diff --git a/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test01.py b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test01.py
new file mode 100644
index 0000000000000000000000000000000000000000..40ba17227cfb14d51992316b5435bfa535da7dff
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test01.py
@@ -0,0 +1,3 @@
+a = 'Kongens_Lyngby_2800'
+s = standardize_address(a)
+print(s)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test02.py b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test02.py
new file mode 100644
index 0000000000000000000000000000000000000000..019b1b08eea63bc64f287e71ec36e19e81671902
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test02.py
@@ -0,0 +1,3 @@
+a = '10000_Zagreb'
+s = standardize_address(a)
+print(s)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test03.py b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test03.py
new file mode 100644
index 0000000000000000000000000000000000000000..39271e7428f8805c0086dec61ef5fb1d7f38d87d
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test03.py
@@ -0,0 +1,3 @@
+a = '43500 Daruvar'
+s = standardize_address(a)
+print(s)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test04.py b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test04.py
new file mode 100644
index 0000000000000000000000000000000000000000..11ecdbe804007d8c8fa1c5c4f7443d0f6111e0fa
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test04.py
@@ -0,0 +1,3 @@
+a = 'Egtved_6040'
+s = standardize_address(a)
+print(s)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test05.py b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test05.py
new file mode 100644
index 0000000000000000000000000000000000000000..99ed9338f4adc0383de6125f9a45c313be9c0c0a
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test05.py
@@ -0,0 +1,3 @@
+a = 'Vejle 7200'
+s = standardize_address(a)
+print(s)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test06.py b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test06.py
new file mode 100644
index 0000000000000000000000000000000000000000..347a62a1e08431cc3bb2a2ce04f3438f22e2d588
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test06.py
@@ -0,0 +1,3 @@
+a = '02108_Boston'
+s = standardize_address(a)
+print(s)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test07.py b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test07.py
new file mode 100644
index 0000000000000000000000000000000000000000..570213987d19c582ab3e54828b7e7b60879747d4
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test07.py
@@ -0,0 +1,3 @@
+a = 'Pasadena_91001'
+s = standardize_address(a)
+print(s)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test08.py b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test08.py
new file mode 100644
index 0000000000000000000000000000000000000000..780913a21e7f0b183f2250930110182468eb6f8a
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test08.py
@@ -0,0 +1,3 @@
+a = '90001_Los_Angeles'
+s = standardize_address(a)
+print(s)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test09.py b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test09.py
new file mode 100644
index 0000000000000000000000000000000000000000..1796c73f858b6908be9a1b5c1ba9ecf8213714c6
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test09.py
@@ -0,0 +1,3 @@
+a = 'San_Francisco_94016'
+s = standardize_address(a)
+print(s)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test10.py b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test10.py
new file mode 100644
index 0000000000000000000000000000000000000000..38a5f868bdb5b2096a5eaede19702ebe6ba8b0ad
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/standardize_address/Evaluation/Test10.py
@@ -0,0 +1,3 @@
+a = 'Rio_de_Jainero_22775'
+s = standardize_address(a)
+print(s)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/standardize_address/Tests/Test1.py b/examples/presentation/to_import/Vedrana/standardize_address/Tests/Test1.py
new file mode 100644
index 0000000000000000000000000000000000000000..777f422322b8c5ed6557f6edd32f30c59ef07032
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/standardize_address/Tests/Test1.py
@@ -0,0 +1,3 @@
+a = 'New York 10001'
+s = standardize_address(a)
+print(s)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/standardize_address/standardize_address.py b/examples/presentation/to_import/Vedrana/standardize_address/standardize_address.py
new file mode 100644
index 0000000000000000000000000000000000000000..d979c3362c4a85e9702eaaeb9cf8736b790208f4
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/standardize_address/standardize_address.py
@@ -0,0 +1,7 @@
+def standardize_address(a):
+    s = a.replace('_', ' ')
+    if not s[0].isnumeric():
+        i = s[-1::-1].find(' ')
+        i = len(s) - 1 - i
+        s = s[i+1:] + s[i] + s[:i]
+    return s
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test01.py b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test01.py
new file mode 100644
index 0000000000000000000000000000000000000000..054a9bf89ad19d63c3c6d15baf6ddb402d28765f
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test01.py
@@ -0,0 +1,7 @@
+import numpy as np
+
+board = np.array([[1, 2, 0], 
+    [1, 2, 0], 
+    [1, 2, 0]])
+score = tictactoe(board)
+print(score)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test02.py b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test02.py
new file mode 100644
index 0000000000000000000000000000000000000000..71895dbc2a5f857a53842e1dbf685b62d302cc29
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test02.py
@@ -0,0 +1,7 @@
+import numpy as np
+
+board = np.array([[1, 1, 1], 
+    [2, 1, 2], 
+    [2, 2, 1]])
+score = tictactoe(board)
+print(score)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test03.py b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test03.py
new file mode 100644
index 0000000000000000000000000000000000000000..41e2f28b422c63fe133c5f2db5c20f72b33668c9
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test03.py
@@ -0,0 +1,7 @@
+import numpy as np
+
+board = np.array([[2, 0, 1], 
+    [2, 1, 0], 
+    [0, 0, 2]])
+score = tictactoe(board)
+print(score)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test04.py b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test04.py
new file mode 100644
index 0000000000000000000000000000000000000000..667f8494ae9f6966c1423c6c7d498b971478aae2
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test04.py
@@ -0,0 +1,7 @@
+import numpy as np
+
+board = np.array([[1, 0, 2], 
+    [0, 1, 0], 
+    [2, 0, 1]])
+score = tictactoe(board)
+print(score)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test05.py b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test05.py
new file mode 100644
index 0000000000000000000000000000000000000000..14f028150260ebabf1198edc1823ca67c9e6ce8b
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test05.py
@@ -0,0 +1,7 @@
+import numpy as np
+
+board = np.array([[2, 0, 1], 
+    [0, 2, 1], 
+    [0, 0, 1]])
+score = tictactoe(board)
+print(score)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test06.py b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test06.py
new file mode 100644
index 0000000000000000000000000000000000000000..5a8b5d3dc1318b51a5efba7b9d8040bbca2f0ab4
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test06.py
@@ -0,0 +1,7 @@
+import numpy as np
+
+board = np.array([[0, 1, 0], 
+    [0, 1, 1], 
+    [2, 2, 2]])
+score = tictactoe(board)
+print(score)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test07.py b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test07.py
new file mode 100644
index 0000000000000000000000000000000000000000..d6231aeaeddbc62aebf6951bf484529f3074420b
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test07.py
@@ -0,0 +1,7 @@
+import numpy as np
+
+board = np.array([[1, 1, 2], 
+    [0, 2, 0], 
+    [2, 1, 0]])
+score = tictactoe(board)
+print(score)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test08.py b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test08.py
new file mode 100644
index 0000000000000000000000000000000000000000..0f868fec9be14bdd1f57b3de58abf6a03e8db4a3
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test08.py
@@ -0,0 +1,7 @@
+import numpy as np
+
+board = np.array([[1, 1, 1], 
+    [0, 2, 0], 
+    [0, 0, 0]])
+score = tictactoe(board)
+print(score)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test09.py b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test09.py
new file mode 100644
index 0000000000000000000000000000000000000000..ef881fdbadbdbcacf62c32deb8199db8a42063b8
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test09.py
@@ -0,0 +1,7 @@
+import numpy as np
+
+board = np.array([[1, 2, 1], 
+    [2, 1, 0], 
+    [2, 0, 1]])
+score = tictactoe(board)
+print(score)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test10.py b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test10.py
new file mode 100644
index 0000000000000000000000000000000000000000..69ebfa2a4097330df0d742c11e8f119993dbe265
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/tictactoe/Evaluation/Test10.py
@@ -0,0 +1,7 @@
+import numpy as np
+
+board = np.array([[0, 0, 0], 
+    [0, 1, 0], 
+    [0, 0, 0]])
+score = tictactoe(board)
+print(score)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/tictactoe/Tests/Test1.py b/examples/presentation/to_import/Vedrana/tictactoe/Tests/Test1.py
new file mode 100644
index 0000000000000000000000000000000000000000..1bef77eb43c7ebb4b7306b34bc9c417248a99c49
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/tictactoe/Tests/Test1.py
@@ -0,0 +1,7 @@
+import numpy as np
+
+board = np.array([[2, 1, 1], 
+    [1, 1, 2], 
+    [2, 0, 0]])
+score = tictactoe(board)
+print(score)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/tictactoe/tictactoe.py b/examples/presentation/to_import/Vedrana/tictactoe/tictactoe.py
new file mode 100644
index 0000000000000000000000000000000000000000..5951a63e5c558a5c928650aed3cf4d8086f134b9
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/tictactoe/tictactoe.py
@@ -0,0 +1,20 @@
+import numpy as np
+
+def tictactoe(board):
+    def wins(b):
+        return(np.all(b, axis=0).sum() + np.all(b, axis=1).sum() + 
+                 np.all(b.ravel()[[0,4,8]]) + np.all(b.ravel()[[2,4,6]]))
+    
+    ones_wins = wins(board==1)
+    twos_wins = wins(board==2)
+    d = np.sum(board==1) - np.sum(board==2)  #  0 or 1 for a valid board
+    
+    if d<0 or d>1 or (ones_wins + twos_wins) > 1:
+        score = -1
+    elif ones_wins:
+        score = 1
+    elif twos_wins:
+        score = 2
+    else:
+        score=0    
+    return score
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test01.py b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test01.py
new file mode 100644
index 0000000000000000000000000000000000000000..4852314c5ca2b4d80cb16b47ddb9abd67b88af61
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test01.py
@@ -0,0 +1,4 @@
+hour = 14
+minute = 55
+a = time_angle(hour, minute)
+print(a)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test02.py b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test02.py
new file mode 100644
index 0000000000000000000000000000000000000000..c6117a31668eca68d398cb291074ceed9fd96207
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test02.py
@@ -0,0 +1,4 @@
+hour = 11
+minute = 5
+a = time_angle(hour, minute)
+print(a)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test03.py b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test03.py
new file mode 100644
index 0000000000000000000000000000000000000000..694829d2fb6a70bacafda4c8baf5d002199aa3f4
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test03.py
@@ -0,0 +1,4 @@
+hour = 20
+minute = 18
+a = time_angle(hour, minute)
+print(a)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test04.py b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test04.py
new file mode 100644
index 0000000000000000000000000000000000000000..c7ae78748cdbd0f3313d286076859b77289f8c99
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test04.py
@@ -0,0 +1,4 @@
+hour = 2
+minute = 45
+a = time_angle(hour, minute)
+print(a)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test05.py b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test05.py
new file mode 100644
index 0000000000000000000000000000000000000000..ad41cba7782dca0a1d2bc3fca3ce102d04e929fb
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test05.py
@@ -0,0 +1,4 @@
+hour = 23
+minute = 3
+a = time_angle(hour, minute)
+print(a)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test06.py b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test06.py
new file mode 100644
index 0000000000000000000000000000000000000000..6348fa03d32e58dba5dcbb36ea4f3b4501778e1b
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test06.py
@@ -0,0 +1,4 @@
+hour = 10
+minute = 22
+a = time_angle(hour, minute)
+print(a)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test07.py b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test07.py
new file mode 100644
index 0000000000000000000000000000000000000000..e42ad3422254f5d22597accbc89237caa3c2318f
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test07.py
@@ -0,0 +1,4 @@
+hour = 5
+minute = 37
+a = time_angle(hour, minute)
+print(a)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test08.py b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test08.py
new file mode 100644
index 0000000000000000000000000000000000000000..db82b316ff5c86511cf5758f096c4e4d11011dc2
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test08.py
@@ -0,0 +1,4 @@
+hour = 16
+minute = 40
+a = time_angle(hour, minute)
+print(a)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test09.py b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test09.py
new file mode 100644
index 0000000000000000000000000000000000000000..00150cd6c92320722720067f317ec496706e95a5
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test09.py
@@ -0,0 +1,4 @@
+hour = 12
+minute = 0
+a = time_angle(hour, minute)
+print(a)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test10.py b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test10.py
new file mode 100644
index 0000000000000000000000000000000000000000..60ccab5d69980d25e71ac760bf10caa31bafe13a
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/time_angle/Evaluation/Test10.py
@@ -0,0 +1,4 @@
+hour = 6
+minute = 0
+a = time_angle(hour, minute)
+print(a)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/time_angle/Tests/Test1.py b/examples/presentation/to_import/Vedrana/time_angle/Tests/Test1.py
new file mode 100644
index 0000000000000000000000000000000000000000..634447856b65fa2acf7ecd31ee5b50b681d49267
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/time_angle/Tests/Test1.py
@@ -0,0 +1,4 @@
+hour = 8
+minute = 20
+a = time_angle(hour, minute)
+print(a)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/time_angle/time_angle.py b/examples/presentation/to_import/Vedrana/time_angle/time_angle.py
new file mode 100644
index 0000000000000000000000000000000000000000..1ccdb62c811b9f19ed9d0d54c67e8302ca1b9ece
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/time_angle/time_angle.py
@@ -0,0 +1,11 @@
+def time_angle(hour, minute):
+
+    hour = hour % 12
+    hour_hand = 360 * (hour + minute / 60) / 12
+    minute_hand = 360 * minute / 60
+    
+    a = hour_hand - minute_hand
+    if a<0:
+        a = a + 360
+        
+    return a
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test01.py b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test01.py
new file mode 100644
index 0000000000000000000000000000000000000000..f5f2ff8547c3eda6ac7fa686fffe959614d4a1ae
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test01.py
@@ -0,0 +1,6 @@
+import numpy as np
+
+h0 = 120
+r = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
+h = water_height(h0, r)
+print(h)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test02.py b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test02.py
new file mode 100644
index 0000000000000000000000000000000000000000..14392fc0372b0c73ec2cb04949cf39c88cc05321
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test02.py
@@ -0,0 +1,6 @@
+import numpy as np
+
+h0 = 12
+r = np.array([])
+h = water_height(h0, r)
+print(h)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test03.py b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test03.py
new file mode 100644
index 0000000000000000000000000000000000000000..d480009aa8902a85426b23ea01ee11a592559645
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test03.py
@@ -0,0 +1,6 @@
+import numpy as np
+
+h0 = 14.2
+r = np.array([8.8])
+h = water_height(h0, r)
+print(h)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test04.py b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test04.py
new file mode 100644
index 0000000000000000000000000000000000000000..a324644707f7725ce5c9171ee8f36a156a2c9ac6
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test04.py
@@ -0,0 +1,6 @@
+import numpy as np
+
+h0 = 0
+r = np.array([0.8])
+h = water_height(h0, r)
+print(h)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test05.py b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test05.py
new file mode 100644
index 0000000000000000000000000000000000000000..6d78ea0e249c7de061998012f635d9528b0adf53
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test05.py
@@ -0,0 +1,6 @@
+import numpy as np
+
+h0 = 3
+r = np.array([0, 1, 2, 0, 0, 5.2, 6.5, 7.1, 0, 0, 0.1, 1, 2.9, 0.13, 0, 2, 0, 0])
+h = water_height(h0, r)
+print(h)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test06.py b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test06.py
new file mode 100644
index 0000000000000000000000000000000000000000..80e9a070f1ba3a932eb720b89d7dcbfa5c0ccb93
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test06.py
@@ -0,0 +1,6 @@
+import numpy as np
+
+h0 = 0
+r = np.array([0, 5, 2, 0, 0, 5.2, 6.5, 7.1, 0, 0, 0.1, 1, 2.9, 0.13, 0, 1.2, 0, 1.2, 7.5, 0])
+h = water_height(h0, r)
+print(h)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test07.py b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test07.py
new file mode 100644
index 0000000000000000000000000000000000000000..0a2a1eb4e626fe7799e72d90accb730c9a469223
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test07.py
@@ -0,0 +1,6 @@
+import numpy as np
+
+h0 = 0
+r = np.array([0, 0, 2, 2.1, 2.4, 2.2, 2.5])
+h = water_height(h0, r)
+print(h)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test08.py b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test08.py
new file mode 100644
index 0000000000000000000000000000000000000000..e66793f6d52388b5d71f4425680662eeacb31f10
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test08.py
@@ -0,0 +1,6 @@
+import numpy as np
+
+h0 = 18
+r = np.array([30, 1, 28.8])
+h = water_height(h0, r)
+print(h)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test09.py b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test09.py
new file mode 100644
index 0000000000000000000000000000000000000000..0efe12fb9d89a0b1be6835044937cdebbdb18cc9
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test09.py
@@ -0,0 +1,6 @@
+import numpy as np
+
+h0 = 1
+r = np.array([0.5])
+h = water_height(h0, r)
+print(h)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test10.py b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test10.py
new file mode 100644
index 0000000000000000000000000000000000000000..119f39a7e47e35a7ce6f24f00295b8a50d406e01
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/water_height/Evaluation/Test10.py
@@ -0,0 +1,6 @@
+import numpy as np
+
+h0 = 2
+r = np.array([])
+h = water_height(h0, r)
+print(h)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/water_height/Tests/Test1.py b/examples/presentation/to_import/Vedrana/water_height/Tests/Test1.py
new file mode 100644
index 0000000000000000000000000000000000000000..3e19e5f7342c074fda252c1c1b3873db28e98025
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/water_height/Tests/Test1.py
@@ -0,0 +1,6 @@
+import numpy as np
+
+h0 = 5
+r = np.array([4.5, 0, 1.5, 0, 0, 0.5, 1, 2, 5])
+h = water_height(h0, r)
+print(h)
\ No newline at end of file
diff --git a/examples/presentation/to_import/Vedrana/water_height/water_height.py b/examples/presentation/to_import/Vedrana/water_height/water_height.py
new file mode 100644
index 0000000000000000000000000000000000000000..b96acb535cba9c53027c7bbfc8a1cae1743b8019
--- /dev/null
+++ b/examples/presentation/to_import/Vedrana/water_height/water_height.py
@@ -0,0 +1,5 @@
+def water_height(h0, r):
+    h = h0
+    for ri in r:
+        h = max(h + ri - 2, 0)
+    return h
\ No newline at end of file
diff --git a/examples/presentation/to_import/alceste_latex.zip b/examples/presentation/to_import/alceste_latex.zip
new file mode 100644
index 0000000000000000000000000000000000000000..25fa3c00667ea5fc781109485e75efb054c62e8c
Binary files /dev/null and b/examples/presentation/to_import/alceste_latex.zip differ
diff --git a/examples/presentation/to_import/lang.txt b/examples/presentation/to_import/lang.txt
new file mode 100644
index 0000000000000000000000000000000000000000..614aac879c4078f9da6ed9b151a5c9ac10fd973a
--- /dev/null
+++ b/examples/presentation/to_import/lang.txt
@@ -0,0 +1,4 @@
+Answer    
+    filter call_regexp_common C
+    extension ans
+    3rd_gen_scale 2.29
diff --git a/examples/presentation/to_import/latex/dtu.png b/examples/presentation/to_import/latex/dtu.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa3a9ad3711fd12684bf52ef028be153d1549f2f
Binary files /dev/null and b/examples/presentation/to_import/latex/dtu.png differ
diff --git a/examples/presentation/to_import/latex/exercise-01.tex b/examples/presentation/to_import/latex/exercise-01.tex
new file mode 100644
index 0000000000000000000000000000000000000000..99850fc8ba4a1fd8c1a645d9e19c5595f4693fe0
--- /dev/null
+++ b/examples/presentation/to_import/latex/exercise-01.tex
@@ -0,0 +1,158 @@
+\exercise{Exercise 1. Vector Fields (2.5 points)}
+
+\noindent%
+Alice needs to perform computations on \emph{vector fields}, i.e.,
+matrices having bidimensional geometric vectors as elements.
+%
+Alice has already written some code.
+Her first test program is in file \texttt{ex01-main.cpp}
+and the (incomplete) code with some functions she needs is in files
+\texttt{ex01-library.h} and \texttt{ex01-library.cpp}.
+Such files are available with this exam paper (in a separate ZIP archive),
+and they are also reported in the next pages. 
+
+\paragraph{Structure of the code.}
+A geometric vector is represented as a\; \lil{struct Vector} \;with two fields,
+named \lil{x} and \lil{y}:
+they are, respectively, the $x$ and $y$ component of the vector.
+Alice's code already includes the function:
+\begin{quote}
+  \lil{void deleteField(Vector **A, unsigned int nRows)}
+\end{quote}
+which deallocates a vector field
+allocated with \lil{createField()}
+(see task~\ref{ex:createField} below).
+
+\paragraph{Tasks.} Help Alice by completing the following tasks.
+You need to edit and submit the file \texttt{ex01-library.cpp}.
+
+\begin{enumerate}[label=\textbf{{(\alph*)}}]
+
+\item\label{ex:createField}
+  Implement the function:
+  \begin{quote}
+    \small
+    \lil{Complex **createField(unsigned int m, unsigned int n, Vector v)} 
+  \end{quote}
+  The function must return an array of
+  \lil{m}\,$\times$\,\lil{n} \lil{Vector}s, i.e.,
+  \lil{Vector **}.
+  It must allocate the required memory,
+  and initialise each array element as argument \lil{v}.
+
+  \bigskip
+
+\item Implement the function:
+  \begin{quote}
+    \small
+    \lil{void displayField(Vector **A, unsigned int m, unsigned int n)}
+  \end{quote}
+  The function must print on screen the contents of the vector field \lil{A}
+  of size \lil{m}\,$\times$\,\lil{n}:
+  \begin{itemize}[nosep]
+  \item
+    each vector must be printed as \texttt{($x$,$y$)} \emph{without} spaces
+    between the $x$,$y$ field values;
+  \item
+    elements on a same row must be separated by one space;
+  \item
+    there must be no space after the last element of each row.
+  \end{itemize}
+  For example, a $2 \times 4$ vector field should look like:
+  \begin{quote}
+    \begin{verbatim}
+(1,2) (2,5) (4,4) (1,2)
+(1,2) (0,2) (0,2) (2,6)
+\end{verbatim}
+  \end{quote}
+
+  \bigskip
+  \hfill\tbc
+  \clearpage
+
+\item Implement the function:
+  \begin{quote}
+    \small
+    \begin{lstlisting}[language=C++]
+void addFields(Vector **A, Vector **B, Vector **C,
+                 unsigned int m, unsigned int n)
+\end{lstlisting}
+  \end{quote}
+  Where:
+  \begin{itemize}
+  \item argument \lil{A} is a vector field of size \lil{m}$\,\times\,$\lil{n};
+  \item argument \lil{B} is a vector field of size \lil{m}$\,\times\,$\lil{n};
+  \item argument \lil{C} is a vector field of size \lil{m}$\,\times\,$\lil{n}.
+  \end{itemize}
+  The function must add the corresponding elements of \lil{A} by \lil{B},
+  storing the result in \lil{C}.
+  Therefore, as in standard matrix addition,
+  the element at row $i$ % (for $0 \leq i < m$)
+  and column $j$ % (for $0 \leq j < n$)
+  of \lil{C} is computed as:
+  \[
+      \text{\lil{C}}_{i,j} \;=\; \text{\lil{A}}_{i,j} + \text{\lil{B}}_{i,j}
+  \]
+  where ``$+$'' is the standard vector addition:
+  the addition of two \lil{Vector}s \lil{u} and \lil{v}
+  is a \lil{Vector}
+  whose fields have values \lil{u.x}\,+\,\lil{v.x} and \lil{u.y}\,+\,\lil{v.y}.
+
+  \bigskip
+
+\item Implement the function:
+  \begin{quote}
+    \small
+    \begin{lstlisting}[language=C++]
+void scaleField(Vector **A, double c, unsigned int m, unsigned int n)
+\end{lstlisting}
+  \end{quote}
+  Where:
+  \begin{itemize}
+  \item argument \lil{A} is a vector field of size \lil{m}$\,\times\,$\lil{n};
+  \item argument \lil{c} is a scalar value.
+  \end{itemize}
+  The function must multiply each element of \lil{A} by \lil{c},
+  storing the result in \lil{A} itself.
+  More precisely, the element at row $i$ % (for $0 \leq i < m$)
+  and column $j$ % (for $0 \leq j < n$)
+  of \lil{A} must be updated as follows:
+  \[
+      \text{\lil{A}}_{i,j} \;=\; \text{\lil{A}}_{i,j} \times \text{\lil{c}}
+  \]
+  where ``$\times$'' is the standard vector scalar multiplication:
+  to multiply a \lil{Vector v} by a scalar \lil{c},
+  we multiply both \lil{v.x} and \lil{v.y} by \lil{c}.
+  
+  % The function must store the result of the operation in \lil{A} itself.
+
+\end{enumerate}
+
+\noindent
+\begin{minipage}[t]{0.45\textwidth}
+\noindent
+\textbf{File \texttt{ex01-main.cpp}}
+{\scriptsize
+%\lstinputlisting[language=C++, basicstyle=\ttfamily]{ex01-main.cpp}}
+\lstinputlisting[language=C++]{../code/ex01/ex01-main.cpp}}
+\bigskip
+\noindent
+\textbf{File \texttt{ex01-library.h}}
+{\scriptsize
+\lstinputlisting[language=C++]{../code/ex01/ex01-library.h}}
+\end{minipage}
+%\tbc
+%\clearpage
+\begin{minipage}[t]{0.5\textwidth}
+%\noindent
+%\textbf{File \texttt{ex01-library.h}}
+%{\scriptsize
+%\lstinputlisting[language=C++, basicstyle=\ttfamily]{ex01-library.h}}
+%\bigskip
+\noindent
+\textbf{File \texttt{ex01-library.cpp}}
+{\scriptsize
+\lstinputlisting[language=C++, lastline=44]{../code/ex01/ex01-library.cpp}}
+\end{minipage}
+
+\clearpage
diff --git a/examples/presentation/to_import/latex/exercise-02.tex b/examples/presentation/to_import/latex/exercise-02.tex
new file mode 100644
index 0000000000000000000000000000000000000000..63cd6f1a577a970cfdc458c05bb1dc27d08ff0da
--- /dev/null
+++ b/examples/presentation/to_import/latex/exercise-02.tex
@@ -0,0 +1,135 @@
+% !TEX root = exam-E20.tex
+
+\exercise{Exercise 2. RLE Linked List (2.5 points)}
+
+\noindent
+Bob wants to build a linked list with a compression technique called
+\emph{Run-Length Encoding (RLE)}: each element of the list records
+on how many times its value is repeated.
+For instance, the following sequence of values
+\begin{quote}
+  \texttt{1 1 25 3 3 3 3 3 42 42 5 5 5 5 5 5 5 5 5 5 42 42 42 42 42 42 42 42}
+\end{quote}
+is compressed with RLE as a sequence of values with their
+respective number of repetitions:
+\begin{quote}
+    \texttt{1}\textsubscript{\em($\times$2)}\; \texttt{25}\textsubscript{\em($\times$1)}\;
+    \texttt{3}\textsubscript{\em($\times$5)}\; \texttt{42}\textsubscript{\em($\times$2)}\;
+    \texttt{5}\textsubscript{\em($\times$10)}\; \texttt{42}\textsubscript{\em($\times$8)}
+\end{quote}  
+
+Bob has already written some code.
+His first test program is in file \texttt{ex02-main.cpp}
+and the (incomplete) code with some functions he needs is in files
+\texttt{ex02-library.h} and \texttt{ex02-library.cpp}.
+Such files are available with this exam paper (in a separate ZIP archive),
+and they are also reported in the next pages. 
+
+\paragraph{Structure of the code.}
+An RLE list element is represented as a\; \lil{struct Elem} \;with three fields,
+named \lil{value}, \lil{times}, and \lil{next}:
+they are, respectively, the value of the list element,
+the number of times that value is repeated,
+and the pointer to the next list element
+(or \lil{nullptr} when there are no more elements).
+An empty list is represented as an \lil{Elem*} pointer equal to \lil{nullptr}.
+Bob's code already includes the function:
+\begin{quote}
+  \lil{void displayRLEList(Elem *list)}
+\end{quote}
+which prints an RLE list on screen, in the compressed form shown above. 
+
+\paragraph{Tasks.} Help Bob by completing the following tasks.
+You need to edit and submit the file \texttt{ex02-library.cpp}.
+
+\begin{enumerate}[label=\textbf{{(\alph*)}},itemsep=10mm]
+\item Implement the function:
+  \begin{quote}
+    \lil{Elem* reverse(Elem *list);}
+  \end{quote}	
+  which reverses the RLE list \lil{list} \emph{in place},
+  that is, by updating the pointers of its elements.
+  The function returns a pointer to the first element of the reversed list
+  (which corresponds to the last element of the original \lil{list}).
+  For example: if the RLE list\;
+  \texttt{7}\textsubscript{\em($\times$25)} \texttt{9}\textsubscript{\em($\times$90)}
+  \;is reversed, the result is\;
+  \texttt{9}\textsubscript{\em($\times$90)} \texttt{7}\textsubscript{\em($\times$25)}.
+  
+  \bigskip
+  \hfill\tbc
+  \clearpage
+
+\item\label{ex02:append} Implement the function:
+  \begin{quote}
+    \lil{Elem* concatenate(Elem *list1, Elem *list2)}
+  \end{quote}	
+  which concatenates the lists \lil{list1} and \lil{list2},
+  and returns a pointer to the first \lil{Elem}ent of the resulting list.
+  The function must compress the repetitions resulting from the concatenation.
+  For example, if the arguments of the function are:
+  \begin{itemize}
+    \item \lil{list1} \;=\;
+      \texttt{7}\textsubscript{\em($\times$2)} \texttt{6}\textsubscript{\em($\times$1)} \texttt{9}\textsubscript{\em($\times$2)}
+    \item \lil{list2} \;=\;
+      \texttt{9}\textsubscript{\em($\times$3)} \texttt{10}\textsubscript{\em($\times$3)}
+  \end{itemize}
+  %
+  then the resulting list must be:\;
+  \begin{center}
+    \texttt{7}\textsubscript{\em($\times$2)} \texttt{6}\textsubscript{\em($\times$1)} \texttt{9}\textsubscript{\em($\times$5)} \texttt{10}\textsubscript{\em($\times$3)}
+  \end{center}
+  Notice that the last element of \lil{list1} and the first element of \lil{list2}
+  have been compressed into one.
+
+  \emph{Important:}
+  the function must \emph{not} use \lil{delete}
+  on any element of \lil{list1} nor \lil{list2}.
+  Besides this, you can choose to implement the function by either
+  creating and returning a new list,
+  or modifying \lil{list1} and \lil{list2}.
+
+\item Implement the function:
+  \begin{quote}
+    \lil{int sum(Elem *list)}
+  \end{quote}	
+  which returns the sum of the elements of \lil{list},
+  taking into account their repetitions.
+  For example, if \lil{list} is\;
+  \texttt{7}\textsubscript{\em($\times$2)} \texttt{6}\textsubscript{\em($\times$1)} \texttt{9}\textsubscript{\em($\times$2)},
+  \; then the function must return 38.
+  
+  %% \emph{Note:} this task can be solved using recursion,
+  %% although this strategy would require writing an auxiliary recursive function
+  %% that maintains the current total
+\end{enumerate}
+
+    %\bigskip
+  %\hfill\tbc
+  \clearpage
+
+  \noindent
+  \begin{minipage}[t]{0.48\textwidth}
+  \noindent
+  \textbf{File \texttt{ex02-library.h}}
+  {\scriptsize
+  \lstinputlisting[language=C++]{../code/ex02/ex02-library.h}}
+  \vspace{20mm}
+  \textbf{File \texttt{ex02-main.cpp}}
+  {\scriptsize
+  \lstinputlisting[language=C++]{../code/ex02/ex02-main.cpp}}
+  \end{minipage}
+  %\tbc
+  %\clearpage
+  \begin{minipage}[t]{0.5\textwidth}
+  %\noindent
+  %\textbf{File \texttt{ex01-library.h}}
+  %{\scriptsize
+  %\lstinputlisting[language=C++, basicstyle=\ttfamily]{ex01-library.h}}
+  %\bigskip
+  \noindent
+  \textbf{File \texttt{ex02-library.cpp}}
+  {\scriptsize
+  \lstinputlisting[language=C++, lastline=44]{../code/ex02/ex02-library.cpp}}
+  \end{minipage}
+  
\ No newline at end of file
diff --git a/examples/presentation/to_import/latex/exercise-03.tex b/examples/presentation/to_import/latex/exercise-03.tex
new file mode 100644
index 0000000000000000000000000000000000000000..9c7323ca1f00ae6cd65ca1cf6c742c8cdb4b0814
--- /dev/null
+++ b/examples/presentation/to_import/latex/exercise-03.tex
@@ -0,0 +1,166 @@
+\exercise{Exercise 3. Grocery List (2.5 points)}
+
+\noindent
+Claire wants to implement a class \lil{GroceryList}
+to store and update her grocery list.
+She has already written some code:
+her first test program is in file \texttt{ex03-main.cpp}
+and the (incomplete) code of the class is in files
+\texttt{ex03-library.h} and \texttt{ex03-library.cpp}.
+Such files are available with this exam paper (in a separate ZIP archive),
+and they are also reported in the next pages. 
+
+\paragraph{Structure of the code.}
+Claire has represented the information about each entry in the grocery list
+using a\; \lil{struct Info}, \;with two fields:
+\begin{itemize}[nosep]
+\item \lil{quantity}: how much to buy of a certain item;
+\item \lil{notes}: any remark about the item.
+\end{itemize}
+%
+Claire knows that the \lil{map} and \lil{vector} containers of the C++ standard library
+provide many functionalities she needs.
+\emph{(See hints on page~\pageref{ref:maps-hints}.)} %
+Therefore, she has decided to use the following internal (\lil{private})
+representation for the library:
+
+\begin{itemize}
+\item{\lil{vector<string> items}}
+  --- the names of the items to buy; 
+\item{\lil{map<string,Info> itemsInfo}}
+  --- a mapping from \lil{string}s (item names) to instances of \lil{Info}
+  (the information about the item to buy).
+\end{itemize}
+
+Claire has already implemented the default constructor of \texttt{GroceryList},
+which creates a database with some needed items.
+She has also implemented the method \texttt{display()},
+which shows the contents of the grocery list.
+
+\paragraph{Tasks.} Help Claire by completing the following tasks.
+You need to edit and submit the file \texttt{ex03-library.cpp}.
+
+\begin{enumerate}[label=\textbf{{(\alph*)}},itemsep=10mm]
+\item\label{ex03:addItem} Implement the following method to add an entry to the grocery list:
+  \begin{quote}
+    \small
+    \hspace{-9mm}%
+    \lil{void GroceryList::add(string name, unsigned int quantity, string notes)}
+  \end{quote}
+  The method must work as follows:
+  \begin{enumerate}[label=\emph{(\alph*)}]
+  \item\label{ex03:title-exists} if \lil{name} is \emph{not} in the grocery list,
+    add the given \lil{name} at the end of the \lil{items} vector,
+    and map it to the given \lil{quantity} and \lil{notes} (by updating \lil{itemsInfo});
+  \item\label{ex03:score-invalid} if \lil{name} is already in the grocery list,
+    update its information in \lil{itemsInfo} as follows:
+    \begin{enumerate}
+      \item increase the original quantity by the given \lil{quantity}.
+        For example: if the original quantity is \lil{100}
+        and the method is invoked with \lil{quantity=200},
+        the updated quantity must be \lil{300};
+      \item extend the original notes by adding \lil{";"} and the given \lil{notes}.
+        For example: if the original notes are \lil{"A"}
+        and the method is invoked with \lil{notes="B"},
+        the updated notes must be \lil{"A;B"}.
+    \end{enumerate}
+  \end{enumerate}
+
+  \bigskip
+  \hfill\tbc
+  \clearpage
+
+\item Implement the method:
+  \begin{quote}
+    \small%
+    \lil{bool GroceryList::remove(string name, unsigned int quantity)}
+  \end{quote}
+
+  This method tries to remove the given \lil{quantity} from the
+  grocery list item with the given \lil{name}; it returns \lil{true}
+  if the operation succeeds, and \lil{false} otherwise.
+  The method must work as follows:
+  \begin{enumerate}[label=\emph{(\alph*)}]
+  \item if the grocery list does \emph{not} contain an item with the given
+    \lil{name},
+    then the method returns \lil{false} without changing the grocery list;
+  \item if the grocery list \emph{does} contain an item with the given
+    \lil{name}, then:
+    \begin{itemize}
+      \item if the item's quantity is lower than the given \lil{quantity},
+        then the method must return \lil{false} without changing the grocery list.
+      \item otherwise, the method must reduce the item's quantity
+        by subtracting the given \lil{quantity}; then,
+        if the updated item quantity becomes \lil{0},
+        then the method must remove the item from the
+        shopping list. \emph{(See hints below.)} %
+        In either case, the method must return \lil{true}.
+    \end{itemize}
+  \end{enumerate}
+
+  \bigskip
+
+  \item Implement the method:
+  \begin{quote}
+    \small%
+    \lil{bool GroceryList::copyEntry(string name, string newName)}
+  \end{quote}
+
+  This method creates a new grocery list entry named \lil{newName},
+  by copying the information of the item called \lil{name};
+  it returns \lil{true} if the operation succeeds, and \lil{false} otherwise.
+  The method must work as follows:
+  \begin{enumerate}[label=\emph{(\alph*)}]
+  \item if the grocery list does \emph{not} contain an item with the given
+    \lil{name}, \emph{or} it already contains an item called \lil{newName},
+    then the method returns \lil{false} without changing the grocery list;
+  \item otherwise, the method must add \lil{newName} at the end of the
+    \lil{items} vector, and update \lil{itemsInfo} to map \lil{newName}
+    to the same information of \lil{name}.
+  \end{enumerate}
+\end{enumerate}
+
+\bigskip
+  
+\paragraph{Hints on using \lil{map}s and \lil{vector}s}
+\label{ref:maps-hints}%
+\begin{itemize}[nosep]
+\item A key \lil{k} in a map \lil{m} can be mapped to \lil{v} with:\; \lil{m[k] = v};
+  \;with this operation, the entry for \lil{k} in \lil{m} is created (if not already present)
+  or updated (if already present).
+\item To check if key \lil{k} is present in map \lil{m}, you can check:\; \lil{m.find(k) != m.end()}.
+\item The value mapped to a key \lil{k} in a map \lil{m} is obtained with:\; \lil{m[k]}.
+\item To remove an element from a map or a vector, you can use their \lil{erase(...)} methods.
+\end{itemize}
+
+\clearpage
+
+\noindent
+\textbf{File \texttt{ex03-main.cpp}}
+{\scriptsize
+%\lstinputlisting[language=C++, basicstyle=\ttfamily]{ex01-main.cpp}}
+\lstinputlisting[language=C++]{../code/ex03/ex03-main.cpp}}
+\noindent
+\begin{minipage}[t]{0.48\textwidth}
+
+\bigskip
+\noindent
+\textbf{File \texttt{ex03-library.h}}
+{\scriptsize
+\lstinputlisting[language=C++]{../code/ex03/ex03-library.h}}
+\end{minipage}
+
+\bigskip
+
+%\clearpage
+\begin{minipage}[t]{0.5\textwidth}
+%\noindent
+%\textbf{File \texttt{ex01-library.h}}
+%{\scriptsize
+%\lstinputlisting[language=C++, basicstyle=\ttfamily]{ex01-library.h}}
+%\bigskip
+\noindent
+\textbf{File \texttt{ex03-library.cpp}}
+{\scriptsize
+\lstinputlisting[language=C++, lastline=44]{../code/ex03/ex03-library.cpp}}
+\end{minipage}
\ No newline at end of file
diff --git a/examples/presentation/to_import/latex/exercise-04.tex b/examples/presentation/to_import/latex/exercise-04.tex
new file mode 100644
index 0000000000000000000000000000000000000000..fb88e03dee621076b7e74aa4d2222efc8556dfa0
--- /dev/null
+++ b/examples/presentation/to_import/latex/exercise-04.tex
@@ -0,0 +1,206 @@
+\exercise{Exercise 4. Filtering Buffer (2.5 points)}
+
+\noindent%
+Daisy needs to develop a buffer class to store and retrieve
+\lil{int}eger values.
+She plans an interface consisting of 4 methods:
+\begin{itemize}[itemsep=0mm]
+\item \lil{write(v)} --- appends value \lil{v} to the buffer;
+\item \lil{read()} --- removes the oldest value from the buffer
+  and returns it;
+\item \lil{occupancy()} --- returns the number buffered values;
+\item \lil{reset()} --- empties the buffer.
+\end{itemize}
+Therefore, the buffer works in FIFO (First-In-First-Out) order:
+e.g., if \lil{write()} is invoked to append \lil{1},
+and then invoked again to append \lil{2},
+then a subsequent call to \lil{read()} must return \lil{1}, and a further
+call must return \lil{2}.
+
+For her application, Alice needs to implement a \emph{filtering} buffer
+that accumulates \emph{unique} values,
+by remembering which values it has contained during its lifecycle.
+For example, assume that a \lil{FilteringBuffer} \lil{b}
+has never contained the value \lil{42}:
+\begin{itemize}
+  \item the fist time \lil{b.write(42)} is called,
+    the value \lil{42} is appended to the buffer contents. From now on, \lil{b}
+    remembers that it has contained \lil{42}
+    --- even after \lil{42} is removed by \lil{b.read()}.
+    If \lil{b.write(42)} is executed again,
+    the operation has no effect;
+  \item if \lil{b.reset()} is called, then the buffer \lil{b} is emptied,
+    and it also ``forgets'' which values it has contained in the past.
+    Therefore, the first call \lil{b.write(42)} after the reset
+    will append \lil{42} to the buffer contents.
+\end{itemize}
+
+Daisy's first test program is in the file \texttt{ex04-main.cpp}
+and the (incomplete) code of the class is in files
+\texttt{ex04-library.h} and \texttt{ex04-library.cpp}.
+Such files are available with this exam paper (in a separate ZIP archive),
+and they are also reported in the next pages. 
+
+\paragraph{Structure of the code.}
+Daisy has defined a high-level abstract class \lil{Buffer} with the pure
+virtual methods \lil{write()}, \lil{read()}, \lil{occupancy()}, and \lil{reset()}.
+% The class is parametric: an instance
+% of \lil{Buffer<T>} contains values of type \lil{T}.
+
+\paragraph{Tasks.} Help Daisy by completing the following tasks.
+You need to edit and submit \textbf{{\color{red}two files}}:
+\texttt{ex04-library.h} and \texttt{ex04-library.cpp}.
+
+\begin{enumerate}[label=\textbf{{(\alph*)}}]
+\item\label{ex04:derive}
+  Declare in \texttt{ex04-library.h}
+  and sketch in \texttt{ex04-library.cpp}
+  a class \lil{FilteringBuffer} that extends
+  \lil{Buffer}.
+  This task is completed (and passes CodeJudge tests) when
+  \texttt{ex04-main.cpp} compiles without errors.
+  To achieve this, you will need to:
+  \begin{enumerate}[label={\arabic*.},ref={\arabic*}]
+  \item\label{ex04:constructor} define a constructor for \lil{FilteringBuffer} that takes one parameter:
+    %\begin{enumerate}[label=\emph{(\roman*)},ref={(\roman*)}]
+    %\item\label{ex04:default}
+      a value of type \lil{int} representing a default
+      (it is used in point~\ref{ex04:read} below);
+    %\end{enumerate}
+  \item
+    in \lil{FilteringBuffer},
+    override the \emph{pure virtual methods} of \lil{Buffer}
+    (i.e., those with ``\lil{=0}''), and write (possibly non-working)
+    placeholder implementations.
+  \end{enumerate}
+
+  \bigskip
+  \hfill\tbc
+  \clearpage
+
+\item\label{ex04:write}
+  This is a follow-up to point~\ref{ex04:derive} above.
+  In \texttt{ex04-library.cpp}, write a working implementation of the methods:
+  \begin{quote}
+    \lil{void FilteringBuffer::write(int v)}\\
+    \lil{unsigned int FilteringBuffer::occupancy()}
+  \end{quote}
+  The method \lil{occupancy()} returns the number of values currently stored in the buffer.
+  The intended behaviour of \lil{write(v)} is to check the value \lil{v}, and:
+  \begin{itemize}
+    \item if the buffer has already contained \lil{v} in the past,
+      then the method has no effect;
+      % For example:
+      % if buffer \lil{b} at some point has contained the value \lil{42},
+      % then \lil{b.write(42)} must have no effect;
+    \item otherwise, the method appends \lil{v} to the buffer contents,
+      and remembers that it has contained \lil{v}
+      (hence, invoking \lil{write(v)} again will have no effect).
+      Correspondingly, the buffer occupancy increases by 1.
+  \end{itemize}
+
+\item\label{ex04:read}
+  This is a follow-up to points~\ref{ex04:derive} and \ref{ex04:write} above.
+  In \texttt{ex04-library.cpp}, write a working implementation of the method:
+  \begin{quote}
+    \lil{int FilteringBuffer::read()}
+  \end{quote}
+  When \lil{read()} is invoked,
+  it removes the oldest value previously added by \lil{write()},
+  and returns it;
+  correspondingly, the value returned by \lil{occupancy()} decreases by 1.
+  Crucially, \lil{read()} must \emph{not} cause the buffer to ``forget''
+  which values it has contained in the past:
+  for example, if \lil{b.read()} returns \lil{42},
+  then invoking \lil{b.write(42)} afterwards must have no effect
+  --- because the buffer \lil{b} must remember that it has contained
+  the value \lil{42}
+  (although it might not \emph{currently} contain \lil{42}).
+
+  \emph{Special case:} if the buffer is empty, then \lil{read()}
+  must return the default value
+  specified in the constructor
+  (see point~\ref{ex04:derive}\ref{ex04:constructor} %\ref{ex04:default}
+  above).
+
+\item\label{ex04:reset}
+  This is a follow-up to points~\ref{ex04:derive}, \ref{ex04:write}, and \ref{ex04:read} above.
+  In \texttt{ex04-library.cpp}, write a working implementation of the method:
+  \begin{quote}
+    \lil{void FilteringBuffer::reset()}
+  \end{quote}
+  When \lil{reset()} is invoked,
+  the buffer becomes empty (hence, its occupancy becomes 0),
+  and it also forgets which values it has contained in the past.
+
+  For example: if buffer \lil{b} contains (or has contained) the value \lil{42},
+  then invoking \lil{b.write(42)} has no effect; however,
+  invoking \lil{b.reset()} and then \lil{b.write(42)} causes \lil{42} to be
+  appended to the (empty) buffer.
+\end{enumerate}
+
+\bigskip
+\noindent
+\textbf{NOTE:} you are free to define the \lil{private} members
+of \lil{FilteringBuffer} however you see fit.
+For instance, you might choose to store the values
+in a \lil{vector<int>}, or in a linked list. Similarly, you are free to choose
+how to remember which values have been already contained in the buffer.
+The tests will only consider
+the behaviour of the public methods \lil{write()}, \lil{read()},
+\lil{occupancy()}, and \lil{reset()}.
+
+\bigskip
+%\tbc
+%\newpage
+
+\begin{minipage}[t]{0.7\textwidth}
+\noindent
+\textbf{File \texttt{ex04-main.cpp}}
+{\scriptsize
+\lstinputlisting[language=C++, basicstyle=\ttfamily]{../code/ex04/ex04-main.cpp}}
+%\noindent
+%\textbf{File \texttt{ex04-library.h}}
+%{\scriptsize
+%\lstinputlisting[language=C++, basicstyle=\ttfamily]{ex04-library.h}}
+%
+\end{minipage}
+%\tbc
+%\newpage
+\\
+\medskip
+\noindent
+\begin{minipage}[t]{0.5\textwidth}
+\noindent
+\textbf{File \texttt{ex04-library.h}}
+{\scriptsize
+\lstinputlisting[language=C++, basicstyle=\ttfamily]{../code/ex04/ex04-library.h}}
+%\noindent
+%\textbf{File \texttt{ex04-library.cpp}}
+%{\scriptsize
+%\lstinputlisting[language=C++, basicstyle=\ttfamily]{ex04-library.cpp}
+%}
+%\bigskip
+%\noindent
+%\textbf{File \texttt{ex01-library.h}}
+%{\scriptsize
+%\lstinputlisting[language=C++, basicstyle=\ttfamily]{ex04-libraryext.h}}
+%
+
+\bigskip
+
+\noindent
+\textbf{File \texttt{ex04-library.cpp}}
+{\scriptsize
+\lstinputlisting[language=C++, basicstyle=\ttfamily]{../code/ex04/ex04-library.cpp}
+}
+\end{minipage}
+%\begin{minipage}[t]{0.6\textwidth}
+%\noindent
+%\textbf{File \texttt{ex04-library.cpp}}
+%{\scriptsize
+%\lstinputlisting[language=C++, basicstyle=\ttfamily]{ex04-library.cpp}
+%}
+%\end{minipage}
+
+%\clearpage
\ No newline at end of file
diff --git a/examples/presentation/to_import/latex/main.tex b/examples/presentation/to_import/latex/main.tex
new file mode 100644
index 0000000000000000000000000000000000000000..648c6b22186e7a76e55456a838fd20b4a5166387
--- /dev/null
+++ b/examples/presentation/to_import/latex/main.tex
@@ -0,0 +1,183 @@
+\documentclass[12pt,a4paper]{article}
+\usepackage[UKenglish]{babel}
+
+\usepackage{a4wide}
+%\usepackage{qtree}
+\usepackage{alltt}
+\usepackage[inline]{enumitem}
+\usepackage{graphicx}
+\usepackage{xcolor}
+\usepackage[%
+  colorlinks=false,%
+  urlbordercolor=red,%
+  linkbordercolor=red,%
+  pdfborderstyle={/S/U/W 1}]{hyperref}
+
+\usepackage{lastpage}
+\usepackage{listings}
+\usepackage{amsmath}
+\usepackage{url}
+
+%For checkers smiley
+\usepackage{MnSymbol,wasysym}
+\usepackage{wrapfig}
+\usepackage{subcaption}
+\usepackage{verbatim}
+
+\usepackage{multicol}
+
+\usepackage[index,nomargin,%inline,%
+  status=final% Switch between "draft" and "final" (or use style draft opt)
+]{fixme} % Simplified management of FIXME's
+\fxusetheme{colorsig}%
+\fxuselayouts{marginnote}%
+\FXRegisterAuthor{fxAS}{anfxAS}{}% Alceste's notes
+
+\makeatletter \renewcommand{\@evenfoot}%
+{\large\slshape Technical University of Denmark\hfil \upshape % 
+  Page {\thepage} of \pageref*{LastPage}
+}
+\renewcommand{\@oddfoot}{\@evenfoot} 
+\makeatother
+\makeatletter \renewcommand{\@evenhead}%
+{\large\slshape 02393 Programming in C++\hfil \upshape}
+\renewcommand{\@oddhead}{\@evenhead} 
+\makeatother
+
+\newcommand{\exercise}[1]{\noindent{\color{red} \large\textsc{#1}\medskip}}
+
+\newcommand{\tbc}{\emph{This exercise continues on the next page\ldots}}
+
+\definecolor{darkgreen}{RGB}{76,153,0}
+
+%\lstset{language=C++, basicstyle=\footnotesize, columns=fullflexible,
+\lstset{language=C++, basicstyle=\ttfamily, columns=fullflexible,
+tabsize=2,
+keywordstyle=\color{blue}\ttfamily,
+stringstyle=\color{red}\ttfamily,
+commentstyle=\color{darkgreen}\ttfamily,
+morecomment=[l][\color{magenta}]{\#}
+}
+%\lstset{language=C++,
+%	basicstyle=\ttfamily,
+%	keywordstyle=\color{blue}\ttfamily,
+%	stringstyle=\color{red}\ttfamily,
+%	commentstyle=\color{green}\ttfamily,
+%	morecomment=[l][\color{magenta}]{\#}
+%}
+
+\newcommand{\mylstinline}[1]{\lstinline[language=C++,basicstyle=\ttfamily]{#1}}
+\newcommand{\lil}[1]{\mylstinline{#1}}
+
+%% Add ``DRAFT'' watermark on top of each page
+% \usepackage{background}
+% \backgroundsetup{
+%   position=current page.north,
+%   angle=-8,
+%   nodeanchor=north,
+%   vshift=-9mm,
+%   opacity=0.8,
+%   scale=2.5,
+%   contents={DRAFT --- DO NOT DISTRIBUTE}
+% }
+
+\begin{document}
+
+\thispagestyle{empty}
+
+\newcommand{\msk}{\vspace{0.6cm}\noindent}
+
+\noindent
+\begin{minipage}{0.9\linewidth}
+  Technical University of Denmark
+
+  \msk
+  Written examination date: 17 May 2021
+\end{minipage}
+\hfill
+\begin{minipage}{0.1\linewidth}
+  \includegraphics[width=\linewidth]{dtu}
+\end{minipage}
+
+\msk
+\textbf{Course title:} Programming in C++					
+\hfill Page  1 of \pageref*{LastPage} pages
+
+\msk
+\textbf{Course number:} 02393
+
+\msk
+\textbf{Aids allowed:} All aids allowed 
+
+\msk
+\textbf{Exam duration:} 4 hours
+
+\msk
+\textbf{Weighting:} pass/fail
+
+\msk
+\textbf{Exercises:} 4 exercises of 2.5 points each, for a total of 10 points.
+
+
+\msk
+\section*{Submission details:}
+
+{
+\begin{enumerate}
+\item You must \textbf{submit your solution on DTU Digital Eksamen}.
+%
+%   \smallskip%
+%   \centerline{%
+%     \url{https://cn.inside.dtu.dk/cnnet/Assignments/student/623043}
+%   }% end \centerline
+%   \smallskip
+% 
+%   \noindent%
+  You can do it \textbf{only once}, so submit only when you have
+  completed your work.
+
+\item You must submit your solution as \textbf{one ZIP archive} containing the following files, with these exact names:
+  \begin{itemize}
+    \item% 4 files named
+    \texttt{exZZ-library.cpp}, where \texttt{ZZ} ranges from \texttt{01}
+      to \texttt{04} (i.e., one per exercise);
+    \item \texttt{ex04-library.h} (additionally required for exercise 4).
+  \end{itemize}
+
+\item You can test your solutions by uploading
+  them on CodeJudge, under ``\texttt{Reexam May 2021}'' at:
+
+  \smallskip%
+  \centerline{%
+    \url{https://dtu.codejudge.net/02393-e20/exercises}
+  }% end \centerline
+  \smallskip
+
+\item
+  You can test your solutions on CodeJudge as many times as you like.
+  \emph{Uploads on CodeJudge are not official submissions}
+  and will not affect your grade.
+
+\item Additional tests may be run on your submissions after the exam.
+
+\item Feel free to add comments to your code.
+
+\item \textbf{Suggestion:} read all exercises before starting your work,
+  and begin with the tasks that look easier.
+\end{enumerate}
+
+\clearpage
+\input{exercise-01}
+
+\clearpage
+\input{exercise-02}
+
+\clearpage
+\input{exercise-03}
+
+\clearpage
+\input{exercise-04}
+
+\listoffixmes
+
+\end{document}
diff --git a/setup.py b/setup.py
index 5b6bfea06d627ffa8cf5d1c947fd4da715188116..3831eab3468bc700adab2ce71890ebef966a403b 100644
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,8 @@
 # Use this guide:
 # https://packaging.python.org/tutorials/packaging-projects/
 # py -m build && twine upload dist/*
+# LINUX: python -m build && twine upload dist/*
+
 import setuptools
 with open("src/unitgrade_private/version.py", "r", encoding="utf-8") as fh:
     __version__ = fh.read().strip().split(" = ")[1].strip()[1:-1]
@@ -30,7 +32,7 @@ setuptools.setup(
     packages=setuptools.find_packages(where="src"),
     include_package_data=True,
     python_requires=">=3.8",
-    install_requires=['unitgrade', 'numpy', "codesnipper", 'tabulate', 'tqdm', "pyfiglet", 'jinja2'
+    install_requires=['unitgrade', 'numpy', "codesnipper", 'tabulate', 'tqdm', "pyfiglet", 'jinja2',
                       "colorama", "coverage", # 'pyminifier',  cannot use pyminifier because 2to3 issue. bundled. will that work?
                       'mosspy'],
 )
diff --git a/src/unitgrade_devel.egg-info/PKG-INFO b/src/unitgrade_devel.egg-info/PKG-INFO
index 9c26b28cb1d7273fd63dc43d8a0cde6b4e932005..bd947290ef7a34910e5685ce3cf4bfbb387e40a3 100644
--- a/src/unitgrade_devel.egg-info/PKG-INFO
+++ b/src/unitgrade_devel.egg-info/PKG-INFO
@@ -1,13 +1,12 @@
 Metadata-Version: 2.1
 Name: unitgrade-devel
-Version: 0.1.42
+Version: 0.1.44
 Summary: A set of tools to develop unitgrade tests and reports and later evaluate them
 Home-page: https://lab.compute.dtu.dk/tuhe/unitgrade_private
 Author: Tue Herlau
 Author-email: tuhe@dtu.dk
 License: MIT
 Project-URL: Bug Tracker, https://lab.compute.dtu.dk/tuhe/unitgrade_private/issues
-Platform: UNKNOWN
 Classifier: Programming Language :: Python :: 3
 Classifier: License :: OSI Approved :: MIT License
 Classifier: Operating System :: OS Independent
@@ -32,6 +31,7 @@ Unitgrade is an automatic report and exam evaluation framework that enables inst
     - Instructors can automatically verify the students solution using a Docker VM and run hidden tests
  - Automatic Moss anti-plagiarism detection
  - CMU Autolab integration (Experimental)
+ - A live dashboard which shows the outcome of the tests
 
 ### Install
 Simply use `pip`
@@ -47,6 +47,7 @@ The figure shows an overview of the workflow.
  - You write exercises and a suite of unittests. 
  - They are then compiled to a version of the exercises without solutions. 
  - The students solve the exercises using the tests and when they are happy, they run an automatically generated `_grade.py`-script to produce a `.token`-file with the number of points they obtain. This file is then uploaded for further verification/evaluation.
+ - The students can see their progress and review hints using the dashboard (see below)
 
 ### Videos
 Videos where I try to talk and code my way through the examples can be found on youtube:
@@ -81,7 +82,7 @@ instructor/cs101/deploy.py   # A private file to deploy the tests
 ### The homework
 The homework is just any old python code you would give to the students. For instance:
 ```python
-# example_simplest/instructor/cs101/homework1.py
+# autolab_example_py_upload/instructor/cs102_autolab/homework1.py
 def reverse_list(mylist): #!f 
     """
     Given a list 'mylist' returns a list consisting of the same elements in reverse order. E.g.
@@ -92,10 +93,9 @@ def reverse_list(mylist): #!f
 def add(a,b): #!f
     """ Given two numbers `a` and `b` this function should simply return their sum:
     > add(a,b) = a+b """
-    return a+b
+    return a+b*2
 
-if __name__ == "__main__":
-    # Example usage:
+if __name__ == "__main__": # Example usage:
     print(f"Your result of 2 + 2 = {add(2,2)}")
     print(f"Reversing a small list", reverse_list([2,3,5,7])) 
 ```
@@ -136,7 +136,12 @@ class Report1(Report):
     pack_imports = [cs101]     # Include all .py files in this folder
 
 if __name__ == "__main__":
-    evaluate_report_student(Report1()) 
+    # from HtmlTestRunner import HTMLTestRunner
+    import HtmlTestRunner
+    unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(output='example_dir'))
+
+
+    # evaluate_report_student(Report1()) 
 ```
 
 ### Deployment
@@ -185,6 +190,32 @@ This runs an identical set of tests and produces the file `Report1_handin_10_of_
  - You can easily use the framework to include output of functions. 
  - See below for how to validate the students results 
 
+
+### Viewing the results using the dashboard
+I recommend to monitor and run the tests from the IDE, as this allows you to use the debugger in conjunction with your tests. 
+However, unitgrade comes with a dashboard that allows students to see the outcome of individual tests 
+ and what is currently recorded in the `token`-file. To start the dashboard, they should simply run the command
+```
+unitgrade
+```
+from a directory that contains a test (the directory will be searched recursively for test files). 
+ The command will start a small background service and open a webpage:
+
+![The dashboard](https://gitlab.compute.dtu.dk/tuhe/unitgrade/-/raw/master/docs/dashboard.png)
+
+Features supported in the current version:
+ - Shows which files need to be edited to solve the problem
+ - Collect hints given in the homework files and display them for the relevant tests
+ - fully responsive -- the UI, including the terminal, will update while the test is running regardless of where you launch the test
+ - Allows students to re-run tests from the UI
+ - Shows current test status and results captured in `.token`-file
+ - Tested on Windows/Linux 
+ - Frontend is pure javascript and the backend only depends on python packages. 
+
+The frontend is automatically enabled the moment your classes inherits from the `UTestCase`-class; no configuration files required, and there are no known bugs. 
+
+Note the frontend is currently not provided in the pypi `unitgrade` package, but only through the gitlab repository (install using `git clone` and then `pip install -e ./`) -- it seems ready, but I want to test it on mac and a few more systems before publishing it. 
+
 ## How safe is Unitgrade?
 There are three principal ways of cheating:
  - Break the framework and submit a `.token` file that 'lies' about the true number of points
@@ -214,13 +245,19 @@ One of the main advantages of `unitgrade` over web-based autograders it that tes
 # example_framework/instructor/cs102/report2.py
 from unitgrade import UTestCase, cache  
 
+
+
 class Week1(UTestCase):
+    @classmethod
+    def setUpClass(cls) -> None:
+        a = 234
+
     def test_add(self):
         self.assertEqualC(add(2,2))
         self.assertEqualC(add(-100, 5))
 
-    def test_reverse(self):
-        self.assertEqualC(reverse_list([1, 2, 3])) 
+    # def test_reverse(self):
+    #     self.assertEqualC(reverse_list([1, 2, 3])) 
 ```
 Note we have changed the test-function to `self.assertEqualC` (the `C` is for cache) and dropped the expected result. What `unitgrade` will do
 is to evaluate the test *on the working version of the code*, compute the results of the test, 
@@ -230,21 +267,21 @@ is to evaluate the test *on the working version of the code*, compute the result
 Titles can be set either using python docstrings or programmatically. An example:
 ```python 
 # example_framework/instructor/cs102/report2.py
-class Week1Titles(UTestCase): 
-    """ The same problem as before with nicer titles """
-    def test_add(self):
-        """ Test the addition method add(a,b) """
-        self.assertEqualC(add(2,2))
-        print("output generated by test")
-        self.assertEqualC(add(-100, 5))
-        # self.assertEqual(2,3, msg="This test automatically fails.")
-
-    def test_reverse(self):
-        ls = [1, 2, 3]
-        reverse = reverse_list(ls)
-        self.assertEqualC(reverse)
-        # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
-        self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title 
+# class Week1Titles(UTestCase): 
+#     """ The same problem as before with nicer titles """
+#     def test_add(self):
+#         """ Test the addition method add(a,b) """
+#         self.assertEqualC(add(2,2))
+#         print("output generated by test")
+#         self.assertEqualC(add(-100, 5))
+#         # self.assertEqual(2,3, msg="This test automatically fails.")
+#
+#     def test_reverse(self):
+#         ls = [1, 2, 3]
+#         reverse = reverse_list(ls)
+#         self.assertEqualC(reverse)
+#         # Although the title is set after the test potentially fails, it will *always* show correctly for the student.
+#         self.title = f"Checking if reverse_list({ls}) = {reverse}"  # Programmatically set the title 
 ```
 When this is run, the titles are shown as follows:
 ```terminal
@@ -253,29 +290,74 @@ When this is run, the titles are shown as follows:
 | | | |_ __  _| |_| |  \/_ __ __ _  __| | ___ 
 | | | | '_ \| | __| | __| '__/ _` |/ _` |/ _ \
 | |_| | | | | | |_| |_\ \ | | (_| | (_| |  __/
- \___/|_| |_|_|\__|\____/_|  \__,_|\__,_|\___| v0.1.17, started: 19/05/2022 15:14:09
+ \___/|_| |_|_|\__|\____/_|  \__,_|\__,_|\___| v0.1.27, started: 16/09/2022 14:30:15
 
 CS 102 Report 2 
 Question 1: Week1                                                                                                       
- * q1.1) test_add...................................................................................................PASS
- * q1.2) test_reverse...............................................................................................PASS
+ * q1.1) test_add.................................................................................................FAILED
+ * q1.2) test_reverse.............................................................................................FAILED
  * q1.3) test_output_capture........................................................................................PASS
- * q1)   Total.................................................................................................... 10/10
+======================================================================
+FAIL: test_add (__main__.Week1)
+test_add
+----------------------------------------------------------------------
+Traceback (most recent call last):
+  File "<string>", line 882, in _callTestMethod
+  File "<string>", line 1699, in test_add
+  File "<string>", line 987, in assertEqualC
+  File "<string>", line 975, in wrap_assert
+AssertionError: 4 != 'Key 0 not found in cache; framework files missing. Please run deploy()'
+
+======================================================================
+FAIL: test_reverse (__main__.Week1)
+test_reverse
+----------------------------------------------------------------------
+Traceback (most recent call last):
+  File "<string>", line 882, in _callTestMethod
+  File "<string>", line 1703, in test_reverse
+  File "<string>", line 987, in assertEqualC
+  File "<string>", line 975, in wrap_assert
+AssertionError: [3, 2, 1] != 'Key 0 not found in cache; framework files missing. Please run deploy()'
+
+ * q1)   Total..................................................................................................... 3/10
  
 Question 2: The same problem as before with nicer titles                                                                
- * q2.1) Test the addition method add(a,b)..........................................................................PASS
- * q2.2) Checking if reverse_list([1, 2, 3]) = [3, 2, 1]............................................................PASS
- * q2)   Total...................................................................................................... 6/6
+ * q2.1) Test the addition method add(a,b)........................................................................FAILED
+ * q2.2) test_reverse.............................................................................................FAILED
+======================================================================
+FAIL: test_add (__main__.Week1Titles)
+Test the addition method add(a,b)
+----------------------------------------------------------------------
+Traceback (most recent call last):
+  File "<string>", line 882, in _callTestMethod
+  File "<string>", line 1715, in test_add
+  File "<string>", line 987, in assertEqualC
+  File "<string>", line 975, in wrap_assert
+AssertionError: 4 != 'Key 0 not found in cache; framework files missing. Please run deploy()'
+
+======================================================================
+FAIL: test_reverse (__main__.Week1Titles)
+test_reverse
+----------------------------------------------------------------------
+Traceback (most recent call last):
+  File "<string>", line 882, in _callTestMethod
+  File "<string>", line 1723, in test_reverse
+  File "<string>", line 987, in assertEqualC
+  File "<string>", line 975, in wrap_assert
+AssertionError: [3, 2, 1] != 'Key 0 not found in cache; framework files missing. Please run deploy()'
+
+ * q2)   Total...................................................................................................... 0/6
  
-Total points at 15:14:09 (0 minutes, 0 seconds)....................................................................16/16
+Total points at 14:30:15 (0 minutes, 0 seconds).....................................................................3/16
 
 Including files in upload...
+path.: _NamespacePath(['/home/tuhe/Documents/unitgrade_private/examples/example_framework/instructor/cs102', '/home/tuhe/Documents/unitgrade_private/examples/example_framework/instructor/cs102'])
  * cs102
 > Testing token file integrity...
 Done!
  
 To get credit for your results, please upload the single unmodified file: 
-> C:\Users\tuhe\Documents\unitgrade_private\examples\example_framework\instructor\cs102\Report2_handin_16_of_16.token
+> /home/tuhe/Documents/unitgrade_private/examples/example_framework/instructor/cs102/Report2_handin_3_of_16.token
 
 ```
 What happens behind the scenes when we set `self.title` is that the result is pre-computed on the instructors machine and cached. This means the last test will display the correct result regardless of how `reverse_list` has been implemented by the student. The titles are also shown correctly when the method is run as a unittest. 
@@ -284,21 +366,21 @@ What happens behind the scenes when we set `self.title` is that the result is pr
 The `@cache`-decorator offers a direct ways to compute the correct result on an instructors computer and submit it to the student. For instance:
 ```python
 # example_framework/instructor/cs102/report2.py
-class Question2(UTestCase): 
-    @cache
-    def my_reversal(self, ls):
-        # The '@cache' decorator ensures the function is not run on the *students* computer
-        # Instead the code is run on the teachers computer and the result is passed on with the
-        # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
-        # implemented reverse_list.
-        return reverse_list(ls)
-
-    def test_reverse_tricky(self):
-        ls = (2,4,8)
-        ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
-        print("The correct answer is supposed to be", ls2)  # Show students the correct answer
-        self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
-        return "Buy world!"                                 # This value will be stored in the .token file  
+# class Question2(UTestCase): 
+#     @cache
+#     def my_reversal(self, ls):
+#         # The '@cache' decorator ensures the function is not run on the *students* computer
+#         # Instead the code is run on the teachers computer and the result is passed on with the
+#         # other pre-computed results -- i.e. this function will run regardless of how the student happens to have
+#         # implemented reverse_list.
+#         return reverse_list(ls)
+#
+#     def test_reverse_tricky(self):
+#         ls = (2,4,8)
+#         ls2 = self.my_reversal(tuple(ls))                   # This will always produce the right result, [8, 4, 2]
+#         print("The correct answer is supposed to be", ls2)  # Show students the correct answer
+#         self.assertEqualC(reverse_list(ls))                 # This will actually test the students code.
+#         return "Buy world!"                                 # This value will be stored in the .token file  
 ```
 The `@cache` decorator will make sure the output of the function is pre-computed when the test is set up, and that the function will 
 simply return the correct result regardless of the function body. This is very helpful in a few situations:
@@ -520,26 +602,30 @@ The code for the example can be found in `examples/autolab_example`. It consists
 
 Concretely, the following code will download and build the image (note this code must be run on the same machine that you have installed Autolab on)
 ```python
-# autolab_token_upload/deploy_autolab.py
+# autolab_example_py_upload/instructor/cs102_autolab/deploy_autolab.py
     # Step 1: Download and compile docker grading image. You only need to do this once.  
-    download_docker_images("./docker") # Download docker images from gitlab (only do this once.
-    dockerfile = f"./docker/docker_tango_python/Dockerfile"
-    autograde_image = 'tango_python_tue'
-    compile_docker_image(Dockerfile=dockerfile, tag=autograde_image)  # Compile docker image. 
+    download_docker_images("../docker") # Download docker images from gitlab (only do this once).
+    dockerfile = f"../docker/docker_tango_python/Dockerfile"
+    autograde_image = 'tango_python_tue2'  # Tag given to the image in case you have multiple images.
+    compile_docker_image(Dockerfile=dockerfile, tag=autograde_image, no_cache=False)  # Compile docker image. 
 ```
 Next, simply call the framework to compile any `_grade.py`-file into an Autolab-compatible `.tar` file that can be imported from the web interface. The script requires you to specify 
 both the instructor-directory and the directory with the files the student have been handed out (i.e., the same file-system format we have seen earlier). 
 ```python
-# autolab_token_upload/deploy_autolab.py
+# autolab_example_py_upload/instructor/cs102_autolab/deploy_autolab.py
     # Step 2: Create the cs102.tar file from the grade scripts. 
-    instructor_base = f"../example_framework/instructor"
-    student_base = f"../example_framework/students"
-    output_tar = deploy_assignment("cs102",  # Autolab name of assignment (and name of .tar file)
+    instructor_base = f"."
+    student_base = f"../../students/cs102_autolab"
+
+    from report2_test import Report2
+    # INSTRUCTOR_GRADE_FILE =
+    output_tar = new_deploy_assignment("cs105h",  # Autolab name of assignment (and name of .tar file)
                                    INSTRUCTOR_BASE=instructor_base,
-                                   INSTRUCTOR_GRADE_FILE=f"{instructor_base}/cs102/report2_grade.py",
+                                   INSTRUCTOR_GRADE_FILE=f"{instructor_base}/report2_test_grade.py",
                                    STUDENT_BASE=student_base,
-                                   STUDENT_GRADE_FILE=f"{student_base}/cs102/report2_grade.py",
-                                   autograde_image_tag=autograde_image) 
+                                   STUDENT_GRADE_FILE=f"{instructor_base}/report2_test.py",
+                                   autograde_image_tag=autograde_image,
+                                   homework_file="homework1.py") 
 ```
 This will produce a file `cs102.tar`. Whereas you needed to build the Docker image on the machine where you are running Autolab, you can build the lab assignments on any computer.
 ### Step 3: Upload the `.tar` lab-assignment file 
@@ -565,13 +651,12 @@ and TAs can choose to annotate the students code directly in Autolab -- we are h
 # Citing
 ```bibtex
 @online{unitgrade_devel,
-	title={Unitgrade-devel (0.1.39): \texttt{pip install unitgrade-devel}},
+	title={Unitgrade-devel (0.1.42): \texttt{pip install unitgrade-devel}},
 	url={https://lab.compute.dtu.dk/tuhe/unitgrade_private},
-	urldate = {2022-06-15}, 
+	urldate = {2022-09-16}, 
 	month={9},
 	publisher={Technical University of Denmark (DTU)},
 	author={Tue Herlau},
 	year={2022},
 }
 ```
-
diff --git a/src/unitgrade_devel.egg-info/requires.txt b/src/unitgrade_devel.egg-info/requires.txt
index be6980bb8a316cf5daf03583a15d73ef2c27c4b4..118094466aab6f737c42751b978583728119c46f 100644
--- a/src/unitgrade_devel.egg-info/requires.txt
+++ b/src/unitgrade_devel.egg-info/requires.txt
@@ -1,8 +1,10 @@
+unitgrade
+numpy
 codesnipper
+tabulate
+tqdm
+pyfiglet
+jinja2
 colorama
 coverage
 mosspy
-numpy
-pyfiglet
-tabulate
-tqdm
diff --git a/src/unitgrade_private/pipelines/dummy_handins.py b/src/unitgrade_private/pipelines/dummy_handins.py
new file mode 100644
index 0000000000000000000000000000000000000000..895e13ebbe8a0d2bdd2c34f3286c26c1a8e6c72c
--- /dev/null
+++ b/src/unitgrade_private/pipelines/dummy_handins.py
@@ -0,0 +1,18 @@
+import os.path
+import os
+import shutil
+
+def make_dummies(zip_file_path="zip1.zip",
+                 , n_handins=3, screwups=4, student_base_dir=cdir+"/students", student_grade_file=cdir+"/students/intro_python/exam_grade.py"):
+    # I am dum-dum.
+    dir = os.path.dirname(__file__)
+    tmp = dir + "/tmp"
+    if os.path.isdir(tmp):
+        shutil.rmtree(tmp)
+    os.mkdir(tmp)
+    # now we got a temp dir.
+    # Deploy to this dir and create handins. Turn it all into a .zip file and return it.
+
+
+    a = 234
+    pass
\ No newline at end of file
diff --git a/src/unitgrade_private/pipelines/process_65.py b/src/unitgrade_private/pipelines/process_65.py
new file mode 100644
index 0000000000000000000000000000000000000000..f838fa447d8ecc5472cf3bab45233fb8976aa960
--- /dev/null
+++ b/src/unitgrade_private/pipelines/process_65.py
@@ -0,0 +1,16 @@
+
+def process_by_zip_file(learn_zip_file_path, output_xlsx=True, moss=True):
+    # Automatic evaluation of tests.
+    # Moss
+    # Write to excel file
+    # Write to pkl file.
+    # hidden tests.
+
+    pass
+
+if __name__ == "__main__":
+    # Process a learn .zip file.
+
+
+
+    pass
\ No newline at end of file
diff --git a/src/unitgrade_private/version.py b/src/unitgrade_private/version.py
index f47c8822cd2093b51319a6e6d2f8b8fe87259a30..455cfb48d06d6d46792fb678d9ea9251220fc4d7 100644
--- a/src/unitgrade_private/version.py
+++ b/src/unitgrade_private/version.py
@@ -1,2 +1,2 @@
-__version__ = "0.1.42"
+__version__ = "0.1.44"