§
    ƒØjß  ã                  ó  — U 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 dlZ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mZ  ej        d¦  «        ZdZej        j        Z ej        d	e¦  «        Z ej        d
e¦  «        Z ej        de¦  «        Z ej        de¦  «        Z ej        de¦  «        Z ej        de¦  «        Z ej        de¦  «        Z ej        de¦  «        Z ej        de¦  «        ZdZ dZ!dZ"dZ#dZ$dGd„Z%d„ Z&d„ Z'd„ Z( G d„ d¦  «        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j.        e)¦  «        Z/ G d'„ d(¦  «        Z0 G d)„ d*e0¦  «        Z1 G d+„ d,e0¦  «        Z2 G d-„ d.e2¦  «        Z3 G d/„ d0e2¦  «        Z4 G d1„ d2e0¦  «        Z5 G d3„ d4e5¦  «        Z6 G d5„ d6e5¦  «        Z7 G d7„ d8e7¦  «        Z8 G d9„ d:¦  «        Z9g Z:d;e;d<<    G d=„ d>e	j<        ¦  «        Z= G d?„ d@e	j<        ¦  «        Z>dA„ Z?e@dBk    r× eAejB        ¦  «        dCk    r e?¦   «          dS  e>¦   «         ZC e=¦   «         ZD eAejB        ¦  «        dDk     sejB        dC         dEv rd dlZ ejE        e>¦  «         dS ejB        dC         dFk    r!  eFeDejB        dD         ¦  «        ¦   «          dS  eGeCejB        dC         ¦  «        r#  eFeCejB        dC         ¦  «        ¦   «          dS dS dS )Hé    )ÚannotationsN)Úreload)Úcommon)Úenvironment)Úexceptions21Ú	configureTzFinale.*\.appzSibelius\.appzFinale.*\.exezSibelius\.exezFinale Reader\.appzMuseScore.*\.appz"Musescore.*\\bin\\MuseScore.*\.exezDorico.*\.appzDorico.*\.exez$https://www.music21.org/music21docs/zhttps://www.musescore.orgz'https://groups.google.com/g/music21listéN   é   c                ó  — t          j        | ¦  «        r| }n|                      d¦  «        }g }|r[|D ]W}|dk    r|                     d¦  «         Œ|dk    r|                     d¦  «         Œ:|t	          j        |t          ¦  «        z  }ŒXn|}d}t          |¦  «        D ]ä\  }}|dk    rd}na|dk    rt          |¦  «        dk    rd|› d�}nA|dk    rt          |¦  «        dk    rd|› d�}n!|t          |¦  «        dz
  k     r|› d�}n|› d�}|dk    r-||z  dk    r$t          d¬¦  «        }	|	 
                    ¦   «          t          j                             |¦  «         t          j                             ¦   «          |dz  }Œåd	S )
z_
    Display a message to the user, handling multiple lines as necessary and wrapping text
    ú
Ú ú r   é   z 
zPausing for page.©ÚpromptHeaderN)r   Ú
isListLikeÚsplitÚappendÚtextwrapÚwrapÚ
LINE_WIDTHÚ	enumerateÚlenÚAnyKeyÚaskUserÚsysÚstdoutÚwriteÚflush)
ÚmsgÚ	wrapLinesÚlinesPerPageÚlinesÚpostÚsubÚ	lineCountÚiÚlineÚds
             ú†/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/configure.pyÚwriteToUserr+   G   sÅ  € õ
 Ô˜ÑÔð  Øˆˆð —	’	˜$‘”ˆØ€DØð 
Øð 	7ð 	7ˆCØ�bŠyˆyØ—’˜B‘”��Ø˜’�Ø—’˜CÑ Ô Ð Ð ð �œ c­:Ñ6Ô6Ñ6��ð	7ð ˆà€IÝ˜T‘?”?ð ð ‰ˆˆ4Ø�2Š:ˆ:ØˆDˆDà�!ŠVˆV�˜D™	œ	 Aš˜à!˜�>�>�>ˆDˆDà�!ŠVˆV�˜D™	œ	 Qš˜Ø˜�<�<�<ˆDˆDØ•�T‘”˜Q‘ÒÐØ�<�<�<ˆDˆDà�:�:�:ˆDØ�qŠ=ˆ=˜Y¨Ñ5¸Ò:Ð:åÐ$7Ð8Ñ8Ô8ˆAØ�IŠI‰KŒKˆKÝŒ
×Ò˜ÑÔÐÝŒ
×ÒÑÔÐØ�Q‰ˆ	ˆ	ð)ð ó    c                 ó*   — t          j        d¦  «        S )NÚpurelib)Ú	sysconfigÚget_path© r,   r*   ÚgetSitePackagesr2   v   s   € åÔ˜iÑ(Ô(Ð(r,   c                 óÞ  — i } 	 ddl }|j        | d<   n# t          $ r d| d<   Y nw xY wt          t          d¦  «        r3t	          j        ¦   «         }|d         › d|d         › d|d         › �| d	<   nd| d	<   t          j        d
t          j        ¦   «         ¦  «        | d<   t          j	        | d<   t          j
        }t          |¦  «        dk    r|d         dvr|d         | d<   n|d         | d<   | S )z,
    Return a dictionary with user data
    r   Nzmusic21.versionÚNoneÚunamez, é   é   zos.unamez%a, %d %b %Y %H:%M:%Sztime.gmtimeztime.timezoner   )Nr4   r   ztime.tzname)Úmusic21ÚVERSION_STRÚImportErrorÚhasattrÚosr5   ÚtimeÚstrftimeÚgmtimeÚtimezoneÚtznamer   )r$   r8   r5   rA   s       r*   ÚgetUserDatarB   {   s   € ð €Dð)ØˆˆˆØ")Ô"5ˆÐÑÐøÝð )ð )ð )Ø"(ˆÐÑÐÐð)øøøõ �r�7ÑÔð "Ý”‘
”
ˆØ# AœhÐ@Ð@¨%°¬(Ð@Ð@°e¸A´hÐ@Ð@ˆˆZÑÐà!ˆˆZÑåœ-Ð(?ÅÄÁÄÑOÔO€DˆÑÝ œM€DˆÑåŒ[€FÝ
ˆ6�{„{�aÒÐ˜F 1œIÐ-?Ð?Ð?Ø$ Qœiˆˆ]ÑÐà$ Qœiˆˆ]ÑØ€Ks   „ “%¤%c                óD  — | }|}d}	 t                                d|› �¦  «         |�nxt          t          j        |¦  «        ¦  «        D ]*}||k    r"t          j                             ||¦  «        } nŒ+|}t          j                             |¦  «        \  }}||k    rnŒ˜|S )zP
    Ascend up paths given a start; return when target file has been found.
    NTzat dir: )ÚenvironLocalÚ
printDebugÚsortedr<   ÚlistdirÚpathÚjoinr   )ÚstartÚtargetÚlastDirÚthisDirÚmatchÚfnÚjunks          r*   Ú_crawlPathUpwardrQ   —   s¿   € ð €GØ€GØ€EðÝ×ÒÐ 4¨7Ð 4Ð 4Ñ5Ô5Ð5ØÐØÝ�œ GÑ,Ô,Ñ-Ô-ð 	ð 	ˆBØ�VŠ|ˆ|ÝœŸš W¨bÑ1Ô1�Ø�ð ð ˆÝœŸš gÑ.Ô.‰ˆ�Ø�gÒÐØðð €Lr,   c                  ó    — e Zd ZdZdd„Zd„ ZdS )ÚDialogErrorz;
    DialogError is a normal object, not an Exception.
    Nc                ó   — || _         d S ©N©Úsrc)ÚselfrW   s     r*   Ú__init__zDialogError.__init__µ   s   € ØˆŒˆˆr,   c                ó2   — d| j         j        › d| j        › d�S )Nz<music21.configure.z: ú>)Ú	__class__Ú__name__rW   ©rX   s    r*   Ú__repr__zDialogError.__repr__¸   s"   € ØK T¤^Ô%<ÐKÐKÀÄÐKÐKÐKÐKr,   rU   )r]   Ú
__module__Ú__qualname__Ú__doc__rY   r_   r1   r,   r*   rS   rS   ±   sF   € € € € € ðð ðð ð ð ðLð Lð Lð Lð Lr,   rS   c                  ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚKeyInterruptErrorzI
    Subclass of DialogError that deals with Keyboard Interruptions.
    Nc                óL   •— t          ¦   «                              |¬¦  «         d S ©NrV   ©ÚsuperrY   ©rX   rW   r\   s     €r*   rY   zKeyInterruptError.__init__Á   ó$   ø€ Ý‰Œ×Ò˜SÐÑ!Ô!Ð!Ð!Ð!r,   rU   ©r]   r`   ra   rb   rY   Ú__classcell__©r\   s   @r*   rd   rd   ¼   óG   ø€ € € € € ðð ð"ð "ð "ð "ð "ð "ð "ð "ð "ð "r,   rd   c                  ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚIncompleteInputzv
    Subclass of DialogError that runs when the user has provided
    incomplete input that cannot be understood.
    Nc                óL   •— t          ¦   «                              |¬¦  «         d S rf   rg   ri   s     €r*   rY   zIncompleteInput.__init__Ë   rj   r,   rU   rk   rm   s   @r*   rp   rp   Å   sG   ø€ € € € € ðð ð
"ð "ð "ð "ð "ð "ð "ð "ð "ð "r,   rp   c                  ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚNoInputzf
    Subclass of DialogError for when the user has provided no input, and there is not a default.
    Nc                óL   •— t          ¦   «                              |¬¦  «         d S rf   rg   ri   s     €r*   rY   zNoInput.__init__Ô   rj   r,   rU   rk   rm   s   @r*   rs   rs   Ï   rn   r,   rs   c                  ó$   ‡ — e Zd ZdZdˆ fd„	Zˆ xZS )ÚBadConditionsz¢
    Subclass of DialogError for when the user's system does support the
    action of the dialog: something is missing or
    otherwise prohibits operation.
    Nc                óL   •— t          ¦   «                              |¬¦  «         d S rf   rg   ri   s     €r*   rY   zBadConditions.__init__ß   rj   r,   rU   rk   rm   s   @r*   rv   rv   Ø   sG   ø€ € € € € ðð ð"ð "ð "ð "ð "ð "ð "ð "ð "ð "r,   rv   c                  ó   — e Zd ZdS )ÚDialogExceptionN)r]   r`   ra   r1   r,   r*   ry   ry   ä   s   € € € € € Ø€Dr,   ry   c                  ó–   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zdd	„Z	dd„Z
dd„Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zdddœd„Zdd„Zdd„Zdd„ZdS )ÚDialogaG  
    Model a dialog as a question and response. Have different subclasses for
    different types of questions. Store all in a Conversation, or multiple dialog passes.

    A `default`, if provided, is returned if the users provides no input and just enters return.

    The `tryAgain` option determines if, if a user provides incomplete or no response,
    and there is no default (for no response), whether the user is given another chance
    to provide valid input.

    The `promptHeader` is a string header that is placed in front of any common header
    for this dialog.
    NTc                óÐ   — d | _         d | _        |                      |¦  «        }t          |t          ¦  «        s|| _        nd | _        || _        || _        d| _        g d¢| _	        d S )Né   )ÚwinÚdarwinÚnix)
Ú_resultÚ_resultPriorÚ_parseUserInputÚ
isinstancerS   Ú_defaultÚ	_tryAgainÚ_promptHeaderÚ_maxAttemptsÚ
_platforms)rX   ÚdefaultÚtryAgainr   ÚdefaultCookeds        r*   rY   zDialog.__init__ù   sx   € àˆŒà ˆÔð ×,Ò,¨WÑ5Ô5ˆõ ˜-­Ñ5Ô5ð 	!Ø)ˆDŒMˆMð !ˆDŒMà!ˆŒØ)ˆÔð ˆÔð 3Ð2Ð2ˆŒˆˆr,   c                ó$   — t          |¦  «         dS )zB
        Write output to user. Call module-level function
        N)r+   ©rX   r    s     r*   Ú_writeToUserzDialog._writeToUser  s   € õ 	�CÑÔÐÐÐr,   c                ó’   — 	 t          ¦   «         }|S # t          $ r t          ¦   «         cY S t          $ r t	          ¦   «         cY S w xY w)zF
        Collect from user; return None if an empty response.
        )ÚinputÚKeyboardInterruptrd   Ú	ExceptionrS   )rX   r$   s     r*   Ú_readFromUserzDialog._readFromUser  sd   € ð
	!Ý‘7”7ˆDØˆKøÝ ð 	'ð 	'ð 	'å$Ñ&Ô&Ð&Ð&Ð&Ýð 	!ð 	!ð 	!Ý‘=”=Ð Ð Ð ð	!øøøs   ‚ ’A¬AÁAc                óp   — |                      ¦   «         }| j        �|› d| j        › �| _        dS || _        dS )a_  
        Add a message to the front of the stored prompt header.

        >>> d = configure.Dialog()
        >>> d.prependPromptHeader('test')
        >>> d._promptHeader
        'test'

        >>> d = configure.Dialog(promptHeader='this is it')
        >>> d.prependPromptHeader('test')
        >>> d._promptHeader
        'test this is it'
        Nr   ©Ústripr‡   rŽ   s     r*   ÚprependPromptHeaderzDialog.prependPromptHeader'  sG   € ð �iŠi‰kŒkˆØÔÐ)Ø$'Ð!>Ð!>¨$Ô*<Ð!>Ð!>ˆDÔÐÐà!$ˆDÔÐÐr,   c                óp   — |                      ¦   «         }| j        �| j        › d|› �| _        dS || _        dS )a  

        >>> d = configure.Dialog()
        >>> d.appendPromptHeader('test')
        >>> d._promptHeader
        'test'

        >>> d = configure.Dialog(promptHeader='this is it')
        >>> d.appendPromptHeader('test')
        >>> d._promptHeader
        'this is it test'
        Nr   r–   rŽ   s     r*   ÚappendPromptHeaderzDialog.appendPromptHeader;  sG   € ð �iŠi‰kŒkˆØÔÐ)Ø$(Ô$6Ð!>Ð!>¸Ð!>Ð!>ˆDÔÐÐà!$ˆDÔÐÐr,   c                ó¬   — t          |dd¬¦  «        }|                     |¬¦  «         |                     ¦   «         }t          |t          ¦  «        rdS |S )as  
        What to do if input is incomplete

        >>> prompt = configure.YesOrNo(default=True)
        >>> prompt._askTryAgain(force='yes')
        True
        >>> prompt._askTryAgain(force='n')
        False
        >>> prompt._askTryAgain(force='')  # gets default
        True
        >>> prompt._askTryAgain(force='blah')  # error gets False
        False
        Fz)Your input was not understood. Try Again?©rŠ   r‹   r   ©Úforce)ÚYesOrNor   Ú	getResultr„   rS   ©rX   rŠ   rž   r)   r$   s        r*   Ú_askTryAgainzDialog._askTryAgainN  s_   € õ ˜G¨eØ!LðNñ Nô Nˆà	�	Š	˜ˆ	ÑÔÐØ�{Š{‰}Œ}ˆå�d�KÑ(Ô(ð 	Ø�5àˆKr,   r   c                ó>  — | j         �•| j                              ¦   «         }|                     d¦  «        s|                     d¦  «        rd}nd}| j                              d¦  «        r|dz  }n%| j                              d¦  «        r|dz  }n|dz  }|› |› |› �}|S )	aT  
        Prepare the header, given a string.

        >>> from music21 import configure
        >>> d = configure.Dialog()
        >>> d._rawQueryPrepareHeader('test')
        'test'
        >>> d = configure.Dialog(promptHeader='what are you doing?')
        >>> d._rawQueryPrepareHeader('test')
        'what are you doing? test'
        Nú?ú.r   ú:z

r   r   )r‡   r—   Úendswith)rX   r    ÚheaderÚdivs       r*   Ú_rawQueryPrepareHeaderzDialog._rawQueryPrepareHeaderg  s¿   € ð ÔÐ)ØÔ'×-Ò-Ñ/Ô/ˆFØ�Š˜sÑ#Ô#ð  v§¢°sÑ';Ô';ð Ø��à�àÔ!×*Ò*¨6Ñ2Ô2ð Ø�v‘��ØÔ#×,Ò,¨TÑ2Ô2ð Ø�t‘��à�s‘
�ØÐ'˜SÐ' #Ð'Ð'ˆCØˆ
r,   c                óö   — | j         �q|                     ¦   «         }|                     d¦  «        r!d}|dd…         }|                     ¦   «          nd}|                      | j         ¦  «        }|› d|› d|› d�}|S )z6
        Prepare the end of the query message
        Nr¦   éÿÿÿÿr   z (default is ú)r   )r…   r—   r§   Ú_formatResultForUser)rX   r    r©   rŠ   s       r*   Ú_rawQueryPrepareFooterzDialog._rawQueryPrepareFooterƒ  s‹   € ð Œ=Ð$Ø—)’)‘+”+ˆCØ�|Š|˜CÑ Ô ð Ø�Ø˜#˜2˜#”h�Ø—	’	‘”��à�Ø×/Ò/°´Ñ>Ô>ˆGàÐ7Ð7 wÐ7Ð7°Ð7Ð7Ð7ˆCØˆ
r,   c                ó   — dS )úE
        Return a multiline presentation of an introduction.
        Nr1   r^   s    r*   Ú_rawIntroductionzDialog._rawIntroduction”  ó	   € ð ˆtr,   c                ó   — dS )úB
        Return a multiline presentation of the question.
        Nr1   r^   s    r*   Ú	_rawQueryzDialog._rawQueryš  ó	   € ð 	ˆr,   c                ó   — |S )zý
        For various result options, we may need to at times convert the internal
        representation of the result into something else. For example, we might present
        the user with 'Yes' or 'No' but store the result as True or False.
        r1   ©rX   Úresults     r*   r®   zDialog._formatResultForUser   s	   € ð ˆr,   c                ó   — |S )z±
        Translate string to desired output. Pass None through
        (as no input), convert '' to None, and pass all other
        outputs as IncompleteInput objects.
        r1   ©rX   Úraws     r*   rƒ   zDialog._parseUserInput©  s	   € ð ˆ
r,   c                ó   — dS )z®
        Evaluate the user's string entry after parsing; do not return None:
        either return a valid response, default if available, or IncompleteInput object.
        Nr1   r¼   s     r*   Ú_evaluateUserInputzDialog._evaluateUserInput±  ó	   € ð
 	ˆr,   c                ó   — dS )zŒ
        Call this method immediately before calling askUser.
        Can be used for configuration getting additional information.
        Nr1   ©rX   rž   s     r*   Ú_preAskUserzDialog._preAskUser¹  rÀ   r,   F)Ú	skipIntroc               óì  — |                       ¦   «         }|�|s|                      |¦  «         |                      |¬¦  «        }|du rt          ¦   «         | _        dS t          | j        ¦  «        D �]}|                      ¦   «         }t          |t          ¦  «        r
|| _         dS |€*|                      |¦  «         |  
                    ¦   «         }nt                               d|g¦  «         |}t          |t          ¦  «        r
|| _         dS |                      |¦  «        }t          |t          t           f¦  «        r)|| _        | j        r|                      ¦   «         rŒó dS  dS || _         dS dS )z’
        Ask the user, display the query. The force argument can
        be provided to test. Sets self._result; does not return a value.
        Nr�   FzwriteToUser:)r²   r�   rÃ   rv   r�   Úrangerˆ   r¶   r„   rS   r”   rD   rE   rd   r¿   rs   rp   r†   r¢   )	rX   rž   rÄ   Úintror$   r'   ÚqueryÚrawInputÚcookedInputs	            r*   r   zDialog.askUserÁ  sž  € ð ×%Ò%Ñ'Ô'ˆØÐ YÐØ×Ò˜eÑ$Ô$Ð$ð ×Ò eÐÑ,Ô,ˆØ�5ˆ=ˆ=Ý(™?œ?ˆDŒLØˆFõ �tÔ(Ñ)Ô)ð /	ñ /	ˆAð —N’NÑ$Ô$ˆEÝ˜%¥Ñ-Ô-ð à$�”Ø��àˆ}Ø×!Ò! %Ñ(Ô(Ð(Ø×-Ò-Ñ/Ô/��å×'Ò'¨¸Ð(?Ñ@Ô@Ð@Ø �õ
 ˜(Õ$5Ñ6Ô6ð à'�”Ø��ð
 ×1Ò1°(Ñ;Ô;ˆKõ
 ˜+­µÐ'AÑBÔBð à*�”Ø”>ð à×(Ò(Ñ*Ô*ð Øà˜˜à�E�Eð  +�”Ø��ð_/	ð /	r,   c                ó   — | j         S )zŠ
        Return the result, or None if not set. This may also do a
        processing routine that is part of the desired result.
        )r�   ©rX   Úsimulates     r*   r    zDialog.getResult  s   € ð
 Œ|Ðr,   c                ó   — dS )z4
        does nothing; redefine in subclass
        Nr1   rÌ   s     r*   Ú_performActionzDialog._performAction  r·   r,   c                óŒ  — |                       ¦   «         }t          | j        t          ¦  «        r;t                               d| j        › �¦  «         |                      ddg¦  «         dS |r$t                               d| j        › �¦  «         dS 	 |                      |¬¦  «         dS # t          $ r t          d¦  «        ‚w xY w)zè
        After getting a result, the query might require an action
        to be performed. If result is None, this will use whatever
        value is found in _result.

        If simulate is True, no action will be taken.
        z0performAction() called, but result is an error: zNo action taken.r   z0performAction() called, but in simulation mode: ©rÍ   z(perform action raised a dialog exceptionN)	r    r„   r�   rS   rD   rE   r�   rÏ   ry   )rX   rÍ   Údummys      r*   ÚperformActionzDialog.performAction  s   € ð —’Ñ Ô ˆÝ�d”l¥KÑ0Ô0ð 	RÝ×#Ò#ØQÀ4Ä<ÐQÐQñSô Sð Sà×ÒÐ1°3Ð7Ñ8Ô8Ð8Ð8Ð8àð 
	RÝ×#Ò#ØQÀ4Ä<ÐQÐQñSô Sð Sð Sð SðRØ×#Ò#¨XÐ#Ñ6Ô6Ð6Ð6Ð6øÝ"ð Rð Rð Rõ &Ð&PÑQÔQÐQð	Røøøs   ÂB) Â)C©NTN)TN)r   rU   )T©F)r]   r`   ra   rb   rY   r�   r”   r˜   rš   r¢   rª   r¯   r²   r¶   r®   rƒ   r¿   rÃ   r   r    rÏ   rÓ   r1   r,   r*   r{   r{   ê   sr  € € € € € ðð ð3ð 3ð 3ð 3ð4ð ð ð!ð !ð !ð%ð %ð %ð(%ð %ð %ð&ð ð ð ð2ð ð ð ð8ð ð ð ð"ð ð ðð ð ðð ð ðð ð ðð ð ðð ð ð ðA¨uð Að Að Að Að AðHð ð ð ðð ð ð ðRð Rð Rð Rð Rð Rr,   r{   c                  ó0   ‡ — e Zd ZdZdˆ fd„	Zd„ Zd„ Zˆ xZS )r   z#
    Press any key to continue
    NFc                óP   •— t          ¦   «                              |||¬¦  «         d S ©Nrœ   rg   ©rX   rŠ   r‹   r   r\   s       €r*   rY   zAnyKey.__init__3  ó(   ø€ Ý‰Œ×Ò °8È,ÐÑWÔWÐWÐWÐWr,   c                ó4   — d}|                       |¦  «        }|S )rµ   zPress return to continue.)rª   rŽ   s     r*   r¶   zAnyKey._rawQuery6  s#   € ð *ˆØ×)Ò)¨#Ñ.Ô.ˆð ˆ
r,   c                ó   — dS )z%
        Always returns True
        Tr1   r¼   s     r*   rƒ   zAnyKey._parseUserInput@  r³   r,   )NFN)r]   r`   ra   rb   rY   r¶   rƒ   rl   rm   s   @r*   r   r   .  sk   ø€ € € € € ðð ðXð Xð Xð Xð Xð Xðð ð ðð ð ð ð ð ð r,   r   c                  ó<   ‡ — e Zd ZdZd	ˆ fd„	Zd„ Zd„ Zd„ Zd„ Zˆ xZ	S )
rŸ   aH  
    Ask a yes or no question.

    >>> d = configure.YesOrNo(default=True)
    >>> d.askUser('yes')  # force arg for testing
    >>> d.getResult()
    True

    >>> d = configure.YesOrNo(tryAgain=False)
    >>> d.askUser('junk')  # force arg for testing
    >>> d.getResult()
     <music21.configure.IncompleteInput: junk>
    NTc                óP   •— t          ¦   «                              |||¬¦  «         d S rØ   rg   rÙ   s       €r*   rY   zYesOrNo.__init__W  rÚ   r,   c                ó>   — |du rdS |du rdS t          d|› �¦  «        ‚)a  
        For various result options, we may need to at times convert
        the internal representation of the result into something else.
        For example, we might present the user with 'Yes' or 'No' but
        store the result as True or False.
        TÚYesFÚNoz&attempting to format result for user: )ry   r¹   s     r*   r®   zYesOrNo._formatResultForUserZ  s9   € ð �Tˆ>ˆ>Ø�5Ø�uˆ_ˆ_Ø�4õ "Ð"SÈ6Ð"SÐ"SÑTÔTÐTr,   c                ó^   — d}|                       |¦  «        }|                      |¦  «        }|S )aí  
        Return a multiline presentation of the question.

        >>> d = configure.YesOrNo(default=True)
        >>> d._rawQuery()
        'Enter Yes or No (default is Yes): '
        >>> d = configure.YesOrNo(default=False)
        >>> d._rawQuery()
        'Enter Yes or No (default is No): '

        >>> d = configure.YesOrNo(default=True, promptHeader='Would you like more time?')
        >>> d._rawQuery()
        'Would you like more time? Enter Yes or No (default is Yes): '
        zEnter Yes or No: )rª   r¯   rŽ   s     r*   r¶   zYesOrNo._rawQueryj  s4   € ð "ˆØ×)Ò)¨#Ñ.Ô.ˆØ×)Ò)¨#Ñ.Ô.ˆØˆ
r,   c                óî   — |€t          ¦   «         S t          |¦  «        }|                     ¦   «         }|                     ¦   «         }|dk    rt          ¦   «         S |dv rdS |dv rdS t	          |¦  «        S )a¡  
        Translate string to desired output. Pass None and '' (as no input), as
        NoInput objects, and pass all other outputs as IncompleteInput objects.

        >>> d = configure.YesOrNo()
        >>> d._parseUserInput('y')
        True
        >>> d._parseUserInput('')
        <music21.configure.NoInput: None>
        >>> d._parseUserInput('asdf')
        <music21.configure.IncompleteInput: asdf>
        Nr   ©ÚyesÚyÚ1ÚtrueT)ÚnoÚnÚ0ÚfalseF)rs   Ústrr—   Úlowerrp   r¼   s     r*   rƒ   zYesOrNo._parseUserInput~  s{   € ð ˆ;Ý‘9”9Ðå�#‰hŒhˆØ�iŠi‰kŒkˆØ�iŠi‰kŒkˆØ�"Š9ˆ9Ý‘9”9ÐàÐ+Ð+Ð+Ø�4ØÐ-Ð-Ð-Ø�5å˜sÑ#Ô#Ð#r,   c                óv   — |                       |¦  «        }t          |t          ¦  «        r| j        �| j        S |S )aG  
        Evaluate the user's string entry after parsing;
        do not return None: either return a valid response,
        default if available, IncompleteInput, NoInput objects.

        >>> d = configure.YesOrNo()
        >>> d._evaluateUserInput('y')
        True
        >>> d._evaluateUserInput('False')
        False
        >>> d._evaluateUserInput('')  # there is no default,
        <music21.configure.NoInput: None>
        >>> d._evaluateUserInput('wer')  # there is no default,
        <music21.configure.IncompleteInput: wer>

        >>> d = configure.YesOrNo('yes')
        >>> d._evaluateUserInput('')  # there is a default
        True
        >>> d._evaluateUserInput('wbf')  # there is a default
        <music21.configure.IncompleteInput: wbf>

        >>> d = configure.YesOrNo('n')
        >>> d._evaluateUserInput('')  # there is a default
        False
        >>> d._evaluateUserInput(None)  # None is processed as NoInput
        False
        >>> d._evaluateUserInput('blah')  # None is processed as NoInput
        <music21.configure.IncompleteInput: blah>
        ©rƒ   r„   rs   r…   ©rX   r½   Ú	rawParseds      r*   r¿   zYesOrNo._evaluateUserInput›  s?   € ð< ×(Ò(¨Ñ-Ô-ˆ	å�i¥Ñ)Ô)ð 	%ØŒ}Ð(Ø”}Ð$àÐr,   rÔ   )
r]   r`   ra   rb   rY   r®   r¶   rƒ   r¿   rl   rm   s   @r*   rŸ   rŸ   H  sŒ   ø€ € € € € ðð ðXð Xð Xð Xð Xð XðUð Uð Uð ð ð ð($ð $ð $ð:$ð $ð $ð $ð $ð $ð $r,   rŸ   c                  ó0   ‡ — e Zd ZdZ	 	 dˆ fd„	Zdd„Zˆ xZS )	ÚAskOpenInBrowserz‚
    Ask the user if the want to open a URL in a browser.

    >>> d = configure.AskOpenInBrowser('https://www.music21.org/')
    TNc                ó´   •— t          ¦   «                              |||¬¦  «         || _        |�	|| _        d S d| j        › d�}|                      |¦  «         d S )Nrœ   zOpen the following URL (z) in a web browser?
)rh   rY   Ú
_urlTargetr‡   rš   )rX   Ú	urlTargetrŠ   r‹   r   Úpromptr    r\   s          €r*   rY   zAskOpenInBrowser.__init__Ê  si   ø€ å‰Œ×Ò °8È,ÐÑWÔWÐWà#ˆŒàÐà!'ˆDÔÐÐàS¨T¬_ÐSÐSÐSˆCØ×#Ò# CÑ(Ô(Ð(Ð(Ð(r,   Fc                óx   — |                       ¦   «         }|du rt          j        | j        ¦  «         dS |du rdS dS )ú]
        The action here is to open the stored URL in a browser, if the user agrees.
        TFN)r    Ú
webbrowserÚopen_newrö   ©rX   rÍ   rº   s      r*   rÏ   zAskOpenInBrowser._performAction×  sJ   € ð —’Ñ!Ô!ˆØ�Tˆ>ˆ>ÝÔ ¤Ñ0Ô0Ð0Ð0Ð0Ø�uˆ_ˆ_ØˆDð ˆ_r,   ©TTNNrÕ   )r]   r`   ra   rb   rY   rÏ   rl   rm   s   @r*   rô   rô   Ã  sc   ø€ € € € € ðð ð :>Ø+/ð)ð )ð )ð )ð )ð )ðð ð ð ð ð ð ð r,   rô   c                  ó6   ‡ — e Zd ZdZ	 	 dˆ fd„	Zd„ Zd	d„Zˆ xZS )
ÚAskSendInstallationReportzZ
    Ask the user if they want to send a report
    regarding their system and usage.
    TNc                ó”   •— t          ¦   «                              |||¬¦  «         |€i }|| _        d}|                      |¦  «         d S )Nrœ   z’Would you like to send a pre-formatted email to music21 regarding your installation? Installation reports help us make music21 work better for you)rh   rY   Ú_additionalEntriesrš   )rX   rŠ   r‹   r   ÚadditionalEntriesr    r\   s         €r*   rY   z"AskSendInstallationReport.__init__ê  sX   ø€ å‰Œ×Ò °8È,ÐÑWÔWÐWàÐ$Ø "ÐØ"3ˆÔð]ˆà×Ò Ñ$Ô$Ð$Ð$Ð$r,   c                óÞ  — g }|                      d¦  «         |                      d¦  «         |                      d¦  «         |                      d¦  «         t          ¦   «         }|                     | j        ¦  «         t	          |¦  «        D ]"}|                      |› d||         › �¦  «         Œ#|                      d¦  «         |                      t
          j        ¦  «         |                      d¦  «         |                      d¦  «         |                      d¦  «         t          j        ¦   «         }|dk    rd 	                    |¦  «        }nd	 	                    |¦  «        }d
|› �}|S )NzYPlease send the following email; your return email address will never be used in any way.r   zNThe following information on your installation will be used only for research.z // zpython version:zöBelow, please provide a few words about what sorts of tasks or problems you plan to explore with music21. Any information on your background is also appreciated (e.g., amateur musician, computer programmer, professional music researcher). Thanks!r~   z%0D%0Ar   zGmailto:music21stats@gmail.com?subject=music21 Installation Report&body=)
r   rB   Úupdater  rF   r   Úversionr   ÚgetPlatformrI   )rX   ÚbodyÚuserDataÚkeyÚplatformr    s         r*   Ú_getMailToStrz'AskSendInstallationReport._getMailToStrö  sk  € àˆØ�Šð 5ñ 	6ô 	6ð 	6à�Š�B‰ŒˆØ�Šð 6ñ 	7ô 	7ð 	7à�Š�B‰Œˆå‘=”=ˆà�Š˜Ô/Ñ0Ô0Ð0Ý˜(Ñ#Ô#ð 	5ð 	5ˆCØ�KŠK˜3Ð3Ð3 H¨S¤MÐ3Ð3Ñ4Ô4Ð4Ð4Ø�ŠÐ%Ñ&Ô&Ð&Ø�Š•C”KÑ Ô Ð à�Š�B‰ŒˆØ�Šð Sñ 	Tô 	Tð 	Tð 	�Š�B‰ŒˆåÔ%Ñ'Ô'ˆØ�uÒÐØ—=’= Ñ&Ô&ˆDˆDà—9’9˜T‘?”?ˆDàbÐZ^ÐbÐbˆØˆ
r,   Fc                ó†   — |                       ¦   «         }|du r(t          j        |                      ¦   «         ¦  «         dS dS )rú   TN)r    rû   Úopenr  rý   s      r*   rÏ   z(AskSendInstallationReport._performAction  sE   € ð —’Ñ!Ô!ˆØ�Tˆ>ˆ>ÝŒO˜D×.Ò.Ñ0Ô0Ñ1Ô1Ð1Ð1Ð1ð ˆ>r,   rþ   rÕ   )r]   r`   ra   rb   rY   r  rÏ   rl   rm   s   @r*   r   r   å  ss   ø€ € € € € ðð ð /3Ø6:ð
%ð 
%ð 
%ð 
%ð 
%ð 
%ð ð  ð  ðD2ð 2ð 2ð 2ð 2ð 2ð 2ð 2r,   r   c                  óV   ‡ — e Zd ZdZdˆ fd„	Zdd„Zd„ Zdd„Zdd„Zdd	„Z	d
„ Z
d„ Zˆ xZS )ÚSelectFromLista  
    General class to select values from a list.

    >>> d = configure.SelectFromList()  # empty selection list
    >>> d.askUser('no')  # results in bad condition
    >>> d.getResult()
    <music21.configure.BadConditions: None>

    >>> d = configure.SelectFromList()  # empty selection list
    >>> def validResults(force=None):
    ...     return range(5)
    >>> d._getValidResults = validResults  # provide alt function for testing
    >>> d.askUser(2)  # results in bad condition
    >>> d.getResult()
    2
    NTc                óP   •— t          ¦   «                              |||¬¦  «         d S rØ   rg   rÙ   s       €r*   rY   zSelectFromList.__init__4  rÚ   r,   c                ó   — |�|S g S )zg
        Return a list of valid results that are possible and should be displayed to the user.
        r1   rÂ   s     r*   Ú_getValidResultszSelectFromList._getValidResults7  s   € ð ÐØˆLàˆIr,   c                ó   — |S )zV
        Reduce each complete file path to stub, or otherwise compact display
        r1   r¹   s     r*   r®   z#SelectFromList._formatResultForUserB  s	   € ð ˆr,   c                óÒ   — t          |dd¬¦  «        }|                     |¬¦  «         |                     ¦   «         }t          |t          ¦  «        rdS |dvrt          d¦  «        ‚|S )aæ  
        What to do if the selection list is empty. Only return True or False:
        if we should continue or not.

        >>> prompt = configure.SelectFromList(default=True)
        >>> prompt._askFillEmptyList(force='yes')
        True
        >>> prompt._askFillEmptyList(force='n')
        False
        >>> prompt._askFillEmptyList(force='')  # no default, returns False
        False
        >>> prompt._askFillEmptyList(force='blah')  # error gets false
        False
        Fz'The selection list is empty. Try Again?rœ   r�   )TFz>_askFillEmptyList(): sub-command returned non True/False value)rŸ   r   r    r„   rS   ry   r¡   s        r*   Ú_askFillEmptyListz SelectFromList._askFillEmptyListH  s…   € õ  ˜GØ"Ø!JðLñ Lô Lˆð 	
�	Š	˜ˆ	ÑÔÐØ�{Š{‰}Œ}ˆå�d�KÑ(Ô(ð 	Ø�5à˜=Ð(Ð(å%ØTñVô Vð VàˆKr,   c                ób   — |                       ¦   «         }|s|                      |¬¦  «        }|S dS )a¤  
        Before we ask user, we need to run _askFillEmptyList list if the list is empty.

        >>> d = configure.SelectFromList()
        >>> d._preAskUser('no')  # force for testing
        False
        >>> d._preAskUser('yes')  # force for testing
        True
        >>> d._preAskUser('')  # no default, returns False
        False
        >>> d._preAskUser('x')  # bad input returns False
        False
        r�   T)r  r  )rX   rž   Úoptionsr$   s       r*   rÃ   zSelectFromList._preAskUserg  s=   € ð ×'Ò'Ñ)Ô)ˆØð 	à×)Ò)°Ð)Ñ6Ô6ˆDØˆKà�4r,   c                ó2  — g }d}|                       |¬¦  «        }|st          d¦  «        S |D ]7}|                      |¦  «        }|                     d|› d|› �¦  «         |dz  }Œ8d}|                      |¦  «        }|                      |¦  «        }|d|gz   S )aà  
        Return a multiline presentation of the question.

        >>> d = configure.SelectFromList()
        >>> d._rawQuery(['a', 'b', 'c'])
        ['[1] a', '[2] b', '[3] c', ' ', 'Choose a number from the preceding options: ']

        >>> d = configure.SelectFromList(default=1)
        >>> d._default
        1
        >>> d._rawQuery(['a', 'b', 'c'])
        ['[1] a', '[2] b', '[3] c', ' ',
         'Choose a number from the preceding options (default is 1): ']
        r   r�   zno options availableú[z] z,Choose a number from the preceding options: r   )r  rv   r®   r   rª   r¯   )rX   rž   Úheadr'   r  Úentryr%   Útails           r*   r¶   zSelectFromList._rawQuery}  sÀ   € ð ˆØˆØ×'Ò'¨eÐ'Ñ4Ô4ˆàð 	9Ý Ð!7Ñ8Ô8Ð8àð 	ð 	ˆEØ×+Ò+¨EÑ2Ô2ˆCØ�KŠK˜˜A˜˜ ˜˜Ñ'Ô'Ð'Ø�‰FˆAˆAà=ˆØ×*Ò*¨4Ñ0Ô0ˆØ×*Ò*¨4Ñ0Ô0ˆØ�s˜D�kÑ!Ð!r,   c                óÖ   — |€t          ¦   «         S |dk    rt          ¦   «         S |dv rd}n=	 t          |¦  «        }n,# t          t          t          f$ r t          |¦  «        cY S w xY w|S )zæ
        Convert all values to an integer, or return NoInput or IncompleteInput.
        Do not yet evaluate whether the number is valid in the context of the selection choices.

        >>> d = configure.SelectFromList()
        Nr   rä   r   )rs   ÚintÚ
ValueErrorÚ	TypeErrorÚZeroDivisionErrorrp   )rX   r½   r$   s      r*   rƒ   zSelectFromList._parseUserInput�  s‰   € ð ˆ;Ý‘9”9ÐØ�"Š9ˆ9Ý‘9”9Ðð Ð+Ð+Ð+ØˆDˆDð,Ý˜3‘x”x��øå¥	Õ+<Ð=ð ,ð ,ð ,Ý& sÑ+Ô+Ð+Ð+Ð+ð,øøøàˆs   ­= ½&A&Á%A&c                óv   — |                       |¦  «        }t          |t          ¦  «        r| j        �| j        S |S rU   rð   rñ   s      r*   r¿   z!SelectFromList._evaluateUserInputµ  sA   € Ø×(Ò(¨Ñ-Ô-ˆ	õ �i¥Ñ)Ô)ð 	%ØŒ}Ð(Ø”}Ð$ð Ðr,   rÔ   rU   ©NN)r]   r`   ra   rb   rY   r  r®   r  rÃ   r¶   rƒ   r¿   rl   rm   s   @r*   r  r  "  sË   ø€ € € € € ðð ð"Xð Xð Xð Xð Xð Xð	ð 	ð 	ð 	ðð ð ðð ð ð ð>ð ð ð ð,"ð "ð "ð "ð@ð ð ð0	ð 	ð 	ð 	ð 	ð 	ð 	r,   r  c                  ó@   ‡ — e Zd ZdZdˆ fd„	Zd„ Zdd„Zd„ Zdd
„Zˆ xZ	S )ÚAskAutoDownloadú5
    General class to select values from a list.
    r   TNc                óP   •— t          ¦   «                              |||¬¦  «         d S rØ   rg   rÙ   s       €r*   rY   zAskAutoDownload.__init__Æ  rÚ   r,   c                ó
   — g d¢S )r±   )aº  The BSD-licensed music21 software is distributed with a corpus of encoded compositions which are distributed with the permission of the encoders (and, where needed, the composers or arrangers) and where permitted under United States copyright law. Some encodings included in the corpus may not be used for commercial uses or have other restrictions: please see the licenses embedded in individual compositions or directories for more details.r   aN  In addition to the corpus distributed with music21, other pieces are not included in this distribution, but are indexed as links to other web sites where they can be downloaded (the "virtual corpus"). If you would like, music21 can help your computer automatically resolve these links and bring them to your hard drive for analysis.  a¤  To the best of our knowledge, the music (if not the encodings) in the corpus are either out of copyright in the United States and/or are licensed for non-commercial use. These works, along with any works linked to in the virtual corpus, may or may not be free in your jurisdiction. If you believe this message to be in error regarding one or more works please contact Michael Cuthbert at michael.asato.cuthbert@gmail.comr   zWould you like to:r1   r^   s    r*   r²   z AskAutoDownload._rawIntroductionÉ  s   € ðð ð ð 	r,   c                ó   — |�|S g d¢S )z,
        Just return number options
        N)zPAcknowledge these terms and allow music21 to aid in finding pieces in the corpusz4Acknowledge these terms and block the virtual corpusz}Do not agree to these terms and will not use music21 (agreeing to the terms of the corpus is mandatory for using the system).r1   rÂ   s     r*   r  z AskAutoDownload._getValidResultsæ  s#   € ð ÐØˆLðð ð ð r,   c                óâ   — |                       |¦  «        }t          |t          ¦  «        r| j        �| j        }t          |t          ¦  «        r|S d|cxk    rdk    rn n|S t          |¦  «        S )zµ
        Evaluate the user's string entry after parsing; do not return None:
        either return a valid response, default if available, IncompleteInput, NoInput objects.
        Nr   é   )rƒ   r„   rs   r…   rS   rp   rñ   s      r*   r¿   z"AskAutoDownload._evaluateUserInputô  sŠ   € ð
 ×(Ò(¨Ñ-Ô-ˆ	å�i¥Ñ)Ô)ð 	*ØŒ}Ð(ð !œM�	õ �i¥Ñ-Ô-ð 	ØÐà�	ÐÐÒÐ˜QÒÐÐÐÐØÐå" 9Ñ-Ô-Ð-r,   Fc                ó\  — |                       ¦   «         }|dv rat          t          ¦  «         |dk    rt          j        dd¦  «         n1|dk    rt          j        dd¦  «         n|dk    rt	          d¦  «        ‚|d	v r.|                      d
t          j        d¦  «        › �dg¦  «         dS dS )z 
        override base.
        )r   r6   r,  r   ÚautoDownloadÚallowr6   Údenyr,  z6user selected an option that terminates configuration.)r   r6   zAuto Download set to: r   N)r    r   r   Úsetry   r�   Úgetrý   s      r*   rÏ   zAskAutoDownload._performAction  sÆ   € ð —’Ñ!Ô!ˆØ�YÐÐå•;ÑÔÐà˜Š{ˆ{å” °Ñ8Ô8Ð8Ð8à˜1’�å” °Ñ7Ô7Ð7Ð7Ø˜1’�Ý%Ð&^Ñ_Ô_Ð_à�VÐÐØ×ÒÐY½¼ÈÑ8WÔ8WÐYÐYÐ[^Ð_Ñ`Ô`Ð`Ð`Ð`ð Ðr,   )r   TNrU   rÕ   )
r]   r`   ra   rb   rY   r²   r  r¿   rÏ   rl   rm   s   @r*   r&  r&  Á  s›   ø€ € € € € ðð ðXð Xð Xð Xð Xð Xðð ð ð:ð ð ð ð.ð .ð .ð.að að að að að að að ar,   r&  c                  óH   ‡ — e Zd ZdZdˆ fd„	Zddœdd„Zdd„Zdd„Zd„ Zˆ xZ	S )ÚSelectFilePathr'  NTc                óP   •— t          ¦   «                              |||¬¦  «         d S rØ   rg   rÙ   s       €r*   rY   zSelectFilePath.__init__'  rÚ   r,   z**/*©ÚglobÚpath0rí   r$   ú	list[str]r7  c               óÒ   — t          j        |¦  «        }|                     |¦  «        D ]<} |t          |¦  «        ¦  «        r"|                     t          |¦  «        ¦  «         Œ=dS )a´  
        Uses comparisonFunction to see if a file in path0 matches
        the RE embedded in comparisonFunction and if so manipulate the list
        in post

        comparisonFunction = function (lambda function on path returning True/False)
        path0 = os-specific string
        post = list of matching results to fill
        glob = string to glob for (default ``**/*``, but ``**/*.exe`` on Windows and ``*`` on Mac).
        N)ÚpathlibÚPathr7  rí   r   )rX   ÚcomparisonFunctionr8  r$   r7  Úpath0_as_pathÚpath1s          r*   Ú_getAppOSIndependentz#SelectFilePath._getAppOSIndependent*  sl   € õ  œ UÑ+Ô+ˆØ"×'Ò'¨Ñ-Ô-ð 	(ð 	(ˆEØ!Ð!¥# e¡*¤*Ñ-Ô-ð (Ø—’�C ™JœJÑ'Ô'Ð'øð	(ð 	(r,   Úreturnc                ó    — g }dt          j        dd¬¦  «        fD ]2}t          |t          ¦  «        sJ ‚|                      |||d¬¦  «         Œ3|S )z¿
        Provide a comparison function that returns True or False based on the file name.
        This looks at everything in Applications, as well as every directory in Applications
        z/Applicationsz~/ApplicationsF)ÚreturnPathlibÚ*r6  )r   Ú	cleanpathr„   rí   r@  )rX   r=  r$   r8  s       r*   Ú_getDarwinAppzSelectFilePath._getDarwinApp<  sm   € ð
 ˆØ%¥vÔ'7Ð8HÐX]Ð'^Ñ'^Ô'^Ð_ð 	Qð 	QˆEÝ˜e¥SÑ)Ô)Ð)Ð)Ð)Ø×%Ò%Ð&8¸%ÀÈCÐ%ÑPÔPÐPÐPØˆr,   c                óš   — g }d}|D ]C}|t           j        vrŒt           j        |         }|dk    rŒ*|                      |||d¬¦  «         ŒD|S )zb
        Provide a comparison function that returns True or False based on the file name.
        )ÚProgramFileszProgramFiles(x86)ÚProgramW6432r   z**/*.exer6  )r<   Úenvironr@  )rX   r=  r$   ÚenvironKeysÚpossibleEnvironKeyÚenvironPaths         r*   Ú
_getWinAppzSelectFilePath._getWinAppG  sr   € ð
 ˆØKˆØ"-ð 	^ð 	^ÐØ!­¬Ð3Ð3ØÝœ*Ð%7Ô8ˆKØ˜bÒ Ð ØØ×%Ò%Ð&8¸+ÀtÐR\Ð%Ñ]Ô]Ð]Ð]àˆr,   c                ó6  — |                       |¦  «        }t          |t          ¦  «        r| j        �| j        }t          |t          ¦  «        r|S |                      ¦   «         }d|cxk    rt          |¦  «        k    rn n||dz
           S t          |¦  «        S )a  
        Evaluate the user's string entry after parsing;
        do not return None: either return a valid response, default if available,
        IncompleteInput, NoInput objects.

        Here, we convert the user-selected number into a file path
        Nr   )rƒ   r„   rs   r…   rS   r  r   rp   )rX   r½   rò   r  s       r*   r¿   z!SelectFilePath._evaluateUserInputX  s¬   € ð ×(Ò(¨Ñ-Ô-ˆ	å�i¥Ñ)Ô)ð 	*ØŒ}Ð(ð !œM�	õ �i¥Ñ-Ô-ð 	ØÐð ×'Ò'Ñ)Ô)ˆØ�	Ð)Ð)Ò)Ð)�S ™\œ\Ò)Ð)Ð)Ð)Ð)Ø˜9 q™=Ô)Ð)å" 9Ñ-Ô-Ð-r,   rÔ   )r8  rí   r$   r9  r7  rí   )rA  r9  )
r]   r`   ra   rb   rY   r@  rF  rN  r¿   rl   rm   s   @r*   r4  r4  "  s§   ø€ € € € € ðð ðXð Xð Xð Xð Xð Xð
 *0ð(ð (ð (ð (ð (ð (ð$	ð 	ð 	ð 	ðð ð ð ð".ð .ð .ð .ð .ð .ð .r,   r4  c                  óJ   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zdd	„Z	dd
„Z
dd„ZdS )ÚSelectMusicXMLReaderzJ
    Select a MusicXML Reader by presenting a user a list of options.
    NTc                óT   — t                                | |||¬¦  «         ddg| _        d S )Nrœ   r   r~   )r4  rY   r‰   )rX   rŠ   r‹   r   s       r*   rY   zSelectMusicXMLReader.__init__z  s<   € Ý×Ò Ø(/Ø)1Ø-9ð 	 ñ 	;ô 	;ð 	;ð $ UÐ+ˆŒˆˆr,   c                ó
   — ddgS )r±   zÅDefining an XML Reader permits automatically opening music21-generated MusicXML in an editor for display and manipulation when calling the show() method. Setting this option is highly recommended. r   r1   r^   s    r*   r²   z%SelectMusicXMLReader._rawIntroductionƒ  s   € ð
Oð ð	
ð 	
r,   c                óN  — d„ }d„ }d„ }d„ }d„ }|                       |¦  «        }||                       |¦  «        z  }||                       |¦  «        z  }||                       |¦  «        z  }||                       |¦  «        z  }g }|D ]}||vr|                     |¦  «         Œ|S )zP
        Get all possible MusicXML Reader paths on Darwin (i.e., macOS)
        c                ó:   — t                                | ¦  «        d uS rU   )ÚreFinaleAppÚsearch©Úxs    r*   ÚcomparisonFinalezGSelectMusicXMLReader._getMusicXMLReaderDarwin.<locals>.comparisonFinale’  ó   € Ý×%Ò% aÑ(Ô(°Ð4Ð4r,   c                ó:   — t                                | ¦  «        d uS rU   )ÚreMuseScoreApprW  rX  s    r*   ÚcomparisonMuseScorezJSelectMusicXMLReader._getMusicXMLReaderDarwin.<locals>.comparisonMuseScore•  s   € Ý!×(Ò(¨Ñ+Ô+°4Ð7Ð7r,   c                ó:   — t                                | ¦  «        d uS rU   )ÚreFinaleReaderApprW  rX  s    r*   ÚcomparisonFinaleReaderzMSelectMusicXMLReader._getMusicXMLReaderDarwin.<locals>.comparisonFinaleReader˜  s   € Ý$×+Ò+¨AÑ.Ô.°dÐ:Ð:r,   c                ó:   — t                                | ¦  «        d uS rU   )ÚreSibeliusApprW  rX  s    r*   ÚcomparisonSibeliuszISelectMusicXMLReader._getMusicXMLReaderDarwin.<locals>.comparisonSibelius›  ó   € Ý ×'Ò'¨Ñ*Ô*°$Ð6Ð6r,   c                ó:   — t                                | ¦  «        d uS rU   )ÚreDoricoApprW  rX  s    r*   ÚcomparisonDoricozGSelectMusicXMLReader._getMusicXMLReaderDarwin.<locals>.comparisonDoricož  r[  r,   )rF  r   )	rX   rZ  r^  ra  rd  rh  ÚresultsÚresÚone_paths	            r*   Ú_getMusicXMLReaderDarwinz-SelectMusicXMLReader._getMusicXMLReaderDarwinŽ  s   € ð	5ð 	5ð 	5ð	8ð 	8ð 	8ð	;ð 	;ð 	;ð	7ð 	7ð 	7ð	5ð 	5ð 	5ð ×$Ò$Ð%8Ñ9Ô9ˆØ�4×%Ò%Ð&6Ñ7Ô7Ñ7ˆØ�4×%Ò%Ð&<Ñ=Ô=Ñ=ˆØ�4×%Ò%Ð&8Ñ9Ô9Ñ9ˆØ�4×%Ò%Ð&6Ñ7Ô7Ñ7ˆð ˆØð 	%ð 	%ˆHØ˜sÐ"Ð"Ø—
’
˜8Ñ$Ô$Ð$øàˆ
r,   c                ó  — d„ }d„ }d„ }d„ }|                       |¦  «        }||                       |¦  «        z  }||                       |¦  «        z  }||                       |¦  «        z  }g }|D ]}||vr|                     |¦  «         Œ|S )zC
        Get all possible MusicXML Reader paths on Windows
        c                ó:   — t                                | ¦  «        d uS rU   )ÚreFinaleExerW  rX  s    r*   rZ  zDSelectMusicXMLReader._getMusicXMLReaderWin.<locals>.comparisonFinale´  r[  r,   c                óB   — t                                | ¦  «        d uod| vS )Nzcrash-reporter)ÚreMuseScoreExerW  rX  s    r*   r^  zGSelectMusicXMLReader._getMusicXMLReaderWin.<locals>.comparisonMuseScore·  s'   € Ý!×(Ò(¨Ñ+Ô+°4Ð7ÐUÐ<LÐTUÐ<UÐUr,   c                ó:   — t                                | ¦  «        d uS rU   )ÚreSibeliusExerW  rX  s    r*   rd  zFSelectMusicXMLReader._getMusicXMLReaderWin.<locals>.comparisonSibeliusº  re  r,   c                ó:   — t                                | ¦  «        d uS rU   )ÚreDoricoExerW  rX  s    r*   rh  zDSelectMusicXMLReader._getMusicXMLReaderWin.<locals>.comparisonDorico½  r[  r,   )rN  r   )rX   rZ  r^  rd  rh  ri  rj  rk  s           r*   Ú_getMusicXMLReaderWinz*SelectMusicXMLReader._getMusicXMLReaderWin°  sÓ   € ð	5ð 	5ð 	5ð	Vð 	Vð 	Vð	7ð 	7ð 	7ð	5ð 	5ð 	5ð —/’/Ð"5Ñ6Ô6ˆØ�4—?’?Ð#3Ñ4Ô4Ñ4ˆØ�4—?’?Ð#5Ñ6Ô6Ñ6ˆØ�4—?’?Ð#3Ñ4Ô4Ñ4ˆð ˆØð 	%ð 	%ˆHØ˜sÐ"Ð"Ø—
’
˜8Ñ$Ô$Ð$øàˆ
r,   c                ó   — g S )z@
        Get all possible MusicXML Reader paths on Unix
        r1   r^   s    r*   Ú_getMusicXMLReaderNixz*SelectMusicXMLReader._getMusicXMLReaderNixÎ  s	   € ð ˆ	r,   c                óþ   — |�|S t          j        ¦   «         }|dk    r|                      ¦   «         }nJ|dk    r|                      ¦   «         }n/|dk    r|                      ¦   «         }n|                      ¦   «         }|S )zµ
        Return a list of valid results that are possible and
        should be displayed to the user.
        These will be processed by _formatResultForUser before usage.
        Nr~   r   r€   )r   r  rv  rl  rx  )rX   rž   r  r$   s       r*   r  z%SelectMusicXMLReader._getValidResultsÔ  s�   € ð ÐØˆLåÔ%Ñ'Ô'ˆØ�uÒÐØ×-Ò-Ñ/Ô/ˆDˆDØ˜Ò!Ð!Ø×0Ò0Ñ2Ô2ˆDˆDØ˜ÒÐØ×-Ò-Ñ/Ô/ˆDˆDà×-Ò-Ñ/Ô/ˆDØˆr,   c                óÌ  — t           }t          |ddd¬¦  «        }|                     |¬¦  «         |                     ¦   «         }|                     ¦   «          t          |t          ¦  «        rdS |du rpt          | j        ¦  «        D ][}t          ddd¬¦  «        }|                     |¬¦  «         |                     ¦   «         }|du r nt          |t          ¦  «        r nŒ\|S )z\
        If we do not have any musicxml readers, ask user if they want to download.
        TFz}No available MusicXML readers are found on your system. We recommend downloading and installing a reader before continuing.

)r÷   rŠ   r‹   r   r�   úAre you ready to continue?rœ   )
ÚurlMuseScorerô   r   r    rÓ   r„   rS   rÆ   rˆ   rŸ   )rX   rŠ   rž   r÷   r)   r$   rÒ   s          r*   r  z&SelectMusicXMLReader._askFillEmptyListé  s  € õ !ˆ	õ ØØØðXð	Yñ Yô Yˆð 	
�	Š	˜ˆ	ÑÔÐØ�{Š{‰}Œ}ˆà	�ŠÑÔÐõ �d�KÑ(Ô(ð 	Ø�5ð �tˆ|ˆ|Ý" 4Ô#4Ñ5Ô5ð ð �EÝ¨°uØ-IðKñ Kô K�Aà—I’I E�IÑ*Ô*Ð*ØŸ;š;™=œ=�DØ˜t�|�|Ø˜Ý# D­+Ñ6Ô6ð Ø˜ðð ˆKr,   Fc                ó  — |                       ¦   «         }|�nt          |t          ¦  «        s[t          t          ¦  «         t	          j        d|¦  «         t	          j        d¦  «        }|                      d|› �dg¦  «         dS dS dS )rú   NÚmusicxmlPathzMusicXML Reader set to: r   )r    r„   rS   r   r   r1  r2  r�   )rX   rÍ   rº   ÚmusicXmlNews       r*   rÏ   z#SelectMusicXMLReader._performAction  s�   € ð —’Ñ!Ô!ˆØÐ¥j°½Ñ&EÔ&EÐå•;ÑÔÐõ ŒO˜N¨FÑ3Ô3Ð3Ý%œ/¨.Ñ9Ô9ˆKØ×ÒÐG¸+ÐGÐGÈÐMÑNÔNÐNÐNÐNð ÐÐÐr,   rÔ   rU   r$  rÕ   )r]   r`   ra   rb   rY   r²   rl  rv  rx  r  r  rÏ   r1   r,   r*   rQ  rQ  u  s²   € € € € € ðð ð,ð ,ð ,ð ,ð	
ð 	
ð 	
ð ð  ð  ðDð ð ð<ð ð ðð ð ð ð*#ð #ð #ð #ðJOð Oð Oð Oð Oð Or,   rQ  c                  ó:   — e Zd ZdZd
d„Zd„ Zd„ Zd„ Zd„ Zdd	„Z	dS )ÚConfigurationAssistantz:
    Class for managing numerous configuration tasks.
    Fc                óz   — || _         t          j        ¦   «         | _        g | _        |                      ¦   «          d S rU   )Ú	_simulater   r  Ú	_platformÚ_dialogsÚ
getDialogsrÌ   s     r*   rY   zConfigurationAssistant.__init__"  s8   € Ø!ˆŒÝÔ+Ñ-Ô-ˆŒð ˆŒØ�ŠÑÔÐÐÐr,   c                ó  — t          d¬¦  «        }| j                             |¦  «         t          d¬¦  «        }| j                             |¦  «         t	          d¬¦  «        }| j                             |¦  «         t          t          d¬¦  «        }| j                             |¦  «         t          t          d¬¦  «        }| j                             |¦  «         t          d¬¦  «        }| j                             |¦  «         d S )	Nr   ©rŠ   TzžThe music21 discussion group provides a forum for asking questions and getting help. Would you like to see the music21 discussion list or sign up for updates?)r÷   rø   zBWould you like to view the music21 documentation in a web browser?z0The music21 Configuration Assistant is complete.r   )	rQ  r…  r   r&  r   rô   ÚurlMusic21ListÚurlGettingStartedr   ©rX   r)   s     r*   r†  z!ConfigurationAssistant.getDialogs*  s  € Ý ¨Ð+Ñ+Ô+ˆØŒ×Ò˜QÑÔÐå DÐ)Ñ)Ô)ˆØŒ×Ò˜QÑÔÐå%¨dÐ3Ñ3Ô3ˆØŒ×Ò˜QÑÔÐåÝ$ð@ðAñ Aô Aˆð
 	Œ×Ò˜QÑÔÐõ Ý'ØWðYñ Yô Yˆð 	Œ×Ò˜QÑÔÐåÐ RÐSÑSÔSˆØŒ×Ò˜QÑÔÐÐÐr,   c                óÐ   — g }|                      d¦  «         |                      d¦  «         |                      d¦  «         |                      d¦  «         t          |¦  «         d S )NzÇWelcome to the music21 Configuration Assistant. You will be guided through a number of questions to install and set up music21. Simply pressing return at a prompt will select a default, if available.r   zUYou may run this configuration again at a later time by running music21/configure.py.r   )r   r+   rŽ   s     r*   Ú_introductionz$ConfigurationAssistant._introductionE  su   € ØˆØ�
Š
ð _ñ 	`ô 	`ð 	`ð 	�
Š
�2‰ŒˆØ�
Š
ð 8ñ 	9ô 	9ð 	9à�
Š
�3‰Œˆå�CÑÔÐÐÐr,   c                ó   — d S rU   r1   r^   s    r*   Ú_conclusionz"ConfigurationAssistant._conclusionQ  s   € Øˆr,   c                óŒ   — g }|                      dt          z  ¦  «         |                      d¦  «         t          |¦  «         dS )z
        Draw a line
        Ú_r   N)r   r   r+   rŽ   s     r*   Ú_hrzConfigurationAssistant._hrT  sC   € ð ˆØ�
Š
�3�Ñ#Ñ$Ô$Ð$Ø�
Š
�3‰ŒˆÝ�CÑÔÐÐÐr,   Nc                óê  — |€g }|                       ¦   «          |                      ¦   «          t          | j        ¦  «        D ]�\  }}| j        |j        vrŒ|                       ¦   «          t          |¦  «        |k    r	||         }nd}|                     |¬¦  «         |                     ¦   «         }	 | 	                    | j
        ¬¦  «         Œ�# t          $ r Y  nw xY w|                      ¦   «          dS )zŽ
        The forceList, if provided, is a list of string arguments
        passed in order to the included dialogs. Used for testing.
        Nr�   rÑ   )r’  r�  r   r…  r„  r‰   r   r   r    rÓ   rƒ  ry   r�  )rX   Ú	forceListr'   r)   rž   Úunused_posts         r*   ÚrunzConfigurationAssistant.run]  s  € ð
 ÐØˆIØ�Š‰
Œ
ˆ
Ø×ÒÑÔÐå˜dœmÑ,Ô,ð 	ð 	‰DˆAˆqàŒ~ Q¤\Ð1Ð1Øà�HŠH‰JŒJˆJÝ�9‰~Œ~ Ò!Ð!Ø! !œ��à�à�IŠI˜EˆIÑ"Ô"Ð"ØŸ+š+™-œ-ˆKðØ—’¨¬�Ñ8Ô8Ð8Ð8øÝ"ð ð ð à��ðøøøð
 	×ÒÑÔÐÐÐs   Â2CÃ
CÃCrÕ   rU   )
r]   r`   ra   rb   rY   r†  r�  r�  r’  r–  r1   r,   r*   r�  r�    s‚   € € € € € ðð ðð ð ð ð ð  ð  ð6
ð 
ð 
ðð ð ðð ð ðð ð ð ð ð r,   r�  z
list[type]Ú
_DOC_ORDERc                  ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestUserInputc                óT  — t          ¦   «          t          d¦  «         t          ¦   «         }|                     ¦   «          t          d|                     ¦   «         ¦  «         t          ¦   «          t          d¦  «         t          d¬¦  «        }|                     ¦   «          t          d|                     ¦   «         ¦  «         t          ¦   «          t          d¦  «         t          d¬¦  «        }|                     ¦   «          t          d|                     ¦   «         ¦  «         d S )Nzstarting: YesOrNo()úgetResult():zstarting: YesOrNo(default=True)Trˆ  z starting: YesOrNo(default=False)F)ÚprintrŸ   r   r    r‹  s     r*   ÚtestYesOrNozTestUserInput.testYesOrNo¾  sè   € Ý‰ŒˆÝÐ#Ñ$Ô$Ð$Ý‰IŒIˆØ	�	Š	‰ŒˆÝˆn˜aŸkšk™mœmÑ,Ô,Ð,å‰ŒˆÝÐ/Ñ0Ô0Ð0Ý˜DÐ!Ñ!Ô!ˆØ	�	Š	‰ŒˆÝˆn˜aŸkšk™mœmÑ,Ô,Ð,å‰ŒˆÝÐ0Ñ1Ô1Ð1Ý˜EÐ"Ñ"Ô"ˆØ	�	Š	‰ŒˆÝˆn˜aŸkšk™mœmÑ,Ô,Ð,Ð,Ð,r,   c                óÈ   — t          ¦   «          t          d¦  «         t          ¦   «         }|                     ¦   «          t          d|                     ¦   «         ¦  «         d S )Nú starting: SelectMusicXMLReader()r›  ©rœ  rQ  r   r    r‹  s     r*   ÚtestSelectMusicXMLReaderz&TestUserInput.testSelectMusicXMLReaderÑ  sP   € Ý‰ŒˆÝÐ0Ñ1Ô1Ð1Ý Ñ"Ô"ˆØ	�	Š	‰ŒˆÝˆn˜aŸkšk™mœmÑ,Ô,Ð,Ð,Ð,r,   c                óÌ   — t          ¦   «          t          d¦  «         t          d¬¦  «        }|                     ¦   «          t          d|                     ¦   «         ¦  «         d S )Nz)starting: SelectMusicXMLReader(default=1)r   rˆ  r›  r   r‹  s     r*   ÚtestSelectMusicXMLReaderDefaultz-TestUserInput.testSelectMusicXMLReaderDefaultØ  sU   € Ý‰ŒˆÝÐ9Ñ:Ô:Ð:Ý ¨Ð+Ñ+Ô+ˆØ	�	Š	‰ŒˆÝˆn˜aŸkšk™mœmÑ,Ô,Ð,Ð,Ð,r,   c                óÔ   — t          ¦   «          t          d¦  «        }|                     ¦   «          t          d|                     ¦   «         ¦  «         |                     ¦   «          d S )Nzhttps://www.music21.org/r›  )rœ  rô   r   r    rÓ   r‹  s     r*   ÚtestOpenInBrowserzTestUserInput.testOpenInBrowserß  sT   € Ý‰ŒˆÝÐ7Ñ8Ô8ˆØ	�	Š	‰ŒˆÝˆn˜aŸkšk™mœmÑ,Ô,Ð,Ø	�ŠÑÔÐÐÐr,   c                óð  — t          ¦   «          t          d¦  «         t          ¦   «         }|                     ¦   «          t          d|                     ¦   «         ¦  «         |                     ¦   «          t          ¦   «          t          d¦  «         t          ¦   «         }dd„}||_        |                     ¦   «          t          d|                     ¦   «         ¦  «         |                     ¦   «          d S )NrŸ  r›  z,starting: SelectMusicXMLReader() w/o resultsc                ó   — g S rU   r1   r�   s    r*   ÚgetValidResultsz@TestUserInput.testSelectMusicXMLReader2.<locals>.getValidResultsó  ó   € ØˆIr,   rU   )rœ  rQ  r   r    rÓ   r  )rX   r)   r¨  s      r*   ÚtestSelectMusicXMLReader2z'TestUserInput.testSelectMusicXMLReader2æ  sÖ   € Ý‰ŒˆÝÐ0Ñ1Ô1Ð1Ý Ñ"Ô"ˆØ	�	Š	‰ŒˆÝˆn˜aŸkšk™mœmÑ,Ô,Ð,Ø	�ŠÑÔÐå‰ŒˆÝÐ<Ñ=Ô=Ð=Ý Ñ"Ô"ˆð	ð 	ð 	ð 	ð -ˆÔØ	�	Š	‰ŒˆÝˆn˜aŸkšk™mœmÑ,Ô,Ð,Ø	�ŠÑÔÐÐÐr,   c                ól   — t          d¦  «         t          d¬¦  «        }|                     ¦   «          d S )Nz"Running ConfigurationAssistant allTrÑ   )rœ  r�  r–  )rX   Ú
configAssts     r*   ÚtestConfigurationAssistantz(TestUserInput.testConfigurationAssistantû  s7   € ÝÐ2Ñ3Ô3Ð3Ý+°TÐ:Ñ:Ô:ˆ
Ø�ŠÑÔÐÐÐr,   N)	r]   r`   ra   r�  r¡  r£  r¥  rª  r­  r1   r,   r*   r™  r™  ¼  sn   € € € € € ð-ð -ð -ð&-ð -ð -ð-ð -ð -ðð ð ðð ð ð*ð ð ð ð r,   r™  c                  ó>   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	S )
ÚTestc                ó  — ddl m} |                     ddd¬¦  «        }|                     d¦  «         |                      t          |                     ¦   «         ¦  «        d¦  «         |                     d	¦  «         |                      t          |                     ¦   «         ¦  «        d
¦  «         |                     d¦  «         |                      t          |                     ¦   «         ¦  «        d
¦  «         |                     d¦  «         |                      t          |                     ¦   «         ¦  «        d¦  «         |                     d dd¬¦  «        }|                     d¦  «         |                      t          |                     ¦   «         ¦  «        d¦  «         |                     d	¦  «         |                      t          |                     ¦   «         ¦  «        d
¦  «         |                     d¦  «         |                      t          |                     ¦   «         ¦  «        d¦  «         |                     d¦  «         |                      t          |                     ¦   «         ¦  «        d¦  «         d S )Nr   ©r   TFr{  rœ   rê   ÚFalseræ   ÚTruer   Úblahz)<music21.configure.IncompleteInput: blah>z!<music21.configure.NoInput: None>)r8   r   rŸ   r   ÚassertEqualrí   r    ©rX   r   r)   s      r*   r�  zTest.testYesOrNo  s  € Ø%Ð%Ð%Ð%Ð%Ð%Ø×Ò d°UØ+Gð ñ Iô Iˆà	�	Š	�#‰ŒˆØ×Ò�˜QŸ[š[™]œ]Ñ+Ô+¨WÑ5Ô5Ð5Ø	�	Š	�#‰ŒˆØ×Ò�˜QŸ[š[™]œ]Ñ+Ô+¨VÑ4Ô4Ð4Ø	�	Š	�"‰ŒˆØ×Ò�˜QŸ[š[™]œ]Ñ+Ô+¨VÑ4Ô4Ð4Ø	�	Š	�&ÑÔÐØ×Ò�˜QŸ[š[™]œ]Ñ+Ô+Ð-XÑYÔYÐYà×Ò d°UØ+Gð ñ Iô Iˆà	�	Š	�#‰ŒˆØ×Ò�˜QŸ[š[™]œ]Ñ+Ô+¨WÑ5Ô5Ð5Ø	�	Š	�#‰ŒˆØ×Ò�˜QŸ[š[™]œ]Ñ+Ô+¨VÑ4Ô4Ð4Ø	�	Š	�"‰ŒˆØ×Ò�˜QŸ[š[™]œ]Ñ+Ô+Ð-PÑQÔQÐQØ	�	Š	�&ÑÔÐØ×Ò�˜QŸ[š[™]œ]Ñ+Ô+Ð-XÑYÔYÐYÐYÐYr,   c                ót   — ddl m} |                     d¬¦  «        }|                      |j        d¦  «         d S )Nr   r±  r   rˆ  )r8   r   r  rµ  r…   r¶  s      r*   ÚtestSelectFromListzTest.testSelectFromList  sH   € Ø%Ð%Ð%Ð%Ð%Ð%Ø×$Ò$¨QÐ$Ñ/Ô/ˆØ×Ò˜œ QÑ'Ô'Ð'Ð'Ð'r,   c                óÜ   — ddl m} |                     ¦   «         }dd„}||_        |                     dd¬¦  «         |                     ¦   «         }|                      ||j        ¦  «         d S )Nr   r±  c                ó   — g S rU   r1   r�   s    r*   r¨  z7Test.testSelectMusicXMLReaders.<locals>.getValidResults%  r©  r,   rê   T)rž   rÄ   rU   )r8   r   rQ  r  r   r    ÚassertIsInstancerv   )rX   r   r)   r¨  r$   s        r*   ÚtestSelectMusicXMLReaderszTest.testSelectMusicXMLReaders   s…   € Ø%Ð%Ð%Ð%Ð%Ð%Ø×*Ò*Ñ,Ô,ˆð	ð 	ð 	ð 	ð -ˆÔØ	�	Š	˜ tˆ	Ñ,Ô,Ð,Ø�{Š{‰}Œ}ˆà×Ò˜d IÔ$;Ñ<Ô<Ð<Ð<Ð<r,   c                óÊ  — t                                d¦  «        }|                      |                     d¦  «        d¦  «         |                      t                                d¦  «        d ¦  «         t                                d¦  «        }|                      |                     d¦  «        d¦  «         |                      t                                d¦  «        d ¦  «         d S )NzFinale 2011.appr   zfinal blah 2011z
Finale.appzFinal Cut 2017.app)rV  rW  rµ  Úgroup)rX   Úgs     r*   ÚtestRezTest.testRe.  sº   € Ý×ÒÐ0Ñ1Ô1ˆØ×Ò˜Ÿš ™œÐ%6Ñ7Ô7Ð7à×Ò�×+Ò+Ð,=Ñ>Ô>ÀÑEÔEÐEå×Ò˜|Ñ,Ô,ˆØ×Ò˜Ÿš ™œ \Ñ2Ô2Ð2à×Ò�×+Ò+Ð,@ÑAÔAÀ4ÑHÔHÐHÐHÐHr,   c                ó&   — t          d¬¦  «        }d S )NTrÑ   )r�  )rX   Ú	unused_cas     r*   r­  zTest.testConfigurationAssistant9  s   € Ý*°DÐ9Ñ9Ô9ˆ	ˆ	ˆ	r,   c                ó"   — t          ¦   «         }d S rU   )r   ©rX   Úunused_ds     r*   ÚtestGetUserDatazTest.testGetUserData<  s   € Ý,Ñ.Ô.ˆˆˆr,   c                ó"   — t          ¦   «         }d S rU   )r&  rÄ  s     r*   ÚtestGetUserData2zTest.testGetUserData2B  s   € Ý"Ñ$Ô$ˆˆˆr,   c                ó"   — t          ¦   «         }d S rU   )r   rÄ  s     r*   Ú
testAnyKeyzTest.testAnyKeyH  s   € Ý‘8”8ˆˆˆr,   N)r]   r`   ra   r�  r¸  r¼  rÀ  r­  rÆ  rÈ  rÊ  r1   r,   r*   r¯  r¯    s’   € € € € € ðZð Zð Zð0(ð (ð (ð
=ð =ð =ð	Ið 	Ið 	Ið:ð :ð :ð/ð /ð /ð%ð %ð %ðð ð ð ð r,   r¯  c                 óJ   — t          ¦   «         } |                      ¦   «          d S rU   )r�  r–  )Úcas    r*   r–  r–  O  s   € Ý	Ñ	!Ô	!€BØ‡F‚F�H„H€H€H€Hr,   Ú__main__r   r6   )ÚallÚtestÚte)Tr
   )HÚ
__future__r   r<   r;  Úrer=   r   r/   r   Úunittestrû   Ú	importlibr   r8   r   r   r   ÚEnvironmentrD   Ú_DOC_IGNORE_MODULE_OR_PACKAGEÚ	RegexFlagÚ
IGNORECASEÚcompilerV  rc  ro  rs  r`  r]  rq  rg  ru  Ú
urlMusic21r|  rŠ  r‰  r   r+   r2   rB   rQ   rS   rd   rp   rs   rv   ÚMusic21Exceptionry   r{   r   rŸ   rô   r   r  r&  r4  rQ  r�  r—  Ú__annotations__ÚTestCaser™  r¯  r–  r]   r   ÚargvÚtestInstancerÐ  ÚmainTestÚgetattrr;   r1   r,   r*   ú<module>râ     s›  ðð #Ð "Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø €€€Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð à Ð Ð Ð Ð Ð ð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  à&ˆ{Ô& {Ñ3Ô3€à $Ð ØŒ\Ô$€
ð ˆbŒjÐ)¨:Ñ6Ô6€Ø�”
Ð+¨ZÑ8Ô8€ØˆbŒjÐ)¨:Ñ6Ô6€Ø�”
Ð+¨ZÑ8Ô8€Ø�B”JÐ4°jÑAÔAÐ Ø�”Ð/°Ñ<Ô<€Ø�”ÐAÀ:ÑNÔN€ØˆbŒjÐ)¨:Ñ6Ô6€ØˆbŒjÐ)¨:Ñ6Ô6€à3€
Ø*€Ø:Ð Ø:€à€
ð&,ð ,ð ,ð ,ð^)ð )ð )ð
ð ð ð8ð ð ð4Lð Lð Lð Lð Lñ Lô Lð Lð"ð "ð "ð "ð "˜ñ "ô "ð "ð"ð "ð "ð "ð "�kñ "ô "ð "ð"ð "ð "ð "ð "ˆkñ "ô "ð "ð"ð "ð "ð "ð "�Kñ "ô "ð "ð	ð 	ð 	ð 	ð 	�lÔ3°[ñ 	ô 	ð 	ð@Rð @Rð @Rð @Rð @Rñ @Rô @Rð @RðH
ð ð ð ð ˆVñ ô ð ð4wð wð wð wð wˆfñ wô wð wðvð ð ð ð �wñ ô ð ðD92ð 92ð 92ð 92ð 92 ñ 92ô 92ð 92ðz\ð \ð \ð \ð \�Vñ \ô \ð \ð~^að ^að ^að ^að ^a�nñ ^aô ^að ^aðBP.ð P.ð P.ð P.ð P.�^ñ P.ô P.ð P.ðfeOð eOð eOð eOð eO˜>ñ eOô eOð eOðR^ð ^ð ^ð ^ð ^ñ ^ô ^ð ^ðv €
Ð Ð Ð Ñ ðBð Bð Bð Bð B�HÔ%ñ Bô Bð BðJHð Hð Hð Hð Hˆ8Ôñ Hô Hð Hð\ð ð ð
 ˆzÒÐØ
€sˆ3Œ8�}„}˜ÒÐàˆ‰Œˆˆˆð �t‘v”vˆØˆ]‰_Œ_ˆàˆ3ˆsŒx‰=Œ=˜1ÒÐ ¤¨¤¨Ð >Ð >ØˆNˆNˆNØˆGÔ˜TÑ"Ô"Ð"Ð"Ð"ð ŒX�aŒ[˜DÒ Ð à$ˆGˆG�B˜œ œÑ$Ô$Ñ&Ô&Ð&Ð&Ð&àˆW�\ 3¤8¨A¤;Ñ/Ô/ð 	1Ø.ˆGˆG�L #¤(¨1¤+Ñ.Ô.Ñ0Ô0Ð0Ð0Ð0ð) Ðð&	1ð 	1r,   