§
    Ètºfxu  ã                  ó°   — d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 dZd	Zg d
¢Zd„ Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        ZdS )z"
Tests for L{twisted.python.url}.
é    )Úannotations)ÚIterable)ÚProtocol)ÚSynchronousTestCaseé   ©ÚURLú*http://www.foo.com/a/nice/path/?zot=23&zutúhttp://a/b/c/d;p?q)()Úgúhttp://a/b/c/g)z./gr   )zg/úhttp://a/b/c/g/)z/gú
http://a/g)z//gzhttp://g)z?yzhttp://a/b/c/d;p?y)zg?yzhttp://a/b/c/g?y)z#szhttp://a/b/c/d;p?q#s)zg#szhttp://a/b/c/g#s)zg?y#szhttp://a/b/c/g?y#s)z;xzhttp://a/b/c/;x)zg;xzhttp://a/b/c/g;x)zg;x?y#szhttp://a/b/c/g;x?y#s)Ú r   )ú.úhttp://a/b/c/)z./r   )ú..úhttp://a/b/)z../r   )z../gúhttp://a/b/g)z../..ú	http://a/)z../../r   )z../../gr   )z
../../../gr   )z../../../../gr   )z/./gr   )z/../gr   )zg.zhttp://a/b/c/g.)z.gzhttp://a/b/c/.g)zg..zhttp://a/b/c/g..)z..gzhttp://a/b/c/..g)z./../gr   )z./g/.r   )zg/./hzhttp://a/b/c/g/h)zg/../hzhttp://a/b/c/h)z	g;x=1/./yzhttp://a/b/c/g;x=1/y)z
g;x=1/../yzhttp://a/b/c/y)zg?y/./xzhttp://a/b/c/g?y/./x)zg?y/../xzhttp://a/b/c/g?y/../x)zg#s/./xzhttp://a/b/c/g#s/./x)zg#s/../xzhttp://a/b/c/g#s/../xc                ó@   — d                      d„ | D ¦   «         ¦  «        S )Nr   c              3  ó:   K  — | ]}d t          |¦  «        z  V — ŒdS )z%%%02XN)Úord)Ú.0Úcs     ú[/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/python/test/test_url.pyú	<genexpr>z<lambda>.<locals>.<genexpr>L   s-   è è € Ð=Ð=°a ­3¨q©6¬6Ñ 1Ð=Ð=Ð=Ð=Ð=Ð=ó    )Újoin)Úss    r   ú<lambda>r!   L   s!   € ˜ŸšÐ=Ð=¸1Ð=Ñ=Ô=Ñ=Ô=€ r   c                  ó&   — e Zd Zedd„¦   «         ZdS )Ú_HasExceptionÚreturnÚBaseExceptionc                ó   — d S )N© ©Úselfs    r   Ú	exceptionz_HasException.exceptionP   s   € àˆr   N)r$   r%   )Ú__name__Ú
__module__Ú__qualname__Úpropertyr*   r'   r   r   r#   r#   O   s2   € € € € € Øðð ð ñ „Xðð ð r   r#   c                  óv  — e Zd ZdZd?d„Z	 d@dAd„ZdBd„ZdBd„ZdBd„ZdBd„Z	dBd„Z
dBd„ZdBd„ZdBd„ZdBd„ZdBd„ZdBd„ZdBd„ZdBd „ZdBd!„ZdBd"„ZdBd#„ZdBd$„ZdBd%„ZdBd&„ZdBd'„ZdBd(„ZdBd)„ZdBd*„ZdBd+„ZdBd,„ZdBd-„ZdBd.„Z dBd/„Z!dBd0„Z"dBd1„Z#dBd2„Z$dBd3„Z%dBd4„Z&dBd5„Z'dBd6„Z(dBd7„Z)dBd8„Z*dBd9„Z+dBd:„Z,dBd;„Z-dBd<„Z.dBd=„Z/d>S )CÚTestURLz
    Tests for L{URL}.
    Úur	   r$   ÚNonec                ó`  — |                       |j        t          t          |¦  «        ¦  «         |                       |j        t          t          |¦  «        ¦  «         |j        D ]+}|                       |t          t          |¦  «        ¦  «         Œ,|j        D ]h\  }}|                       |t          t          |¦  «        ¦  «         |                      |du pt          |t          ¦  «        t          |¦  «        ¦  «         Œi|                       |j	        t          t          |¦  «        ¦  «         dS )zl
        The given L{URL}'s components should be L{unicode}.

        @param u: The L{URL} to test.
        N)
ÚassertIsInstanceÚschemeÚstrÚreprÚhostÚpathÚqueryÚ
assertTrueÚ
isinstanceÚfragment)r)   r1   ÚsegÚkÚvs        r   ÚassertUnicodedzTestURL.assertUnicodedZ   s  € ð 	×Ò˜aœh­­T°!©W¬WÑ5Ô5Ð5Ø×Ò˜aœf¥c­4°©7¬7Ñ3Ô3Ð3Ø”6ð 	5ð 	5ˆCØ×!Ò! #¥s­D°©G¬GÑ4Ô4Ð4Ð4Ø”Gð 	Fð 	F‰DˆAˆqØ×!Ò! !¥S­$¨q©'¬'Ñ2Ô2Ð2Ø�OŠO˜A ˜IÐ;­°AµsÑ);Ô);½TÀ!¹W¼WÑEÔEÐEÐEØ×Ò˜aœj­#­t°A©w¬wÑ7Ô7Ð7Ð7Ð7r   r   r5   r6   r8   r9   úIterable[str]r:   ú Iterable[tuple[str, str | None]]r=   Úportú
int | NoneÚuserinfoc	                óÚ   — |j         |j        |j        |j        |j        |j        |j        f}	||t          |¦  «        t          |¦  «        |||j        f}
|                      |	|
¦  «         dS )aª  
        The given L{URL} should have the given components.

        @param u: The actual L{URL} to examine.

        @param scheme: The expected scheme.

        @param host: The expected host.

        @param path: The expected path.

        @param query: The expected query.

        @param fragment: The expected fragment.

        @param port: The expected port.

        @param userinfo: The expected userinfo.
        N)	r5   r8   r9   r:   r=   rD   rF   ÚtupleÚassertEqual)r)   r1   r5   r8   r9   r:   r=   rD   rF   ÚactualÚexpecteds              r   Ú	assertURLzTestURL.assertURLi   sd   € ð< ”(˜AœF A¤F¨A¬G°Q´ZÀÄÈÌÐTˆØ˜D¥%¨¡+¤+­u°U©|¬|¸XÀtÈQÌZÐXˆØ×Ò˜ Ñ*Ô*Ð*Ð*Ð*r   c           	     ó´   ‡ — d	ˆ fd„} |t          dd¦  «        ¦  «          |t          ddg g ¦  «        ¦  «          |t          ddg g d¦  «        ¦  «         dS )
z@
        L{URL} should have appropriate default values.
        r1   r	   r$   r2   c           
     ój   •— ‰                      | ¦  «         ‰                     | ddg g ddd¦  «         d S )NÚhttpr   éP   )rA   rL   )r1   r)   s    €r   Úcheckz(TestURL.test_initDefaults.<locals>.check�   s=   ø€ Ø×Ò Ñ"Ô"Ð"Ø�NŠN˜1˜f b¨"¨b°"°b¸"Ñ=Ô=Ð=Ð=Ð=r   rO   r   N©r1   r	   r$   r2   r   )r)   rQ   s   ` r   Útest_initDefaultszTestURL.test_initDefaults‹   s   ø€ ð
	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	ˆ�c�&˜"‰oŒoÑÔÐØˆ�c�&˜"˜b "Ñ%Ô%Ñ&Ô&Ð&Øˆ�c�&˜"˜b " bÑ)Ô)Ñ*Ô*Ð*Ð*Ð*r   c           	     óø   — t          dddgddgd¦  «        }|                      |¦  «         |                      |dddgddgdd¦  «         |                      t          dd	d
gdgd¦  «        dd	d
gdgdd¦  «         dS )z=
        L{URL} should accept L{unicode} parameters.
        r    ÚhÚp©r?   r@   )r?   NÚfNrO   õ   Ã õ   Ã©)u   Î»u   Ï€u   âŠ¥rP   ©r	   rA   rL   ©r)   r1   s     r   Ú	test_initzTestURL.test_init˜   s©   € õ ��S˜3˜% *¨kÐ!:¸CÑ@Ô@ˆØ×Ò˜AÑÔÐØ�Š�q˜#˜s S E¨J¸Ð+DÀcÈ4ÑPÔPÐPà�ŠÝ�˜  Ð+?Ð*@À(ÑKÔKØØØˆHØ!Ð"ØØñ	
ô 	
ð 	
ð 	
ð 	
r   c           	     ó˜   — t          dddgddgd¦  «        }|                      |¦  «         |                      |dddgddgdd¦  «         dS )zN
        L{URL} should accept (and not interpret) percent characters.
        r    z%68z%70)ú%6Bz%76)r_   Nz%66Nr[   r\   s     r   Útest_initPercentzTestURL.test_initPercentª   sj   € õ ��U˜U˜G n°mÐ%DÀeÑLÔLˆØ×Ò˜AÑÔÐØ�ŠØˆs�E˜E˜7 ^°]Ð$CÀUÈDñ	
ô 	
ð 	
ð 	
ð 	
r   c                ó¶   — |                       t          t          dddgddgd¬¦  «        ¦  «        d                     t          d	¦  «        ¦  «        ¦  «         d
S )z¹
        L{URL.__repr__} will display the canonical form of the URL, wrapped in
        a L{URL.fromText} invocation, so that it is C{eval}-able but still easy
        to read.
        rO   ÚfooÚbar)ÚbazNrW   Úfrob)r5   r8   r9   r:   r=   zURL.from_text({})zhttp://foo/bar?baz&k=v#frobN)rI   r7   r	   Úformatr(   s    r   Ú	test_reprzTestURL.test_repr´   sw   € ð 	×ÒÝÝØ!ØØ˜Ø(¨*Ð5Ø#ðñ ô ñô ð  ×&Ò&¥tÐ,IÑ'JÔ'JÑKÔKñ	
ô 	
ð 	
ð 	
ð 	
r   c                ó’   — t          j        t          ¦  «        }|                      t          |                     ¦   «         ¦  «         dS )zb
        Round-tripping L{URL.fromText} with C{str} results in an equivalent
        URL.
        N)r	   ÚfromTextÚtheurlrI   ÚasText©r)   Úurlpaths     r   Útest_fromTextzTestURL.test_fromTextÇ   s9   € õ
 ”,�vÑ&Ô&ˆØ×Ò� §¢Ñ!1Ô!1Ñ2Ô2Ð2Ð2Ð2r   c                óŒ   — d}|D ]>}t          j        |¦  «                             ¦   «         }|                      ||¦  «         Œ?dS )z>
        L{URL.asText} should invert L{URL.fromText}.
        )zhttp://localhostúhttp://localhost/zhttp://localhost/foozhttp://localhost/foo/zhttp://localhost/foo!!bar/zhttp://localhost/foo%20bar/zhttp://localhost/foo%2Fbar/zhttp://localhost/foo?nzhttp://localhost/foo?n=vzhttp://localhost/foo?n=/a/bz%http://example.com/foo!@$bar?b!@z=123z$http://localhost/asd?a=asd%20sdf/345z6http://(%2525)/(%2525)?(%2525)&(%2525)=(%2525)#(%2525)z<http://(%C3%A9)/(%C3%A9)?(%C3%A9)&(%C3%A9)=(%C3%A9)#(%C3%A9)N)r	   ri   rk   rI   )r)   ÚtestsÚtestÚresults       r   Útest_roundtripzTestURL.test_roundtripÏ   sX   € ð
ˆð  ð 	+ð 	+ˆDÝ”\ $Ñ'Ô'×.Ò.Ñ0Ô0ˆFØ×Ò˜T 6Ñ*Ô*Ð*Ð*ð	+ð 	+r   c                óâ   — t          j        t          ¦  «        }|                      |t          j        t          ¦  «        ¦  «         |                      |t          j        d¦  «        ¦  «         dS )z¶
        Two URLs decoded using L{URL.fromText} will be equal (C{==}) if they
        decoded same URL string, and unequal (C{!=}) if they decoded different
        strings.
        z:ftp://www.anotherinvaliddomain.com/foo/bar/baz/?zot=21&zutN)r	   ri   rj   rI   ÚassertNotEqualrl   s     r   Útest_equalityzTestURL.test_equalityç   sj   € õ ”,�vÑ&Ô&ˆØ×Ò˜¥#¤,­vÑ"6Ô"6Ñ7Ô7Ð7Ø×ÒØÝŒLØOñô ñ	
ô 	
ð 	
ð 	
ð 	
r   c                óÚ   — |                       t          d¬¦  «        t          ¦   «         ¦  «         |                       t          j        d¦  «        t          j        d¦  «        ¦  «         dS )zŒ
        An URL created with the empty string for a fragment compares equal
        to an URL created with an unspecified fragment.
        r   )r=   zhttp://localhost/#rp   N)rI   r	   ri   r(   s    r   Útest_fragmentEqualityzTestURL.test_fragmentEqualityö   sf   € ð
 	×Ò� bÐ)Ñ)Ô)­3©5¬5Ñ1Ô1Ð1Ø×ÒÝŒLÐ-Ñ.Ô.µ´Ð=PÑ0QÔ0Qñ	
ô 	
ð 	
ð 	
ð 	
r   c                ó  — t          j        t          ¦  «        }|                      d|                     d¦  «                             ¦   «         ¦  «         |                      d|                     d¦  «                             ¦   «         ¦  «         |                      d|                     d¦  «                             ¦   «         ¦  «         |                      d|                     d¦  «                             ¦   «         ¦  «         d	S )
zm
        L{URL.child} appends a new path segment, but does not affect the query
        or fragment.
        z.http://www.foo.com/a/nice/path/gong?zot=23&zutÚgongz1http://www.foo.com/a/nice/path/gong%2F?zot=23&zutzgong/z7http://www.foo.com/a/nice/path/gong%2Fdouble?zot=23&zutzgong/doublez:http://www.foo.com/a/nice/path/gong%2Fdouble%2F?zot=23&zutzgong/double/N)r	   ri   rj   rI   Úchildrk   rl   s     r   Ú
test_childzTestURL.test_child   sû   € õ
 ”,�vÑ&Ô&ˆØ×ÒØ<Ø�MŠM˜&Ñ!Ô!×(Ò(Ñ*Ô*ñ	
ô 	
ð 	
ð 	×ÒØ?Ø�MŠM˜'Ñ"Ô"×)Ò)Ñ+Ô+ñ	
ô 	
ð 	
ð 	×ÒØEØ�MŠM˜-Ñ(Ô(×/Ò/Ñ1Ô1ñ	
ô 	
ð 	
ð 	×ÒØHØ�MŠM˜.Ñ)Ô)×0Ò0Ñ2Ô2ñ	
ô 	
ð 	
ð 	
ð 	
r   c                ó¤   — |                       t          j        d¦  «                             ddd¦  «                             ¦   «         d¦  «         dS )zg
        L{URL.child} receives multiple segments as C{*args} and appends each in
        turn.
        zhttp://example.com/a/br   ÚdÚezhttp://example.com/a/b/c/d/eN)rI   r	   ri   r|   rk   r(   s    r   Útest_multiChildzTestURL.test_multiChild  sU   € ð
 	×ÒÝŒLÐ1Ñ2Ô2×8Ò8¸¸cÀ3ÑGÔG×NÒNÑPÔPØ*ñ	
ô 	
ð 	
ð 	
ð 	
r   c                óÐ   — t          d¬¦  «                             d¦  «        }|                      |j        ¦  «         |                      d|                     ¦   «         ¦  «         dS )zo
        L{URL.child} of a L{URL} without a path produces a L{URL} with a single
        path segment.
        úwww.foo.com©r8   r   zhttp://www.foo.com/cN)r	   r|   r;   ÚrootedrI   rk   )r)   ÚchildURLs     r   Útest_childInitRootzTestURL.test_childInitRoot!  s]   € õ
 ˜MÐ*Ñ*Ô*×0Ò0°Ñ5Ô5ˆØ�Š˜œÑ(Ô(Ð(Ø×ÒÐ/°·²Ñ1BÔ1BÑCÔCÐCÐCÐCr   c                óP  — t          j        t          ¦  «        }|                      d|                     d¦  «                             ¦   «         ¦  «         d}t          j        |¦  «        }|                      d|                     d¦  «                             ¦   «         ¦  «         dS )z
        L{URL.sibling} of a L{URL} replaces the last path segment, but does not
        affect the query or fragment.
        z0http://www.foo.com/a/nice/path/sister?zot=23&zutÚsisterz)http://www.foo.com/a/nice/path?zot=23&zutz+http://www.foo.com/a/nice/sister?zot=23&zutN)r	   ri   rj   rI   Úsiblingrk   )r)   rm   Útheurl2s      r   Útest_siblingzTestURL.test_sibling*  sŸ   € õ
 ”,�vÑ&Ô&ˆØ×ÒØ>Ø�OŠO˜HÑ%Ô%×,Ò,Ñ.Ô.ñ	
ô 	
ð 	
ð
 >ˆÝ”,˜wÑ'Ô'ˆØ×ÒØ9Ø�OŠO˜HÑ%Ô%×,Ò,Ñ.Ô.ñ	
ô 	
ð 	
ð 	
ð 	
r   c                óÂ  — t          j        t          ¦  «        }|                      d|                     d¦  «                             ¦   «         ¦  «         |                      d|                     d¦  «                             ¦   «         ¦  «         |                      d|                     d¦  «                             ¦   «         ¦  «         |                      d|                     d¦  «                             ¦   «         ¦  «         |                      d	|                     d
¦  «                             ¦   «         ¦  «         t          j        d¦  «        }|                      d|                     d¦  «                             ¦   «         ¦  «         t          j        d¦  «        }|                      |                     d¦  «                             ¦   «         d¦  «         dS )z¦
        L{URL.click} interprets the given string as a relative URI-reference
        and returns a new L{URL} interpreting C{self} as the base absolute URI.
        r
   r   z$http://www.foo.com/a/nice/path/clickÚclickzhttp://www.foo.com/clickz/clickz$http://www.foo.com/a/nice/path/?burpz?burpz//foobarzhttp://www.foo.com/foobarzhttp://www.foo.com/me/noqueryz!http://www.foo.com/me/17?spam=158z/me/17?spam=158zhttp://localhost/foo?abc=defzhttp://www.python.orgN)r	   ri   rj   rI   rŽ   rk   ÚassertNotIn)r)   rm   r1   s      r   Ú
test_clickzTestURL.test_click<  s¸  € õ
 ”,�vÑ&Ô&ˆà×ÒØ8¸'¿-º-ÈÑ:KÔ:K×:RÒ:RÑ:TÔ:Tñ	
ô 	
ð 	
ð 	×ÒØ2°G·M²MÀ'Ñ4JÔ4J×4QÒ4QÑ4SÔ4Sñ	
ô 	
ð 	
ð 	×ÒÐ3°W·]²]À8Ñ5LÔ5L×5SÒ5SÑ5UÔ5UÑVÔVÐVà×ÒØ2°G·M²MÀ'Ñ4JÔ4J×4QÒ4QÑ4SÔ4Sñ	
ô 	
ð 	
ð
 	×ÒØ˜ŸšÐ&AÑBÔB×IÒIÑKÔKñ	
ô 	
ð 	
õ ŒLÐ8Ñ9Ô9ˆØ×ÒØ/°·²Ð9JÑ1KÔ1K×1RÒ1RÑ1TÔ1Tñ	
ô 	
ð 	
õ ŒLÐ7Ñ8Ô8ˆØ×ÒØ�GŠGÐ+Ñ,Ô,×3Ò3Ñ5Ô5Ð7Nñ	
ô 	
ð 	
ð 	
ð 	
r   c                óÈ   — t          j        t          ¦  «        }t          D ]@\  }}|                      |                     |¦  «                             ¦   «         |¦  «         ŒAdS )zQ
        L{URL.click} should correctly resolve the examples in RFC 3986.
        N)r	   ri   ÚrelativeLinkBaseForRFC3986ÚrelativeLinkTestsForRFC3986rI   rŽ   rk   )r)   ÚbaseÚrefrK   s       r   Útest_clickRFC3986zTestURL.test_clickRFC3986d  sd   € õ Œ|Õ6Ñ7Ô7ˆÝ8ð 	Að 	A‰MˆC�Ø×Ò˜TŸZšZ¨™_œ_×3Ò3Ñ5Ô5°xÑ@Ô@Ð@Ð@ð	Að 	Ar   c                ó¼   — t          j        t          ¦  «        }|                      t          |j        d¦  «         |                      t          |j        d¦  «         dS )zM
        L{URL.click} should not accept schemes with relative paths.
        zg:hzhttp:hN)r	   ri   r’   ÚassertRaisesÚNotImplementedErrorrŽ   )r)   r”   s     r   Útest_clickSchemeRelPathzTestURL.test_clickSchemeRelPathl  sP   € õ Œ|Õ6Ñ7Ô7ˆØ×ÒÕ-¨t¬z¸5ÑAÔAÐAØ×ÒÕ-¨t¬z¸8ÑDÔDÐDÐDÐDr   c           
     ó  — t          j        d¦  «        }|                      |                     |j        |j        |j        |j        |j        |j	        ¦  «        |¦  «         |                      |                     ¦   «         |¦  «         dS )zf
        Verify that L{URL.replace} doesn't change any of the arguments it
        is passed.
        zhttps://x:1/y?z=1#AN)
r	   ri   rI   Úreplacer5   r8   r9   r:   r=   rD   rl   s     r   Útest_cloneUnchangedzTestURL.test_cloneUnchangedt  s‰   € õ
 ”,Ð4Ñ5Ô5ˆØ×ÒØ�OŠOØ”Ø”Ø”Ø”ØÔ Ø”ñô ð ñ
	
ô 
	
ð 
	
ð 	×Ò˜ŸšÑ*Ô*¨GÑ4Ô4Ð4Ð4Ð4r   c                óR  — g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d	¢g d
¢g d¢g d¢g d¢g}|D ]z\  }}}t          j        |¦  «                             |¦  «                             ¦   «         }|                      ||d                     |t          |¦  «        ||¬¦  «        ¦  «         Œ{dS )zd
        L{URL.click} collapses C{.} and C{..} according to RFC 3986 section
        5.2.4.
        )rp   r   rp   )rp   r   rp   )úhttp://localhost/a/b/cr   zhttp://localhost/a/b/)rŸ   r   zhttp://localhost/a/)rŸ   z./d/ezhttp://localhost/a/b/d/e)rŸ   ú../d/eúhttp://localhost/a/d/e)rŸ   z/./d/eúhttp://localhost/d/e)rŸ   z/../d/er¢   )zhttp://localhost/a/b/c/z
../../d/e/zhttp://localhost/a/d/e/)zhttp://localhost/a/./cr    r¢   )zhttp://localhost/a/./c/r    r¡   )zhttp://localhost/a/b/c/dz./e/../f/../gzhttp://localhost/a/b/c/g)rŸ   zd//ezhttp://localhost/a/b/d//ez1{start}.click({click}) => {actual} not {expected})ÚstartrŽ   rJ   rK   N)r	   ri   rŽ   rk   rI   rf   r7   )r)   rq   r£   rŽ   rK   rJ   s         r   Útest_clickCollapsezTestURL.test_clickCollapse‡  s  € ð <Ð;Ð;Ø<Ð<Ð<ØDÐDÐDØCÐCÐCØKÐKÐKØJÐJÐJØHÐHÐHØIÐIÐIØPÐPÐPØHÐHÐHØKÐKÐKØUÐUÐUØKÐKÐKð
ˆð ',ð 	ð 	Ñ"ˆE�5˜(Ý”\ %Ñ(Ô(×.Ò.¨uÑ5Ô5×<Ò<Ñ>Ô>ˆFØ×ÒØØØC×JÒJØÝ˜u™+œ+Ø!Ø%ð	 Kñ ô ñ	ô 	ð 	ð 	ð	ð 	r   c                ó2  — |                       dt          j        d¦  «                             dd¦  «                             ¦   «         ¦  «         |                       dt          d¬¦  «                             dd¦  «                             ¦   «         ¦  «         t          j        t
          ¦  «        }|                       d|                     d	¦  «                             ¦   «         ¦  «         |                       d
|                     d	d¦  «                             ¦   «         ¦  «         |                       d|                     d	d¦  «                             d¦  «                             ¦   «         ¦  «         |                       d|                     d¦  «                             d	d¦  «                             ¦   «         ¦  «         |                       d|                     d	d¦  «                             dd¦  «                             ¦   «         ¦  «         dS )z3
        L{URL.add} adds query parameters.
        z'http://www.foo.com/a/nice/path/?foo=barzhttp://www.foo.com/a/nice/path/rb   rc   zhttp://www.foo.com/?foo=barrƒ   r„   z/http://www.foo.com/a/nice/path/?zot=23&zut&burpÚburpz3http://www.foo.com/a/nice/path/?zot=23&zut&burp=xxxÚxxxz8http://www.foo.com/a/nice/path/?zot=23&zut&burp=xxx&zingÚzingz8http://www.foo.com/a/nice/path/?zot=23&zut&zing&burp=xxxz:http://www.foo.com/a/nice/path/?zot=23&zut&burp=xxx&zot=32ÚzotÚ32N)rI   r	   ri   Úaddrk   rj   rl   s     r   Útest_queryAddzTestURL.test_queryAdd¨  sõ  € ð 	×ÒØ5ÝŒLÐ:Ñ;Ô;×?Ò?ÀÀuÑMÔM×TÒTÑVÔVñ	
ô 	
ð 	
ð 	×ÒØ)Ý�]Ð#Ñ#Ô#×'Ò'¨¨uÑ5Ô5×<Ò<Ñ>Ô>ñ	
ô 	
ð 	
õ ”,�vÑ&Ô&ˆØ×ÒØ=Ø�KŠK˜ÑÔ×&Ò&Ñ(Ô(ñ	
ô 	
ð 	
ð 	×ÒØAØ�KŠK˜ Ñ&Ô&×-Ò-Ñ/Ô/ñ	
ô 	
ð 	
ð 	×ÒØFØ�KŠK˜ Ñ&Ô&×*Ò*¨6Ñ2Ô2×9Ò9Ñ;Ô;ñ	
ô 	
ð 	
ð
 	×ÒØFØ�KŠK˜ÑÔ×#Ò# F¨EÑ2Ô2×9Ò9Ñ;Ô;ñ	
ô 	
ð 	
ð
 	×ÒØHØ�KŠK˜ Ñ&Ô&×*Ò*¨5°$Ñ7Ô7×>Ò>Ñ@Ô@ñ	
ô 	
ð 	
ð 	
ð 	
r   c                óî  — t          j        t          ¦  «        }|                      d|                     dd¦  «                             ¦   «         ¦  «         |                      d|                     d¦  «                             dd¦  «                             ¦   «         ¦  «         |                      d|                     dd¦  «                             dd¦  «                             ¦   «         ¦  «         dS )	z?
        L{URL.set} replaces query parameters by name.
        z*http://www.foo.com/a/nice/path/?zot=32&zutr©   rª   z0http://www.foo.com/a/nice/path/?zot&zut=itworkedÚzutÚitworkedr§   N)r	   ri   rj   rI   Úsetrk   r«   rl   s     r   Útest_querySetzTestURL.test_querySetÌ  sç   € õ ”,�vÑ&Ô&ˆØ×ÒØ8Ø�KŠK˜˜tÑ$Ô$×+Ò+Ñ-Ô-ñ	
ô 	
ð 	
ð
 	×ÒØ>Ø�KŠK˜ÑÔ×"Ò" 5¨*Ñ5Ô5×<Ò<Ñ>Ô>ñ	
ô 	
ð 	
ð 	×ÒØ8Ø�KŠK˜˜uÑ%Ô%×)Ò)¨%°Ñ6Ô6×=Ò=Ñ?Ô?ñ	
ô 	
ð 	
ð 	
ð 	
r   c                ó¤   — t          j        d¦  «        }|                      |                     d¦  «        t          j        d¦  «        ¦  «         dS )zK
        L{URL.remove} removes all instances of a query parameter.
        z*https://example.com/a/b/?foo=1&bar=2&foo=3rb   zhttps://example.com/a/b/?bar=2N)r	   ri   rI   Úremove©r)   Úurls     r   Útest_queryRemovezTestURL.test_queryRemoveá  sR   € õ ŒlÐGÑHÔHˆØ×ÒØ�JŠJ�uÑÔ�sœ|Ð,LÑMÔMñ	
ô 	
ð 	
ð 	
ð 	
r   c                ón   — |                       t          ¦   «                              ¦   «         d¦  «         dS )zG
        An empty L{URL} should serialize as the empty string.
        r   N)rI   r	   rk   r(   s    r   Ú
test_emptyzTestURL.test_emptyê  s,   € ð 	×Ò�™œŸš™œ¨Ñ,Ô,Ð,Ð,Ð,r   c                óx   — t          dg¬¦  «        }|                      |                     ¦   «         d¦  «         dS )zP
        An L{URL} with query text should serialize as just query text.
        ©ÚhelloÚworld©r:   z?hello=worldN)r	   rI   rk   r\   s     r   Útest_justQueryTextzTestURL.test_justQueryTextð  s<   € õ Ð)Ð*Ð+Ñ+Ô+ˆØ×Ò˜Ÿš™œ ^Ñ4Ô4Ð4Ð4Ð4r   c                óZ   — t          j        d¦  «        }|                      ||¦  «         dS )z2
        L{URL} compares equal to itself.
        rp   N©r	   ri   rI   r\   s     r   Útest_identicalEqualzTestURL.test_identicalEqual÷  s0   € õ ŒLÐ,Ñ-Ô-ˆØ×Ò˜˜AÑÔÐÐÐr   c                ó‚   — t          j        d¦  «        }t          j        d¦  «        }|                      ||¦  «         dS )zG
        URLs with equivalent components should compare equal.
        rp   NrÀ   ©r)   Úu1Úu2s      r   Útest_similarEqualzTestURL.test_similarEqualþ  s@   € õ Œ\Ð-Ñ.Ô.ˆÝŒ\Ð-Ñ.Ô.ˆØ×Ò˜˜RÑ Ô Ð Ð Ð r   c                óÀ   — t          j        d¦  «        }t          j        d¦  «        }|                      ||k    |›d|›�¦  «         |                      ||¦  «         dS )z|
        L{URL}s that refer to different resources are both unequal (C{!=}) and
        also not equal (not C{==}).
        úhttp://localhost/aúhttp://localhost/bú != N)r	   ri   ÚassertFalserv   rÃ   s      r   Útest_differentNotEqualzTestURL.test_differentNotEqual  sh   € õ
 Œ\Ð.Ñ/Ô/ˆÝŒ\Ð.Ñ/Ô/ˆØ×Ò˜˜rš bÐ#6Ð#6°Ð#6Ð#6Ñ7Ô7Ð7Ø×Ò˜B Ñ#Ô#Ð#Ð#Ð#r   c                ó  — t          j        d¦  «        }|                      |dk    d¦  «         |                      |t          ¦   «         k    d¦  «         |                      |d¦  «         |                      |t          ¦   «         ¦  «         dS )z=
        L{URL} is not equal (C{==}) to other types.
        rp   é*   zURL must not equal a number.zURL must not equal an object.N)r	   ri   rË   Úobjectrv   r\   s     r   Útest_otherTypesNotEqualzTestURL.test_otherTypesNotEqual  s„   € õ ŒLÐ,Ñ-Ô-ˆØ×Ò˜˜bšÐ"@ÑAÔAÐAØ×Ò˜�f™hœhšÐ(GÑHÔHÐHØ×Ò˜A˜rÑ"Ô"Ð"Ø×Ò˜A�v™xœxÑ(Ô(Ð(Ð(Ð(r   c                óh   — t          j        d¦  «        }|                      ||k    d|z  ¦  «         dS )zJ
        Identical L{URL}s are not unequal (C{!=}) to each other.
        rp   z%r == itselfN©r	   ri   rË   r\   s     r   Útest_identicalNotUnequalz TestURL.test_identicalNotUnequal  s9   € õ ŒLÐ,Ñ-Ô-ˆØ×Ò˜˜aš °!Ñ!3Ñ4Ô4Ð4Ð4Ð4r   c                ó”   — t          j        d¦  «        }t          j        d¦  «        }|                      ||k    |›d|›�¦  «         dS )zU
        Structurally similar L{URL}s are not unequal (C{!=}) to each other.
        rp   ú == NrÒ   rÃ   s      r   Útest_similarNotUnequalzTestURL.test_similarNotUnequal!  sR   € õ Œ\Ð-Ñ.Ô.ˆÝŒ\Ð-Ñ.Ô.ˆØ×Ò˜˜rš bÐ#6Ð#6°Ð#6Ð#6Ñ7Ô7Ð7Ð7Ð7r   c                ó”   — t          j        d¦  «        }t          j        d¦  «        }|                      ||k    |›d|›�¦  «         dS )zS
        Structurally different L{URL}s are unequal (C{!=}) to each other.
        rÈ   rÉ   rÕ   N)r	   ri   r;   rÃ   s      r   Útest_differentUnequalzTestURL.test_differentUnequal)  sP   € õ Œ\Ð.Ñ/Ô/ˆÝŒ\Ð.Ñ/Ô/ˆØ�Š˜˜bš RÐ"5Ð"5¨rÐ"5Ð"5Ñ6Ô6Ð6Ð6Ð6r   c                ó®   — t          j        d¦  «        }|                      |dk    d¦  «         |                      |t          ¦   «         k    d¦  «         dS )z;
        L{URL} is unequal (C{!=}) to other types.
        rp   rÎ   zURL must differ from a number.z"URL must be differ from an object.N)r	   ri   r;   rÏ   r\   s     r   Útest_otherTypesUnequalzTestURL.test_otherTypesUnequal1  sP   € õ ŒLÐ,Ñ-Ô-ˆØ�Š˜˜RšÐ!AÑBÔBÐBØ�Š˜�V™XœXšÐ'KÑLÔLÐLÐLÐLr   c                ó†  — d}t          j        |¦  «        }|                     ¦   «         }|                      |j        d¦  «         |                      |j        d         d¦  «         |                      |                     ¦   «         |¦  «         d}|                     ¦   «         }|                      |||›d|›�¦  «         dS )z‹
        L{URL.asURI} produces an URI which converts any URI unicode encoding
        into pure US-ASCII and returns a new L{URL}.
        õ   http://Ã©.com/eÌ�?aÌ�=iÌ�#uÌ�u   Ã©.comr   u   eÌ�ú.http://xn--9ca.com/%C3%A9?%C3%A1=%C3%AD#%C3%BArÊ   N)r	   ri   ÚasURIrI   r8   r9   rk   )r)   ÚunicodeyÚiriÚuriÚexpectedURIÚ	actualURIs         r   Ú
test_asURIzTestURL.test_asURI9  sÆ   € ðBð 	õ Œl˜8Ñ$Ô$ˆØ�iŠi‰kŒkˆØ×Ò˜œÐ#LÑMÔMÐMØ×ÒØŒH�QŒKÐMñ	
ô 	
ð 	
ð 	×Ò˜Ÿš™œ xÑ0Ô0Ð0ØFˆØ—J’J‘L”Lˆ	Ø×Ò˜ K°IÐ1TÐ1TÀ[Ð1TÐ1TÑUÔUÐUÐUÐUr   c                ó†  — d}t          j        |¦  «        }|                     ¦   «         }|                      |j        d¦  «         |                      |j        d         d¦  «         |                      |                     ¦   «         |¦  «         d}|                     ¦   «         }|                      |||›d|›�¦  «         dS )zœ
        L{URL.asIRI} decodes any percent-encoded text in the URI, making it
        more suitable for reading by humans, and returns a new L{URL}.
        rÝ   zxn--9ca.comr   z%C3%A9u   http://Ã©.com/Ã©?Ã¡=Ã­#ÃºrÊ   N)r	   ri   ÚasIRIrI   r8   r9   rk   )r)   Úasciiishrá   rà   ÚexpectedIRIÚ	actualIRIs         r   Ú
test_asIRIzTestURL.test_asIRIP  s½   € ð
 DˆÝŒl˜8Ñ$Ô$ˆØ�iŠi‰kŒkˆØ×Ò˜œ =Ñ1Ô1Ð1Ø×Ò˜œ !œ hÑ/Ô/Ð/Ø×Ò˜Ÿš™œ xÑ0Ô0Ð0ð3ð 	ð —J’J‘L”Lˆ	Ø×Ò˜ K°IÐ1TÐ1TÀ[Ð1TÐ1TÑUÔUÐUÐUÐUr   c                ó¾   — d}t          j        |¦  «        }|                     ¦   «         }d}|                     ¦   «         }|                      |||›d|›�¦  «         dS )zœ
        Bad UTF-8 in a path segment, query parameter, or fragment results in
        that portion of the URI remaining percent-encoded in the IRI.
        z http://xn--9ca.com/%00%FF/%C3%A9u   http://Ã©.com/%00%FF/Ã©rÊ   N)r	   ri   ræ   rk   rI   )r)   ÚurlWithBinaryrá   rà   rè   ré   s         r   Útest_badUTF8AsIRIzTestURL.test_badUTF8AsIRIe  sj   € ð
 ;ˆÝŒl˜=Ñ)Ô)ˆØ�iŠi‰kŒkˆð2ð 	ð
 —J’J‘L”Lˆ	Ø×Ò˜ K°IÐ1TÐ1TÀ[Ð1TÐ1TÑUÔUÐUÐUÐUr   c                óª   — d}t          j        |¦  «        }|                     ¦   «         }|                      |                     ¦   «         |¦  «         dS )zT
        A L{URL} composed of non-ASCII text will result in non-ASCII text.
        rÜ   N)r	   ri   ræ   rI   rk   )r)   rß   rà   ÚalsoIRIs       r   Útest_alreadyIRIAsIRIzTestURL.test_alreadyIRIAsIRIu  sQ   € ð
Bð 	õ Œl˜8Ñ$Ô$ˆØ—)’)‘+”+ˆØ×Ò˜ŸšÑ)Ô)¨8Ñ4Ô4Ð4Ð4Ð4r   c                óª   — d}t          j        |¦  «        }|                     ¦   «                              ¦   «         }|                      ||¦  «         dS )zH
        A L{URL} composed of encoded text will remain encoded.
        rÝ   N)r	   ri   rÞ   rk   rI   )r)   râ   rá   rã   s       r   Útest_alreadyURIAsURIzTestURL.test_alreadyURIAsURI„  sN   € ð GˆÝŒl˜;Ñ'Ô'ˆØ—I’I‘K”K×&Ò&Ñ(Ô(ˆ	Ø×Ò˜ KÑ0Ô0Ð0Ð0Ð0r   c                ó  — t          j        d¦  «        }|                      |                     d¦  «        d¦  «         |                      |                     d¦  «        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |                     ¦   «         d¦  «         |                      |                     d¬	¦  «                             ¦   «         d
¦  «         dS )zz
        L{URL.fromText} will parse the C{userinfo} portion of the URI
        separately from the host and port.
        z<http://someuser:somepassword@example.com/some-segment@ignoreTz!someuser:somepassword@example.comFzsomeuser:@example.comzsomeuser:somepasswordÚsomeuserz0http://someuser:@example.com/some-segment@ignore)rF   z/http://someuser@example.com/some-segment@ignoreN)r	   ri   rI   Ú	authorityrF   Úuserrk   rœ   r´   s     r   Útest_userinfozTestURL.test_userinfo�  sû   € õ
 ŒlØJñ
ô 
ˆð 	×Ò˜Ÿš tÑ,Ô,Ð.QÑRÔRÐRØ×Ò˜Ÿš uÑ-Ô-Ð/FÑGÔGÐGØ×Ò˜œÐ'>Ñ?Ô?Ð?Ø×Ò˜œ :Ñ.Ô.Ð.Ø×ÒØ�JŠJ‰LŒLÐLñ	
ô 	
ð 	
ð 	×ÒØ�KŠK ˆKÑ,Ô,×3Ò3Ñ5Ô5Ø=ñ	
ô 	
ð 	
ð 	
ð 	
r   c                ó´   — t          j        d¦  «        }|                      |j        d¦  «         |                      |                     ¦   «         d¦  «         dS )zI
        L{URL.fromText} parses custom port numbers as integers.
        zhttp://www.example.com:8080/i�  N)r	   ri   rI   rD   rk   )r)   ÚportURLs     r   Útest_portTextzTestURL.test_portText¡  sS   € õ ”,Ð=Ñ>Ô>ˆØ×Ò˜œ tÑ,Ô,Ð,Ø×Ò˜ŸšÑ)Ô)Ð+IÑJÔJÐJÐJÐJr   c                óz   — |                       t          j        d¦  «                             ¦   «         d¦  «         dS )a  
        Although L{URL} instances are mainly for dealing with HTTP, other
        schemes (such as C{mailto:}) should work as well.  For example,
        L{URL.fromText}/L{URL.asText} round-trips cleanly for a C{mailto:} URL
        representing an email address.
        zmailto:user@example.comN)rI   r	   ri   rk   r(   s    r   Útest_mailtozTestURL.test_mailto©  sC   € ð 	×ÒÝŒLÐ2Ñ3Ô3×:Ò:Ñ<Ô<Ð>Wñ	
ô 	
ð 	
ð 	
ð 	
r   c                ób   — t          ddgg¬¦  «        }|                      |j        d¦  «         dS )zŒ
        When a L{URL} is created with a C{query} argument, the C{query}
        argument is converted into an N-tuple of 2-tuples.
        ÚalphaÚbetar½   ))rþ   rÿ   N)r	   rI   r:   r´   s     r   Útest_queryIterablezTestURL.test_queryIterable´  s;   € õ ˜' 6Ð*Ð+Ð,Ñ,Ô,ˆØ×Ò˜œÐ$8Ñ9Ô9Ð9Ð9Ð9r   c                ó`   — t          ddg¬¦  «        }|                      |j        d¦  «         dS )zr
        When a L{URL} is created with a C{path} argument, the C{path} is
        converted into a tuple.
        r»   r¼   ©r9   rº   N)r	   rI   r9   r´   s     r   Útest_pathIterablezTestURL.test_pathIterable½  s8   € õ
 ˜ Ð)Ð*Ñ*Ô*ˆØ×Ò˜œÐ#5Ñ6Ô6Ð6Ð6Ð6r   c                ó  ‡ ‡‡—  G d„ d¦  «        Št           t          u rdnd}d"ˆ fd„Š|fd#ˆˆˆ fd„} |d¦  «          |d¦  «          |d¦  «          |dd¦  «          |d¦  «          |dd¦  «         ‰                      t          ¦  «        5 }t	           ‰¦   «         g¬¦  «         ddd¦  «         n# 1 swxY w Y    ‰||d¦  «         ‰                      t          ¦  «        5 }t	          d ‰¦   «         fg¬¦  «         ddd¦  «         n# 1 swxY w Y    ‰||dz   d¦  «         ‰                      t          ¦  «        5 }t	           ‰¦   «         dfg¬¦  «         ddd¦  «         n# 1 swxY w Y    ‰||d¦  «         ‰                      t          ¦  «        5  t	           ‰¦   «         g¬¦  «         ddd¦  «         n# 1 swxY w Y   ‰                      t
          ¦  «        5  t	          dg¬¦  «         ddd¦  «         n# 1 swxY w Y   ‰                      t
          ¦  «        5  t	          dg¬¦  «         ddd¦  «         n# 1 swxY w Y   t	          j        d ¦  «        }‰                      t          ¦  «        5 }|                      ‰¦   «         ¦  «         ddd¦  «         n# 1 swxY w Y    ‰||d¦  «         ‰                      t          ¦  «        5 }|                      ‰¦   «         ¦  «         ddd¦  «         n# 1 swxY w Y    ‰||d¦  «         ‰                      t          ¦  «        5 }| 	                     ‰¦   «         ¦  «         ddd¦  «         n# 1 swxY w Y    ‰||d!¦  «         dS )$a¤  
        Passing an argument of the wrong type to any of the constructor
        arguments of L{URL} will raise a descriptive L{TypeError}.

        L{URL} typechecks very aggressively to ensure that its constitutent
        parts are all properly immutable and to prevent confusing errors when
        bad data crops up in a method call long after the code that called the
        constructor is off the stack.
        c                  ó   — e Zd Zdd„Zdd„ZdS )ú1TestURL.test_invalidArguments.<locals>.Unexpectedr$   r6   c                ó   — dS )NÚwrongr'   r(   s    r   Ú__str__z9TestURL.test_invalidArguments.<locals>.Unexpected.__str__Ñ  s   € Ø�wr   c                ó   — dS )Nú<unexpected>r'   r(   s    r   Ú__repr__z:TestURL.test_invalidArguments.<locals>.Unexpected.__repr__Ô  s   € Ø%�~r   N)r$   r6   )r+   r,   r-   r	  r  r'   r   r   Ú
Unexpectedr  Ð  s<   € € € € € ðð ð ð ð&ð &ð &ð &ð &ð &r   r  Úunicoder6   Úraisedr#   ÚexpectationÚnamer$   r2   c                ó‚   •— ‰                      t          | j        ¦  «        d                     ||d¦  «        ¦  «         d S )Nzexpected {} for {}, got {}r  )rI   r6   r*   rf   )r  r  r  r)   s      €r   ÚassertRaisedz3TestURL.test_invalidArguments.<locals>.assertRaisedÙ  sH   ø€ Ø×ÒÝ�FÔ$Ñ%Ô%Ø,×3Ò3°KÀÀ~ÑVÔVñô ð ð ð r   Úparamc                ó²   •— ‰                      t          ¦  «        5 }t          di |  ‰¦   «         i¤Ž d d d ¦  «         n# 1 swxY w Y    ‰||| ¦  «         d S )Nr'   )r˜   Ú	TypeErrorr	   )r  r  r  r  r  r)   s      €€€r   rQ   z,TestURL.test_invalidArguments.<locals>.checkß  s¢   ø€ Ø×"Ò"¥9Ñ-Ô-ð -°ÝÐ,Ð,�u˜j˜j™lœlÐ+Ð,Ð,Ð,ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -àˆL˜ ¨eÑ4Ô4Ð4Ð4Ð4s   œ?¿AÁAr5   r8   r=   r…   ÚboolrF   rD   zint or NoneTyper  Nzpath segmentr½   z or NoneTypezquery parameter valueÚvaluezquery parameter name)r?   r@   Úvv)r?   zhttps://valid.example.com/zrelative URL)r  r#   r  r6   r  r6   r$   r2   )r  r6   r  r6   r$   r2   )
Úbytesr6   r˜   r  r	   Ú
ValueErrorri   r|   rŠ   rŽ   )r)   ÚdefaultExpectationrQ   r  rµ   r  r  s   `    @@r   Útest_invalidArgumentszTestURL.test_invalidArgumentsÅ  sB  øøø€ ð	&ð 	&ð 	&ð 	&ð 	&ñ 	&ô 	&ð 	&õ +0µ3¨,¨,˜Y˜Y¸EÐð	ð 	ð 	ð 	ð 	ð 	ð 2Dð 	5ð 	5ð 	5ð 	5ð 	5ð 	5ð 	5ð 	5ð 	5ð
 	ˆˆh‰ŒˆØˆˆf‰ŒˆØˆˆjÑÔÐØˆˆh˜ÑÔÐØˆˆjÑÔÐØˆˆfÐ'Ñ(Ô(Ð(à×Ò�yÑ)Ô)ð 	¨VÝà�J‘L”Lððñ ô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ˆ�VÐ/°Ñ@Ô@Ð@Ø×Ò�yÑ)Ô)ð 	¨VÝà˜Z˜Z™\œ\Ð*ððñ ô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ˆØÐ&¨Ñ7Ð9Pñ	
ô 	
ð 	
ð ×Ò�yÑ)Ô)ð 	¨VÝà�Z‘\”\ 7Ð+ððñ ô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ˆ�VÐ/Ð1GÑHÔHÐHð ×Ò�yÑ)Ô)ð 	&ð 	&Ý�z�z‘|”|�nÐ%Ñ%Ô%Ð%ð	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&øøøð 	&ð 	&ð 	&ð 	&à×Ò�zÑ*Ô*ð 	*ð 	*ÝÐ'Ð(Ð)Ñ)Ô)Ð)ð	*ð 	*ð 	*ñ 	*ô 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*øøøð 	*ð 	*ð 	*ð 	*à×Ò�zÑ*Ô*ð 	 ð 	 Ý�v�hÐÑÔÐð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 õ ŒlÐ7Ñ8Ô8ˆØ×Ò�yÑ)Ô)ð 	$¨VØ�IŠI�j�j‘l”lÑ#Ô#Ð#ð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$àˆ�VÐ/°Ñ@Ô@Ð@Ø×Ò�yÑ)Ô)ð 	&¨VØ�KŠK˜
˜
™œÑ%Ô%Ð%ð	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&øøøð 	&ð 	&ð 	&ð 	&àˆ�VÐ/°Ñ@Ô@Ð@Ø×Ò�yÑ)Ô)ð 	$¨VØ�IŠI�j�j‘l”lÑ#Ô#Ð#ð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$àˆ�VÐ/°Ñ@Ô@Ð@Ð@Ð@s¢   ÂB7Â7B;Â>B;Ã)DÄDÄDÅE.Å.E2Å5E2Æ GÇG
ÇG
Ç+H	È	HÈHÈ.IÉIÉIÊJ/Ê/J3Ê6J3Ë!LÌLÌLÌ=M'Í'M+Í.M+c                ó  — |                       t          ¦  «        5 }t          d¬¦  «         ddd¦  «         n# 1 swxY w Y   |                      t	          |j        ¦  «        d                     t          d¦  «        ¦  «        ¦  «         dS )z·
        Technically, L{str} (or L{unicode}, as appropriate) is iterable, but
        C{URL(path="foo")} resulting in C{URL.fromText("f/o/o")} is never what
        you want.
        rb   r  Nz+expected iterable of text for path, not: {})r˜   r  r	   rI   r6   r*   rf   r7   )r)   r  s     r   Ú!test_technicallyTextIsIterableButz)TestURL.test_technicallyTextIsIterableBut  s¾   € ð ×Ò�yÑ)Ô)ð 	¨VÝ�UˆO‰OŒOˆOð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	à×ÒÝ�Ô Ñ!Ô!Ø9×@Ò@ÅÀeÁÄÑMÔMñ	
ô 	
ð 	
ð 	
ð 	
s   ›8¸<¿<NrR   )r   )r1   r	   r5   r6   r8   r6   r9   rB   r:   rC   r=   r6   rD   rE   rF   r6   r$   r2   ©r$   r2   )0r+   r,   r-   Ú__doc__rA   rL   rS   r]   r`   rg   rn   rt   rw   ry   r}   r�   r‡   rŒ   r�   r–   rš   r�   r¤   r¬   r±   r¶   r¸   r¾   rÁ   rÆ   rÌ   rÐ   rÓ   rÖ   rØ   rÚ   rä   rê   rí   rð   rò   r÷   rú   rü   r   r  r  r  r'   r   r   r0   r0   U   sÅ  € € € € € ðð ð8ð 8ð 8ð 8ð0 ð +ð  +ð  +ð  +ð  +ðD+ð +ð +ð +ð
ð 
ð 
ð 
ð$
ð 
ð 
ð 
ð
ð 
ð 
ð 
ð&3ð 3ð 3ð 3ð+ð +ð +ð +ð0
ð 
ð 
ð 
ð
ð 
ð 
ð 
ð
ð 
ð 
ð 
ð.
ð 
ð 
ð 
ðDð Dð Dð Dð
ð 
ð 
ð 
ð$&
ð &
ð &
ð &
ðPAð Að Að AðEð Eð Eð Eð5ð 5ð 5ð 5ð&ð ð ð ðB"
ð "
ð "
ð "
ðH
ð 
ð 
ð 
ð*
ð 
ð 
ð 
ð-ð -ð -ð -ð5ð 5ð 5ð 5ðð ð ð ð!ð !ð !ð !ð$ð $ð $ð $ð)ð )ð )ð )ð5ð 5ð 5ð 5ð8ð 8ð 8ð 8ð7ð 7ð 7ð 7ðMð Mð Mð MðVð Vð Vð Vð.Vð Vð Vð Vð*Vð Vð Vð Vð 5ð 5ð 5ð 5ð1ð 1ð 1ð 1ð
ð 
ð 
ð 
ð(Kð Kð Kð Kð	
ð 	
ð 	
ð 	
ð:ð :ð :ð :ð7ð 7ð 7ð 7ðOAð OAð OAð OAðb
ð 
ð 
ð 
ð 
ð 
r   r0   c                  ó   — e Zd ZdZdd„ZdS )ÚURLDeprecationTestsz.
    L{twisted.python.url} is deprecated.
    r$   r2   c                óÖ   — ddl m} | |                      | j        g¦  «        }|                      dt          |¦  «        ¦  «         |                      d|d         d         ¦  «         dS )zK
        L{twisted.python.url} is deprecated since Twisted 17.5.0.
        r   )rµ   é   z\twisted.python.url was deprecated in Twisted 17.5.0: Please use hyperlink from PyPI instead.ÚmessageN)Útwisted.pythonrµ   ÚflushWarningsÚtest_urlDeprecationrI   Úlen)r)   rµ   ÚwarningsShowns      r   r)  z'URLDeprecationTests.test_urlDeprecation)  sˆ   € ð 	'Ð&Ð&Ð&Ð&Ð&àˆà×*Ò*¨DÔ,DÐ+EÑFÔFˆØ×Ò˜�C Ñ.Ô.Ñ/Ô/Ð/Ø×Òð;ð ˜!Ô˜YÔ'ñ	
ô 	
ð 	
ð 	
ð 	
r   Nr   )r+   r,   r-   r!  r)  r'   r   r   r#  r#  $  s2   € € € € € ðð ð
ð 
ð 
ð 
ð 
ð 
r   r#  N)r!  Ú
__future__r   Útypingr   Útyping_extensionsr   Útwisted.trial.unittestr   rµ   r	   rj   r’   r“   Ú_percentencr#   r0   r#  r'   r   r   ú<module>r1     s(  ðð
ð ð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð à &Ð &Ð &Ð &Ð &Ð &à 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø Ð Ð Ð Ð Ð à	5€ð 2Ð ð4ð 4ð 4Ð ðn >Ð=€ðð ð ð ð �Hñ ô ð ðL
ð L
ð L
ð L
ð L
Ð!ñ L
ô L
ð L
ð^
ð 
ð 
ð 
ð 
Ð-ñ 
ô 
ð 
ð 
ð 
r   