Ë )8}äC+Àã ó—dZ dZdZdZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z gd¢Zde«d<d Zd Zd Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)d Z*d!Z+dZ,dZ-dZ.dZ/dZ0d"Z1d#Z2d$Z3d%Z4d&Z5d'Z6d(Z7d)Z8d*Z9d+Z:d,Z;dZd Z?e%d/e&d0e'd1e(d2e)d3e*d4iZ@ie-d5“e.d6“e/d7“e0d8“e1d9“e2d:“e3d;“e4d<“e5d=“e6d>“e7d?“e8d@“e9dA“e:dB“e;dC“edFe?d4i¥ZAdG„ZBGdH„dIeC«ZDGdJ„dKeC«ZEGdL„dMeC«ZFGdN„dOeC«ZGGdP„dQeC«ZHGdR„dSeC«ZIGdT„dUeI«ZJGdV„dW«ZKGdX„dYeK«ZLGdZ„d[eK«ZMGd\„d]eM«ZNGd^„d_eM«ZOGd`„daeM«ZPGdb„dceM«ZQGdd„deeM«ZRGdf„dg«ZSGdh„di«ZTGdj„dk«ZUGdl„dme j¬«ZWGdn„do«ZXGdp„dqe j¬«ZYGdr„dse j¬«ZZGdt„du«Z[Gdv„dw«Z\e]dxk(ríe^dye«e\«Z_e^dz«d{d|d}d~œZ`e[dd€ejÂd�«d‚dde`«Zbe^dƒ«e_jÇeb«e^d„«e^d…«e^d†ede_jËdd‡«««e^dˆ«e^d‰«e^dŠede_jËdd€«««e^dˆ«e^d‹«e_jÍeb«e^dŒ«e_jÏ«yy)�a Multicast DNS Service Discovery for Python, v0.12 Copyright (C) 2003, Paul Scott-Murphy This module provides a framework for the use of DNS Service Discovery using IP multicast. It has been tested against the JRendezvous implementation from StrangeBerry, and against the mDNSResponder from Mac OS X 10.3.8. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, see . sPaul Scott-Murphys!paul at scott dash murphy dot coms0.12éN)Úpycompat)sZeroconfs ServiceInfosServiceBrowseró _GLOBAL_DONEé}é¯éáéÈiôz 224.0.0.251iéé5ii´i #i€iiéé@é ééééééþéÿiÿééééé é é é é éééé!sinscsschshssnonesanyóasnssmdsmfscnamessoasmbsmgsmrsnullswkssptrshinfosminfosmxstxtsquadassrvcó0—tj«dzS)z#Current system time in millisecondséè)Útime©óú;usr/lib/python3.12/site-packages/hgext/zeroconf/Zeroconf.pyÚcurrentTimeMillisr(Âs€ä �9‰9‹;˜Ñ Ðr&có —eZdZy)ÚNonLocalNameExceptionN©Ú__name__Ú __module__Ú __qualname__r%r&r'r*r*Êó„Ør&r*có —eZdZy)ÚNonUniqueNameExceptionNr+r%r&r'r1r1Îr/r&r1có —eZdZy)ÚNamePartTooLongExceptionNr+r%r&r'r3r3Òr/r&r3có —eZdZy)ÚAbstractMethodExceptionNr+r%r&r'r5r5Ör/r&r5có —eZdZy)ÚBadTypeInNameExceptionNr+r%r&r'r7r7Úr/r&r7có—eZdZd„Zy)Ú BadDomainNamecó6—tj|d|z«y)Nsat position %s)Ú ExceptionÚ__init__)ÚselfÚposs r'r<zBadDomainName.__init__ßs€Ü×ј4Ð!2°SÑ!8Õ9r&N)r,r-r.r<r%r&r'r9r9Þs„ó:r&r9có —eZdZy)ÚBadDomainNameCircularNr+r%r&r'r@r@ãr/r&r@có4—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z y) ÚDNSEntryz A DNS entrycóˆ—|j«|_||_||_|tz|_|t zdk7|_y)Nr)ÚlowerÚkeyÚnameÚtypeÚ _CLASS_MASKÚclazzÚ _CLASS_UNIQUEÚunique©r=rFrGrIs r'r<zDNSEntry.__init__ís:€Ø—:‘:“<ˆŒØˆŒ ؈Œ Øœ[Ñ(ˆŒ Øœ}Ñ,°Ñ2ˆ� r&có—t|t«rO|j|jk(xr4|j|jk(xr|j|jk(Sy)z&Equality test on name, type, and classr)Ú isinstancerBrFrGrI©r=Úothers r'Ú__eq__zDNSEntry.__eq__ôsP€ä �eœXÔ &à— ‘ ˜UŸZ™ZÑ'ò.Ø—I‘I §¡Ñ+ò.à—J‘J %§+¡+Ñ-ð ð r&có&—|j|« S©zNon-equality test©rQrOs r'Ú__ne__zDNSEntry.__ne__þó€à—;‘;˜uÓ%Ð%Ð%r&có>— t|S#t$rd|zcYSwxYw)zClass accessoró?(%s))Ú_CLASSESÚKeyError)r=rIs r'ÚgetClazzzDNSEntry.getClazzs+€ð $ܘE‘?Ð "øÜò $ؘeÑ#Ò #ð $úó ‚ ‹›có>— t|S#t$rd|zcYSwxYw)ú Type accessorrX)Ú_TYPESrZ)r=rGs r'ÚgetTypezDNSEntry.getType s*€ð #ܘ$‘<Ð øÜò #ؘd‘?Ò "ð #úr\cóè—d||j|j«|j|j«fz}|jr|dz }n|dz }||j z }|� |d|zz }|S|dz }|S)ú1String representation with additional informations%s[%s,%ss-unique,ó,s,%s]ó])r`rGr[rIrKrF)r=ÚhdrrPÚresults r'ÚtoStringzDNSEntry.toStrings‰€àØ Ø �L‰L˜Ÿ™Ó #Ø �M‰M˜$Ÿ*™*Ó %ð ñ ˆð �;Š;Ø �kÑ !‰Fà �d‰NˆFØ�$—)‘)ÑˆØ Ð Ø �g ‘oÑ %ˆFðˆ ð �d‰NˆF؈ r&N) r,r-r.Ú__doc__r<rQrUr[r`rgr%r&r'rBrBês#„Ùò3òò&ò$ò#ór&rBcó"—eZdZdZd„Zd„Zd„Zy)Ú DNSQuestionzA DNS question entrycó®—t|t«r|jd«}|jd«s t |«‚t j ||||«y)NÚasciis.local.)rNÚstrÚencodeÚendswithr*rBr<rLs r'r<zDNSQuestion.__init__&sE€Ü �dœCÔ Ø—;‘;˜wÓ'ˆDØ�}‰}˜ZÔ(Ü'¨Ó-Ð -Ü×ј$  d¨EÕ2r&cóÊ—|j|jk(xrI|j|jk(xs|jtk(xr|j|jk(S)z6Returns true if the question is answered by the record)rIrGÚ _TYPE_ANYrF)r=Úrecs r'Ú answeredByzDNSQuestion.answeredBy-sQ€ð �J‰J˜#Ÿ)™)Ñ #ò &Ø—‘˜cŸh™hÑ&Ò@¨$¯)©)´yÑ*@ò &à— ‘ ˜SŸX™XÑ%ð r&có0—tj|dd«S)úString representationsquestionN)rBrg©r=s r'Ú__repr__zDNSQuestion.__repr__5s€ä× Ñ   {°DÓ9Ð9r&N)r,r-r.rhr<rsrwr%r&r'rjrj#s„Ùò3ò ó:r&rjcóR—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zy )Ú DNSRecordz.A DNS record - like a DNS entry, but has a TTLcó`—tj||||«||_t«|_y©N)rBr<Úttlr(Úcreated)r=rFrGrIr|s r'r<zDNSRecord.__init__=s'€Ü×ј$  d¨EÔ2؈ŒÜ(Ó*ˆ� r&cóP—t|t«rtj||«Sy)zTests equality as per DNSRecordr)rNryrBrQrOs r'rQzDNSRecord.__eq__Bs €ä �eœYÔ 'Ü—?‘? 4¨Ó/Ð /Ør&cóL—|jD]}|j|«sŒyy)zdReturns true if any answer in a message can suffice for the information held in this record.rr)ÚanswersÚsuppressedByAnswer)r=ÚmsgÚrecords r'Ú suppressedByzDNSRecord.suppressedByHs(€ð—k”kˆFØ×&Ñ& vÕ.Ùð"ðr&cóH—||k(r|j|jdz kDryy)zwReturns true if another record has same name, type and class, and if its TTL is at least half of this record's.rrr)r|rOs r'r�zDNSRecord.suppressedByAnswerPs$€ð �5Š=˜UŸY™Y¨$¯(©(°Q©,Ò7ØØr&có@—|j||jzdzzS)zXReturns the time at which this record will have expired by a certain percentage.r©r}r|)r=Úpercents r'ÚgetExpirationTimezDNSRecord.getExpirationTimeWs!€ð�|‰|˜w¨¯©Ñ1°BÑ6Ñ7Ð7r&cóD—td|jd«|z dz «S)z%Returns the remaining TTL in seconds.rédr#)Úmaxr‰©r=Únows r'ÚgetRemainingTTLzDNSRecord.getRemainingTTL\s$€ä�1�t×-Ñ-¨cÓ2°SÑ8¸DÑ@ÓAÐAr&có*—|jd«|kS)z(Returns true if this record has expired.r‹©r‰r�s r'Ú isExpiredzDNSRecord.isExpired`s€à×%Ñ% cÓ*¨cÑ1Ð1r&có*—|jd«|kS)z9Returns true if this record is at least half way expired.é2r‘r�s r'ÚisStalezDNSRecord.isStaleds€à×%Ñ% bÓ)¨SÑ0Ð0r&cóH—|j|_|j|_y)zJSets this record's TTL and created time to that of another record.Nr‡rOs r'ÚresetTTLzDNSRecord.resetTTLhs€ð—}‘}ˆŒ Ø—9‘9ˆ�r&có—t‚)zAbstract method)r5©r=Úouts r'ÚwritezDNSRecord.writens€ä%Ð%r&có‚—d|j|jt««|fz}tj |d|«S)rbs%s/%s,%ssrecord)r|r�r(rBrg)r=rPÚargs r'rgzDNSRecord.toStringrsD€àØ �H‰HØ × Ñ Ô!2Ó!4Ó 5Ø ð ñ ˆô × Ñ   y°#Ó6Ð6r&N)r,r-r.rhr<rQr„r�r‰r�r’r•r—r›rgr%r&r'ryry:s=„Ù8ò+ò ò òò8ò Bò2ò1òò &ó7r&rycó(—eZdZdZd„Zd„Zd„Zd„Zy)Ú DNSAddresszA DNS address recordcóD—tj|||||«||_yr{)ryr<Úaddress)r=rFrGrIr|r¡s r'r<zDNSAddress.__init__s€Ü×ј4  t¨U°CÔ8؈� r&cób—|j|jt|j««y©z'Used in constructing an outgoing packetN)Ú writeStringr¡Úlenr™s r'r›zDNSAddress.writeƒs€à �‰˜Ÿ ™ ¤c¨$¯,©,Ó&7Õ8r&cóV—t|t«r|j|jk(Sy)zTests equality on addressr)rNrŸr¡rOs r'rQzDNSAddress.__eq__‡s"€ä �eœZÔ (Ø—<‘< 5§=¡=Ñ0Ð 0Ør&cóx— tj|j«S#t$r|jcYSwxYw©ru)ÚsocketÚ inet_ntoar¡r;rvs r'rwzDNSAddress.__repr__�s5€ð Ü×#Ñ# D§L¡LÓ1Ð 1øÜò Ø—<‘<Ò ð ús ‚!¡9¸9N©r,r-r.rhr<r›rQrwr%r&r'rŸrŸ|s„Ùòò9òó  r&rŸcó(—eZdZdZd„Zd„Zd„Zd„Zy)ÚDNSHinfozA DNS host information recordcóR—tj|||||«||_||_yr{)ryr<ÚcpuÚos)r=rFrGrIr|r¯r°s r'r<zDNSHinfo.__init__˜s&€Ü×ј4  t¨U°CÔ8؈ŒØˆ�r&cóÀ—|j|jt|j««|j|jt|j««yr£)r¤r¯r¥r°r™s r'r›zDNSHinfo.write�s6€à �‰˜Ÿ™¤# d§h¡h£-Ô0Ø �‰˜Ÿ™¤ T§W¡W£Õ.r&cóŒ—t|t«r4|j|jk(xr|j|jk(Sy)zTests equality on cpu and osr)rNr­r¯r°rOs r'rQzDNSHinfo.__eq__¢s4€ä �eœXÔ &Ø—8‘8˜uŸy™yÑ(Ò@¨T¯W©W¸¿¹Ñ-@Ð @Ør&có:—|jdz|jzS)ruó )r¯r°rvs r'rwzDNSHinfo.__repr__¨s€à�x‰x˜$‰ §¡Ñ(Ð(r&Nr«r%r&r'r­r­•s„Ù'òò /ò ó )r&r­có(—eZdZdZd„Zd„Zd„Zd„Zy)Ú DNSPointerzA DNS pointer recordcóD—tj|||||«||_yr{)ryr<Úalias)r=rFrGrIr|r¸s r'r<zDNSPointer.__init__°s€Ü×ј4  t¨U°CÔ8؈� r&có:—|j|j«yr£)Ú writeNamer¸r™s r'r›zDNSPointer.write´s€à � ‰ �d—j‘jÕ!r&cóV—t|t«r|j|jk(Sy)zTests equality on aliasr)rNr¶r¸rOs r'rQzDNSPointer.__eq__¸s"€ä �eœZÔ (Ø—:‘: §¡Ñ,Ð ,Ør&có8—|j|j«Sr¨)rgr¸rvs r'rwzDNSPointer.__repr__¾s€à�}‰}˜TŸZ™ZÓ(Ð(r&Nr«r%r&r'r¶r¶­s„Ùòò"òó )r&r¶có(—eZdZdZd„Zd„Zd„Zd„Zy)ÚDNSTextzA DNS text recordcóD—tj|||||«||_yr{)ryr<Útext)r=rFrGrIr|rÀs r'r<zDNSText.__init__Æs€Ü×ј4  t¨U°CÔ8؈� r&cób—|j|jt|j««yr£)r¤rÀr¥r™s r'r›z DNSText.writeÊs€à �‰˜Ÿ ™ ¤3 t§y¡y£>Õ2r&cóV—t|t«r|j|jk(Sy)zTests equality on textr)rNr¾rÀrOs r'rQzDNSText.__eq__Îs"€ä �eœWÔ %Ø—9‘9 § ¡ Ñ*Ð *Ør&cóª—t|j«dkDr!|j|jdddz«S|j|j«S)rurNró...)r¥rÀrgrvs r'rwzDNSText.__repr__ÔsC€ä ˆt�y‰y‹>˜BÒ Ø—=‘= §¡¨2¨A °Ñ!7Ó8Ð 8à—=‘= §¡Ó+Ð +r&Nr«r%r&r'r¾r¾Ãs„Ùòò3òó ,r&r¾có(—eZdZdZd„Zd„Zd„Zd„Zy)Ú DNSServicezA DNS service recordc ón—tj|||||«||_||_||_||_yr{)ryr<ÚpriorityÚweightÚportÚserver) r=rFrGrIr|rÈrÉrÊrËs r'r<zDNSService.__init__ßs4€Ü×ј4  t¨U°CÔ8Ø ˆŒ ؈Œ ؈Œ ؈� r&cóÜ—|j|j«|j|j«|j|j«|j |j «yr£)Ú writeShortrÈrÉrÊrºrËr™s r'r›zDNSService.writeæsB€à �‰�t—}‘}Ô%Ø �‰�t—{‘{Ô#Ø �‰�t—y‘yÔ!Ø � ‰ �d—k‘kÕ"r&cóø—t|t«rj|j|jk(xrO|j|jk(xr4|j|jk(xr|j |j k(Sy)z3Tests equality on priority, weight, port and serverr)rNrÆrÈrÉrÊrËrOs r'rQzDNSService.__eq__ísg€ä �eœZÔ (à— ‘  §¡Ñ/ò0Ø—K‘K 5§<¡<Ñ/ò0à—I‘I §¡Ñ+ò0ð—K‘K 5§<¡<Ñ/ð  ð r&cóV—|jd|j|jfz«S)rus%s:%s)rgrËrÊrvs r'rwzDNSService.__repr__øs#€à�}‰}˜X¨¯©°d·i±iÐ(@Ñ@ÓAÐAr&Nr«r%r&r'rÆrÆÜs„Ùòò#ò óBr&rÆcóX—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zy)Ú DNSIncomingz/Object representation of an incoming DNS packetcóÔ—d|_||_g|_g|_d|_d|_d|_d|_|j«|j«|j«y)z/Constructor from string holding bytes of packetrN) ÚoffsetÚdataÚ questionsr€Ú numquestionsÚ numanswersÚnumauthoritiesÚnumadditionalsÚ readHeaderÚ readQuestionsÚ readOthers)r=rÔs r'r<zDNSIncoming.__init__s]€àˆŒ ؈Œ ؈ŒØˆŒ ØˆÔØˆŒØˆÔ؈Ôà �‰ÔØ ×ÑÔØ �‰Õr&cóH—d}tj|«}tj||j|j|j|z«}|xj|z c_|d|_|d|_|d|_|d|_|d|_ |d|_ y) zReads header portion of packets!HHHHHHrrrrrrN) ÚstructÚcalcsizeÚunpackrÔrÓÚidÚflagsrÖr×rØrÙ©r=ÚformatÚlengthÚinfos r'rÚzDNSIncoming.readHeaders•€àˆÜ—‘ Ó(ˆÜ�}‰}Ø �D—I‘I˜dŸk™k¨D¯K©K¸&Ñ,@ÐAó ˆð � Š �vÑ� à�q‘'ˆŒØ˜!‘WˆŒ Ø  ™GˆÔؘq™'ˆŒØ" 1™gˆÔØ" 1™gˆÕr&có¢—d}tj|«}td|j«D]�}|j «}tj ||j |j|j|z«}|xj|z c_ t||d|d«}|jj|«Œ’y#t$rYŒŸwxYw)z!Reads questions section of packets!HHrrN) rÞrßÚrangerÖÚreadNameràrÔrÓrjrÕÚappendr*)r=räråÚirFræÚquestions r'rÛzDNSIncoming.readQuestionss³€àˆÜ—‘ Ó(ˆÜ�q˜$×+Ñ+Ö,ˆAØ—=‘=“?ˆDÜ—=‘=ؘŸ ™  $§+¡+°· ± ¸fÑ0DÐEóˆDð �KŠK˜6Ñ !�Kð Ü& t¨T°!©W°d¸1±gÓ>�Ø—‘×%Ñ% hÕ/ñ-øô)ò Ùð úsÂ.Cà Cà CcóØ—d}tj|«}tj||j|j|j|z«}|xj|z c_|dS)z Reads an integer from the packetó!Ir©rÞrßràrÔrÓrãs r'ÚreadIntzDNSIncoming.readInt0óY€àˆÜ—‘ Ó(ˆÜ�}‰}Ø �D—I‘I˜dŸk™k¨D¯K©K¸&Ñ,@ÐAó ˆð � Š �vÑ� Ø�A‰wˆr&có’—t|j|j«}|xjdz c_|j|«S)z(Reads a character string from the packetr)ÚordrÔrÓÚ readString)r=rås r'ÚreadCharacterStringzDNSIncoming.readCharacterString:s6€ä�T—Y‘Y˜tŸ{™{Ñ+Ó,ˆØ � Š �qÑ� Ø�‰˜vÓ&Ð&r&cóÞ—d|z}tj|«}tj||j|j|j|z«}|xj|z c_|dS)z0Reads a string of a given length from the packets!%dsrrï)r=r¥räråræs r'rôzDNSIncoming.readString@s]€à˜3‘ˆÜ—‘ Ó(ˆÜ�}‰}Ø �D—I‘I˜dŸk™k¨D¯K©K¸&Ñ,@ÐAó ˆð � Š �vÑ� Ø�A‰wˆr&cóØ—d}tj|«}tj||j|j|j|z«}|xj|z c_|dS)z'Reads an unsigned short from the packetó!Hrrïrãs r'ÚreadUnsignedShortzDNSIncoming.readUnsignedShortJrñr&c óØ—d}tj|«}|j|jz|jz}t d|«D�]}|j «}tj||j|j|j|z«}|xj|z c_ d}|dtk(r)t||d|d|d|jd««}�ne|dtk(s |dtk(r(t||d|d|d|j ««}�n%|dt k(r+t#||d|d|d|j|d««}nî|dt$k(rTt'||d|d|d|j)«|j)«|j)«|j ««}nŽ|dt*k(r6t-||d|d|d|j/«|j/««}nL|dt0k(r(t||d|d|d|jd««}n|xj|dz c_ |€�Œ|j2j5|«�Œ y) z@Reads answers, authorities and additionals section of the packets!HHiHrNrrrrr )rÞrßr×rØrÙrèréràrÔrÓÚ_TYPE_ArŸrôÚ _TYPE_CNAMEÚ _TYPE_PTRr¶Ú _TYPE_TXTr¾Ú _TYPE_SRVrÆrùÚ _TYPE_HINFOr­rõÚ _TYPE_AAAAr€rê)r=räråÚnrëÚdomainrærrs r'rÜzDNSIncoming.readOthersTsJ€àˆÜ—‘ Ó(ˆØ �O‰O˜d×1Ñ1Ñ 1°D×4GÑ4GÑ GˆÜ�q˜!—ˆAØ—]‘]“_ˆFÜ—=‘=ؘŸ ™  $§+¡+°· ± ¸fÑ0DÐEóˆDð �KŠK˜6Ñ !�KàˆCØ�A‰wœ'Ò!Ü Ø˜D ™G T¨!¡W¨d°1©g°t·±ÀqÓ7Ió’ð�a‘œKÒ'¨4°©7´iÒ+?Ü Ø˜D ™G T¨!¡W¨d°1©g°t·}±}³ó’ð�a‘œIÒ%ÜØ˜D ™G T¨!¡W¨d°1©g°t·±ÀtÈAÁwÓ7Oó‘ð�a‘œIÒ%Ü ØØ˜‘Gؘ‘Gؘ‘GØ×*Ñ*Ó,Ø×*Ñ*Ó,Ø×*Ñ*Ó,Ø—M‘M“Oó ‘ð�a‘œKÒ'ÜØØ˜‘Gؘ‘Gؘ‘GØ×,Ñ,Ó.Ø×,Ñ,Ó.ó ‘ð�a‘œJÒ&Ü Ø˜D ™G T¨!¡W¨d°1©g°t·±ÀrÓ7Jó‘ð— ’ ˜t A™wÑ&• àŠØ— ‘ ×#Ñ# CÖ(ñqr&có6—|jtztk(S)zReturns true if this is a query)râÚ_FLAGS_QR_MASKÚ_FLAGS_QR_QUERYrvs r'ÚisQueryzDNSIncoming.isQuery“s€à— ‘ œ^Ñ+´Ñ?Ð?r&có6—|jtztk(S)z"Returns true if this is a response)rârÚ_FLAGS_QR_RESPONSErvs r'Ú isResponsezDNSIncoming.isResponse—s€à— ‘ œ^Ñ+Ô0BÑBÐBr&cóD—|j|||zjd«S)z6Reads a UTF-8 string of a given length from the packetúutf-8)rÔÚdecode)r=rÓr¥s r'ÚreadUTFzDNSIncoming.readUTF›s"€à�y‰y˜ &¨3¡,Ð/×6Ñ6°wÓ?Ð?r&có²—d}|j}d}|} t|j||dz«}|dz }|dk(rnˆ|dz}|dk(r,dj||j ||«dzf«}||z }nQ|dk(rA|dkr|dz}|dzdzt|j||dz«z}||k\r t |«‚|}n t |«‚Œ®|dk\r ||_|S||_|S) z#Reads a domain name from the packetÚéÿÿÿÿrréÀÚ.é?r)rÓrórÔÚjoinrr@r9)r=rfÚoffÚnextÚfirstr¥Úts r'rézDNSIncoming.readNameŸs€àˆØ�k‰kˆØˆØˆàÜ�d—i‘i  c¨A¡gÐ.Ó/ˆCØ �1‰HˆCØ�aŠxØØ�d‘ ˆAØ�DŠyØŸ™ &¨$¯,©,°s¸CÓ*@À3Ñ*FÐ!GÓH�Ø�s‘ ‘Ø�d’ؘ!’8Ø ™7�Dؘd™  qÑ(¬C°· ± ¸#ÀÀaÁÐ0HÓ,IÑI�ؘ%’<Ü/°Ó4Ð4Ø‘ä# CÓ(Ð(ð#ð& �1Š9؈DŒKðˆ ðˆDŒKàˆ r&N)r,r-r.rhr<rÚrÛrðrõrôrùrÜrr rrér%r&r'rÑrÑýsE„Ù9ò ò&ò ò"ò'ò òò=)ò~@òCò@ór&rÑcór—eZdZdZdd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„Zd„Zd„Zy)Ú DNSOutgoingz+Object representation of an outgoing packetcóž—d|_d|_||_||_i|_g|_d|_g|_g|_g|_ g|_ y)Nrr) ÚfinishedráÚ multicastrâÚnamesrÔÚsizerÕr€Ú authoritiesÚ additionals)r=rârs r'r<zDNSOutgoing.__init__ÄsQ€ØˆŒ ؈ŒØ"ˆŒØˆŒ ؈Œ ؈Œ ؈Œ àˆŒØˆŒ ØˆÔØˆÕr&có:—|jj|«y)zAdds a questionN)rÕrê©r=rƒs r'Ú addQuestionzDNSOutgoing.addQuestionÒs€à �‰×јfÕ%r&cóL—|j|«s|j|d«yy)zAdds an answerrN)r„ÚaddAnswerAtTime)r=Úinprƒs r'Ú addAnswerzDNSOutgoing.addAnswerÖs%€à×"Ñ" 3Ô'Ø × Ñ  ¨Õ +ð(r&cór—|�5|dk(s|j|«s|jj||f«yyy)z6Adds an answer if if does not expire by a certain timeNr)r’r€rê)r=rƒrŽs r'r'zDNSOutgoing.addAnswerAtTimeÛs<€à Ð Ø�aŠx˜v×/Ñ/°Ô4Ø— ‘ ×#Ñ# V¨S MÕ2ð 5ð r&có:—|jj|«y)zAdds an authoritative answerN)r!rêr$s r'ÚaddAuthoritativeAnswerz"DNSOutgoing.addAuthoritativeAnsweráó€à ×Ñ×Ñ Õ'r&có:—|jj|«y)zAdds an additional answerN)r"rêr$s r'ÚaddAdditionalAnswerzDNSOutgoing.addAdditionalAnswerår-r&có¢—d}|jjtj|t |«««|xj dz c_y)z"Writes a single byte to the packetó!crN)rÔrêrÞÚpackÚchrr ©r=Úvalueräs r'Ú writeBytezDNSOutgoing.writeByteéó5€àˆØ � ‰ ×ÑœŸ™ V¬S°«ZÓ8Ô9Ø � Š �Q‰Ž r&có’—d}|jj|tj||««|xjdz c_y)z=Inserts an unsigned short in a certain position in the packetrørN)rÔÚinsertrÞr2r )r=Úindexr5räs r'Ú insertShortzDNSOutgoing.insertShortïs3€àˆØ � ‰ ×ј¤§ ¡ ¨F°EÓ :Ô;Ø � Š �Q‰Ž r&có�—d}|jjtj||««|xjdz c_y)z&Writes an unsigned short to the packetrørN)rÔrêrÞr2r r4s r'rÍzDNSOutgoing.writeShortõs1€àˆØ � ‰ ×ÑœŸ™ V¨UÓ3Ô4Ø � Š �Q‰Ž r&có¢—d}|jjtj|t |«««|xj dz c_y)z(Writes an unsigned integer to the packetrîrN)rÔrêrÞr2Úintr r4s r'ÚwriteIntzDNSOutgoing.writeIntûr7r&có®—dt|«zdz}|jjtj||««|xj |z c_y)zWrites a string to the packetÚ!ÚsN)rmrÔrêrÞr2r )r=r5råräs r'r¤zDNSOutgoing.writeStrings@€à”s˜6“{Ñ" SÑ(ˆØ � ‰ ×ÑœŸ™ V¨UÓ3Ô4Ø � Š �VÑŽ r&có˜—|jd«}t|«}|dkDrt‚|j|«|j ||«y)z5Writes a UTF-8 string of a given length to the packetr r N)rnr¥r3r6r¤)r=rBÚutfstrrås r'ÚwriteUTFzDNSOutgoing.writeUTFsB€à—‘˜'Ó"ˆÜ�V“ˆØ �BŠ;Ü*Ð *Ø �‰�vÔØ ×ј Õ(r&cóR— |j|}|j |dz dz«|j |«y#t$rc|j|j|<|jd«}|ddk(r|dd}|D]}|j |«Œ|j d«YywxYw)z"Writes a domain name to the packetó.rr&Nrrr)rrZr ÚsplitrEr6)r=rFr:ÚpartsÚparts r'rºzDNSOutgoing.writeNames©€ð ð—J‘J˜tÑ$ˆEð" �‰˜ ™  dÑ*Ô+Ø �‰�uÕøô#ò ð $Ÿy™yˆD�J‰J�tÑ Ø—J‘J˜tÓ$ˆEØ�R‰y˜CÒØ˜c˜r˜ �Û�Ø— ‘ ˜dÕ#ðà �N‰N˜1Ô Ù ð ús‚:ºA)B&Â%B&có¦—|j|j«|j|j«|j|j«y)zWrites a question to the packetN)rºrFrÍrGrI)r=rìs r'Ú writeQuestionzDNSOutgoing.writeQuestion*s2€à �‰�x—}‘}Ô%Ø �‰˜Ÿ ™ Ô&Ø �‰˜Ÿ™Õ'r&có°—|j|j«|j|j«|jr/|j r#|j|j tz«n|j|j «|dk(r|j|j«n |j|j|««t|j«}|xjdz c_ |j|«|xjdzc_ tdj|j|d««}|j!||«y)zPWrites a record (answer, authoritative answer, additional) to the packetrrr&N)rºrFrÍrGrKrrIrJr?r|r�r¥rÔr r›rr;)r=rƒrŽr:rås r'Ú writeRecordzDNSOutgoing.writeRecord0sç€ð �‰�v—{‘{Ô#Ø �‰˜Ÿ ™ Ô$Ø �=Š=˜TŸ^š^Ø �O‰O˜FŸL™L¬=Ñ8Õ 9à �O‰O˜FŸL™LÔ )Ø �!Š8Ø �M‰M˜&Ÿ*™*Õ %à �M‰M˜&×0Ñ0°Ó5Ô 6Ü�D—I‘I“ˆð � Š �Q‰� Ø� ‰ �TÔØ � Š �Q‰� ä�S—X‘X˜dŸi™i¨¨Ð/Ó0Ó1ˆØ ×ј Õ'r&cóR—|j�s€d|_|jD]}|j|«Œ|jD]\}}|j ||«Œ|j D]}|j |d«Œ|j D]}|j |d«Œ|jdt|j ««|jdt|j ««|jdt|j««|jdt|j««|jd|j«|jr|jdd«n|jd|j«dj|j«S)z�Returns a string containing the packet's bytes No further parts should be added to the packet once this is done.rrr&)rrÕrLr€rNr!r"r;r¥rârrárrÔ)r=rìÚanswerÚtime_Ú authorityÚ additionals r'ÚpacketzDNSOutgoing.packetGsL€ð �}‹}؈DŒMØ ŸNœN�Ø×"Ñ" 8Õ,ð+à!%§¤‘ �˜Ø× Ñ  ¨Õ/ð".à!×-Ô-� Ø× Ñ  ¨AÕ.ð.à"×.Ô.� Ø× Ñ  ¨QÕ/ð/ð × Ñ ˜Q¤ D×$4Ñ$4Ó 5Ô 6Ø × Ñ ˜Q¤ D×$4Ñ$4Ó 5Ô 6Ø × Ñ ˜Q¤ D§L¡LÓ 1Ô 2Ø × Ñ ˜Q¤ D§N¡NÓ 3Ô 4Ø × Ñ ˜Q § ¡ Ô +Ø�~Š~Ø× Ñ   AÕ&à× Ñ   D§G¡GÔ,Ø�x‰x˜Ÿ ™ Ó"Ð"r&N)r)r,r-r.rhr<r%r)r'r,r/r6r;rÍr?r¤rErºrLrNrTr%r&r'rrÁsU„Ù5ó ò&ò,ò 3ò (ò(òò ò ò ò ò )òò4(ò (ó.#r&rcó:—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z d„Z y ) ÚDNSCachezA cache of DNS entriescó—i|_yr{)Úcachervs r'r<zDNSCache.__init__fs €Øˆ� r&có®— |j|j}|j|«y#t$rgx}|j|j<YŒ8wxYw)z Adds an entryN)rXrErZrê©r=ÚentryÚlists r'Úaddz DNSCache.addisO€ð .Ø—:‘:˜eŸi™iÑ(ˆDð � ‰ �EÕøôò .Ø+-Ð -ˆD�4—:‘:˜eŸi™iÓ(ð .ús‚-­$AÁAcóx— |j|j}|j|«y#t$rYywxYw)zRemoves an entryN)rXrEÚremoverZrZs r'r_zDNSCache.removeqs7€ð Ø—:‘:˜eŸi™iÑ(ˆDØ �K‰K˜Õ øÜò Ù ð ús ‚*-­ 9¸9cóˆ— |j|j}||j|«S#ttf$rYywxYw)zNGets an entry by key. Will return None if there is no matching entry.N)rXrEr:rZÚ ValueErrorrZs r'Úgetz DNSCache.getysD€ð Ø—:‘:˜eŸi™iÑ(ˆDؘŸ ™  5Ó)Ñ*Ð *øÜœ*Ð%ò Ùð ús‚,/¯AÁAcó>—t|||«}|j|«S)zRGets an entry by details. Will return None if there is no matching entry.)rBrb)r=rFrGrIr[s r'Ú getByDetailszDNSCache.getByDetails‚s €ô˜˜t UÓ+ˆØ�x‰x˜‹Ðr&cóD— |j|S#t$rgcYSwxYw)z5Returns a list of entries whose key matches the name.)rXrZ)r=rFs r'ÚentriesWithNamezDNSCache.entriesWithNameˆs*€ð Ø—:‘:˜dÑ#Ð #øÜò ØŠIð ús ‚‘ žcó¦— ttjj|jj «««S#t $rgcYSwxYw)zReturns a list of all entries)r\Ú itertoolsÚchainÚ from_iterablerXÚvaluesr;rvs r'ÚentrieszDNSCache.entries�sB€ð Üœ Ÿ™×5Ñ5°d·j±j×6GÑ6GÓ6IÓJÓKÐ KøÜò ØŠIð ús‚?AÁ AÁAN) r,r-r.rhr<r]r_rbrdrfrlr%r&r'rVrVcs(„Ù òòòòòò ór&rVcó4—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z y) ÚEngineacAn engine wraps read access to sockets, allowing objects that need to receive data from sockets to be called back when the sockets are ready. A reader needs a handle_read() method, which is called when the socket it is interested in is ready for reading. Writers are not implemented here, because we only send short packets. có¾—tjj|«||_i|_d|_tj «|_|j«y)Nr) Ú threadingÚThreadr<ÚzeroconfÚreadersÚtimeoutÚ ConditionÚ conditionÚstart©r=rrs r'r<zEngine.__init__£sD€Ü×Ñ×!Ñ! $Ô'Ø ˆŒ ؈Œ ؈Œ Ü"×,Ñ,Ó.ˆŒØ � ‰ � r&cóD—t«dsÔ|j«}t|«dk(rZ|jj «|jj |j «|jj«nM tj|gg|j «\}}}|D] } |j|j«Œ" t«dsŒÓyy#t$r$t«dstj«YŒ`wxYw#t$rYŒKwxYw)Nrr)ÚglobalsÚ getReadersr¥rvÚacquireÚwaitrtÚreleaseÚselectrsÚ handle_readr;Ú tracebackÚ print_exc)r=ÚrsÚrrÚwrÚerÚsocks r'Úrunz Engine.run«sé€Ü“)˜OÒ,Ø—‘Ó"ˆBÜ�2‹w˜!Š|ð—‘×&Ñ&Ô(Ø—‘×#Ñ# D§L¡LÔ1Ø—‘×&Ñ&Õ(ð Ü!'§¡¨r°2°r¸4¿<¹<Ó!H‘J�B˜˜BÛ "˜ð6Ø ŸL™L¨Ñ.×:Ñ:Õ<ñ!#ô“)˜OÕ,øô )ò6Ü#*£9¨_Ò#=Ü )× 3Ñ 3Ô 5ùð6ûô!òÙðús6Â+DÂ3C#ÃDÃ#*DÄ DÄDÄDÄ DÄDcó¢—|jj«|jj«}|jj «|Sr{)rvr|rsÚkeysr~©r=rfs r'r{zEngine.getReadersÁs9€Ø �‰×ÑÔ Ø—‘×"Ñ"Ó$ˆØ �‰×ÑÔ Øˆ r&có¾—|jj«||j|<|jj«|jj «yr{©rvr|rsÚnotifyr~)r=Úreaderr©s r'Ú addReaderzEngine.addReaderÇs@€Ø �‰×ÑÔ Ø%ˆ� ‰ �VÑØ �‰×ÑÔØ �‰×ÑÕ r&cóº—|jj«|j|=|jj«|jj «yr{r�)r=r©s r'Ú delReaderzEngine.delReaderÍs>€Ø �‰×ÑÔ Ø �L‰L˜Ð Ø �‰×ÑÔØ �‰×ÑÕ r&có —|jj«|jj«|jj«yr{)rvr|rŽr~rvs r'rŽz Engine.notifyÓs2€Ø �‰×ÑÔ Ø �‰×ÑÔØ �‰×ÑÕ r&N) r,r-r.rhr<rˆr{r�r’rŽr%r&r'rnrn—s%„ñ òòò,ò !ò !ó !r&rncó—eZdZdZd„Zd„Zy)ÚListenera4A Listener is used by this module to listen on the multicast group to which DNS messages are sent, allowing the implementation to cache information as it arrives. It requires registration with an Engine object in order to have the read() method called when a socket is available for reading.có†—||_|jjj||jj«yr{)rrÚenginer�r©rxs r'r<zListener.__init__ás-€Ø ˆŒ Ø � ‰ ×Ñ×&Ñ& t¨T¯]©]×-AÑ-AÕBr&cóV—|jj} |jt«\}\}}||_t|«}|j«r||tk(r&|jj|tt«y|tk(rC|jj|||«|jj|tt«yy|jj|«y#tj$r(}|j t j k(rYd}~y‚d}~wwxYwr{)rrr©ÚrecvfromÚ_MAX_MSG_ABSOLUTEÚerrorÚerrnoÚEBADFrÔrÑrÚ _MDNS_PORTÚ handleQueryÚ _MDNS_ADDRÚ _DNS_PORTÚhandleResponse)r=r‡rÔÚaddrrÊÚer‚s r'r€zListener.handle_readås倨�}‰}×#Ñ#ˆð Ø!%§¡Ô/@Ó!AÑ ˆD‘,�4˜ðˆŒ ܘ$ÓˆØ �;‰;Œ=ð”zÒ!Ø— ‘ ×)Ñ)¨#¬z¼:ÕFðœÒ"Ø— ‘ ×)Ñ)¨#¨t°TÔ:Ø— ‘ ×)Ñ)¨#¬z¼:ÕFð#ð �M‰M× (Ñ (¨Õ -øô)�|‰|ò Ø�w‰wœ%Ÿ+™+Ò%äàûð  ús˜C-Ã-D(ÄD#Ä"D#Ä#D(N)r,r-r.rhr<r€r%r&r'r•r•Ùs„ñHòCó.r&r•có—eZdZdZd„Zd„Zy)ÚReaperzNA Reaper is used by this module to remove cache entries that have expired.cóp—tjj|«||_|j «yr{)rprqr<rrrwrxs r'r<zReaper.__init__s&€Ü×Ñ×!Ñ! $Ô'Ø ˆŒ Ø � ‰ � r&cód— |jjd«t«dryt«}|jjj «D]U}|j |«sŒ|jj||«|jjj|«ŒWŒ°)Ni'r) rrr}rzr(rXrlr’Ú updateRecordr_)r=rŽrƒs r'rˆz Reaper.run sˆ€ØØ �M‰M× Ñ ˜yÔ )Ü‹y˜Ò)ØÜ#Ó%ˆCØŸ-™-×-Ñ-×5Ñ5Ö7�Ø×#Ñ# CÕ(Ø—M‘M×.Ñ.¨s°FÔ;Ø—M‘M×'Ñ'×.Ñ.¨vÕ6ð8ð r&N)r,r-r.rhr<rˆr%r&r'r¦r¦s„ñòó 7r&r¦có(—eZdZdZd„Zd„Zd„Zd„Zy)ÚServiceBrowserzÑUsed to browse for a service of a specific type. The listener object will have its addService() and removeService() methods called when this browser discovers changes in the services availability.có\—tjj|«||_||_||_i|_t«|_t|_ g|_ d|_ |jj|t|jtt ««|j#«y)z%Creates a browser for a specific typerN)rprqr<rrrGÚlistenerÚservicesr(ÚnexttimeÚ _BROWSER_TIMEÚdelayr\ÚdoneÚ addListenerrjrýÚ _CLASS_INrw)r=rrrGr­s r'r<zServiceBrowser.__init__s€€ä×Ñ×!Ñ! $Ô'Ø ˆŒ ؈Œ Ø ˆŒ ؈Œ Ü)Ó+ˆŒ Ü"ˆŒ ؈Œ àˆŒ à � ‰ ×!Ñ!Ø ”+˜dŸi™i¬´IÓ>ô ð � ‰ � r&có�‡‡—‰jtk(r؉j‰jk(r¾‰j|«} ‰j‰j j «}|s|j‰«nG‰j‰j j «=ˆˆfd„}‰jj|«y ‰jd«}|‰jkr|‰_ yyyy#t$rM|sH‰‰j‰j j «<ˆˆfd„}‰jj|«YŒ€wxYw)z‚Callback invoked by Zeroconf when new information arrives. Updates information required by browser in the Zeroconf cache.cóf•—‰jj|‰j‰j«Sr{)r­Ú removeServicerGr¸©Úxrƒr=s €€r'Úz-ServiceBrowser.updateRecord..:s#ø€¨¯©×)DÑ)Dؘ4Ÿ9™9 f§l¡lô*r&Ncóf•—‰jj|‰j‰j«Sr{)r­Ú addServicerGr¸r¸s €€r'rºz-ServiceBrowser.updateRecord..Bs#ø€¨¯©×)AÑ)Aؘ4Ÿ9™9 f§l¡lô*r&éK) rGrýrFr’r®r¸rDr—r\rêr;r‰r¯)r=rrrŽrƒÚexpiredÚ oldrecordÚcallbackÚexpiress` ` r'r©zServiceBrowser.updateRecord.sù€ð �;‰;œ)Ò #¨¯ © °t·y±yÒ(@Ø×&Ñ& sÓ+ˆGð /Ø ŸM™M¨&¯,©,×*<Ñ*<Ó*>Ñ?� ÙØ×&Ñ& vÕ.àŸ ™  f§l¡l×&8Ñ&8Ó&:Ð;ô �Hð—I‘I×$Ñ$ XÔ.Øð/ð ×.Ñ.¨rÓ2ˆGؘŸ™Ò&Ø '�• ð'ð-)AÐ #øôò /ÙØ:@�D—M‘M &§,¡,×"4Ñ"4Ó"6Ñ7ô �Hð—I‘I×$Ñ$ XÔ.ùð  /úsÁBC/Ã/AEÅEcóF—d|_|jj«y)Nr)r²rrÚ notifyAllrvs r'ÚcancelzServiceBrowser.cancelKs€ØˆŒ Ø � ‰ ×ÑÕ!r&cóL— d}t«}t|j«dk(r7|j|kDr(|jj |j|z «t «ds |jryt«}|j|krÍtt«}|jt|jtt««|jj!«D]&}|j#|«rŒ|j%||«Œ(|jj'|«||j(z|_t+d|j(dz«|_t|j«dkDr|jj-d«}|�||j«�Œ¤)Nrri Nr)r(r¥r\r¯rrr}rzr²rrr%rjrGrýr´r®rkr’r'Úsendr±ÚminÚpop)r=ÚeventrŽršrƒs r'rˆzServiceBrowser.runOs:€ØØˆEÜ#Ó%ˆCÜ�4—9‘9‹~ Ò" t§}¡}°sÒ':Ø— ‘ ×"Ñ" 4§=¡=°3Ñ#6Ô7Ü‹y˜Ò)¨T¯YªYØÜ#Ó%ˆCà�}‰} Ò#Ü!¤/Ó2�Ø—‘¤ ¨D¯I©I´yÄ)Ó LÔMØ"Ÿm™m×2Ñ2Ö4�FØ!×+Ñ+¨CÕ0Ø×+Ñ+¨F°CÕ8ð5ð— ‘ ×"Ñ" 3Ô'Ø # d§j¡jÑ 0�” Ü  ¨D¯J©J¸©NÓ;�” ä�4—9‘9‹~ Ò!ØŸ ™ Ÿ ™  aÓ(�àÐ Ù�d—m‘mÔ$ñ/r&N)r,r-r.rhr<r©rÄrˆr%r&r'r«r«s„ñ7ò ò$(ò:"ó%r&r«có„—eZdZdZ dd„Zd„Zd„Zd„Zd„Zd„Z d „Z d „Z d „Z d „Z d „Zd„Zd„Zd„Zd„Zd„Zd„Zy)Ú ServiceInfozService informationNc óÊ—|j|«st‚||_||_||_||_||_||_|r||_n||_|j|«y)aôCreate a service description. type: fully qualified service type name name: fully qualified service name address: IP address as unsigned short, network byte order port: port that the service runs on weight: weight of the service priority: priority of the service properties: dictionary of properties (or a string holding the bytes for the text field) server: fully qualified name for service host (defaults to name)N) ror7rGrFr¡rÊrÉrÈrËÚ setProperties) r=rGrFr¡rÊrÉrÈÚ propertiesrËs r'r<zServiceInfo.__init__ms_€ð.�}‰}˜TÔ"Ü(Ð (؈Œ ؈Œ ؈Œ ؈Œ ؈Œ Ø ˆŒ Ù Ø ˆD�KàˆDŒKØ ×ј:Õ&r&c ó®—t|t«r¾||_g}d}|D][}||}|€d}n-t|t«r|}nt|t«r|rd}nd}nd}|j dj ||f««Œ]|D]F}dj |tjdtjt|«««|f«}ŒH||_ y||_ y)z7Sets properties and text of this info from a dictionaryr&Nótrueófalseó=r1) rNÚdictrÎrmr>rêrrÞr2rÚbytechrr¥rÀ)r=rÎr\rfrEr5ÚsuffixÚitems r'rÍzServiceInfo.setProperties’sЀä �j¤$Ô 'Ø(ˆDŒO؈D؈FÛ!�Ø" 3™�Ø�=Ø ‘FÜ ¤sÔ+Ø"‘FÜ ¤sÔ+ÙØ!(™à!)™à �FØ— ‘ ˜DŸI™I s¨F mÓ4Õ5ð"ó�ØŸ™àÜŸ ™  E¬8×+;Ñ+;¼CÀ»IÓ+FÓGØðó‘ððˆD�Ià"ˆD�Ir&cóÀ—||_ i}t|«}d}g}||kr5t||«}|dz }|j||||z«||z }||krŒ5|D]U}|j d«}|dk(r|} d} n|d|} ||dzd} | dk(rd} n | dk(s| sd} | sŒ?|j | «�ŒQ| || <ŒW||_y#t$rtj«d|_YywxYw)z+Sets properties and text given a text fieldrrrÒrNrÐrÑ) rÀr¥rórêÚfindrbrÎr;r�r‚) r=rÀrfÚendr:ÚstrsrårBÚeindexrEr5s r'ÚsetTextzServiceInfo.setText²s€àˆŒ ð #؈FÜ�d“)ˆC؈E؈Dؘ#’+ܘT %™[Ó)�ؘ‘ �Ø— ‘ ˜D ¨°©Ð8Ô9ؘ‘�ð ˜#“+ó �ØŸ™ ›�ؘR’<à�CØ‘Eà˜G˜V˜*�Cؘf q™j˜l˜O�EØ Ò'Ø !™Ø (Ò*±%Ø !˜ò˜6Ÿ:™: c›?Ñ2Ø"'�F˜3’Kð!ð$%ˆD�OøÜò #Ü × Ñ Ô !Ø"ˆDŽOð #ús%‰A B6ÁAB6ÂB6Â'B6Â6$CÃCcó—|jS)r^)rGrvs r'r`zServiceInfo.getType×ó €à�y‰yÐr&cóø—|j�c|jjd|jz«r;|jdt|j«t|j«z dz S|jS)z Name accessorNrGr)rGrFror¥rvs r'ÚgetNamezServiceInfo.getNameÛs\€à �9‰9Ð  T§Y¡Y×%7Ñ%7¸¸t¿y¹yÑ8HÔ%IØ—9‘9ÐBœs 4§9¡9›~´°D·I±I³Ñ>ÀÑBÐCÐ CØ�y‰yÐr&có—|jS)zAddress accessor)r¡rvs r'Ú getAddresszServiceInfo.getAddressás €à�|‰|Ðr&có—|jS)z Port accessor)rÊrvs r'ÚgetPortzServiceInfo.getPortårÞr&có—|jS)zPriority accessor)rÈrvs r'Ú getPriorityzServiceInfo.getPriorityés €à�}‰}Ðr&có—|jS)zWeight accessor)rÉrvs r'Ú getWeightzServiceInfo.getWeightíó €à�{‰{Ðr&có—|jS)zProperties accessor)rÎrvs r'Ú getPropertieszServiceInfo.getPropertiesñs €à�‰Ðr&có—|jS)z Text accessor)rÀrvs r'ÚgetTextzServiceInfo.getTextõrÞr&có—|jS)zServer accessor)rËrvs r'Ú getServerzServiceInfo.getServerùrér&c ó¦—|��N|j|«�s;|jtk(r,|j|jk(r|j |_yy|jt k(rŸ|j|jk(r…|j|_|j|_|j|_|j|_ |j|||jj|jtt««yy|jtk(r6|j|jk(r|j|j «yyyyy)z-Updates service information from a DNS recordN)r’rGrûrFrËr¡rÿrÊrÉrÈr©rXrdr´rþrÜrÀ)r=rrrŽrƒs r'r©zServiceInfo.updateRecordýsÿ€à Ñ  f×&6Ñ&6°sÕ&;Ø�{‰{œgÒ%à—;‘; $§+¡+Ò-Ø#)§>¡>�D•Lð.à—‘¤ Ò)Ø—;‘; $§)¡)Ò+Ø"(§-¡-�D”KØ &§ ¡ �D”IØ"(§-¡-�D”KØ$*§O¡O�D”Mà×%Ñ%Ø ØØ Ÿ™×3Ñ3Ø ŸK™K¬´)óõð ,𗑤 Ò)Ø—;‘; $§)¡)Ò+Ø—L‘L §¡Õ-ð,ð*ð''<Ð r&có—t«}t}||z}||z} |j|t|jt t ««|j�|j� |j�€í||kr |j|«y||k�r}tt«}|jt|jtt ««|j|j j#|jtt «|«|jt|jt$t ««|j|j j#|jt$t «|«|j�m|jt|jt&t ««|j|j j#|jt&t «|«|j)|«||z}|dz}|j+t-||«|z «t«}|j€�ŒÑ|j€�Œß|j€�Œíd}|j|«|S#|j|«wxYw)z�Returns true if the service could be discovered on the network, and updates this object with details discovered. rrr)r(Ú_LISTENER_TIMEr³rjrFrqr´rËr¡rÀÚremoveListenerrrr%rÿr'rXrdrþrûrÆr}rÇ) r=rrrtrŽr±rÚlastršrfs r'ÚrequestzServiceInfo.requests€ô Ó!ˆÜˆØ�U‰{ˆØ�W‰}ˆð/ *Ø × Ñ Ø”k $§)¡)¬Y¼ ÓBô ð— ‘ Ð# t§|¡|Ð';¸t¿y¹yÑ?Pà˜3’;ØðN × #Ñ # DÕ )ðM˜3“;Ü%¤oÓ6�CØ—O‘OÜ# D§I¡I¬y¼)ÓDôð×'Ñ'Ø Ÿ™×3Ñ3Ø ŸI™I¤y´)óðô ð —O‘OÜ# D§I¡I¬y¼)ÓDôð×'Ñ'Ø Ÿ™×3Ñ3Ø ŸI™I¤y´)óðô ð —{‘{Ð.ØŸ™Ü'¨¯ © ´W¼iÓHôð×+Ñ+Ø$ŸN™N×7Ñ7Ø $§ ¡ ¬W´ióð ô ð —M‘M #Ô&Ø ™;�DØ! A™I�Eà— ‘ œc $¨›o°Ñ3Ô4Ü'Ó)�ðO— ‘ Ò# t§|¡|Ò';¸t¿y¹yÒ?PðPˆFà × #Ñ # DÔ )àˆ øð × #Ñ # DÕ )ús%œAI2ÂF7I2É I2É I2ÉI2É2JcóV—t|t«r|j|jk(Sy)zTests equality of service namer)rNrËrFrOs r'rQzServiceInfo.__eq__Qs"€ä �eœ[Ô )Ø—:‘: §¡Ñ*Ð *Ør&có&—|j|« SrSrTrOs r'rUzServiceInfo.__ne__WrVr&có(—d|jtj|j««|jfz}|j €|dz }n=t |j «dkr||j z }n||j dddzz }|dz }|S)russervice[%s,%s:%s,NsNoneéérÄrd)rFr©rªrârÊrÀr¥r‹s r'rwzServiceInfo.__repr__[s�€à%Ø �I‰IÜ × Ñ ˜TŸ_™_Ó.Ó /Ø �I‰Ið) ñ ˆð �9‰9Ð Ø �gÑ ‰Fä�4—9‘9‹~ Ò"ؘ$Ÿ)™)Ñ#‘à˜$Ÿ)™) C R˜.¨6Ñ1Ñ1�Ø�$‰ˆØˆ r&)NNrrNN)r,r-r.rhr<rÍrÜr`ràrârärærèrërírïr©rõrQrUrwr%r&r'rËrËjsr„Ùð Ø ØØØØó#'òJ#ò@##òJòò òòòòòòò.ò29òvò &ór&rËcó�—eZdZdZdd„Zd„Zd„Zd„Zd„Zdd„Z d „Z d „Z e fd „Z d „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zeefd„Zd„Zy)ÚZeroconfz�Implementation of Zeroconf Multicast DNS Service Discovery Supports registration, unregistration, queries and browsing. Ncó—dt«d<|€-tjtj««|_n||_dt f|_tjtjtj«|_ |jjtjtjd«|jjtjtjd«|jjtjtjd«|jjtjtj d« |jj#|j «|jjtjtj$tj&t(«tj&d«z«g|_g|_i|_i|_t3«|_t7j8«|_t=|«|_tA|«|_!tE|«|_#y#t$rY�ŒwxYw#t$rYŒöwxYw) zxCreates an instance of the Zeroconf class, establishing multicast communications, listening and reaping threads.rrNr&róÿóú0.0.0.0)$rzr©Ú gethostbynameÚ gethostnameÚintfržÚgroupÚAF_INETÚ SOCK_DGRAMÚ setsockoptÚ SOL_SOCKETÚ SO_REUSEADDRÚ SO_REUSEPORTr;ÚSOL_IPÚIP_MULTICAST_TTLÚIP_MULTICAST_LOOPÚbindÚIP_ADD_MEMBERSHIPÚ inet_atonr Ú listenersÚbrowsersr®Ú servicetypesrVrXrprurvrnr—r•r­r¦Úreaper)r=Ú bindaddresss r'r<zZeroconf.__init__ssÍ€ð&'Œ‹ �/Ñ"Ø Ð Ü×,Ñ,¬V×-?Ñ-?Ó-AÓBˆD�Ià#ˆDŒIØœ:Ð&ˆŒ Ü—m‘m¤F§N¡N´F×4EÑ4EÓFˆŒ ð Ø �K‰K× "Ñ "¤6×#4Ñ#4´f×6IÑ6IÈ1Ô MØ �K‰K× "Ñ "¤6×#4Ñ#4´f×6IÑ6IÈ1Ô Mð � ‰ ×ÑœvŸ}™}¬f×.EÑ.EÀwÔOØ � ‰ ×ÑœvŸ}™}¬f×.FÑ.FÈÔPð Ø �K‰K× Ñ ˜TŸZ™ZÔ (ð � ‰ ×ÑÜ �M‰MÜ × $Ñ $Ü × Ñ œZÓ (¬6×+;Ñ+;¸IÓ+FÑ Fô 𠈌؈Œ ؈Œ ؈Ôä“ZˆŒ ä"×,Ñ,Ó.ˆŒä˜T“lˆŒ Ü  ›ˆŒ ܘT“lˆ� øôIò ò ð ûôò ñ ð ús% A2I.Å.%I>É. I;É:I;É> J Ê J có8—|jjd«S)Nó 127.0.0.1©rÚ startswithrvs r'Ú isLoopbackzZeroconf.isLoopback¦s€Ø�y‰y×#Ñ# LÓ1Ð1r&có8—|jjd«S)Ns169.254.rrvs r'Ú isLinklocalzZeroconf.isLinklocal©s€Ø�y‰y×#Ñ# KÓ0Ð0r&có¨—|jj«|jj|dz «|jj«y)zRCalling thread waits for a given number of milliseconds or until notified.r#N)rvr|r}r~)r=rts r'r}z Zeroconf.wait¬s:€ð �‰×ÑÔ Ø �‰×јG d™NÔ+Ø �‰×ÑÕ r&có —|jj«|jj«|jj«y)zNotifies all waiting threadsN)rvr|Ú notify_allr~rvs r'rÃzZeroconf.notifyAll³s2€à �‰×ÑÔ Ø �‰×!Ñ!Ô#Ø �‰×ÑÕ r&cóD—t||«}|j||«r|Sy)z Returns network's service information for a particular name and type, or None if no service matches by the timeout, which defaults to 3 seconds.N)rËrõ)r=rGrFrtræs r'ÚgetServiceInfozZeroconf.getServiceInfo¹s&€ô˜4 Ó&ˆØ �<‰<˜˜gÔ &؈KØr&cór—|j|«|jjt|||««y)z¡Adds a listener for a particular service type. This object will then have its updateRecord method called when information arrives for that type.N)ÚremoveServiceListenerrrêr«)r=rGr­s r'ÚaddServiceListenerzZeroconf.addServiceListenerÂs-€ð ×"Ñ" 8Ô,Ø � ‰ ×Ñœ^¨D°$¸ÓAÕBr&cóh—|jD]#}|j|k(sŒ|j«~Œ%y)zØ—I‘I˜h¨™nÔ-Ü+Ó-�CØÜ!Ô"4´yÑ"@ÓA�Ø ŸM™M×0Ñ0×2�DØ×'Ñ'Ü"Ø ŸI™I¤y´)¸QÀÇ Á óðô ð ×'Ñ'Ü"Ø ŸI™IÜ%Ü%ØØ ŸM™MØ ŸK™KØ ŸI™IØ ŸK™Kó ðô ð×'Ñ'Ü § ¡ ¬9´iÀÀDÇIÁIÓNØôð—|“|Ø×+Ñ+Ü&Ø $§ ¡ ¬W´iÀÀDÇLÁLóðö ð33ð>— ‘ ˜#”Ø�Q‘�ØÔ,Ñ,�ðO�a–%ð "r&c ó‚—t«}|}d}|dk�r«|jj|j«D]®}|jtk(sŒ|j |«rŒ)|j |jk(sŒC|jjd«dkrId|j|j|j|jfz|_|j|«yt‚||kr |j||z «t«}�Œttt z«}||_|j%t'|jtt(««|j+t-|jtt(t.|j««|j1|«|dz }|t2z }|dkr�Œªyy)znChecks the network for a unique service name, modifying the ServiceInfo passed in if it is not unique.rrrGs %s.[%s:%d].%sNr)r(rXrfrGrýr’r¸rFrØr¡rÊr(r1r}rrr)Údebugr%rjr´r,r¶Ú_DNS_TTLrÆÚ _CHECK_TIME)r=rærŽr¯rërƒršs r'r(zZeroconf.checkServicebsb€ô Ó!ˆØˆØ ˆØ�!‹eØŸ*™*×4Ñ4°T·Y±YÖ?�à—K‘K¤9Ó,Ø"×,Ñ,¨SÕ1ØŸ ™ ¨¯ © Ó1à—y‘y—~‘~ dÓ+¨aÒ/Ø$4Ø ŸI™IØ ŸL™LØ ŸI™IØ ŸI™Ið 8ñ%˜œ ð ×)Ñ)¨$Ô/ÙÜ0Ð0ð@ð �XŠ~Ø— ‘ ˜( S™.Ô)Ü'Ó)�ÙÜœo´ Ñ9Ó:ˆC؈DŒJØ �O‰OœK¨¯ © ´9¼iÓHÔ IØ × &Ñ &ܘ4Ÿ9™9¤i´¼HÀdÇiÁiÓPô ð �I‰I�cŒNØ �‰FˆAØ œ Ñ #ˆHð;�!Žer&có4—t«}|jj|«|�a|jj |j «D]9}|j |«sŒ|j|«rŒ'|j|||«Œ;|j«y)z¢Adds a listener for a given question. The listener will have its updateRecord method called when information is available to answer the question.N) r(rrêrXrfrFrsr’r©rÃ)r=r­rìrŽrƒs r'r³zZeroconf.addListener‡s{€ô Ó!ˆØ �‰×јhÔ'Ø Ð ØŸ*™*×4Ñ4°X·]±]ÖC�Ø×&Ñ& vÕ.°v×7GÑ7GÈÕ7LØ×)Ñ)¨$°°VÕ<ðDð �‰Õr&cóz— |jj|«|j«y#t$rYywxYw)zRemoves a listener.N)rr_rÃr;)r=r­s r'rózZeroconf.removeListener“s5€ð Ø �N‰N× !Ñ ! (Ô +Ø �N‰NÕ øÜò Ù ð ús ‚+.® :¹:cól—|jD]}|j|||«Œ|j«y)zNUsed to notify listeners of new information that has updated a record.N)rr©rÃ)r=rŽrrr­s r'r©zZeroconf.updateRecord›s.€ðŸœˆHØ × !Ñ ! $¨¨SÕ 1ð'à �‰Õr&cóŒ—t«}|jD]«}|j|«}||jj «vrO|r|jj |«nL|jj |«}|�/|j|«|}n|jj|«|j||«Œ­y)zlDeal with incoming response packets. All answers are held in the cache, and listeners are notified.N) r(r€r’rXrlr_rbr—r]r©)r=r‚rŽrƒr¾r[s r'r¢zZeroconf.handleResponse¢s�€ô Ó!ˆØ—k”kˆFØ×&Ñ& sÓ+ˆGؘŸ™×+Ñ+Ó-Ñ-ÙØ—J‘J×%Ñ% fÕ-à ŸJ™JŸN™N¨6Ó2�EØÐ(ØŸ™ vÔ.Ø!&™à— ‘ —‘˜vÔ&à × Ñ ˜c 6Õ *ñ"r&có:—d}|tk7r9tttzd«}|jD]}|j |«Œ|jD�]o}|j tk(�r|jdk(rb|jj«D]E}|€tttz«}|j|tdttt|««ŒG|jj!«D]s}|j|j k(sŒ|€tttz«}|j|t|j ttt|j««Œu�Œ |€tttz«}|j t"k(s|j t$k(r�|jj!«D]p}|j&|jj)«k(sŒ+|j|t+|jt"tt,zt|j.««Œr|jj1|jj)«d«}|s�Œ|j t2k(s|j t$k(rg|j|t5|jt2tt,zt|j6|j8|j:|j&««|j t<k(s|j t$k(rF|j|t?|jt<tt,zt|j@««|j t2k(rE|jCt+|j&t"tt,zt|j.««�Œr|�2|jJr%|jL|_&|jO|||«yyy#tD$rtGjH«Y�ŒÈwxYw)zKDeal with incoming query packets. Provides a response if possible.Nrs_services._dns-sd._udp.local.)(ržrr r)rÕr%rGrýrFrrŠr)r¶r´r3r®rkrûrqrËrDrŸrJr¡rbrÿrÆrÈrÉrÊrþr¾rÀr/r;r�r‚r€rárÆ)r=r‚r£rÊršrìÚstypeÚservices r'rŸzZeroconf.handleQueryµs%€ðˆð ”:Ò ÜÔ0´9Ñ<¸aÓ@ˆCØŸMœM�Ø—‘ Õ)ð*ðŸ � ˆHØ�}‰}¤ Ó)Ø—=‘=Ð$DÒDØ!%×!2Ñ!2×!7Ñ!7Ö!9˜Ø˜;Ü"-Ô.@Ä9Ñ.LÓ"M˜CØŸ ™ ØÜ&Ø @Ü )Ü )Ü (Ø %ó õ ð":ð $Ÿ}™}×3Ñ3Ö5�GØ—}‘}¨¯ © Ó4ؘ;Ü"-Ô.@Ä9Ñ.LÓ"M˜CØŸ ™ ØÜ&Ø '§ ¡ Ü )Ü )Ü (Ø '§ ¡ ó õ ò 6ð;*Ø�{Ü)Ô*<¼yÑ*HÓI˜ð —}‘}¬Ò/°8·=±=ÄIÒ3MØ'+§}¡}×';Ñ';Ö'=˜GØ&Ÿ~™~°·±×1DÑ1DÓ1FÓFØ #§ ¡ Ø$'Ü$.Ø(0¯ © Ü(/Ü(1´MÑ(AÜ(0Ø(/¯©ó %&õ !"ð(>ð#Ÿm™m×/Ñ/°· ± ×0CÑ0CÓ0EÀtÓL�GÙ"Ù à—}‘}¬ Ò1°X·]±]ÄiÒ5OØŸ ™ ØÜ&Ø (§ ¡ Ü )Ü )¬MÑ 9Ü (Ø '× 0Ñ 0Ø '§¡Ø '§ ¡ Ø '§¡ó ô ð —}‘}¬ Ò1°X·]±]ÄiÒ5OØŸ ™ ØÜ#Ø (§ ¡ Ü )Ü )¬MÑ 9Ü (Ø '§ ¡ ó ô ð —}‘}¬ Ò1Ø×/Ñ/Ü&Ø '§¡Ü 'Ü )¬MÑ 9Ü (Ø '§¡ó ôùða&ðx ˆ?˜sŸ{š{Ø—V‘VˆCŒFØ �I‰I�c˜4 Õ &ð +ˆ?øô!ò*Ü×'Ñ'×)ð*ús!Å-BO9Ç0A>O9É0EO9Ï9PÐPcó~— |jj|j«d||f«y#t$rYywxYw)zSends an outgoing packet.rN)r©ÚsendtorTr;)r=ršr£rÊs r'rÆz Zeroconf.send!s9€ð Ø �K‰K× Ñ ˜sŸz™z›|¨Q°°t° Õ =øÜò á ð ús ‚-0° <»<có´—t«ddk(rÈdt«d<|j«|jj«|j «|j j t jt jt jt«t jd«z«|j j«yy)z^Ends the background threads, and prevent this instance from servicing further queries.rrrrN) rzrÃr—rŽr0r©rr ÚIP_DROP_MEMBERSHIPrr Úcloservs r'r@zZeroconf.close+sœ€ô ‹9�_Ñ %¨Ò *Ø)*ŒG‹I�oÑ &Ø �N‰NÔ Ø �K‰K× Ñ Ô Ø × &Ñ &Ô (Ø �K‰K× "Ñ "Ü— ‘ Ü×)Ñ)Ü× Ñ ¤Ó,¬v×/?Ñ/?À Ó/JÑJô ð �K‰K× Ñ Õ ð +r&r{)i¸ )r,r-r.rhr<rrr}rÃr!r$r#r3r+r.r0r(r³rór©r¢rŸr ržrÆr@r%r&r'rürümsz„ñó 1#òf2ò1ò!ò!ó òCòð)1ó0'òd/)òb--ò^#$òJ òòò+ò&j'ðX(¨jóó  r&rüÚ__main__s3Multicast DNS Service Discovery for Python, versions'1. Testing registration of a service...s0.10s test values another value)sversionr!óbs_http._tcp.local.s!My Service Name._http._tcp.local.riÒs Registering service...s Registration done.s*2. Testing query of service information...s Getting ZOE service:sZOE._http._tcp.local.s Query done.s"3. Testing query of own service...s Getting self:s/4. Testing unregister of service information...s Unregister done.)hrhÚ __author__Ú __email__Ú __version__rœrhrr©rÞrpr$r�Ú mercurialrÚ__all__rzr-r4r*ròr°r ržr¡r3Ú_MAX_MSG_TYPICALršrrr r)Ú _FLAGS_TCÚ _FLAGS_RDÚ _FLAGS_RAÚ_FLAGS_ZÚ _FLAGS_ADÚ _FLAGS_CDr´Ú _CLASS_CSÚ _CLASS_CHÚ _CLASS_HSÚ _CLASS_NONEÚ _CLASS_ANYrHrJrûÚ_TYPE_NSÚ_TYPE_MDÚ_TYPE_MFrüÚ _TYPE_SOAÚ_TYPE_MBÚ_TYPE_MGÚ_TYPE_MRÚ _TYPE_NULLÚ _TYPE_WKSrýrÚ _TYPE_MINFOÚ_TYPE_MXrþrrÿrqrYr_r(r;r*r1r3r5r7r9r@rBrjryrŸr­r¶r¾rÆrÑrrVrqrnr•r¦r«rËrür,ÚprintÚrÚdescrrær+rmr!r.r@r%r&r'ÚrbsÚðñð0IðOð Jð;ð.ð#ð @ð4ðCð "€ Ø 0€ Ø€ ã ÛÛ Û Û ÛÛ Ûåâ :€ð�ƒ ˆ/ÑðÐØ€ ؀؀؀ ð€ Ø € Ø € Ø €àÐØÐà€Ø€ØÐà € Ø € Ø € Ø € à €Ø € Ø € à € Ø € Ø € Ø € Ø€ Ø € Ø€ Ø€ à €Ø €Ø €Ø €Ø€ Ø € Ø €Ø €Ø €Ø € Ø € Ø € Ø€ Ø€ Ø €Ø € Ø € Ø € Ø € ð ˆuØ ˆuØ ˆuØ ˆuØ�Ø�ð  €ð Ø ˆTð à ˆeð ð ˆeð ð ˆeð  ð �ð  ð ˆvð  ð ˆeð ð ˆeð ð ˆeð ð�ð ðˆvð ðˆvð ð�ð ð�ð ð ˆeð ð ˆvð! ð"�ð# ð$ˆvØ ˆvñ' €ò2ô ˜Iô ô ˜Yô ô ˜yô ô ˜iô ô ˜Yô ô:�Iô:ô  ˜Mô ÷6ñ6ôr:�(ô:ô.?7�ô?7ôD �ô ô2)ˆyô)ô0)�ô)ô,,ˆiô,ô2B�ôB÷BAñA÷H_#ñ_#÷D1ñ1ôh?!ˆY× Ñ ô?!÷D$.ñ$.ôN7ˆY× Ñ ô7ô*R%�Y×%Ñ%ôR%÷j@ñ@÷FK ñK ðb ˆzÒÙ Ð @À+ÔNÙ‹ €AÙ Ð 4Ô5Ø }Ð