
    	i                     P   d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlT ddl	m
Z
 ddlmZ dd	lmZ dd
lmZ  G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d d          ZdS )    N)Enum)Path)fields)*   )
exceptions)jqlLexer)	jqlParser)
jqlVisitorc                   j    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdS )Operator=!=><>=<=INzNOT IN~z!~ISzIS NOTWASzWAS INz
WAS NOT INzWAS NOTCHANGEDILIKEz	NOT ILIKEEXISTSz
NOT EXISTSHISTORYzNOT HISTORYN)__name__
__module____qualname__EQUALS
NOT_EQUALSGTLT	GT_EQUALS	LT_EQUALSr   NOT_INCONTAINSDOES_NOT_CONTAINr   IS_NOTr   WAS_IN
WAS_NOT_INWAS_NOTr   r   	NOT_ILIKEr   
NOT_EXISTSr   NOT_HISTORY     ./modules/jira/jql/parser.pyr   r      s        FJ	B	BII	BFH	BF
CFJGGEIFJGKKKr0   r   c                   "    e Zd ZdZdZdZdZdZdS )OperandEMPTYVALUEFUNCTIONLISTN)r   r   r   r4   r5   r6   r7   NONEr/   r0   r1   r3   r3   +   s'        EEHDDDDr0   r3   c                   "    e Zd ZdZdZdZdZdZdS )FunctionNOW	MEMBERSOFCURRENTUSERSTANDARDISSUETYPESSUBTASKISSUETYPESN)r   r   r   now	membersOfcurrentUserstandardIssueTypessubTaskIssueTypesr/   r0   r1   r:   r:   3   s+        
CIK-+r0   r:   c                   *    e Zd ZdZdZdZdZdZdZdZ	dS )	PredicateOperatorAFTERBEFOREBYDURINGONFROMTON)
r   r   r   rG   rH   rI   rJ   rK   rL   rM   r/   r0   r1   rF   rF   ;   s1        EF	BF	BD	BBBr0   rF   c                   n    e Zd Zej        ej        ej        ej        fZej	        fZ
ej        ej        fZdS )PredicateOperatorsN)r   r   r   rF   rG   rH   rK   rJ   DATErI   USERrL   rM   r5   r/   r0   r1   rO   rO   E   sM          	D  "DEEEr0   rO   c                       e Zd ZdZdZdZdS )	ValueModeFIELDUSER_PREDICATEDATE_PREDICATEN)r   r   r   rT   rU   rV   r/   r0   r1   rS   rS   S   s        E%N%NNNr0   rS   c            	           e Zd Zi ddej        j        ddgddddej        j        ddddej        j        ddd	d	ej        j        d
dddd
iddd
iddej        j	        d
dddej        j
        ddgddddej        j        ddgdddej        j        ddddej        j        ddddej        j        ddgdddej        j        dddd
g ddddej        j        ddgddddd
iddej        j        ddgdg dd i d!dd
id"dd
id#d$ej        j        dd%gddd&dd
id'dd
id(dd
id)d
d*gdd+d,ej        j        ddgddd-d.ej        j        ddgdd/gd d0dd
id1d1ej        j        ddd2d2ej        j        d3gg d4dd5d6dd
id7d
d8gdd9d9ej        j        ddd:dd
id;dd
ii d<dd
id=d=ej        j        ddgddd>d>ej        j        dd?gdd@d@ej        j        ddgddAgd dBdBej        j        dCgddgdd5dDdDej        j        dddEdEej        j        dddFdd
idGdGej        j        ddHgddIdIej        j        ddJgddKdd
idLdd
idMdNej        j        dddOdd
idPdd
idQdd
idRdd
iZ fdSZdT Z dUe!fdVZ"e#dW             Z$dX Z%dY Z&dZ Z'd[ Z(d\ Z)dd^Z*dd_Z+dd`Z,ddaZ-db Z.dc Z/dd Z0dee1j2        fdfZ3dee1j4        fdgZ5dee1j6        fdhZ7dee1j8        fdiZ9dee1j:        fdjZ;dee1j<        fdkZ=dee1j>        fdlZ?dee1j@        fdmZAdee1jB        fdnZCdee1jD        fdoZEdee1jF        fdpZGdee1jH        fdqZIdee1jJ        fdrZKdee1jL        fdsZMdee1jN        fdtZOdee1jP        fduZQdee1jR        fdvZSdee1jT        fdwZUdee1jV        fdxZWdee1jX        fdyZYdee1jZ        fdzZ[dee1j\        fd{Z]dee1j^        fd|Z_dee1j`        fd}Zadee1jb        fd~Zcdee1jd        fdZedee1jf        fdZgdee1jh        fdZidee1jj        fdZkdee1jl        fdZmdee1jn        fdZodee1jp        fdZqdee1jr        fdZsdee1jt        fdZudee1jv        fdZwdee1jx        fdZydee1jz        fdZ{ xZ|S )JQLaffectedversionext_idnameT)r[   	cmf_field	search_by	supported	approvals)r[   r\   r^   assigneeattachmentsFcategoryr^   zchange-gating-typecomment	componentcreatedcreateddate)r[   r\   r^   aliasescreatordescriptiondueduedateenvironmentfilter)requestsavedfiltersearchrequest)r^   rg   
fixversionhierarchylevelissuekeycode)idissuekey)r[   r\   r]   r^   rg   	issueLinkissueLinkTypelabelstagsalias
lastViewedlevelorganizationsoriginalEstimatetimeoriginalestimateparentparent_taskz	epic linkz"epic link"u   ссылка на эпикparentprojectpriorityproject
CmfProject)rZ   task_code_prefixrt   r[   )r[   r\   modelsr]   r^   projecttyperemainingestimatetimeestimatereporterzrequest-channel-typezrequest-last-activity-timezrequest type
resolutionresolvedresolutiondatesprintu   спринтstatusCmfStatusCodesummarytext	timespenttype	issuetypeupdatedupdateddatevotervoteswatcher
spectatorsworklogAuthorworklogCommentworklogDate	workRatioc                     t                                                       d| _        g | _        d | _        d | _        t          j        | _        | 	                                 | 
                                 d S N%)super__init__source_hasherrors_current_field_current_predicate_operatorrS   rT   _value_mode_cache_users_cache_priorities)self	__class__s    r1   r   zJQL.__init__n  sl    "+/($?     r0   c                 V   t                      | _        g dg dg}t          j                            |dg          }|D ]O}|j        j                                        D ].\  }}| j                            t          |          |f           /Pt	          | j                  | _        dS )uF   
        Кеширует приоритеты системы
        )r[   r   r   )
cmf_importr   Nchoicesrm   r   N)
setpriorities_cacher   CmfCustFieldConfFieldlistr   valueitemsaddstr)r   filter_field_configsfield_configkvs         r1   r   zJQL._cache_prioritiesy  s     !$ &%%&&&
 499; : 
 
 * 	7 	7L$,288:: 7 71%))3q661+66667 !%T%: ; ;r0   r   c                     t          fd| j        D             d          }||S t          fd| j        D             d          }||S t          d d          )u  
        Получает приоритет из кеша

        Args:
            value (str): Имя или id приоритета.

        Returns:
            tuple (str, str): Кортеж, содержащий id и имя приоритета
        c              3   4   K   | ]}|d          k    |V  dS )r   Nr/   .0r   r   s     r1   	<genexpr>z+JQL._get_cached_priority.<locals>.<genexpr>  1      TT(x{e?S?SX?S?S?S?STTr0   Nc              3   4   K   | ]}|d          k    |V  dS )r   Nr/   r   s     r1   r   z+JQL._get_cached_priority.<locals>.<genexpr>  r   r0   u   Приоритет 'uP   ' не найден. Возможно он еще не импортирован.)nextr   	Exception)r   r   priority_tuples    ` r1   _get_cached_priorityzJQL._get_cached_priority  s     TTTTd&;TTT
 
 %!! TTTTd&;TTT
 
 %!!  Gu  G  G  G  H  H  	Hr0   c                     | j                                       }|s8t          t          fd| j                                                   d           }|S )Nc                 4    |                      dg           v S )Nrg   )get)fr[   s    r1   <lambda>z JQL._get_field.<locals>.<lambda>  s    daeeIr&:&:: r0   )field_mappingr   r   rm   values)clsr[   fields    ` r1   
_get_fieldzJQL._get_field  sg    !%%d++ 	::::%,,..   E r0   c                     t          t          j        j        |          rdS t          t          j        j        |dz             rdS dS )NT_idF)hasattrr   CmfTaskdp_model)r   
field_names     r1   _is_sortablezJQL._is_sortable  sD    6>*J77 	4V^,j5.@AA 	45r0   c                     |j         j         }|j        j        }|j                                                             ||          S N)startstopgetInputStreamgetText)r   ctxr   r   s       r1   	_get_textzJQL._get_text  s8    	x}y''))11%>>>r0   c                 X   i | _         t          t          j                                      d          }|                                sdS |                                D ]}|                                s|                    d          }|                                rt          |d          5 }|D ]_}t          
                    |          }|                    d          }|s|                    d          }|sK|| j         |j         d| <   `	 ddd           n# 1 swxY w Y   dS )uj   
        Кэширует данные пользователей из всех дампов Jira
        jira_raw_dataNz
users.jsonzr+r[   	accountId::)users_cacher   config
UPLOAD_DIRjoinpathexistsiterdiris_diropenjsonloadsr   r[   )r   	dump_path	hash_path
users_filer   row	user_datauser_keys           r1   r   zJQL._cache_users  s    *++44_EE	!! 	F"**,, 	V 	VI##%% "++L99J  "" 	V*d++ Vq  V V$(JJsOO	#,==#8#8' B'0}}['A'AH' %$LU(IN)H)Hh)H)HIIVV V V V V V V V V V V V V V V	V 	Vs   .A#DD"	%D"	c                 8   | j                             | j         d|           }|r|                    d          }dddd| dgdd	|gd
d	|gdd	|gg}t          j                            |          }|rt          |j                  S t          d| d          )Nr   emailAddressORrZ   LIKEz%::z::%loginr   emailr[   rm   u   Пользователь 'u%   ' не найден в системе)r   r   r   r   	CmfPersonr   rt   r   )r   r   r   r   users        r1   _get_user_codezJQL._get_user_code  s     $((D,<)J)J)J)JKK	 	5 }}^44Hv2X2223gx(gx(Wh'
 ##7#33 	jty>>!hhhhiiir0   c                    g }d}t           j        g g d}d }d }|D ]z}|d         }		 |d         }
|
t           j        k    r|s|                    |           d}n|
t           j        k    rC|d                             |d                    |d                             |d                    n|
t           j        k    r|d         }|d         t
          j        t
          j        fv r;|t          j	        k    r+t          j        d	|j         d
|d         j         d          |t          j        k    r|}|t          j        k    r|}-|                    |           D# t           $ r+}| j                            d|	 d|            Y d }~td }~ww xY w|d         r|                    |           |r|s|                    |           |r|s|                    |           |st%          d          |S )NFr   ubql2bqlencodedr   Tr  r  function   Функция 'u=   ' не поддерживается с оператором ''   Операнд '$   ' удален из условия. u(   Список операндов пуст)r3   r5   r4   appendr6   r   r%   r*   r:   rA   r   ClauseErrorr[   r   rC   rD   r   r   
ValueError)r   operatoroperandsaggregated_operandshas_empty_operandvalue_operandstandard_issue_types_funcsubtask_issue_types_funcoperandencoded_operandoperand_typer	  excs                r1   _aggregate_list_operandszJQL._aggregate_list_operands  s    !!(BGG$(!#'  	 	G%i0O&v7=00, 1+227;;;,0)!W]22!'*11''2BCCC!%(//????!W%555&z2H )hox?R-SSS$(:::(4Sx} S S8@8I8OS S S    8#>>>4;1 !X%???3:0 '..w777   ""aaa\_aa       
  	6&&}555$ 	B-E 	B&&'@AAA# 	A,E 	A&&'?@@@" 	IGHHH""s$   DE4EE
F) FFNc                 .   |d         t           j        k    r|d         }|t          j        t          j        fv r||t          j        k    r)|t
          j        k    rt
          j        nt
          j        }n8|t          j        k    r(|t
          j        k    rt
          j        nt
          j        }d|j	         dS | j
        d          d|j	         }|d         t           j        k    r| d|d          }|r$| dd                    d |D                        }|S )	Nr   r	  parent_task  Emptyr[    r  c                     g | ]
}|d          S r  r/   r   	predicates     r1   
<listcomp>z+JQL._build_ubql2_clause.<locals>.<listcomp>3  s    *Z*Z*Z)9W+=*Z*Z*Zr0   )r3   r6   r:   rC   rD   r   r   r   r(   r   r   r8   join)r   r  r  
predicatesr	  opclauses          r1   _build_ubql2_clausezJQL._build_ubql2_clause%  s   6?g...z*HH79STTTx:::(0HK(?(?X_BB!;;;,4,C,CB6bh6666'/BB(.BB6?gl**33!133F 	^]]*Z*Zz*Z*Z*Z![![]]Fr0   c           	      .   g }g }|                     dg           }|D ]5}|d         t          j        k    r|                    |d                    5|d         t          j        k    r|d         }|t
          j        t
          j        fv r|t
          j        k    r)|t          j	        k    rt          j
        nt          j        }	n8|t
          j        k    r(|t          j	        k    rt          j        nt          j
        }	|                    d|	j         d           |                    |d                    |                    |d                    7|rA|                    | j        d          d|j         d	d
                    |           d           t!          |          dk    r	|d         }n<t!          |          dk    r)|t          j	        k    rdnd}
|
                    |          }|r$| dd                    d |D                        }|S )N
aggregatedr   r  r	  r  r  r[   r   z (, )r   r    OR  AND c                     g | ]
}|d          S r"  r/   r#  s     r1   r%  z1JQL._build_ubql2_list_clauses.<locals>.<listcomp>V  s    ,\,\,\IYw-?,\,\,\r0   )r   r3   r5   extendr6   r:   rC   rD   r   r   r   r(   r  r   r   r&  len)r   r  r  r'  operand_listclausessuboperands
suboperandr	  r(  	connectors              r1   _build_ubql2_list_clauseszJQL._build_ubql2_list_clauses7  s   kk,33% 	9 	9J&!W]22##Jw$78888F#w'777%j1 ;X=WXXX8#>>>,4,C,CX[[!X%???08HK0G0GX__X[NN#B"(#B#B#BCCCC ''
7(;<<<<##Jw$78888 	jNNd1&9hhHNhhdiiXdNeNehhhiiiw<<1ajGG\\A"*hk"9"9wInnW--G 	` __388,\,\Q[,\,\,\#]#]__Gr0   c                 V   | j         }|d         }|j        }d}|}	|	t          j        t          j        fv r(|	t          j        k    rt          j        nt          j        }|                    d          }
|                    d          }g }|
t          j	        k    rt          |t          j                  r)||j        dg}|t          j        k    rd|||j        |gg}|S |t          j        k    rt          j        }n|t          j        k    rt          j        }t          |d         t          j                  r(|t          j        k    rt          j        nt          j        }|j        }n3|
t          j        k    r|d         dk    rGdd	d
|                    dd          gdd
|                    dd          gd|j        |gd|j        |gg}|S t          |t          j                  r;d}|t          j        k    rt          j        }n|t          j        k    rt          j        }|t          j        t          j        fv rt-          |t.                    r|n|g}|j        }n>|
t          j        k    r-|d         }|t2          j        k    r|d         }|d         }n|t2          j        t2          j        fv r}d}|t2          j        k    r)|t          j        k    rt          j        nt          j        }n8|t2          j        k    r(|t          j        k    rt          j        nt          j        }d }|j        }nlt          |t          j                  rC|t          j        k    rt          j        }n|t          j        k    rt          j        }|d         g}n|d         }|j        }|	t          j        t          j        fv rg|
t          j        k    r|rdnd}d| ||g}d| ||g}d||g}|r|S |j        |	j        |gg}|r%|d                             d |D                        n|rdnd}| | ||g}|S )Nr\   Fr   r   r   r[   r   ru   r   r   rt   Tr	  	argumentsr   _code
from_valueto_valuec                     g | ]
}|d          S r  r/   r#  s     r1   r%  z)JQL._build_bql_clause.<locals>.<listcomp>  s    "P"P"P	9U#3"P"P"Pr0   z.code)r   
class_namer   r   r.   r   r%   r   r3   r4   
issubclassr   CmfStrr   r   r    
CmfM2MBaser-   r   r5   replace
CmfRelBase
isinstancer   r6   r:   rA   rC   rD   r8   r2  )r   r  r  r'  is_inner_clauser   r\   r   add_field_suffixoriginal_operatorr  operand_bqlr)  r	  field_suffixr>  r?  s                    r1   _build_bql_clausezJQL._build_bql_clauseZ  s>   #+&	)
 $!183G HHH&78;K&K&Kx{{QYQ`H{{6**kk%((7=(()V]33 *$hnb9x..#X^[AF
 x{**'HH00'2HeK0&2CDD g6>(/6Q6Qx22W_WfH#>W]**V}&&3 3 3C < <=S+"5"5c2">">?X^[9X^[9 i):;; 3'+$8?22#+;!X%888#+?X_===1;K1N1N"a++U`TaK#>W---z*H8---&z2)+6h98;UVVV*
x:::2:hk2I2IxxObHH!;;;6>(+6M6Mx22S[SbH"#>i):;; :8?22#+;!X%888#+?#.z#:";KK"-j"9K#>!183G HHHw|++*:Bww9<998[Q
5|55xM#Z:" '&&*,=,Ck]SF Rr
!!"P"PZ"P"P"PQQQ&6>77BL#3\33X{KFr0   c                    g }|                     dg           }|D ]-}|                    |                     ||d                     .t          |          dk    r	|d         }nEt          |          dk    r2|                    d|t
          j        t
          j        fv rdnd           |r"|g}|                    d |D                        |t
          j        t
          j	        fv r| j
        d	         j        |j        |g}|S )
Nr,  T)rJ  r   r   r   ANDc                     g | ]
}|d          S rB  r/   r#  s     r1   r%  z/JQL._build_bql_list_clauses.<locals>.<listcomp>  s    IIIIe,IIIr0   r\   )r   r  rO  r3  insertr   r   r   r2  r.   r   rC  r   )r   r  r  r'  r5  r6  r7  s          r1   _build_bql_list_clauseszJQL._build_bql_list_clauses  s   kk,33% 	_ 	_JNN411(JX\1]]^^^^w<<1ajGG\\ANN1h8;@P2Q&Q&QddW\]]] 	KiGNNIIjIIIJJJ((*>???*;7BHNT[\Gr0   c                    |t           j        k    rdd|d         g}n|t           j        k    rdd|d         g}nq|t           j        k    rdd|d         gdd|d         gg}nI|t           j        k    r]d                    d |d	         D                       }d
| d|d<   dd|d	         d         d         gdd|d	         d         d         gg}n|t           j        k    rh|d         t          j        k    rF|d         t          j
        k    rd|d         d         |d         d         g}ndd|d         d         g}npdd|d         g}nd|t          j        j        v rQ| j        d         dk    rdnd}|t           j        k    rd| d|d         g}|t           j        k    rd| d|d         g}|j         d|                    d           }||fS )u   
        Строит ubql2 и bql выражения предикатов

        Args:
            predicate_operator (_type_): оператор предиката
            operand (_type_): операнд предиката
        cmf_created_atr   r  r   r   r   r-  c                 8    g | ]}|                     d           S r"  )pop)r   r(  s     r1   r%  z(JQL._build_predicate.<locals>.<listcomp>  s"    NNNBwNNNr0   r  (r.  r  r   r   r   r	  
cmf_authorr<  r   zcmf_author.coder[   r   r=  r;  r>  r?  r   )rF   rG   rH   rK   rJ   r&  rI   r3   r6   r:   rA   rO   r5   r   r   rL   rM   rX  )r   predicate_operatorr  r  duringsuffixr  s          r1   _build_predicatezJQL._build_predicate  s$    !2!888#S'%.9CC#4#;;;#S'%.9CC#4#777!48!48CC  #4#;;;YYNN'*:MNNNOOF,6}}}GG!4)<Q)?)FG!4)<Q)?)FGCC  #4#777v'"222:&(*<<<'
)CWU^T_E`aCC'genZ.HICC(#wu~>#5#;#AAA $ 3F ;z I IWWrF!%6%;;;,F,,c75>B!%6%999*&**C@%+DDgkk'.B.BDDczr0   c                     g }|r|                     |           |r|                     |           |rd                    d |D                       nd}d |D             }||fS )u  
        Строит ubql2 и bql выражения запроса, объединяя условия поиска и сортировки

        Args:
            where (_type_): условия поиска
            order_by (_type_): условие сортировки
        r   c                     g | ]
}|d          S r"  r/   r   parts     r1   r%  z$JQL._build_query.<locals>.<listcomp>
  s    :::D$w-:::r0   r;  c                     g | ]
}|d          S rB  r/   ra  s     r1   r%  z$JQL._build_query.<locals>.<listcomp>  s    ---ttE{---r0   )r  r&  )r   whereorder_bypartsr  r  s         r1   _build_queryzJQL._build_query  s      	 LL 	#LL"""?DL::E:::;;;"--u---czr0   c                    t          |                                                                          }|| _        |t          j        j        v rt          j        | _	        n$|t          j
        j        v rt          j        | _	        |                     |                                          }d | _        t          j        | _	        |                     ||          \  }}|||d}|S )N)r  r  r  )rF   r   upperr   rO   rQ   r   rS   rU   r   rP   rV   visitjqlPredicateOperandrT   r^  )r   r   operator_ctxr[  r  r  r  results           r1   _get_predicatezJQL._get_predicate  s    .|/C/C/E/E/K/K/M/MNN ,>(!3!8!>>>(7D#5#:#@@@(7D**S446677 ,0($? **+=wGG
s +
 
 r0   r   c                 0   g | _         |                                r'|                     |                                          nd }|                                r'|                     |                                          nd }|                     ||          S r   )r   jqlWhererj  
jqlOrderByrg  )r   r   rd  re  s       r1   visitJqlQueryzJQL.visitJqlQuery*  sy    .1llnnF

3<<>>***$36>>3C3CM4::cnn..///  111r0   c                 Z     fd|                                 D             }d |D             }|s                                 S d                    d |D                       }t          |          dk    r|d         d         }n#t          |          dk    rdgd	 |D             z   }||d
S )Nc                 :    g | ]}                     |          S r/   rj  r   r)  r   s     r1   r%  z(JQL.visitJqlOrClause.<locals>.<listcomp>3  %    GGG&4::f%%GGGr0   c                     g | ]}||S r   r/   r   r)  s     r1   r%  z(JQL.visitJqlOrClause.<locals>.<listcomp>4      LLLF9K9K9K9Kr0   r/  c                     g | ]
}|d          S r"  r/   ry  s     r1   r%  z(JQL.visitJqlOrClause.<locals>.<listcomp>9  s    IIIVG_IIIr0   r   r   r  r   c                     g | ]
}|d          S rB  r/   ry  s     r1   r%  z(JQL.visitJqlOrClause.<locals>.<listcomp>=  s    FFFfF5MFFFr0   r  r  )jqlAndClausedefaultResultr&  r3  r   r   r5  valid_clausesr  r  s   `     r1   visitJqlOrClausezJQL.visitJqlOrClause2  s    GGGGC4D4D4F4FGGGLLgLLL 	(%%'''II=IIIJJ}"""5)CC!##&FFFFFFCs+++r0   c                 Z     fd|                                 D             }d |D             }|s                                 S d                    d |D                       }t          |          dk    r|d         d         }n#t          |          dk    rdgd	 |D             z   }||d
S )Nc                 :    g | ]}                     |          S r/   ru  rv  s     r1   r%  z)JQL.visitJqlAndClause.<locals>.<listcomp>B  rw  r0   c                     g | ]}||S r   r/   ry  s     r1   r%  z)JQL.visitJqlAndClause.<locals>.<listcomp>C  rz  r0   r0  c                     g | ]
}|d          S r"  r/   ry  s     r1   r%  z)JQL.visitJqlAndClause.<locals>.<listcomp>H  s    JJJ&fWoJJJr0   r   r   r  rQ  c                     g | ]
}|d          S rB  r/   ry  s     r1   r%  z)JQL.visitJqlAndClause.<locals>.<listcomp>L  s    GGGvVE]GGGr0   r}  )jqlNotClauser  r&  r3  r  s   `     r1   visitJqlAndClausezJQL.visitJqlAndClauseA  s    GGGGC4D4D4F4FGGGLLgLLL 	(%%'''JJMJJJKK}"""5)CC!##'GGGGGGCs+++r0   c                 .   |                                 p'|                                p|                                }|                     |          }|s|                                 S |j        r|j        j         dnd}| |d          |d         d}|S )Nr   r;  r  r  r}  )r  jqlSubClausejqlTerminalClauserj  r  is_notr   )r   r   
clause_ctxr)  prefixrm  s         r1   visitJqlNotClausezJQL.visitJqlNotClauseP  s    %%''X3+;+;+=+=XAVAVAXAX
J'' 	(%%'''*-*<CJO&&&&"1w11%=
 
 r0   c                     |                      |                                          }|s|                                 S d|d          d|d         d}|S )NrY  r  r.  r  r}  )rj  jqlOrClauser  )r   r   	or_clauserm  s       r1   visitJqlSubClausezJQL.visitJqlSubClause^  sg    JJs0011	 	(%%''' /7+...U#
 

 r0   c                    	 |                      |                                          | _        |                      |                                          }|d         }|d         }|                    d          }|                    d          t
          j        k    r;|                     |d         ||          }|                     |d         ||          }n:| 	                    |d         ||          }| 
                    |d         ||          }||d}|S # t          $ rR}	| j                            d|                     |           d	|	 d
           |                                 cY d }	~	S d }	~	ww xY w)Nr  r  r'  r   r  r  r}  u   Условие '&   ' удалено из запроса. .)rj  jqlFieldr   jqlTerminalClauseRhsr   r3   r7   r9  rT  r*  rO  r   r   r  r   r  )
r   r   
rhs_resultr  r  r'  ubql2_clause
bql_clauserm  r  s
             r1   visitJqlTerminalClausezJQL.visitJqlTerminalClausej  s   	("&**S\\^^"<"<DC$<$<$>$>??J!*-H +G#55J{{6""gl22#==hw>OQXZdee!99(5/7T^__

#778I7T^__!33HUOWjYY
 &! F
 M 	( 	( 	(Ks$..2E2Essmpsssttt%%''''''''	(s   DD 
E5#AE0*E50E5c                     |                      |                                          }|                                p'|                                p|                                }|                      |          }||d}|S Nr  r  )rj  jqlEqualsOperatorjqlEmptyjqlValuejqlFunctionr   r   r  operand_ctxr  rm  s         r1   visitJqlEqualsClausezJQL.visitJqlEqualsClause  st    ::c335566llnnKK#//:K:K**[)) !
 

 r0   c                    |                      |                                          }|                                p'|                                p|                                }|                      |          }|d         t
          j        k    r2|d         t          j        k    rt          j	        nt          j
        |d<   nd|d          d|d<   ||d}|S )Nr   r  r   r  )rj  jqlLikeOperatorr  r  r  r3   r4   r   r   r   r    r  s         r1   visitJqlLikeClausezJQL.visitJqlLikeClause  s    ::c113344llnnKK#//:K:K**[))6?gm++19%HN1R1RhooX`XkHUOO2222GEN !
 

 r0   c                     |                      |                                          }|                                p|                                }|                      |          }||d}|S r  )rj  jqlComparisonOperatorr  r  r  s         r1   visitJqlComparisonClausezJQL.visitJqlComparisonClause  sg    ::c7799::llnn9(9(9**[)) !
 

 r0   c                 &   |                      |                                          }|                                p|                                }|                      |          }|d         t          j        k    r"|                     ||d                   }||d<   no|d         t          j        k    rY|d         }|t          j	        k    rA|d         t          j        k    r+t          j        d|j         d|d         j         d          ||d	}|S )
Nr   r  r,  r	  r  r
  :   ' не поддерживается оператором 'r  r  )rj  jqlInOperatorjqlListr  r3   r7   r  r6   r:   rA   r   r%   r   r  r[   r   )r   r   r  r  r  r,  r	  rm  s           r1   visitJqlInClausezJQL.visitJqlInClause  s    ::c//1122kkmm8s'8'8**[))6?gl**66xATUUJ$.GL!!V_ 000z*H8---(5/X_2T2T ,Fx} F F-5e_-BF F F   !
 

 r0   c                     |                      |                                          }|                      |                                          }||d}|S r  )rj  jqlIsOperatorr  )r   r   r  r  rm  s        r1   visitJqlIsClausezJQL.visitJqlIsClause  sS    ::c//1122**S\\^^,, !
 

 r0   c                    |                      |                                          }|                                p'|                                p|                                }|                      |          }g }|                                D ].}|                      |          }|r|                    |           /|||d}|S )Nr  r  r'  )rj  jqlWasOperatorr  r  r  jqlWasPredicater  )	r   r   r  r  r  r'  predicate_ctxr$  rm  s	            r1   visitJqlWasClausezJQL.visitJqlWasClause  s    ::c002233llnnKK#//:K:K**[))
 0022 	- 	-M

=11I -!!),,, !$
 
 r0   c                    |                      |                                          }|                                p|                                }|                      |          }|d         t          j        k    r"|                     ||d                   }||d<   no|d         t          j        k    rY|d         }|t          j	        k    rA|d         t          j        k    r+t          j        d|j         d|d         j         d          g }|                                D ].}|                      |          }	|	r|                    |	           /|||d	}
|
S )
Nr   r  r,  r	  r  r
  r  r  r  )rj  jqlWasInOperatorr  r  r3   r7   r  r6   r:   rA   r   r*   r   r  r[   r   r  r  )r   r   r  r  r  r,  r	  r'  r  r$  rm  s              r1   visitJqlWasInClausezJQL.visitJqlWasInClause  sv   ::c224455kkmm8s'8'8**[))6?gl**66xATUUJ$.GL!!V_ 000z*H8---(72CxGZ2Z2Z ,Hx} H H-5g->-DH H H  
 
 0022 	- 	-M

=11I -!!),,, !$
 
 r0   c                 
   |                      |                                          }t          j        dg d}g }|                                D ].}|                      |          }|r|                    |           /|||d}|S )Nr;  r  r  )rj  jqlChangedOperatorr3   r8   jqlChangedPredicater  )r   r   r  r  r'  r  r$  rm  s           r1   visitJqlChangedClausezJQL.visitJqlChangedClause  s    ::c446677L
 
 
 4466 	- 	-M

=11I -!!),,, !$
 
 r0   c                 R    t          |                                          }||d}|S Nr}  r   r   r   r   r  rm  s       r1   visitJqlEqualsOperatorzJQL.visitJqlEqualsOperator  0    CKKMM**
 
 r0   c                     t          |                                          }||t           j        k    rt           j        nt           j        d}|S r  )r   r   r&   r   r,   r  s       r1   visitJqlLikeOperatorzJQL.visitJqlLikeOperator  sF    CKKMM**%-1B%B%B8>>HZ
 
 r0   c                 R    t          |                                          }||d}|S r  r  r  s       r1   visitJqlComparisonOperatorzJQL.visitJqlComparisonOperator'  r  r0   c                 x    t          |                     |                                                    }||d}|S r  )r   r   ri  r  s       r1   visitJqlInOperatorzJQL.visitJqlInOperator/  s@    DNN3//557788
 
 r0   c                     t          |                     |                                                    }||t           j        k    rt           j        nt           j        d}|S r  )r   r   ri  r   r   r    r  s       r1   visitJqlIsOperatorzJQL.visitJqlIsOperator7  sU    DNN3//557788&.(+&=&=8??8CV
 
 r0   c                     t          |                     |                                                    }||t           j        k    rt           j        nt           j        d}|S r  )r   r   ri  r   r   r.   r  s       r1   visitJqlWasOperatorzJQL.visitJqlWasOperator?  sW    DNN3//557788'/8<'?'?8##XEY
 
 r0   c                     t          |                     |                                                    }||t           j        k    rt           j        nt           j        d}|S r  )r   r   ri  r)   r   r.   r  s       r1   visitJqlWasInOperatorzJQL.visitJqlWasInOperatorG  sW    DNN3//557788'/8?'B'B8##H\
 
 r0   c                     t          |                     |                                                    }|t           j        d}|S r  )r   r   ri  r   r  s       r1   visitJqlChangedOperatorzJQL.visitJqlChangedOperatorO  sC    DNN3//557788#
 
 r0   c                     |                                 p'|                                p|                                }|                     ||          }|S r   )jqlDatePredicateOperatorjqlDateRangePredicateOperatorjqlUserPredicateOperatorrn  r   r   rl  r$  s       r1   visitJqlWasPredicatezJQL.visitJqlWasPredicateW  s[    ((** .0022.++-- 	
 ''\::	r0   c                     |                                 p;|                                p'|                                p|                                }|                     ||          }|S r   )r  r  r  jqlValuePredicateOperatorrn  r  s       r1   visitJqlChangedPredicatezJQL.visitJqlChangedPredicate`  sq    ((** /0022/++--/ ,,..	 	 ''\::	r0   c                     |                                 p|                                }|                     |          }t          |t          j                  r|                     |                                          }|sft          j	        
                    dd| gddg          }|st          j        d| d          |j        }|t          t          j        |          d}nq|d	         st          j        d
| d          nPt          |t          j                  r|t          t          j        |          d}nt          j        d| d          |d         }|                    dg           }|s1t'          |d          r!|j        r|                    |j                   |s1t'          |d          r!|j        r|                    |j                   ||d<   |                     |j                  |d<   |S )Ncaptionr   --r[   r   !   Неизвестное поле 'r  )r[   r\   r^   
   Поле '#   ' не поддерживаетсяr\   r   modelsortable)	jqlStringjqlCustomFieldrj  rI  r
   JqlStringContextr   lowerr   CmfCustFieldsgetr   UnknownFieldErrorr[   getattrr   
FieldErrorJqlCustomFieldContextr   r   r  r  r2  r   rC  )r   r   	field_ctxr   r   custom_fieldr\   field_modelss           r1   visitJqlNonNumberFieldzJQL.visitJqlNonNumberFieldj  s/   MMOO;s'9'9';';	ZZ	**
i!;<< 	bOOJ$4$4$6$677E j%277%w:@ &>  8     $ j$67h[e7h7h7hiii).
&!(!D!D  ;' j +,h,h,h,hiiij	9#BCC 	b"$V^Z@@ EE
 ./`S]/`/`/`aaa+&	yy2.. 	1G!<!< 	1 	1	000 	2H!=!= 	2)BR 	2	 0111&h --i.BCCjr0   c                     |                                 }| j         d| }d| d| j                                         }t          j                            ddd|gdd|ggddg	          }|st          j        d
| d| d          |j        S )Nr   cf__r   r[   r   rZ   r  r   +   Пользовательское поле '' (   ) не найдено)		POSNUMBERr   r  r   r  r  r   CustomFieldErrorr[   )r   r   field_idfield_ext_idr   r  s         r1   visitJqlCustomFieldzJQL.visitJqlCustomField  s    ==??*88h88@8@@d&6&<&<&>&>@@
*//*-7L1
 &> 0 
 
  	-ljllXlll     r0   c                     |                                 }|                    d          r|                    d          s*|                    d          r|                    d          r
|dd         }|S )Nr  "r   r@  )r   
startswithendswith)r   r   r   s      r1   visitJqlStringzJQL.visitJqlString  ss    {{}}__S!!	&*mmC&8&8	$$	)-s););	 ":Dr0   c                 *    |                                 S r   )r   r   r   s     r1   visitJqlNumberzJQL.visitJqlNumber  s    {{}}r0   c                 L    t           j        |                                dd d}|S )Nr4   r   r  r  r  )r3   r4   r   )r   r   rm  s      r1   visitJqlEmptyzJQL.visitJqlEmpty  s+    M{{}}	
 
 r0   c           	         d }|                                 p|                                }|                     |          }| j        }|d         }|j        }|                    dg           }|                    d          }	| j        }
	 | j        t          j	        k    r| 
                    |          }nb| j        t          j        k    r7t          j        d|          r|d| d}|d         dk    rd	| |d
<   n|}n| j        t          j        k    r |dk    r#|                     |          \  }}d| d|d}n|dk    rlt           j                            dd|gg dg          }|s+t           j                            ddd| dgg dg          }|rt%          |j                  }net)          |t*          j        t*          j        t*          j        f          r6t          j        d|          r|d| d}|d         dk    rd	| |d
<   n|}nd|v r| 
                    |          }n|r|	rd }dg}|D ]}|	D ][}|dk    r:|dv r| j         d| }n| j         d| }|                    ddd| dg           B|                    |d| g           \t6                              |                              |          }|r	|j        } nn>|j        r5|j        dv r,|rt6                               |dd          }n|}d| d|d}n|}|stC          d           nD# tB          $ r7}|
rtE          d!| d"|
 d#|           tE          d!| d$| d#|           d }~ww xY wtF          j$        | %                    |          tM          |          tN          urd| dn|d%         tM          |          tN          urt%          |          n|d
         d&}|S )'Nr\   r   r]   z^-?[0-9]+(w|d|h|m?)( +)?$now()r}  r   -znow()+r  r   r  
logic_typer[   r   )rZ   r   Nr   r|   r   z%"z"%r  r   rZ   )affected_versionsfix_versionsz
::version:r   r   	CmfChoice    )seplengthu;   Возможно объект не импортированu&   Не найдено значение 'u   ' в предикате 'z'. u   ' для поля 'r  r
  )(r  	jqlNumberrj  r   rC  r   r   r   rS   rU   r  rV   rematchrT   r   r   CmfLogicTyper   rt   rD  r   CmfDateTimeCmfDateCmfTimer   r  cmfutilget_model_by_namer  customwidgettranslit_stripr   r  r3   r5   r   r   dict)r   r   	new_value	value_ctxr   r   r\   r   r  r]   r[  priority_idpriority_namer  objr   field_modelsearch_fieldrZ   
choice_keyr  rm  s                         r1   visitJqlValuezJQL.visitJqlValue  s&   	MMOO6s}}	

9%%#+&	)
yy2..IIk**	!=^	z9#;;; //66		!Y%===88%@@ &!&.u! !I Qx3+;E+;+;	%( %II!Y_44++151J1J51Q1Q.K!5]!5!5!5*! !II  <//!'!4!8!8#We4222  "9 " "J & %+%8%<%<!(&.u... A 6 6 6$ &= & &
 " 9$'
$8$8		F,>PVP^+_`` ,&x <eDD *%*#25??% %	 !8s??/?/?/?Ie,$)		 L00 $ 3 3E : :II!  &i  &C#fG'3 " ",5 T TL+x77#-1V#V#V040@-S-SE-S-SFF040@-K-KE-K-KF ''=v===/Q R R R R 'g%z/R S S S S%77DDIIQXIYY "(+I!E" % &)*:{*K*K +%,%;%;! ##% &< & &

 &+
!-U)! !II
 !&I _ ]^^^_ 	z 	z 	z! z yUyy]oyytwyy   !!x%!x!xdn!x!xsv!x!xyyy	z M~~c**)-i)D)D%%%%%)T[J\%))__D%@%@3y>>>iPUFV	
 
 s   	JL) )
M*32M%%M*c                 "   	 |                      |                                          }n)# t          $ r}t          j        d|           d }~ww xY w|                                r'|                      |                                          ng }|                     |          }d }g }|t          j        k    rd}n)|t          j	        k    rd}n|t          j
        k    r| j        }t          |d         t          j                  r+t          j        d|j         d|d         j         d          g }	|D ]q}
t"          j                            dd	d
|
gdd
|
ggdd	g          }|r|	                    |j                   K| j                            d|
 d|j         d           r|	st          j        d|j         d          dd                    |	           d}d}|	}t0          j        |||                     |          |||dd}|S )Nu2   Функция не поддерживается. r  __G_CURRENT_USERr\   r
  u0   ' не поддерживается полем 'z' (M2M)r   rt   r   r[   r  r   u&   Не найдена аргумент 'u   ' функции 'r  u,   ' не содержит аргументовz
membersOf(r-  r.  	MEMBER_OF)r	  r<  )r   r	  r<  r  r  r  )rj  jqlFunctionNamer   r   FunctionErrorjqlArgumentListr   r:   r@   rB   rA   r   rD  r   rF  r[   rC  r   CmfPersonGroupr  r  rt   r   r&  r3   r6   )r   r   r	  r  r<  r  bql_functionbql_argumentsr   groupsargumentgrouprm  s                r1   visitJqlFunctionzJQL.visitJqlFunction0  s   	gzz#"5"5"7"788HH 	g 	g 	g*+e`c+e+efff	g :=9L9L9N9NVDJJs2244555TV	s##x|##"LL----LL+++'E%,f.?@@  .Jx} J J#(#5#@J J J   F%  -22(3(3
 !&> 3    MM%*----K&&mmm]e]jmmm      ./}(-/}/}/}~~~56!2!2555E&L"M $ "~~c**(* 

 

 s   '* 
AAAc                 h    t          |                                                                          S r   )r:   r   ri  r  s     r1   visitJqlFunctionNamezJQL.visitJqlFunctionNamel  s$    ++--...r0   c                     g }|                                 D ].}|                     |          }|r|                    |           /|S r   )jqlArgumentrj  r  )r   r   r<  argument_ctxr6  s        r1   visitJqlArgumentListzJQL.visitJqlArgumentListo  sT    	OO-- 	+ 	+Lzz,//H +  ***r0   c                    |                      |          }g }|                                D ]}|                      |          }	 |                     |          }|d         t          j        k    r|                    |d                    n|                    |           u# t          $ r*}| j                            d| d|            Y d }~d }~ww xY w|st          d| d          t          j        ||d}|S )Nr   r  r  r  u   Для операндов 'u   ' не найдены варианты для замены, возможно объекты еще не импортированы)r   r  r  )
r   
jqlOperandrj  r3   r7   r2  r  r   r   r  )	r   r   r  r  r  r  r  r  rm  s	            r1   visitJqlListzJQL.visitJqlListx  sR   ..%%>>++ 	 	K"nn[99O	**[116?gl22OOGJ$78888OOG,,,   ""aaa\_aa       
  	Zg Z Z Z   L 
 

 s   AB!!
C+ CCc                 |    |                                 p|                                }|                     |          S r   )r  r  rj  )r   r   r$  s      r1   visitJqlArgumentzJQL.visitJqlArgument  s.    MMOO6s}}	zz)$$$r0   c                    g }|                                 D ])}|                     |          }|r |j        |           *|s|                                 S dd                    d |D                        ddd |D             gd}|S )Nz	ORDER BY r-  c                     g | ]
}|d          S r"  r/   r   r   s     r1   r%  z'JQL.visitJqlOrderBy.<locals>.<listcomp>  s    +O+O+OuE'N+O+O+Or0   re  r   c                     g | ]
}|d          S rB  r/   rF  s     r1   r%  z'JQL.visitJqlOrderBy.<locals>.<listcomp>  s    %G%G%GueEl%G%G%Gr0   r}  )jqlSearchSortrj  r  r  r&  )r   r   r   crm  s        r1   visitJqlOrderByzJQL.visitJqlOrderBy  s    ""$$ 	& 	&AZZ]]F &f%%% 	(%%''' S+O+O+O+O+O!P!PRR%G%G%G%G%GH
 

 r0   c                    	 |                      |                                          }|d         }|d         }|d         st          j        d| d          |j        r| d|j        j         n||j        r|j        j        dk    r
d|j         n|j        d	}|S # t          $ rQ}| j        	                    d
| 
                    |           d|            |                                 cY d }~S d }~ww xY w)Nr[   r\   r  r  u4   ' не поддерживает сортировкуr   DESCr  r}  u%   Условие сортировки 'r  )rj  r  r   r  orderr   rC  r   r   r  r   r  )r   r   r   r   r\   rm  r  s          r1   visitJqlSearchSortzJQL.visitJqlSearchSort  s?   	(JJs||~~..EvJk*I$ { +,y,y,y,yzzz >AYVJ99999J58Yu39>U[C[C[19/111ajau F
 M 	( 	( 	(Kxs8K8Kxxsvxx   %%''''''''		(s   BB 
C9(AC4.C94C9r   )NF)}r   r   r   r   r   r  approvers_forresponsiblera   comments
componentsrV  rZ  r   deadliner  rt   r{   r   r   r   	cmf_ownerr   status_closed_atlistsr   r[   r  cmf_modified_atr   r   r   r   r   r   classmethodr   r   r   r   r  r  r*  r9  rO  rT  r^  rg  rn  r
   JqlQueryContextrr  JqlOrClauseContextr  JqlAndClauseContextr  JqlNotClauseContextr  JqlSubClauseContextr  JqlTerminalClauseContextr  JqlEqualsClauseContextr  JqlLikeClauseContextr  JqlComparisonClauseContextr  JqlInClauseContextr  JqlIsClauseContextr  JqlWasClauseContextr  JqlWasInClauseContextr  JqlChangedClauseContextr  JqlEqualsOperatorContextr  JqlLikeOperatorContextr  JqlComparisonOperatorContextr  JqlInOperatorContextr  JqlIsOperatorContextr  JqlWasOperatorContextr  JqlWasInOperatorContextr  JqlChangedOperatorContextr  JqlWasPredicateContextr  JqlChangedPredicateContextr  JqlNonNumberFieldContextr  r  r   r  r  JqlNumberContextr  JqlEmptyContextr  JqlValueContextr+  JqlFunctionContextr8  JqlFunctionNameContextr:  JqlArgumentListContextr>  JqlListContextrA  JqlArgumentContextrC  JqlOrderByContextrJ  JqlSearchSortContextrN  __classcell__)r   s   @r1   rX   rX   Y   s       R%9"F+	
 
R 	5
 
R 	3
 
R* 	!3
 
+R6 	
7R< 	
=RD 	0
 
ERP 	2"F+	
 
QR^ 	6%	
 
_Rl 	2
 
mRx 	!,
 
yRD 	0!{	
 
ERR 	!,
 
SR\ 	  
 
]Rn 	 4"F+	
 
oRz 	
{RB 	,"F+  

 

CR RX 	
YR^ 	
_Rf 	, '*	
 
gRr 	
sRx 	
yR~ 	
RD 	./
 
ERN 	!3"F+	
 
ORZ 	!3"F+45
 
[Rh 	
iRp 	0
 
qR| 	/#nGGG
 
}RN 	
ORV 	&'
 
WR` 	1
 
aRj 	!
kRp 	%'
qR R Rv 	
wR~ 	 2"F+	
 
RL 	8()	
 
MRZ 	-"F+&'
 
[Rj 	.&'"F+
 
kRz 	,
 
{RF 	,
 
GRR 	
SRZ 	2#}	
 
[Rh 	7%	
 
iRt 	
uRz 	
{RB 	 2
 
CRL 	
MRR 	
SRX 	
YR^ 	
_R RMh	! 	! 	! 	! 	!< < <(H# H H H H8 
 
 [
  ? ? ?
V V V2j j j&4# 4# 4#l   $! ! ! !F` ` ` `D   *) ) )V  &  62!: 2 2 2 2,I$@ , , , ,,Y%B , , , ,Y%B    
Y%B 
 
 
 
()*L ( ( ( (6
	(H 
 
 
 
i&D    "
I,P 
 
 
 
I$@    .	I$@ 	 	 	 	Y%B    &y'F    <)J    ,)*L    	(H    i.T    i&D    i&D    y'F    )J    9+N    	(H    I,P    &)*L & & & &P!y'F ! ! ! !()"<    )"<    !:    s!: s s s sj:I$@ : : : :x/	(H / / / /	(H    	 8    <%I$@ % % % %9#>    $(i&D ( ( ( ( ( ( ( (r0   rX   c                   >    e Zd Zd ZddZeddedefd            ZdS )JQLNormalizerc                 :    t                      | _        g | _        d S r   )rX   visitorr   )r   s    r1   r   zJQLNormalizer.__init__  s    uur0   Nc                 ,   |pd| j         _        t          j        |          }t	          |          }t          j        |          }t          |          }|                                }| j                             |          }| j         j	        | _	        |S r   )
r  r   antlr4InputStreamr	   CommonTokenStreamr
   jqlQueryrj  r   )	r   jqlr   input_streamlexerstreamparsertreerm  s	            r1   get_modifiedzJQLNormalizer.get_modified  s    #.#5# )#..&&)%006""  ##D))l)r0   r   r   c                 b   |pd}|                     d          r|                    dd          }|                    d          \  }}| d| }| d|                                 }t          j                            ddd	|gd
d	|gg          }|st          j        d| d| d          nt          
                    |                                          }|st          j        d| d          |                    d          st          j        d| d          |d         j        }|S )Nr   customfield_customfieldcfr  r   r   r[   r   rZ   r   r  r  r  r  r  r^   r  r  r\   )r  rG  splitr  r   r  r  r   r  rX   r   r  r   r  rC  )	r   r   r   r  r  r  r   r  mapped_fields	            r1   convert_fieldzJQLNormalizer.convert_field  sz   !(SN++ 	BMM-66E++c**KAx)77X77L!99K$5$5$7$799J!.33Wj1w5 4  L    1p*ppQYppp  
 >>%++--88L B 23_W\3_3_3_```!%%k22 B +,c,c,c,cddd)+6A
r0   r   )r   r   r   r   r  rX  r   r  r/   r0   r1   r~  r~    sj          
 
 
 
  3 S    [  r0   r~  )r  r  enumr   pathlibr   cmfr   cmf.includer;  r   r	   r
   r   r   r3   r:   rF   rO   rS   rX   r~  r/   r0   r1   <module>r     s   				                                                " " " " " "         t      4    d   , , , , ,t , , ,              & & & & & & & &f( f( f( f( f(* f( f( f(R+0 0 0 0 0 0 0 0 0 0r0   