§
   /`_ÓPmÙã                   óˆ  — d 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dlZddlZddl	m
Z
 dZdZdZdZdd	d
œZdZdZ ej        ¦   «         Z ej        ¦   «         Zdag Zd„ Zd„ Zd„ Zd„ Zd„ Z G d„ d¦  «        Z G d„ d¦  «        Zd„ Zd„ Z d„ Z! G d„ 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 )(a  Home rows prepared by the service and handed over by the plugin call (docs/plan/skin-optimization, B5).

A Home row stays a plugin list: only a list with content of its own runs its click, context menu, mouse and touch in
Kodi. What made a row call slow was building the row in a fresh plugin run. Now

  * the service builds every row beforehand, exactly as its plugin listing does (the real entry point
    `wcs.library2.rows.run` with the parameters of the row's URL), and writes down every call that filled an item
    (`Item`: a list item that keeps a journal of its `set...` / `add...` calls);
  * the plugin call (`serve`, the first thing main.py tries for `action=widget_row`) reads the journal of exactly
    those parameters and repeats the calls: the same items, without importing or computing anything.

A journal is kept in a Home property and on disk, so after a restart of Kodi the rows are served before the service
has even started. It belongs to one set of URL parameters, one revision of the row's data in the library and one
version of the code; when there is none the plugin call builds the row itself, as before. So a row is never older
than its data, also when the service is busy or not running.

Kept light on purpose: main.py imports this module in every row call.
é    N)Úfamilyzmilionar.journal.z?special://profile/addon_data/plugin.video.milionar/row_journal/é   é   ÚgetVideoInfoTagÚgetMusicInfoTag)ÚvideoÚmusicu   [DEBUG][MilionÃ¡Å™ Perf] g     Àr@c            
      óä  — t           sÝt          j                             t          j                             t          j                             t          j                             t
          ¦  «        ¦  «        ¦  «        ¦  «        } t                                t          t          j                             t          j         	                    | d¦  «        ¦  «        ¦  «        ¦  «         t           d         S )zLThe version of the code that made a journal: the time main.py was installed.zmain.pyr   )
Ú_stampÚosÚpathÚdirnameÚabspathÚ__file__ÚappendÚintÚgetmtimeÚjoin)Úroots    ú^/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/skin/journal.pyÚstampr   ,   sŒ   € åð LÝŒw�Š�rœwŸš­r¬w¯ª½r¼w¿ºÍxÑ?XÔ?XÑ/YÔ/YÑZÔZÑ[Ô[ˆÝ�Š•c�"œ'×*Ò*­2¬7¯<ª<¸¸iÑ+HÔ+HÑIÔIÑJÔJÑKÔKÐKÝ�!Œ9Ðó    c                 ód  — d„ |                       ¦   «         D ¦   «         }|                     d¦  «        r||                     d¦  «        rg	 t          |                     d¦  «        pt          ¦  «        }n# t          $ r
 t          }Y nw xY wt          t          |t          ¦  «        ¦  «        |d<   |S )zzThe row's parameters as both sides see them: no empty values (Kodi's URL parsing drops them), at most
    MAX_ITEMS cards.c                 ó<   — i | ]\  }}|d v¯	|t          |¦  «        “ŒS ))Ú N)Ústr©Ú.0ÚkeyÚvalues      r   ú
<dictcomp>znormalize.<locals>.<dictcomp>7   s.   € ÐZÐZÐZ¡* # uÀ%ÈzÐBYÐBYˆc•3�u‘:”:ÐBYÐBYÐBYr   ÚsecÚslotÚlimit)ÚitemsÚgetr   Ú	MAX_ITEMSÚ
ValueErrorr   Úmin)ÚparamsÚvaluesr$   s      r   Ú	normalizer,   4   s°   € ð [ÐZ°·²±´ÐZÑZÔZ€FØ‡z‚z�%ÑÔð 5˜VŸZšZ¨Ñ/Ô/ð 5ð	Ý˜Ÿ
š
 7Ñ+Ô+Ð8­yÑ9Ô9ˆEˆEøÝð 	ð 	ð 	ÝˆEˆEˆEð	øøøå�c %­Ñ3Ô3Ñ4Ô4ˆˆw‰Ø€Ms   Á
)A4 Á4BÂBc                 ó–  — t          j        t          d„ |                      ¦   «         D ¦   «         ¦  «        t	          j        d¦  «        gz   ¦  «                             d¦  «        }d                     |                      dd¦  «        |                      dd¦  «        t          j
        |¦  «        t          j        |¦  «        ¦  «        S )zZ<sec>.<slot>.<hash of every parameter and Kodi's language>: one journal per exact request.c              3   ó0   K  — | ]\  }}|d k    ¯||fV — ŒdS )ÚactionN© r   s      r   ú	<genexpr>zname.<locals>.<genexpr>C   s/   è è € Ð]Ð]©Z¨S°%ÈSÐT\Ê_È_˜S %˜LÈ_È_È_È_Ð]Ð]r   zSystem.Languageúutf-8z{}.{}.{:08x}{:08x}r"   r   r#   )ÚjsonÚdumpsÚsortedr%   ÚxbmcÚgetInfoLabelÚencodeÚformatr&   ÚzlibÚcrc32Úadler32)r*   Úraws     r   Únamer>   A   sª   € å
Œ*•VÐ]Ð]¸6¿<º<¹>¼>Ð]Ñ]Ô]Ñ]Ô]ÝÔ)Ð*;Ñ<Ô<Ð=ñ>ñ ?ô ?ß?EºvÀg¹¼ð à×&Ò& v§z¢z°%¸Ñ'<Ô'<¸f¿jºjÈÐQSÑ>TÔ>TÕVZÔV`ÐadÑVeÔVeÕgkÔgsÐtwÑgxÔgxÑyÔyÐyr   c                 óp   — 	 ddl m}  || g¦  «                             | ¦  «        S # t          $ r Y dS w xY w)zXThe revision of the row type's data (wcs/skin/refresh.py); None for a row that has none.r   )Ú	revisionsN)Úwcs.skin.refreshr@   r&   Ú	Exception)Úrowr@   s     r   Ú	_revisionrD   H   s[   € ðØ.Ð.Ð.Ð.Ð.Ð.Øˆy˜#˜ÑÔ×#Ò# CÑ(Ô(Ð(øÝð ð ð Øˆtˆtðøøøs   ‚$' §
5´5c                 óv   — t           j                             t          j        t
          ¦  «        | dz   ¦  «        S )Nú.json)r   r   r   ÚxbmcvfsÚtranslatePathÚ	DIRECTORY)Ú
entry_names    r   Ú_pathrK   Q   s(   € ÝŒ7�<Š<�Ô-­iÑ8Ô8¸*ÀwÑ:NÑOÔOÐOr   c                   ó   — e Zd ZdZd„ Zd„ ZdS )Ú_TagzQAn info tag of an item: its `set...` / `add...` calls go into the item's journal.c                 ó2   — |||c| _         | _        | _        d S ©N)Ú_realÚ_callsÚ_target)ÚselfÚrealÚcallsÚtargets       r   Ú__init__z_Tag.__init__Z   s   € Ø04°e¸VÐ-ˆŒ
�D”K ¤  r   c                 ó�   ‡ ‡‡— t          ‰ j        ‰¦  «        Št          ‰¦  «        r‰                     d¦  «        s‰S ˆˆ ˆfd„}|S )N©ÚsetÚaddc                  óZ   •— ‰j                              ‰j        ‰| |g¦  «          ‰| i |¤ŽS rO   )rQ   r   rR   ©ÚargsÚkwargsÚ	attributerS   r    s     €€€r   Úcallz_Tag.__getattr__.<locals>.callb   s9   ø€ ØŒK×Ò ¤¨i¸¸vÐFÑGÔGÐGØ�5˜$Ð) &Ð)Ð)Ð)r   ©ÚgetattrrP   ÚcallableÚ
startswith©rS   r`   ra   r    s   `` @r   Ú__getattr__z_Tag.__getattr__]   óh   øøø€ Ý˜œ
 IÑ.Ô.ˆÝ˜‰Œð 	 i×&:Ò&:¸>Ñ&JÔ&Jð 	ØˆLð	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð ˆr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rW   rg   r0   r   r   rM   rM   W   s;   € € € € € Ø[Ð[ðDð Dð Dðð ð ð ð r   rM   c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚItemz4xbmcgui.ListItem that writes down how it was filled.c                 ó@   — t          |i |¤Ž| _        dd||gg| _        d S )NÚnewr   )Ú
_real_itemrP   rQ   )rS   r^   r_   s      r   rW   zItem.__init__k   s-   € Ý Ð0¨Ð0Ð0ˆŒ
Ø˜r 4¨Ð0Ð1ˆŒˆˆr   c                 ó\   — t          | j                             ¦   «         | j        d¦  «        S )Nr   )rM   rP   r   rQ   ©rS   s    r   r   zItem.getVideoInfoTago   ó$   € Ý�D”J×.Ò.Ñ0Ô0°$´+¸wÑGÔGÐGr   c                 ó\   — t          | j                             ¦   «         | j        d¦  «        S )Nr	   )rM   rP   r   rQ   rs   s    r   r   zItem.getMusicInfoTagr   rt   r   c                 ó�   ‡ ‡‡— t          ‰ j        ‰¦  «        Št          ‰¦  «        r‰                     d¦  «        s‰S ˆˆ ˆfd„}|S )NrY   c                  óP   •— ‰j                              d‰| |g¦  «          ‰| i |¤ŽS )NÚitem)rQ   r   r]   s     €€€r   ra   zItem.__getattr__.<locals>.callz   s7   ø€ ØŒK×Ò ¨	°4¸Ð@ÑAÔAÐAØ�5˜$Ð) &Ð)Ð)Ð)r   rb   rf   s   `` @r   rg   zItem.__getattr__u   rh   r   N)ri   rj   rk   rl   rW   r   r   rg   r0   r   r   rn   rn   h   s\   € € € € € Ø>Ð>ð2ð 2ð 2ðHð Hð HðHð Hð Hðð ð ð ð r   rn   c                  ó^   — t          t          dd¦  «        rt          | i |¤ŽS t          | i |¤ŽS )NÚ	recordingF)rc   Ú_localrn   rq   ©r^   r_   s     r   Ú_factoryr}   €   s<   € Ý�v�{ EÑ*Ô*ð %Ý�TÐ$˜VÐ$Ð$Ð$Ý�tÐ&˜vÐ&Ð&Ð&r   c                  óR   — t           €t          j        a t          t          _        dS dS )zWxbmcgui.ListItem keeps a journal while this thread builds a row (service process only).N)rq   ÚxbmcguiÚListItemr}   r0   r   r   Úinstallr�   †   s(   € õ ÐÝÔ%ˆ
Ý#�ÔÐÐð Ðr   c                  ó   — t           duS )z5True in the process that prepares rows (the service).N)rq   r0   r   r   Ú	installedrƒ   Ž   s   € å˜TÐ!Ð!r   c                   ó:   — e Zd ZdZd„ Zd„ Zd„ Zdd„Zdd„Zd	„ Z	d
S )Ú_CatchzeThe directory functions of xbmcplugin for the time of one build: the items are kept, nothing is sent.c                 ó$   — g dc| _         | _        d S )Nr   )r%   Úcontentrs   s    r   rW   z_Catch.__init__–   s   € Ø#% rÐ ˆŒ
�D”L�L�Lr   c                 ó4  ‡— dd l Š‰| _        d}ˆfd„|D ¦   «         | _        t          ‰dd ¦  «        | _        | j        D ]}t          ‰|d„ ¦  «         Œ| j        ‰_        | j        | j	        f‰_
        | j        | j	        c‰_        ‰_        dt          _        | S )Nr   )ÚaddDirectoryItemÚaddDirectoryItemsÚendOfDirectoryÚ
setContentÚsetPluginCategoryÚaddSortMethodÚsetResolvedUrlÚsetPropertyc                 óR   •— i | ]#}t          ‰|¦  «        ¯|t          ‰|¦  «        “Œ$S r0   )Úhasattrrc   )r   r   Ú
xbmcplugins     €r   r!   z$_Catch.__enter__.<locals>.<dictcomp>ž   s6   ø€ ÐaÐaÐa¸ÍÐPZÐ\_ÑH`ÔH`Ða�c�7 :¨sÑ3Ô3ÐaÐaÐar   Ú_milionar_directory_originalsc                  ó   — dS ©NTr0   r|   s     r   ú<lambda>z"_Catch.__enter__.<locals>.<lambda>¡   s   € ¸T€ r   T)r“   ÚmoduleÚsavedrc   Ú	originalsÚsetattrÚset_contentrŒ   ÚoneÚmanyr”   r‰   rŠ   r{   rz   )rS   Únamesr   r“   s      @r   Ú	__enter__z_Catch.__enter__™   s¸   ø€ ØÐÐÐØ ˆŒðCˆàaÐaÐaÐa¸uÐaÑaÔaˆŒ
Ý  Ð-LÈdÑSÔSˆŒØ”:ð 	Cð 	CˆCÝ�J Ð%AÐ%AÑBÔBÐBÐBØ $Ô 0ˆ
Ôà48´H¸d¼iÐ3Hˆ
Ô0ØDHÄHÈdÌiÐAˆ
Ô# ZÔ%AØ�ÔØˆr   c                 ó   — || _         dS r–   )r‡   )rS   Úhandler‡   s      r   rœ   z_Catch.set_content©   s   € ØˆŒØˆtr   Fr   c                 ó@   — | j                              |||f¦  «         dS r–   )r%   r   )rS   r¢   ÚurlÚlistitemÚisFolderÚ
totalItemss         r   r�   z
_Catch.one­   s$   € ØŒ
×Ò˜3 ¨(Ð3Ñ4Ô4Ð4Øˆtr   c                 ó:   — | j                              |¦  «         dS r–   )r%   Úextend)rS   r¢   r%   r§   s       r   rž   z_Catch.many±   s   € ØŒ
×Ò˜%Ñ Ô Ð Øˆtr   c                 óÈ   — dt           _        | j                             ¦   «         D ]\  }}t	          | j        ||¦  «         Œ| j        €| j        `n| j        | j        _        dS )NF)r{   rz   r™   r%   r›   r˜   rš   r”   )rS   Úexcr   Úfunctions       r   Ú__exit__z_Catch.__exit__µ   sf   € Ø �ÔØ!œZ×-Ò-Ñ/Ô/ð 	0ð 	0‰MˆC�Ý�D”K  hÑ/Ô/Ð/Ð/ØŒ>Ð!Ø”Ð9Ð9à8<¼ˆDŒKÔ5Øˆur   N)Fr   )r   )
ri   rj   rk   rl   rW   r    rœ   r�   rž   r­   r0   r   r   r…   r…   “   s~   € € € € € ØoÐoð*ð *ð *ðð ð ð ð ð ðð ð ð ðð ð ð ðð ð ð ð r   r…   c                 ó°  — t          | t          ¦  «        rdd„ | D ¦   «         iS t          | t          ¦  «        rd„ | D ¦   «         S t          | t          ¦  «        rd„ |                      ¦   «         D ¦   «         S | �(t          | t
          t          t          t          f¦  «        r| S t          d 
                    t          | ¦  «        j        ¦  «        ¦  «        ‚)z<JSON keeps no tuples, Kodi's list item calls want them back.Ú	__tuple__c                 ó,   — g | ]}t          |¦  «        ‘ŒS r0   ©Ú_pack©r   Úparts     r   ú
<listcomp>z_pack.<locals>.<listcomp>Ã   s   € Ð<Ð<Ð<¨d�e D™kœkÐ<Ð<Ð<r   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r0   r±   r³   s     r   rµ   z_pack.<locals>.<listcomp>Å   s   € Ð.Ð.Ð. •�d‘”Ð.Ð.Ð.r   c                 óN   — i | ]"\  }}t          |¦  «        t          |¦  «        “Œ#S r0   )r   r²   ©r   r   r´   s      r   r!   z_pack.<locals>.<dictcomp>Ç   s*   € ÐEÐEÐE©)¨#¨t•�C‘”�% ™+œ+ÐEÐEÐEr   Nznot a plain value: {})Ú
isinstanceÚtupleÚlistÚdictr%   r   r   ÚfloatÚboolÚ	TypeErrorr9   Útyperi   ©r    s    r   r²   r²   À   sÊ   € å�%�ÑÔð >ØÐ<Ð<°eÐ<Ñ<Ô<Ð=Ð=Ý�%�ÑÔð /Ø.Ð.¨Ð.Ñ.Ô.Ð.Ý�%�ÑÔð FØEÐE°u·{²{±}´}ÐEÑEÔEÐEØ€}�
 5­3µµU½DÐ*AÑBÔB€}ØˆÝ
Ð+×2Ò2µ4¸±;´;Ô3GÑHÔHÑ
IÔ
IÐIr   c                 ó  — t          | t          ¦  «        rTt          | ¦  «        dk    r#d| v rt          d„ | d         D ¦   «         ¦  «        S d„ |                      ¦   «         D ¦   «         S t          | t
          ¦  «        rd„ | D ¦   «         S | S )Né   r¯   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S rO   ©Ú_unpackr³   s     r   r1   z_unpack.<locals>.<genexpr>Ð   s(   è è € ÐFÐF¨4� ™œÐFÐFÐFÐFÐFÐFr   c                 ó4   — i | ]\  }}|t          |¦  «        “ŒS r0   rÅ   r¸   s      r   r!   z_unpack.<locals>.<dictcomp>Ñ   s$   € ÐBÐBÐB¡y s¨D�•W˜T‘]”]ÐBÐBÐBr   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r0   rÅ   r³   s     r   rµ   z_unpack.<locals>.<listcomp>Ó   s   € Ð0Ð0Ð0 $•˜‘”Ð0Ð0Ð0r   )r¹   r¼   Úlenrº   r%   r»   rÁ   s    r   rÆ   rÆ   Í   s—   € Ý�%�ÑÔð CÝˆu‰:Œ:˜Š?ˆ?˜{¨eÐ3Ð3ÝÐFÐF°5¸Ô3EÐFÑFÔFÑFÔFÐFØBÐB°E·K²K±M´MÐBÑBÔBÐBÝ�%�ÑÔð 1Ø0Ð0¨%Ð0Ñ0Ô0Ð0Ø€Lr   c                 ó^  — ddl m} ddlm} t	          ¦   «          t          |                      dd¦  «        ¦  «        }t          5  t          ¦   «         5 }| 	                    | ¦  «         | 
                    d| ¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   g }|j        dt          …         D ]R\  }}}t          |t          ¦  «        s dS |                     |t!          |¦  «        d„ |j        D ¦   «         g¦  «         ŒSt%          ¦   «         ||j        |d	œS )
z¯Build the row of these parameters as its plugin listing does: the journal entry, or None when an item
    cannot be written down (the plugin call then builds that row itself).r   )Úrows)ÚcontextrC   r   éÿÿÿÿNc           	      ór   — g | ]4\  }}}}||t          t          |¦  «        ¦  «        t          |¦  «        g‘Œ5S r0   )r²   r»   )r   rV   Úmethodr^   r_   s        r   rµ   zbuild.<locals>.<listcomp>å   sT   € ð +\ð +\ð +\Ù/K¨v°v¸tÀVð -3°F½EÅ$ÀtÁ*Ä*Ñ<MÔ<MÍuÐU[É}Ì}Ð+]ð +\ð +\ð +\r   )r   Úrevisionr‡   r%   )Úwcs.library2rË   Úwcs.skinrÌ   r�   rD   r&   Ú_buildr…   Úinstall_listing_contextÚrunr%   r'   r¹   rn   r   r¾   rQ   r   r‡   )	r*   rË   rÌ   rÐ   Úcaughtr%   r   rx   Úfolders	            r   ÚbuildrØ   ×   sØ  € ð "Ð!Ð!Ð!Ð!Ð!Ø Ð Ð Ð Ð Ð Ý�I„I€IÝ˜Ÿš E¨2Ñ.Ô.Ñ/Ô/€HÝ	ð ð •‘”ð ˜VØ×'Ò'¨Ñ/Ô/Ð/Ø�Š��VÑÔÐðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð €EØ$œl¨:­I¨:Ô6ð ^ð ^Ñˆˆd�FÝ˜$¥Ñ%Ô%ð 	Ø�4�4Ø�Š�d�D ™LœLð +\ð +\ØOSÌ{ð+\ñ +\ô +\ð ]ñ 	^ô 	^ð 	^ð 	^å‘W”W¨(¸v¼~ÐX]Ð^Ð^Ð^s6   ÁB#Á,BÂ B#ÂB	ÂB#ÂB	ÂB#Â#B'Â*B'c           	      óÔ  ‡
— t          | ¦  «        }t          j        |dd¬¦  «        }t          j        d¦  «        }|                     t          |z   |¦  «         t          |¦  «        }	 t          |d¬¦  «        5 }| 	                    ¦   «         |k    r|cddd¦  «         S 	 ddd¦  «         n# 1 swxY w Y   n# t          $ r Y nw xY wt          j        t          j                             |¦  «        d¬	¦  «         d
                     |t          j        ¦   «         ¦  «        }t          |dd¬¦  «        5 }|                     |¦  «         ddd¦  «         n# 1 swxY w Y   t          j        ||¦  «         d                     |                      dd¦  «        |                      dd¦  «        ¦  «        Š
t)          ˆ
fd„t          j        t          j                             |¦  «        ¦  «        D ¦   «         d„ d¬¦  «        t,          d…         }|D ]S}	|                     t          |	j         dt1          d¦  «         …         z   ¦  «         t          j        |	j        ¦  «         ŒT|S )zcKeep the journal (Home property and file); older journals of the same slot beyond KEEP are dropped.F)ú,ú:)Úensure_asciiÚ
separatorsé'  r2   ©ÚencodingNT)Úexist_okz	{}.{}.tmpÚwz{}.{}.r"   r   r#   c              3   ó„   •K  — | ]:}|j                              ‰¦  «        ¯|j                              d ¦  «        ¯6|V — Œ;dS )rF   N)r>   re   Úendswith)r   ÚentryÚprefixs     €r   r1   zstore.<locals>.<genexpr>ý   sm   øè è € ð Wð W˜eØ”z×,Ò,¨VÑ4Ô4ðWØ9>¼×9LÒ9LÈWÑ9UÔ9UðW�Eð Wð Wð Wð Wð Wð Wr   c                 ó4   — |                       ¦   «         j        S rO   )ÚstatÚst_mtime)rå   s    r   r—   zstore.<locals>.<lambda>ÿ   s   €  U§Z¢Z¡\¤\Ô%:€ r   )r   ÚreverserF   )r>   r3   r4   r   ÚWindowr�   ÚPROPERTYrK   ÚopenÚreadÚOSErrorr   Úmakedirsr   r   r9   ÚgetpidÚwriteÚreplacer&   r5   ÚscandirÚKEEPÚclearPropertyrÉ   Úremove)r*   rå   rJ   ÚtextÚhomer   r¢   Ú	temporaryÚolderÚ
entry_fileræ   s             @r   Ústorerý   ê   sé  ø€ å�f‘”€JÝŒ:�e¨%¸JÐGÑGÔG€DÝŒ>˜%Ñ Ô €DØ×Ò•X 
Ñ*¨DÑ1Ô1Ð1Ý�ÑÔ€DðÝ�$ Ð)Ñ)Ô)ð 	"¨VØ�{Š{‰}Œ} Ò$Ð$Ø!ð	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"Ø$ð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"øøõ ð ð ð Øˆðøøøå„K•”—’ Ñ%Ô%°Ð5Ñ5Ô5Ð5Ø×"Ò" 4­¬©¬Ñ5Ô5€IÝ	ˆi˜ wÐ	/Ñ	/Ô	/ð °6Ø�Š�TÑÔÐðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð å„Jˆy˜$ÑÔÐØ�_Š_˜VŸZšZ¨¨rÑ2Ô2°F·J²J¸vÀrÑ4JÔ4JÑKÔK€FÝð Wð Wð Wð W¥r¤zµ"´'·/²/À$Ñ2GÔ2GÑ'HÔ'Hð Wñ Wô Wà:Ð:ÀDðJñ Jô JåJNÈ%È%ôQ€Eð ð #ð #ˆ
Ø×Ò�8 j¤o°n½¸G¹¼°}°nÔ&EÑEÑFÔFÐFÝ
Œ	�*”/Ñ"Ô"Ð"Ð"ØÐsN   Á*B; Á;B/ÂB; Â#B; Â/B3Â3B; Â6B3Â7B; Â;
CÃCÄ7EÅEÅ Ec                 ó  — t          | ¦  «        } t          j        ¦   «         }	 t          | ¦  «        }n™# t          $ rŒ}t          j        d                     |                      d¦  «        |                      d¦  «        |                      d¦  «        t          |¦  «        j
        |¦  «        t
          j        ¦  «         Y d}~dS d}~ww xY w|€dS t          | |¦  «        }t          j        t          d                     |                      d¦  «        |                      d¦  «        |                      d¦  «        t          |d         ¦  «        t          j        ¦   «         |z
  dz  ¦  «        z   t
          j        ¦  «         |S )	zœBuild and keep the journal of one row; returns its name, or None (built by the plugin call instead).
    A row that fails to build keeps the journal it had.u8   [MilionÃ¡Å™ Skin] journal of row {}.{} {} failed: {}: {}r"   r#   rC   Nz'prepared {}.{} {} {} cards in {:.0f} msr%   éè  )r,   ÚtimeÚperf_counterrØ   rB   r6   Úlogr9   r&   rÀ   ri   ÚLOGERRORrý   ÚPERFrÉ   ÚLOGINFO)r*   Ústartedrå   r«   rJ   s        r   Úpreparer    sm  € õ �vÑÔ€FÝÔÑ!Ô!€GðÝ�f‘”ˆˆøÝð ð ð ÝŒÐK×RÒRØ�JŠJ�uÑÔ˜vŸzšz¨&Ñ1Ô1°6·:²:¸eÑ3DÔ3DÅdÈ3ÁiÄiÔFXÐZ]ñ_ô _Ý`dÔ`mñ	oô 	oð 	oàˆtˆtˆtˆtˆtøøøøðøøøð €}ØˆtÝ�v˜uÑ%Ô%€JÝ„H�TÐ=×DÒDØ�
Š
�5ÑÔ˜6Ÿ:š: fÑ-Ô-¨v¯zªz¸%Ñ/@Ô/@Å#ÀeÈGÄnÑBUÔBUÝ	Ô	Ñ	Ô	˜wÑ	&¨$Ñ.ñ0ô 0ñ 0å15´ñ?ô ?ð ?ð Ðs   ¤4 ´
C
¾BCÃC
c                 ó~  — t          | ¦  «        }t          j        d¦  «                             t          |z   ¦  «        }|s]	 t          t          |¦  «        d¬¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   n# t          $ r Y dS w xY w	 t          j
        |¦  «        }n# t          $ r Y dS w xY wt          |t          ¦  «        r%|                     d¦  «        t          ¦   «         k    rdS |                     d¦  «        t!          |                      dd¦  «        ¦  «        k    r|ndS )	zWThe journal of exactly these parameters, this code and the row's current data, or None.rÞ   r2   rß   Nr   rÐ   rC   r   )r>   r   rë   ÚgetPropertyrì   rí   rK   rî   rï   r3   Úloadsr(   r¹   r¼   r&   r   rD   )r*   rJ   rø   r¢   rå   s        r   Úloadr    sy  € å�f‘”€JÝŒ>˜%Ñ Ô ×,Ò,­X¸
Ñ-BÑCÔC€DØð ð	Ý•e˜JÑ'Ô'°'Ð:Ñ:Ô:ð %¸fØ—{’{‘}”}�ð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %øøåð 	ð 	ð 	Ø�4�4ð	øøøðÝ”
˜4Ñ Ô ˆˆøÝð ð ð Øˆtˆtðøøøå�e�TÑ"Ô"ð  e§i¢i°Ñ&8Ô&8½E¹G¼GÒ&CÐ&CØˆtØ—I’I˜jÑ)Ô)­Y°v·z²zÀ%ÈÑ7LÔ7LÑ-MÔ-MÒMÐMˆ5ˆ5ÐSWÐWsH   ÁB Á BÁ5B ÂBÂB ÂBÂ	B Â
BÂBÂB4 Â4
CÃCc                 ó>   — t          t          | ¦  «        ¦  «        d uS rO   )r  r,   )r*   s    r   Úexistsr  /  s   € Ý•	˜&Ñ!Ô!Ñ"Ô"¨$Ð.Ð.r   c                 ó8  — d }| D ]”\  }}}}|dk    r,t          j        t          |¦  «        i t          |¦  «        ¤Ž}Œ9|dk    r|n" t          |t          |         ¦  «        ¦   «         } t          ||¦  «        t          |¦  «        i t          |¦  «        ¤Ž Œ•|S )Nrp   rx   )r   r€   rÆ   rc   ÚTARGETS)rU   rx   rV   rÏ   r^   r_   Úowners          r   Úreplayr  3  sª   € Ø€DØ(-ð Fð FÑ$ˆ�˜˜fØ�UŠ?ˆ?ÝÔ#¥W¨T¡]¤]ÐFµg¸f±o´oÐFÐFˆDˆDà" fÒ,Ð,�D�DÐ2Pµ'¸$ÅÈÄÑ2PÔ2PÑ2RÔ2RˆEØ"�G�E˜6Ñ"Ô"¥G¨D¡M¤MÐEµW¸V±_´_ÐEÐEÐEÐEØ€Kr   c           
      óØ  — t          j        ¦   «         }|                     d¦  «        r|                     d¦  «        sdS t          |¦  «        }|€dS ddl}	 d„ |d         D ¦   «         }n…# t
          $ rx}t          j        d                     |                     d¦  «        |                     d¦  «        t          |¦  «        j
        |¦  «        t          j        ¦  «         Y d}~dS d}~ww xY w|                     d	¦  «        r|                     | |d	         ¦  «         |                     | |t          |¦  «        ¦  «         |                     | d
d¬¦  «         t          j        t           d                     |                     d¦  «        |                     d¦  «        |                     d¦  «        t          j        ¦   «         |z
  dz  ¦  «        z   t          j        ¦  «         d
S )zYAnswer a row call from its journal; False when there is none (the caller builds the row).r"   r#   FNr   c                 ó:   — g | ]\  }}}|t          |¦  «        |f‘ŒS r0   )r  )r   r   r×   rU   s       r   rµ   zserve.<locals>.<listcomp>H  s,   € ÐYÐYÐYÑ3F°4¸À�$�˜u™œ vÐ.ÐYÐYÐYr   r%   u9   [MilionÃ¡Å™ Skin] journal of row {}.{} not usable: {}: {}r‡   T)Ú	succeededÚcacheToDiscz row {}.{} {} served in {:.0f} msrC   rÿ   )r   r  r&   r  r“   rB   r6   r  r9   rÀ   ri   Ú
LOGWARNINGrŒ   rŠ   rÉ   r‹   r  r  )r¢   r*   r  rå   r“   r%   r«   s          r   Úserver  >  sî  € åÔÑ!Ô!€GØ�JŠJ�uÑÔð  &§*¢*¨VÑ"4Ô"4ð ØˆuÝ�‰LŒL€EØ€}ØˆuØÐÐÐðØYÐYÈ%ÐPWÌ.ÐYÑYÔYˆˆøÝð ð ð ÝŒÐL×SÒSØ�JŠJ�uÑÔ˜vŸzšz¨&Ñ1Ô1µ4¸±9´9Ô3EÀsñLô LÝMQÌ_ñ	^ô 	^ð 	^àˆuˆuˆuˆuˆuøøøøðøøøð ‡y‚y�ÑÔð 8Ø×Ò˜f e¨IÔ&6Ñ7Ô7Ð7Ø× Ò  ¨µ°E±
´
Ñ;Ô;Ð;Ø×Ò˜f°À%ÐÑHÔHÐHÝ„H�TÐ6×=Ò=Ø�
Š
�5ÑÔ˜6Ÿ:š: fÑ-Ô-¨v¯zªz¸%Ñ/@Ô/@Å4ÔCTÑCVÔCVÐY`ÑC`ÐdhÑBhñjô jñ jÝkoÔkwñyô yð yàˆ4s   ÁA+ Á+
C-Á5A-C(Ã(C-c                 óÊ  ‡ ‡‡— d„ Š ‰d                      ‰ ‰¦  «        ¦  «        }|r|dk    rdS ˆˆ ˆfd„}t          d|‰ t          ‰¦  «         |d¦  «         |d¦  «         |d	¦  «         |d
¦  «         ‰‰ dz   ¦  «         ‰‰ dz   ¦  «         |d¦  «        dt          j        d¦  «                             d¦  «         ‰‰ dz   ¦  «         ‰‰ dz   ¦  «        dœ¦  «        S )z]What Kodi puts into the URL of that Home row (gen_slots.CONTENT), or None for an unused slot.c                 óP   — t          j        d                     | ¦  «        ¦  «        S )NzSkin.String(mil.{}))r6   r7   r9   ©r   s    r   Úlabelzrequest_params.<locals>.labelZ  s"   € ÝÔ Ð!6×!=Ò!=¸cÑ!BÔ!BÑCÔCÐCr   z
{}.{}.typeÚoffNc                 óD   •—  ‰d                      ‰‰| ¦  «        ¦  «        S )Nz{}.{}.{})r9   )r   r  Úsectionr#   s    €€€r   r—   z request_params.<locals>.<lambda>_  s#   ø€ �e�e˜J×-Ò-¨g°t¸SÑAÔAÑBÔB€ r   Ú
widget_rowr$   ÚsortÚstyleÚclickz.hidewatchedz	.upcomingÚrevÚ2rÞ   zmilionar.low_powerz.herorevz.mode)r/   rC   r"   r#   r$   r   r!  r"  ÚhwÚupÚreloadr9   ÚprofileÚhbÚmode)r9   r,   r   r   rë   r	  )r  r#   rC   r&   r  s   ``  @r   Úrequest_paramsr+  X  s5  øøø€ ðDð Dð Dà
ˆ%�×#Ò# G¨TÑ2Ô2Ñ
3Ô
3€CØð �#˜’,�,ØˆtØ
BÐ
BÐ
BÐ
BÐ
BÐ
B€CÝ °SÀÕRUÐVZÑR[ÔR[ÐfiÐfiÐjqÑfrÔfrØ!˜c &™kœk°C°C¸±L´LÈ3È3ÈwÉ<Ì<Ø!˜E '¨NÑ":Ñ;Ô;À5À5ÈÐS^ÑI^ÑC_ÔC_ÐknÐknÐotÑkuÔkuØ #µ´¸uÑ0EÔ0E×0QÒ0QÐRfÑ0gÔ0gØ!˜E '¨JÑ"6Ñ7Ô7ÀÀÀwÐQXÑGXÑAYÔAYð	[ð [ñ \ô \ð \r   c                 ó  ‡	— ddl m}m} ddlm} i }|                      ¦   «         �sÛt          j        ¦   «         �r™t          j	        d¦  «        �s„|j
                             t          j        d¦  «        ¦  «        Š	t          |j        ˆ	fd„¬¦  «        D �]=}|                     |¦  «        rŒt!          d|dz   ¦  «        D �]}t#          ||¦  «        }|rt%          |¦  «        �Œ%t'          |d
         ¦  «        }|�(|                     dd¦  «        t)          |¦  «        k    rŒdt+          j        ¦   «         |                     t/          |¦  «        t0           ¦  «        z
  t0          k     rŒ«|                     | ¦  «        r  d	S t5          |¦  «        €#t+          j        ¦   «         |t/          |¦  «        <   |                      d¦  «        r  d	S �Œ�Œ?|                      d¦  «        rd	S |                      ¦   «         �¯Ùd	S d	S )z×Service thread: every row the Home screen can ask for has its journal (after an update, a new slot, another
    limit or mode). Changed data are prepared by wcs/skin/refresh.publish before the row is told to reload.r   )Ú	userfirstÚwarm)ÚWIDGET_SLOTSzPlayer.HasMediaz%Container(9000).ListItem.Property(id)c                 ó   •— | ‰k    S rO   r0   )r    Úfocuseds    €r   r—   zrun.<locals>.<lambda>p  s   ø€ À5ÈGÒCS€ r   r  rÃ   NrC   r'  r   g{®Gáz”?g      @)rÒ   r-  r.  Úwcs.skin.hero_contractr/  ÚabortRequestedr   Úactiver6   ÚgetCondVisibilityÚBY_MENUr&   r7   r5   ÚSECTIONSÚhiddenÚranger+  r  rD   r   r   Ú	monotonicr>   ÚRETRY_AFTERÚgive_wayr  ÚwaitForAbort)
Úmonitorr-  r.  r/  Úfailedr  r#   r*   rÐ   r1  s
            @r   rÕ   rÕ   g  s*  ø€ ð )Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø3Ð3Ð3Ð3Ð3Ð3Ø€FØ×$Ò$Ñ&Ô&ñ ÝŒ=‰?Œ?ñ 	¥4Ô#9Ð:KÑ#LÔ#Lñ 	Ø”l×&Ò&¥tÔ'8Ð9`Ñ'aÔ'aÑbÔbˆGÝ! $¤-Ð5SÐ5SÐ5SÐ5SÐTÑTÔTð ñ �Ø—;’;˜wÑ'Ô'ð ØÝ! ! \°AÑ%5Ñ6Ô6ð ñ �DÝ+¨G°TÑ:Ô:�FØ!ð !¥T¨&¡\¤\Ð%=Ø Ý(¨°¬Ñ7Ô7�HØÐ+°·
²
¸8ÀRÑ0HÔ0HÍCÐPXÉMÌMÒ0YÐ0YØ Ý”~Ñ'Ô'¨&¯*ª*µT¸&±\´\ÅKÀ<Ñ*PÔ*PÑPÕS^Ò^Ð^Ø Ø ×)Ò)¨'Ñ2Ô2ð Ø˜˜˜Ý˜v‘”Ð.Ý/3¬~Ñ/?Ô/?˜�t F™|œ|Ñ,Ø×+Ò+¨DÑ1Ô1ð Ø˜˜˜ññð ×Ò Ñ$Ô$ð 	ØˆFð- ×$Ò$Ñ&Ô&ñ ð ð ð ð r   c                 óà   — 	 t          | ¦  «         d S # t          $ rP}t          j        d                     t          |¦  «        j        |¦  «        t          j        ¦  «         Y d }~d S d }~ww xY w)Nu0   [MilionÃ¡Å™ Skin] journal thread stopped: {}: {})rÕ   rB   r6   r  r9   rÀ   ri   r  )r>  r«   s     r   Ú_guardedrA  †  s~   € ðtÝˆG‰ŒˆˆˆøÝð tð tð tÝŒÐC×JÒJÍ4ÐPSÉ9Ì9ÔK]Ð_bÑcÔcÕeiÔerÑsÔsÐsÐsÐsÐsÐsÐsÐsøøøøðtøøøs   ‚ “
A-�AA(Á(A-c                 ó‚   — t          ¦   «          t          j        t          | fdd¬¦  «                             ¦   «          d S )Nzmilionar-journalT)rV   r^   r>   Údaemon)r�   Ú	threadingÚThreadrA  Ústart)r>  s    r   rF  rF  �  s;   € Ý�I„I€IÝÔ�H¨G¨:Ð<NÐW[Ð\Ñ\Ô\×bÒbÑdÔdÐdÐdÐdr   )0rl   r3   r   rD  r   r:   r6   r   rG   rÒ   r   rì   rI   r'   rõ   r  r  r;  Úlocalr{   ÚLockrÓ   rq   r   r   r,   r>   rD   rK   rM   rn   r}   r�   rƒ   r…   r²   rÆ   rØ   rý   r  r  r  r  r  r+  rÕ   rA  rF  r0   r   r   ú<module>rI     sš  ððð ð$ €€€Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø €€€à €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð à€ØM€	Ø€	Ø€Ø%Ð0AÐ
BÐ
B€Ø"€Ø€Ø	ˆŒÑ	Ô	€Ø	ˆŒÑ	Ô	€Ø€
Ø	€ðð ð ð
ð 
ð 
ðzð zð zðð ð ðPð Pð Pðð ð ð ð ñ ô ð ð"ð ð ð ð ñ ô ð ð0'ð 'ð 'ð$ð $ð $ð"ð "ð "ð
*ð *ð *ð *ð *ñ *ô *ð *ðZ
Jð 
Jð 
Jðð ð ð_ð _ð _ð&ð ð ð8ð ð ð,Xð Xð Xð&/ð /ð /ðð ð ðð ð ð4\ð \ð \ðð ð ð>tð tð tðeð eð eð eð er   