docs: def _extractBasicPredicateFromClause( clauseTokens, clauseID ):
      ''' 
          Meetod, mis tuvastab antud osalausest kesksed verbid + nendega otseselt seotud 
          esmased verbifraasid:
             1) predikaadiga seotud eituse(d): (ei/ära/pole) + sobiv verb;
             2) olema-verbifraasid: olema; olema + sobiv verb;
             3) tavalised (mitte-olema) verbid, mis peaksid olema osalause keskmeks;
          Sisend 'clauseTokens' on list, mis sisaldab yhe osalause k6iki s6nu (pyvabamorfi poolt tehtud
          s6na-analyyse);
          Tagastab listi tuvastatud fraasidest, kus iga liige (dict) on kujul:
             { PHRASE: list,    -- tuvastatud fraasi positsioon lauses (WORD_ID indeksid);
               PATTERN: list,   -- yldine muster, mille alusel tuvastamine toimus;
               POLARITY: str,        -- polaarsus ('NEG', 'POS', '??')
               OTHER_VERBS: bool -- kas kontekstis on veel verbe, mida v6iks potentsiaalselt
                                     s6naga liita?
             }
          Eraldatakse järgmised üldised mustrid (PATTERN j2rjendid):
              verb 
              ole
              ei+V
              ole+V
              pole
              ei+ole
              pole+V
              ole+ole
              ei
              ära+V
              pole+ole
              ära
              ära+ole
          NB! Kui osalauses on veel verbe, mis v6iksid (potentsiaalselt) eraldatud mustriga liituda,
          siis m22ratakse mustris otherVerbs = True;
      '''
      global _phraseBreakerAdvs
      # Verbieituse indikaatorid
      verbEi   = WordTemplate({ROOT:'^ei$',FORM:'neg',POSTAG:'V'})
      verbEi2  = WordTemplate({ROOT:'^ei$',POSTAG:'D'})  # juhuks, kui morf yhestamises valitakse vale analyys
      verbAra  = WordTemplate({ROOT:'^ära$',FORM:'neg.*',POSTAG:'V'})
      verbPole = WordTemplate({ROOT:'^ole$',FORM:'neg.*',POSTAG:'V'})
      # Eituse sisuverbi osad
      verbEiJarel   = WordTemplate({POSTAG:'V',FORM:'o|nud|tud|nuks|nuvat|vat|ks|ta|taks|tavat$'})
      verbEiJarel2  = WordTemplate({POSTAG:'V',FORM:'neg o$'})
      # Infiniitverb, olema ja verbid, mis v6ivad olema-le j2rgneda
      verbInf = WordTemplate({POSTAG:'V', FORM:'^(da|des|ma|tama|ta|maks|mas|mast|nud|tud|v|mata)$'})
      verbOle = WordTemplate({ROOT:'^ole$',POSTAG:'V'})
      verbOleJarel = WordTemplate({POSTAG:'V',FORM:'nud$'})
      verbOleJarelHeur1 = WordTemplate({POSTAG:'V',FORM:'^(tud|da|mas)$'})
      verbOleJarelHeur2 = WordTemplate({POSTAG:'V',FORM:'^(tud|mas)$'})
      # Muud
      verb    = WordTemplate({POSTAG:'V'})
      verbid  = verb.matchingPositions( clauseTokens )
      sonaEga = WordTemplate({ROOT:'^ega$',POSTAG:'[DJ]'})
      # Eraldamise tulemused: eraldatud (verbi)fraasid ja kasutatud reeglid
      foundMatches  = []
      negPhraseWIDs = []
      posPhraseWIDs = []
      for i in range(len(clauseTokens)):
          tokenJson  = clauseTokens[i]
          matchFound = False
          # ===================================================================
          #      V e r b i e i t u s
          # ===================================================================
          if verbEi.matches(tokenJson) or verbEi2.matches(tokenJson):
              # 
              #  1. "Ei" + Verb (käskivas, -nud, -tud, -nuks, -nuvat, -vat,
              #                  -ks, -ta, -taks, tavat)
              #
              if i+1 < len(clauseTokens):
                  tokenJson2 = clauseTokens[i+1]
                  if verbEiJarel.matches(tokenJson2):
                      wid1 = tokenJson[WORD_ID]
                      wid2 = tokenJson2[WORD_ID]
                      matchobj = { PHRASE: [wid1, wid2], PATTERN: ["ei", "verb"] }
                      matchobj[CLAUSE_IDX] = clauseID
                      if verbOle.matches(tokenJson2):
                          matchobj[PATTERN][1] = 'ole'
                      matchobj[OTHER_VERBS] = (len(verbid) > 2)
                      matchobj[POLARITY] = 'NEG'
                      matchobj[ANALYSIS_IDS] = []
                      matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, [verbEi, verbEi2] ) )
                      matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson2, verbEiJarel ) )
                      foundMatches.append( matchobj )
                      negPhraseWIDs.extend( [wid1, wid2] )
                      matchFound = True
                  #
                  #   Lisamuster:
                  #     -neg o:   Ainult "lähe" korral, kuna selle s6na käskiv
                  #               ("mine") ei lange kokku eituse vormiga;
                  #
                  if not matchFound and verbEiJarel2.matches(tokenJson2):
                      wid1 = tokenJson[WORD_ID]
                      wid2 = tokenJson2[WORD_ID]
                      matchobj = { PHRASE: [wid1, wid2], PATTERN: ["ei", "verb"] }
                      matchobj[CLAUSE_IDX] = clauseID
                      matchobj[OTHER_VERBS] = (len(verbid) > 2)
                      matchobj[POLARITY] = 'NEG'
                      matchobj[ANALYSIS_IDS] = []
                      matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, [verbEi, verbEi2] ) )
                      matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson2, verbEiJarel2 ) )
                      foundMatches.append( matchobj )
                      negPhraseWIDs.extend( [wid1, wid2] )
                      matchFound = True
              #
              #   1.2. Kui "ei" on (osa)lause alguses, ja lauses ongi vaid kaks verbi, siis 
              #        võib eituse ja verbi vahel olla ka teisi sõnu ...
              #          Nt. Ei_0 ta ole_0 , ütlesin selge sõnaga .
              #              Hävita vaenlane - ei_0 sammugi tagane_0 .
              #
              if not matchFound and verbEi.matches(tokenJson) and i+1 < len(clauseTokens):
                  #   Leiame k6ik verbid: kui ongi vaid kaks verbi, esimene 'ei'
                  #  ja teine sellega sobiv verb ning kehtivad kitsendused:
                  #      ** teine verb j2rgneb 'ei'-le;
                  #      ** vahetult p2rast 'ei'-d pole koma (Nt 'Aga ei_0, sõna antud_0.')
                  #      ** teine verb on osalause l6pus;
                  if len(verbid)==2 and verbid[0]==i:
                      if verbEiJarel.matches(clauseTokens[verbid[1]]):
                          if not _isFollowedByComma( tokenJson[WORD_ID], clauseTokens ) and \
                                 _isClauseFinal( clauseTokens[verbid[1]][WORD_ID], clauseTokens ):
                              wid1 = tokenJson[WORD_ID]
                              wid2 = clauseTokens[verbid[1]][WORD_ID]
                              matchobj = { PHRASE: [wid1, wid2], PATTERN: ["ei", "verb"] }
                              matchobj[CLAUSE_IDX] = clauseID
                              if verbOle.matches(clauseTokens[verbid[1]]):
                                  matchobj[PATTERN][1] = 'ole'
                              matchobj[OTHER_VERBS] = False
                              matchobj[POLARITY] = 'NEG'
                              matchobj[ANALYSIS_IDS] = []
                              matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbEi ) )
                              matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( clauseTokens[verbid[1]], verbEiJarel ) )
                              foundMatches.append( matchobj )
                              negPhraseWIDs.extend( [wid1, wid2] )
                              matchFound = True
              #
              #   1.X. Ei oska "ei" predikaadikonteksti m22rata (v6imalik, et ei eitatagi verbi,
              #        vaid hoopis nimis6nafraasi vms).
              #
              if not matchFound:
                  wid1 = tokenJson[WORD_ID]
                  matchobj = { PHRASE: [wid1], PATTERN: ["ei"] }
                  matchobj[CLAUSE_IDX] = clauseID
                  # Leiame, kas j2rgneb s6nu, millega potentsiaalselt saaks eituse moodustada
                  matchobj[OTHER_VERBS] = \
                      any([ verbEiJarel.matches(clauseTokens[j]) for j in range(i+1, len(clauseTokens)) ])
                  matchobj[POLARITY] = 'NEG'
                  matchobj[ANALYSIS_IDS] = []
                  matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, [verbEi, verbEi2] ) )
                  foundMatches.append( matchobj )
                  negPhraseWIDs.extend( [wid1] )
                  matchFound = True
          elif verbAra.matches(tokenJson):
              # 
              #   2. "Ära" + Verb (käskivas, -ge, -gem, -gu, -tagu, -me)
              #
              #       Kui "ära"-le järgneb (osa)lauses veel teisi verbe, proovime 
              #      moodustada ära-fraasi esimese järgneva verbiga, mis ühildub:
              #        Nt.  Ärme_0 enam nii tee_0 !
              #             Ärge_0 palun minge_0 . 
              #             Ärge_0 ainult naerma puhkege_0 .
              #
              if i+1 < len(clauseTokens) and len(verbid) >= 2:
                  for verbIndex in verbid:
                      tokenJson2 = clauseTokens[ verbIndex ]
                      if tokenJson[WORD_ID] < tokenJson2[WORD_ID]:
                          # Teeme kindlaks, kas järgnev verb võib ühilduda 'ära'-ga:
                          analyses = _canFormAraPhrase( tokenJson, tokenJson2 )
                          if analyses:
                              wid1 = tokenJson[WORD_ID]
                              wid2 = tokenJson2[WORD_ID]
                              matchobj = { PHRASE: [wid1, wid2], PATTERN: ["ära", "verb"] }
                              matchobj[CLAUSE_IDX] = clauseID
                              if verbOle.matches(tokenJson2):
                                  matchobj[PATTERN][1] = 'ole'
                              matchobj[OTHER_VERBS] = (len(verbid) > 2)
                              matchobj[POLARITY] = 'NEG'
                              matchobj[ANALYSIS_IDS] = []
                              matchobj[ANALYSIS_IDS].append( analyses[0] )
                              matchobj[ANALYSIS_IDS].append( analyses[1] )
                              foundMatches.append( matchobj )
                              negPhraseWIDs.extend( [wid1, wid2] )
                              matchFound = True
                              break
                              #
                              #  Teadaolevad veakohad:  
                              #    yks koma vahel:  Ära_0 piina ennast , jäta_0 laps mulle.
                              #    (aga siin on p6hiliseks veaks puudulik morf analyys)
                              #
              #
              #   2.X. Ei oska "ära" predikaadikonteksti m22rata ...
              #
              if not matchFound:
                  wid1 = tokenJson[WORD_ID]
                  matchobj = { PHRASE: [wid1], PATTERN: ["ära"] }
                  matchobj[CLAUSE_IDX] = clauseID
                  matchobj[OTHER_VERBS] = (len(verbid) > 1)
                  #  Kui kontekstis on ka teisi verbe, võib ära täita hoopis määrsõna rolli, ja
                  # kuna eitusmustrid on välistatud, pole enam kindel, et tegu on eitusega;
                  matchobj[POLARITY] = '??'
                  matchobj[ANALYSIS_IDS] = []
                  matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbAra ) )
                  foundMatches.append( matchobj )
                  negPhraseWIDs.extend( [wid1] )
                  matchFound = True
          elif verbPole.matches(tokenJson):
              # 
              #  3. "Pole" + Verb (-nud)
              #
              if i+1 < len(clauseTokens):
                  tokenJson2 = clauseTokens[i+1]
                  if verbOleJarel.matches(tokenJson2):
                      wid1 = tokenJson[WORD_ID]
                      wid2 = tokenJson2[WORD_ID]
                      matchobj = { PHRASE: [wid1, wid2], PATTERN: ["pole", "verb"] }
                      matchobj[CLAUSE_IDX] = clauseID
                      if verbOle.matches(tokenJson2):
                          matchobj[PATTERN][1] = 'ole'
                      matchobj[OTHER_VERBS] = (len(verbid) > 2)
                      matchobj[POLARITY] = 'NEG'
                      matchobj[ANALYSIS_IDS] = []
                      matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbPole ) )
                      matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson2, verbOleJarel ) )
                      foundMatches.append( matchobj )
                      negPhraseWIDs.extend( [wid1, wid2] )
                      matchFound = True
              if not matchFound and i+1 < len(clauseTokens):
                  tokenJson2 = clauseTokens[i+1]
                  #
                  #   3.2. Heuristik: Kui "pole" j2rel on vahetult verb (-tud, -mas), ning m6lemad
                  #        paiknevad (osa)lause l6pus ning osalauses ongi vaid kaks verbi, loeme 
                  #        selle ka eituse fraasiks:
                  #          Nt.  Autode ostuhinda pole avalikustatud .
                  #               Skriptid näitavad veateateid , kui tingimused pole täidetud .
                  #               Aktsia- ja rahaturud on rahutud ning stabiilsust pole näha .
                  #               ... kas ehk kedagi liikumas_0 pole_0 , keda võiks asjasse pühendada ...
                  #
                  if len(verbid)==2 and verbOleJarelHeur2.matches(tokenJson2) and \
                     _isClauseFinal( tokenJson2[WORD_ID], clauseTokens ):
                      wid1 = tokenJson[WORD_ID]
                      wid2 = tokenJson2[WORD_ID]
                      matchobj = { PHRASE: [wid1, wid2], PATTERN: ["pole", "verb"] }
                      matchobj[CLAUSE_IDX] = clauseID
                      if verbOle.matches(tokenJson2):
                          matchobj[PATTERN][1] = 'ole'
                      matchobj[OTHER_VERBS] = False
                      matchobj[POLARITY] = 'NEG'
                      matchobj[ANALYSIS_IDS] = []
                      matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbPole ) )
                      matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson2, verbOleJarelHeur2 ) )
                      foundMatches.append( matchobj )
                      negPhraseWIDs.extend( [wid1, wid2] )
                      matchFound = True
                  #
                  #   3.3. Heuristik: Kui ongi vaid kaks verbi, ning "pole" j2rel on osalause l6pus
                  #        "nud", loeme selle samuti yheks fraasiks. 
                  #          Nt.
                  #              Ladina keel pole välja surnud .
                  #              Nii odavalt pole Eesti oma laevu kunagi välja andnud .
                  #              Tööga pole keegi rikkaks saanud .
                  #
                  if not matchFound and len(verbid)==2 and verbid[0] == i:
                      if verbOleJarel.matches( clauseTokens[verbid[1]] ) and \
                         _isClauseFinal( clauseTokens[verbid[1]][WORD_ID], clauseTokens ):
                          wid1 = tokenJson[WORD_ID]
                          wid2 = clauseTokens[verbid[1]][WORD_ID]
                          matchobj = { PHRASE: [wid1, wid2], PATTERN: ["pole", "verb"] }
                          matchobj[CLAUSE_IDX] = clauseID
                          matchobj[OTHER_VERBS] = False
                          if verbOle.matches( clauseTokens[verbid[1]] ):
                              matchobj[PATTERN][1] = 'ole'
                          matchobj[POLARITY] = 'NEG'
                          matchobj[ANALYSIS_IDS] = []
                          matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbPole ) )
                          matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( clauseTokens[verbid[1]], verbOleJarel ) )
                          foundMatches.append( matchobj )
                          negPhraseWIDs.extend( [wid1, wid2] )
                          matchFound = True
                  if not matchFound:
                      #
                      #  3.4. Heuristik: Kui 'pole'-le j2rgneb osalauses kusagil kaugemal -nud, 
                      #       mis ei saa olla fraasi eestäiend, siis loeme selle olema-verbiga 
                      #       kokkukuuluvaks;
                      #
                      seenNudVerbs = 0
                      for k in range(i+1, len(clauseTokens)):
                          tokenJson2 = clauseTokens[k]
                          if verb.matches(tokenJson2) and not verbInf.matches(tokenJson2):
                              #  Kui j6uame finiitverbini, siis katkestame otsingu
                              break
                          if sonaEga.matches(tokenJson2):
                              #  Kui j6uame 'ega'-ni, siis katkestame otsingu
                              break
                          if verbOleJarel.matches(tokenJson2):
                              seenNudVerbs += 1
                              #
                              #     Kui -nud verb eelneb vahetult m6nele teisele infiniitverbile, 
                              #  on v2ga t6en2oline, et -nud on peaverb "pole" otsene alluv ning 
                              #  pole eestäiend, nt:
                              #
                              #       kuid ta polnud_0 ka teatris õppinud_1 improviseerima ning
                              #       Ega me pole_0 siia tulnud_1 paastuma ja palvetama , "
                              #       ja Raul poleks_0 teda härrasmehena kodust välja tahtnud_1 ajada .
                              #       ma pole_0 iial kasutanud_1 keelatud aineid .
                              #
                              #    Kontrollime, et nud-ile j2rgneks infiniitverb, ning
                              #  vahel poleks teisi nud-verbe ...
                              #
                              if k+1 in verbid and verbInf.matches(clauseTokens[k+1]) and \
                                  seenNudVerbs < 2:
                                  wid1 = tokenJson[WORD_ID]
                                  wid2 = tokenJson2[WORD_ID]
                                  matchobj = { PHRASE: [wid1, wid2], PATTERN: ["pole", "verb"] }
                                  matchobj[CLAUSE_IDX] = clauseID
                                  if verbOle.matches(tokenJson2):
                                      matchobj[PATTERN][1] = 'ole'
                                  matchobj[OTHER_VERBS] = True
                                  matchobj[POLARITY] = 'NEG'
                                  matchobj[ANALYSIS_IDS] = []
                                  matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbPole, discardAnalyses = verbInf ) )
                                  matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson2, [verbOleJarel] ) )
                                  foundMatches.append( matchobj )
                                  negPhraseWIDs.extend( [wid1, wid2] )
                                  matchFound = True
                                  #_debugPrint( (('+'.join(matchobj[PATTERN]))+' | '+_getJsonAsTextString(clauseTokens, markTokens = [ matchobj[PHRASE] ] )))
                                  break
                              #
                              #     Kui -nud verb eelneb vahetult m6nele adverbile, mis t6en2oliselt
                              #  on lauses iseseisev s6na (nt 'ka', 'siis', 'veel', 'juba' jms), siis ei 
                              #  saa -nud olla eest2iend ning peaks olema peaverb "pole" otsene alluv, nt:
                              #
                              #       Varem pole_0 ma kirjandile jõudnud_0 aga sellepärast ,
                              #       " Ma pole_0 Belgias saanud_0 isegi parkimistrahvi ! "
                              #       Polnud_0 õllelembid saanud_0 veel õieti jõuluvaimu sisse elada ,
                              #       mulle polnud_0 Väike jõudnud_0 ju veel rääkida ,
                              #
                              #   Lisaks kontrollime, et vahel poleks teisi -nud verbe;
                              #
                              elif k+1<len(clauseTokens) and _phraseBreakerAdvs.matches(clauseTokens[k+1]) and \
                                  seenNudVerbs < 2:
                                  wid1 = tokenJson[WORD_ID]
                                  wid2 = tokenJson2[WORD_ID]
                                  matchobj = { PHRASE: [wid1, wid2], PATTERN: ["pole", "verb"] }
                                  matchobj[CLAUSE_IDX] = clauseID
                                  if verbOle.matches(tokenJson2):
                                      matchobj[PATTERN][1] = 'ole'
                                  matchobj[OTHER_VERBS] = (len(verbid) > 2)
                                  matchobj[POLARITY] = 'NEG'
                                  matchobj[ANALYSIS_IDS] = []
                                  matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbPole, discardAnalyses = verbInf ) )
                                  matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson2, [verbOleJarel] ) )
                                  foundMatches.append( matchobj )
                                  negPhraseWIDs.extend( [wid1, wid2] )
                                  matchFound = True
                                  #_debugPrint( (('+'.join(matchobj[PATTERN]))+' | '+_getJsonAsTextString(clauseTokens, markTokens = [ matchobj[PHRASE] ] )))
                                  break
              if not matchFound and _isClauseFinal( tokenJson[WORD_ID], clauseTokens ):
                  #
                  #   3.5. Heuristik: Kui "pole" on osalause l6pus, ning sellele eelneb vahetult
                  #        "nud", v6i eelneb vahetult tud/da/mas ning osalauses pole teisi verbe,
                  #        loeme liiteituseks:
                  #          Nt.
                  #              Huvitav ainult , miks ta mulle helistanud_0 pole_0 .
                  #              Mingit kuulsust ma küll kogunud_0 pole_0 .
                  #
                  if i-1 > -1:
                      tokenJson2 = clauseTokens[i-1]
                      if verbOleJarel.matches(tokenJson2) or (len(verbid)==2 and \
                         verbOleJarelHeur2.matches(tokenJson2)):
                          wid1 = tokenJson[WORD_ID]
                          wid2 = tokenJson2[WORD_ID]
                          matchobj = { PHRASE: [wid1, wid2], PATTERN: ["pole", "verb"] }
                          matchobj[CLAUSE_IDX] = clauseID
                          matchobj[OTHER_VERBS] = (len(verbid) > 2)
                          if verbOle.matches( tokenJson2 ):
                              matchobj[PATTERN][1] = 'ole'
                          matchobj[POLARITY] = 'NEG'
                          matchobj[ANALYSIS_IDS] = []
                          matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbPole ) )
                          matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson2, [verbOleJarel, verbOleJarelHeur2] ) )
                          foundMatches.append( matchobj )
                          negPhraseWIDs.extend( [wid1, wid2] )
                          matchFound = True
              #
              #   3.X. Ei oska "pole" predikaadikonteksti m22rata ...
              #
              if not matchFound:
                  wid1 = tokenJson[WORD_ID]
                  matchobj = { PHRASE: [wid1], POLARITY: 'NEG', PATTERN: ["pole"] }
                  matchobj[CLAUSE_IDX]   = clauseID
                  matchobj[OTHER_VERBS] = (len(verbid) > 1)
                  matchobj[ANALYSIS_IDS] = []
                  matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbPole ) )
                  foundMatches.append( matchobj )
                  negPhraseWIDs.extend( [wid1] )
                  matchFound = True
          # ===================================================================
          #      V e r b i   j a a t u s
          # ===================================================================
          elif tokenJson[WORD_ID] not in negPhraseWIDs and verb.matches(tokenJson) and \
               not verbInf.matches(tokenJson):
              #
              #  Tavaline verb ( mitte olema-verb )
              #
              if not verbOle.matches( tokenJson ):
                  wid1 = tokenJson[WORD_ID]
                  matchobj = { PHRASE: [wid1], POLARITY: 'POS', PATTERN: ["verb"] }
                  matchobj[CLAUSE_IDX]   = clauseID
                  matchobj[OTHER_VERBS] = (len(verbid) > 1)
                  matchobj[ANALYSIS_IDS] = []
                  matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verb, discardAnalyses = verbInf ) )
                  foundMatches.append( matchobj )
                  posPhraseWIDs.extend( [wid1] )
                  matchFound = True
              #
              #  Olema-verb
              #
              else:
                  if (len(verbid) == 1):
                      #  Yksik olema-verb
                      wid1 = tokenJson[WORD_ID]
                      matchobj = { PHRASE: [wid1], POLARITY: 'POS', PATTERN: ["ole"] }
                      matchobj[CLAUSE_IDX]   = clauseID
                      matchobj[OTHER_VERBS] = False
                      matchobj[ANALYSIS_IDS] = []
                      matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbOle, discardAnalyses = verbInf ) )
                      foundMatches.append( matchobj )
                      posPhraseWIDs.extend( [wid1] )
                      matchFound = True
                  else:
                      #
                      #  Lauses on veel verbe: yritame teha kindlaks, kas tegu on liitkonstruktsiooniga
                      #
                      if i+1 < len(clauseTokens):
                          if verbOleJarel.matches(clauseTokens[i+1]) and \
                             clauseTokens[i+1][WORD_ID] not in negPhraseWIDs:
                              #
                              #   Vahetult j2rgnev '-nud':
                              #       Ta ise on_0 kasutanud_0 mitme turvafima teenuseid .
                              #       Luule on_0 võtnud_0 Linnutee kuju .
                              #       Õhtul oli_0 olnud_0 org , aga hommikul järv .
                              #
                              tokenJson2 = clauseTokens[i+1]
                              wid1 = tokenJson[WORD_ID]
                              wid2 = tokenJson2[WORD_ID]
                              matchobj = { PHRASE: [wid1, wid2], PATTERN: ["ole", "verb"] }
                              matchobj[CLAUSE_IDX] = clauseID
                              if verbOle.matches(tokenJson2):
                                  matchobj[PATTERN][1] = 'ole'
                              matchobj[OTHER_VERBS] = (len(verbid) > 2)
                              matchobj[POLARITY] = 'POS'
                              matchobj[ANALYSIS_IDS] = []
                              matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbOle, discardAnalyses = verbInf ) )
                              matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson2, verbOleJarel ) )
                              #matchobj[PATTERN][1] += '??'
                              foundMatches.append( matchobj )
                              posPhraseWIDs.extend( [wid1, wid2] )
                              matchFound = True
                              #
                              #  NB! See reegel võib eksida eksistentsiaallausete korral,
                              #  mis, tõsi kyll, tunduvad olevat mittesagedased:
                              #        Põlvamaal oli_0 möödunud_0 nädala teine pool traagiline .
                              #        Kevadisel läbivaatusel oli_0 kogenud_0 mesinik abiks .
                              #
                          elif len(verbid)==2:
                              otherVerbIndex = verbid[1] if verbid[0]==i else verbid[0]
                              otherVerb = clauseTokens[ otherVerbIndex ]
                              #
                              #   Osalauses ongi vaid kaks verbi ning 'nud/tud/mas' on osalause 
                              #   l6pus:
                              #        Söögimaja ja kiriku uksed olid_0 suletud_0 ,
                              #        Nööp on_0 olemas_0 , kunagi õmmeldakse mantel ka külge !
                              #        Naine oli_0 Kalevi selleni viinud_0 .
                              #        Etnofuturismi esivanemaid on_0 veel vähe uuritud_0 .
                              #
                              if (verbOleJarel.matches(otherVerb) or verbOleJarelHeur2.matches(otherVerb)) and \
                                 _isClauseFinal( otherVerb[WORD_ID], clauseTokens ) and \
                                 otherVerb[WORD_ID] not in negPhraseWIDs:
                                  wid1 = tokenJson[WORD_ID]
                                  wid2 = otherVerb[WORD_ID]
                                  #
                                  #   Siin v6ib tekkida vigu/kaheldavaid kohti, kui kahe s6na vahel on 
                                  #   sides6nu/punktuatsiooni/teatud_adverbe, n2iteks:
                                  #        on_0 kaasasündinud või elu jooksul omandatud_0
                                  #        Mariboris oli_0 äkki medal käes ja Tallinnas 240kilone Ruano võidetud_0
                                  #        Mina olen_0 päritolult põhjaeestlane , 50 aastat Põhja-Eestis elanud_0 .
                                  #   J2tame sellistel puhkudel yhtse verbifraasina eraldamata ...
                                  #
                                  if not _isSeparatedByPossibleClauseBreakers( clauseTokens, tokenJson[WORD_ID], otherVerb[WORD_ID], True, True, True):
                                      matchobj = { PHRASE: [wid1, wid2], PATTERN: ["ole", "verb"] }
                                      matchobj[CLAUSE_IDX] = clauseID
                                      if verbOle.matches(otherVerb):
                                          matchobj[PATTERN][1] = 'ole'
                                      matchobj[OTHER_VERBS] = (len(verbid) > 2)
                                      matchobj[POLARITY] = 'POS'
                                      matchobj[ANALYSIS_IDS] = []
                                      matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbOle, discardAnalyses = verbInf ) )
                                      matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( otherVerb, [verbOleJarel, verbOleJarelHeur2] ) )
                                      foundMatches.append( matchobj )
                                      posPhraseWIDs.extend( [wid1, wid2] )
                                      matchFound = True
                              elif (verbOleJarel.matches(otherVerb) or verbOleJarelHeur2.matches(otherVerb)) and \
                                    otherVerb[WORD_ID] not in negPhraseWIDs and \
                                    i+1 == otherVerbIndex:
                                    #
                                    #   Osalauses ongi vaid kaks verbi ning 'nud/tud/mas' j2rgneb vahetult
                                    #   olema verbile (umbisikuline kõneviis):
                                    #        Oktoobris-detsembris 1944. a on_0 registreeritud_0 318 haigusjuhtu .
                                    #        Enamik uuringuid on_0 korraldatud_0 täiskasvanutel .
                                    #        Graafikud on_0 tehtud_0 programmis Exel 2003 .
                                    #   Üsna sagedane just teadustekstides;
                                    #
                                      wid1 = tokenJson[WORD_ID]
                                      wid2 = otherVerb[WORD_ID]
                                      matchobj = { PHRASE: [wid1, wid2], PATTERN: ["ole", "verb"] }
                                      matchobj[CLAUSE_IDX] = clauseID
                                      if verbOle.matches(otherVerb):
                                          matchobj[PATTERN][1] = 'ole'
                                      matchobj[OTHER_VERBS] = (len(verbid) > 2)
                                      matchobj[POLARITY] = 'POS'
                                      matchobj[ANALYSIS_IDS] = []
                                      matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbOle, discardAnalyses = verbInf ) )
                                      matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( otherVerb, [verbOleJarel, verbOleJarelHeur2] ) )
                                      foundMatches.append( matchobj )
                                      posPhraseWIDs.extend( [wid1, wid2] )
                                      matchFound = True
                                      #
                                      #   Kuna '-tud' võib potentsiaalselt olla ka eestäiend, võib tekkida 
                                      #   ka vigu:
                                      #      Tema tegevuses on_0 teatud_0 plaan ehk tegevuskava .
                                      #      Kõige tähtsam võistlusala on_0 kombineeritud_0 võistlus .
                                      #      Lõpetuseks on_0 grillitud_0 mereandide valik .
                                      #
                          #
                          #    Kui olema-verbile j2rgneb osalauses kusagil kaugemal -nud, mis ei saa
                          #   olla fraasi eestäiend, siis loeme selle olema-verbiga kokkukuuluvaks;
                          #
                          if not matchFound:
                              seenNudVerbs = 0
                              for k in range(i+1, len(clauseTokens)):
                                  tokenJson2 = clauseTokens[k]
                                  if verb.matches(tokenJson2) and not verbInf.matches(tokenJson2):
                                      #  Kui j6uame finiitverbini, siis katkestame otsingu
                                      break
                                  if sonaEga.matches(tokenJson2):
                                      #  Kui j6uame 'ega'-ni, siis katkestame otsingu
                                      break
                                  if verbOleJarel.matches(tokenJson2):
                                      seenNudVerbs += 1
                                      #
                                      #     Kui -nud verb eelneb vahetult m6nele teisele infiniitverbile, 
                                      #  on v2ga t6en2oline, et -nud on peaverb "olema" otsene alluv ning 
                                      #  pole eestäiend, nt:
                                      #
                                      #       Midagi niisugust olin_0 ma kogu aeg lootnud_1 leida .
                                      #       siis varem või hiljem on_0 ta pidanud_1 taanduma
                                      #       siis oleks_0 ta mingisuguse plaani tõesti võinud_1 koostada
                                      #       jälle on_0 ühest investeeringust saanud_1 surnud kapital
                                      #
                                      #    Kontrollime, et nud-ile j2rgneks infiniitverb, ning
                                      #  vahel poleks teisi nud-verbe ...
                                      #
                                      if k+1 in verbid and verbInf.matches(clauseTokens[k+1]) and \
                                         seenNudVerbs < 2:
                                          wid1 = tokenJson[WORD_ID]
                                          wid2 = tokenJson2[WORD_ID]
                                          matchobj = { PHRASE: [wid1, wid2], PATTERN: ["ole", "verb"] }
                                          matchobj[CLAUSE_IDX] = clauseID
                                          if verbOle.matches(tokenJson2):
                                              matchobj[PATTERN][1] = 'ole'
                                          matchobj[OTHER_VERBS] = True
                                          matchobj[POLARITY] = 'POS'
                                          matchobj[ANALYSIS_IDS] = []
                                          matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbOle, discardAnalyses = verbInf ) )
                                          matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson2, [verbOleJarel] ) )
                                          foundMatches.append( matchobj )
                                          posPhraseWIDs.extend( [wid1, wid2] )
                                          matchFound = True
                                          #_debugPrint( (('+'.join(matchobj[PATTERN]))+' | '+_getJsonAsTextString(clauseTokens, markTokens = [ matchobj[PHRASE] ] )))
                                          break
                                          #
                                          # Probleemset:
                                          #  *) Kui kaks -nud-i on kõrvuti, võib minna valesti, kui pimesi siduda 
                                          #     esimene, näiteks:
                                          #          küllap ta oli_0 siis ka alati armunud_0 olnud .
                                          #          Eksamikomisjon oli_0 veidi ehmunud_0 olnud ,
                                          #          Samuti on_0 mitmed TTga õnnetuses osalenud_0 lausunud ,
                                          #
                                      #
                                      #     Kui -nud verb eelneb vahetult m6nele adverbile, mis t6en2oliselt
                                      #  on lauses iseseisev s6na (nt 'ka', 'siis', 'veel', 'juba' jms), siis ei 
                                      #  saa -nud olla eest2iend ning peaks olema peaverb "olema" otsene alluv, nt:
                                      #
                                      #       Kasiinodega on_0 rikkaks saanud_1 siiski vaid hõimud ,
                                      #       See näitaja on_0 jällegi tõusnud_1 ainult Hansapangal .
                                      #       Me oleme_0 tegelikult Kristiga ikka laval laulnud_1 ka .
                                      #       Georg Ots on_0 noorte hulgas tõusnud_1 küll sümboli staatusesse
                                      #
                                      #    Lisaks kontrollime, et vahel poleks teisi -nud verbe;
                                      #
                                      elif k+1<len(clauseTokens) and _phraseBreakerAdvs.matches(clauseTokens[k+1]) and \
                                           seenNudVerbs < 2:
                                          wid1 = tokenJson[WORD_ID]
                                          wid2 = tokenJson2[WORD_ID]
                                          matchobj = { PHRASE: [wid1, wid2], PATTERN: ["ole", "verb"] }
                                          matchobj[CLAUSE_IDX] = clauseID
                                          if verbOle.matches(tokenJson2):
                                              matchobj[PATTERN][1] = 'ole'
                                          matchobj[OTHER_VERBS] = (len(verbid) > 2)
                                          matchobj[POLARITY] = 'POS'
                                          matchobj[ANALYSIS_IDS] = []
                                          matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbOle, discardAnalyses = verbInf ) )
                                          matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson2, [verbOleJarel] ) )
                                          foundMatches.append( matchobj )
                                          posPhraseWIDs.extend( [wid1, wid2] )
                                          matchFound = True
                                          #_debugPrint( (('+'.join(matchobj[PATTERN]))+' | '+_getJsonAsTextString(clauseTokens, markTokens = [ matchobj[PHRASE] ] )))
                                          break
                                          #
                                          #  Probleemset:
                                          #   *) kui -nud-ile vahetult eelneb sidend, v6ib -nud kuuluda v2ljaj2ttelise 
                                          #      olema verbi juurde:
                                          #          Mart Timmi on_0 maakonna üks edukamaid talupidajaid ja olnud_1 ka taluseltsi esimees .
                                          #          Ulvi oli_0 ometigi loov kunstnik ega võinud_1 ka eraelus esineda epigoonina .
                                          #
                      if i-1 > -1 and not matchFound:
                          if _isClauseFinal( tokenJson[WORD_ID], clauseTokens ) and \
                             clauseTokens[i-1][WORD_ID] not in negPhraseWIDs and \
                             (verbOleJarel.matches(clauseTokens[i-1]) or (len(verbid)==2 and \
                             verbOleJarelHeur2.matches(clauseTokens[i-1]))) and \
                             clauseTokens[i-1][WORD_ID] not in negPhraseWIDs:
                              #
                              #   Vahetult eelnev '-nud':
                              #       Ma õpetan õievalemeid , mida ma ise viiendas klassis vihanud_0 olin_0 .
                              #       ... siis kui nemad juba ära sõitnud_0 on_0 ...
                              #   Vahetult eelnev 'tud/mas' ning osalauses pole rohkem verbe:
                              #       Ja sellepärast jäigi kõik nii , nagu kirjutatud_0 oli_0 .
                              #
                              tokenJson2 = clauseTokens[i-1]
                              wid1 = tokenJson[WORD_ID]
                              wid2 = tokenJson2[WORD_ID]
                              matchobj = { PHRASE: [wid1, wid2], PATTERN: ["ole", "verb"] }
                              matchobj[CLAUSE_IDX] = clauseID
                              if verbOle.matches(tokenJson2):
                                  matchobj[PATTERN][1] = 'ole'
                              matchobj[OTHER_VERBS] = (len(verbid) > 2)
                              matchobj[POLARITY] = 'POS'
                              matchobj[ANALYSIS_IDS] = []
                              matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbOle, discardAnalyses = verbInf ) )
                              matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson2, [verbOleJarel, verbOleJarelHeur2] ) )
                              #matchobj[PATTERN][1] += '??'
                              foundMatches.append( matchobj )
                              posPhraseWIDs.extend( [wid1, wid2] )
                              matchFound = True
                      if not matchFound:
                          #
                          #    Ei oska m22rata, millega t2pselt "olema" verb seotud on ...
                          #
                          wid1 = tokenJson[WORD_ID]
                          matchobj = { PHRASE: [wid1], POLARITY: 'POS', PATTERN: ["ole"] }
                          matchobj[CLAUSE_IDX]   = clauseID
                          matchobj[OTHER_VERBS] = True
                          matchobj[ANALYSIS_IDS] = []
                          matchobj[ANALYSIS_IDS].append( _getMatchingAnalysisIDs( tokenJson, verbOle, discardAnalyses = verbInf ) )
                          #matchobj[PATTERN][0]+='??'
                          foundMatches.append( matchobj )
                          posPhraseWIDs.extend( [wid1] )
                          matchFound = True
      return foundMatches