
    mh                        d Z ddlmZ ddlZddlZddlZddlZddlZddlZdZ		 e
Z
n# e$ r eefZ
Y nw xY w	 e d Zn# e$ r d ZY nw xY w ed ed                    seZneZd	 Zd
 Z ej        e          Z ej                    j        sI ej                    Z ej        d          Ze                    e           e                    e           e                    ej                    dZ!dZ"dZ#e"e#z   Z$dZ%dZ&e%e&z   Z' G d de(          Z)dKd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.          Z0 G d de.          Z1i Z2d e2d!<   d"e2d#<   d$e2d%<    d&j3        dLi e2e2d'<    d(j3        dLi e2e2d)<    d*j3        dLi e2e2d+<    d,j3        dLi e2e2d-<    d.j3        dLi e2e2d/<   	  ej4        e2d)         ej5                  Z6 ej4        e2d-         ej5                  Z7 ej4        e2d/         ej8        ej5        z            Z9 ej4        d0ej:                  Z;d1 Z<dMd2Z=d3e2d4<    d5j3        dLi e2e2d6<    d7j3        dLi e2e2d8<    d9j3        dLi e2e2d:<    ej4        e2d:         ej5                  Z> ej4        e2d8         ej5                  Z?d;Z@dNd=ZAdMd>ZBd? ZCdOdAZDdB ZE G dC dD          ZF	 	 dPdEZG	 	 dPdFZHi ZIdQdGZJdMdHZKdMdIZLdJ ZMdS )Rz5vobject module for reading vCard and vCalendar files.    )print_functionNz0.9.9c                 z    t          |           t          k    r|                     d          S t          |           S )z:
        Return byte string with correct encoding
        utf-8)typeunicodeencodestrss    L/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/vobject/base.pystr_r      s2     77g88G$$$q66M    c                     | S )z
        Return string
         r
   s    r   r   r   %   s	     r   r    c                 Z    t          | t                    r| S |                     d          S )zConverts a string argument to a unicode string.

    If the argument is already a unicode string, it is returned
    unchanged.  Otherwise it must be a byte string and is decoded as utf8.
    r   )
isinstanceunicode_typedecode)values    r   
to_unicoder   1   s-     %&& <<   r   c                 Z    t          | t                    r| S |                     d          S )zConverts a string argument to a byte string.

    If the argument is already a byte string, it is returned unchanged.
    Otherwise it must be a unicode string and is encoded as utf8.
    r   )r   bytesr   r
   s    r   to_basestringr   =   s-     !U 88Gr   z"%(name)s %(levelname)s %(message)sF
 	c                   p     e Zd ZdZd fd	Zd Zd Zd ZddZdd
Z	ddZ
d Zd Zd ZddZddZ xZS )VBaseaH  
    Base class for ContentLine and Component.

    @ivar behavior:
        The Behavior class associated with this object, which controls
        validation, transformations, and encoding.
    @ivar parentBehavior:
        The object's parent's behavior, or None if no behaviored parent exists.
    @ivar isNative:
        Boolean describing whether this component is a Native instance.
    @ivar group:
        An optional group prefix, should be used only to indicate sort order in
        vCards, according to spec.

    Current spec: 4.0 (http://tools.ietf.org/html/rfc6350)
    Nc                      t          t          |           j        |i | || _        d | _        d | _        d| _        d S NF)superr    __init__groupbehaviorparentBehaviorisNative)selfr%   argskwds	__class__s       r   r$   zVBase.__init__n   sF    #eT#T2T222
"r   c                 f    |j         | _         |j        | _        |j        | _        |j        | _        d S N)r%   r&   r'   r(   )r)   copyits     r   copyz
VBase.copyu   s,    \
$3r   c                 @    | j         r | j         j        | g|R i |S dS )zF
        Call the behavior's validate method, or return True.
        T)r&   validate)r)   r*   r+   s      r   r2   zVBase.validate{   s8     = 	?)4=)$>>>>>>>tr   c                     g S )zK
        Return an iterable containing the contents of the object.
        r   r)   s    r   getChildrenzVBase.getChildren   s	     	r   Tc                 D    d| _         |r|                                  dS dS )zL
        Set behavior to None. Do for all descendants if cascading.
        N)r&   transformChildrenFromNative)r)   cascades     r   clearBehaviorzVBase.clearBehavior   s5      	/,,.....	/ 	/r   Fc                    | j         }||j                            | j                  }|qt	          | j        |d                   }|N|                     ||           t          | t                    r%| j        r | j	        
                    |            dS dS dS dS t          | t                    r8|j        | _	        | j        r'| j	        r"| j	        
                    |            dS dS dS dS dS )z
        Set behavior if name is in self.parentBehavior.knownChildren.

        If cascade is True, unset behavior and parentBehavior for all
        descendants, then recalculate behavior and parentBehavior.
        N   )r'   knownChildrengetnamegetBehaviorsetBehaviorr   ContentLineencodedr&   r   defaultBehavior)r)   r8   r'   knownChildTupr&   s        r   autoBehaviorzVBase.autoBehavior   s&    ,%*8<<TYGGM(&ty-2BCC'$$Xw777!$44 3 3,,T22222 ('3 3 3 3D+.. / . >< /DM /M((..... &%/ // / / /r   c                     || _         |r3|                                 D ] }||_        |                    d           dS dS )zQ
        Set behavior. If cascade is True, autoBehavior all descendants.
        TN)r&   r5   r'   rE   )r)   r&   r8   objs       r   r@   zVBase.setBehavior   sa     ! 	''')) ' '%-"  &&&&	' 	'' 'r   c                    | j         s| j        r| j        j        s| S t          j        |           }	 | j                            |           S # t
          $ r}t          | dd          }t          |t                    r
|||_	         d}|
                    |t          j                    d         t          j                    d                   }|dz   t          |          z   dz   }t          ||          d}~ww xY w)a   
        Transform this object into a custom VBase subclass.

        transformToNative should always return a representation of this object.
        It may do so by modifying self in place then returning self, or by
        creating a new object.
        
lineNumberNz?In transformToNative, unhandled exception on line {0}: {1}: {2}r      z ())r(   r&   	hasNativer0   transformToNative	Exceptiongetattrr   
ParseErrorrI   formatsysexc_infor	   )r)   	self_origerI   msgs        r   rM   zVBase.transformToNative   s     = 	6 	6T]5L 	6K	$I6}66t<<< 6 6 6$T<>>
a,, 6!-'1[C**Z1BCLNNSTDUVVC*s9~~5;C$S*5556s   A 
C:BC55C:c                    | j         r| j        r| j        j        r	 | j                            |           S # t          $ r}t          | dd          }t          |t                    r
|||_         d}|	                    |t          j                    d         t          j                    d                   }t          ||          d}~ww xY w| S )a4  
        Return self transformed into a ContentLine or Component if needed.

        May have side effects.  If it does, transformFromNative and
        transformToNative MUST have perfectly inverse side effects. Allowing
        such side effects is convenient for objects whose transformations only
        change a few attributes.

        Note that it isn't always possible for transformFromNative to be a
        perfect inverse of transformToNative, in such cases transformFromNative
        should return a new object, not self after modifications.
        rI   Nz@In transformFromNative, unhandled exception on line {0} {1}: {2}r   rJ   )r(   r&   rL   transformFromNativerN   rO   r   NativeErrorrI   rQ   rR   rS   )r)   rU   rI   rV   s       r   rX   zVBase.transformFromNative   s     = 	T] 	t}/F 	7}88>>> 
7 
7 
7$T<>>
a-- 7!-'1\C**Z1BCLNNSTDUVVC%c:666
7 Ks   6 
C BCCc                     dS )zP
        Recursively replace children with their native representation.
        Nr   r4   s    r   transformChildrenToNativezVBase.transformChildrenToNative   	     	r   c                     dS zS
        Recursively transform native children to vanilla representations.
        Nr   )r)   r9   s     r   r7   z!VBase.transformChildrenFromNative   r\   r   K   c                 H   |s| j         }|rNt          r3t                              d                    | j        |                      |j        | |||g|R i |S t          r2t                              d                    | j                             t          | ||          S )z
        Serialize to buf if it exists, otherwise return a string.

        Use self.behavior.serialize if behavior exists.
        z%serializing {0!s} with behavior {1!s}z"serializing {0!s} without behavior)r&   DEBUGloggerdebugrQ   r>   	serializedefaultSerialize)r)   buf
lineLengthr2   r&   r*   kwargss          r   rd   zVBase.serialize   s      	%}H 	; bDKKDIW_``aaa%8%dCXWWWWPVWWW UAHHSSTTT#D#z:::r   r.   T)F)Nr_   TN)__name__
__module____qualname____doc__r$   r0   r2   r5   r9   rE   r@   rM   rX   r[   r7   rd   __classcell__r,   s   @r   r    r    ]   s              ( ( (    / / / // / / /*' ' ' '6 6 68  <     ; ; ; ; ; ; ; ;r   r    c                 |    |r|                                  } |dk    r| d|          } |                     dd          S )zu
    Turn a Python name into an iCalendar style name,
    optionally uppercase and with characters stripped off.
    r   N_-)upperreplace)r>   stripNumrs   s      r   toVNamerv   	  sF    
  zz||1}}JhYJ<<S!!!r   c                        e Zd ZdZ	 	 d fd	Zed             Z fdZd Zd Z	d	 Z
d
 Zd Zd Zd Zd ZddZ xZS )rA   a=  
    Holds one content line for formats like vCard and vCalendar.

    For example::
      <SUMMARY{u'param1' : [u'val1'], u'param2' : [u'val2']}Bastille Day Party>

    @ivar name:
        The uppercased name of the contentline.
    @ivar params:
        A dictionary of parameters and associated lists of values (the list may
        be empty for empty parameters).
    @ivar value:
        The value of the contentline.
    @ivar singletonparams:
        A list of parameters for which it's unclear if the string represents the
        parameter name or the parameter value. In vCard 2.1, "The value string
        can be specified alone in those cases where the value is unambiguous".
        This is crazy, but we have to deal with it.
    @ivar encoded:
        A boolean describing whether the data in the content line is encoded.
        Generally, text read from a serialized vCard or vCalendar should be
        considered encoded.  Data added programmatically should not be encoded.
    @ivar lineNumber:
        An optional line number associated with the contentline.
    NFc                 6     t          t                     j        |g|R i |	 |                                 _        | _        i  _        g  _        | _        | _	        | _
         fd}
t          t          |
|                     d}d j        v rWd j        d         v rHd} j        d                             d           t           j        d                   dk    r j        d= d j        v rd} j                            d           |rd j        v rRt          j         j
                            d          d                               j        d                    _
        d
S d	 j        v rXt          j         j
                            d          d                               j        d	         d                    _
        d
S t          j         j
                            d          d                              d           _
        d
S d
S )z
        Take output from parseLine, convert params list to dictionary.

        Group is used as a positional argument to match parseLine's return
        c                     t          |           dk    rxj        | z  c_        d S j                            | d                                         g           }|                    | dd                     d S )NrJ   r   )lensingletonparamsparams
setdefaultrs   extend)x	paramlistr)   s     r   updateTablez)ContentLine.__init__.<locals>.updateTable@  sq    1vv{{$$)$$$$ K221Q4::<<DD	  122'''''r   FENCODINGzQUOTED-PRINTABLETr   r   quoted-printableCHARSETN)r#   rA   r$   rs   r>   rB   r|   r{   r(   rI   r   listmapremoverz   codecsr   r   )r)   r>   r|   r   r%   rB   r(   rI   r*   r+   r   qpr,   s   `           r   r$   zContentLine.__init__/  s&    	*k4  )%?$???$???JJLL	! $
	( 	( 	( 	( 	( 	Sf%%&&&$$"dk*&===BK
#**+=>>>4;z*++q00K
+!555B ''(:;;; 	oT[((#]4:+<+<W+E+EGYZZaabfbmnxbyzz


++!'tz/@/@/I/IK]!^!^!e!efjfqr{f|}~f  "A  "ADJJJ!'tz/@/@/I/IK]!^!^!e!efm!n!nDJJJ	o 	or   c                 J     | di d          }|                     |           |S )Nr   r0   clsr/   newcopys      r   	duplicatezContentLine.duplicate\  s*    #b"b//Vr   c                    t          t          |                               |           |j        | _        t          j        |j                  | _        | j        | _        t          j        |j                  | _        | j                                        D ]!\  }}t          j        |          | j        |<   "t          j        |j                  | _        |j	        | _	        d S r.   )
r#   rA   r0   r>   r   rB   r|   itemsr{   rI   )r)   r/   kvr,   s       r   r0   zContentLine.copyb  s    k4  %%f---K	Yv|,,
|i..K%%'' 	* 	*DAq!Yq\\DKNN#y)?@@ +r   c                     	 | j         |j         k    o| j        |j        k    o| j        |j        k    S # t          $ r Y dS w xY wr"   )r>   r|   r   rN   )r)   others     r   __eq__zContentLine.__eq__m  sX    	I+n$+2MnTXT^bgbmTmn 	 	 	55	s   /2 
A A c                 ,   	 |                     d          r"| j        t          |dd                   d         S |                     d          r| j        t          |dd                   S t          |          # t          $ r t          |          w xY w)
        Make params accessible via self.foo_param or self.foo_paramlist.

        Underscores, legal in python variable names, are converted to dashes,
        which are legal in IANA tokens.
        _param   Tr   
_paramlist
   )endswithr|   rv   AttributeErrorKeyErrorr)   r>   s     r   __getattr__zContentLine.__getattr__s  s    	'}}X&& +{74D#9#9:1==|,, +{74T#:#:;;$T*** 	' 	' 	' &&&	's   6A9 0A9 *A9 9Bc                 :   |                     d          rOt          |          t          k    r|| j        t	          |dd          <   dS |g| j        t	          |dd          <   dS |                     d          rBt          |          t          k    r|| j        t	          |dd          <   dS t          d          t          | j        |d          }t          |t                    r|
                    | |           dS t                              | ||           dS )r   r   r   Tr   r   z Parameter list set to a non-listN)r   r   r   r|   rv   VObjectErrorrO   r,   r   propertyfsetobject__setattr__r)   r>   r   props       r   r   zContentLine.__setattr__  s    =="" 	6E{{d""6;GD!T223337<gGD!T22333]]<(( 
	6E{{d""7<GD"d33444"#EFFF4>466D$)) 6		$&&&&&""4u55555r   c                 0   	 |                     d          r| j        t          |dd          = d S |                     d          r| j        t          |dd          = d S t                              | |           d S # t
          $ r t          |          w xY w)Nr   r   Tr   r   )r   r|   rv   r   __delattr__r   r   r   s     r   r   zContentLine.__delattr__  s    	'}}X&& /Ka 6 6777|,, /Kb$ 7 7888""4..... 	' 	' 	' &&&	's   ,A; ,A; A; ;Bc                 V    | j         }| j        r| j                            |           }|S )zf
        Transform the representation of the value
        according to the behavior, if any.
        )r   r&   	valueRepr)r)   r   s     r   r   zContentLine.valueRepr  s/    
 J= 	.''--Ar   c                 $   	 d                     | j        | j        |                                           S # t          $ rP}d                     | j        | j        |                                                     d                    cY d }~S d }~ww xY w)N<{0}{1}{2}>r   )rQ   r>   r|   r   UnicodeEncodeErrorr   )r)   rU   s     r   __str__zContentLine.__str__  s    	b ''	4;@P@PQQQ! 	b 	b 	b ''	4;@P@P@W@WX_@`@`aaaaaaaa	bs   25 
BAB
B
Bc                 *    |                                  S r.   r   r4   s    r   __repr__zContentLine.__repr__      ||~~r   c                 h    d                     | j        | j        |                                           S )Nr   )rQ   r>   r|   r   r4   s    r   __unicode__zContentLine.__unicode__  s(    $$TYT^^=M=MNNNr   r      c                 ,   d|z  |z  }t          || j        dz   |                                            | j        rWt          |d| j        dz              | j                                        D ]&}t          |d|z  z   || j        |                    %d S d S )Nr   :zparams for )printr>   r   r|   keys)r)   leveltabwidthprer   s        r   prettyPrintzContentLine.prettyPrint  s    EkH$c49s?DNN$4$4555; 	?#}di#o666[%%'' ? ?cC(N*At{1~>>>>	? 	?? ?r   )NFFNr   r   )rj   rk   rl   rm   r$   classmethodr   r0   r   r   r   r   r   r   r   r   r   rn   ro   s   @r   rA   rA     s        2 AF,0+o +o +o +o +o +oZ   [
	, 	, 	, 	, 	,  ' ' '"6 6 60	' 	' 	'  b b b  O O O? ? ? ? ? ? ? ?r   rA   c                        e Zd ZdZd fd	Zed             Z fdZd Zd Z	g dZ
d	 Zd
 ZddZddZd Zd Zd Zd Zd Zd Zd Zd ZddZd Zd ZddZ xZS ) 	Componenta  
    A complex property that can contain multiple ContentLines.

    For our purposes, a component must start with a BEGIN:xxxx line and end with
    END:xxxx, or have a PROFILE:xxx line if a top-level component.

    @ivar contents:
        A dictionary of lists of Component or ContentLine instances. The keys
        are the lowercased names of child ContentLines or Components.
        Note that BEGIN and END ContentLines are not included in contents.
    @ivar name:
        Uppercase string used to represent this Component, i.e VCARD if the
        serialized object starts with BEGIN:VCARD.
    @ivar useBegin:
        A boolean flag determining whether BEGIN: and END: lines should
        be serialized.
    Nc                      t          t          |           j        |i | i | _        |r!|                                | _        d| _        nd| _        d| _        |                                  d S )NTr   F)r#   r   r$   contentsrs   r>   useBeginrE   )r)   r>   r*   r+   r,   s       r   r$   zComponent.__init__  sr    'i'6666 	"

DI DMMDI!DMr   c                 D     |             }|                     |           |S r.   r   r   s      r   r   zComponent.duplicate  s$    #%%Vr   c                 J   t          t          |                               |           i | _        |j                                        D ]@\  }}g }|D ],}|                    |          }|                    |           -|| j        |<   A|j        | _        |j        | _        d S r.   )	r#   r   r0   r   r   r   appendr>   r   )r)   r/   keylvaluenewvaluer   newitemr,   s          r   r0   zComponent.copy  s    i##F+++ !?0022 	* 	*KCH ) )//%00((((!)DM#K	r   c                     | j         s| j        r| j         |k    rdS t          d          |                                | _         dS )zg
        Assign a PROFILE to this unnamed component.

        Used by vCard, not by vCalendar.
        Nz3This component already has a PROFILE or uses BEGIN.)r>   r   r   rs   r   s     r   
setProfilezComponent.setProfile  sS     9 	. 	.yD    - . . .JJLL			r   c                     |dk    rt                               | |          S 	 |                    d          r| j        t	          |d                   S | j        t	          |                   d         S # t
          $ r t          |          w xY w)
        For convenience, make self.contents directly accessible.

        Underscores, legal in python variable names, are converted to dashes,
        which are legal in IANA tokens.
        r   _list   r   )r   __getattribute__r   r   rv   r   r   r   s     r   r   zComponent.__getattr__  s     :**4666	'}}W%% 7}WT1%5%566}WT]]3A66 	' 	' 	' &&&	's   /A3 A3 3B)r   r>   r&   r'   r%   c                 "   || j         vr|                                |k    rt          |          t          k    r8|                    d          r
|dd         }|| j        t          |          <   dS |                    d          rt          d          |g| j        t          |          <   dS t          | j	        |d          }t          |t                    r|                    | |           dS t                              | ||           dS )r   r   Nz Component list set to a non-list)normal_attributeslowerr   r   r   r   rv   r   rO   r,   r   r   r   r   r   r   s       r   r   zComponent.__setattr__  s    t---$**,,$2F2FE{{d""==)) %9D/4gdmm,,,w'' 7"#EFFF05wgdmm,,,4>466D$)) 6		$&&&&&""4u55555r   c                 B   	 || j         vr\|                                |k    rD|                    d          r| j        t	          |d          = d S | j        t	          |          = d S t
                              | |           d S # t          $ r t          |          w xY w)Nr   r   )	r   r   r   r   rv   r   r   r   r   r   s     r   r   zComponent.__delattr__2  s    		'4111djjlld6J6J==)) 5gdA&6&6777gdmm444""4..... 	' 	' 	' &&&	's   AB B 'B Br   c                 r    | j                             t          |                    }||S ||         j        S )zJ
        Return a child's value (the first, by default), or None.
        )r   r=   rv   r   )r)   	childNamedefaultchildNumberchilds        r   getChildValuezComponent.getChildValue>  s9     !!')"4"455=N%++r   c                    t          |t                    r+|}| j        r!| j        |_        |                    d           n|                                }	 | j        j        |         d         }t          ||          }|j        rt          |          }nt          |g d|          }| j        |_        ||_        |                                }n)# t          t          f$ r t          |g d|          }Y nw xY w|j        -| j        &t          |t                    r| j        j        |_        | j                            |j                                        g                               |           |S )a:  
        Add objOrName to contents, set behavior if it can be inferred.

        If objOrName is a string, create an empty component or line based on
        behavior. If no behavior is found for the object, add a ContentLine.

        group is an optional prefix to the name of the object (see RFC 2425).
        Tr;   r   )r   r    r&   r'   rE   rs   r<   r?   isComponentr   rA   rM   r   r   rC   r   r}   r>   r   r   )r)   	objOrNamer%   rG   r>   idr&   s          r   addzComponent.addH  sf    i'' 	=C} '%)]"  &&&??$$D<]06q9&tR00' ;#D//CC%dBE::C%)]"'++--n- < < <!)RU;;<|#(AsK00 )B#}<  !1!1266==cBBB
s   A8C #C54C5c                 &   | j                             |j                                                  }|r]	 |                    |           t          |          dk    r!| j         |j                                        = dS dS # t          $ r Y dS w xY wdS )z+
        Remove obj from contents.
        r   N)r   r=   r>   r   r   rz   
ValueError)r)   rG   nameds      r   r   zComponent.removej  s     !!#(.."2"233 	S!!!u::??chnn&6&6777 #?   	 	s   AB   
BBc              #   T   K   | j                                         D ]}|D ]}|V  dS )z5
        Return an iterable of all children.
        N)r   values)r)   objListrG   s      r   r5   zComponent.getChildrenw  sN       }++-- 	 	G  					 	r   c                 >    d |                                  D             S )z?
        Return an iterable of all Component children.
        c              3   D   K   | ]}t          |t                    |V  d S r.   )r   r   .0is     r   	<genexpr>z'Component.components.<locals>.<genexpr>  s1      JJaAy1I1IJJJJJJJr   r5   r4   s    r   
componentszComponent.components  s%     KJ4++--JJJJr   c                 >    d |                                  D             S )zA
        Return an iterable of all ContentLine children.
        c              3   D   K   | ]}t          |t                    |V  d S r.   )r   rA   r   s     r   r   z"Component.lines.<locals>.<genexpr>  s1      LLaA{1K1KLLLLLLLr   r   r4   s    r   lineszComponent.lines  s%     ML4++--LLLLr   c                      	  fd j         j        D             n# t          $ r g Y nw xY wt          fd j                                        D                       z   S )Nc                 &    g | ]}|j         v |S r   r   )r   r   r)   s     r   
<listcomp>z+Component.sortChildKeys.<locals>.<listcomp>  s%    NNN11;M;MQ;M;M;Mr   c              3   $   K   | ]
}|v|V  d S r.   r   )r   r   firsts     r   r   z*Component.sortChildKeys.<locals>.<genexpr>  s'      PPA%aPPr   )r&   	sortFirstrN   sortedr   r   )r)   r   s   `@r   sortChildKeyszComponent.sortChildKeys  s    	NNNN 7NNNEE 	 	 	EEE	vPPPP););)=)=PPPPPPPs    ,,c                 D      fd                                  D             S )Nc                 4    g | ]}j         |         D ]}|S r   r   )r   r   rG   r)   s      r   r   z/Component.getSortedChildren.<locals>.<listcomp>  s-    NNNT]1=MNNcNNNNr   )r   r4   s   `r   getSortedChildrenzComponent.getSortedChildren  s)    NNNNT//11NNNNr   c                 l    t          | j        |j                  }|r|                     |           dS dS )zF
        Set behavior if one matches name, versionLine.value.
        N)r?   r>   r   r@   )r)   versionLiner   s      r   setBehaviorFromVersionLinez$Component.setBehaviorFromVersionLine  sD     	;#455 	 Q	  	 r   c                       fd                                  D             D ]/}|D ]*}|                                }|                                 +0dS )z
        Recursively replace children with their native representation.

        Sort to get dependency order right, like vtimezone before vevent.
        c              3   2   K   | ]}j         |         V  d S r.   r   )r   r   r)   s     r   r   z6Component.transformChildrenToNative.<locals>.<genexpr>  s*      JJ4=+JJJJJJr   N)r   rM   r[   )r)   
childArrayr   s   `  r   r[   z#Component.transformChildrenToNative  sy     KJJJT5G5G5I5IJJJ 	2 	2J# 2 2//11//11112	2 	2r   Tc                     | j                                         D ]@}|D ];}|                                }|                    |           |rd|_        d|_        <AdS r^   )r   r   rX   r7   r&   r'   )r)   r9   r  r   s       r   r7   z%Component.transformChildrenFromNative  s|     -..00 	0 	0J# 0 0113311-@@@  0%)EN+/E(0	0 	0r   c                     | j         r-d                    | j         |                                           S d                    |                                           S )Nz
<{0}| {1}>z<*unnamed*| {0}>)r>   rQ   r  r4   s    r   r   zComponent.__str__  sQ    9 	H&&ty$2H2H2J2JKKK&--d.D.D.F.FGGGr   c                 *    |                                  S r.   r   r4   s    r   r   zComponent.__repr__  r   r   r   c                     d|z  |z  }t          || j                   t          | t                    r0|                                 D ]}|                    |dz   |           d S d S )Nr   rJ   )r   r>   r   r   r5   r   )r)   r   r   r   lines        r   r   zComponent.prettyPrint  s    EkH$c49dI&& 	6((** 6 6  H5555	6 	66 6r   r.   )Nr   ri   r   )rj   rk   rl   rm   r$   r   r   r0   r   r   r   r   r   r   r   r   r5   r   r   r   r  r  r[   r7   r   r   r   rn   ro   s   @r   r   r     s        "
 
 
 
 
 
   [
( ( ( ( (! ! !' ' '& TSS6 6 6.
' 
' 
', , , ,       D    K K KM M MQ Q QO O O     	2 	2 	2
0 
0 
0 
0H H H  6 6 6 6 6 6 6 6r   r   c                       e Zd ZddZd ZdS )r   Nc                 *    || _         |	|| _        d S d S r.   )rV   rI   )r)   rV   rI   s      r   r$   zVObjectError.__init__  s"    !(DOOO "!r   c                     t          | d          r d                    | j        | j                  S t	          | j                  S )NrI   zAt line {0!s}: {1!s})hasattrrQ   rI   rV   reprr4   s    r   r   zVObjectError.__str__  s<    4&& 	")00$(KKK>>!r   r.   )rj   rk   rl   r$   r   r   r   r   r   r     s7        ) ) ) )
" " " " "r   r   c                       e Zd ZdS )rP   Nrj   rk   rl   r   r   r   rP   rP             Dr   rP   c                       e Zd ZdS )ValidateErrorNr  r   r   r   r  r    r  r   r  c                       e Zd ZdS )rY   Nr  r   r   r   rY   rY     r  r   rY   z[a-zA-Z0-9_-]+r>   z[^";:,]	safe_charz[^"]
qsafe_charz' "{qsafe_char!s} * " | {safe_char!s} * param_valuez/
" ( {qsafe_char!s} * )" | ( {safe_char!s} + )
param_value_groupedz
; (?: {name!s} )                     # parameter name
(?:
    (?: = (?: {param_value!s} ) )?   # 0 or more parameter values, multiple
    (?: , (?: {param_value!s} ) )*   # parameters are comma separated
)*
paramz
; ( {name!s} )

(?: =
    (
        (?:   (?: {param_value!s} ) )?   # 0 or more parameter values, multiple
        (?: , (?: {param_value!s} ) )*   # parameters are comma separated
    )
)?
params_groupedz
^ ((?P<group> {name!s})\.)?(?P<name> {name!s}) # name group
  (?P<params> ;?(?: {param!s} )* )               # params group (may be empty)
: (?P<value> .* )$                             # value group
r  BEGINc                 P   t                               |           }g }|D ]}|d         g}t                              |d                   D ]E}|d         dk    r|                    |d                    *|                    |d                    F|                    |           |S )z
    Parse parameters
    r   rJ   r   )	params_refindallparam_values_rer   )stringallallParameterstup	paramListpairs         r   parseParamsr*    s     

F
#
#CM ( (VH	#++CF33 	* 	*DAw"}}  a))))  a))))Y''''r   c                 f   t                               |           }|#t          d                    |           |          |                    d                              dd          t          |                    d                    |                    d          |                    d          fS )	z
    Parse line
    NzFailed to parse line: {0!s}r>   rq   rr   r|   r   r%   )line_rematchrP   rQ   r%   rt   r*  )r  rI   r-  s      r   	parseLiner.  +  s     MM$E}6==dCCZPPPKK''S11H--..KK  %++g"6"68 8r   z(?:\r\n|\r|\n|$)lineendz{lineend!s} [\t ]wrapz1
(
   (?: [^\r\n] | {wrap!s} )*
   {lineend!s}
)
logicallinesz({wrap!s} | {lineend!s} )	wraporendz
Line 0 text
 , Line 0 continued.
Line 1;encoding=quoted-printable:this is an evil=
 evil=
 format.
Line 2 is a new line, it does not start with whitespace.
Tc              #     K   |sw|                      d          }d}t                              |          D ]C}t                              d|                                          \  }}|dk    r||fV  ||z  }DdS d}t          j        } |            }	d}d}
	 |                                 }|dk    rn|	                    t                    }|dz  }|	                                dk    r?|	                                dk    r|	                                |
fV  |}
 |            }	d}|r/|r-|	                    d           |	                    |           d}n|d         t          v r|	                    |dd                    nq|	                                dk    r:|	                                |
fV  |}
 |            }	|	                    |           n |            }	|	                    |           |	                                }|d         d	k    r-|                                                    d
          dk    rd}|	                                dk    r|	                                |
fV  dS dS )aI  
    Iterate through a stream, yielding one logical line at a time.

    Because many applications still use vCard 2.1, we have to deal with the
    quoted-printable encoding for long lines, as well as the vCard 3.0 and
    vCalendar line folding technique, a whitespace character at the start
    of the line.

    Quoted-printable data will be decoded in the Behavior decoding phase.

    # We're leaving this test in for awhile, because the unittest was ugly and dumb.
    >>> from six import StringIO
    >>> f=StringIO(testLines)
    >>> for n, l in enumerate(getLogicalLines(f)):
    ...     print("Line %s: %s" % (n, l[0]))
    ...
    Line 0: Line 0 text, Line 0 continued.
    Line 1: Line 1;encoding=quoted-printable:this is an evil=
     evil=
     format.
    Line 2: Line 2 is a new line, it does not start with whitespace.
    rJ   r   Fr   Tr   N=r   )readlogical_lines_refinditerwrap_resubnr%   sixStringIOreadlinerstripCRLFtellgetvaluewrite
SPACEORTABr   find)fpallowQPvalrI   r-  r  nquotedPrintable	newbufferlogicalLinelineStartNumbers              r   getLogicalLinesrM  Q  s     .  5:ggbkk
%..s33 	 	Ell2u{{}}55GD!rzzJ&&&&!OJJ		 	  L	ikk
"	';;==Drzz{{4((a
{{}}""##%%))%..00/AAAA",'ikk"' (7 (!!$'''!!$'''"'aJ&&!!$qrr(++++!!##a''!**,,o====",'ikk!!$'''''ikk!!$''' &&((C2w#~~#))++"2"23E"F"F!"K"K"&E"	'H !!&&((/999999 "!r   c                 <    t          t          | |          i d|dS )NT)rB   rI   )rA   r.  )textrH  s     r   textLineToContentLinerP    s:    	$** A$=>/@ /@ A A Ar   c                     |                      d          dk    rt          d          dD ]%}|                      |          dk    r
d| z   dz   c S &| S )zD
    Return param, or "param" if ',' or ';' or ':' is in param.
    "r   z1Double quotes aren't allowed in parameter values.z,;:)rD  r   )r  chars     r   dquoteEscaperT    sm     zz#!NOOO % %::dq  ;$$$$ !Lr   r_   c                    t          |          |k     rL	 |                     t          |d                     nD# t          $ r |                     |           Y n"w xY wd}d}d}t	          |          }t          t          |                    }||k     r||         }t          t          |                    }	||	z   |k    rL	 |                     t          dd                     n%# t          $ r |                     d           Y nw xY wd}t          t          u r#|                     t	          |                     n(|                     |                    d                     ||	z  }||	z  }|dz  }||k     	 |                     t          dd                     dS # t          $ r |                     d           Y dS w xY w)z
    Folding line procedure that ensures multi-byte utf-8 sequences are not
    broken across lines

    TO-DO: This all seems odd. Is it still needed, especially in python3?
    zUTF-8r   z
 rJ   r   
N)	rz   rB  r   rN   r   r   r	   r   r   )
outbufinputrg   startwrittencounterdecodedlengthr   sizes
             r   foldOneLiner_    s     5zzJ	 LLug..//// 	  	  	 LL	  U##]5))**A}Q''((D~
***LLw!8!89999  * * *LL)))))* l""Z]]++++ QXXg..///tOGtOGQJE) *U67++,,,,,   Vs3   #: AA#C) )D
D?#F$ $GGc           
      l   |pt          j                    }t          | t                    r| j        d}n
| j        dz   }| j        r*t          |d                    || j                  |           | 	                                D ]}|
                    ||d           | j        r*t          |d                    || j                  |           nNt          | t                    r8| j        }| j        r|s| j                            |            t          j                    }| j        |                    | j        dz              |                    t!          | j                                                             t%          | j                                                  }|D ]}	d                    d	 | j        |	         D                       }
	 |                    d
                    |	|
                     W# t,          t.          f$ r? |                    d
                    |	|
                    d                               Y w xY w	 |                    d                    | j                             nW# t,          t.          f$ rC |                    d                    | j                            d                               Y nw xY w| j        r|s| j                            |            t          ||                                |           |p|                                S )zP
    Encode and fold obj and its children, write to buf or return a string.
    Nr   .z{0}BEGIN:{1}F)r2   z
{0}END:{1},c              3   4   K   | ]}t          |          V  d S r.   )rT  )r   ps     r   r   z#defaultSerialize.<locals>.<genexpr>  s(      IIAQIIIIIIr   z;{0}={1}r   z:{0})r;  r<  r   r   r%   r   r_  rQ   r>   r  rd   rA   rB   r&   r   rB  r   rs   r   r|   r   joinUnicodeDecodeErrorr   r   r   rA  )rG   rf   rg   rW  groupStringr   startedEncodedr   r   r   paramstrs              r   re   re     s    "CLNNF#y!! &69KK)c/K< 	$ 5 5k38 L L"$ $ $**,, 	@ 	@EOOFJO????< 	$ 3 3K J J"$ $ $ 
C	%	% 6< 	% 	%L$$$LNN9 GGCIO$$$	SX^^%%&&'''cjoo''(( 	J 	JCxxIICIIIIIHJ
))#x889999&(:; J J J
))#xw/G/GHHIIIIIJ	>GGFMM#),,----"$67 	> 	> 	>GGFMM#)"2"27";";<<=====	>< 	% 	%L$$$FAJJLL*555#&//###s&   )HAII-J AKKc                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	Stackc                     g | _         d S r.   )stackr4   s    r   r$   zStack.__init__  s    


r   c                 *    t          | j                  S r.   rz   rm  r4   s    r   __len__zStack.__len__  s    4:r   c                 F    t          |           dk    rd S | j        d         S Nr   r4  ro  r4   s    r   topz	Stack.top  s"    t99>>4:b>!r   c                 P    t          |           dk    rd S | j        d         j        S rr  )rz   rm  r>   r4   s    r   topNamezStack.topName!  s%    t99>>4:b>&&r   c                     |                                  }|r|                    |           d S t                      }|                     |           |                    |           d S r.   )rs  r   r   push)r)   itemrs  news       r   	modifyTopzStack.modifyTop'  sU    hhjj 	GGDMMMMM++CIIcNNNGGDMMMMMr   c                 :    | j                             |           d S r.   )rm  r   )r)   rG   s     r   rw  z
Stack.push0  s    
#r   c                 4    | j                                         S r.   )rm  popr4   s    r   r}  z	Stack.pop3  s    z~~r   N)
rj   rk   rl   r$   rp  rs  ru  rz  rw  r}  r   r   r   rk  rk    s}            " " "' ' '             r   rk  c              #     K   t          | t                    rt          j        |           }n| }	 t	                      }d}d}t          ||          D ]\  }	}|ro	 t          |	|          }
nm# t          $ rP}|j        d}nd}t          
                     |j        di |j        t          |          d           Y d}~od}~ww xY wt          |	|          }
|
j        dk    r|
}|                    |
           |
j        dk    r/|                    t!          |
j        |
j                             |
j        d	k    rc|                                s!|                    t!                                 |                                                    |
j                   R|
j        d
k    rjt+          |          dk    r*d}t-          |                    |
j                  |          |
j                                        |                                k    rt+          |          dk    r|                                }||                    |           n+t7          |j                  }|r|                    |           |r|                    d           |r|                                 |V  h|                    |                                           d}t-          |                    |                                          |          |                    |
           |                                r|                                t                              d           nN|                                j         r5t-          d                    |                                          |          |                                V  dS dS # t,          $ r}| |_!         d}~ww xY w)z9
    Generate one Component at a time from a stream.
    Nr   z)Skipped line {lineNumber}, message: {msg}zSkipped a line, message: {msg})rI   rV   VERSIONr  )r%   PROFILEENDz:Attempted to end the {0} component but it was never openedrJ   T)raiseExceptionz{0} component wasn't closedz#Top level component was never namedz Component {0!s} was never closedr   )"r   
basestringr;  r<  rk  rM  rP  r   rI   rb   errorrQ   r	   r>   rz  rw  r   r   r%   rs  r   rz   rP   rs   ru  r}  r  r?   r@   r2   r[   warningr   rX  )streamOrStringr2   	transformignoreUnreadablerF  streamrm  r  rH  r  vlinerU   rV   err	componentr&   s                   r   readComponentsr  7  s     
 .*--  n-->&vw77 /	' /	'GD! 71$::EE#   |/I>LL!Z!ZQ\RUVWRXRX.Y.Y!Z!Z[[[HHHH .dA66zY&&#&&&&w&&

9U[DDDEEEEy((yy{{ ,JJy{{+++		&&u{3333u$$u::??VC$SZZ%<%<a@@@;$$&&%--//995zzQ$)IIKK	&2%@@MMMM'29>'B'BH' @ ) 5 5h ? ? ?# D%..d.CCC$ B%??AAA'		44447C$SZZ%@%@!DDD&&&&99;; 	}}&DEEEE% 8 !C!J!J"'--//"4 "4568 8 8))++	 	     sC   *O A,+O ,
C6AC<O CLO 
O3&O..O3c           	      B    t          t          | ||||                    S )z1
    Return the first component from stream.
    )nextr  )r  r2   r  r  rF  s        r   readOner    s.    
 vx<L&( ( ) ) )r   c                    |s| j                                         }|| j        }|t          v rK|r%t          |                             d|| f           dS t          |                             || f           dS || fgt          |<   dS )z
    Register the given behavior.

    If default is True (or if this is the first version registered with this
    name), the version will be the default if no id is given.
    Nr   )r>   rs   versionString__behaviorRegistryinsertr   )r&   r>   r   r   s       r   registerBehaviorr    s      %}""$$	z#!!! 	<t$++AH~>>>>>t$++RN;;;;;%'N#34   r   c                     |                                  } | t          v r8|rt          |          D ]\  }}||k    r|c S t          |          d         d         S dS )zl
    Return a matching behavior if it exists, or None.

    If id is None, return the default for name.
    r   rJ   N)rs   r  )r>   r   rH  r&   s       r   r?   r?     sp     ::<<D!!! 	$1$7 $ $877#OOO  "$'*1--4r   c                    |                                  } t          | |          }|"t          d                    |                     |j        rt          |           }nt          | g d          }||_        d|_        |S )zE
    Given a name, return a behaviored ContentLine or Component.
    NzNo behavior found named {0!s}r   F)	rs   r?   r   rQ   r   r   rA   r&   r(   )r>   r   r&   rG   s       r   newFromBehaviorr    s     ::<<D4$$H:AA$GGHHH (oo$B''CLCLJr   c                     |                      dd                               dd                               dd          } |                      dd                               d	d                               d
d          S )N\z\\;z\;rb  z\,rV  z\nr   r   )rt   r
   s    r   backslashEscaper    si    			$''U33;;CGGA99VU##++D%88@@uMMMr   )r   Fr   r.   ri   )r_   )FTFF)NFN)Nrm   
__future__r   r0   r   loggingrer;  rR   r  r  	NameErrorr	   r   r   r   r   r   r   r   r   	getLoggerrj   rb   handlersStreamHandlerhandler	Formatter	formattersetFormatter
addHandlersetLevelERRORra   CRLFr?  SPACETABrC  r   r    rv   rA   r   rN   r   rP   r  rY   patternsrQ   compileVERBOSEr#  r!  DOTALLr,  
IGNORECASEbegin_rer*  r.  r9  r7  	testLinesrM  rP  rT  r_  re   rk  r  r  r  r  r?   r  r  r   r   r   <module>r     s   ; ; % % % % % %    				 



 



 
JJ   uJJJ
G            z#ttBxx   LLL	! 	! 	!	 	 	 
	8	$	$w# #g#%%G!!"FGGI###
g     
		Bw
S[

i; i; i; i; i;F i; i; i;X	" 	" 	" 	"n? n? n? n? n?% n? n? n?b|6 |6 |6 |6 |6 |6 |6 |6~
" 
" 
" 
" 
"9 
" 
" 
"	 	 	 	 	 	 	 		 	 	 	 	L 	 	 		 	 	 	 	, 	 	 	  $ !   KCJVVXVV # #
# ## #	 
      	 	 	 	 	 		   	  	   '"*X&;<bjIIBJx 012:>>	
"*Xf%ry2:'=
>
>2:gr}--  $
8 
8 
8 
8 * .'.::::  
  
    <4;GGhGG 
"*Xk*BJ
7
72:h~6
CC 	L: L: L: L:^A A A A
	 	 	/ / / /d.$ .$ .$b                       F >B38H H H HV FK) ) ) )  4 4 4 4(   "   $N N N N Ns   ' 	33= AA