Index: gc_core/py/oxt/Grammalecte.py
==================================================================
--- gc_core/py/oxt/Grammalecte.py
+++ gc_core/py/oxt/Grammalecte.py
@@ -1,21 +1,22 @@
-# -*- encoding: UTF-8 -*-
 # Grammalecte for Writer
 # License: MPL 2
 # A derivative work of Lightproof from László Németh (http://cgit.freedesktop.org/libreoffice/lightproof/)
 
 import uno
 import unohelper
+import json
 import sys
 import traceback
 from collections import deque
 
 from com.sun.star.linguistic2 import XProofreader, XSupportedLocales
 from com.sun.star.linguistic2 import ProofreadingResult
 from com.sun.star.lang import XServiceInfo, XServiceName, XServiceDisplayName
 from com.sun.star.lang import Locale
 
+import helpers
 import grammalecte.${lang} as gce
 #import lightproof_handler_${implname} as opt_handler
 import Options
 
 
@@ -36,17 +37,18 @@
         gce.load("Writer")
         # GC options
         # opt_handler.load(xCurCtx)
         dOpt = Options.load(xCurCtx)
         gce.setOptions(dOpt)
+        # dictionaries options
+        self.loadUserDictionaries()
         # store for results of big paragraphs
         self.dResult = {}
         self.nMaxRes = 1500
         self.lLastRes = deque(maxlen=self.nMaxRes)
         self.nRes = 0
-        #oSpellChecker = gce.getSpellChecker();
-        #oSpellChecker.setPersonalDictionary("fr.personal.json")
+
 
     # XServiceName method implementations
     def getServiceName (self):
         return self.ImplementationName
 
@@ -134,12 +136,24 @@
         return gce.name
 
     # Grammalecte
     def getSpellChecker (self):
         return gce.getSpellChecker()
+
+    def loadUserDictionaries (self):
+        try:
+            xSettingNode = helpers.getConfigSetting("/org.openoffice.Lightproof_grammalecte/Other/", False)
+            xChild = xSettingNode.getByName("o_${lang}")
+            if xChild.getPropertyValue("use_personal_dic"):
+                sJSON = xChild.getPropertyValue("personal_dic")
+                if sJSON:
+                    oSpellChecker = gce.getSpellChecker();
+                    oSpellChecker.setPersonalDictionary(json.loads(sJSON))
+        except:
+            traceback.print_exc()
 
 
 g_ImplementationHelper = unohelper.ImplementationHelper()
 g_ImplementationHelper.addImplementation(Grammalecte, "org.openoffice.comp.pyuno.Lightproof."+gce.pkg, ("com.sun.star.linguistic2.Proofreader",),)
 
 # g_ImplementationHelper.addImplementation( opt_handler.LightproofOptionsEventHandler, \
 #     "org.openoffice.comp.pyuno.LightproofOptionsEventHandler." + gce.pkg, ("com.sun.star.awt.XContainerWindowEventHandler",),)
Index: gc_core/py/oxt/OptionsDialog.xcs
==================================================================
--- gc_core/py/oxt/OptionsDialog.xcs
+++ gc_core/py/oxt/OptionsDialog.xcs
@@ -14,14 +14,30 @@
             
                 The data for one leaf.
             
             ${xcs_options}
         
+
+        
+            
+                The data for one leaf.
+            
+            1
+            1
+            0
+            1
+            
+            
+        
     
 
     
         
             
         
+
+        
+            
+        
     
 
 
ADDED   gc_core/py/oxt/helpers.py
Index: gc_core/py/oxt/helpers.py
==================================================================
--- /dev/null
+++ gc_core/py/oxt/helpers.py
@@ -0,0 +1,74 @@
+# Helpers for LibreOffice extension
+
+import os
+import traceback
+
+import uno
+
+from com.sun.star.beans import PropertyValue
+from com.sun.star.uno import RuntimeException as _rtex
+
+
+def xray (myObject):
+    "XRay - API explorer"
+    try:
+        sm = uno.getComponentContext().ServiceManager
+        mspf = sm.createInstanceWithContext("com.sun.star.script.provider.MasterScriptProviderFactory", uno.getComponentContext())
+        scriptPro = mspf.createScriptProvider("")
+        xScript = scriptPro.getScript("vnd.sun.star.script:XrayTool._Main.Xray?language=Basic&location=application")
+        xScript.invoke((myObject,), (), ())
+        return
+    except:
+        raise _rtex("\nBasic library Xray is not installed", uno.getComponentContext())
+
+
+def mri (ctx, xTarget):
+    "MRI - API Explorer"
+    try:
+        xMri = ctx.ServiceManager.createInstanceWithContext("mytools.Mri", ctx)
+        xMri.inspect(xTarget)
+    except:
+        raise _rtex("\nPython extension MRI is not installed", uno.getComponentContext())
+
+
+def getConfigSetting (sNodeConfig, bUpdate=False):
+    "get a configuration node"
+    # example: xNode = getConfigSetting("/org.openoffice.Office.Common/Path/Current", False)
+    xSvMgr = uno.getComponentContext().ServiceManager
+    xConfigProvider = xSvMgr.createInstanceWithContext("com.sun.star.configuration.ConfigurationProvider", uno.getComponentContext())
+    xPropertyValue = uno.createUnoStruct("com.sun.star.beans.PropertyValue")
+    xPropertyValue.Name = "nodepath"
+    xPropertyValue.Value = sNodeConfig
+    if bUpdate:
+        sService = "com.sun.star.configuration.ConfigurationUpdateAccess"
+    else:
+        sService = "com.sun.star.configuration.ConfigurationAccess"
+    return xConfigProvider.createInstanceWithArguments(sService, (xPropertyValue,)) # return xNode
+
+
+def printServices (o):
+    for s in o.getAvailableServiceNames():
+        print(' > '+s)
+
+
+def getWindowSize ():
+    "return main window size"
+    xCurCtx = uno.getComponentContext()
+    xDesktop = xCurCtx.getServiceManager().createInstanceWithContext('com.sun.star.frame.Desktop', xCurCtx)
+    xContainerWindow = xDesktop.getCurrentComponent().CurrentController.Frame.ContainerWindow
+    xWindowSize = xContainerWindow.convertSizeToLogic(xContainerWindow.Size, uno.getConstantByName("com.sun.star.util.MeasureUnit.POINT"))
+    #print(xContainerWindow.Size.Width, ">", xWindowSize.Width)
+    #print(xContainerWindow.Size.Height, ">", xWindowSize.Height)
+    xWindowSize.Width = xWindowSize.Width * 0.666
+    xWindowSize.Height = xWindowSize.Height * 0.666
+    return xWindowSize
+
+
+def getAbsolutePathOf (sPath=""):
+    xDefaultContext = uno.getComponentContext().ServiceManager.DefaultContext
+    xPackageInfoProvider = xDefaultContext.getValueByName("/singletons/com.sun.star.deployment.PackageInformationProvider")
+    sFullPath = xPackageInfoProvider.getPackageLocation("French.linguistic.resources.from.Dicollecte.by.OlivierR")
+    if sPath and not sPath.startswith("/"):
+        sPath = "/" + sPath
+    sFullPath = sFullPath[8:] + sPath
+    return os.path.abspath(sFullPath)
Index: gc_lang/fr/config.ini
==================================================================
--- gc_lang/fr/config.ini
+++ gc_lang/fr/config.ini
@@ -73,19 +73,24 @@
 oxt/_img/Algoo_logo.png = img/Algoo_logo.png
 oxt/_img/grammalecte_16.bmp = img/grammalecte_16.bmp
 oxt/_img/french_flag_16.bmp = img/french_flag_16.bmp
 # AppLauncher
 oxt/AppLauncher.py = AppLauncher.py
-oxt/helpers.py = pythonpath/helpers.py
 # About
 oxt/About/About.py = pythonpath/About.py
 oxt/About/ab_strings.py = pythonpath/ab_strings.py
 # Dictionaries
 oxt/Dictionnaires/dictionaries = dictionaries
 oxt/Dictionnaires/dictionaries.xcu = dictionaries.xcu
 oxt/Dictionnaires/DictionarySwitcher.py = pythonpath/DictionarySwitcher.py
 oxt/Dictionnaires/ds_strings.py = pythonpath/ds_strings.py
+# Dictionary Options
+oxt/DictOptions/DictOptions.py = pythonpath/DictOptions.py
+oxt/DictOptions/do_strings.py = pythonpath/do_strings.py
+oxt/DictOptions/LexiconEditor.py = pythonpath/LexiconEditor.py
+oxt/DictOptions/lxe_conj_data.py = pythonpath/lxe_conj_data.py
+oxt/DictOptions/lxe_strings.py = pythonpath/lxe_strings.py
 # ContextMenu
 oxt/ContextMenu/ContextMenu.py = ContextMenu.py
 oxt/ContextMenu/jobs.xcu = config/jobs.xcu
 # TextFormatter
 oxt/TextFormatter/TextFormatter.py = pythonpath/TextFormatter.py
Index: gc_lang/fr/oxt/AppLauncher.py
==================================================================
--- gc_lang/fr/oxt/AppLauncher.py
+++ gc_lang/fr/oxt/AppLauncher.py
@@ -40,10 +40,18 @@
                     xDialog.run()
             elif sCmd == "TF":
                 import TextFormatter
                 xDialog = TextFormatter.TextFormatter(self.ctx)
                 xDialog.run(self.sLang)
+            elif sCmd == "DI":
+                import DictOptions
+                xDialog = DictOptions.DictOptions(self.ctx)
+                xDialog.run(self.sLang)
+            elif sCmd == "LE":
+                import LexiconEditor
+                xDialog = LexiconEditor.LexiconEditor(self.ctx)
+                xDialog.run(self.sLang)
             elif sCmd == "DS":
                 import DictionarySwitcher
                 xDialog = DictionarySwitcher.FrenchDictionarySwitcher(self.ctx)
                 xDialog.run(self.sLang)
             elif sCmd == "MA":
ADDED   gc_lang/fr/oxt/DictOptions/DictOptions.py
Index: gc_lang/fr/oxt/DictOptions/DictOptions.py
==================================================================
--- /dev/null
+++ gc_lang/fr/oxt/DictOptions/DictOptions.py
@@ -0,0 +1,141 @@
+# Dictionary Options
+# by Olivier R.
+# License: MPL 2
+
+import unohelper
+import uno
+import traceback
+import time
+
+import helpers
+import do_strings
+
+from com.sun.star.task import XJobExecutor
+from com.sun.star.awt import XActionListener
+from com.sun.star.beans import PropertyValue
+
+
+class DictOptions (unohelper.Base, XActionListener, XJobExecutor):
+
+    def __init__ (self, ctx):
+        self.ctx = ctx
+        self.xSvMgr = self.ctx.ServiceManager
+        self.xContainer = None
+        self.xDialog = None
+        
+    def _addWidget (self, name, wtype, x, y, w, h, **kwargs):
+        xWidget = self.xDialog.createInstance('com.sun.star.awt.UnoControl%sModel' % wtype)
+        xWidget.Name = name
+        xWidget.PositionX = x
+        xWidget.PositionY = y
+        xWidget.Width = w
+        xWidget.Height = h
+        for k, w in kwargs.items():
+            setattr(xWidget, k, w)
+        self.xDialog.insertByName(name, xWidget)
+        return xWidget
+
+    def run (self, sLang):
+        dUI = do_strings.getUI(sLang)
+
+        self.xSettingNode = helpers.getConfigSetting("/org.openoffice.Lightproof_grammalecte/Other/", True)
+
+        # dialog
+        self.xDialog = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialogModel', self.ctx)
+        self.xDialog.Width = 200
+        self.xDialog.Height = 210
+        self.xDialog.Title = dUI.get('title', "#title#")
+        xWindowSize = helpers.getWindowSize()
+        self.xDialog.PositionX = int((xWindowSize.Width / 2) - (self.xDialog.Width / 2))
+        self.xDialog.PositionY = int((xWindowSize.Height / 2) - (self.xDialog.Height / 2))
+
+        # fonts
+        xFDTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor")
+        xFDTitle.Height = 9
+        xFDTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD")
+        xFDTitle.Name = "Verdana"
+        
+        xFDSubTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor")
+        xFDSubTitle.Height = 8
+        xFDSubTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD")
+        xFDSubTitle.Name = "Verdana"
+
+        # widget
+        nX = 10
+        nY1 = 10
+        nY2 = nY1 + 50
+        nY3 = nY2 + 70
+
+        nWidth = self.xDialog.Width - 20
+        nHeight = 10
+
+        # Spell checker section
+        self._addWidget("spelling_section", 'FixedLine', nX, nY1, nWidth, nHeight, Label = dUI.get("spelling_section", "#err"), FontDescriptor = xFDTitle)
+        self.xGraphspell = self._addWidget('activate_main', 'CheckBox', nX, nY1+15, nWidth, nHeight, Label = dUI.get('activate_main', "#err"))
+        self._addWidget('activate_main_descr', 'FixedText', nX, nY1+25, nWidth, nHeight*2, Label = dUI.get('activate_main_descr', "#err"), MultiLine = True)
+
+        # Spell suggestion engine section
+        self._addWidget("suggestion_section", 'FixedLine', nX, nY2, nWidth, nHeight, Label = dUI.get("suggestion_section", "#err"), FontDescriptor = xFDTitle)
+        self.xGraphspellSugg = self._addWidget('activate_spell_sugg', 'CheckBox', nX, nY2+15, nWidth, nHeight, Label = dUI.get('activate_spell_sugg', "#err"))
+        self._addWidget('activate_spell_sugg_descr', 'FixedText', nX, nY2+25, nWidth, nHeight*4, Label = dUI.get('activate_spell_sugg_descr', "#err"), MultiLine = True)
+
+        # Personal dictionary section
+        self._addWidget("personal_section", 'FixedLine', nX, nY3, nWidth, nHeight, Label = dUI.get("personal_section", "#err"), FontDescriptor = xFDTitle)
+        self.xPersonalDic = self._addWidget('activate_personal', 'CheckBox', nX, nY3+15, nWidth, nHeight, Label = dUI.get('activate_personal', "#err"))
+        self._addWidget('activate_personnal_descr', 'FixedText', nX, nY3+25, nWidth, nHeight*3, Label = dUI.get('activate_personal_descr', "#err"), MultiLine = True)
+        
+        # Button
+        self._addWidget('apply_button', 'Button', self.xDialog.Width-115, self.xDialog.Height-25, 50, 14, Label = dUI.get('apply_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x005500)
+        self._addWidget('cancel_button', 'Button', self.xDialog.Width-60, self.xDialog.Height-25, 50, 14, Label = dUI.get('cancel_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x550000)
+
+        self._loadOptions()
+
+        # container
+        self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx)
+        self.xContainer.setModel(self.xDialog)
+        self.xContainer.getControl('apply_button').addActionListener(self)
+        self.xContainer.getControl('apply_button').setActionCommand('Apply')
+        self.xContainer.getControl('cancel_button').addActionListener(self)
+        self.xContainer.getControl('cancel_button').setActionCommand('Cancel')
+        self.xContainer.setVisible(False)
+        toolkit = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.ExtToolkit', self.ctx)
+        self.xContainer.createPeer(toolkit, None)
+        self.xContainer.execute()
+
+    # XActionListener
+    def actionPerformed (self, xActionEvent):
+        try:
+            if xActionEvent.ActionCommand == 'Apply':
+                xChild = self.xSettingNode.getByName("o_fr")
+                xChild.setPropertyValue("use_graphspell", self.xGraphspell.State)
+                xChild.setPropertyValue("use_graphspell_sugg", self.xGraphspellSugg.State)
+                #xChild.setPropertyValue("extended_dic", self.xExtendedDic.State)
+                xChild.setPropertyValue("use_personal_dic", self.xPersonalDic.State)
+                self.xSettingNode.commitChanges()
+            else:
+                pass
+            self.xContainer.endExecute()
+        except:
+            traceback.print_exc()
+    
+    # XJobExecutor
+    def trigger (self, args):
+        try:
+            dialog = DictOptions(self.ctx)
+            dialog.run()
+        except:
+            traceback.print_exc()
+
+    def _loadOptions (self):
+        try:
+            xChild = self.xSettingNode.getByName("o_fr")
+            self.xGraphspell.State = xChild.getPropertyValue("use_graphspell")
+            self.xGraphspellSugg.State = xChild.getPropertyValue("use_graphspell_sugg")
+            #self.xExtendedDic.State = xChild.getPropertyValue("extended_dic")
+            self.xPersonalDic.State = xChild.getPropertyValue("use_personal_dic")
+        except:
+            traceback.print_exc()
+
+
+#g_ImplementationHelper = unohelper.ImplementationHelper()
+#g_ImplementationHelper.addImplementation(DictOptions, 'net.grammalecte.graphspell.DictOptions', ('com.sun.star.task.Job',))
ADDED   gc_lang/fr/oxt/DictOptions/LexiconEditor.py
Index: gc_lang/fr/oxt/DictOptions/LexiconEditor.py
==================================================================
--- /dev/null
+++ gc_lang/fr/oxt/DictOptions/LexiconEditor.py
@@ -0,0 +1,575 @@
+# Lexicon Editor
+# by Olivier R.
+# License: GPL 3
+
+import unohelper
+import uno
+import json
+import re
+import traceback
+
+import helpers
+import lxe_strings
+import lxe_conj_data
+import grammalecte.graphspell as sc
+import grammalecte.graphspell.dawg as dawg
+import grammalecte.graphspell.ibdawg as ibdawg
+import grammalecte.fr.conj as conj
+
+from com.sun.star.task import XJobExecutor
+from com.sun.star.awt import XActionListener
+from com.sun.star.awt import XKeyListener
+
+
+def _waitPointer (funcDecorated):
+    def wrapper (*args, **kwargs):
+        # self is the first parameter if the decorator is applied on a object
+        self = args[0]
+        # before
+        xPointer = self.xSvMgr.createInstanceWithContext("com.sun.star.awt.Pointer", self.ctx)
+        xPointer.setType(uno.getConstantByName("com.sun.star.awt.SystemPointer.WAIT"))
+        xWindowPeer = self.xContainer.getPeer()
+        xWindowPeer.setPointer(xPointer)
+        for x in xWindowPeer.Windows:
+            x.setPointer(xPointer)
+        # processing
+        result = funcDecorated(*args, **kwargs)
+        # after
+        xPointer.setType(uno.getConstantByName("com.sun.star.awt.SystemPointer.ARROW"))
+        xWindowPeer.setPointer(xPointer)
+        for x in xWindowPeer.Windows:
+            x.setPointer(xPointer)
+        self.xContainer.setVisible(True) # seems necessary to refresh the dialog box and text widgets (why?)
+        # return
+        return result
+    return wrapper
+
+
+class LexiconEditor (unohelper.Base, XActionListener, XKeyListener, XJobExecutor):
+
+    def __init__ (self, ctx):
+        self.ctx = ctx
+        self.xSvMgr = self.ctx.ServiceManager
+        self.xDesktop = self.xSvMgr.createInstanceWithContext("com.sun.star.frame.Desktop", self.ctx)
+        self.xDocument = self.xDesktop.getCurrentComponent()
+        self.xContainer = None
+        self.xDialog = None
+        self.oSpellChecker = None
+        # data
+        self.lGeneratedFlex = []
+        # options node
+        self.xSettingNode = helpers.getConfigSetting("/org.openoffice.Lightproof_grammalecte/Other/", True)
+
+    def _addWidget (self, name, wtype, x, y, w, h, **kwargs):
+        xWidget = self.xDialog.createInstance('com.sun.star.awt.UnoControl%sModel' % wtype)
+        xWidget.Name = name
+        xWidget.PositionX = x
+        xWidget.PositionY = y
+        xWidget.Width = w
+        xWidget.Height = h
+        for k, w in kwargs.items():
+            setattr(xWidget, k, w)
+        self.xDialog.insertByName(name, xWidget)
+        return xWidget
+
+    def _addGrid (self, name, x, y, w, h, columns, **kwargs):
+        xGridModel = self.xDialog.createInstance('com.sun.star.awt.grid.UnoControlGridModel')
+        xGridModel.Name = name
+        xGridModel.PositionX = x
+        xGridModel.PositionY = y
+        xGridModel.Width = w
+        xGridModel.Height = h
+        xColumnModel = xGridModel.ColumnModel
+        for e in columns:
+            xCol = xColumnModel.createColumn()
+            for k, w in e.items():
+                setattr(xCol, k, w)
+            xColumnModel.addColumn(xCol)
+        for k, w in kwargs.items():
+            setattr(xGridModel, k, w)
+        self.xDialog.insertByName(name, xGridModel)
+        return xGridModel
+
+    def run (self, sLang):
+        # ui lang
+        self.dUI = lxe_strings.getUI(sLang)
+
+        # dialog
+        self.xDialog = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialogModel', self.ctx)
+        self.xDialog.Width = 620
+        self.xDialog.Height = 292
+        self.xDialog.Title = self.dUI.get('title', "#title#")
+        xWindowSize = helpers.getWindowSize()
+        self.xDialog.PositionX = int((xWindowSize.Width / 2) - (self.xDialog.Width / 2))
+        self.xDialog.PositionY = int((xWindowSize.Height / 2) - (self.xDialog.Height / 2))
+
+        # fonts
+        xFDTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor")
+        xFDTitle.Height = 9
+        xFDTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD")
+        xFDTitle.Name = "Verdana"
+        
+        xFDSubTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor")
+        xFDSubTitle.Height = 8
+        xFDSubTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD")
+        xFDSubTitle.Name = "Verdana"
+
+        # widget
+        nX1 = 10
+        nX2 = 20
+
+        nY1 = 5
+        nY2 = nY1 + 25 # nom commun
+        nY3 = nY2 + 95 # nom propre
+        nY4 = nY3 + 45 # verbe
+        nY5 = nY4 + 68 # adverbe
+        nY6 = nY5 + 13 # autre
+
+        nXB = nX1 + 195
+        nXC = nXB + 205
+
+        nHeight = 10
+
+        #### Add word
+        self._addWidget("add_section", 'FixedLine', nX1, nY1, 190, nHeight, Label = self.dUI.get("add_section", "#err"), FontDescriptor = xFDTitle)
+        self.xLemma = self._addWidget('lemma', 'Edit', nX1, nY1+10, 120, 14, FontDescriptor = xFDTitle)
+        self._addWidget('close_button', 'Button', nX1+130, nY1+10, 60, 14, Label = self.dUI.get('close_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x550000)
+
+        # Radio buttons: main POS tag
+        # Note: the only way to group RadioButtons is to create them successively
+        self.xNA = self._addWidget('nom_adj', 'RadioButton', nX1, nY2+12, 60, nHeight, Label = self.dUI.get("nom_adj", "#err"), HelpText = ":N:A")
+        self.xN = self._addWidget('nom', 'RadioButton', nX1, nY2+22, 60, nHeight, Label = self.dUI.get("nom", "#err"), HelpText = ":N")
+        self.xA = self._addWidget('adj', 'RadioButton', nX1, nY2+32, 60, nHeight, Label = self.dUI.get("adj", "#err"), HelpText = ":A")
+        self.xM1 = self._addWidget('M1', 'RadioButton', nX1, nY3+12, 60, nHeight, Label = self.dUI.get("M1", "#err"), HelpText = ":M1")
+        self.xM2 = self._addWidget('M2', 'RadioButton', nX1, nY3+22, 60, nHeight, Label = self.dUI.get("M2", "#err"), HelpText = ":M2")
+        self.xMP = self._addWidget('MP', 'RadioButton', nX1, nY3+32, 60, nHeight, Label = self.dUI.get("MP", "#err"), HelpText = ":MP")
+        self.xV = self._addWidget('verb', 'RadioButton', nX1, nY4+2, 35, nHeight, Label = self.dUI.get("verb", "#err"), FontDescriptor = xFDSubTitle, HelpText = ":V")
+        self.xW = self._addWidget('adv', 'RadioButton', nX1, nY5+2, 35, nHeight, Label = self.dUI.get("adverb", "#err"), FontDescriptor = xFDSubTitle, HelpText = ":W")
+        self.xX = self._addWidget('other', 'RadioButton', nX1, nY6+2, 35, nHeight, Label = self.dUI.get("other", "#err"), FontDescriptor = xFDSubTitle, HelpText = ":X")
+        
+        # Nom, adjectif
+        self._addWidget("fl_nom_adj", 'FixedLine', nX1, nY2, 190, nHeight, Label = self.dUI.get("common_name", "#err"), FontDescriptor = xFDSubTitle)
+        self.xSepi = self._addWidget('Sepi', 'RadioButton', nX1+65, nY2+12, 50, nHeight, Label = self.dUI.get("epi", "#err"), HelpText = ":e")
+        self.xSmas = self._addWidget('Smas', 'RadioButton', nX1+65, nY2+22, 50, nHeight, Label = self.dUI.get("mas", "#err"), HelpText = ":m")
+        self.xSfem = self._addWidget('Sfem', 'RadioButton', nX1+65, nY2+32, 50, nHeight, Label = self.dUI.get("fem", "#err"), HelpText = ":f")
+        self._addWidget("fl_sep1", 'FixedLine', nX1, nY2, 1, nHeight)
+        self.xSs = self._addWidget('Ss', 'RadioButton', nX1+120, nY2+12, 50, nHeight, Label = self.dUI.get("-s", "#err"), HelpText = "·s")
+        self.xSx = self._addWidget('Sx', 'RadioButton', nX1+120, nY2+22, 50, nHeight, Label = self.dUI.get("-x", "#err"), HelpText = "·x")
+        self.xSinv = self._addWidget('Sinv', 'RadioButton', nX1+120, nY2+32, 50, nHeight, Label = self.dUI.get("inv", "#err"), HelpText = ":i")
+
+        self._addWidget("alt_lemma_label", 'FixedLine', nX1+10, nY2+42, 180, nHeight, Label = self.dUI.get("alt_lemma", "#err"))
+        self.xAltLemma = self._addWidget('alt_lemma', 'Edit', nX1+10, nY2+52, 120, nHeight)
+        self.xNA2 = self._addWidget('nom_adj2', 'RadioButton', nX1+10, nY2+65, 60, nHeight, Label = self.dUI.get("nom_adj", "#err"), HelpText = ":N:A")
+        self.xN2 = self._addWidget('nom2', 'RadioButton', nX1+10, nY2+75, 60, nHeight, Label = self.dUI.get("nom", "#err"), HelpText = ":N")
+        self.xA2 = self._addWidget('adj2', 'RadioButton', nX1+10, nY2+85, 60, nHeight, Label = self.dUI.get("adj", "#err"), HelpText = ":A")
+        self._addWidget("fl_sep2", 'FixedLine', nX1, nY2, 1, nHeight)
+        self.xSepi2 = self._addWidget('Sepi2', 'RadioButton', nX1+75, nY2+65, 50, nHeight, Label = self.dUI.get("epi", "#err"), HelpText = ":e")
+        self.xSmas2 = self._addWidget('Smas2', 'RadioButton', nX1+75, nY2+75, 50, nHeight, Label = self.dUI.get("mas", "#err"), HelpText = ":m")
+        self.xSfem2 = self._addWidget('Sfem2', 'RadioButton', nX1+75, nY2+85, 50, nHeight, Label = self.dUI.get("fem", "#err"), HelpText = ":f")
+        self._addWidget("fl_sep3", 'FixedLine', nX1, nY2, 1, nHeight)
+        self.xSs2 = self._addWidget('Ss2', 'RadioButton', nX1+130, nY2+65, 50, nHeight, Label = self.dUI.get("-s", "#err"), HelpText = "·s")
+        self.xSx2 = self._addWidget('Sx2', 'RadioButton', nX1+130, nY2+75, 50, nHeight, Label = self.dUI.get("-x", "#err"), HelpText = "·x")
+        self.xSinv2 = self._addWidget('Sinv2', 'RadioButton', nX1+130, nY2+85, 50, nHeight, Label = self.dUI.get("inv", "#err"), HelpText = ":i")
+
+        # Nom propre
+        self._addWidget("fl_M", 'FixedLine', nX1, nY3, 190, nHeight, Label = self.dUI.get("proper_name", "#err"), FontDescriptor = xFDSubTitle)
+        self.xMepi = self._addWidget('Mepi', 'RadioButton', nX1+65, nY3+12, 50, nHeight, Label = self.dUI.get("epi", "#err"), HelpText = ":e")
+        self.xMmas = self._addWidget('Mmas', 'RadioButton', nX1+65, nY3+22, 50, nHeight, Label = self.dUI.get("mas", "#err"), HelpText = ":m")
+        self.xMfem = self._addWidget('Mfem', 'RadioButton', nX1+65, nY3+32, 50, nHeight, Label = self.dUI.get("fem", "#err"), HelpText = ":f")
+
+        # Verbe
+        self._addWidget("fl_verb", 'FixedLine', nX2+30, nY4, 150, nHeight, FontDescriptor = xFDSubTitle)
+        self.xV_i = self._addWidget('v_i', 'CheckBox', nX2, nY4+12, 60, nHeight, Label = self.dUI.get("v_i", "#err"))
+        self.xV_t = self._addWidget('v_t', 'CheckBox', nX2, nY4+20, 60, nHeight, Label = self.dUI.get("v_t", "#err"))
+        self.xV_n = self._addWidget('v_n', 'CheckBox', nX2, nY4+28, 60, nHeight, Label = self.dUI.get("v_n", "#err"))
+        self.xV_p = self._addWidget('v_p', 'CheckBox', nX2, nY4+36, 60, nHeight, Label = self.dUI.get("v_p", "#err"))
+        self.xV_m = self._addWidget('v_m', 'CheckBox', nX2, nY4+44, 60, nHeight, Label = self.dUI.get("v_m", "#err"))
+
+        self._addWidget('aux', 'FixedText', nX2+75, nY4+10, 90, nHeight, Label = self.dUI.get("aux", "#err"))
+        self.xV_ae = self._addWidget('v_ae', 'CheckBox', nX2+75, nY4+20, 90, nHeight, Label = self.dUI.get("v_ae", "#err"))
+        self.xV_aa = self._addWidget('v_aa', 'CheckBox', nX2+75, nY4+28, 90, nHeight, Label = self.dUI.get("v_aa", "#err"))
+
+        self.xV_pp = self._addWidget('v_pp', 'CheckBox', nX2+75, nY4+44, 90, nHeight, Label = self.dUI.get("v_pp", "#err"))
+
+        self._addWidget('v_pattern_label', 'FixedText', nX2+10, nY4+56, 70, nHeight, Label = self.dUI.get('v_pattern', "#err"), Align = 2)
+        self.xVpattern = self._addWidget('v_pattern', 'Edit', nX2+85, nY4+56, 80, nHeight)
+
+        # Adverbe
+        self._addWidget("fl_adv", 'FixedLine', nX2+30, nY5, 150, nHeight, FontDescriptor = xFDSubTitle)
+
+        # Autre
+        self._addWidget("fl_other", 'FixedLine', nX2+30, nY6, 150, nHeight, FontDescriptor = xFDSubTitle)
+        self._addWidget('flexion_label', 'FixedText', nX2, nY6+10, 85, nHeight, Label = self.dUI.get('flexion', "#err"))
+        self.xFlexion = self._addWidget('flexion', 'Edit', nX2, nY6+20, 85, nHeight)
+        self._addWidget('tags_label', 'FixedText', nX2+90, nY6+10, 85, nHeight, Label = self.dUI.get('tags', "#err"))
+        self.xTags = self._addWidget('tags', 'Edit', nX2+90, nY6+20, 85, nHeight)
+
+        #### Generated words
+        self._addWidget("gwords_section", 'FixedLine', nXB, nY1, 200, nHeight, Label = self.dUI.get("new_section", "#err"), FontDescriptor = xFDTitle)
+        self.xGridModelNew = self._addGrid("list_grid_gwords", nXB, nY1+10, 200, 175, [
+            {"Title": self.dUI.get("lex_flex", "#err"), "ColumnWidth": 65},
+            {"Title": self.dUI.get("lex_lemma", "#err"), "ColumnWidth": 50},
+            {"Title": self.dUI.get("lex_tags", "#err"), "ColumnWidth": 65}
+        ], SelectionModel = uno.Enum("com.sun.star.view.SelectionType", "MULTI"))
+        self.xAdd = self._addWidget('add_button', 'Button', nXB, nY1+190, 95, 12, Label = self.dUI.get('add_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x005500, Enabled = False)
+        self.xDelete = self._addWidget('delete_button', 'Button', nXB+100, nY1+190, 100, 12, Label = self.dUI.get('delete_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x550000)
+
+        nY2b = nY1 + 205
+        # lexicon info section
+        self._addWidget("lexicon_info_section", 'FixedLine', nXB, nY2b, 200, nHeight, Label = self.dUI.get("lexicon_info_section", "#err"), FontDescriptor = xFDTitle)
+        self._addWidget("added_entries_label", 'FixedText', nXB, nY2b+10, 90, nHeight, Label = self.dUI.get("added_entries_label", "#err"))
+        self._addWidget("deleted_entries_label", 'FixedText', nXB, nY2b+20, 90, nHeight, Label = self.dUI.get("deleted_entries_label", "#err"))
+        self._addWidget("num_of_entries_label1", 'FixedText', nXB, nY2b+30, 90, nHeight, Label = self.dUI.get("num_of_entries_label", "#err"))
+        self.xNumAdded = self._addWidget("added_entries", 'FixedText', nXB+90, nY2b+10, 50, nHeight, Label = "0")
+        self.xNumDeleted = self._addWidget("deleted_entries", 'FixedText', nXB+90, nY2b+20, 50, nHeight, Label = "0")
+        self.xNumLex = self._addWidget("num_of_entries1", 'FixedText', nXB+90, nY2b+30, 50, nHeight, Label = "0")
+        self.xSave = self._addWidget('save_button', 'Button', nXB+150, nY2b+10, 50, 12, Label = self.dUI.get('save_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x005500)
+        # dictionary section
+        self._addWidget("dictionary_section", 'FixedLine', nXB, nY2b+45, 200, nHeight, Label = self.dUI.get("dictionary_section", "#err"), FontDescriptor = xFDTitle)
+        self._addWidget("save_date_label", 'FixedText', nXB, nY2b+55, 90, nHeight, Label = self.dUI.get("save_date_label", "#err"))
+        self._addWidget("num_of_entries_label2", 'FixedText', nXB, nY2b+65, 90, nHeight, Label = self.dUI.get("num_of_entries_label", "#err"))
+        self.xDateDic = self._addWidget("save_date", 'FixedText', nXB+90, nY2b+55, 50, nHeight, Label = "-")
+        self.xNumDic = self._addWidget("num_of_entries2", 'FixedText', nXB+90, nY2b+65, 50, nHeight, Label = "0")
+        #self.xExport = self._addWidget('export_button', 'Button', nXB+150, nY2b+55, 50, 12, Label = self.dUI.get('export_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x005500)
+
+        #### Lexicon section
+        self._addWidget("lexicon_section", 'FixedLine', nXC, nY1, 200, nHeight, Label = self.dUI.get("lexicon_section", "#err"), FontDescriptor = xFDTitle)
+        self.xGridModelLex = self._addGrid("list_grid_lexicon", nXC, nY1+10, 200, 270, [
+            {"Title": self.dUI.get("lex_flex", "#err"), "ColumnWidth": 65},
+            {"Title": self.dUI.get("lex_lemma", "#err"), "ColumnWidth": 50},
+            {"Title": self.dUI.get("lex_tags", "#err"), "ColumnWidth": 65}
+        ], SelectionModel = uno.Enum("com.sun.star.view.SelectionType", "MULTI"))
+
+        self.loadLexicon()
+
+        # container
+        self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx)
+        self.xContainer.setModel(self.xDialog)
+        self.xGridControlNew = self.xContainer.getControl('list_grid_gwords')
+        self.xGridControlLex = self.xContainer.getControl('list_grid_lexicon')
+        #helpers.xray(self.xContainer.getControl('lemma'))
+        self._createKeyListeners(['lemma', 'alt_lemma', "v_pattern", 'flexion', 'tags'], "Update")
+        self._createActionListeners(['nom_adj', 'nom', 'adj', 'M1', 'M2', 'MP', 'verb', 'adv', 'other', \
+                                     'Sepi', 'Smas', 'Sfem', 'Ss', 'Sx', 'Sinv', 'nom_adj2', 'nom2', 'adj2', \
+                                     'Sepi2', 'Smas2', 'Sfem2', 'Ss2', 'Sx2', 'Sinv2', 'Mepi', 'Mmas', 'Mfem', \
+                                     'v_i', 'v_t', 'v_n', 'v_p', 'v_m', 'v_ae', 'v_aa', 'v_pp'], "Update")
+        self.xContainer.getControl('add_button').addActionListener(self)
+        self.xContainer.getControl('add_button').setActionCommand('Add')
+        self.xContainer.getControl('delete_button').addActionListener(self)
+        self.xContainer.getControl('delete_button').setActionCommand('Delete')
+        self.xContainer.getControl('save_button').addActionListener(self)
+        self.xContainer.getControl('save_button').setActionCommand('Save')
+        self.xContainer.getControl('close_button').addActionListener(self)
+        self.xContainer.getControl('close_button').setActionCommand('Close')
+        self.xContainer.setVisible(False)
+        xToolkit = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.ExtToolkit', self.ctx)
+        self.xContainer.createPeer(xToolkit, None)
+        self.xContainer.execute()
+
+    def _createKeyListeners (self, lNames, sAction):
+        for sName in lNames:
+            self.xContainer.getControl(sName).addKeyListener(self)
+
+    def _createActionListeners (self, lNames, sAction):
+        for sName in lNames:
+            self.xContainer.getControl(sName).addActionListener(self)
+            self.xContainer.getControl(sName).setActionCommand(sAction)
+
+    # XActionListener
+    def actionPerformed (self, xActionEvent):
+        try:
+            if xActionEvent.ActionCommand == "Update":
+                self.updateGenWords()
+            elif xActionEvent.ActionCommand == "Add":
+                self.addToLexicon()
+            elif xActionEvent.ActionCommand == "Delete":
+                self.deleteSelectedEntries()
+            elif xActionEvent.ActionCommand == "Save":
+                self.saveLexicon()
+            elif xActionEvent.ActionCommand == "Import":
+                self.importDictionary()
+            elif xActionEvent.ActionCommand == "Export":
+                self.exportDictionary()
+            elif xActionEvent.ActionCommand == "Close":
+                self.xContainer.endExecute()
+        except:
+            traceback.print_exc()
+    
+    # XKeyListener
+    def keyPressed (self, xKeyEvent):
+        pass
+
+    def keyReleased (self, xKeyEvent):
+        self.updateGenWords()
+
+    # XJobExecutor
+    def trigger (self, args):
+        try:
+            xDialog = LexiconEditor(self.ctx)
+            xDialog.run()
+        except:
+            traceback.print_exc()
+
+    # Code
+    #@_waitPointer (don’t: strange behavior)
+    def loadLexicon (self):
+        xChild = self.xSettingNode.getByName("o_fr")
+        sJSON = xChild.getPropertyValue("personal_dic")
+        if sJSON != "":
+            oIBDAWG = ibdawg.IBDAWG(json.loads(sJSON))
+            xGridDataModel = self.xGridModelLex.GridDataModel
+            for i, sLine in enumerate(oIBDAWG.select()):
+                sFlexion, sLemma, sTag = sLine.split("\t")
+                xGridDataModel.addRow(i, (sFlexion, sLemma, sTag))
+            self.xNumAdded.Label = "0"
+            self.xNumDeleted.Label = "0"
+            self.xNumLex.Label = str(i)
+            self.xNumDic.Label = str(i)
+            self.xDateDic.Label = oIBDAWG.sDate
+
+    @_waitPointer
+    def saveLexicon (self):
+        xGridDataModel = self.xGridModelLex.GridDataModel
+        lEntry = []
+        for i in range(xGridDataModel.RowCount):
+            lEntry.append(xGridDataModel.getRowData(i))
+        oDAWG = dawg.DAWG(lEntry, "S", "fr", "Français", "Dictionnaire personnel")
+        oJSON = oDAWG.getBinaryAsJSON()
+        xChild = self.xSettingNode.getByName("o_fr")
+        xChild.setPropertyValue("personal_dic", json.dumps(oJSON, ensure_ascii=False))
+        self.xSettingNode.commitChanges()
+        self.xNumAdded.Label = "0"
+        self.xNumDeleted.Label = "0"
+        self.xNumLex.Label = str(oJSON["nEntry"])
+        self.xNumDic.Label = str(oJSON["nEntry"])
+        self.xDateDic.Label = oJSON["sDate"]
+
+    def _getRadioValue (self, *args):
+        for x in args:
+            if x.State:
+                return x.HelpText
+        return None
+
+    @_waitPointer
+    def updateGenWords (self):
+        self.lGeneratedFlex = []
+        sLemma = self.xLemma.Text.strip()
+        if sLemma:
+            if self._getRadioValue(self.xNA, self.xN, self.xA):
+                # Substantif
+                sPOS = self._getRadioValue(self.xNA, self.xN, self.xA)
+                sGenderTag = self._getRadioValue(self.xSepi, self.xSmas, self.xSfem)
+                if sGenderTag:
+                    if self.xSs.State:
+                        self.lGeneratedFlex.append((sLemma, sLemma, sPOS+sGenderTag+":s/*"))
+                        self.lGeneratedFlex.append((sLemma+"s", sLemma, sPOS+sGenderTag+":p/*"))
+                    elif self.xSx.State:
+                        self.lGeneratedFlex.append((sLemma, sLemma, sPOS+sGenderTag+":s/*"))
+                        self.lGeneratedFlex.append((sLemma+"x", sLemma, sPOS+sGenderTag+":p/*"))
+                    elif self.xSinv.State:
+                        self.lGeneratedFlex.append((sLemma, sLemma, sPOS+sGenderTag+":i/*"))
+                    sLemma2 = self.xAltLemma.Text.strip()
+                    if sLemma2 and self._getRadioValue(self.xNA2, self.xN2, self.xA2) and self._getRadioValue(self.xSepi2, self.xSmas2, self.xSfem2):
+                        sTag2 = self._getRadioValue(self.xNA2, self.xN2, self.xA2) + self._getRadioValue(self.xSepi2, self.xSmas2, self.xSfem2)
+                        if self.xSs2.State:
+                            self.lGeneratedFlex.append((sLemma2, sLemma, sTag2+":s/*"))
+                            self.lGeneratedFlex.append((sLemma2+"s", sLemma, sTag2+":p/*"))
+                        elif self.xSx2.State:
+                            self.lGeneratedFlex.append((sLemma2, sLemma, sTag2+":s/*"))
+                            self.lGeneratedFlex.append((sLemma2+"x", sLemma, sTag2+":p/*"))
+                        elif self.xSinv2.State:
+                            self.lGeneratedFlex.append((sLemma2, sLemma, sTag2+":i/*"))
+            elif self._getRadioValue(self.xM1, self.xM2, self.xMP):
+                # Nom propre
+                sPOS = self._getRadioValue(self.xM1, self.xM2, self.xMP)
+                sLemma = sLemma[0:1].upper() + sLemma[1:];
+                sGenderTag = self._getRadioValue(self.xMepi, self.xMmas, self.xMfem)
+                if sGenderTag:
+                    self.lGeneratedFlex.append((sLemma, sLemma, sPOS+sGenderTag+":i/*"))
+            elif self.xV.State:
+                # Verbe
+                if sLemma.endswith(("er", "ir", "re")):
+                    sLemma = sLemma.lower()
+                    c_i = "i"  if self.xV_i.State  else "_"
+                    c_t = "t"  if self.xV_t.State  else "_"
+                    c_n = "n"  if self.xV_n.State  else "_"
+                    c_p = "p"  if self.xV_p.State  else "_"
+                    c_m = "m"  if self.xV_m.State  else "_"
+                    c_ae = "e"  if self.xV_ae.State  else "_"
+                    c_aa = "a"  if self.xV_aa.State  else "_"
+                    sVerbTag = c_i + c_t + c_n + c_p + c_m + c_ae + c_aa
+                    if not sVerbTag.endswith("__") and not sVerbTag.startswith("____"):
+                        sVerbPattern = self.xVpattern.Text.strip()
+                        if not sVerbPattern:
+                            if sLemma.endswith("er") or sLemma.endswith("ir"):
+                                # tables de conjugaison du 1er et du 2e groupe
+                                cGroup = "1"  if sLemma.endswith("er")  else "2"
+                                for nCut, sAdd, sFlexTags, sPattern in self._getConjRules(sLemma):
+                                    if not sPattern or re.search(sPattern, sLemma):
+                                        self.lGeneratedFlex.append((sLemma[0:-nCut]+sAdd, sLemma, ":V" + cGroup + "_" + sVerbTag + sFlexTags))
+                                # participes passés
+                                bPpasVar = "var"  if self.xV_pp.State  else "invar"
+                                lPpasRules = lxe_conj_data.oConj["V1_ppas"][bPpasVar]  if sLemma.endswith("er")  else lxe_conj_data.oConj["V2_ppas"][bPpasVar]
+                                for nCut, sAdd, sFlexTags, sPattern in lPpasRules:
+                                    if not sPattern or re.search(sPattern, sLemma):
+                                        self.lGeneratedFlex.append((sLemma[0:-nCut]+sAdd, sLemma, ":V" + cGroup + "_" + sVerbTag + sFlexTags))
+                        else:
+                            # copie du motif d’un autre verbe : utilisation du conjugueur
+                            if conj.isVerb(sVerbPattern):
+                                oVerb = conj.Verb(sLemma, sVerbPattern)
+                                for sTag1, dFlex in oVerb.dConj.items():
+                                    if sTag1 != ":Q":
+                                        for sTag2, sConj in dFlex.items():
+                                            if sTag2.startswith(":") and sConj:
+                                                self.lGeneratedFlex.append((sConj, sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + sTag1 + sTag2))
+                                    else:
+                                        # participes passés
+                                        if dFlex[":Q3"]:
+                                            if dFlex[":Q2"]:
+                                                self.lGeneratedFlex.append((dFlex[":Q1"], sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:m:s/*"))
+                                                self.lGeneratedFlex.append((dFlex[":Q2"], sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:m:p/*"))
+                                            else:
+                                                self.lGeneratedFlex.append((dFlex[":Q1"], sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:m:i/*"))
+                                            self.lGeneratedFlex.append((dFlex[":Q3"], sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:f:s/*"))
+                                            self.lGeneratedFlex.append((dFlex[":Q4"], sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:f:p/*"))
+                                        else:
+                                            self.lGeneratedFlex.append((dFlex[":Q1"], sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:e:i/*"))
+            elif self.xW.State:
+                # Adverbe
+                sLemma = sLemma.lower();
+                self.lGeneratedFlex.append((sLemma, sLemma, ":W/*"))
+            elif self.xX.State:
+                # Autre
+                sFlexion = self.xFlexion.Text.strip()
+                sTags = self.xTags.Text.strip()
+                if sFlexion and sTags.startswith(":"):
+                    self.lGeneratedFlex.append((sFlexion, sLemma, sTags))
+        self._showGenWords()
+
+    def _getConjRules (self, sVerb):
+        if sVerb.endswith("ir"):
+            # deuxième groupe
+            return lxe_conj_data.oConj["V2"]
+        elif sVerb.endswith("er"):
+            # premier groupe, conjugaison en fonction de la terminaison du lemme
+            # 5 lettres
+            if sVerb[-5:] in lxe_conj_data.oConj["V1"]:
+                return lxe_conj_data.oConj["V1"][sVerb[-5:]]
+            # 4 lettres
+            if sVerb[-4:] in lxe_conj_data.oConj["V1"]:
+                if sVerb.endswith(("eler", "eter")):
+                    return lxe_conj_data.oConj["V1"][sVerb[-4:]]["1"]
+                return lxe_conj_data.oConj["V1"][sVerb[-4:]]
+            # 3 lettres
+            if sVerb[-3:] in lxe_conj_data.oConj["V1"]:
+                return lxe_conj_data.oConj["V1"][sVerb[-3:]]
+            return lxe_conj_data.oConj["V1"]["er"]
+        else:
+            # troisième groupe
+            return [ [0, "", ":Y/*", false] ]
+
+    def _showGenWords (self):
+        xGridDataModel = self.xGridModelNew.GridDataModel
+        xGridDataModel.removeAllRows()
+        if not self.lGeneratedFlex:
+            self.xAdd.Enabled = False
+            return
+        for i, (sFlexion, sLemma, sTag) in enumerate(self.lGeneratedFlex):
+            xGridDataModel.addRow(i, (sFlexion, sLemma, sTag))
+        self.xAdd.Enabled = True
+
+    def _resetWidgets (self):
+        self.xLemma.Text = ""
+        self.xNA.State = False
+        self.xN.State = False
+        self.xA.State = False
+        self.xM1.State = False
+        self.xM2.State = False
+        self.xMP.State = False
+        self.xV.State = False
+        self.xW.State = False
+        self.xX.State = False
+        self.xSepi.State = False
+        self.xSmas.State = False
+        self.xSfem.State = False
+        self.xSs.State = False
+        self.xSx.State = False
+        self.xSinv.State = False
+        self.xAltLemma.Text = ""
+        self.xNA2.State = False
+        self.xN2.State = False
+        self.xA2.State = False
+        self.xSepi2.State = False
+        self.xSmas2.State = False
+        self.xSfem2.State = False
+        self.xSs2.State = False
+        self.xSx2.State = False
+        self.xSinv2.State = False
+        self.xMepi.State = False
+        self.xMmas.State = False
+        self.xMfem.State = False
+        self.xV_i.State = False
+        self.xV_t.State = False
+        self.xV_n.State = False
+        self.xV_p.State = False
+        self.xV_m.State = False
+        self.xV_ae.State = False
+        self.xV_aa.State = False
+        self.xV_pp.State = False
+        self.xVpattern.Text = ""
+        self.xFlexion.Text = ""
+        self.xTags.Text = ""
+        self.xGridModelNew.GridDataModel.removeAllRows()
+
+    @_waitPointer
+    def addToLexicon (self):
+        self.xAdd.Enabled = False
+        xGridDataModelNew = self.xGridModelNew.GridDataModel
+        xGridDataModelLex = self.xGridModelLex.GridDataModel
+        nStart = xGridDataModelLex.RowCount
+        for i in range(xGridDataModelNew.RowCount):
+            sFlexion, sLemma, sTag = xGridDataModelNew.getRowData(i)
+            xGridDataModelLex.addRow(nStart + i, (sFlexion, sLemma, sTag))
+        self.xSave.Enabled = True
+        self.xNumAdded.Label = str(int(self.xNumAdded.Label) + xGridDataModelNew.RowCount)
+        self.xNumLex.Label = str(int(self.xNumLex.Label) + xGridDataModelNew.RowCount)
+        self._resetWidgets()
+
+    @_waitPointer
+    def deleteSelectedEntries (self):
+        # generated entries
+        xGridDataModel = self.xGridModelNew.GridDataModel
+        #helpers.xray(xGridDataModel)
+        for i in self.xGridControlNew.getSelectedRows():
+            if i < xGridDataModel.RowCount:
+                xGridDataModel.removeRow(i)
+        self.xGridControlNew.deselectAllRows()
+        # lexicon
+        xGridDataModel = self.xGridModelLex.GridDataModel
+        nSelectedEntries = len(self.xGridControlLex.getSelectedRows())
+        for i in self.xGridControlLex.getSelectedRows():
+            if i < xGridDataModel.RowCount:
+                xGridDataModel.removeRow(i)
+        self.xGridControlLex.deselectAllRows()
+        self.xNumDeleted.Label = str(int(self.xNumDeleted.Label) + nSelectedEntries)
+        self.xNumLex.Label = str(xGridDataModel.RowCount)
+
+    @_waitPointer
+    def importDictionary (self):
+        pass
+
+    @_waitPointer
+    def exportDictionary (self):
+        xFilePicker = self.xSvMgr.createInstanceWithContext('com.sun.star.ui.dialogs.SystemFilePicker', self.ctx)
+        xFilePicker.appendFilter("Supported files", "*.json; *.bdic")
+        #xFilePicker.setDisplayDirectory("")
+        #xFilePicker.setMultiSelectionMode(True)
+        nResult = xFilePicker.execute()
+        if nResult == 1:
+            pass
+            #lFile = xFilePicker.getSelectedFiles()
+            #lFile = xFilePicker.getFiles()
+
+
+#g_ImplementationHelper = unohelper.ImplementationHelper()
+#g_ImplementationHelper.addImplementation(LexiconEditor, 'net.grammalecte.LexiconEditor', ('com.sun.star.task.Job',))
ADDED   gc_lang/fr/oxt/DictOptions/do_strings.py
Index: gc_lang/fr/oxt/DictOptions/do_strings.py
==================================================================
--- /dev/null
+++ gc_lang/fr/oxt/DictOptions/do_strings.py
@@ -0,0 +1,43 @@
+def getUI (sLang):
+    if sLang in dStrings:
+        return dStrings[sLang]
+    return dStrings["fr"]
+
+dStrings = {
+    "fr": {
+        "title": "Grammalecte · Options des dictionnaires",
+        
+        "spelling_section": "Correcteur orthographique",
+        "activate_main": "Activer le correcteur orthographique de Grammalecte",
+        "activate_main_descr": "Supplante le correcteur orthographique inclus dans LibreOffice (Hunspell).",
+
+        "suggestion_section": "Moteur de suggestion orthographique",
+        "activate_spell_sugg": "Activer le moteur de suggestion de Grammalecte",
+        "activate_spell_sugg_descr": "Désactivée, cette option remplace la suggestion orthographique de Grammalecte par celle fournie par LibreOffice (Hunspell). Les mots inclus dans le dictionnaire personnalisé ne seront plus inclus aux suggestions.",
+
+        "personal_section": "Dictionnaire personnel",
+        "activate_personal": "Utiliser",
+        "activate_personal_descr": "Le dictionnaire personnel est une commodité pour ajouter le vocabulaire qui vous est utile. Il ne supplante pas le dictionnaire commun ; il ne fait qu’ajouter de nouveaux mots.",
+
+        "apply_button": "Appliquer",
+        "cancel_button": "Annuler",
+    },
+    "en": {
+        "title": "Grammalecte · Options for dictionaries",
+        
+        "spelling_section": "Spell checker",
+        "activate_main": "Activate the spell checker from Grammalecte",
+        "activate_main_descr": "Overrides the spell checker included in LibreOffice (Hunspell)",
+
+        "suggestion_section": "Spell suggestion engine",
+        "activate_spell_sugg": "Activate the suggestion engine of Grammalecte",
+        "activate_spell_sugg_descr": "Disactivated, this option replace the spell suggestion engine of Grammalecte by the one of LibreOffice (Hunspell). Words included in the personal dictionary won’t be included among suggestions.",
+
+        "personal_section": "Personal dictionary",
+        "activate_personal": "Use",
+        "activate_personal_descr": "The personal dictionary is a commodity to add the vocabulary you want. It doesn’t override the common dictionary ; it only adds new words.",
+
+        "apply_button": "Apply",
+        "cancel_button": "Cancel",
+    },
+}
ADDED   gc_lang/fr/oxt/DictOptions/lxe_conj_data.py
Index: gc_lang/fr/oxt/DictOptions/lxe_conj_data.py
==================================================================
--- /dev/null
+++ gc_lang/fr/oxt/DictOptions/lxe_conj_data.py
@@ -0,0 +1,1948 @@
+# Conjugation data
+
+# beta stage, unfinished, may be useless or the root for a new way to generate flexions…
+
+# Règles de conjugaison
+
+oConj = {
+    "V1_ppas": {
+        "var": [
+            [2,     "é",           ":Q:A:1ŝ:m:s/*",     False],
+            [2,     "és",          ":Q:A:m:p/*",        False],
+            [2,     "ée",          ":Q:A:f:s/*",        False],
+            [2,     "ées",         ":Q:A:f:p/*",        False],
+        ],
+        "invar": [
+            [2,     "é",           ":Q:e:i/*",          False],
+        ]
+    },
+
+    "V2_ppas": {
+        "var": [
+            [2,     "i",           ":Q:A:m:s/*",        False],
+            [2,     "is",          ":Q:A:m:p/*",        False],
+            [2,     "ie",          ":Q:A:f:s/*",        False],
+            [2,     "ies",         ":Q:A:f:p/*",        False],
+        ],
+        "invar": [
+            [2,     "i",           ":Q:e:i/*",          False],
+        ]
+    },
+
+    # deuxième groupe (le seul groupe régulier)
+    "V2": [
+        [2,     "ir",           ":Y/*",             False],
+        [2,     "issant",       ":P/*",             False],
+        [2,     "is",           ":Ip:Is:1s:2s/*",   False],
+        [2,     "it",           ":Ip:Is:3s/*",      False],
+        [2,     "issons",       ":Ip:1p/*",         False],
+        [2,     "issez",        ":Ip:2p/*",         False],
+        [2,     "issent",       ":Ip:Sp:Sq:3p/*",   False],
+        [2,     "issais",       ":Iq:1s:2s/*",      False],
+        [2,     "issait",       ":Iq:3s/*",         False],
+        [2,     "issions",      ":Iq:Sp:Sq:1p/*",   False],
+        [2,     "issiez",       ":Iq:Sp:Sq:2p/*",   False],
+        [2,     "issaient",     ":Iq:3p/*",         False],
+        [2,     "îmes",         ":Is:1p/*",         False],
+        [2,     "îtes",         ":Is:2p/*",         False],
+        [2,     "irent",        ":Is:3p!/*",        False],
+        [2,     "irai",         ":If:1s/*",         False],
+        [2,     "iras",         ":If:2s/*",         False],
+        [2,     "ira",          ":If:3s/*",         False],
+        [2,     "irons",        ":If:1p/*",         False],
+        [2,     "irez",         ":If:2p/*",         False],
+        [2,     "iront",        ":If:3p!/*",        False],
+        [2,     "irais",        ":K:1s:2s/*",       False],
+        [2,     "irait",        ":K:3s/*",          False],
+        [2,     "irions",       ":K:1p/*",          False],
+        [2,     "iriez",        ":K:2p/*",          False],
+        [2,     "iraient",      ":K:3p/*",          False],
+        [2,     "isse",         ":Sp:Sq:1s/*",      False],
+        [2,     "isses",        ":Sp:Sq:2s/*",      False],
+        [2,     "isse",         ":Sp:3s/*",         False],
+        [2,     "ît",           ":Sq:3s/*",         False],
+        [2,     "is",           ":E:2s/*",          False],
+        [2,     "issons",       ":E:1p/*",          False],
+        [2,     "issez",        ":E:2p/*",          False]
+    ],
+    
+    # premier groupe (bien plus irrégulier que prétendu)
+    "V1": {
+        # a
+        # verbes en -er, -ger, -yer, -cer
+        "er": [
+            [2,      "er",        ":Y/*",               False],
+            [2,      "ant",       ":P/*",               False],
+            [2,      "e",         ":Ip:Sp:1s:3s/*",     False],
+            [2,      "è",         ":Ip:1ś/*",           False],
+            [2,      "es",        ":Ip:Sp:2s/*",        False],
+            [2,      "ons",       ":Ip:1p/*",           False],
+            [2,      "ez",        ":Ip:2p/*",           False],
+            [2,      "ent",       ":Ip:Sp:3p/*",        False],
+            [2,      "ais",       ":Iq:1s:2s/*",        False],
+            [2,      "ait",       ":Iq:3s/*",           False],
+            [2,      "ions",      ":Iq:Sp:1p/*",        False],
+            [2,      "iez",       ":Iq:Sp:2p/*",        False],
+            [2,      "aient",     ":Iq:3p/*",           False],
+            [2,      "ai",        ":Is:1s/*",           False],
+            [2,      "as",        ":Is:2s/*",           False],
+            [2,      "a",         ":Is:3s/*",           False],
+            [2,      "âmes",      ":Is:1p/*",           False],
+            [2,      "âtes",      ":Is:2p/*",           False],
+            [2,      "èrent",     ":Is:3p!/*",          False],
+            [2,      "erai",      ":If:1s/*",           False],
+            [2,      "eras",      ":If:2s/*",           False],
+            [2,      "era",       ":If:3s/*",           False],
+            [2,      "erons",     ":If:1p/*",           False],
+            [2,      "erez",      ":If:2p/*",           False],
+            [2,      "eront",     ":If:3p!/*",          False],
+            [2,      "erais",     ":K:1s:2s/*",         False],
+            [2,      "erait",     ":K:3s/*",            False],
+            [2,      "erions",    ":K:1p/*",            False],
+            [2,      "eriez",     ":K:2p/*",            False],
+            [2,      "eraient",   ":K:3p/*",            False],
+            [2,      "asse",      ":Sq:1s/*",           False],
+            [2,      "asses",     ":Sq:2s/*",           False],
+            [2,      "ât",        ":Sq:3s/*",           False],
+            [2,      "assions",   ":Sq:1p/*",           False],
+            [2,      "assiez",    ":Sq:2p/*",           False],
+            [2,      "assent",    ":Sq:3p/*",           False],
+            [2,      "e",         ":E:2s/*",            False],
+            [2,      "ons",       ":E:1p/*",            False],
+            [2,      "ez",        ":E:2p/*",            False]
+        ],
+
+        "ger": [
+            [2,      "er",        ":Y/*",               False],
+            [2,      "eant",      ":P/*",               False],
+            [2,      "e",         ":Ip:Sp:1s:3s/*",     False],
+            [2,      "è",         ":Ip:1ś/*",           False],
+            [2,      "es",        ":Ip:Sp:2s/*",        False],
+            [2,      "eons",      ":Ip:1p/*",           False],
+            [2,      "ez",        ":Ip:2p/*",           False],
+            [2,      "ent",       ":Ip:Sp:3p/*",        False],
+            [2,      "eais",      ":Iq:1s:2s/*",        False],
+            [2,      "eait",      ":Iq:3s/*",           False],
+            [2,      "ions",      ":Iq:Sp:1p/*",        False],
+            [2,      "iez",       ":Iq:Sp:2p/*",        False],
+            [2,      "eaient",    ":Iq:3p/*",           False],
+            [2,      "eai",       ":Is:1s/*",           False],
+            [2,      "eas",       ":Is:2s/*",           False],
+            [2,      "ea",        ":Is:3s/*",           False],
+            [2,      "eâmes",     ":Is:1p/*",           False],
+            [2,      "eâtes",     ":Is:2p/*",           False],
+            [2,      "èrent",     ":Is:3p!/*",          False],
+            [2,      "erai",      ":If:1s/*",           False],
+            [2,      "eras",      ":If:2s/*",           False],
+            [2,      "era",       ":If:3s/*",           False],
+            [2,      "erons",     ":If:1p/*",           False],
+            [2,      "erez",      ":If:2p/*",           False],
+            [2,      "eront",     ":If:3p!/*",          False],
+            [2,      "erais",     ":K:1s:2s/*",         False],
+            [2,      "erait",     ":K:3s/*",            False],
+            [2,      "erions",    ":K:1p/*",            False],
+            [2,      "eriez",     ":K:2p/*",            False],
+            [2,      "eraient",   ":K:3p/*",            False],
+            [2,      "easse",     ":Sq:1s/*",           False],
+            [2,      "easses",    ":Sq:2s/*",           False],
+            [2,      "eât",       ":Sq:3s/*",           False],
+            [2,      "eassions",  ":Sq:1p/*",           False],
+            [2,      "eassiez",   ":Sq:2p/*",           False],
+            [2,      "eassent",   ":Sq:3p/*",           False],
+            [2,      "e",         ":E:2s/*",            False],
+            [2,      "eons",      ":E:1p/*",            False],
+            [2,      "ez",        ":E:2p/*",            False]
+        ],
+
+        "cer": [
+            [2,      "er",        ":Y/*",               False],
+            [3,      "çant",      ":P/*",               False],
+            [2,      "e",         ":Ip:Sp:1s:3s/*",     False],
+            [2,      "è",         ":Ip:1ś/*",           False],
+            [2,      "es",        ":Ip:Sp:2s/*",        False],
+            [3,      "çons",      ":Ip:1p/*",           False],
+            [2,      "ez",        ":Ip:2p/*",           False],
+            [2,      "ent",       ":Ip:Sp:3p/*",        False],
+            [3,      "çais",      ":Iq:1s:2s/*",        False],
+            [3,      "çait",      ":Iq:3s/*",           False],
+            [2,      "ions",      ":Iq:Sp:1p/*",        False],
+            [2,      "iez",       ":Iq:Sp:2p/*",        False],
+            [3,      "çaient",    ":Iq:3p/*",           False],
+            [3,      "çai",       ":Is:1s/*",           False],
+            [3,      "ças",       ":Is:2s/*",           False],
+            [3,      "ça",        ":Is:3s/*",           False],
+            [3,      "çâmes",     ":Is:1p/*",           False],
+            [3,      "çâtes",     ":Is:2p/*",           False],
+            [2,      "èrent",     ":Is:3p!/*",          False],
+            [2,      "erai",      ":If:1s/*",           False],
+            [2,      "eras",      ":If:2s/*",           False],
+            [2,      "era",       ":If:3s/*",           False],
+            [2,      "erons",     ":If:1p/*",           False],
+            [2,      "erez",      ":If:2p/*",           False],
+            [2,      "eront",     ":If:3p!/*",          False],
+            [2,      "erais",     ":K:1s:2s/*",         False],
+            [2,      "erait",     ":K:3s/*",            False],
+            [2,      "erions",    ":K:1p/*",            False],
+            [2,      "eriez",     ":K:2p/*",            False],
+            [2,      "eraient",   ":K:3p/*",            False],
+            [3,      "çasse",     ":Sq:1s/*",           False],
+            [3,      "çasses",    ":Sq:2s/*",           False],
+            [3,      "çât",       ":Sq:3s/*",           False],
+            [3,      "çassions",  ":Sq:1p/*",           False],
+            [3,      "çassiez",   ":Sq:2p/*",           False],
+            [3,      "çassent",   ":Sq:3p/*",           False],
+            [2,      "e",         ":E:2s/*",            False],
+            [3,      "çons",      ":E:1p/*",            False],
+            [2,      "ez",        ":E:2p/*",            False]
+        ],
+
+        "yer": [
+            [2,     "er",         ":Y/*",               False],
+            [2,     "ant",        ":P/*",               False],
+            [3,     "ye",         ":Ip:Sp:1s:3s/*",     "[^ou]yer$"],
+            [3,     "ie",         ":Ip:Sp:1s:3s/*",     "[aou]yer$"],
+            [2,     "è",          ":Ip:1ś/*",           False],
+            [3,     "yes",        ":Ip:Sp:2s/*",        "[^ou]yer$"],
+            [3,     "ies",        ":Ip:Sp:2s/*",        "[aou]yer$"],
+            [2,     "ons",        ":Ip:1p/*",           False],
+            [2,     "ez",         ":Ip:2p/*",           False],
+            [3,     "yent",       ":Ip:Sp:3p/*",        "[^ou]yer$"],
+            [3,     "ient",       ":Ip:Sp:3p/*",        "[aou]yer$"],
+            [2,     "ais",        ":Iq:1s:2s/*",        False],
+            [2,     "ait",        ":Iq:3s/*",           False],
+            [2,     "ions",       ":Iq:Sp:1p/*",        False],
+            [2,     "iez",        ":Iq:Sp:2p/*",        False],
+            [2,     "aient",      ":Iq:3p/*",           False],
+            [2,     "ai",         ":Is:1s/*",           False],
+            [2,     "as",         ":Is:2s/*",           False],
+            [2,     "a",          ":Is:3s/*",           False],
+            [2,     "âmes",       ":Is:1p/*",           False],
+            [2,     "âtes",       ":Is:2p/*",           False],
+            [2,     "èrent",      ":Is:3p!/*",          False],
+            [3,     "yerai",      ":If:1s/*",           "[^ou]yer$"],
+            [3,     "ierai",      ":If:1s/*",           "[aou]yer$"],
+            [3,     "yeras",      ":If:2s/*",           "[^ou]yer$"],
+            [3,     "ieras",      ":If:2s/*",           "[aou]yer$"],
+            [3,     "yera",       ":If:3s/*",           "[^ou]yer$"],
+            [3,     "iera",       ":If:3s/*",           "[aou]yer$"],
+            [3,     "yerons",     ":If:1p/*",           "[^ou]yer$"],
+            [3,     "ierons",     ":If:1p/*",           "[aou]yer$"],
+            [3,     "yerez",      ":If:2p/*",           "[^ou]yer$"],
+            [3,     "ierez",      ":If:2p/*",           "[aou]yer$"],
+            [3,     "yeront",     ":If:3p!/*",          "[^ou]yer$"],
+            [3,     "ieront",     ":If:3p!/*",          "[aou]yer$"],
+            [3,     "yerais",     ":K:1s:2s/*",         "[^ou]yer$"],
+            [3,     "ierais",     ":K:1s:2s/*",         "[aou]yer$"],
+            [3,     "yerait",     ":K:3s/*",            "[^ou]yer$"],
+            [3,     "ierait",     ":K:3s/*",            "[aou]yer$"],
+            [3,     "yerions",    ":K:1p/*",            "[^ou]yer$"],
+            [3,     "ierions",    ":K:1p/*",            "[aou]yer$"],
+            [3,     "yeriez",     ":K:2p/*",            "[^ou]yer$"],
+            [3,     "ieriez",     ":K:2p/*",            "[aou]yer$"],
+            [3,     "yeraient",   ":K:3p/*",            "[^ou]yer$"],
+            [3,     "ieraient",   ":K:3p/*",            "[aou]yer$"],
+            [2,     "asse",       ":Sq:1s/*",           False],
+            [2,     "asses",      ":Sq:2s/*",           False],
+            [2,     "ât",         ":Sq:3s/*",           False],
+            [2,     "assions",    ":Sq:1p/*",           False],
+            [2,     "assiez",     ":Sq:2p/*",           False],
+            [2,     "assent",     ":Sq:3p/*",           False],
+            [3,     "ye",         ":E:2s/*",            "[^ou]yer$"],
+            [3,     "ie",         ":E:2s/*",            "[aou]yer$"],
+            [2,     "ons",        ":E:1p/*",            False],
+            [2,     "ez",         ":E:2p/*",            False]
+        ],
+
+        # b
+        # verbes en -ecer, -emer, -ener, -eper, -erer, -eser, -ever, -evrer
+        # verbes en -eler, -eter (pas de doublement de la consonne: acheter, celer, déceler, receler, ciseler, démanteler,
+        # écarteler, encasteler, geler, dégeler, congeler, surgeler, marteler, modeler, peler, acheter, racheter,
+        # bégueter, corseter, crocheter, fileter, fureter, haleter)
+        # changement du e en è avant syllabe muette
+        "ecer": [
+            [2,     "er",           ":Y/*",                 False],
+            [3,     "çant",         ":P/*",                 False],
+            [4,     "èce",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "èces",         ":Ip:Sp:2s/*",          False],
+            [3,     "çons",         ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "ècent",        ":Ip:Sp:3p/*",          False],
+            [3,     "çais",         ":Iq:1s:2s/*",          False],
+            [3,     "çait",         ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [3,     "çaient",       ":Iq:3p/*",             False],
+            [3,     "çai",          ":Is:1s/*",             False],
+            [3,     "ças",          ":Is:2s/*",             False],
+            [3,     "ça",           ":Is:3s/*",             False],
+            [3,     "çâmes",        ":Is:1p/*",             False],
+            [3,     "çâtes",        ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [4,     "ècerai",       ":If:1s/*",             False],
+            [4,     "èceras",       ":If:2s/*",             False],
+            [4,     "ècera",        ":If:3s/*",             False],
+            [4,     "ècerons",      ":If:1p/*",             False],
+            [4,     "ècerez",       ":If:2p/*",             False],
+            [4,     "èceront",      ":If:3p!/*",            False],
+            [4,     "ècerais",      ":K:1s:2s/*",           False],
+            [4,     "ècerait",      ":K:3s/*",              False],
+            [4,     "ècerions",     ":K:1p/*",              False],
+            [4,     "èceriez",      ":K:2p/*",              False],
+            [4,     "èceraient",    ":K:3p/*",              False],
+            [3,     "çasse",        ":Sq:1s/*",             False],
+            [3,     "çasses",       ":Sq:2s/*",             False],
+            [3,     "çât",          ":Sq:3s/*",             False],
+            [3,     "çassions",     ":Sq:1p/*",             False],
+            [3,     "çassiez",      ":Sq:2p/*",             False],
+            [3,     "çassent",      ":Sq:3p/*",             False],
+            [4,     "èce",          ":E:2s/*",              False],
+            [3,     "çons",         ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "eler": {
+            "1": [
+                [2,     "er",           ":Y/*",             False],
+                [2,     "ant",          ":P/*",             False],
+                [4,     "èle",          ":Ip:Sp:1s:3s/*",   False],
+                [2,     "è",            ":Ip:1ś/R",         False],
+                [4,     "èles",         ":Ip:Sp:2s/*",      False],
+                [2,     "ons",          ":Ip:1p/*",         False],
+                [2,     "ez",           ":Ip:2p/*",         False],
+                [4,     "èlent",        ":Ip:Sp:3p/*",      False],
+                [2,     "ais",          ":Iq:1s:2s/*",      False],
+                [2,     "ait",          ":Iq:3s/*",         False],
+                [2,     "ions",         ":Iq:Sp:1p/*",      False],
+                [2,     "iez",          ":Iq:Sp:2p/*",      False],
+                [2,     "aient",        ":Iq:3p/*",         False],
+                [2,     "ai",           ":Is:1s/*",         False],
+                [2,     "as",           ":Is:2s/*",         False],
+                [2,     "a",            ":Is:3s/*",         False],
+                [2,     "âmes",         ":Is:1p/*",         False],
+                [2,     "âtes",         ":Is:2p/*",         False],
+                [2,     "èrent",        ":Is:3p!/*",        False],
+                [4,     "èlerai",       ":If:1s/*",         False],
+                [4,     "èleras",       ":If:2s/*",         False],
+                [4,     "èlera",        ":If:3s/*",         False],
+                [4,     "èlerons",      ":If:1p/*",         False],
+                [4,     "èlerez",       ":If:2p/*",         False],
+                [4,     "èleront",      ":If:3p!/*",        False],
+                [4,     "èlerais",      ":K:1s:2s/*",       False],
+                [4,     "èlerait",      ":K:3s/*",          False],
+                [4,     "èlerions",     ":K:1p/*",          False],
+                [4,     "èleriez",      ":K:2p/*",          False],
+                [4,     "èleraient",    ":K:3p/*",          False],
+                [2,     "asse",         ":Sq:1s/*",         False],
+                [2,     "asses",        ":Sq:2s/*",         False],
+                [2,     "ât",           ":Sq:3s/*",         False],
+                [2,     "assions",      ":Sq:1p/*",         False],
+                [2,     "assiez",       ":Sq:2p/*",         False],
+                [2,     "assent",       ":Sq:3p/*",         False],
+                [4,     "èle",          ":E:2s/*",          False],
+                [2,     "ons",          ":E:1p/*",          False],
+                [2,     "ez",           ":E:2p/*",          False]
+            ],
+            "2": [
+                # d. verbes en -eler : doublement de la consonne l.
+                [2,     "er",           ":Y/*",             False],
+                [2,     "ant",          ":P/*",             False],
+                [4,     "elle",         ":Ip:Sp:1s:3s/*",   "ppeler$"],
+                [4,     "elle",         ":Ip:Sp:1s:3s/M",   "[^p].eler$"],
+                [4,     "èle",          ":Ip:Sp:1s:3s/R",   "[^p].eler$"],
+                [2,     "è",            ":Ip:1ś/R",         False],
+                [4,     "elles",        ":Ip:Sp:2s/*",      "ppeler$"],
+                [4,     "elles",        ":Ip:Sp:2s/M",      "[^p].eler$"],
+                [4,     "èles",         ":Ip:Sp:2s/R",      "[^p].eler$"],
+                [2,     "ons",          ":Ip:1p/*",         False],
+                [2,     "ez",           ":Ip:2p/*",         False],
+                [4,     "ellent",       ":Ip:Sp:3p/*",      "ppeler$"],
+                [4,     "ellent",       ":Ip:Sp:3p/M",      "[^p].eler$"],
+                [4,     "èlent",        ":Ip:Sp:3p/R",      "[^p].eler$"],
+                [2,     "ais",          ":Iq:1s:2s/*",      False],
+                [2,     "ait",          ":Iq:3s/*",         False],
+                [2,     "ions",         ":Iq:Sp:1p/*",      False],
+                [2,     "iez",          ":Iq:Sp:2p/*",      False],
+                [2,     "aient",        ":Iq:3p/*",         False],
+                [2,     "ai",           ":Is:1s/*",         False],
+                [2,     "as",           ":Is:2s/*",         False],
+                [2,     "a",            ":Is:3s/*",         False],
+                [2,     "âmes",         ":Is:1p/*",         False],
+                [2,     "âtes",         ":Is:2p/*",         False],
+                [2,     "èrent",        ":Is:3p!/*",        False],
+                [4,     "ellerai",      ":If:1s/*",         "ppeler$"],
+                [4,     "ellerai",      ":If:1s/M",         "[^p].eler$"],
+                [4,     "èlerai",       ":If:1s/R",         "[^p].eler$"],
+                [4,     "elleras",      ":If:2s/*",         "ppeler$"],
+                [4,     "elleras",      ":If:2s/M",         "[^p].eler$"],
+                [4,     "èleras",       ":If:2s/R",         "[^p].eler$"],
+                [4,     "ellera",       ":If:3s/*",         "ppeler$"],
+                [4,     "ellera",       ":If:3s/M",         "[^p].eler$"],
+                [4,     "èlera",        ":If:3s/R",         "[^p].eler$"],
+                [4,     "ellerons",     ":If:1p/*",         "ppeler$"],
+                [4,     "ellerons",     ":If:1p/M",         "[^p].eler$"],
+                [4,     "èlerons",      ":If:1p/R",         "[^p].eler$"],
+                [4,     "ellerez",      ":If:2p/*",         "ppeler$"],
+                [4,     "ellerez",      ":If:2p/M",         "[^p].eler$"],
+                [4,     "èlerez",       ":If:2p/R",         "[^p].eler$"],
+                [4,     "elleront",     ":If:3p!/*",        "ppeler$"],
+                [4,     "elleront",     ":If:3p!/M",        "[^p].eler$"],
+                [4,     "èleront",      ":If:3p!/R",        "[^p].eler$"],
+                [4,     "ellerais",     ":K:1s:2s/*",       "ppeler$"],
+                [4,     "ellerais",     ":K:1s:2s/M",       "[^p].eler$"],
+                [4,     "èlerais",      ":K:1s:2s/R",       "[^p].eler$"],
+                [4,     "ellerait",     ":K:3s/*",          "ppeler$"],
+                [4,     "ellerait",     ":K:3s/M",          "[^p].eler$"],
+                [4,     "èlerait",      ":K:3s/R",          "[^p].eler$"],
+                [4,     "ellerions",    ":K:1p/*",          "ppeler$"],
+                [4,     "ellerions",    ":K:1p/M",          "[^p].eler$"],
+                [4,     "èlerions",     ":K:1p/R",          "[^p].eler$"],
+                [4,     "elleriez",     ":K:2p/*",          "ppeler$"],
+                [4,     "elleriez",     ":K:2p/M",          "[^p].eler$"],
+                [4,     "èleriez",      ":K:2p/R",          "[^p].eler$"],
+                [4,     "elleraient",   ":K:3p/*",          "ppeler$"],
+                [4,     "elleraient",   ":K:3p/M",          "[^p].eler$"],
+                [4,     "èleraient",    ":K:3p/R",          "[^p].eler$"],
+                [2,     "asse",         ":Sq:1s/*",         False],
+                [2,     "asses",        ":Sq:2s/*",         False],
+                [2,     "ât",           ":Sq:3s/*",         False],
+                [2,     "assions",      ":Sq:1p/*",         False],
+                [2,     "assiez",       ":Sq:2p/*",         False],
+                [2,     "assent",       ":Sq:3p/*",         False],
+                [4,     "elle",         ":E:2s/*",          "ppeler$"],
+                [4,     "elle",         ":E:2s/M",          "[^p].eler$"],
+                [4,     "èle",          ":E:2s/R",          "[^p].eler$"],
+                [2,     "ons",          ":E:1p/*",          False],
+                [2,     "ez",           ":E:2p/*",          False]
+            ],
+        },
+
+        "emer": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [4,     "ème",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "èmes",         ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "èment",        ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [4,     "èmerai",       ":If:1s/*",             False],
+            [4,     "èmeras",       ":If:2s/*",             False],
+            [4,     "èmera",        ":If:3s/*",             False],
+            [4,     "èmerons",      ":If:1p/*",             False],
+            [4,     "èmerez",       ":If:2p/*",             False],
+            [4,     "èmeront",      ":If:3p!/*",            False],
+            [4,     "èmerais",      ":K:1s:2s/*",           False],
+            [4,     "èmerait",      ":K:3s/*",              False],
+            [4,     "èmerions",     ":K:1p/*",              False],
+            [4,     "èmeriez",      ":K:2p/*",              False],
+            [4,     "èmeraient",    ":K:3p/*",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [4,     "ème",          ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "ener": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [4,     "ène",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "ènes",         ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "ènent",        ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [4,     "ènerai",       ":If:1s/*",             False],
+            [4,     "èneras",       ":If:2s/*",             False],
+            [4,     "ènera",        ":If:3s/*",             False],
+            [4,     "ènerons",      ":If:1p/*",             False],
+            [4,     "ènerez",       ":If:2p/*",             False],
+            [4,     "èneront",      ":If:3p!/*",            False],
+            [4,     "ènerais",      ":K:1s:2s/*",           False],
+            [4,     "ènerait",      ":K:3s/*",              False],
+            [4,     "ènerions",     ":K:1p/*",              False],
+            [4,     "èneriez",      ":K:2p/*",              False],
+            [4,     "èneraient",    ":K:3p/*",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [4,     "ène",          ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "eper": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [4,     "èpe",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "èpes",         ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "èpent",        ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [4,     "èperai",       ":If:1s/*",             False],
+            [4,     "èperas",       ":If:2s/*",             False],
+            [4,     "èpera",        ":If:3s/*",             False],
+            [4,     "èperons",      ":If:1p/*",             False],
+            [4,     "èperez",       ":If:2p/*",             False],
+            [4,     "èperont",      ":If:3p!/*",            False],
+            [4,     "èperais",      ":K:1s:2s/*",           False],
+            [4,     "èperait",      ":K:3s/*",              False],
+            [4,     "èperions",     ":K:1p/*",              False],
+            [4,     "èperiez",      ":K:2p/*",              False],
+            [4,     "èperaient",    ":K:3p/*",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [4,     "èpe",          ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "erer": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [4,     "ère",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "ères",         ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "èrent",        ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [4,     "èrerai",       ":If:1s/*",             False],
+            [4,     "èreras",       ":If:2s/*",             False],
+            [4,     "èrera",        ":If:3s/*",             False],
+            [4,     "èrerons",      ":If:1p/*",             False],
+            [4,     "èrerez",       ":If:2p/*",             False],
+            [4,     "èreront",      ":If:3p!/*",            False],
+            [4,     "èrerais",      ":K:1s:2s/*",           False],
+            [4,     "èrerait",      ":K:3s/*",              False],
+            [4,     "èrerions",     ":K:1p/*",              False],
+            [4,     "èreriez",      ":K:2p/*",              False],
+            [4,     "èreraient",    ":K:3p/*",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [4,     "ère",          ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "eser": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [4,     "èse",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "èses",         ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "èsent",        ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [4,     "èserai",       ":If:1s/*",             False],
+            [4,     "èseras",       ":If:2s/*",             False],
+            [4,     "èsera",        ":If:3s/*",             False],
+            [4,     "èserons",      ":If:1p/*",             False],
+            [4,     "èserez",       ":If:2p/*",             False],
+            [4,     "èseront",      ":If:3p!/*",            False],
+            [4,     "èserais",      ":K:1s:2s/*",           False],
+            [4,     "èserait",      ":K:3s/*",              False],
+            [4,     "èserions",     ":K:1p/*",              False],
+            [4,     "èseriez",      ":K:2p/*",              False],
+            [4,     "èseraient",    ":K:3p/*",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [4,     "èse",          ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "eter": {
+            "1": [
+                [2,     "er",           ":Y/*",                 False],
+                [2,     "ant",          ":P/*",                 False],
+                [4,     "ète",          ":Ip:Sp:1s:3s/*",       False],
+                [2,     "è",            ":Ip:1ś/R",             False],
+                [4,     "ètes",         ":Ip:Sp:2s/*",          False],
+                [2,     "ons",          ":Ip:1p/*",             False],
+                [2,     "ez",           ":Ip:2p/*",             False],
+                [4,     "ètent",        ":Ip:Sp:3p/*",          False],
+                [2,     "ais",          ":Iq:1s:2s/*",          False],
+                [2,     "ait",          ":Iq:3s/*",             False],
+                [2,     "ions",         ":Iq:Sp:1p/*",          False],
+                [2,     "iez",          ":Iq:Sp:2p/*",          False],
+                [2,     "aient",        ":Iq:3p/*",             False],
+                [2,     "ai",           ":Is:1s/*",             False],
+                [2,     "as",           ":Is:2s/*",             False],
+                [2,     "a",            ":Is:3s/*",             False],
+                [2,     "âmes",         ":Is:1p/*",             False],
+                [2,     "âtes",         ":Is:2p/*",             False],
+                [2,     "èrent",        ":Is:3p!/*",            False],
+                [4,     "èterai",       ":If:1s/*",             False],
+                [4,     "èteras",       ":If:2s/*",             False],
+                [4,     "ètera",        ":If:3s/*",             False],
+                [4,     "èterons",      ":If:1p/*",             False],
+                [4,     "èterez",       ":If:2p/*",             False],
+                [4,     "èteront",      ":If:3p!/*",            False],
+                [4,     "èterais",      ":K:1s:2s/*",           False],
+                [4,     "èterait",      ":K:3s/*",              False],
+                [4,     "èterions",     ":K:1p/*",              False],
+                [4,     "èteriez",      ":K:2p/*",              False],
+                [4,     "èteraient",    ":K:3p/*",              False],
+                [2,     "asse",         ":Sq:1s/*",             False],
+                [2,     "asses",        ":Sq:2s/*",             False],
+                [2,     "ât",           ":Sq:3s/*",             False],
+                [2,     "assions",      ":Sq:1p/*",             False],
+                [2,     "assiez",       ":Sq:2p/*",             False],
+                [2,     "assent",       ":Sq:3p/*",             False],
+                [4,     "ète",          ":E:2s/*",              False],
+                [2,     "ons",          ":E:1p/*",              False],
+                [2,     "ez",           ":E:2p/*",              False]
+            ],
+            "2": [
+                # d. verbes en -eter : doublement de la consonne t
+                [2,     "er",           ":Y/*",                 False],
+                [2,     "ant",          ":P/*",                 False],
+                [4,     "ette",         ":Ip:Sp:1s:3s/*",       "jeter$"],
+                [4,     "ette",         ":Ip:Sp:1s:3s/M",       "[^j]eter$"],
+                [4,     "ète",          ":Ip:Sp:1s:3s/R",       "[^j]eter$"],
+                [2,     "è",            ":Ip:1ś/R",             False],
+                [4,     "ettes",        ":Ip:Sp:2s/*",          "jeter$"],
+                [4,     "ettes",        ":Ip:Sp:2s/M",          "[^j]eter$"],
+                [4,     "ètes",         ":Ip:Sp:2s/R",          "[^j]eter$"],
+                [2,     "ons",          ":Ip:1p/*",             False],
+                [2,     "ez",           ":Ip:2p/*",             False],
+                [4,     "ettent",       ":Ip:Sp:3p/*",          "jeter$"],
+                [4,     "ettent",       ":Ip:Sp:3p/M",          "[^j]eter$"],
+                [4,     "ètent",        ":Ip:Sp:3p/R",          "[^j]eter$"],
+                [2,     "ais",          ":Iq:1s:2s/*",          False],
+                [2,     "ait",          ":Iq:3s/*",             False],
+                [2,     "ions",         ":Iq:Sp:1p/*",          False],
+                [2,     "iez",          ":Iq:Sp:2p/*",          False],
+                [2,     "aient",        ":Iq:3p/*",             False],
+                [2,     "ai",           ":Is:1s/*",             False],
+                [2,     "as",           ":Is:2s/*",             False],
+                [2,     "a",            ":Is:3s/*",             False],
+                [2,     "âmes",         ":Is:1p/*",             False],
+                [2,     "âtes",         ":Is:2p/*",             False],
+                [2,     "èrent",        ":Is:3p!/*",            False],
+                [4,     "etterai",      ":If:1s/*",             "jeter$"],
+                [4,     "etterai",      ":If:1s/M",             "[^j]eter$"],
+                [4,     "èterai",       ":If:1s/R",             "[^j]eter$"],
+                [4,     "etteras",      ":If:2s/*",             "jeter$"],
+                [4,     "etteras",      ":If:2s/M",             "[^j]eter$"],
+                [4,     "èteras",       ":If:2s/R",             "[^j]eter$"],
+                [4,     "ettera",       ":If:3s/*",             "jeter$"],
+                [4,     "ettera",       ":If:3s/M",             "[^j]eter$"],
+                [4,     "ètera",        ":If:3s/R",             "[^j]eter$"],
+                [4,     "etterons",     ":If:1p/*",             "jeter$"],
+                [4,     "etterons",     ":If:1p/M",             "[^j]eter$"],
+                [4,     "èterons",      ":If:1p/R",             "[^j]eter$"],
+                [4,     "etterez",      ":If:2p/*",             "jeter$"],
+                [4,     "etterez",      ":If:2p/M",             "[^j]eter$"],
+                [4,     "èterez",       ":If:2p/R",             "[^j]eter$"],
+                [4,     "etteront",     ":If:3p!/*",            "jeter$"],
+                [4,     "etteront",     ":If:3p!/M",            "[^j]eter$"],
+                [4,     "èteront",      ":If:3p!/R",            "[^j]eter$"],
+                [4,     "etterais",     ":K:1s:2s/*",           "jeter$"],
+                [4,     "etterais",     ":K:1s:2s/M",           "[^j]eter$"],
+                [4,     "èterais",      ":K:1s:2s/R",           "[^j]eter$"],
+                [4,     "etterait",     ":K:3s/*",              "jeter$"],
+                [4,     "etterait",     ":K:3s/M",              "[^j]eter$"],
+                [4,     "èterait",      ":K:3s/R",              "[^j]eter$"],
+                [4,     "etterions",    ":K:1p/*",              "jeter$"],
+                [4,     "etterions",    ":K:1p/M",              "[^j]eter$"],
+                [4,     "èterions",     ":K:1p/R",              "[^j]eter$"],
+                [4,     "etteriez",     ":K:2p/*",              "jeter$"],
+                [4,     "etteriez",     ":K:2p/M",              "[^j]eter$"],
+                [4,     "èteriez",      ":K:2p/R",              "[^j]eter$"],
+                [4,     "etteraient",   ":K:3p/*",              "jeter$"],
+                [4,     "etteraient",   ":K:3p/M",              "[^j]eter$"],
+                [4,     "èteraient",    ":K:3p/R",              "[^j]eter$"],
+                [2,     "asse",         ":Sq:1s/*",             False],
+                [2,     "asses",        ":Sq:2s/*",             False],
+                [2,     "ât",           ":Sq:3s/*",             False],
+                [2,     "assions",      ":Sq:1p/*",             False],
+                [2,     "assiez",       ":Sq:2p/*",             False],
+                [2,     "assent",       ":Sq:3p/*",             False],
+                [4,     "ette",         ":E:2s/*",              "jeter$"],
+                [4,     "ette",         ":E:2s/M",              "[^j]eter$"],
+                [4,     "ète",          ":E:2s/R",              "[^j]eter$"],
+                [2,     "ons",          ":E:1p/*",              False],
+                [2,     "ez",           ":E:2p/*",              False]
+            ]
+        },
+
+        "ever": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [4,     "ève",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "èves",         ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "èvent",        ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [4,     "èverai",       ":If:1s/*",             False],
+            [4,     "èveras",       ":If:2s/*",             False],
+            [4,     "èvera",        ":If:3s/*",             False],
+            [4,     "èverons",      ":If:1p/*",             False],
+            [4,     "èverez",       ":If:2p/*",             False],
+            [4,     "èveront",      ":If:3p!/*",            False],
+            [4,     "èverais",      ":K:1s:2s/*",           False],
+            [4,     "èverait",      ":K:3s/*",              False],
+            [4,     "èverions",     ":K:1p/*",              False],
+            [4,     "èveriez",      ":K:2p/*",              False],
+            [4,     "èveraient",    ":K:3p/*",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [4,     "ève",          ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "evrer": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [5,     "èvre",         ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [5,     "èvres",        ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [5,     "èvrent",       ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [5,     "èvrerai",      ":If:1s/*",             False],
+            [5,     "èvreras",      ":If:2s/*",             False],
+            [5,     "èvrera",       ":If:3s/*",             False],
+            [5,     "èvrerons",     ":If:1p/*",             False],
+            [5,     "èvrerez",      ":If:2p/*",             False],
+            [5,     "èvreront",     ":If:3p!/*",            False],
+            [5,     "èvrerais",     ":K:1s:2s/*",           False],
+            [5,     "èvrerait",     ":K:3s/*",              False],
+            [5,     "èvrerions",    ":K:1p/*",              False],
+            [5,     "èvreriez",     ":K:2p/*",              False],
+            [5,     "èvreraient",   ":K:3p/*",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [5,     "èvre",         ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        # c
+        # verbes en -ébrer, -écer, -écher, -écrer, -éder, -éger, -égler, -égner, -égrer, -éguer,
+        #           -éler, -émer, -éner, -éper, -équer, -érer, -éser, -éter, -étrer, -évrer, -éyer
+        # changement du é en è
+
+        "écer": [
+            [2,     "er",           ":Y/*",                 False],
+            [4,     "éçant",        ":P/*",                 False],
+            [4,     "èce",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "èces",         ":Ip:Sp:2s/*",          False],
+            [4,     "éçons",        ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "ècent",        ":Ip:Sp:3p/*",          False],
+            [4,     "éçais",        ":Iq:1s:2s/*",          False],
+            [4,     "éçait",        ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [4,     "éçaient",      ":Iq:3p/*",             False],
+            [4,     "éçai",         ":Is:1s/*",             False],
+            [4,     "éças",         ":Is:2s/*",             False],
+            [4,     "éça",          ":Is:3s/*",             False],
+            [4,     "éçâmes",       ":Is:1p/*",             False],
+            [4,     "éçâtes",       ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [4,     "ècerai",       ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [4,     "èceras",       ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [4,     "ècera",        ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [4,     "ècerons",      ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [4,     "ècerez",       ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [4,     "èceront",      ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [4,     "ècerais",      ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [4,     "ècerait",      ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [4,     "ècerions",     ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [4,     "èceriez",      ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [4,     "èceraient",    ":K:3p/R",              False],
+            [4,     "éçasse",       ":Sq:1s/*",             False],
+            [4,     "éçasses",      ":Sq:2s/*",             False],
+            [4,     "éçât",         ":Sq:3s/*",             False],
+            [4,     "éçassions",    ":Sq:1p/*",             False],
+            [4,     "éçassiez",     ":Sq:2p/*",             False],
+            [4,     "éçassent",     ":Sq:3p/*",             False],
+            [4,     "èce",          ":E:2s/*",              False],
+            [4,     "éçons",        ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "éger": [
+            [2,     "er",           ":Y/*",                 False],
+            [4,     "égeant",       ":P/*",                 False],
+            [4,     "ège",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "èges",         ":Ip:Sp:2s/*",          False],
+            [4,     "égeons",       ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "ègent",        ":Ip:Sp:3p/*",          False],
+            [4,     "égeais",       ":Iq:1s:2s/*",          False],
+            [4,     "égeait",       ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [4,     "égeaient",     ":Iq:3p/*",             False],
+            [4,     "égeai",        ":Is:1s/*",             False],
+            [4,     "égeas",        ":Is:2s/*",             False],
+            [4,     "égea",         ":Is:3s/*",             False],
+            [4,     "égeâmes",      ":Is:1p/*",             False],
+            [4,     "égeâtes",      ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [4,     "ègerai",       ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [4,     "ègeras",       ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [4,     "ègera",        ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [4,     "ègerons",      ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [4,     "ègerez",       ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [4,     "ègeront",      ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [4,     "ègerais",      ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [4,     "ègerait",      ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [4,     "ègerions",     ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [4,     "ègeriez",      ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [4,     "ègeraient",    ":K:3p/R",              False],
+            [4,     "égeasse",      ":Sq:1s/*",             False],
+            [4,     "égeasses",     ":Sq:2s/*",             False],
+            [4,     "égeât",        ":Sq:3s/*",             False],
+            [4,     "égeassions",   ":Sq:1p/*",             False],
+            [4,     "égeassiez",    ":Sq:2p/*",             False],
+            [4,     "égeassent",    ":Sq:3p/*",             False],
+            [4,     "ège",          ":E:2s/*",              False],
+            [4,     "égeons",       ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "ébrer": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [5,     "èbre",         ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [5,     "èbres",        ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [5,     "èbrent",       ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [5,     "èbrerai",      ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [5,     "èbreras",      ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [5,     "èbrera",       ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [5,     "èbrerons",     ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [5,     "èbrerez",      ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [5,     "èbreront",     ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [5,     "èbrerais",     ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [5,     "èbrerait",     ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [5,     "èbrerions",    ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [5,     "èbreriez",     ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [5,     "èbreraient",   ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [5,     "èbre",         ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "écher": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [5,     "èche",         ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [5,     "èches",        ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [5,     "èchent",       ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [5,     "ècherai",      ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [5,     "ècheras",      ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [5,     "èchera",       ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [5,     "ècherons",     ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [5,     "ècherez",      ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [5,     "ècheront",     ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [5,     "ècherais",     ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [5,     "ècherait",     ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [5,     "ècherions",    ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [5,     "ècheriez",     ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [5,     "ècheraient",   ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [5,     "èche",         ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "écrer": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [5,     "ècre",         ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [5,     "ècres",        ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [5,     "ècrent",       ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [5,     "ècrerai",      ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [5,     "ècreras",      ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [5,     "ècrera",       ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [5,     "ècrerons",     ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [5,     "ècrerez",      ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [5,     "ècreront",     ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [5,     "ècrerais",     ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [5,     "ècrerait",     ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [5,     "ècrerions",    ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [5,     "ècreriez",     ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [5,     "ècreraient",   ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [5,     "ècre",         ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "éder": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [4,     "ède",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "èdes",         ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "èdent",        ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [4,     "èderai",       ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [4,     "èderas",       ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [4,     "èdera",        ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [4,     "èderons",      ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [4,     "èderez",       ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [4,     "èderont",      ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [4,     "èderais",      ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [4,     "èderait",      ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [4,     "èderions",     ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [4,     "èderiez",      ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [4,     "èderaient",    ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [4,     "ède",          ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "égler": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [5,     "ègle",         ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [5,     "ègles",        ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [5,     "èglent",       ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [5,     "èglerai",      ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [5,     "ègleras",      ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [5,     "èglera",       ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [5,     "èglerons",     ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [5,     "èglerez",      ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [5,     "ègleront",     ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [5,     "èglerais",     ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [5,     "èglerait",     ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [5,     "èglerions",    ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [5,     "ègleriez",     ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [5,     "ègleraient",   ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [5,     "ègle",         ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "égner": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [5,     "ègne",         ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [5,     "ègnes",        ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [5,     "ègnent",       ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [5,     "ègnerai",      ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [5,     "ègneras",      ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [5,     "ègnera",       ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [5,     "ègnerons",     ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [5,     "ègnerez",      ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [5,     "ègneront",     ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [5,     "ègnerais",     ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [5,     "ègnerait",     ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [5,     "ègnerions",    ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [5,     "ègneriez",     ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [5,     "ègneraient",   ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [5,     "ègne",         ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "égrer": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [5,     "ègre",         ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [5,     "ègres",        ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [5,     "ègrent",       ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [5,     "ègrerai",      ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [5,     "ègreras",      ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [5,     "ègrera",       ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [5,     "ègrerons",     ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [5,     "ègrerez",      ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [5,     "ègreront",     ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [5,     "ègrerais",     ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [5,     "ègrerait",     ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [5,     "ègrerions",    ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [5,     "ègreriez",     ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [5,     "ègreraient",   ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [5,     "ègre",         ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "éguer": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [5,     "ègue",         ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [5,     "ègues",        ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [5,     "èguent",       ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [5,     "èguerai",      ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [5,     "ègueras",      ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [5,     "èguera",       ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [5,     "èguerons",     ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [5,     "èguerez",      ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [5,     "ègueront",     ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [5,     "èguerais",     ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [5,     "èguerait",     ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [5,     "èguerions",    ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [5,     "ègueriez",     ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [5,     "ègueraient",   ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [5,     "ègue",         ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "éler": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [4,     "èle",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "èles",         ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "èlent",        ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [4,     "èlerai",       ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [4,     "èleras",       ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [4,     "èlera",        ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [4,     "èlerons",      ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [4,     "èlerez",       ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [4,     "èleront",      ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [4,     "èlerais",      ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [4,     "èlerait",      ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [4,     "èlerions",     ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [4,     "èleriez",      ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [4,     "èleraient",    ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [4,     "èle",          ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "émer": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [4,     "ème",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "èmes",         ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "èment",        ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [4,     "èmerai",       ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [4,     "èmeras",       ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [4,     "èmera",        ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [4,     "èmerons",      ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [4,     "èmerez",       ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [4,     "èmeront",      ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [4,     "èmerais",      ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [4,     "èmerait",      ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [4,     "èmerions",     ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [4,     "èmeriez",      ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [4,     "èmeraient",    ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [4,     "ème",          ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "éner": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [4,     "ène",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "ènes",         ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "ènent",        ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [4,     "ènerai",       ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [4,     "èneras",       ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [4,     "ènera",        ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [4,     "ènerons",      ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [4,     "ènerez",       ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [4,     "èneront",      ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [4,     "ènerais",      ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [4,     "ènerait",      ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [4,     "ènerions",     ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [4,     "èneriez",      ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [4,     "èneraient",    ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [4,     "ène",          ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "éper": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [4,     "èpe",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "èpes",         ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "èpent",        ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [4,     "èperai",       ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [4,     "èperas",       ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [4,     "èpera",        ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [4,     "èperons",      ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [4,     "èperez",       ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [4,     "èperont",      ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [4,     "èperais",      ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [4,     "èperait",      ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [4,     "èperions",     ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [4,     "èperiez",      ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [4,     "èperaient",    ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [4,     "èpe",          ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "équer": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [5,     "èque",         ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [5,     "èques",        ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [5,     "èquent",       ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [5,     "èquerai",      ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [5,     "èqueras",      ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [5,     "èquera",       ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [5,     "èquerons",     ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [5,     "èquerez",      ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [5,     "èqueront",     ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [5,     "èquerais",     ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [5,     "èquerait",     ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [5,     "èquerions",    ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [5,     "èqueriez",     ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [5,     "èqueraient",   ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [5,     "èque",         ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "érer": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [4,     "ère",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "ères",         ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "èrent",        ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [4,     "èrerai",       ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [4,     "èreras",       ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [4,     "èrera",        ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [4,     "èrerons",      ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [4,     "èrerez",       ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [4,     "èreront",      ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [4,     "èrerais",      ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [4,     "èrerait",      ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [4,     "èrerions",     ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [4,     "èreriez",      ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [4,     "èreraient",    ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [4,     "ère",          ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "éser": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [4,     "èse",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "èses",         ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "èsent",        ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [4,     "èserai",       ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [4,     "èseras",       ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [4,     "èsera",        ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [4,     "èserons",      ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [4,     "èserez",       ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [4,     "èseront",      ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [4,     "èserais",      ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [4,     "èserait",      ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [4,     "èserions",     ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [4,     "èseriez",      ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [4,     "èseraient",    ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [4,     "èse",          ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "éter": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [4,     "ète",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "ètes",         ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "ètent",        ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [4,     "èterai",       ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [4,     "èteras",       ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [4,     "ètera",        ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [4,     "èterons",      ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [4,     "èterez",       ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [4,     "èteront",      ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [4,     "èterais",      ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [4,     "èterait",      ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [4,     "èterions",     ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [4,     "èteriez",      ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [4,     "èteraient",    ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [4,     "ète",          ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "étrer": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [5,     "ètre",         ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [5,     "ètres",        ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [5,     "ètrent",       ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [5,     "ètrerai",      ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [5,     "ètreras",      ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [5,     "ètrera",       ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [5,     "ètrerons",     ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [5,     "ètrerez",      ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [5,     "ètreront",     ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [5,     "ètrerais",     ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [5,     "ètrerait",     ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [5,     "ètrerions",    ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [5,     "ètreriez",     ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [5,     "ètreraient",   ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [5,     "ètre",         ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "évrer": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [5,     "èvre",         ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [5,     "èvres",        ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [5,     "èvrent",       ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [5,     "èvrerai",      ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [5,     "èvreras",      ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [5,     "èvrera",       ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [5,     "èvrerons",     ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [5,     "èvrerez",      ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [5,     "èvreront",     ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [5,     "èvrerais",     ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [5,     "èvrerait",     ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [5,     "èvrerions",    ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [5,     "èvreriez",     ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [5,     "èvreraient",   ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [5,     "èvre",         ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ],
+
+        "éyer": [
+            [2,     "er",           ":Y/*",                 False],
+            [2,     "ant",          ":P/*",                 False],
+            [4,     "èye",          ":Ip:Sp:1s:3s/*",       False],
+            [2,     "è",            ":Ip:1ś/R",             False],
+            [4,     "èyes",         ":Ip:Sp:2s/*",          False],
+            [2,     "ons",          ":Ip:1p/*",             False],
+            [2,     "ez",           ":Ip:2p/*",             False],
+            [4,     "èyent",        ":Ip:Sp:3p/*",          False],
+            [2,     "ais",          ":Iq:1s:2s/*",          False],
+            [2,     "ait",          ":Iq:3s/*",             False],
+            [2,     "ions",         ":Iq:Sp:1p/*",          False],
+            [2,     "iez",          ":Iq:Sp:2p/*",          False],
+            [2,     "aient",        ":Iq:3p/*",             False],
+            [2,     "ai",           ":Is:1s/*",             False],
+            [2,     "as",           ":Is:2s/*",             False],
+            [2,     "a",            ":Is:3s/*",             False],
+            [2,     "âmes",         ":Is:1p/*",             False],
+            [2,     "âtes",         ":Is:2p/*",             False],
+            [2,     "èrent",        ":Is:3p!/*",            False],
+            [2,     "erai",         ":If:1s/M",             False],
+            [4,     "èyerai",       ":If:1s/R",             False],
+            [2,     "eras",         ":If:2s/M",             False],
+            [4,     "èyeras",       ":If:2s/R",             False],
+            [2,     "era",          ":If:3s/M",             False],
+            [4,     "èyera",        ":If:3s/R",             False],
+            [2,     "erons",        ":If:1p/M",             False],
+            [4,     "èyerons",      ":If:1p/R",             False],
+            [2,     "erez",         ":If:2p/M",             False],
+            [4,     "èyerez",       ":If:2p/R",             False],
+            [2,     "eront",        ":If:3p!/M",            False],
+            [4,     "èyeront",      ":If:3p!/R",            False],
+            [2,     "erais",        ":K:1s:2s/M",           False],
+            [4,     "èyerais",      ":K:1s:2s/R",           False],
+            [2,     "erait",        ":K:3s/M",              False],
+            [4,     "èyerait",      ":K:3s/R",              False],
+            [2,     "erions",       ":K:1p/M",              False],
+            [4,     "èyerions",     ":K:1p/R",              False],
+            [2,     "eriez",        ":K:2p/M",              False],
+            [4,     "èyeriez",      ":K:2p/R",              False],
+            [2,     "eraient",      ":K:3p/M",              False],
+            [4,     "èyeraient",    ":K:3p/R",              False],
+            [2,     "asse",         ":Sq:1s/*",             False],
+            [2,     "asses",        ":Sq:2s/*",             False],
+            [2,     "ât",           ":Sq:3s/*",             False],
+            [2,     "assions",      ":Sq:1p/*",             False],
+            [2,     "assiez",       ":Sq:2p/*",             False],
+            [2,     "assent",       ":Sq:3p/*",             False],
+            [4,     "èye",          ":E:2s/*",              False],
+            [2,     "ons",          ":E:1p/*",              False],
+            [2,     "ez",           ":E:2p/*",              False]
+        ]
+    }
+}
ADDED   gc_lang/fr/oxt/DictOptions/lxe_strings.py
Index: gc_lang/fr/oxt/DictOptions/lxe_strings.py
==================================================================
--- /dev/null
+++ gc_lang/fr/oxt/DictOptions/lxe_strings.py
@@ -0,0 +1,84 @@
+def getUI (sLang):
+    if sLang in dStrings:
+        return dStrings[sLang]
+    return dStrings["fr"]
+
+dStrings = {
+    "fr": {
+        "title": "Grammalecte · Éditeur lexical",
+
+        # Ajout
+        "add_section": "Nouveau mot (lemme)",
+        "lemma": "Lemme",
+
+        # catégories
+        "common_name": "Nom commun",
+        "nom_adj": "Nom et adjectif",
+        "nom": "Nom",
+        "adj": "Adjectif",
+        "alt_lemma": "[optionnel] Autre forme (masculine, féminine, variante, etc.)",
+
+        "proper_name": "Nom propre",
+        "M1": "Prénom",
+        "M2": "Patronyme",
+        "MP": "Autre",
+
+        "gender": "Genre",
+        "epi": "épicène",
+        "mas": "masculin",
+        "fem": "féminin",
+        "plural": "Pluriel",
+        "-s": "pluriel en ·s",
+        "-x": "pluriel en ·x",
+        "inv": "invariable",
+
+        "verb": "Verbe",
+        "v_i": "intransitif",
+        "v_t": "transitif",
+        "v_n": "transitif indirect",
+        "v_p": "pronominal",
+        "v_m": "impersonnel",
+        "aux": "Auxiliaire au passé composé",
+        "v_ae": "être",
+        "v_aa": "avoir",
+        "v_pp": "Participes passés variables",
+        "v_pattern": "Verbe modèle [optionnel]",
+
+        "adverb": "Adverbe",
+
+        "other": "Autre",
+        "flexion": "Flexion",
+        "tags": "Étiquettes",
+
+        # Lexicon
+        "new_section": "Mots générés",
+        "lexicon_section": "Votre lexique",
+        "lex_#": "#",
+        "lex_flex": "Flexions",
+        "lex_lemma": "Lemmes",
+        "lex_tags": "Étiquettes",
+
+        "add_button": "Ajouter au lexique",
+        "delete_button": "Supprimer la sélection",
+
+        # Informations
+        "lexicon_info_section": "Lexique",
+        "added_entries_label": "Nombre d’entrées ajoutées",
+        "deleted_entries_label": "Nombre d’entrées effacées",
+        "num_of_entries_label": "Nombre d’entrées",
+        "save_button": "Enregistrer",
+
+        "dictionary_section": "Dictionnaire enregistré",
+        "save_date_label": "Date d’enregistrement",
+        "export_button": "Exporter",
+
+        #
+        "close_button": "Fermer",
+    },
+    # Traduction délibérément limitée
+    "en": {
+        "title": "Grammalecte · Lexical editor",
+        
+        "close_button": "Close",
+    },
+}
Index: gc_lang/fr/oxt/TextFormatter/TextFormatter.py
==================================================================
--- gc_lang/fr/oxt/TextFormatter/TextFormatter.py
+++ gc_lang/fr/oxt/TextFormatter/TextFormatter.py
@@ -383,17 +383,12 @@
             for key, lWidget in self.dCheckboxWidgets.items():
                 w = getattr(self, key)
                 dOpt[w.Name] = w.State
                 for w in lWidget:
                     dOpt[w.Name] = w.State
-            # get extension path
-            xDefaultContext = self.ctx.ServiceManager.DefaultContext
-            xPackageInfoProvider = xDefaultContext.getValueByName("/singletons/com.sun.star.deployment.PackageInformationProvider")
-            sExtPath = xPackageInfoProvider.getPackageLocation("French.linguistic.resources.from.Dicollecte.by.OlivierR")
-            sExtPath = sExtPath[8:] + "/pythonpath/tf_options.py"  # remove "file:///"
-            sExtPath = os.path.abspath(sExtPath)
             # write file
+            sExtPath = helpers.getAbsolutePathOf("/pythonpath/tf_options.py")
             if os.path.isfile(sExtPath):
                 hOpt = open(sExtPath, "w")
                 hOpt.write("dDefaultOpt = " + str(tf_options.dDefaultOpt) + "\n")
                 hOpt.write("dOpt = " + str(dOpt))
                 hOpt.close()
Index: gc_lang/fr/oxt/addons.xcu
==================================================================
--- gc_lang/fr/oxt/addons.xcu
+++ gc_lang/fr/oxt/addons.xcu
@@ -75,11 +75,11 @@
                         service:net.grammalecte.AppLauncher?EN
                     
                     
                         
                         ~Recenseur de mots…
-                        ~Enumerator of words…
+                        Enumerato~r of words…
                     
                     
                         _self
                     
                     
@@ -134,10 +134,48 @@
                     
                         org.dicollecte.images:Grammalecte
                     
                 
                 
+                    
+                        service:net.grammalecte.AppLauncher?DI
+                    
+                    
+                        
+                        ~Options des dictionnaires…
+                        Dictionaries ~options…
+                    
+                    
+                        _self
+                    
+                    
+                        com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument
+                    
+                    
+                        org.dicollecte.images:Frenchflag
+                    
+                
+                
+                    
+                        service:net.grammalecte.AppLauncher?LE
+                    
+                    
+                        
+                        Éditeur ~lexical…
+                        ~Lexicon editor…
+                    
+                    
+                        _self
+                    
+                    
+                        com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument
+                    
+                    
+                        org.dicollecte.images:Frenchflag
+                    
+                
+                
                     
                         service:net.grammalecte.AppLauncher?DS
                     
                     
                         
@@ -152,19 +190,19 @@
                     
                     
                         org.dicollecte.images:Frenchflag
                     
                 
-                
+                
                     
                         private:separator
                     
                     
                         com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument
                     
                 
-                
+                
                     
                         service:net.grammalecte.AppLauncher?About
                     
                     
                         
DELETED gc_lang/fr/oxt/helpers.py
Index: gc_lang/fr/oxt/helpers.py
==================================================================
--- gc_lang/fr/oxt/helpers.py
+++ /dev/null
@@ -1,62 +0,0 @@
-# -*- coding: utf8 -*-
-
-import uno
-import traceback
-
-from com.sun.star.beans import PropertyValue
-
-
-# XRay - API explorer
-from com.sun.star.uno import RuntimeException as _rtex
-def xray (myObject):
-    try:
-        sm = uno.getComponentContext().ServiceManager
-        mspf = sm.createInstanceWithContext("com.sun.star.script.provider.MasterScriptProviderFactory", uno.getComponentContext())
-        scriptPro = mspf.createScriptProvider("")
-        xScript = scriptPro.getScript("vnd.sun.star.script:XrayTool._Main.Xray?language=Basic&location=application")
-        xScript.invoke((myObject,), (), ())
-        return
-    except:
-        raise _rtex("\nBasic library Xray is not installed", uno.getComponentContext())
-
-
-# MRI - API Explorer
-def mri (ctx, xTarget):
-    try:
-        xMri = ctx.ServiceManager.createInstanceWithContext("mytools.Mri", ctx)
-        xMri.inspect(xTarget)
-    except:
-        raise _rtex("\Python extension MRI is not installed", uno.getComponentContext())
-
-
-def getConfigSetting (sNodeConfig, bUpdate):
-    "get a configuration node"
-    # example: xNode = getConfigSetting("/org.openoffice.Office.Common/Path/Current", False)
-    xSvMgr = uno.getComponentContext().ServiceManager
-    xConfigProvider = xSvMgr.createInstanceWithContext("com.sun.star.configuration.ConfigurationProvider", uno.getComponentContext())
-    xPropertyValue = uno.createUnoStruct("com.sun.star.beans.PropertyValue")
-    xPropertyValue.Name = "nodepath"
-    xPropertyValue.Value = sNodeConfig
-    if bUpdate:
-        sService = "com.sun.star.configuration.ConfigurationUpdateAccess"
-    else:
-        sService = "com.sun.star.configuration.ConfigurationAccess"
-    return xConfigProvider.createInstanceWithArguments(sService, (xPropertyValue,)) # return xNode
-
-
-def printServices (o):
-    for s in o.getAvailableServiceNames():
-        print(' > '+s)
-
-
-def getWindowSize ():
-    "return main window size"
-    xCurCtx = uno.getComponentContext()
-    xDesktop = xCurCtx.getServiceManager().createInstanceWithContext('com.sun.star.frame.Desktop', xCurCtx)
-    xContainerWindow = xDesktop.getCurrentComponent().CurrentController.Frame.ContainerWindow
-    xWindowSize = xContainerWindow.convertSizeToLogic(xContainerWindow.Size, uno.getConstantByName("com.sun.star.util.MeasureUnit.POINT"))
-    #print(xContainerWindow.Size.Width, ">", xWindowSize.Width)
-    #print(xContainerWindow.Size.Height, ">", xWindowSize.Height)
-    xWindowSize.Width = xWindowSize.Width * 0.666
-    xWindowSize.Height = xWindowSize.Height * 0.666
-    return xWindowSize
Index: graphspell/dawg.py
==================================================================
--- graphspell/dawg.py
+++ graphspell/dawg.py
@@ -25,11 +25,11 @@
     if os.path.isfile(spf):
         with open(spf, "r", encoding="utf-8") as hSrc:
             for sLine in hSrc:
                 sLine = sLine.strip()
                 if sLine and not sLine.startswith("#"):
-                    yield sLine
+                    yield sLine.split("\t")
     else:
         raise OSError("# Error. File not found or not loadable: " + spf)
 
 
 
@@ -39,11 +39,11 @@
     # We store suffix/affix codes and tags within the graph after the “real” word.
     # A word is a list of numbers [ c1, c2, c3 . . . cN, iAffix, iTags]
     # Each arc is an index in self.lArcVal, where are stored characters, suffix/affix codes for stemming and tags.
     # Important: As usual, the last node (after ‘iTags’) is tagged final, AND the node after ‘cN’ is ALSO tagged final.
 
-    def __init__ (self, spfSrc, cStemming, sLangCode, sLangName="", sDicName=""):
+    def __init__ (self, src, cStemming, sLangCode, sLangName="", sDicName=""):
         print("===== Direct Acyclic Word Graph - Minimal Acyclic Finite State Automaton =====")
         cStemming = cStemming.upper()
         if cStemming == "A":
             funcStemmingGen = st.defineAffixCode
         elif cStemming == "S":
@@ -56,14 +56,17 @@
         lEntry = []
         lChar = ['']; dChar = {}; nChar = 1; dCharOccur = {}
         lAff  = [];   dAff  = {}; nAff  = 0; dAffOccur = {}
         lTag  = [];   dTag  = {}; nTag  = 0; dTagOccur = {}
         nErr = 0
-        
+
         # read lexicon
-        for sLine in readFile(spfSrc):
-            sFlex, sStem, sTag = sLine.split("\t")
+        if type(src) is str:
+            iterable = readFile(src)
+        else:
+            iterable = src
+        for sFlex, sStem, sTag in iterable:
             addWordToCharDict(sFlex)
             # chars
             for c in sFlex:
                 if c not in dChar:
                     dChar[c] = nChar
@@ -95,16 +98,12 @@
         
         # Dictionary of arc values occurrency, to sort arcs of each node
         dValOccur = dict( [ (dChar[c], dCharOccur[c])  for c in dChar ] \
                         + [ (dAff[aff]+nChar, dAffOccur[aff]) for aff in dAff ] \
                         + [ (dTag[tag]+nChar+nAff, dTagOccur[tag]) for tag in dTag ] )
-        #with open(spfSrc[:-8]+".valuesfreq.txt", 'w', encoding='utf-8') as hFreqDst:  # DEBUG
-        #    for iKey, nOcc in sorted(dValOccur.items(), key=lambda t: t[1], reverse=True):
-        #        hFreqDst.write("{}: {}\n".format(lVal[iKey], nOcc))
-        #    hFreqDst.close()
         
-        self.sFileName = spfSrc
+        self.sFileName = src  if type(src) is str  else "[None]"
         self.sLangCode = sLangCode
         self.sLangName = sLangName
         self.sDicName = sDicName
         self.nEntry = len(lWord)
         self.aPreviousEntry = []
@@ -308,11 +307,11 @@
                     if not zPattern or zPattern.search(self.lArcVal[nMorphVal]):
                         yield sEntry + "\t" + self.lArcVal[nMorphVal]
 
 
     # BINARY CONVERSION
-    def createBinary (self, sPathFile, nCompressionMethod, bDebug=False):
+    def _calculateBinary (self, nCompressionMethod):
         print(" > Write DAWG as an indexable binary dictionary [method: %d]" % nCompressionMethod)
         if nCompressionMethod == 1:
             self.nBytesArc = ( (self.nArcVal.bit_length() + 2) // 8 ) + 1   # We add 2 bits. See DawgNode.convToBytes1()
             self.nBytesOffset = 0
             self._calcNumBytesNodeAddress()
@@ -332,14 +331,10 @@
             print(" # Error: unknown compression method")
         print("   Arc values (chars, affixes and tags): {}  ->  {} bytes".format( self.nArcVal, len("\t".join(self.lArcVal).encode("utf-8")) ))
         print("   Arc size: {} bytes, Address size: {} bytes   ->   {} * {} = {} bytes".format( self.nBytesArc, self.nBytesNodeAddress, \
                                                                                                 self.nBytesArc+self.nBytesNodeAddress, self.nArc, \
                                                                                                 (self.nBytesArc+self.nBytesNodeAddress)*self.nArc ))
-        self._writeBinary(sPathFile, nCompressionMethod)
-        self._writeAsJSObject(sPathFile, nCompressionMethod)
-        if bDebug:
-            self._writeNodes(sPathFile, nCompressionMethod)
 
     def _calcNumBytesNodeAddress (self):
         "how many bytes needed to store all nodes/arcs in the binary dictionary"
         self.nBytesNodeAddress = 1
         while ((self.nBytesArc + self.nBytesNodeAddress) * self.nArc) > (2 ** (self.nBytesNodeAddress * 8)):
@@ -387,13 +382,12 @@
                         nSize -= nDiff
                 if self.lSortedNodes[i].size != nSize:
                     self.lSortedNodes[i].size = nSize
                     bEnd = False
 
-    def _writeAsJSObject (self, spfDst, nCompressionMethod, bInJSModule=False, bBinaryDictAsHexString=True):
-        if not spfDst.endswith(".json"):
-            spfDst += "."+str(nCompressionMethod)+".json"
+    def getBinaryAsJSON (self, nCompressionMethod=1, bBinaryDictAsHexString=True):
+        self._calculateBinary(nCompressionMethod)
         byDic = b""
         if nCompressionMethod == 1:
             byDic = self.oRoot.convToBytes1(self.nBytesArc, self.nBytesNodeAddress)
             for oNode in self.lMinimizedNodes:
                 byDic += oNode.convToBytes1(self.nBytesArc, self.nBytesNodeAddress)
@@ -403,44 +397,48 @@
                 byDic += oNode.convToBytes2(self.nBytesArc, self.nBytesNodeAddress)
         elif nCompressionMethod == 3:
             byDic = self.oRoot.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset)
             for oNode in self.lSortedNodes:
                 byDic += oNode.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset)
+        return {
+            "sHeader": "/pyfsa/",
+            "sLangCode": self.sLangCode,
+            "sLangName": self.sLangName,
+            "sDicName": self.sDicName,
+            "sFileName": self.sFileName,
+            "sDate": self._getDate(),
+            "nEntry": self.nEntry,
+            "nChar": self.nChar,
+            "nAff": self.nAff,
+            "nTag": self.nTag,
+            "cStemming": self.cStemming,
+            "dChar": self.dChar,
+            "nNode": self.nNode,
+            "nArc": self.nArc,
+            "nArcVal": self.nArcVal,
+            "lArcVal": self.lArcVal,
+            "nCompressionMethod": nCompressionMethod,
+            "nBytesArc": self.nBytesArc,
+            "nBytesNodeAddress": self.nBytesNodeAddress,
+            "nBytesOffset": self.nBytesOffset,
+            # Mozilla’s JS parser don’t like file bigger than 4 Mb!
+            # So, if necessary, we use an hexadecimal string, that we will convert later in Firefox’s extension.
+            # https://github.com/mozilla/addons-linter/issues/1361
+            "sByDic": byDic.hex()  if bBinaryDictAsHexString  else [ e  for e in byDic ]
+        }
 
+    def writeAsJSObject (self, spfDst, nCompressionMethod, bInJSModule=False, bBinaryDictAsHexString=True):
+        if not spfDst.endswith(".json"):
+            spfDst += "."+str(nCompressionMethod)+".json"
         with open(spfDst, "w", encoding="utf-8", newline="\n") as hDst:
             if bInJSModule:
                 hDst.write('// JavaScript\n// Generated data (do not edit)\n\n"use strict";\n\nconst dictionary = ')
-            hDst.write(json.dumps({
-                            "sHeader": "/pyfsa/",
-                            "sLangCode": self.sLangCode,
-                            "sLangName": self.sLangName,
-                            "sDicName": self.sDicName,
-                            "sFileName": self.sFileName,
-                            "sDate": self._getDate(),
-                            "nEntry": self.nEntry,
-                            "nChar": self.nChar,
-                            "nAff": self.nAff,
-                            "nTag": self.nTag,
-                            "cStemming": self.cStemming,
-                            "dChar": self.dChar,
-                            "nNode": self.nNode,
-                            "nArc": self.nArc,
-                            "nArcVal": self.nArcVal,
-                            "lArcVal": self.lArcVal,
-                            "nCompressionMethod": nCompressionMethod,
-                            "nBytesArc": self.nBytesArc,
-                            "nBytesNodeAddress": self.nBytesNodeAddress,
-                            "nBytesOffset": self.nBytesOffset,
-                            # JavaScript is a pile of shit, so Mozilla’s JS parser don’t like file bigger than 4 Mb!
-                            # So, if necessary, we use an hexadecimal string, that we will convert later in Firefox’s extension.
-                            # https://github.com/mozilla/addons-linter/issues/1361
-                            "sByDic": byDic.hex()  if bBinaryDictAsHexString  else [ e  for e in byDic ]
-                        }, ensure_ascii=False))
+            hDst.write( json.dumps(self.getBinaryAsJSON(nCompressionMethod, bBinaryDictAsHexString), ensure_ascii=False) )
             if bInJSModule:
                 hDst.write(";\n\nexports.dictionary = dictionary;\n")
 
-    def _writeBinary (self, sPathFile, nCompressionMethod):
+    def writeBinary (self, sPathFile, nCompressionMethod, bDebug=False):
         """
         Format of the binary indexable dictionary:
         Each section is separated with 4 bytes of \0
         
         - Section Header:
@@ -471,10 +469,11 @@
         
         - Section Word Graph (nodes / arcs)
                 * A list of nodes which are a list of arcs with an address of the next node.
                   See DawgNode.convToBytes() for details.
         """
+        self._calculateBinary(nCompressionMethod)
         if not sPathFile.endswith(".bdic"):
             sPathFile += "."+str(nCompressionMethod)+".bdic"
         with open(sPathFile, 'wb') as hDst:
             # header
             hDst.write("/pyfsa/{}/".format(nCompressionMethod).encode("utf-8"))
@@ -499,11 +498,12 @@
                     hDst.write(oNode.convToBytes2(self.nBytesArc, self.nBytesNodeAddress))
             elif nCompressionMethod == 3:
                 hDst.write(self.oRoot.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset))
                 for oNode in self.lSortedNodes:
                     hDst.write(oNode.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset))
-            hDst.close()
+        if bDebug:
+            self._writeNodes(sPathFile, nCompressionMethod)
 
     def _getDate (self):
         return time.strftime("%Y.%m.%d, %H:%M")
 
     def _writeNodes (self, sPathFile, nCompressionMethod):
@@ -522,23 +522,10 @@
             if nCompressionMethod == 3:
                 hDst.write(self.oRoot.getTxtRepr3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset, self.lArcVal)+"\n")
                 #hDst.write( ''.join( [ "%02X " %  z  for z in self.oRoot.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset) ] ).strip() )
                 for oNode in self.lSortedNodes:
                     hDst.write(oNode.getTxtRepr3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset, self.lArcVal)+"\n")
-            hDst.close()
-    
-    def writeResults (self, sPathFile):
-        bFileExits = os.path.isfile("_lexicons.res.txt")
-        with open("_lexicons.res.txt", "a", encoding='utf-8', newline="\n") as hDst:
-            sFormat1 = "{:<12} {:>12} {:>5} {:>8} {:>8} {:>6} {:>8} {:>9} {:>9} {:>15} {:>12} {:>12}\n"
-            sFormat2 = "{:<12} {:>12,} {:>5,} {:>8,} {:>8} {:>6,} {:>8,} {:>9,} {:>9,} {:>15,} {:>12,} {:>12,}\n"
-            if not bFileExits:
-                hDst.write(sFormat1.format("Lexicon", "Entries", "Chars", "Affixes", "Stemming", "Tags", "Values", "Nodes", "Arcs", "Lexicon (Kb)", "Dict (Kb)", "LT Dict (Kb)"))
-            hDst.write(sFormat2.format(self.sLangName, self.nEntry, self.nChar, self.nAff, self.cStemming + "FX", self.nTag, self.nArcVal, \
-                                       self.nNode, self.nArc, os.path.getsize(self.sFileName), os.path.getsize(sPathFile), \
-                                       os.path.getsize("cfsa/dict/{}.dict".format(self.sLangName)) if os.path.isfile("cfsa/dict/{}.dict".format(self.sLangName)) else 0))
-            hDst.close()
 
 
 
 class DawgNode:
     NextId = 0
Index: graphspell/ibdawg.py
==================================================================
--- graphspell/ibdawg.py
+++ graphspell/ibdawg.py
@@ -77,23 +77,26 @@
 
 
 class IBDAWG:
     """INDEXABLE BINARY DIRECT ACYCLIC WORD GRAPH"""
 
-    def __init__ (self, sfDict):
-        self.by = pkgutil.get_data(__package__, "_dictionaries/" + sfDict)
-        if not self.by:
-            raise OSError("# Error. File not found or not loadable: "+sfDict)
-
-        if sfDict.endswith(".bdic"):
-            self._initBinary()
-        elif sfDict.endswith(".json"):
-            self._initJSON()
+    def __init__ (self, source):
+        if type(source) is str:
+            self.by = pkgutil.get_data(__package__, "_dictionaries/" + source)
+            if not self.by:
+                raise OSError("# Error. File not found or not loadable: "+source)
+
+            if source.endswith(".bdic"):
+                self._initBinary()
+            elif source.endswith(".json"):
+                self._initJSON(json.loads(self.by.decode("utf-8")))     #json.loads(self.by)    # In Python 3.6, can read directly binary strings
+            else:
+                raise OSError("# Error. Unknown file type: "+source)
         else:
-            raise OSError("# Error. Unknown file type: "+sfDict)
+            self._initJSON(source)
 
-        self.sFileName = sfDict
+        self.sFileName = source  if type(source) is str  else "[None]"
 
         self._arcMask = (2 ** ((self.nBytesArc * 8) - 3)) - 1
         self._finalNodeMask = 1 << ((self.nBytesArc * 8) - 1)
         self._lastArcMask = 1 << ((self.nBytesArc * 8) - 2)
         self._addrBitMask = 1 << ((self.nBytesArc * 8) - 3)  # version 2
@@ -167,14 +170,13 @@
         for i in range(1, self.nChar+1):
             self.dChar[self.lArcVal[i]] = i
         self.dCharVal = { v: k  for k, v in self.dChar.items() }
         self.nBytesOffset = 1 # version 3
 
-    def _initJSON (self):
+    def _initJSON (self, oJSON):
         "initialize with a JSON text file"
-        self.__dict__.update(json.loads(self.by.decode("utf-8")))
-        #self.__dict__.update(json.loads(self.by))                  # In Python 3.6, can read directly binary strings
+        self.__dict__.update(oJSON)
         self.byDic = binascii.unhexlify(self.sByDic)
 
     def getInfo (self):
         return  "  Language: {0.sLangName}   Lang code: {0.sLangCode}   Dictionary name: {0.sDicName}" \
                 "  Compression method: {0.nCompressionMethod:>2}   Date: {0.sDate}   Stemming: {0.cStemming}FX\n" \
Index: graphspell/spellchecker.py
==================================================================
--- graphspell/spellchecker.py
+++ graphspell/spellchecker.py
@@ -30,20 +30,20 @@
         self.oMainDic = self._loadDictionary(sfMainDic, True)
         self.oExtendedDic = self._loadDictionary(sfExtendedDic)
         self.oPersonalDic = self._loadDictionary(sfPersonalDic)
         self.oTokenizer = None
 
-    def _loadDictionary (self, sfDictionary, bNecessary=False):
+    def _loadDictionary (self, source, bNecessary=False):
         "returns an IBDAWG object"
-        if not sfDictionary:
+        if not source:
             return None
         try:
-            return ibdawg.IBDAWG(sfDictionary)
+            return ibdawg.IBDAWG(source)
         except Exception as e:
             if bNecessary:
-                raise Exception(str(e), "Error: <" + sfDictionary + "> not loaded.")
-            print("Error: <" + sfDictionary + "> not loaded.")
+                raise Exception(str(e), "Error: <" + str(source) + "> not loaded.")
+            print("Error: <" + str(source) + "> not loaded.")
             traceback.print_exc()
             return None
 
     def loadTokenizer (self):
         self.oTokenizer = tokenizer.Tokenizer(self.sLangCode)
@@ -51,23 +51,23 @@
     def getTokenizer (self):
         if not self.oTokenizer:
             self.loadTokenizer()
         return self.oTokenizer
 
-    def setMainDictionary (self, sfDictionary):
+    def setMainDictionary (self, source):
         "returns True if the dictionary is loaded"
-        self.oMainDic = self._loadDictionary(sfDictionary)
+        self.oMainDic = self._loadDictionary(source)
         return bool(self.oMainDic)
             
-    def setExtendedDictionary (self, sfDictionary):
+    def setExtendedDictionary (self, source):
         "returns True if the dictionary is loaded"
-        self.oExtendedDic = self._loadDictionary(sfDictionary)
+        self.oExtendedDic = self._loadDictionary(source)
         return bool(self.oExtendedDic)
 
-    def setPersonalDictionary (self, sfDictionary):
+    def setPersonalDictionary (self, source):
         "returns True if the dictionary is loaded"
-        self.oPersonalDic = self._loadDictionary(sfDictionary)
+        self.oPersonalDic = self._loadDictionary(source)
         return bool(self.oPersonalDic)
 
     # parse text functions
 
     def parseParagraph (self, sText, bSpellSugg=False):
Index: lex_build.py
==================================================================
--- lex_build.py
+++ lex_build.py
@@ -12,11 +12,11 @@
 def build (spfSrc, sLangCode, sLangName, sfDict, bJSON=False, sDicName="", cStemmingMethod="S", nCompressMethod=1):
     "transform a text lexicon as a binary indexable dictionary"
     oDAWG = fsa.DAWG(spfSrc, cStemmingMethod, sLangCode, sLangName, sDicName)
     dir_util.mkpath("graphspell/_dictionaries")
     oDAWG.writeInfo("graphspell/_dictionaries/" + sfDict + ".info.txt")
-    oDAWG.createBinary("graphspell/_dictionaries/" + sfDict + ".bdic", int(nCompressMethod))
+    oDAWG.writeBinary("graphspell/_dictionaries/" + sfDict + ".bdic", int(nCompressMethod))
     if bJSON:
         dir_util.mkpath("graphspell-js/_dictionaries")
         oDic = IBDAWG(sfDict + ".bdic")
         oDic.writeAsJSObject("graphspell-js/_dictionaries/" + sfDict + ".json", bBinaryDictAsHexString=True)
 
Index: make.py
==================================================================
--- make.py
+++ make.py
@@ -84,10 +84,11 @@
     # Extension files
     hZip.writestr("META-INF/manifest.xml", helpers.fileFile("gc_core/py/oxt/manifest.xml", dVars))
     hZip.writestr("description.xml", helpers.fileFile("gc_core/py/oxt/description.xml", dVars))
     hZip.writestr("Linguistic.xcu", helpers.fileFile("gc_core/py/oxt/Linguistic.xcu", dVars))
     hZip.writestr("Grammalecte.py", helpers.fileFile("gc_core/py/oxt/Grammalecte.py", dVars))
+    hZip.writestr("pythonpath/helpers.py", helpers.fileFile("gc_core/py/oxt/helpers.py", dVars))
 
     for sf in dVars["extras"].split(","):
         hZip.writestr(sf.strip(), helpers.fileFile(spLang + '/' + sf.strip(), dVars))
 
     if "logo" in dVars.keys() and dVars["logo"].strip():