Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
wlanpi-profiler / opt / wlanpi-profiler / lib / python3.7 / site-packages / scapy / __pycache__ / asn1fields.cpython-37.pyc
Size: Mime:
B

FKk…[¨Ñ{ã@sÖdZddlmZddlmZmZmZmZmZddl	m
Z
mZmZm
Z
ddlmZmZmZmZmZmZddlmZmZddlmZddlmZdd	lmZdd
lmZddl m!m"Z"ddl#m$Z$Gd
d„de%ƒZ&Gdd„de'ƒZ(Gdd„de(ƒZ)Gdd„de)ƒZ*Gdd„de)ƒZ+Gdd„de+ƒZ,Gdd„de)ƒZ-Gdd„de)ƒZ.Gdd„de+ƒZ/Gdd „d e)ƒZ0Gd!d"„d"e,ƒZ1Gd#d$„d$e.ƒZ2Gd%d&„d&e.ƒZ3Gd'd(„d(e.ƒZ4Gd)d*„d*e.ƒZ5Gd+d,„d,e.ƒZ6Gd-d.„d.e.ƒZ7Gd/d0„d0e.ƒZ8Gd1d2„d2e.ƒZ9Gd3d4„d4e.ƒZ:Gd5d6„d6e.ƒZ;Gd7d8„d8e.ƒZ<Gd9d:„d:e)ƒZ=Gd;d<„d<e=ƒZ>Gd=d>„d>e)ƒZ?Gd?d@„d@e?ƒZ@GdAdB„dBe.ƒZAGdCdD„dDe+ƒZBGdEdF„dFe(ƒZCGdGdH„dHe)ƒZDGdIdJ„dJe)ƒZEGdKdL„dLe-ƒZFGdMdN„dNe-ƒZGdS)Oz/
Classes that implement ASN.1 data structures.
é)Úabsolute_import)ÚASN1_Class_UNIVERSALÚ	ASN1_NULLÚ
ASN1_ErrorÚASN1_ObjectÚASN1_INTEGER)ÚBER_tagging_decÚBER_Decoding_ErrorÚ
BER_id_decÚBER_tagging_enc)ÚRandIntÚ
RandChoiceÚRandNumÚ
RandStringÚRandOIDÚGeneralizedTime)ÚorbÚraw)Ú
BasePacket)Úbinrepr)Úpacket)ÚreduceN)Úrangec@seZdZdS)ÚASN1F_badsequenceN)Ú__name__Ú
__module__Ú__qualname__©rrú/build/wlanpi-profiler-7IIg1Q/wlanpi-profiler-1.0.11/debian/wlanpi-profiler/opt/wlanpi-profiler/lib/python3.7/site-packages/scapy/asn1fields.pyrsrc@seZdZdS)Ú
ASN1F_elementN)rrrrrrrrsrc@s˜eZdZdZdZejZeZd"dd„Z	dd„Z
dd	„Zd
d„Zdd
„Z
dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„ZdS)#ÚASN1F_fieldrNFcCs~||_||_|dkrd|_n t|tƒr.||_n|j |¡|_||_|dk	r^|dk	r^d}t|ƒ‚||_	||_
|pv|pv|j|_dS)Nz5field cannot be both implicitly and explicitly tagged)ÚcontextÚnameÚdefaultÚ
isinstancerÚASN1_tagZasn1_objectÚflexible_tagrÚimplicit_tagÚexplicit_tagÚnetwork_tag)Úselfr"r#r!r'r(r&Úerr_msgrrrÚ__init__-s
zASN1F_field.__init__cCst|ƒS)N)Úrepr)r*ÚpktÚxrrrÚi2reprAszASN1F_field.i2reprcCs|S)Nr)r*r.r/rrrÚi2hDszASN1F_field.i2hcCs|S)Nr)r*r.r/rrrÚany2iGszASN1F_field.any2icCs€t||j|j|j|jd\}}|dk	rH|jdk	r8||_n|jdk	rH||_|j |j¡}|jrl|j||jdS|j	||jdSdS)a
        The good thing about safedec is that it may still decode ASN1
        even if there is a mismatch between the expected tag (self.ASN1_tag)
        and the actual tag; the decoded ASN1 object will simply be put
        into an ASN1_BADTAG object. However, safedec prevents the raising of
        exceptions needed for ASN1F_optional processing.
        Thus we use 'flexible_tag', which should be False with ASN1F_optional.

        Regarding other fields, we might need to know whether encoding went
        as expected or not. Noticeably, input methods from cert.py expect
        certain exceptions to be raised. Hence default flexible_tag is False.
        )Ú
hidden_tagr'r(ÚsafeN)r!)
rr%r'r(r&Ú	get_codecÚ
ASN1_codecZsafedecr!Údec)r*r.ÚsÚdiff_tagÚcodecrrrÚm2iJs


zASN1F_field.m2icCs’|dkrdSt|tƒrl|jtjksF|jtjksF|jtjksF|j|jkrT| |j	¡}q€t
d||j|jfƒ‚n|j |j	¡ |¡}t
||j|jdS)Nóz6Encoding Error: got %r instead of an %r for field [%s])r'r()r$rr%rÚANYÚtagÚRAWÚERRORÚencr6rr"r5rr'r()r*r.r/r8rrrÚi2mgs
zASN1F_field.i2mcCspt|ƒdkrdy||ƒ}Wntk
r6t |¡}YnX| tj¡}d}|dk	r\|j}|j`||fSd|fSdS)Nrr<)ÚlenrrZRawZgetlayerÚloadZ
underlayerÚpayload)r*Úclsr8ÚcZcpadrrrÚextract_packetwszASN1F_field.extract_packetcCs| |t||jƒ¡S)N)rBÚgetattrr")r*r.rrrÚbuild†szASN1F_field.buildcCs | ||¡\}}| ||¡|S)N)r;Úset_val)r*r.r8ÚvrrrÚdissect‰szASN1F_field.dissectcCs`t|dƒr| ¡St|tƒr\|dd…}x2tt|ƒƒD]"}t||tƒr6|| ¡||<q6W|S)NÚcopy)ÚhasattrrNr$ÚlistrrCr)r*r/ÚirrrÚdo_copyŽs

zASN1F_field.do_copycCst||j|ƒdS)N)Úsetattrr")r*r.ÚvalrrrrK˜szASN1F_field.set_valcCst||jƒdkS)N)rIr")r*r.rrrÚis_empty›szASN1F_field.is_emptycCs|gS)Nr)r*rrrÚget_fields_listžszASN1F_field.get_fields_listcCst|ƒS)N)r-)r*rrrÚ__str__¡szASN1F_field.__str__cCstƒS)N)r)r*rrrÚrandval¤szASN1F_field.randval)NNNF)rrrÚ
holds_packetsÚislistrr=r%r!r,r0r1r2r;rBrHrJrMrRrKrUrVrWrXrrrrr 's*

r c@seZdZejZdd„ZdS)Ú
ASN1F_BOOLEANcCs
tddƒS)NTF)r
)r*rrrrX¯szASN1F_BOOLEAN.randvalN)rrrrZBOOLEANr%rXrrrrr[¬sr[c@seZdZejZdd„ZdS)Ú
ASN1F_INTEGERcCs
tddƒS)Nlûÿÿÿlÿÿÿÿ)r)r*rrrrX¶szASN1F_INTEGER.randvalN)rrrrZINTEGERr%rXrrrrr\³sr\cs.eZdZddd„Z‡fdd„Zdd„Z‡ZS)	ÚASN1F_enum_INTEGERNcCstj||||||di}|_i}|_t|tƒrBtt|ƒƒ}	nt|ƒ}	tdd„|	Dƒƒrf||}}x$|	D]}
||
||
<|
|||
<qlWdS)N)r!r'r(css|]}t|tjƒVqdS)N)r$ÚsixÚstring_types)Ú.0r/rrrú	<genexpr>Æsz.ASN1F_enum_INTEGER.__init__.<locals>.<genexpr>)	r\r,Úi2sÚs2ir$rPrrCÚany)r*r"r#Úenumr!r'r(rbrcÚkeysÚkrrrr,»s




zASN1F_enum_INTEGER.__init__cs(t|tƒr|j |¡}tt|ƒ ||¡S)N)r$ÚstrrcÚgetÚsuperr]rB)r*r.r8)Ú	__class__rrrBÌs
zASN1F_enum_INTEGER.i2mcCs<|dk	r4t|tƒr4|j |j¡}|r4d|t|ƒfSt|ƒS)Nz'%s' %s)r$rrbrirTr-)r*r.r/Úrrrrr0Ñs
zASN1F_enum_INTEGER.i2repr)NNN)rrrr,rBr0Ú
__classcell__rr)rkrr]ºs
r]c@s$eZdZejZddd„Zdd„ZdS)ÚASN1F_BIT_STRINGTNcCs:|dk	r |r d dd„|Dƒ¡}tj||||||ddS)Nr<css&|]}tt|ƒƒ d¡ d¡VqdS)éÚutf8N)rrÚzfillÚencode)r`r/rrrraßsz,ASN1F_BIT_STRING.__init__.<locals>.<genexpr>)r!r'r()Újoinr r,)r*r"r#Údefault_readabler!r'r(rrrr,Üs
zASN1F_BIT_STRING.__init__cCsttddƒƒS)Nriè)rr)r*rrrrXäszASN1F_BIT_STRING.randval)TNNN)rrrrZ
BIT_STRINGr%r,rXrrrrrnÙs
rnc@seZdZejZdd„ZdS)ÚASN1F_STRINGcCsttddƒƒS)Nriè)rr)r*rrrrXëszASN1F_STRING.randvalN)rrrrÚSTRINGr%rXrrrrruèsruc@seZdZejZdS)Ú
ASN1F_NULLN)rrrrZNULLr%rrrrrwïsrwc@seZdZejZdd„ZdS)Ú	ASN1F_OIDcCstƒS)N)r)r*rrrrXöszASN1F_OID.randvalN)rrrrZOIDr%rXrrrrrxósrxc@seZdZejZdS)ÚASN1F_ENUMERATEDN)rrrrZ
ENUMERATEDr%rrrrryúsryc@seZdZejZdS)ÚASN1F_UTF8_STRINGN)rrrrZUTF8_STRINGr%rrrrrzþsrzc@seZdZejZdS)ÚASN1F_NUMERIC_STRINGN)rrrrZNUMERIC_STRINGr%rrrrr{sr{c@seZdZejZdS)ÚASN1F_PRINTABLE_STRINGN)rrrrZPRINTABLE_STRINGr%rrrrr|sr|c@seZdZejZdS)ÚASN1F_T61_STRINGN)rrrrZ
T61_STRINGr%rrrrr}
sr}c@seZdZejZdS)ÚASN1F_VIDEOTEX_STRINGN)rrrrZVIDEOTEX_STRINGr%rrrrr~sr~c@seZdZejZdS)ÚASN1F_IA5_STRINGN)rrrrZ
IA5_STRINGr%rrrrrsrc@seZdZejZdd„ZdS)ÚASN1F_UTC_TIMEcCstƒS)N)r)r*rrrrXszASN1F_UTC_TIME.randvalN)rrrrZUTC_TIMEr%rXrrrrr€sr€c@seZdZejZdd„ZdS)ÚASN1F_GENERALIZED_TIMEcCstƒS)N)r)r*rrrrX szASN1F_GENERALIZED_TIME.randvalN)rrrrZGENERALIZED_TIMEr%rXrrrrrsrc@seZdZejZdS)ÚASN1F_ISO646_STRINGN)rrrrZ
ISO646_STRINGr%rrrrr‚$sr‚c@seZdZejZdS)ÚASN1F_UNIVERSAL_STRINGN)rrrrZUNIVERSAL_STRINGr%rrrrrƒ(srƒc@seZdZejZdS)ÚASN1F_BMP_STRINGN)rrrrZ
BMP_STRINGr%rrrrr„,sr„c@sNeZdZejZdZdd„Zdd„Zdd„Z	dd	„Z
d
d„Zdd
„Zdd„Z
dS)ÚASN1F_SEQUENCEéc	Osjd}dd„|Dƒ}xdD]}t||| |¡ƒqWtj||||j|j|j|jd||_t	|ƒdk|_
dS)NZdummy_seq_namecSsg|]
}|j‘qSr)r#)r`Úfieldrrrú
<listcomp>Asz+ASN1F_SEQUENCE.__init__.<locals>.<listcomp>)r!r'r(r&r†)rSrir r,r!r'r(r&ÚseqrCrZ)r*r‰Úkwargsr"r#Úkwargrrrr,?s

zASN1F_SEQUENCE.__init__cCsd|jj|jfS)Nz<%s%r>)rkrr‰)r*rrrÚ__repr__LszASN1F_SEQUENCE.__repr__cst‡fdd„|jDƒƒS)Nc3s|]}| ˆ¡VqdS)N)rU)r`Úf)r.rrraPsz*ASN1F_SEQUENCE.is_empty.<locals>.<genexpr>)Úallr‰)r*r.r)r.rrUOszASN1F_SEQUENCE.is_emptycCstdd„|jgƒS)NcSs|| ¡S)N)rV)r/ÚyrrrÚ<lambda>Sr<z0ASN1F_SEQUENCE.get_fields_list.<locals>.<lambda>)rr‰)r*rrrrVRszASN1F_SEQUENCE.get_fields_listc	Csèt||j|j|j|jd\}}|dk	rH|jdk	r8||_n|jdk	rH||_|j |j¡}| |¡\}}}t|ƒdkrxl|j	D]}| 
|d¡qzWnPx6|j	D],}y| ||¡}Wq˜tk
rÂPYq˜Xq˜Wt|ƒdkràt
d|d‚g|fS)aÃ
        ASN1F_SEQUENCE behaves transparently, with nested ASN1_objects being
        dissected one by one. Because we use obj.dissect (see loop below)
        instead of obj.m2i (as we trust dissect to do the appropriate set_vals)
        we do not directly retrieve the list of nested objects.
        Thus m2i returns an empty list (along with the proper remainder).
        It is discarded by dissect() and should not be missed elsewhere.
        )r3r'r(r4Nrzunexpected remainder)Ú	remaining)rr%r'r(r&r5r6Úcheck_type_check_lenrCr‰rKrMrr	)r*r.r8r9r:rQÚremainÚobjrrrr;Us,	

zASN1F_SEQUENCE.m2icCs| ||¡\}}|S)N)r;)r*r.r8Ú_r/rrrrMvszASN1F_SEQUENCE.dissectcs"t‡fdd„|jdƒ}| ˆ|¡S)Ncs|| ˆ¡S)N)rJ)r/r)r.rrr{r<z&ASN1F_SEQUENCE.build.<locals>.<lambda>r<)rr‰rB)r*r.r8r)r.rrJzszASN1F_SEQUENCE.buildN)rrrrÚSEQUENCEr%rYr,rŒrUrVr;rMrJrrrrr…0s
!r…c@seZdZejZdS)Ú	ASN1F_SETN)rrrrÚSETr%rrrrr—sr—c@sLeZdZejZdZdZddd„Zdd„Z	dd„Z
d	d
„Zdd„Zd
d„Z
dS)ÚASN1F_SEQUENCE_OFr†NcCs&||_tj||d|||d||_dS)N)r!r'r()rFr r,r#)r*r"r#rFr!r'r(rrrr,ˆs
zASN1F_SEQUENCE_OF.__init__cCst ||¡S)N)r rU)r*r.rrrrUszASN1F_SEQUENCE_OF.is_emptyc	Cs°t||j|j|j|jd\}}|dk	rH|jdk	r8||_n|jdk	rH||_|j |j¡}| |¡\}}}g}x$|rŽ| |j	|¡\}}| 
|¡qlWt|ƒdkr¨td|d‚||fS)N)r3r'r(r4rzunexpected remainder)r‘)
rr%r'r(r&r5r6r’rHrFÚappendrCr	)	r*r.r8r9r:rQr“ÚlstrGrrrr;’s$

zASN1F_SEQUENCE_OF.m2icCsVt||jƒ}t|tƒr(|jtjkr(|}n"|dkr6d}nd dd„|Dƒ¡}| ||¡S)Nr<css|]}t|ƒVqdS)N)r)r`rQrrrra­sz*ASN1F_SEQUENCE_OF.build.<locals>.<genexpr>)	rIr"r$rr>rr?rsrB)r*r.rTr8rrrrJ¦szASN1F_SEQUENCE_OF.buildcCst | ¡¡S)N)rÚfuzzrF)r*rrrrX°szASN1F_SEQUENCE_OF.randvalcCsd|jj|jfS)Nz<%s %s>)rkrr")r*rrrrŒ³szASN1F_SEQUENCE_OF.__repr__)NNN)rrrrr–r%rYrZr,rUr;rJrXrŒrrrrr™ƒs

r™c@seZdZejZdS)ÚASN1F_SET_OFN)rrrrr˜r%rrrrr·src@seZdZejZdS)ÚASN1F_IPADDRESSN)rrrrZ	IPADDRESSr%rrrrrž»sržc@seZdZejZdS)ÚASN1F_TIME_TICKSN)rrrrZ
TIME_TICKSr%rrrrrŸ¿srŸc@sDeZdZdd„Zdd„Zdd„Zdd„Zd	d
„Zdd„Zd
d„Z	dS)ÚASN1F_optionalcCsd|_||_dS)NF)r&Ú_field)r*r‡rrrr,ÈszASN1F_optional.__init__cCst|j|ƒS)N)rIr¡)r*ÚattrrrrÚ__getattr__ÌszASN1F_optional.__getattr__c
Cs2y|j ||¡Stttfk
r,d|fSXdS)N)r¡r;rrr	)r*r.r8rrrr;ÏszASN1F_optional.m2ic
Cs<y|j ||¡Stttfk
r6|j |d¡|SXdS)N)r¡rMrrr	rK)r*r.r8rrrrMÖs
zASN1F_optional.dissectcCs|j |¡rdS|j |¡S)Nr<)r¡rUrJ)r*r.rrrrJÝszASN1F_optional.buildcCs|j ||¡S)N)r¡r2)r*r.r/rrrr2âszASN1F_optional.any2icCs|j ||¡S)N)r¡r0)r*r.r/rrrr0åszASN1F_optional.i2reprN)
rrrr,r£r;rMrJr2r0rrrrr Çsr c@s:eZdZdZdZejZdd„Zdd„Z	dd„Z
d	d
„ZdS)ÚASN1F_CHOICEzÅ
    Multiple types are allowed: ASN1_Packet, ASN1F_field and ASN1F_PACKET(),
    See layers/x509.py for examples.
    Other ASN1F_field instances than ASN1F_PACKET instances must not be used.
    r†c
Osd|krd}t|ƒ‚d|_xdD]}t||| |¡ƒq Wtj||d|j|jd||_d|_	i|_
i|_x¬|D]¤}t|dƒrÂt|j
dƒr²x4t |j
j
¡D]\}}	|	|j
|<qšWn||j
|j
j<qpt|dƒrt|tƒræ||j
|j<n$||j
|j<|j|jf|jt|jƒ<qptdƒ‚qpWdS)Nr'z1ASN1F_CHOICE has been called with an implicit_tag)r!r(Ú	ASN1_rootÚchoicesr%z(ASN1F_CHOICE: no tag found for one field)rr'rSrir r,r!r(r#Zcurrent_choicer¦Ú
pktchoicesrOr¥r^Ú	iteritemsr)r$Útyper%ÚhashrF)
r*r"r#ÚargsrŠr+r‹ÚprgrLrrrr,òs0




zASN1F_CHOICE.__init__cCs¤t|ƒdkrtdƒ‚t||j|jd\}}t|ƒ\}}||jkrV|jrLt}q`tdƒ‚n
|j|}t	|dƒrv| 
||¡St|tƒr”||j
dƒ ||¡S| ||¡SdS)z‡
        First we have to retrieve the appropriate choice.
        Then we extract the field/packet, according to this choice.
        rzASN1F_CHOICE: got empty string)r3r(zASN1F_CHOICE: unexpected fieldr¥r<N)rCrrr%r(r
r¦r&r rOrHr$r©r"r;)r*r.r8r•r>Úchoicerrrr;s




zASN1F_CHOICE.m2icCsZ|dkrd}n>t|ƒ}tt|ƒƒ|jkrL|jtt|ƒƒ\}}t|||d}t||jdS)Nr<)r'r()r()rrªr©r§rr()r*r.r/r8ÚimpÚexprrrrB)szASN1F_CHOICE.i2mcCsxg}xjt |j¡D]Z}t|dƒr4| t |ƒ¡¡qt|dƒrt|tƒr^| |ddƒ 	¡¡q| | 	¡¡qWt
|ŽS)Nr¥r%Údummy)r^Ú
itervaluesr¦rOršrrœr$r©rXr
)r*Zrandchoicesr¬rrrrX4s


zASN1F_CHOICE.randvalN)rrrÚ__doc__rYrr=r%r,r;rBrXrrrrr¤ésr¤c@s2eZdZdZddd„Zdd„Zdd„Zd	d
„ZdS)ÚASN1F_PACKETr†NcCsJ||_tj||d|||d|jjtjkr@|dkr@|dkr@d|_||_dS)N)r!r'r(é0)	rFr r,r¥r%rr–r)r#)r*r"r#rFr!r'r(rrrr,Ds
zASN1F_PACKET.__init__cCsft||jjj|j|j|jd\}}|dk	rL|jdk	r<||_n|jdk	rL||_| |j|¡\}}||fS)N)r3r'r(r4)rrFr¥r%r'r(r&rH)r*r.r8r9r¬rrrr;Ns

zASN1F_PACKET.m2icCs(|dkrd}nt|ƒ}t||j|jdS)Nr<)r'r()rrr'r()r*r.r/r8rrrrB[s
zASN1F_PACKET.i2mcCst | ¡¡S)N)rrœrF)r*rrrrXcszASN1F_PACKET.randval)NNN)rrrrYr,r;rBrXrrrrr³As
	
r³c@s.eZdZdZdZd
dd„Zdd„Zdd	„ZdS)ÚASN1F_BIT_STRING_ENCAPSzš
    We may emulate simple string encapsulation with explicit_tag=0x04,
    but we need a specific class for bit strings because of unused bits, etc.
    r†NcCs&||_tj||d|||d||_dS)N)r!r'r()rFrnr,r#)r*r"r#rFr!r'r(rrrr,ns
z ASN1F_BIT_STRING_ENCAPS.__init__cCsdt |||¡\}}t|jƒddkr0td|d‚| |j|j¡\}}t|ƒdkr\td|d‚||fS)Nrorzwrong bit string)r‘zunexpected remainder)rnr;rCrTr	rHrFZval_readable)r*r.r8Z
bit_stringr“r¬rrrr;vszASN1F_BIT_STRING_ENCAPS.m2icCs6|dkrdnt|ƒ}d dd„|Dƒ¡}t |||¡S)Nr<css&|]}tt|ƒƒ d¡ d¡VqdS)rorpN)rrrqrr)r`r/rrrrasz.ASN1F_BIT_STRING_ENCAPS.i2m.<locals>.<genexpr>)rrsrnrB)r*r.r/r8rrrrBszASN1F_BIT_STRING_ENCAPS.i2m)NNN)rrrr²rYr,r;rBrrrrrµgs
	rµc@s&eZdZddd„Zdd„Zdd„ZdS)	ÚASN1F_FLAGSNc	Cs"||_tj|||d|||ddS)NF)rtr!r'r()Úmappingrnr,)r*r"r#r·r!r'r(rrrr,†s
zASN1F_FLAGS.__init__cs$t|ˆjƒj}‡fdd„t|ƒDƒS)Ncs0g|](\}}|dkr|tˆjƒkrˆj|‘qS)Ú1)rCr·)r`rQÚ
positional)r*rrrˆ‘sz)ASN1F_FLAGS.get_flags.<locals>.<listcomp>)rIr"rTÚ	enumerate)r*r.Zfbytesr)r*rÚ	get_flagsszASN1F_FLAGS.get_flagscCs0|dk	r(d | |¡¡}|dt|ƒSt|ƒS)Nz, ú )rsr»r-)r*r.r/Zpretty_srrrr0”szASN1F_FLAGS.i2repr)NNN)rrrr,r»r0rrrrr¶…s
r¶)Hr²Ú
__future__rZscapy.asn1.asn1rrrrrZscapy.asn1.berrr	r
rZscapy.volatilerr
rrrrZscapy.compatrrZscapy.base_classesrZscapy.utilsrZscapyrÚ	functoolsrZscapy.modules.sixÚmodulesr^Zscapy.modules.six.movesrÚ	ExceptionrÚobjectrr r[r\r]rnrurwrxryrzr{r|r}r~rr€rr‚rƒr„r…r—r™rržrŸr r¤r³rµr¶rrrrÚ<module>	sZ O4"X&