Repository: UAlbertaALTLab/morphodict (language: python)

Issue:
remove: old NDS full layouts



Discussion / hints:

Fix patch:
diff --git a/src/CreeDictionary/CreeDictionary/paradigm/manager.py b/src/CreeDictionary/CreeDictionary/paradigm/manager.py
index 17016acff..fe4ac25ee 100644
--- a/src/CreeDictionary/CreeDictionary/paradigm/manager.py
+++ b/src/CreeDictionary/CreeDictionary/paradigm/manager.py
@@ -3,10 +3,10 @@
 from typing import Optional
 
 from hfst_optimized_lookup import TransducerFile
-from CreeDictionary.shared import expensive
-from CreeDictionary.utils import shared_res_dir
 
 from CreeDictionary.CreeDictionary.paradigm.panes import Paradigm, ParadigmLayout
+from CreeDictionary.shared import expensive
+from CreeDictionary.utils import shared_res_dir
 
 
 class ParadigmManager:
@@ -20,8 +20,10 @@ class ParadigmManager:
     def __init__(self, layout_directory: Path, generation_fst: TransducerFile):
         self._generator = generation_fst
         self._name_to_layout: dict[str, Paradigm] = {}
+        self._wc_to_layout: dict[str, ParadigmLayout] = {}
 
         self._load_static_from(layout_directory / "static")
+        self._load_dynamic_from(layout_directory / "dynamic")
 
     def static_paradigm_for(self, name: str) -> Optional[Paradigm]:
         """
@@ -30,21 +32,50 @@ def static_paradigm_for(self, name: str) -> Optional[Paradigm]:
         """
         return self._name_to_layout.get(name)
 
+    def dynamic_paradigm_for(
+        self, *, lemma: str, word_class: str
+    ) -> Optional[Paradigm]:
+        """
+        Returns a dynamic paradigm for the given lemma and word class.
+        Returns None if no such paradigm can be generated.
+        """
+        if layout := self._wc_to_layout.get(word_class):
+            return self._inflect(layout, lemma)
+
+        # No matching word class means no paradigm:
+        return None
+
     def _load_static_from(self, path: Path):
         """
-        Loads all .tsv files in the path as "static" paradigms.
+        Loads all .tsv files in the path as static paradigms.
+        """
+        for filename, layout in self._load_all_layouts_in_directory(path):
+            self._name_to_layout[filename.stem] = layout.as_static_paradigm()
+
+    def _load_dynamic_from(self, path: Path):
+        """
+        Loads all .tsv files as dynamic layouts.
+        """
+        for filename, layout in self._load_all_layouts_in_directory(path):
+            self._wc_to_layout[filename.stem] = layout
+
+    def _inflect(self, layout: ParadigmLayout, lemma: str) -> Paradigm:
+        """
+        Given a layout and a lemma, produce a paradigm with forms generated by the FST.
         """
+        template2analysis = layout.generate_fst_analyses(lemma=lemma)
+        analysis2forms = self._generator.bulk_lookup(list(template2analysis.values()))
+        template2forms = {
+            template: analysis2forms[analysis]
+            for template, analysis in template2analysis.items()
+        }
+        return layout.fill(template2forms)
 
+    @staticmethod
+    def _load_all_layouts_in_directory(path: Path):
         for layout_file in path.glob("*.tsv"):
             layout = ParadigmLayout.loads(layout_file.read_text(encoding="UTF-8"))
-            self._name_to_layout[layout_file.stem] = layout.as_static_paradigm()
-
-    def _inflect(self, layout: ParadigmLayout) -> Paradigm:
-        analyses = layout.generate_fst_analysis_string(lemma="").splitlines(
-            keepends=False
-        )
-        forms = self._generator.bulk_lookup(analyses)
-        return layout.fill(forms)
+            yield layout_file, layout
 
 
 @cache
diff --git a/src/CreeDictionary/CreeDictionary/paradigm/panes.py b/src/CreeDictionary/CreeDictionary/paradigm/panes.py
index 5492b9f93..f2bd03abb 100644
--- a/src/CreeDictionary/CreeDictionary/paradigm/panes.py
+++ b/src/CreeDictionary/CreeDictionary/paradigm/panes.py
@@ -80,15 +80,6 @@ def inflection_cells(self) -> Iterable[InflectionTemplate]:
         for pane in self.panes:
             yield from pane.inflection_cells
 
-    @cached_property
-    def _fst_analysis_template(self) -> string.Template:
-        """
-        A string template that can be given a lemma to generate FST analysis strings
-        for the ENTIRE paradigm.
-        """
-        lines = [inflection.analysis for inflection in self.inflection_cells]
-        return string.Template("\n".join(lines))
-
     @classmethod
     def load(cls, layout_file: TextIO) -> ParadigmLayout:
         """
@@ -132,12 +123,15 @@ def dumps(self):
 
         return empty_line.join(pane_text)
 
-    def generate_fst_analysis_string(self, lemma: str) -> str:
+    def generate_fst_analyses(self, lemma: str) -> dict[str, str]:
         """
-        Given a lemma, generates a string that can be fed directly to an XFST lookup
-        application.
+        Generates a dictionary mapping analysis templates to analyses subsituted with
+        the given lemma.
         """
-        return self._fst_analysis_template.substitute(lemma=lemma)
+        return {
+            inflection.analysis_template: inflection.as_analysis(lemma)
+            for inflection in self.inflection_cells
+        }
 
     def fill(self, forms: dict[str, Collection[str]]) -> Paradigm:
         """
@@ -368,6 +362,12 @@ def __repr__(self):
         cells_repr = ", ".join(repr(cell) for cell in self._tags)
         return f"{name}([{cells_repr}])"
 
+    def contains_wordform(self, wordform: str) -> bool:
+        """
+        A header **never** contains a wordform, so this always returns False.
+        """
+        return False
+
     @staticmethod
     def parse(text: str) -> HeaderRow:
         if not text.startswith("# "):
@@ -383,6 +383,7 @@ class Cell:
 
     is_label: bool = False
     is_inflection: bool = False
+    is_missing: bool = False
     is_empty: bool = False
 
     @staticmethod
@@ -468,16 +469,24 @@ class InflectionTemplate(Cell):
     is_inflection = True
 
     def __init__(self, analysis: str):
-        self.analysis = analysis
         assert looks_like_analysis_string(analysis)
+        self._analysis_template = string.Template(analysis)
+
+    @property
+    def analysis_template(self) -> str:
+        """
+        The original analysis string provided as a template for inflection,
+        e.g., ${lemma}+N+Sg
+        """
+        return self._analysis_template.template
 
     def __eq__(self, other) -> bool:
         if isinstance(other, InflectionTemplate):
-            return self.analysis == other.analysis
+            return self.analysis_template == other.analysis_template
         return False
 
     def __str__(self):
-        return self.analysis
+        return self.analysis_template
 
     @staticmethod
     def parse(text: str) -> InflectionTemplate:
@@ -485,21 +494,29 @@ def parse(text: str) -> InflectionTemplate:
             raise ParseError(f"cell does not look like an inflection: {text!r}")
         return InflectionTemplate(text)
 
-    def fill_one(self, forms: dict[str, Collection[str]]) -> WordformCell:
+    def as_analysis(self, lemma: str) -> str:
+        """
+        Returns a the analysis template with the substitute replaced
+        """
+        return self._analysis_template.substitute(lemma=lemma)
+
+    def fill_one(self, forms: dict[str, Collection[str]]) -> WordformCell | MissingForm:
         """
         Return a single WordformCell, given the fillable forms.
         """
 
-        cell_forms = forms.get(self.analysis)
-        if cell_forms is None:
-            # TODO: this might actually be okay?
-            # It could just be a missing form (accidental gap/lacuna).
-            # See: https://en.wikipedia.org/wiki/Accidental_gap#Morphological_gaps
+        try:
+            cell_forms = forms[self.analysis_template]
+        except KeyError:
             raise ParadigmGenerationError(
-                "no form(s) provided for " f"analysis: {self.analysis}"
+                "no form(s) provided for " f"analysis: {self.analysis_template}"
             )
 
-        assert len(cell_forms) >= 1
+        if len(cell_forms) == 0:
+            # It's a missing form (accidental gap/lacuna).
+            # See: https://en.wikipedia.org/wiki/Accidental_gap#Morphological_gaps
+            return MissingForm()
+
         if len(cell_forms) > 1:
             # TODO: create a CompoundRow class that can handle multiple forms per
             # inflection.
@@ -535,10 +552,23 @@ class MissingForm(Cell, SingletonMixin):
     """
 
     is_inflection = True
+    is_missing = True
 
     def __str__(self):
         return "--"
 
+    def contains_wordform(self, wordform: str) -> bool:
+        """
+        A missing form does not contain a wordform, be definition.
+        """
+        return False
+
+    def fill_one(self, forms: dict[str, Collection[str]]) -> Cell:
+        """
+        A missing form is already "filled".
+        """
+        return self
+
 
 class EmptyCell(Cell, SingletonMixin):
     """
diff --git a/src/CreeDictionary/CreeDictionary/templates/CreeDictionary/components/paradigm-with-panes.html b/src/CreeDictionary/CreeDictionary/templates/CreeDictionary/components/paradigm-with-panes.html
index 1fc9745d2..5ddebc3af 100644
--- a/src/CreeDictionary/CreeDictionary/templates/CreeDictionary/components/paradigm-with-panes.html
+++ b/src/CreeDictionary/CreeDictionary/templates/CreeDictionary/components/paradigm-with-panes.html
@@ -39,6 +39,8 @@
                           class="paradigm-label paradigm-label--{{ cell.label_for }}">
                           {% relabel cell.fst_tags %}
                       </th>
+                    {% elif cell.is_missing %}
+                        <td class="paradigm-cell paradigm-cell--missing">&mdash;</td>
                     {% elif cell.is_empty %}
                       <td class="paradigm-cell paradigm-cell--empty"></td>
                     {% else %}
diff --git a/src/CreeDictionary/CreeDictionary/views.py b/src/CreeDictionary/CreeDictionary/views.py
index af60ffeaf..d8186166b 100644
--- a/src/CreeDictionary/CreeDictionary/views.py
+++ b/src/CreeDictionary/CreeDictionary/views.py
@@ -2,30 +2,28 @@
 from http import HTTPStatus
 from typing import Any, Dict, Literal, Union
 
-from django.contrib.admin.views.decorators import staff_member_required
-
-from CreeDictionary.API.models import Wordform
-from CreeDictionary.API.search import presentation, search_with_affixes
 from django.conf import settings
+from django.contrib.admin.views.decorators import staff_member_required
 from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotFound
 from django.shortcuts import redirect, render
 from django.views import View
 from django.views.decorators.http import require_GET
 
+from CreeDictionary.API.models import Wordform
+from CreeDictionary.API.search import presentation, search_with_affixes
+from CreeDictionary.CreeDictionary.forms import WordSearchForm
+from CreeDictionary.CreeDictionary.paradigm.filler import Row
+from CreeDictionary.CreeDictionary.paradigm.generation import generate_paradigm
+from CreeDictionary.CreeDictionary.paradigm.manager import default_paradigm_manager
+from CreeDictionary.CreeDictionary.paradigm.panes import Paradigm
 from CreeDictionary.phrase_translate.translate import (
     eng_noun_entry_to_inflected_phrase_fst,
-    eng_verb_entry_to_inflected_phrase_fst,
     eng_phrase_to_crk_features_fst,
+    eng_verb_entry_to_inflected_phrase_fst,
 )
 from CreeDictionary.shared import expensive
 from CreeDictionary.utils import ParadigmSize
 
-from CreeDictionary.CreeDictionary.forms import WordSearchForm
-from CreeDictionary.CreeDictionary.paradigm.filler import Row
-from CreeDictionary.CreeDictionary.paradigm.generation import generate_paradigm
-from CreeDictionary.CreeDictionary.paradigm.manager import default_paradigm_manager
-from CreeDictionary.CreeDictionary.paradigm.panes import Paradigm
-
 from .display_options import DISPLAY_MODE_COOKIE, DISPLAY_MODES
 from .utils import url_for_query
 
@@ -374,8 +372,10 @@ def paradigm_for(
     """
     # TODO: make this use the new-style ParadigmManager exclusively
 
+    manager = default_paradigm_manager()
+
     if name := wordform.paradigm:
-        if static_paradigm := default_paradigm_manager().static_paradigm_for(name):
+        if static_paradigm := manager.static_paradigm_for(name):
             return static_paradigm
         logger.warning(
             "Could not retrieve static paradigm %r " "associated with wordform %r",
@@ -385,5 +385,18 @@ def paradigm_for(
         # TODO: better return value for when a paradigm cannot be found
         return []
 
+    # TODO: use new-style paradigms for other sizes in addition to FULL
+    # Requires:
+    #  - "basic" size paradigm layouts to be created
+    #  - paradigm manager must support multiple sizes
+    #  - relabelling must work to use linguistic layouts
+    if paradigm_size == ParadigmSize.FULL and (word_class := wordform.word_class):
+        dynamic_paradigm = manager.dynamic_paradigm_for(
+            lemma=wordform.text, word_class=word_class.value
+        )
+        if dynamic_paradigm:
+            return dynamic_paradigm
+        return []
+
     # try returning an old-style paradigm: may return []
     return generate_paradigm(wordform, paradigm_size)
diff --git a/src/CreeDictionary/res/crk.altlabel.tsv b/src/CreeDictionary/res/crk.altlabel.tsv
index e2015e04e..5975eda8b 100644
--- a/src/CreeDictionary/res/crk.altlabel.tsv
+++ b/src/CreeDictionary/res/crk.altlabel.tsv
@@ -60,6 +60,9 @@ FST TAG	LINGUISTIC (SHORT)	LINGUISTIC (LONG)	ENGLISH	NÊHIYAWÊWIN	EMOJI
 0Sg+Obv+Inf+PV/ta	0'	Actor: Inanimate Singular Obviative	it (further)	nêma			
 0Pl+Obv+Inf+PV/ta	0p'	Actor: Inanimate Plural Obviative	they (futher)	nêhi			
 							
+Inf+PV/ka			ka- word				
+Inf+PV/ta			ta- word				
+							
 							
 							
 1Sg+2SgO			I → you (one)	niya → kiya	-		
@@ -179,7 +182,7 @@ IPN	Prenoun	Prenoun	like: amisko-	tâpiskôc: amisko-	⚡
 IPP	Particle	Particle	like: akâmi-	tâpiskîc: akâmi- 	⚡️		
 IPV	Preverb	Preverb	like: pê-	tâpiskôc: pê-	⚡️		
 Ipv	Preverb	Preverb	like: pê-	tâpiskôc: pê-	⚡️		
-Imm		Immediate	now	mêkwâc/kîsac		
+Imm		Immediate	now	mêkwâc/kîsac			
 Imp		Imperative	command/request	nitotamâkêwin			
 Imp+Imm		Immediate imperative	command/request that something happens immediately	nitotamâkêwin piko ka-ispayik			
 Ind		Independent	ni-/ki- word	ni-/ki- itwêwin			
diff --git a/src/CreeDictionary/res/layouts/dynamic/NA.tsv b/src/CreeDictionary/res/layouts/dynamic/NA.tsv
new file mode 100644
index 000000000..b7051fa2d
--- /dev/null
+++ b/src/CreeDictionary/res/layouts/dynamic/NA.tsv
@@ -0,0 +1,18 @@
+_ Sg	${lemma}+N+A+Sg		
+_ Pl	${lemma}+N+A+Pl		
+_ Obv	${lemma}+N+A+Obv		
+_ Distr	${lemma}+N+A+Distr		
+			
+# Der/Dim			
+_ Sg	${lemma}+N+A+Der/Dim+N+A+Sg		
+			
+# Px			
+	| Sg	| Pl	| Obv
+_ Px1Sg	${lemma}+N+A+Px1Sg+Sg	${lemma}+N+A+Px1Sg+Pl	${lemma}+N+A+Px1Sg+Obv
+_ Px2Sg	${lemma}+N+A+Px2Sg+Sg	${lemma}+N+A+Px2Sg+Pl	${lemma}+N+A+Px2Sg+Obv
+_ Px3Sg	--	--	${lemma}+N+A+Px3Sg+Obv
+_ Px1Pl	${lemma}+N+A+Px1Pl+Sg	${lemma}+N+A+Px1Pl+Pl	${lemma}+N+A+Px1Pl+Obv
+_ Px12Pl	${lemma}+N+A+Px12Pl+Sg	${lemma}+N+A+Px12Pl+Pl	${lemma}+N+A+Px12Pl+Obv
+_ Px2Pl	${lemma}+N+A+Px2Pl+Sg	${lemma}+N+A+Px2Pl+Pl	${lemma}+N+A+Px2Pl+Obv
+_ Px3Pl	--	--	${lemma}+N+A+Px3Pl+Obv
+_ Px4Sg/Pl	--	--	${lemma}+N+A+Px4Sg/Pl+Obv
diff --git a/src/CreeDictionary/res/layouts/dynamic/NAD.tsv b/src/CreeDictionary/res/layouts/dynamic/NAD.tsv
new file mode 100644
index 000000000..26e55dc67
--- /dev/null
+++ b/src/CreeDictionary/res/layouts/dynamic/NAD.tsv
@@ -0,0 +1,17 @@
+# Poss			
+	| Sg	| Pl	| Obj
+_ PxX	${lemma}+N+A+D+PxX+Sg	${lemma}+N+A+D+PxX+Pl	${lemma}+N+A+D+PxX+Obv
+_ Px1Sg	${lemma}+N+A+D+Px1Sg+Sg	${lemma}+N+A+D+Px1Sg+Pl	${lemma}+N+A+D+Px1Sg+Obv
+_ Px2Sg	${lemma}+N+A+D+Px2Sg+Sg	${lemma}+N+A+D+Px2Sg+Pl	${lemma}+N+A+D+Px2Sg+Obv
+_ Px3Sg	--	--	${lemma}+N+A+D+Px3Sg+Obv
+_ Px1Pl	${lemma}+N+A+D+Px1Pl+Sg	${lemma}+N+A+D+Px1Pl+Pl	${lemma}+N+A+D+Px1Pl+Obv
+_ Px21Pl	${lemma}+N+A+D+Px12Pl+Sg	${lemma}+N+A+D+Px12Pl+Pl	${lemma}+N+A+D+Px12Pl+Obv
+_ Px2Pl	${lemma}+N+A+D+Px2Pl+Sg	${lemma}+N+A+D+Px2Pl+Pl	${lemma}+N+A+D+Px2Pl+Obv
+_ Px3Pl	--	--	${lemma}+N+A+D+Px3Pl+Obv
+_ Px4Sg/Pl	--	--	${lemma}+N+A+D+Px4Sg/Pl+Obv
+			
+# Dim			
+	| Poss		
+_ PxX	${lemma}+N+A+D+Der/Dim+N+A+D+PxX+Sg		
+_ Px1Sg	${lemma}+N+A+D+Der/Dim+N+A+D+Px1Sg+Sg		
+_ Px3Sg	${lemma}+N+A+D+Der/Dim+N+A+D+Px3Sg+Obv		
diff --git a/src/CreeDictionary/res/layouts/dynamic/NI.tsv b/src/CreeDictionary/res/layouts/dynamic/NI.tsv
new file mode 100644
index 000000000..b5b71f98f
--- /dev/null
+++ b/src/CreeDictionary/res/layouts/dynamic/NI.tsv
@@ -0,0 +1,17 @@
+_ Sg	${lemma}+N+I+Sg		
+_ Pl	${lemma}+N+I+Pl		
+_ Loc	${lemma}+N+I+Loc		
+			
+# Dim			
+_ Sg	${lemma}+N+I+Der/Dim+N+I+Sg		
+			
+# Poss			
+	| Sg	| Pl	| Loc
+_ Px1Sg	${lemma}+N+I+Px1Sg+Sg	${lemma}+N+I+Px1Sg+Pl	${lemma}+N+I+Px1Sg+Loc
+_ Px2Sg	${lemma}+N+I+Px2Sg+Sg	${lemma}+N+I+Px2Sg+Pl	${lemma}+N+I+Px2Sg+Loc
+_ Px3Sg	${lemma}+N+I+Px3Sg+Sg	${lemma}+N+I+Px3Sg+Pl	${lemma}+N+I+Px3Sg+Loc
+_ Px1Pl	${lemma}+N+I+Px1Pl+Sg	${lemma}+N+I+Px1Pl+Pl	${lemma}+N+I+Px1Pl+Loc
+_ Px12Pl	${lemma}+N+I+Px12Pl+Sg	${lemma}+N+I+Px12Pl+Pl	${lemma}+N+I+Px12Pl+Loc
+_ Px2Pl	${lemma}+N+I+Px2Pl+Sg	${lemma}+N+I+Px2Pl+Pl	${lemma}+N+I+Px2Pl+Loc
+_ Px3Pl	${lemma}+N+I+Px3Pl+Sg	${lemma}+N+I+Px3Pl+Pl	${lemma}+N+I+Px3Pl+Loc
+_ Px4Sg/Pl	${lemma}+N+I+Px4Sg/Pl+Sg	${lemma}+N+I+Px4Sg/Pl+Pl	${lemma}+N+I+Px4Sg/Pl+Loc
diff --git a/src/CreeDictionary/res/layouts/dynamic/NID.tsv b/src/CreeDictionary/res/layouts/dynamic/NID.tsv
new file mode 100644
index 000000000..7d420fdf8
--- /dev/null
+++ b/src/CreeDictionary/res/layouts/dynamic/NID.tsv
@@ -0,0 +1,17 @@
+# Poss			
+	| Sg	| Pl	| Loc
+_ PxX	${lemma}+N+I+D+PxX+Sg	${lemma}+N+I+D+PxX+Pl	${lemma}+N+I+D+PxX+Loc
+_ Px1Sg	${lemma}+N+I+D+Px1Sg+Sg	${lemma}+N+I+D+Px1Sg+Pl	${lemma}+N+I+D+Px1Sg+Loc
+_ Px2Sg	${lemma}+N+I+D+Px2Sg+Sg	${lemma}+N+I+D+Px2Sg+Pl	${lemma}+N+I+D+Px2Sg+Loc
+_ Px3Sg	${lemma}+N+I+D+Px3Sg+Sg	${lemma}+N+I+D+Px3Sg+Pl	${lemma}+N+I+D+Px3Sg+Loc
+_ Px1Pl	${lemma}+N+I+D+Px1Pl+Sg	${lemma}+N+I+D+Px1Pl+Pl	${lemma}+N+I+D+Px1Pl+Loc
+_ Px12Pl	${lemma}+N+I+D+Px12Pl+Sg	${lemma}+N+I+D+Px12Pl+Pl	${lemma}+N+I+D+Px12Pl+Loc
+_ Px2Pl	${lemma}+N+I+D+Px2Pl+Sg	${lemma}+N+I+D+Px2Pl+Pl	${lemma}+N+I+D+Px2Pl+Loc
+_ Px3Pl	${lemma}+N+I+D+Px3Pl+Sg	${lemma}+N+I+D+Px3Pl+Pl	${lemma}+N+I+D+Px3Pl+Loc
+_ Px4Sg/Pl	${lemma}+N+I+D+Px3Pl+Sg	${lemma}+N+I+D+Px3Pl+Pl	${lemma}+N+I+D+Px4Sg/Pl+Loc
+			
+# Dim			
+	| Poss	
+_ PxX	${lemma}+N+I+D+Der/Dim+N+I+D+PxX+Sg		
+_ Px1Sg	${lemma}+N+I+D+Der/Dim+N+I+D+Px1Sg+Sg		
+_ Px3Sg	${lemma}+N+I+D+Der/Dim+N+I+D+Px3Sg+Sg		
diff --git a/src/CreeDictionary/res/layouts/dynamic/VAI.tsv b/src/CreeDictionary/res/layouts/dynamic/VAI.tsv
new file mode 100644
index 000000000..71dcb0040
--- /dev/null
+++ b/src/CreeDictionary/res/layouts/dynamic/VAI.tsv
@@ -0,0 +1,71 @@
+# Prs		
+	| Ind	| Cnj
+_ 1Sg	${lemma}+V+AI+Ind+1Sg	PV/e+${lemma}+V+AI+Cnj+1Sg
+_ 2Sg	${lemma}+V+AI+Ind+2Sg	PV/e+${lemma}+V+AI+Cnj+2Sg
+_ 3Sg	${lemma}+V+AI+Ind+3Sg	PV/e+${lemma}+V+AI+Cnj+3Sg
+_ 1Pl	${lemma}+V+AI+Ind+1Pl	PV/e+${lemma}+V+AI+Cnj+1Pl
+_ 12Pl	${lemma}+V+AI+Ind+12Pl	PV/e+${lemma}+V+AI+Cnj+12Pl
+_ 2Pl	${lemma}+V+AI+Ind+2Pl	PV/e+${lemma}+V+AI+Cnj+2Pl
+_ 3Pl	${lemma}+V+AI+Ind+3Pl	PV/e+${lemma}+V+AI+Cnj+3Pl
+_ 4Sg/Pl	${lemma}+V+AI+Ind+4Sg/Pl	PV/e+${lemma}+V+AI+Cnj+4Sg/Pl
+_ X	${lemma}+V+AI+Ind+X	PV/e+${lemma}+V+AI+Cnj+X
+		
+# Prt		
+	| Ind	| Cnj
+_ 1Sg	PV/ki+${lemma}+V+AI+Ind+1Sg	PV/e+PV/ki+${lemma}+V+AI+Cnj+1Sg
+_ 2Sg	PV/ki+${lemma}+V+AI+Ind+2Sg	PV/e+PV/ki+${lemma}+V+AI+Cnj+2Sg
+_ 3Sg	PV/ki+${lemma}+V+AI+Ind+3Sg	PV/e+PV/ki+${lemma}+V+AI+Cnj+3Sg
+_ 1Pl	PV/ki+${lemma}+V+AI+Ind+1Pl	PV/e+PV/ki+${lemma}+V+AI+Cnj+1Pl
+_ 12Pl	PV/ki+${lemma}+V+AI+Ind+12Pl	PV/e+PV/ki+${lemma}+V+AI+Cnj+12Pl
+_ 2Pl	PV/ki+${lemma}+V+AI+Ind+2Pl	PV/e+PV/ki+${lemma}+V+AI+Cnj+2Pl
+_ 3Pl	PV/ki+${lemma}+V+AI+Ind+3Pl	PV/e+PV/ki+${lemma}+V+AI+Cnj+3Pl
+_ 4Sg/Pl	PV/ki+${lemma}+V+AI+Ind+4Sg/Pl	PV/e+PV/ki+${lemma}+V+AI+Cnj+4Sg/Pl
+		
+# Fut+Int		
+	| Ind	| Cnj
+_ 1Sg	PV/wi+${lemma}+V+AI+Ind+1Sg	PV/e+PV/wi+${lemma}+V+AI+Cnj+1Sg
+_ 2Sg	PV/wi+${lemma}+V+AI+Ind+2Sg	PV/e+PV/wi+${lemma}+V+AI+Cnj+2Sg
+_ 3Sg	PV/wi+${lemma}+V+AI+Ind+3Sg	PV/e+PV/wi+${lemma}+V+AI+Cnj+3Sg
+_ 1Pl	PV/wi+${lemma}+V+AI+Ind+1Pl	PV/e+PV/wi+${lemma}+V+AI+Cnj+1Pl
+_ 12Pl	PV/wi+${lemma}+V+AI+Ind+12Pl	PV/e+PV/wi+${lemma}+V+AI+Cnj+12Pl
+_ 2Pl	PV/wi+${lemma}+V+AI+Ind+2Pl	PV/e+PV/wi+${lemma}+V+AI+Cnj+2Pl
+_ 3Pl	PV/wi+${lemma}+V+AI+Ind+3Pl	PV/e+PV/wi+${lemma}+V+AI+Cnj+3Pl
+_ 4Sg/Pl	PV/wi+${lemma}+V+AI+Ind+4Sg/Pl	PV/e+PV/wi+${lemma}+V+AI+Cnj+4Sg/Pl
+		
+# Fut+Def		
+	| Ind	
+_ 1Sg	PV/ka+${lemma}+V+AI+Ind+1Sg	
+_ 2Sg	PV/ka+${lemma}+V+AI+Ind+2Sg	
+_ 3Sg	PV/ka+${lemma}+V+AI+Ind+3Sg	
+_ 1Pl	PV/ka+${lemma}+V+AI+Ind+1Pl	
+_ 12Pl	PV/ka+${lemma}+V+AI+Ind+12Pl	
+_ 2Pl	PV/ka+${lemma}+V+AI+Ind+2Pl	
+_ 3Pl	PV/ka+${lemma}+V+AI+Ind+3Pl	
+_ 4Sg/Pl	PV/ka+${lemma}+V+AI+Ind+4Sg/Pl	
+		
+# Inf		
+	| Inf | PV/ka	| Inf | PV/ta
+_ 1Sg	PV/ka+${lemma}+V+AI+Cnj+1Sg	PV/ta+${lemma}+V+AI+Cnj+1Sg
+_ 2Sg	PV/ka+${lemma}+V+AI+Cnj+2Sg	PV/ta+${lemma}+V+AI+Cnj+2Sg
+_ 3Sg	PV/ka+${lemma}+V+AI+Cnj+3Sg	PV/ta+${lemma}+V+AI+Cnj+3Sg
+_ 1Pl	PV/ka+${lemma}+V+AI+Cnj+1Pl	PV/ta+${lemma}+V+AI+Cnj+1Pl
+_ 12Pl	PV/ka+${lemma}+V+AI+Cnj+12Pl	PV/ta+${lemma}+V+AI+Cnj+12Pl
+_ 2Pl	PV/ka+${lemma}+V+AI+Cnj+2Pl	PV/ta+${lemma}+V+AI+Cnj+2Pl
+_ 3Pl	PV/ka+${lemma}+V+AI+Cnj+3Pl	PV/ta+${lemma}+V+AI+Cnj+3Pl
+_ 4Sg/Pl	PV/ka+${lemma}+V+AI+Cnj+4Sg/Pl	PV/ta+${lemma}+V+AI+Cnj+4Sg/Pl
+		
+# Fut+Cond		
+_ 1Sg	${lemma}+V+AI+Fut+Cond+1Sg	
+_ 2Sg	${lemma}+V+AI+Fut+Cond+2Sg	
+_ 3Sg	${lemma}+V+AI+Fut+Cond+3Sg	
+_ 1Pl	${lemma}+V+AI+Fut+Cond+1Pl	
+_ 12Pl	${lemma}+V+AI+Fut+Cond+12Pl	
+_ 2Pl	${lemma}+V+AI+Fut+Cond+2Pl	
+_ 3Pl	${lemma}+V+AI+Fut+Cond+3Pl	
+_ 4Sg/Pl	${lemma}+V+AI+Fut+Cond+4Sg/Pl	
+		
+# Imp		
+	| Imm	| Del
+_ 2Sg	${lemma}+V+AI+Imp+Imm+2Sg	${lemma}+V+AI+Imp+Del+2Sg
+_ 12Pl	${lemma}+V+AI+Imp+Imm+12Pl	${lemma}+V+AI+Imp+Del+12Pl
+_ 2Pl	${lemma}+V+AI+Imp+Imm+2Pl	${lemma}+V+AI+Imp+Del+2Pl
diff --git a/src/CreeDictionary/res/layouts/dynamic/VII.tsv b/src/CreeDictionary/res/layouts/dynamic/VII.tsv
new file mode 100644
index 000000000..9c21e8a4f
--- /dev/null
+++ b/src/CreeDictionary/res/layouts/dynamic/VII.tsv
@@ -0,0 +1,40 @@
+# Prs		
+	| Ind	| Cnj
+_ 0Sg _ Prs	${lemma}+V+II+Ind+3Sg	PV/e+${lemma}+V+II+Cnj+3Sg
+_ 0Pl _ Prs	${lemma}+V+II+Ind+3Pl	PV/e+${lemma}+V+II+Cnj+3Pl
+_ 0Sg _ Obv _ Prs	${lemma}+V+II+Ind+4Sg	PV/e+${lemma}+V+II+Cnj+4Sg
+_ 0Pl _ Obv _ Prs	${lemma}+V+II+Ind+4Pl	PV/e+${lemma}+V+II+Cnj+4Pl
+		
+# Prt		
+	| Ind	| Cnj
+_ 0Sg _ Prt	PV/ki+${lemma}+V+II+Ind+3Sg	PV/e+PV/ki+${lemma}+V+II+Cnj+3Sg
+_ 0Pl _ Prt	PV/ki+${lemma}+V+II+Ind+3Pl	PV/e+PV/ki+${lemma}+V+II+Cnj+3Pl
+_ 0Sg _ Obv _ Prt	PV/ki+${lemma}+V+II+Ind+4Sg	PV/e+PV/ki+${lemma}+V+II+Cnj+4Sg
+_ 0Pl _ Obv _ Prt	PV/ki+${lemma}+V+II+Ind+4Pl	PV/e+PV/ki+${lemma}+V+II+Cnj+4Pl
+		
+# Fut # Int		
+	| Ind	| Cnj
+_ 0Sg _ Fut _ Int	PV/wi+${lemma}+V+II+Ind+3Sg	PV/e+PV/wi+${lemma}+V+II+Cnj+3Sg
+_ 0Pl _ Fut _ Int	PV/wi+${lemma}+V+II+Ind+3Pl	PV/e+PV/wi+${lemma}+V+II+Cnj+3Pl
+_ 0Sg _ Obv _ Fut _ Int	PV/wi+${lemma}+V+II+Ind+4Sg	PV/e+PV/wi+${lemma}+V+II+Cnj+4Sg
+_ 0Pl _ Obv _ Fut _ Int	PV/wi+${lemma}+V+II+Ind+4Pl	PV/e+PV/wi+${lemma}+V+II+Cnj+4Pl
+		
+# Fut # Def		
+	| Ind	
+_ 0Sg _ Fut _ Def	PV/ka+${lemma}+V+II+Ind+3Sg	
+_ 0Pl _ Fut _ Def	PV/ka+${lemma}+V+II+Ind+3Pl	
+_ 0Sg _ Obv _ Fut _ Def	PV/ka+${lemma}+V+II+Ind+4Sg	
+_ 0Pl _ Obv _ Fut _ Def	PV/ka+${lemma}+V+II+Ind+4Pl	
+		
+# Inf		
+	| Inf | PV/ka	| Inf | PV/ta
+_ 0Sg _ Inf	PV/ka+${lemma}+V+II+Cnj+3Sg	PV/ta+${lemma}+V+II+Cnj+3Sg
+_ 0Pl _ Inf	PV/ka+${lemma}+V+II+Cnj+3Pl	PV/ta+${lemma}+V+II+Cnj+3Pl
+_ 0Sg _ Obv _ Inf	PV/ka+${lemma}+V+II+Cnj+4Sg	PV/ta+${lemma}+V+II+Cnj+4Sg
+_ 0Pl _ Pl _ Inf	PV/ka+${lemma}+V+II+Cnj+4Pl	PV/ta+${lemma}+V+II+Cnj+4Pl
+		
+# Fut # Cond		
+_ 0Sg _ Fut _ Cond	${lemma}+V+II+Fut+Cond+3Sg	
+_ 0Pl _ Fut _ Cond	${lemma}+V+II+Fut+Cond+3Pl	
+_ 0Sg _ Obv _ Fut _ Cond	${lemma}+V+II+Fut+Cond+4Sg	
+_ 0Pl _ Obv _ Fut _ Cond	${lemma}+V+II+Fut+Cond+4Pl	
diff --git a/src/CreeDictionary/res/layouts/dynamic/VTA.tsv b/src/CreeDictionary/res/layouts/dynamic/VTA.tsv
new file mode 100644
index 000000000..9129f2c82
--- /dev/null
+++ b/src/CreeDictionary/res/layouts/dynamic/VTA.tsv
@@ -0,0 +1,389 @@
+# Prs		
+	| Ind	| Cnj
+_ 1Sg _ 2SgO	${lemma}+V+TA+Ind+1Sg+2SgO	PV/e+${lemma}+V+TA+Cnj+1Sg+2SgO
+_ 1Sg _ 3SgO	${lemma}+V+TA+Ind+1Sg+3SgO	PV/e+${lemma}+V+TA+Cnj+1Sg+3SgO
+_ 1Sg _ 2PlO	${lemma}+V+TA+Ind+1Sg+2PlO	PV/e+${lemma}+V+TA+Cnj+1Sg+2PlO
+_ 1Sg _ 3PlO	${lemma}+V+TA+Ind+1Sg+3PlO	PV/e+${lemma}+V+TA+Cnj+1Sg+3PlO
+_ 1Sg _ 4Sg/PlO	${lemma}+V+TA+Ind+1Sg+4Sg/PlO	PV/e+${lemma}+V+TA+Cnj+1Sg+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 2Sg _ 1SgO	${lemma}+V+TA+Ind+2Sg+1SgO	PV/e+${lemma}+V+TA+Cnj+2Sg+1SgO
+_ 2Sg _ 3SgO	${lemma}+V+TA+Ind+2Sg+3SgO	PV/e+${lemma}+V+TA+Cnj+2Sg+3SgO
+_ 2Sg _ 1PlO	${lemma}+V+TA+Ind+2Sg+1PlO	PV/e+${lemma}+V+TA+Cnj+2Sg+1PlO
+_ 2Sg _ 3PlO	${lemma}+V+TA+Ind+2Sg+3PlO	PV/e+${lemma}+V+TA+Cnj+2Sg+3PlO
+_ 2Sg _ 4Sg/PlO	${lemma}+V+TA+Ind+2Sg+4Sg/PlO	PV/e+${lemma}+V+TA+Cnj+2Sg+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 3Sg _ 1SgO	${lemma}+V+TA+Ind+3Sg+1SgO	PV/e+${lemma}+V+TA+Cnj+3Sg+1SgO
+_ 3Sg _ 2SgO	${lemma}+V+TA+Ind+3Sg+2SgO	PV/e+${lemma}+V+TA+Cnj+3Sg+2SgO
+_ 3Sg _ 1PlO	${lemma}+V+TA+Ind+3Sg+1PlO	PV/e+${lemma}+V+TA+Cnj+3Sg+1PlO
+_ 3Sg _ 12PlO	${lemma}+V+TA+Ind+3Sg+12PlO	PV/e+${lemma}+V+TA+Cnj+3Sg+12PlO
+_ 3Sg _ 2PlO	${lemma}+V+TA+Ind+3Sg+2PlO	PV/e+${lemma}+V+TA+Cnj+3Sg+2PlO
+_ 3Sg _ 4Sg/PlO	${lemma}+V+TA+Ind+3Sg+4Sg/PlO	PV/e+${lemma}+V+TA+Cnj+3Sg+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 1Pl _ 2SgO	${lemma}+V+TA+Ind+1Pl+2SgO	PV/e+${lemma}+V+TA+Cnj+1Pl+2SgO
+_ 1Pl _ 3SgO	${lemma}+V+TA+Ind+1Pl+3SgO	PV/e+${lemma}+V+TA+Cnj+1Pl+3SgO
+_ 1Pl _ 2PlO	${lemma}+V+TA+Ind+1Pl+2PlO	PV/e+${lemma}+V+TA+Cnj+1Pl+2PlO
+_ 1Pl _ 3PlO	${lemma}+V+TA+Ind+1Pl+3PlO	PV/e+${lemma}+V+TA+Cnj+1Pl+3PlO
+_ 1Pl _ 4Sg/PlO	${lemma}+V+TA+Ind+1Pl+4Sg/PlO	PV/e+${lemma}+V+TA+Cnj+1Pl+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 12Pl _ 3SgO	${lemma}+V+TA+Ind+12Pl+3SgO	PV/e+${lemma}+V+TA+Cnj+12Pl+3SgO
+_ 12Pl _ 3PlO	${lemma}+V+TA+Ind+12Pl+3PlO	PV/e+${lemma}+V+TA+Cnj+12Pl+3PlO
+_ 12Pl _ 4Sg/PlO	${lemma}+V+TA+Ind+12Pl+4Sg/PlO	PV/e+${lemma}+V+TA+Cnj+12Pl+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 2Pl _ 1SgO	${lemma}+V+TA+Ind+2Pl+1SgO	PV/e+${lemma}+V+TA+Cnj+2Pl+1SgO
+_ 2Pl _ 3SgO	${lemma}+V+TA+Ind+2Pl+3SgO	PV/e+${lemma}+V+TA+Cnj+2Pl+3SgO
+_ 2Pl _ 1PlO	${lemma}+V+TA+Ind+2Pl+1PlO	PV/e+${lemma}+V+TA+Cnj+2Pl+1PlO
+_ 2Pl _ 3PlO	${lemma}+V+TA+Ind+2Pl+3PlO	PV/e+${lemma}+V+TA+Cnj+2Pl+3PlO
+_ 2Pl _ 4Sg/PlO	${lemma}+V+TA+Ind+2Pl+4Sg/PlO	PV/e+${lemma}+V+TA+Cnj+2Pl+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 3Pl _ 1SgO	${lemma}+V+TA+Ind+3Pl+1SgO	PV/e+${lemma}+V+TA+Cnj+3Pl+1SgO
+_ 3Pl _ 2SgO	${lemma}+V+TA+Ind+3Pl+2SgO	PV/e+${lemma}+V+TA+Cnj+3Pl+2SgO
+_ 3Pl _ 1PlO	${lemma}+V+TA+Ind+3Pl+1PlO	PV/e+${lemma}+V+TA+Cnj+3Pl+1PlO
+_ 3Pl _ 12PlO	${lemma}+V+TA+Ind+3Pl+12PlO	PV/e+${lemma}+V+TA+Cnj+3Pl+12PlO
+_ 3Pl _ 4Sg/PlO	${lemma}+V+TA+Ind+3Pl+4Sg/PlO	PV/e+${lemma}+V+TA+Cnj+3Pl+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 4Sg/Pl _ 1SgO	${lemma}+V+TA+Ind+4Sg/Pl+1SgO	PV/e+${lemma}+V+TA+Cnj+4Sg/Pl+1SgO
+_ 4Sg/Pl _ 2SgO	${lemma}+V+TA+Ind+4Sg/Pl+2SgO	PV/e+${lemma}+V+TA+Cnj+4Sg/Pl+2SgO
+_ 4Sg/Pl _ 3SgO	${lemma}+V+TA+Ind+4Sg/Pl+3SgO	PV/e+${lemma}+V+TA+Cnj+4Sg/Pl+3SgO
+_ 4Sg/Pl _ 1PlO	${lemma}+V+TA+Ind+4Sg/Pl+1PlO	PV/e+${lemma}+V+TA+Cnj+4Sg/Pl+1PlO
+_ 4Sg/Pl _ 12PlO	${lemma}+V+TA+Ind+4Sg/Pl+12PlO	PV/e+${lemma}+V+TA+Cnj+4Sg/Pl+12PlO
+_ 4Sg/Pl _ 2PlO	${lemma}+V+TA+Ind+4Sg/Pl+2PlO	PV/e+${lemma}+V+TA+Cnj+4Sg/Pl+2PlO
+_ 4Sg/Pl _ 3PlO	${lemma}+V+TA+Ind+4Sg/Pl+3PlO	PV/e+${lemma}+V+TA+Cnj+4Sg/Pl+3PlO
+_ 4Sg/Pl _ 5Sg/PlO	${lemma}+V+TA+Ind+4Sg/Pl+5Sg/PlO	PV/e+${lemma}+V+TA+Cnj+4Sg/Pl+5Sg/PlO
+		
+	| Ind	| Cnj
+_ 5Sg/Pl _ 4Sg/PlO	${lemma}+V+TA+Ind+5Sg/Pl+4Sg/PlO	PV/e+${lemma}+V+TA+Cnj+5Sg/Pl+4Sg/PlO
+		
+	| Ind	| Cnj
+_ X _ 1SgO	${lemma}+V+TA+Ind+X+1SgO	PV/e+${lemma}+V+TA+Cnj+X+1SgO
+_ X _ 2SgO	${lemma}+V+TA+Ind+X+2SgO	PV/e+${lemma}+V+TA+Cnj+X+2SgO
+_ X _ 3SgO	${lemma}+V+TA+Ind+X+3SgO	PV/e+${lemma}+V+TA+Cnj+X+3SgO
+_ X _ 1PlO	${lemma}+V+TA+Ind+X+1PlO	PV/e+${lemma}+V+TA+Cnj+X+1PlO
+_ X _ 12PlO	${lemma}+V+TA+Ind+X+12PlO	PV/e+${lemma}+V+TA+Cnj+X+12PlO
+_ X _ 2PlO	${lemma}+V+TA+Ind+X+2PlO	PV/e+${lemma}+V+TA+Cnj+X+2PlO
+_ X _ 3PlO	${lemma}+V+TA+Ind+X+3PlO	PV/e+${lemma}+V+TA+Cnj+X+3PlO
+_ X _ 4Sg/PlO	${lemma}+V+TA+Ind+X+4Sg/PlO	PV/e+${lemma}+V+TA+Cnj+X+4Sg/PlO
+		
+# Prt		
+	| Ind	| Cnj
+_ 1Sg _ 2SgO	PV/ki+${lemma}+V+TA+Ind+1Sg+2SgO	PV/e+PV/ki+${lemma}+V+TA+Cnj+1Sg+2SgO
+_ 1Sg _ 3SgO	PV/ki+${lemma}+V+TA+Ind+1Sg+3SgO	PV/e+PV/ki+${lemma}+V+TA+Cnj+1Sg+3SgO
+_ 1Sg _ 2PlO	PV/ki+${lemma}+V+TA+Ind+1Sg+2PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+1Sg+2PlO
+_ 1Sg _ 3PlO	PV/ki+${lemma}+V+TA+Ind+1Sg+3PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+1Sg+3PlO
+_ 1Sg _ 4Sg/PlO	PV/ki+${lemma}+V+TA+Ind+1Sg+4Sg/PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+1Sg+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 2Sg _ 1SgO	PV/ki+${lemma}+V+TA+Ind+2Sg+1SgO	PV/e+PV/ki+${lemma}+V+TA+Cnj+2Sg+1SgO
+_ 2Sg _ 3SgO	PV/ki+${lemma}+V+TA+Ind+2Sg+3SgO	PV/e+PV/ki+${lemma}+V+TA+Cnj+2Sg+3SgO
+_ 2Sg _ 1PlO	PV/ki+${lemma}+V+TA+Ind+2Sg+1PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+2Sg+1PlO
+_ 2Sg _ 3PlO	PV/ki+${lemma}+V+TA+Ind+2Sg+3PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+2Sg+3PlO
+_ 2Sg _ 4Sg/PlO	PV/ki+${lemma}+V+TA+Ind+2Sg+4Sg/PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+2Sg+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 1Pl _ 2SgO	PV/ki+${lemma}+V+TA+Ind+1Pl+2SgO	PV/e+PV/ki+${lemma}+V+TA+Cnj+1Pl+2SgO
+_ 1Pl _ 2PlO	PV/ki+${lemma}+V+TA+Ind+1Pl+2PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+1Pl+2PlO
+_ 1Pl _ 3SgO	PV/ki+${lemma}+V+TA+Ind+1Pl+3SgO	PV/e+PV/ki+${lemma}+V+TA+Cnj+1Pl+3SgO
+_ 1Pl _ 3PlO	PV/ki+${lemma}+V+TA+Ind+1Pl+3PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+1Pl+3PlO
+_ 1Pl _ 4Sg/PlO	PV/ki+${lemma}+V+TA+Ind+1Pl+4Sg/PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+1Pl+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 12Pl _ 3SgO	PV/ki+${lemma}+V+TA+Ind+12Pl+3SgO	PV/e+PV/ki+${lemma}+V+TA+Cnj+12Pl+3SgO
+_ 12Pl _ 3PlO	PV/ki+${lemma}+V+TA+Ind+12Pl+3PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+12Pl+3PlO
+_ 12Pl _ 4Sg/PlO	PV/ki+${lemma}+V+TA+Ind+12Pl+4Sg/PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+12Pl+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 2Pl _ 1SgO	PV/ki+${lemma}+V+TA+Ind+2Pl+1SgO	PV/e+PV/ki+${lemma}+V+TA+Cnj+2Pl+1SgO
+_ 2Pl _ 3SgO	PV/ki+${lemma}+V+TA+Ind+2Pl+3SgO	PV/e+PV/ki+${lemma}+V+TA+Cnj+2Pl+3SgO
+_ 2Pl _ 1PlO	PV/ki+${lemma}+V+TA+Ind+2Pl+1PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+2Pl+1PlO
+_ 2Pl _ 3PlO	PV/ki+${lemma}+V+TA+Ind+2Pl+3PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+2Pl+3PlO
+_ 2Pl _ 4Sg/PlO	PV/ki+${lemma}+V+TA+Ind+2Pl+4Sg/PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+2Pl+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 3Sg _ 1SgO	PV/ki+${lemma}+V+TA+Ind+3Sg+1SgO	PV/e+PV/ki+${lemma}+V+TA+Cnj+3Sg+1SgO
+_ 3Sg _ 2SgO	PV/ki+${lemma}+V+TA+Ind+3Sg+2SgO	PV/e+PV/ki+${lemma}+V+TA+Cnj+3Sg+2SgO
+_ 3Sg _ 1PlO	PV/ki+${lemma}+V+TA+Ind+3Sg+1PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+3Sg+1PlO
+_ 3Sg _ 12PlO	PV/ki+${lemma}+V+TA+Ind+3Sg+12PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+3Sg+12PlO
+_ 3Sg _ 2PlO	PV/ki+${lemma}+V+TA+Ind+3Pl+2PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+3Pl+2PlO
+_ 3Sg _ 4Sg/PlO	PV/ki+${lemma}+V+TA+Ind+3Sg+4Sg/PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+3Sg+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 3Pl _ 1SgO	PV/ki+${lemma}+V+TA+Ind+3Pl+1SgO	PV/e+PV/ki+${lemma}+V+TA+Cnj+3Pl+1SgO
+_ 3Pl _ 2SgO	PV/ki+${lemma}+V+TA+Ind+3Pl+2SgO	PV/e+PV/ki+${lemma}+V+TA+Cnj+3Pl+2SgO
+_ 3Pl _ 1PlO	PV/ki+${lemma}+V+TA+Ind+3Pl+1PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+3Pl+1PlO
+_ 3Pl _ 12PlO	PV/ki+${lemma}+V+TA+Ind+3Pl+12PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+3Pl+12PlO
+_ 3Pl _ 4Sg/PlO	PV/ki+${lemma}+V+TA+Ind+3Pl+4Sg/PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+3Pl+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 4Sg/Pl _ 1SgO	PV/ki+${lemma}+V+TA+Ind+4Sg/Pl+1SgO	PV/e+PV/ki+${lemma}+V+TA+Cnj+4Sg/Pl+1SgO
+_ 4Sg/Pl _ 2SgO	PV/ki+${lemma}+V+TA+Ind+4Sg/Pl+2SgO	PV/e+PV/ki+${lemma}+V+TA+Cnj+4Sg/Pl+2SgO
+_ 4Sg/Pl _ 1PlO	PV/ki+${lemma}+V+TA+Ind+4Sg/Pl+1PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+4Sg/Pl+1PlO
+_ 4Sg/Pl _ 12PlO	PV/ki+${lemma}+V+TA+Ind+4Sg/Pl+12PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+4Sg/Pl+12PlO
+_ 4Sg/Pl _ 2PlO	PV/ki+${lemma}+V+TA+Ind+4Sg/Pl+2PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+4Sg/Pl+2PlO
+		
+	| Ind	| Cnj
+_ 4Sg/Pl _ 3SgO	PV/ki+${lemma}+V+TA+Ind+4Sg/Pl+3SgO	PV/e+PV/ki+${lemma}+V+TA+Cnj+4Sg/Pl+3SgO
+_ 4Sg/Pl _ 3PlO	PV/ki+${lemma}+V+TA+Ind+4Sg/Pl+3PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+4Sg/Pl+3PlO
+_ 4Sg/Pl _ 5Sg/PlO	PV/ki+${lemma}+V+TA+Ind+4Sg/Pl+5Sg/PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+4Sg/Pl+5Sg/PlO
+		
+	| Ind	| Cnj
+_ 5Sg/Pl _ 4Sg/PlO	PV/ki+${lemma}+V+TA+Ind+5Sg/Pl+4Sg/PlO	PV/e+PV/ki+${lemma}+V+TA+Cnj+5Sg/Pl+4Sg/PlO
+		
+# Fut+Int		
+	| Ind	| Cnj
+_ 1Sg _ 2SgO	PV/wi+${lemma}+V+TA+Ind+1Sg+2SgO	PV/e+PV/wi+${lemma}+V+TA+Cnj+1Sg+2SgO
+_ 1Sg _ 3SgO	PV/wi+${lemma}+V+TA+Ind+1Sg+3SgO	PV/e+PV/wi+${lemma}+V+TA+Cnj+1Sg+3SgO
+_ 1Sg _ 2PlO	PV/wi+${lemma}+V+TA+Ind+1Sg+2PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+1Sg+2PlO
+_ 1Sg _ 3PlO	PV/wi+${lemma}+V+TA+Ind+1Sg+3PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+1Sg+3PlO
+_ 1Sg _ 4Sg/PlO	PV/wi+${lemma}+V+TA+Ind+1Sg+4Sg/PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+1Sg+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 2Sg _ 1SgO	PV/wi+${lemma}+V+TA+Ind+2Sg+1SgO	PV/e+PV/wi+${lemma}+V+TA+Cnj+2Sg+1SgO
+_ 2Sg _ 3SgO	PV/wi+${lemma}+V+TA+Ind+2Sg+3SgO	PV/e+PV/wi+${lemma}+V+TA+Cnj+2Sg+3SgO
+_ 2Sg _ 1PlO	PV/wi+${lemma}+V+TA+Ind+2Sg+1PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+2Sg+1PlO
+_ 2Sg _ 3PlO	PV/wi+${lemma}+V+TA+Ind+2Sg+3PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+2Sg+3PlO
+_ 2Sg _ 4Sg/PlO	PV/wi+${lemma}+V+TA+Ind+2Sg+4Sg/PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+2Sg+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 1Pl _ 2SgO	PV/wi+${lemma}+V+TA+Ind+1Pl+2SgO	PV/e+PV/wi+${lemma}+V+TA+Cnj+1Pl+2SgO
+_ 1Pl _ 3SgO	PV/wi+${lemma}+V+TA+Ind+1Pl+3SgO	PV/e+PV/wi+${lemma}+V+TA+Cnj+1Pl+3SgO
+_ 1Pl _ 2PlO	PV/wi+${lemma}+V+TA+Ind+1Pl+2PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+1Pl+2PlO
+_ 1Pl _ 3PlO	PV/wi+${lemma}+V+TA+Ind+1Pl+3PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+1Pl+3PlO
+_ 1Pl _ 4Sg/PlO	PV/wi+${lemma}+V+TA+Ind+1Pl+4Sg/PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+1Pl+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 2Pl _ 1SgO	PV/wi+${lemma}+V+TA+Ind+2Pl+1SgO	PV/e+PV/wi+${lemma}+V+TA+Cnj+2Pl+1SgO
+_ 2Pl _ 3SgO	PV/wi+${lemma}+V+TA+Ind+2Pl+3SgO	PV/e+PV/wi+${lemma}+V+TA+Cnj+2Pl+3SgO
+_ 2Pl _ 1PlO	PV/wi+${lemma}+V+TA+Ind+2Pl+1PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+2Pl+1PlO
+_ 2Pl _ 3PlO	PV/wi+${lemma}+V+TA+Ind+2Pl+3PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+2Pl+3PlO
+_ 2Pl _ 4Sg/PlO	PV/wi+${lemma}+V+TA+Ind+2Pl+4Sg/PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+2Pl+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 12Pl _ 3SgO	PV/wi+${lemma}+V+TA+Ind+12Pl+3SgO	PV/e+PV/wi+${lemma}+V+TA+Cnj+12Pl+3SgO
+_ 12Pl _ 3PlO	PV/wi+${lemma}+V+TA+Ind+12Pl+3PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+12Pl+3PlO
+_ 12Pl _ 4Sg/PlO	PV/wi+${lemma}+V+TA+Ind+12Pl+4Sg/PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+12Pl+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 3Sg _ 1SgO	PV/wi+${lemma}+V+TA+Ind+3Sg+1SgO	PV/e+PV/wi+${lemma}+V+TA+Cnj+3Sg+1SgO
+_ 3Sg _ 2SgO	PV/wi+${lemma}+V+TA+Ind+3Sg+2SgO	PV/e+PV/wi+${lemma}+V+TA+Cnj+3Sg+2SgO
+_ 3Sg _ 1PlO	PV/wi+${lemma}+V+TA+Ind+3Sg+1PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+3Sg+1PlO
+_ 3Sg _ 12PlO	PV/wi+${lemma}+V+TA+Ind+3Sg+12PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+3Sg+12PlO
+_ 3Sg _ 2PlO	PV/wi+${lemma}+V+TA+Ind+3Sg+2PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+3Sg+2PlO
+_ 3Sg _ 4Sg/PlO	PV/wi+${lemma}+V+TA+Ind+3Sg+4Sg/PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+3Sg+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 3Pl _ 1SgO	PV/wi+${lemma}+V+TA+Ind+3Pl+1SgO	PV/e+PV/wi+${lemma}+V+TA+Cnj+3Pl+1SgO
+_ 3Pl _ 2SgO	PV/wi+${lemma}+V+TA+Ind+3Pl+2SgO	PV/e+PV/wi+${lemma}+V+TA+Cnj+3Pl+2SgO
+_ 3Pl _ 1PlO	PV/wi+${lemma}+V+TA+Ind+3Pl+1PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+3Pl+1PlO
+_ 3Pl _ 12PlO	PV/wi+${lemma}+V+TA+Ind+3Pl+12PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+3Pl+12PlO
+_ 3Pl _ 4Sg/PlO	PV/wi+${lemma}+V+TA+Ind+3Pl+4Sg/PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+3Pl+4Sg/PlO
+		
+	| Ind	| Cnj
+_ 4Sg/Pl _ 1SgO	PV/wi+${lemma}+V+TA+Ind+4Sg/Pl+1SgO	PV/e+PV/wi+${lemma}+V+TA+Cnj+4Sg/Pl+1SgO
+_ 4Sg/Pl _ 2SgO	PV/wi+${lemma}+V+TA+Ind+4Sg/Pl+2SgO	PV/e+PV/wi+${lemma}+V+TA+Cnj+4Sg/Pl+2SgO
+_ 4Sg/Pl _ 1PlO	PV/wi+${lemma}+V+TA+Ind+4Sg/Pl+1PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+4Sg/Pl+1PlO
+_ 4Sg/Pl _ 12PlO	PV/wi+${lemma}+V+TA+Ind+4Sg/Pl+12PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+4Sg/Pl+12PlO
+_ 4Sg/Pl _ 2PlO	PV/wi+${lemma}+V+TA+Ind+4Sg/Pl+2PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+4Sg/Pl+2PlO
+_ 4Sg/Pl _ 3SgO	PV/wi+${lemma}+V+TA+Ind+4Sg/Pl+3SgO	PV/e+PV/wi+${lemma}+V+TA+Cnj+4Sg/Pl+3SgO
+_ 4Sg/Pl _ 3PlO	PV/wi+${lemma}+V+TA+Ind+4Sg/Pl+3PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+4Sg/Pl+3PlO
+_ 4Sg/Pl _ 5Sg/PlO	PV/wi+${lemma}+V+TA+Ind+4Sg/Pl+5Sg/PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+4Sg/Pl+5Sg/PlO
+		
+	| Ind	| Cnj
+_ 5Sg/Pl _ 4Sg/PlO	PV/wi+${lemma}+V+TA+Ind+5Sg/Pl+4Sg/PlO	PV/e+PV/wi+${lemma}+V+TA+Cnj+5Sg/Pl+4Sg/PlO
+		
+# Fut+Def		
+	| Ind	
+_ 1Sg _ 2SgO	PV/ka+${lemma}+V+TA+Ind+1Sg+2SgO	
+_ 1Sg _ 3SgO	PV/ka+${lemma}+V+TA+Ind+1Sg+3SgO	
+_ 1Sg _ 2PlO	PV/ka+${lemma}+V+TA+Ind+1Sg+2PlO	
+_ 1Sg _ 3PlO	PV/ka+${lemma}+V+TA+Ind+1Sg+3PlO	
+_ 1Sg _ 4Sg/PlO	PV/ka+${lemma}+V+TA+Ind+1Sg+4Sg/PlO	
+		
+_ 2Sg _ 1SgO	PV/ka+${lemma}+V+TA+Ind+2Sg+1SgO	
+_ 2Sg _ 3SgO	PV/ka+${lemma}+V+TA+Ind+2Sg+3SgO	
+_ 2Sg _ 1PlO	PV/ka+${lemma}+V+TA+Ind+2Sg+1PlO	
+_ 2Sg _ 3PlO	PV/ka+${lemma}+V+TA+Ind+2Sg+3PlO	
+_ 2Sg _ 4Sg/PlO	PV/ka+${lemma}+V+TA+Ind+2Sg+4Sg/PlO	
+		
+_ 1Pl _ 2SgO	PV/ka+${lemma}+V+TA+Ind+1Pl+2SgO	
+_ 1Pl _ 3SgO	PV/ka+${lemma}+V+TA+Ind+1Pl+3SgO	
+_ 1Pl _ 2PlO	PV/ka+${lemma}+V+TA+Ind+1Pl+2PlO	
+_ 1Pl _ 3PlO	PV/ka+${lemma}+V+TA+Ind+1Pl+3PlO	
+_ 1Pl _ 4Sg/PlO	PV/ka+${lemma}+V+TA+Ind+1Pl+4Sg/PlO	
+		
+_ 2Pl _ 1SgO	PV/ka+${lemma}+V+TA+Ind+2Pl+1SgO	
+_ 2Pl _ 3SgO	PV/ka+${lemma}+V+TA+Ind+2Pl+3SgO	
+_ 2Pl _ 1PlO	PV/ka+${lemma}+V+TA+Ind+2Pl+1PlO	
+_ 2Pl _ 3PlO	PV/ka+${lemma}+V+TA+Ind+2Pl+3PlO	
+_ 2Pl _ 4Sg/PlO	PV/ka+${lemma}+V+TA+Ind+2Pl+4Sg/PlO	
+		
+_ 12Pl _ 3SgO	PV/ka+${lemma}+V+TA+Ind+12Pl+3SgO	
+_ 12Pl _ 3PlO	PV/ka+${lemma}+V+TA+Ind+12Pl+3PlO	
+_ 12Pl _ 4Sg/PlO	PV/ka+${lemma}+V+TA+Ind+12Pl+4Sg/PlO	
+		
+_ 3Sg _ 1SgO	PV/ka+${lemma}+V+TA+Ind+3Sg+1SgO	
+_ 3Sg _ 2SgO	PV/ka+${lemma}+V+TA+Ind+3Sg+2SgO	
+_ 3Sg _ 1PlO	PV/ka+${lemma}+V+TA+Ind+3Sg+1PlO	
+_ 3Sg _ 12PlO	PV/ka+${lemma}+V+TA+Ind+3Sg+12PlO	
+_ 3Sg _ 2PlO	PV/ka+${lemma}+V+TA+Ind+3Sg+2PlO	
+_ 3Sg _ 4Sg/PlO	PV/ka+${lemma}+V+TA+Ind+3Sg+4Sg/PlO	
+		
+_ 3Pl _ 1SgO	PV/ka+${lemma}+V+TA+Ind+3Pl+1SgO	
+_ 3Pl _ 2SgO	PV/ka+${lemma}+V+TA+Ind+3Pl+2SgO	
+_ 3Pl _ 1PlO	PV/ka+${lemma}+V+TA+Ind+3Pl+1PlO	
+_ 3Pl _ 12PlO	PV/ka+${lemma}+V+TA+Ind+3Pl+12PlO	
+_ 3Sg _ 2PlO	PV/ka+${lemma}+V+TA+Ind+3Pl+2PlO	
+_ 3Pl _ 4Sg/PlO	PV/ka+${lemma}+V+TA+Ind+3Pl+4Sg/PlO	
+		
+_ 4Sg/Pl _ 1SgO	PV/ka+${lemma}+V+TA+Ind+4Sg/Pl+1SgO	
+_ 4Sg/Pl _ 2SgO	PV/ka+${lemma}+V+TA+Ind+4Sg/Pl+2SgO	
+_ 4Sg/Pl _ 1PlO	PV/ka+${lemma}+V+TA+Ind+4Sg/Pl+1PlO	
+_ 4Sg/Pl _ 12PlO	PV/ka+${lemma}+V+TA+Ind+4Sg/Pl+12PlO	
+_ 4Sg/Pl _ 2PlO	PV/ka+${lemma}+V+TA+Ind+4Sg/Pl+2PlO	
+		
+_ 4Sg/Pl _ 3SgO	PV/ka+${lemma}+V+TA+Ind+4Sg/Pl+3SgO	
+_ 4Sg/Pl _ 3PlO	PV/ka+${lemma}+V+TA+Ind+4Sg/Pl+3PlO	
+_ 4Sg/Pl _ 5Sg/PlO	PV/ka+${lemma}+V+TA+Ind+4Sg/Pl+5Sg/PlO	
+		
+_ 5Sg/Pl _ 4Sg/PlO	PV/ka+${lemma}+V+TA+Ind+5Sg/Pl+4Sg/PlO	
+		
+# Inf		
+	| Inf | PV/ka	| Inf | PV/ta
+_ 1Sg _ 2SgO	PV/ka+${lemma}+V+TA+Cnj+1Sg+2SgO	PV/ta+${lemma}+V+TA+Cnj+1Sg+2SgO
+_ 1Sg _ 3SgO	PV/ka+${lemma}+V+TA+Cnj+1Sg+3SgO	PV/ta+${lemma}+V+TA+Cnj+1Sg+3SgO
+_ 1Sg _ 2PlO	PV/ka+${lemma}+V+TA+Cnj+1Sg+2PlO	PV/ta+${lemma}+V+TA+Cnj+1Sg+2PlO
+_ 1Sg _ 3PlO	PV/ka+${lemma}+V+TA+Cnj+1Sg+3PlO	PV/ta+${lemma}+V+TA+Cnj+1Sg+3PlO
+_ 1Sg _ 4Sg/PlO	PV/ka+${lemma}+V+TA+Cnj+1Sg+4Sg/PlO	PV/ta+${lemma}+V+TA+Cnj+1Sg+4Sg/PlO
+		
+	| Inf | PV/ka	| Inf | PV/ta
+_ 2Sg _ 1SgO	PV/ka+${lemma}+V+TA+Cnj+2Sg+1SgO	PV/ta+${lemma}+V+TA+Cnj+2Sg+1SgO
+_ 2Sg _ 3SgO	PV/ka+${lemma}+V+TA+Cnj+2Sg+3SgO	PV/ta+${lemma}+V+TA+Cnj+2Sg+3SgO
+_ 2Sg _ 1PlO	PV/ka+${lemma}+V+TA+Cnj+2Sg+1PlO	PV/ta+${lemma}+V+TA+Cnj+2Sg+1PlO
+_ 2Sg _ 3PlO	PV/ka+${lemma}+V+TA+Cnj+2Sg+3PlO	PV/ta+${lemma}+V+TA+Cnj+2Sg+3PlO
+_ 2Sg _ 4Sg/PlO	PV/ka+${lemma}+V+TA+Cnj+2Sg+4Sg/PlO	PV/ta+${lemma}+V+TA+Cnj+2Sg+4Sg/PlO
+		
+	| Inf | PV/ka	| Inf | PV/ta
+_ 1Pl _ 2SgO	PV/ka+${lemma}+V+TA+Cnj+1Pl+2SgO	PV/ta+${lemma}+V+TA+Cnj+1Pl+2SgO
+_ 1Pl _ 3SgO	PV/ka+${lemma}+V+TA+Cnj+1Pl+3SgO	PV/ta+${lemma}+V+TA+Cnj+1Pl+3SgO
+_ 1Pl _ 2PlO	PV/ka+${lemma}+V+TA+Cnj+1Pl+2PlO	PV/ta+${lemma}+V+TA+Cnj+1Pl+2PlO
+_ 1Pl _ 3PlO	PV/ka+${lemma}+V+TA+Cnj+1Pl+3PlO	PV/ta+${lemma}+V+TA+Cnj+1Pl+3PlO
+_ 1Pl _ 4Sg/PlO	PV/ka+${lemma}+V+TA+Cnj+1Pl+4Sg/PlO	PV/ta+${lemma}+V+TA+Cnj+1Pl+4Sg/PlO
+		
+	| Inf | PV/ka	| Inf | PV/ta
+_ 12Pl _ 3SgO	PV/ka+${lemma}+V+TA+Cnj+12Pl+3SgO	PV/ta+${lemma}+V+TA+Cnj+12Pl+3SgO
+_ 12Pl _ 3PlO	PV/ka+${lemma}+V+TA+Cnj+12Pl+3PlO	PV/ta+${lemma}+V+TA+Cnj+12Pl+3PlO
+_ 12Pl _ 4Sg/PlO	PV/ka+${lemma}+V+TA+Cnj+12Pl+4Sg/PlO	PV/ta+${lemma}+V+TA+Cnj+12Pl+4Sg/PlO
+		
+	| Inf | PV/ka	| Inf | PV/ta
+_ 2Pl _ 1SgO	PV/ka+${lemma}+V+TA+Cnj+2Pl+1SgO	PV/ta+${lemma}+V+TA+Cnj+2Pl+1SgO
+_ 2Pl _ 3SgO	PV/ka+${lemma}+V+TA+Cnj+2Pl+3SgO	PV/ta+${lemma}+V+TA+Cnj+2Pl+3SgO
+_ 2Pl _ 1PlO	PV/ka+${lemma}+V+TA+Cnj+2Pl+1PlO	PV/ta+${lemma}+V+TA+Cnj+2Pl+1PlO
+_ 2Pl _ 3PlO	PV/ka+${lemma}+V+TA+Cnj+2Pl+3PlO	PV/ta+${lemma}+V+TA+Cnj+2Pl+3PlO
+_ 2Pl _ 4Sg/PlO	PV/ka+${lemma}+V+TA+Cnj+2Pl+4Sg/PlO	PV/ta+${lemma}+V+TA+Cnj+2Pl+4Sg/PlO
+		
+	| Inf | PV/ka	| Inf | PV/ta
+_ 3Sg _ 1SgO	PV/ka+${lemma}+V+TA+Cnj+3Sg+1SgO	PV/ta+${lemma}+V+TA+Cnj+3Sg+1SgO
+_ 3Sg _ 2SgO	PV/ka+${lemma}+V+TA+Cnj+3Sg+2SgO	PV/ta+${lemma}+V+TA+Cnj+3Sg+2SgO
+_ 3Sg _ 1PlO	PV/ka+${lemma}+V+TA+Cnj+3Sg+1PlO	PV/ta+${lemma}+V+TA+Cnj+3Sg+1PlO
+_ 3Sg _ 12PlO	PV/ka+${lemma}+V+TA+Cnj+3Sg+12PlO	PV/ta+${lemma}+V+TA+Cnj+3Sg+12PlO
+_ 3Sg _ 2PlO	PV/ka+${lemma}+V+TA+Cnj+3Sg+2PlO	PV/ta+${lemma}+V+TA+Cnj+3Sg+2PlO
+_ 3Sg _ 4Sg/PlO	PV/ka+${lemma}+V+TA+Cnj+3Sg+4Sg/PlO	PV/ta+${lemma}+V+TA+Cnj+3Sg+4Sg/PlO
+		
+	| Inf | PV/ka	| Inf | PV/ta
+_ 3Pl _ 1SgO	PV/ka+${lemma}+V+TA+Cnj+3Pl+1SgO	PV/ta+${lemma}+V+TA+Cnj+3Pl+1SgO
+_ 3Pl _ 2SgO	PV/ka+${lemma}+V+TA+Cnj+3Pl+2SgO	PV/ta+${lemma}+V+TA+Cnj+3Pl+2SgO
+_ 3Pl _ 1PlO	PV/ka+${lemma}+V+TA+Cnj+3Pl+1PlO	PV/ta+${lemma}+V+TA+Cnj+3Pl+1PlO
+_ 3Pl _ 12PlO	PV/ka+${lemma}+V+TA+Cnj+3Pl+12PlO	PV/ta+${lemma}+V+TA+Cnj+3Pl+12PlO
+_ 3Pl _ 4Sg/PlO	PV/ka+${lemma}+V+TA+Cnj+3Pl+4Sg/PlO	PV/ta+${lemma}+V+TA+Cnj+3Pl+4Sg/PlO
+		
+	| Inf | PV/ka	| Inf | PV/ta
+_ 4Sg/Pl _ 1SgO	PV/ka+${lemma}+V+TA+Cnj+4Sg/Pl+1SgO	PV/ta+${lemma}+V+TA+Cnj+4Sg/Pl+1SgO
+_ 4Sg/Pl _ 2SgO	PV/ka+${lemma}+V+TA+Cnj+4Sg/Pl+2SgO	PV/ta+${lemma}+V+TA+Cnj+4Sg/Pl+2SgO
+_ 4Sg/Pl _ 1PlO	PV/ka+${lemma}+V+TA+Cnj+4Sg/Pl+1PlO	PV/ta+${lemma}+V+TA+Cnj+4Sg/Pl+1PlO
+_ 4Sg/Pl _ 12PlO	PV/ka+${lemma}+V+TA+Cnj+4Sg/Pl+12PlO	PV/ta+${lemma}+V+TA+Cnj+4Sg/Pl+12PlO
+_ 4Sg/Pl _ 2PlO	PV/ka+${lemma}+V+TA+Cnj+4Sg/Pl+2PlO	PV/ta+${lemma}+V+TA+Cnj+4Sg/Pl+2PlO
+		
+	| Inf | PV/ka	| Inf | PV/ta
+_ 4Sg/Pl _ 3SgO	PV/ka+${lemma}+V+TA+Cnj+4Sg/Pl+3SgO	PV/ta+${lemma}+V+TA+Cnj+4Sg/Pl+3SgO
+_ 4Sg/Pl _ 3PlO	PV/ka+${lemma}+V+TA+Cnj+4Sg/Pl+3PlO	PV/ta+${lemma}+V+TA+Cnj+4Sg/Pl+3PlO
+_ 4Sg/Pl _ 5Sg/PlO	PV/ka+${lemma}+V+TA+Cnj+4Sg/Pl+5Sg/PlO	PV/ta+${lemma}+V+TA+Cnj+4Sg/Pl+5Sg/PlO
+		
+	| Inf | PV/ka	| Inf | PV/ta
+_ 5Sg/Pl _ 4Sg/PlO	PV/ka+${lemma}+V+TA+Cnj+5Sg/Pl+4Sg/PlO	PV/ta+${lemma}+V+TA+Cnj+5Sg/Pl+4Sg/PlO
+		
+# Fut+Cond		
+_ 1Sg _ 2SgO	${lemma}+V+TA+Fut+Cond+1Sg+2SgO	
+_ 1Sg _ 2PlO	${lemma}+V+TA+Fut+Cond+1Sg+2PlO	
+_ 1Sg _ 3SgO	${lemma}+V+TA+Fut+Cond+1Sg+3SgO	
+_ 1Sg _ 3PlO	${lemma}+V+TA+Fut+Cond+1Sg+3PlO	
+_ 1Sg _ 4Sg/PlO	${lemma}+V+TA+Fut+Cond+1Sg+4Sg/PlO	
+		
+_ 2Sg _ 1SgO	${lemma}+V+TA+Fut+Cond+2Sg+1SgO	
+_ 2Sg _ 3SgO	${lemma}+V+TA+Fut+Cond+2Sg+3SgO	
+_ 2Sg _ 1PlO	${lemma}+V+TA+Fut+Cond+2Sg+1PlO	
+_ 2Sg _ 3PlO	${lemma}+V+TA+Fut+Cond+2Sg+3PlO	
+_ 2Sg _ 4Sg/PlO	${lemma}+V+TA+Fut+Cond+2Sg+4Sg/PlO	
+		
+_ 1Pl _ 2SgO	${lemma}+V+TA+Fut+Cond+1Pl+2SgO	
+_ 1Pl _ 3SgO	${lemma}+V+TA+Fut+Cond+1Pl+3SgO	
+_ 1Pl _ 2PlO	${lemma}+V+TA+Fut+Cond+1Pl+2PlO	
+_ 1Pl _ 3PlO	${lemma}+V+TA+Fut+Cond+1Pl+3PlO	
+_ 1Pl _ 4Sg/PlO	${lemma}+V+TA+Fut+Cond+1Pl+4Sg/PlO	
+		
+_ 12Pl _ 3SgO	${lemma}+V+TA+Fut+Cond+12Pl+3SgO	
+_ 12Pl _ 3PlO	${lemma}+V+TA+Fut+Cond+12Pl+3PlO	
+_ 12Pl _ 4Sg/PlO	${lemma}+V+TA+Fut+Cond+12Pl+4Sg/PlO	
+		
+_ 2Pl _ 1SgO	${lemma}+V+TA+Fut+Cond+2Pl+1SgO	
+_ 2Pl _ 3SgO	${lemma}+V+TA+Fut+Cond+2Pl+3SgO	
+_ 2Pl _ 1PlO	${lemma}+V+TA+Fut+Cond+2Pl+1PlO	
+_ 2Pl _ 3PlO	${lemma}+V+TA+Fut+Cond+2Pl+3PlO	
+_ 2Pl _ 4Sg/PlO	${lemma}+V+TA+Fut+Cond+2Pl+4Sg/PlO	
+		
+_ 3Sg _ 1SgO	${lemma}+V+TA+Fut+Cond+3Sg+1SgO	
+_ 3Sg _ 2SgO	${lemma}+V+TA+Fut+Cond+3Sg+2SgO	
+_ 3Sg _ 1PlO	${lemma}+V+TA+Fut+Cond+3Sg+1PlO	
+_ 3Sg _ 12PlO	${lemma}+V+TA+Fut+Cond+3Sg+12PlO	
+_ 3Sg _ 2PlO	${lemma}+V+TA+Fut+Cond+3Sg+2PlO	
+_ 3Sg _ 4Sg/PlO	${lemma}+V+TA+Fut+Cond+3Sg+4Sg/PlO	
+_ 3Sg _ 5Sg/PlO	${lemma}+V+TA+Fut+Cond+3Sg+5Sg/PlO	
+		
+_ 3Pl _ 1SgO	${lemma}+V+TA+Fut+Cond+3Pl+1SgO	
+_ 3Pl _ 2SgO	${lemma}+V+TA+Fut+Cond+3Pl+2SgO	
+_ 3Pl _ 1PlO	${lemma}+V+TA+Fut+Cond+3Pl+1PlO	
+_ 3Pl _ 12PlO	${lemma}+V+TA+Fut+Cond+3Pl+12PlO	
+_ 3Pl _ 2PlO	${lemma}+V+TA+Fut+Cond+3Pl+2PlO	
+_ 3Pl _ 4Sg/PlO	${lemma}+V+TA+Fut+Cond+3Pl+4Sg/PlO	
+_ 3Pl _ 5Sg/PlO	${lemma}+V+TA+Fut+Cond+3Pl+5Sg/PlO	
+		
+_ 4Sg/Pl _ 1SgO	${lemma}+V+TA+Fut+Cond+4Sg/Pl+1SgO	
+_ 4Sg/Pl _ 2SgO	${lemma}+V+TA+Fut+Cond+4Sg/Pl+2SgO	
+_ 4Sg/Pl _ 1PlO	${lemma}+V+TA+Fut+Cond+4Sg/Pl+1PlO	
+_ 4Sg/Pl _ 12PlO	${lemma}+V+TA+Fut+Cond+4Sg/Pl+12PlO	
+_ 4Sg/Pl _ 2PlO	${lemma}+V+TA+Fut+Cond+4Sg/Pl+2PlO	
+		
+_ 4Sg/Pl _ 3SgO	${lemma}+V+TA+Fut+Cond+4Sg/Pl+3SgO	
+_ 4Sg/Pl _ 3PlO	${lemma}+V+TA+Fut+Cond+4Sg/Pl+3PlO	
+_ 4Sg/Pl _ 5Sg/PlO	${lemma}+V+TA+Fut+Cond+4Sg/Pl+5Sg/PlO	
+		
+_ 5Sg/Pl _ 4Sg/PlO	${lemma}+V+TA+Fut+Cond+5Sg/Pl+4Sg/PlO	
+		
+# Imp		
+	| Imm	| Del
+_ 2Sg _ 1SgO	${lemma}+V+TA+Imp+Imm+2Sg+1SgO	${lemma}+V+TA+Imp+Del+2Sg+1SgO
+_ 2Sg _ 1PlO	${lemma}+V+TA+Imp+Imm+2Sg+1PlO	${lemma}+V+TA+Imp+Del+2Sg+1PlO
+_ 2Sg _ 3SgO	${lemma}+V+TA+Imp+Imm+2Sg+3SgO	${lemma}+V+TA+Imp+Del+2Sg+3SgO
+_ 2Sg _ 3PlO	${lemma}+V+TA+Imp+Imm+2Sg+3PlO	${lemma}+V+TA+Imp+Del+2Sg+3PlO
+		
+_ 12Pl _ 3SgO	${lemma}+V+TA+Imp+Imm+12Pl+3SgO	${lemma}+V+TA+Imp+Del+12Pl+3SgO
+_ 12Pl _ 3PlO	${lemma}+V+TA+Imp+Imm+12Pl+3PlO	${lemma}+V+TA+Imp+Del+12Pl+3PlO
+		
+_ 2Pl _ 1SgO	${lemma}+V+TA+Imp+Imm+2Pl+1SgO	${lemma}+V+TA+Imp+Del+2Pl+1SgO
+_ 2Pl _ 1PlO	${lemma}+V+TA+Imp+Imm+2Pl+1PlO	${lemma}+V+TA+Imp+Del+2Pl+1PlO
+_ 2Pl _ 3SgO	${lemma}+V+TA+Imp+Imm+2Pl+3SgO	${lemma}+V+TA+Imp+Del+2Pl+3SgO
+_ 2Pl _ 3PlO	${lemma}+V+TA+Imp+Imm+2Pl+3PlO	${lemma}+V+TA+Imp+Del+2Pl+3PlO
diff --git a/src/CreeDictionary/res/layouts/dynamic/VTI.tsv b/src/CreeDictionary/res/layouts/dynamic/VTI.tsv
new file mode 100644
index 000000000..70a977582
--- /dev/null
+++ b/src/CreeDictionary/res/layouts/dynamic/VTI.tsv
@@ -0,0 +1,71 @@
+# Prs		
+	| Ind	| Cnj
+_ 1Sg	${lemma}+V+TI+Ind+1Sg	PV/e+${lemma}+V+TI+Cnj+1Sg
+_ 2Sg	${lemma}+V+TI+Ind+2Sg	PV/e+${lemma}+V+TI+Cnj+2Sg
+_ 3Sg	${lemma}+V+TI+Ind+3Sg	PV/e+${lemma}+V+TI+Cnj+3Sg
+_ 1Pl	${lemma}+V+TI+Ind+1Pl	PV/e+${lemma}+V+TI+Cnj+1Pl
+_ 12Pl	${lemma}+V+TI+Ind+12Pl	PV/e+${lemma}+V+TI+Cnj+12Pl
+_ 2Pl	${lemma}+V+TI+Ind+2Pl	PV/e+${lemma}+V+TI+Cnj+2Pl
+_ 3Pl	${lemma}+V+TI+Ind+3Pl	PV/e+${lemma}+V+TI+Cnj+3Pl
+_ 4Sg/Pl	${lemma}+V+TI+Ind+4Sg/Pl	PV/e+${lemma}+V+TI+Cnj+4Sg/Pl
+_ X	${lemma}+V+TI+Ind+X	PV/e+${lemma}+V+TI+Cnj+X
+		
+# Prt		
+	| Ind	| Cnj
+_ 1Sg	PV/ki+${lemma}+V+TI+Ind+1Sg	PV/e+PV/ki+${lemma}+V+TI+Cnj+1Sg
+_ 2Sg	PV/ki+${lemma}+V+TI+Ind+2Sg	PV/e+PV/ki+${lemma}+V+TI+Cnj+2Sg
+_ 3Sg	PV/ki+${lemma}+V+TI+Ind+3Sg	PV/e+PV/ki+${lemma}+V+TI+Cnj+3Sg
+_ 1Pl	PV/ki+${lemma}+V+TI+Ind+1Pl	PV/e+PV/ki+${lemma}+V+TI+Cnj+1Pl
+_ 12Pl	PV/ki+${lemma}+V+TI+Ind+12Pl	PV/e+PV/ki+${lemma}+V+TI+Cnj+12Pl
+_ 2Pl	PV/ki+${lemma}+V+TI+Ind+2Pl	PV/e+PV/ki+${lemma}+V+TI+Cnj+2Pl
+_ 3Pl	PV/ki+${lemma}+V+TI+Ind+3Pl	PV/e+PV/ki+${lemma}+V+TI+Cnj+3Pl
+_ 4Sg/Pl	PV/ki+${lemma}+V+TI+Ind+4Sg/Pl	PV/e+PV/ki+${lemma}+V+TI+Cnj+4Sg/Pl
+		
+# Fut # Int		
+	| Ind	| Cnj
+_ 1Sg	PV/wi+${lemma}+V+TI+Ind+1Sg	PV/e+PV/wi+${lemma}+V+TI+Cnj+1Sg
+_ 2Sg	PV/wi+${lemma}+V+TI+Ind+2Sg	PV/e+PV/wi+${lemma}+V+TI+Cnj+2Sg
+_ 3Sg	PV/wi+${lemma}+V+TI+Ind+3Sg	PV/e+PV/wi+${lemma}+V+TI+Cnj+3Sg
+_ 1Pl	PV/wi+${lemma}+V+TI+Ind+1Pl	PV/e+PV/wi+${lemma}+V+TI+Cnj+1Pl
+_ 12Pl	PV/wi+${lemma}+V+TI+Ind+12Pl	PV/e+PV/wi+${lemma}+V+TI+Cnj+12Pl
+_ 2Pl	PV/wi+${lemma}+V+TI+Ind+2Pl	PV/e+PV/wi+${lemma}+V+TI+Cnj+2Pl
+_ 3Pl	PV/wi+${lemma}+V+TI+Ind+3Pl	PV/e+PV/wi+${lemma}+V+TI+Cnj+3Pl
+_ 4Sg/Pl	PV/wi+${lemma}+V+TI+Ind+4Sg/Pl	PV/e+PV/wi+${lemma}+V+TI+Cnj+4Sg/Pl
+		
+# Fut # Def		
+	| Ind	
+_ 1Sg	PV/ka+${lemma}+V+TI+Ind+1Sg	
+_ 2Sg	PV/ka+${lemma}+V+TI+Ind+2Sg	
+_ 3Sg	PV/ka+${lemma}+V+TI+Ind+3Sg	
+_ 1Pl	PV/ka+${lemma}+V+TI+Ind+1Pl	
+_ 12Pl	PV/ka+${lemma}+V+TI+Ind+12Pl	
+_ 2Pl	PV/ka+${lemma}+V+TI+Ind+2Pl	
+_ 3Pl	PV/ka+${lemma}+V+TI+Ind+3Pl	
+_ 4Sg/Pl	PV/ka+${lemma}+V+TI+Ind+4Sg/Pl	
+		
+# Inf		
+	| Inf | PV/ka	| Inf | PV/ta
+_ 1Sg	PV/ka+${lemma}+V+TI+Cnj+1Sg	PV/ta+${lemma}+V+TI+Cnj+1Sg
+_ 2Sg	PV/ka+${lemma}+V+TI+Cnj+2Sg	PV/ta+${lemma}+V+TI+Cnj+2Sg
+_ 3Sg	PV/ka+${lemma}+V+TI+Cnj+3Sg	PV/ta+${lemma}+V+TI+Cnj+3Sg
+_ 1Pl	PV/ka+${lemma}+V+TI+Cnj+1Pl	PV/ta+${lemma}+V+TI+Cnj+1Pl
+_ 12Pl	PV/ka+${lemma}+V+TI+Cnj+12Pl	PV/ta+${lemma}+V+TI+Cnj+12Pl
+_ 2Pl	PV/ka+${lemma}+V+TI+Cnj+2Pl	PV/ta+${lemma}+V+TI+Cnj+2Pl
+_ 3Pl	PV/ka+${lemma}+V+TI+Cnj+3Pl	PV/ta+${lemma}+V+TI+Cnj+3Pl
+_ 4Sg/Pl	PV/ka+${lemma}+V+TI+Cnj+4Sg/Pl	PV/ta+${lemma}+V+TI+Cnj+4Sg/Pl
+		
+# Fut+Cond		
+_ 1Sg	${lemma}+V+TI+Fut+Cond+1Sg	
+_ 2Sg	${lemma}+V+TI+Fut+Cond+2Sg	
+_ 3Sg	${lemma}+V+TI+Fut+Cond+3Sg	
+_ 1Pl	${lemma}+V+TI+Fut+Cond+1Pl	
+_ 12Pl	${lemma}+V+TI+Fut+Cond+12Pl	
+_ 2Pl	${lemma}+V+TI+Fut+Cond+2Pl	
+_ 3Pl	${lemma}+V+TI+Fut+Cond+3Pl	
+_ 4Sg/Pl	${lemma}+V+TI+Fut+Cond+4Sg/Pl	
+		
+# Imp		
+	| Imm	| Del
+_ 2Sg	${lemma}+V+TI+Imp+Imm+2Sg	${lemma}+V+TI+Imp+Del+2Sg
+_ 12Pl	${lemma}+V+TI+Imp+Imm+12Pl	${lemma}+V+TI+Imp+Del+12Pl
+_ 2Pl	${lemma}+V+TI+Imp+Imm+2Pl	${lemma}+V+TI+Imp+Del+2Pl


Test patch:
diff --git a/src/CreeDictionary/tests/CreeDictionary_tests/test_panes.py b/src/CreeDictionary/tests/CreeDictionary_tests/test_panes.py
index 68a351752..c3d1b1a9b 100644
--- a/src/CreeDictionary/tests/CreeDictionary_tests/test_panes.py
+++ b/src/CreeDictionary/tests/CreeDictionary_tests/test_panes.py
@@ -182,10 +182,9 @@ def test_produces_fst_analysis_string(na_layout: ParadigmLayout):
         f"{lemma}+N+A+Px3Pl+Obv",
         f"{lemma}+N+A+Px4Sg/Pl+Obv",
     }
-    raw_analyses = na_layout.generate_fst_analysis_string(lemma)
-    generated_analyses = raw_analyses.splitlines(keepends=False)
-    assert len(expected_lines) == len(generated_analyses)
-    assert expected_lines == set(generated_analyses)
+    template2analysis = na_layout.generate_fst_analyses(lemma)
+    assert len(expected_lines) == len(template2analysis)
+    assert expected_lines == set(template2analysis.values())
 
 
 @pytest.fixture
diff --git a/src/CreeDictionary/tests/CreeDictionary_tests/test_paradigm_manager.py b/src/CreeDictionary/tests/CreeDictionary_tests/test_paradigm_manager.py
index 295058c77..832e2243b 100644
--- a/src/CreeDictionary/tests/CreeDictionary_tests/test_paradigm_manager.py
+++ b/src/CreeDictionary/tests/CreeDictionary_tests/test_paradigm_manager.py
@@ -25,6 +25,22 @@ def test_generates_personal_pronoun_paradigm(paradigm_manager) -> None:
     assert paradigm.contains_wordform("wiyawâw")
 
 
+def test_generates_na_paradigm(paradigm_manager) -> None:
+    """
+    Generate a paradigm for a lemma+word class; see if it has some expected basic
+    inflections.
+    """
+    lemma = "minôs"
+    word_class = "NA"
+    inflections = ["minôsa", "minôsak", "niminôs", "minôsinâhk"]
+
+    paradigm = paradigm_manager.dynamic_paradigm_for(lemma=lemma, word_class=word_class)
+    assert paradigm is not None
+
+    for form in inflections:
+        assert paradigm.contains_wordform(form)
+
+
 @pytest.fixture
 def paradigm_manager(shared_datadir: Path) -> ParadigmManager:
     from CreeDictionary.shared import expensive