Ë
    Ü_Ëiw²  ã                  ó<  — d Z 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mZmZmZmZmZ ddlmZmZmZmZ ddlmZmZmZmZmZm Z m!Z!m"Z"m#Z# ddl$m%Z% dd	l&m'Z'm(Z(m)Z) dd
l*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z< ddl=m>Z>m?Z? ddl@mAZA ddlBmCZC ddlDmEZEmFZFmGZGmHZHmIZI erddlJmKZK ddlLmMZM ddlNmOZOmPZP dZQ eR eeS«      j¨                  «      ZUdd„ZV G d„ d«      ZW G d„ d«      ZX	 	 	 	 	 	 dd„ZYd d„ZZy)!z<Internal class to monitor a topology of one or more servers.é    )ÚannotationsN)ÚPath)ÚTYPE_CHECKINGÚAnyÚCallableÚMappingÚOptionalÚcast)Ú_csotÚcommonÚhelpers_sharedÚperiodic_executor)	ÚConnectionFailureÚInvalidOperationÚNetworkTimeoutÚNotPrimaryErrorÚOperationFailureÚPyMongoErrorÚServerSelectionTimeoutErrorÚWaitQueueTimeoutErrorÚ
WriteError)ÚHello)Ú
_cond_waitÚ_create_conditionÚ_create_lock)Ú_SDAM_LOGGERÚ_SERVER_SELECTION_LOGGERÚ
_debug_logÚ_SDAMStatusMessageÚ_ServerSelectionStatusMessage)ÚPoolOptions)ÚServerDescription)Ú	SelectionÚany_server_selectorÚarbiter_server_selectorÚsecondary_server_selectorÚwritable_server_selector)Ú_ServerSessionÚ_ServerSessionPool)ÚMonitorBaseÚ
SrvMonitor)ÚPool)ÚServer)ÚSRV_POLLING_TOPOLOGIESÚTOPOLOGY_TYPEÚTopologyDescriptionÚ)_updated_topology_description_srv_pollingÚupdated_topology_description)ÚObjectId)ÚTopologySettings)ÚClusterTimeÚ_AddressTc                ó‚   —  | «       }|sy	 	 |j                  «       }|\  }} ||Ž  Œ# t        j                  $ r Y yw xY w)NFT)Ú
get_nowaitÚqueueÚEmpty)Ú	queue_refÚqÚeventÚfnÚargss        ú_/var/www/pod-logistic/pod-api/venv/lib/python3.12/site-packages/pymongo/synchronous/topology.pyÚprocess_events_queuerA   W   sV   € Ù‹€AÙØà
ð	Ø—L‘L“NˆEð ‰HˆB�Ù�‰Ið øô �{‰{ò 	Øð
 ð	ús   �( ¨>½>c                  óF  — e Zd ZdZd/d„Zd0d„Zd1d„Z	 	 	 	 d2	 	 	 	 	 	 	 	 	 	 	 	 	 d3d„Z	 d4	 	 	 	 	 	 	 	 	 	 	 	 	 d5d„Z	 	 	 	 d2	 	 	 	 	 	 	 	 	 	 	 	 	 d6d„Z		 	 	 	 d2	 	 	 	 	 	 	 	 	 	 	 	 	 d6d	„Z
	 	 d7	 	 	 	 	 	 	 	 	 d8d
„Z	 	 d9	 	 	 	 	 	 	 d:d„Z	 	 d9	 	 	 	 	 	 	 d:d„Zd;d„Zd;d„Zd<d„Zd=d„Zd>d„Zd?d„Zd@d„Zd@d„ZdAd„ZdBd„ZdBd„ZdCdDd„ZdEd„Zd0d„Zd0d„ZedFd„«       ZdGd„ZdHd„Z dId„Z!dJd „Z"d0d!„Z#dKd"„Z$dLd#„Z%dLd$„Z&d0d%„Z'd0d&„Z(dMd'„Z)dMd(„Z*dNd)„Z+d0d*„Z,dOd+„Z-dPd,„Z.dQd-„Z/dRd.„Z0y)SÚTopologyz*Monitor a topology of one or more servers.c           	     ó.
  ‡— |j                   | _         |j                  j                  | _        | j                  d uxr | j                  j                  | _        | j                  d uxr | j                  j                  | _        d | _        d | _	        | j
                  s| j                  rt        j                  d¬«      | _        t        j                  t        j                  «      r*t!        t        t"        j$                  | j                   ¬«       | j                  rX| j                  €J ‚| j                  €J ‚| j                  j'                  | j                  j(                  | j                   ff«       || _        t-        |j/                  «       |j1                  «       |j2                  d d |«      }|| _        t-        t6        j8                  i d d d | j*                  «      }| j                  rd| j                  €J ‚| j                  €J ‚| j                  j'                  | j                  j:                  || j4                  | j                   ff«       t        j                  t        j                  «      rHt!        t        t"        j<                  | j                   t?        |«      t?        | j4                  «      ¬«       |j@                  D ]½  }| j
                  rY| j                  €J ‚| j                  €J ‚| j                  j'                  | j                  jB                  || j                   ff«       t        j                  t        j                  «      sŒŒt!        t        t"        jD                  | j                   |d   |d   ¬«       Œ¿ tG        |jI                  «       «      | _%        d| _&        d| _'        tQ        «       | _)        tU        | jR                  tV        r| j*                  jX                  nd «      | _-        i | _.        d | _/        d | _0        tc        «       | _2        | j
                  s| j                  rŠ| j                  €J ‚dˆfd	„}tg        jh                  tj        jl                  tj        jn                  |d
¬«      }tq        jr                  | j                  |jt                  «      Š|| _	        |jw                  «        d | _<        | j*                  jz                  �1| j*                  j|                  st        | | j*                  «      | _<        g | _@        y )Néd   )Úmaxsize©ÚmessageÚ
topologyId©rH   rI   ÚpreviousDescriptionÚnewDescriptionr   é   )rH   rI   Ú
serverHostÚ
serverPortFc                 ó   •— t        ‰ «      S ©N)rA   )Úweaks   €r@   Útargetz!Topology.__init__.<locals>.targetÂ   s   ø€ Ü+¨DÓ1Ð1ó    Úpymongo_events_thread)ÚintervalÚmin_intervalrS   Úname)ÚreturnÚbool)AÚ_topology_idÚ_pool_optionsÚ_event_listenersÚ
_listenersÚenabled_for_serverÚ_publish_serverÚenabled_for_topologyÚ_publish_tpÚ_eventsÚ_Topology__events_executorr9   ÚQueuer   ÚisEnabledForÚloggingÚDEBUGr   r   ÚSTART_TOPOLOGYÚputÚpublish_topology_openedÚ	_settingsr0   Úget_topology_typeÚget_server_descriptionsÚreplica_set_nameÚ_descriptionr/   ÚUnknownÚ$publish_topology_description_changedÚTOPOLOGY_CHANGEÚreprÚseedsÚpublish_server_openedÚSTART_SERVERÚlistÚserver_descriptionsÚ_seed_addressesÚ_openedÚ_closedr   Ú_lockr   Ú_IS_SYNCÚcondition_classÚ
_conditionÚ_serversÚ_pidÚ_max_cluster_timer)   Ú_session_poolr   ÚPeriodicExecutorr   ÚEVENTS_QUEUE_FREQUENCYÚMIN_HEARTBEAT_INTERVALÚweakrefÚrefÚcloseÚopenÚ_srv_monitorÚfqdnÚload_balancedr+   Ú_monitor_tasks)ÚselfÚtopology_settingsÚtopology_descriptionÚ
initial_tdÚseedrS   ÚexecutorrR   s          @r@   Ú__init__zTopology.__init__k   s	  ø€ Ø-×:Ñ:ˆÔØ+×9Ñ9×JÑJˆŒØ#Ÿ™°dÐ:Òa¸t¿¹×?aÑ?aˆÔØŸ?™?°$Ð6Ò_¸4¿?¹?×;_Ñ;_ˆÔð 15ˆŒØ&*ˆÔà×Ò 4×#3Ò#3Ü Ÿ;™;¨sÔ3ˆDŒLä×$Ñ$¤W§]¡]Ô3ÜÜÜ*×9Ñ9Ø×,Ñ,õð ×ÒØ—<‘<Ð+Ð+Ð+Ø—?‘?Ð.Ð.Ð.Ø�L‰L×Ñ˜dŸo™o×EÑEÈ×HYÑHYÐG[Ð\Ô]Ø*ˆŒÜ2Ø×/Ñ/Ó1Ø×5Ñ5Ó7Ø×.Ñ.ØØØó 
Ðð 1ˆÔÜ(Ü×!Ñ! 2 t¨T°4¸¿¹ó
ˆ
ð ×ÒØ—<‘<Ð+Ð+Ð+Ø—?‘?Ð.Ð.Ð.Ø�L‰L×Ñà—O‘O×HÑHØ ×!2Ñ!2°D×4EÑ4EÐFðôô ×$Ñ$¤W§]¡]Ô3ÜÜÜ*×:Ñ:Ø×,Ñ,Ü$(¨Ó$4Ü# D×$5Ñ$5Ó6õð &×+Ñ+ò 	ˆDØ×#Ò#Ø—|‘|Ð/Ð/Ð/Ø—‘Ð2Ð2Ð2Ø—‘× Ñ  $§/¡/×"GÑ"GÈ$ÐPT×PaÑPaÐIbÐ!cÔdÜ×(Ñ(¬¯©Õ7ÜÜ Ü.×;Ñ;Ø#×0Ñ0Ø# A™wØ# A™wöð	ô  $Ð$8×$LÑ$LÓ$NÓOˆÔØˆŒØˆŒÜ!“^ˆŒ
Ü+Ø�J‰J½(˜Ÿ™×6Ò6Èó
ˆŒð 13ˆŒØ#'ˆŒ	Ø8<ˆÔÜ/Ó1ˆÔà×Ò 4×#3Ò#3Ø—<‘<Ð+Ð+Ð+õ2ô )×9Ñ9Ü×6Ñ6Ü#×:Ñ:ØØ,ô	ˆHô —;‘;˜tŸ|™|¨X¯^©^Ó<ˆDØ%-ˆDÔ"Ø�M‰MŒOà ˆÔØ�>‰>×ÑÐ*°4·>±>×3OÒ3OÜ *¨4°·±Ó @ˆDÔð 24ˆÕrT   c                ó*  — t        j                  «       }| j                  €|| _        n®|| j                  k7  rŸ|| _        t        j                  dd dk\  r
dt
        fi}nddi}t        j                  	 di |¤Ž | j                  5  | j                  j                  «       D ]  }|j                  «        Œ | j                  j                  «        ddd«       | j                  5  | j                  «        ddd«       y# 1 sw Y   Œ/xY w# 1 sw Y   yxY w)a³  Start monitoring, or restart after a fork.

        No effect if called multiple times.

        .. warning:: Topology is shared among multiple threads and is protected
          by mutual exclusion. Using Topology from a process other than the one
          that initialized it will emit a warning and may result in deadlock. To
          prevent this from happening, MongoClient must be created after any
          forking.

        Né   )é   é   Úskip_file_prefixesÚ
stacklevelé   )z³MongoClient opened before fork. May not be entirely fork-safe, proceed with caution. See PyMongo's documentation for details: https://dochub.mongodb.org/core/pymongo-fork-deadlock)ÚosÚgetpidr‚   ÚsysÚversion_infoÚ_pymongo_dirÚwarningsÚwarnr}   r�   ÚvaluesrŠ   r„   ÚresetÚ_ensure_opened)r�   ÚpidÚkwargsÚservers       r@   r‹   zTopology.openÚ   s   € ô �i‰i‹kˆØ�9‰9ÐØˆD�IØ�D—I‘IÒØˆDŒIÜ×Ñ  Ð# wÒ.Ø.´°Ð@‘à&¨Ð*�ä�M‰MðHñð ò	ð —‘ñ +à"Ÿm™m×2Ñ2Ó4ò #�FØ—L‘L•Nð#ð ×"Ñ"×(Ñ(Ô*÷+ð �Z‰Zñ 	"Ø×ÑÔ!÷	"ð 	"÷+ð +ú÷	"ð 	"ús   ÂA
C=Ã#D	Ã=DÄ	Dc                ó^   — t        j                  «       }|€| j                  j                  S |S rQ   )r   Ú	remainingrl   Úserver_selection_timeout)r�   Útimeouts     r@   Úget_server_selection_timeoutz%Topology.get_server_selection_timeout  s(   € ä—/‘/Ó#ˆØˆ?Ø—>‘>×:Ñ:Ð:ØˆrT   Nc           
     óZ  — |€| j                  «       }n|}t        s| j                  r| j                  «        | j                  5  | j                  ||||||¬«      }|D �	cg c]+  }	t        t        | j                  |	j                  «      «      ‘Œ- c}	cddd«       S c c}	w # 1 sw Y   yxY w)aŠ  Return a list of Servers matching selector, or time out.

        :param selector: function that takes a list of Servers and returns
            a subset of them.
        :param operation: The name of the operation that the server is being selected for.
        :param server_selection_timeout: maximum seconds to wait.
            If not provided, the default value common.SERVER_SELECTION_TIMEOUT
            is used.
        :param address: optional server address to select.

        Calls self.open() if needed.

        Raises exc:`ServerSelectionTimeoutError` after
        `server_selection_timeout` if no matching servers are found.
        N)Údeprioritized_servers)
r¯   r~   r�   Úcleanup_monitorsr}   Ú_select_servers_loopr
   r-   Úget_server_by_addressÚaddress)
r�   ÚselectorÚ	operationr­   rµ   Úoperation_idr±   Úserver_timeoutry   Úsds
             r@   Úselect_serverszTopology.select_servers  s±   € ð0 $Ð+Ø!×>Ñ>Ó@‰Nà5ˆNõ ˜D×/Ò/Ø×!Ñ!Ô#à�Z‰Zñ 	Ø"&×";Ñ";ØØØØØØ&;ð #<ó #Ðð PcöØIK””V˜T×7Ñ7¸¿
¹
ÓCÕDò÷	ñ 	ùò÷	ð 	ús   ÁB!Á 0BÂB!ÂB!Â!B*c                óš  — t        j                  «       }||z   }d}	t        j                  t        j
                  «      rLt        t        t        j                  |||| j                  | j                  j                  j                  ¬«       | j                  j                  ||| j                  j                  |r|D �
cg c]  }
|
j                  ‘Œ c}
nd¬«      }|�sÏ|dk(  s||kD  r«t        j                  t        j
                  «      r\t        t        t        j                   |||| j                  | j                  j                  j                  | j#                  |«      ¬«       t%        | j#                  |«      › d|› d| j                  ›�«      ‚|	spt        t        t        j&                  |||| j                  | j                  j                  j                  t)        d	|t        j                  «       z
  z  «      ¬
«       d}	| j+                  «        | j-                  «        t/        | j0                  t2        j4                  «       | j                  j7                  «        t        j                  «       }| j                  j                  ||| j                  j                  ¬«      }|s�ŒÏ| j                  j7                  «        |S c c}
w )z7select_servers() guts. Hold the lock when calling this.F)rH   r¶   r·   ÚoperationIdÚtopologyDescriptionÚclientIdN)Úcustom_selectorr±   r   )rH   r¶   r·   r½   r¾   r¿   Úfailurez, Timeout: zs, Topology Description: iè  )rH   r¶   r·   r½   r¾   r¿   ÚremainingTimeMST)rÀ   )ÚtimeÚ	monotonicr   rf   rg   rh   r   r    ÚSTARTEDÚdescriptionÚ_topology_settingsr[   rp   Úapply_selectorrl   Úserver_selectorÚFAILEDÚ_error_messager   ÚWAITINGÚintr§   Ú_request_check_allr   r€   r   r‡   Úcheck_compatible)r�   r¶   r®   r·   r¸   rµ   r±   ÚnowÚend_timeÚlogged_waitingrª   ry   s               r@   r³   zTopology._select_servers_loop7  sa  € ô �n‰nÓˆØ˜‘=ˆØˆä#×0Ñ0´·±Ô?ÜÜ(Ü5×=Ñ=Ø!Ø#Ø(Ø$(×$4Ñ$4Ø×)Ñ)×<Ñ<×IÑIõð #×/Ñ/×>Ñ>ØØØ ŸN™N×:Ñ:á$ð EZÖ"Z¸& 6×#5Ó#5Ó"Zàð ?ó 
Ðò &à˜!Š|˜s Xš~Ü+×8Ñ8¼¿¹ÔGÜÜ0Ü =× DÑ DØ!)Ø"+Ø$0Ø,0×,<Ñ,<Ø!%×!1Ñ!1×!DÑ!D×!QÑ!QØ $× 3Ñ 3°HÓ =õ	ô 2Ø×*Ñ*¨8Ó4Ð5°[ÀÀ	ÐIbÐcg×csÑcsÐbvÐwóð ñ "ÜÜ,Ü9×AÑAØ%Ø'Ø ,Ø(,×(8Ñ(8Ø!×-Ñ-×@Ñ@×MÑMÜ$'¨°¼4¿>¹>Ó;KÑ0KÑ(LÓ$Mõ	ð "&�à×ÑÔ!Ø×#Ñ#Ô%ô �t—‘¬×(EÑ(EÔFØ×Ñ×.Ñ.Ô0Ü—.‘.Ó"ˆCØ"&×"3Ñ"3×"BÑ"BØ˜'°4·>±>×3QÑ3Qð #Có #ÐóS &ðZ 	×Ñ×*Ñ*Ô,Ø"Ð"ùòg #[s   Â=Kc                óè   — | j                  ||||||«      }t        |«      dk(  r|d   S t        j                  |d«      \  }}	|j                  j
                  |	j                  j
                  k  r|S |	S )NrM   r   r˜   )r»   ÚlenÚrandomÚsampleÚpoolÚoperation_count)
r�   r¶   r·   r­   rµ   r±   r¸   ÚserversÚserver1Úserver2s
             r@   Ú_select_serverzTopology._select_server‰  sy   € ð ×%Ñ%ØØØ$ØØØ!ó
ˆô ˆw‹<˜1ÒØ˜1‘:ÐÜ!Ÿ=™=¨°!Ó4Ñˆ�Ø�<‰<×'Ñ'¨7¯<©<×+GÑ+GÒGØˆNàˆNrT   c                óì  — | j                  ||||||¬«      }t        j                  «       r)t        j                  |j                  j
                  «       t        j                  t        j                  «      r|t        t        t        j                  |||| j                  | j                  j                  j                  |j                  j                  d   |j                  j                  d   ¬«	       |S )zALike select_servers, but choose a random server if several match.©r¸   r   rM   )rH   r¶   r·   r½   r¾   r¿   rN   rO   )rÜ   r   Úget_timeoutÚset_rttrÆ   Úmin_round_trip_timer   rf   rg   rh   r   r    Ú	SUCCEEDEDrÇ   r[   rµ   )r�   r¶   r·   r­   rµ   r±   r¸   rª   s           r@   Úselect_serverzTopology.select_server¢  sÍ   € ð ×$Ñ$ØØØ$ØØ!Ø%ð %ó 
ˆô ×ÑÔÜ�M‰M˜&×,Ñ,×@Ñ@ÔAÜ#×0Ñ0´·±Ô?ÜÜ(Ü5×?Ñ?Ø!Ø#Ø(Ø$(×$4Ñ$4Ø×)Ñ)×<Ñ<×IÑIØ!×-Ñ-×5Ñ5°aÑ8Ø!×-Ñ-×5Ñ5°aÑ8õ
ð ˆrT   c                ó6   — | j                  t        ||||¬«      S )a=  Return a Server for "address", reconnecting if necessary.

        If the server's type is not known, request an immediate check of all
        servers. Time out after "server_selection_timeout" if the server
        cannot be reached.

        :param address: A (host, port) pair.
        :param operation: The name of the operation that the server is being selected for.
        :param server_selection_timeout: maximum seconds to wait.
            If not provided, the default value
            common.SERVER_SELECTION_TIMEOUT is used.
        :param operation_id: The unique id of the current operation being performed. Defaults to None if not provided.

        Calls self.open() if needed.

        Raises exc:`ServerSelectionTimeoutError` after
        `server_selection_timeout` if no matching servers are found.
        rÞ   )rã   r$   )r�   rµ   r·   r­   r¸   s        r@   Úselect_server_by_addressz!Topology.select_server_by_addressÄ  s+   € ð2 ×!Ñ!ÜØØ$ØØ%ð "ó 
ð 	
rT   c           	     ó¤  — | j                   }|j                  |j                     }t        ||«      ryt	        | j                   |«      }|j
                  s)|j                  r^|j                  t        j                  k(  rA| j                  j                  |j                  «      }|r|j                  j                  «        ||k(  }| j                  rg|se| j                  €J ‚| j                   €J ‚| j                  j#                  | j                   j$                  |||j                  | j&                  ff«       || _         | j)                  «        | j*                  rf|sd| j                  €J ‚| j                   €J ‚| j                  j#                  | j                   j,                  || j                   | j&                  ff«       t/        j0                  t2        j4                  «      rJ|sHt7        t.        t8        j:                  | j&                  t=        |«      t=        | j                   «      ¬«       | j>                  r~|j                  t        j@                  k(  ra| j                   j                  tB        vrE| j>                  jE                  «        tF        s%| jH                  jK                  | j>                  «       | jL                  jO                  «        y)ziProcess a new ServerDescription on an opened topology.

        Hold the lock when calling this.
        NrJ   )(rp   Ú_server_descriptionsrµ   Ú_is_stale_server_descriptionr2   Úis_readableÚis_server_type_knownÚtopology_typer/   ÚSingler�   Úgetr×   Úreadyr`   rc   r^   rj   Ú"publish_server_description_changedr[   Ú_update_serversrb   rr   r   rf   rg   rh   r   r   rs   rt   rŒ   rq   r.   rŠ   r~   r�   Úappendr€   Ú
notify_all)	r�   Úserver_descriptionÚ
reset_poolÚinterrupt_connectionsÚtd_oldÚsd_oldÚnew_tdrª   Úsuppress_events	            r@   Ú_process_changezTopology._process_changeå  sG  € ð ×"Ñ"ˆØ×,Ñ,Ð-?×-GÑ-GÑHˆÜ'¨Ð0BÔCàä-¨d×.?Ñ.?ÐASÓTˆà×)Ò)Ø×3Ò3¸×8LÑ8LÔP]×PdÑPdÒ8dà—]‘]×&Ñ&Ð'9×'AÑ'AÓBˆFÙØ—‘×!Ñ!Ô#àÐ#5Ñ5ˆØ×Ò©Ø—<‘<Ð+Ð+Ð+Ø—?‘?Ð.Ð.Ð.Ø�L‰L×Ñà—O‘O×FÑFØÐ/Ð1C×1KÑ1KÈT×M^ÑM^Ð_ðôð #ˆÔØ×ÑÔà×Ò¡NØ—<‘<Ð+Ð+Ð+Ø—?‘?Ð.Ð.Ð.Ø�L‰L×Ñà—O‘O×HÑHØ˜T×.Ñ.°×0AÑ0AÐBðôô ×$Ñ$¤W§]¡]Ô3¹NÜÜÜ*×:Ñ:Ø×,Ñ,Ü$(¨£LÜ# D×$5Ñ$5Ó6õð ×ÒØ× Ñ ¤M×$9Ñ$9Ò9Ø×!Ñ!×/Ñ/Ô7MÑMà×Ñ×#Ñ#Ô%ÝØ×#Ñ#×*Ñ*¨4×+<Ñ+<Ô=ð 	�‰×"Ñ"Õ$rT   c                ó\  — | j                   5  | j                  r8| j                  j                  |j                  «      r| j                  |||«       ddd«       |rE| j                  j                  |j                  «      }|r|j                  j                  |¬«       yyy# 1 sw Y   ŒQxY w)z>Process a new ServerDescription after an hello call completes.N)rõ   )
r}   r{   rp   Ú
has_serverrµ   rú   r�   rí   r×   r¦   )r�   ró   rô   rõ   rª   s        r@   Ú	on_changezTopology.on_change,  sž   € ð �Z‰Zñ 
	\ð �|Š| × 1Ñ 1× <Ñ <Ð=O×=WÑ=WÔ XØ×$Ñ$Ð%7¸ÐEZÔ[÷
	\ñ Ø—]‘]×&Ñ&Ð'9×'AÑ'AÓBˆFÙØ—‘×!Ñ!Ð8MÐ!ÕNð ð ÷
	\ð 
	\ús   �AB"Â"B+c           	     óP  — | j                   }|j                  t        vryt        | j                   |«      | _         | j	                  «        | j
                  rd| j                  €J ‚| j                  €J ‚| j                  j                  | j                  j                  || j                   | j                  ff«       t        j                  t        j                  «      rIt        t        t         j"                  | j                  t%        |«      t%        | j                   «      ¬«       yy)z_Process a new seedlist on an opened topology.
        Hold the lock when calling this.
        NrJ   )rp   rë   r.   r1   rð   rb   rc   r^   rj   rr   r[   r   rf   rg   rh   r   r   rs   rt   )r�   Úseedliströ   s      r@   Ú_process_srv_updatezTopology._process_srv_updateE  sñ   € ð ×"Ñ"ˆØ×ÑÔ'=Ñ=ØÜEÀd×FWÑFWÐYaÓbˆÔà×ÑÔà×ÒØ—<‘<Ð+Ð+Ð+Ø—?‘?Ð.Ð.Ð.Ø�L‰L×Ñà—O‘O×HÑHØ˜T×.Ñ.°×0AÑ0AÐBðôô ×$Ñ$¤W§]¡]Ô3ÜÜÜ*×:Ñ:Ø×,Ñ,Ü$(¨£LÜ# D×$5Ñ$5Ó6öð 4rT   c                ó€   — | j                   5  | j                  r| j                  |«       ddd«       y# 1 sw Y   yxY w)z?Process a new list of nodes obtained from scanning SRV records.N)r}   r{   r   )r�   rÿ   s     r@   Úon_srv_updatezTopology.on_srv_updateb  s5   € ð �Z‰Zñ 	3Ø�|Š|Ø×(Ñ(¨Ô2÷	3÷ 	3ñ 	3ús   �4´=c                ó8   — | j                   j                  |«      S )aJ  Get a Server or None.

        Returns the current version of the server immediately, even if it's
        Unknown or absent from the topology. Only use this in unittests.
        In driver code, use select_server_by_address, since then you're
        assured a recent view of the server's type and wire protocol version.
        )r�   rí   ©r�   rµ   s     r@   r´   zTopology.get_server_by_addressi  s   € ð �}‰}× Ñ  Ó)Ð)rT   c                ó   — || j                   v S rQ   )r�   r  s     r@   rü   zTopology.has_servers  s   € Ø˜$Ÿ-™-Ð'Ð'rT   c                óø   — | j                   5  | j                  j                  }|t        j                  k7  r
	 ddd«       yt        | j                  «       «      d   j                  cddd«       S # 1 sw Y   yxY w)z!Return primary's address or None.Nr   )r}   rp   rë   r/   ÚReplicaSetWithPrimaryr'   Ú_new_selectionrµ   )r�   rë   s     r@   Úget_primaryzTopology.get_primaryv  sp   € ð �Z‰Zñ 	NØ ×-Ñ-×;Ñ;ˆMØ¤× CÑ CÒCØ÷	Nð 	Nô
 ,¨D×,?Ñ,?Ó,AÓBÀ1ÑE×MÑM÷	N÷ 	Nò 	Nús   �+A0Á%A0Á0A9c                óT  — | j                   5  | j                  j                  }|t        j                  t        j
                  fvrt        «       cddd«       S t         || j                  «       «      «      D �ch c]  }|j                  ’Œ c}cddd«       S c c}w # 1 sw Y   yxY w)z+Return set of replica set member addresses.N)
r}   rp   rë   r/   r  ÚReplicaSetNoPrimaryÚsetÚiterr  rµ   )r�   r¶   rë   rº   s       r@   Ú_get_replica_set_membersz!Topology._get_replica_set_members€  sš   € ð �Z‰Zñ 	PØ ×-Ñ-×;Ñ;ˆMØÜ×3Ñ3Ü×1Ñ1ð%ñ ô “u÷	Pñ 	Pô *.©h°t×7JÑ7JÓ7LÓ.MÓ)NÖO 2�B—J“JÒO÷	Pñ 	Pùò P÷	Pð 	Pús$   �ABÁ!BÁ:BÂBÂBÂB'c                ó,   — | j                  t        «      S )z"Return set of secondary addresses.)r  r&   ©r�   s    r@   Úget_secondarieszTopology.get_secondaries�  s   € à×,Ñ,Ô-FÓGÐGrT   c                ó,   — | j                  t        «      S )z Return set of arbiter addresses.)r  r%   r  s    r@   Úget_arbiterszTopology.get_arbiters‘  s   € à×,Ñ,Ô-DÓEÐErT   c                ó   — | j                   S )z1Return a document, the highest seen $clusterTime.©rƒ   r  s    r@   Úmax_cluster_timezTopology.max_cluster_time•  s   € à×%Ñ%Ð%rT   c                ó\   — |r*| j                   r|d   | j                   d   kD  r|| _         y y y )NÚclusterTimer  ©r�   Úcluster_times     r@   Ú_receive_cluster_time_no_lockz&Topology._receive_cluster_time_no_lock™  s=   € ñ ð ×*Ò*Ø Ñ.°×1GÑ1GÈÑ1VÒVà)5�Õ&ð Wð	 rT   c                óh   — | j                   5  | j                  |«       d d d «       y # 1 sw Y   y xY wrQ   )r}   r  r  s     r@   Úreceive_cluster_timezTopology.receive_cluster_time¨  s,   € Ø�Z‰Zñ 	=Ø×.Ñ.¨|Ô<÷	=÷ 	=ñ 	=ús   �(¨1c                ó’   — | j                   5  | j                  «        t        | j                  |«       ddd«       y# 1 sw Y   yxY w)z=Wake all monitors, wait for at least one to check its server.N)r}   rÎ   r   r€   )r�   Ú	wait_times     r@   Úrequest_check_allzTopology.request_check_all¬  s8   € à�Z‰Zñ 	3Ø×#Ñ#Ô%Ü�t—‘¨	Ô2÷	3÷ 	3ñ 	3ús	   �'=½Ac                ó¨   — | j                   j                  t        j                  k(  r| j                   j                  S | j                   j
                  S )z~Return a list of all data-bearing servers.

        This includes any server that might be selected for an operation.
        )rp   rë   r/   rì   Úknown_serversÚreadable_serversr  s    r@   Údata_bearing_serverszTopology.data_bearing_servers²  sB   € ð
 ×Ñ×*Ñ*¬m×.BÑ.BÒBØ×$Ñ$×2Ñ2Ð2Ø× Ñ ×1Ñ1Ð1rT   c           	     óì  — g }| j                   5  | j                  «       D ]P  }| j                  |j                     }|j	                  ||j
                  j                  j                  «       f«       ŒR 	 d d d «       |D ]!  \  }}	 |j
                  j                  |«       Œ# y # 1 sw Y   Œ0xY w# t        $ r;}t        |d|dd «      }| j                  |j                  j                  |«       ‚ d }~ww xY w)Nr   F)r}   r$  r�   rµ   rñ   r×   ÚgenÚget_overallÚremove_stale_socketsr   Ú_ErrorContextÚhandle_errorrÆ   )r�   rÙ   rº   rª   Ú
generationÚexcÚctxs          r@   Úupdate_poolzTopology.update_pool»  sä   € àˆØ�Z‰Zñ 	Hà×/Ñ/Ó1ò H�ØŸ™ r§z¡zÑ2�Ø—‘ ¨¯©¯©×(CÑ(CÓ(EÐFÕGñH÷	Hð #*ò 	ÑˆF�JðØ—‘×0Ñ0°Õ<ñ	÷	Hð 	Hûô  ò Ü# C¨¨J¸¸tÓD�Ø×!Ñ! &×"4Ñ"4×"<Ñ"<¸cÔBØûðús$   �A$B#ÂB/Â#B,Â/	C3Â86C.Ã.C3c           	     ó  — | j                   5  | j                  }| j                  j                  «       D ]>  }|j	                  «        t
        rŒ| j                  j                  |j                  «       Œ@ | j                  j                  «       | _        | j                  j                  «       j                  «       D ](  \  }}|| j                  v sŒ|| j                  |   _        Œ* | j                  rE| j                  j	                  «        t
        s%| j                  j                  | j                  «       d| _        d| _        ddd«       | j                   �r| j"                  €J ‚| j$                  €J ‚t'        t(        j*                  i | j                  j,                  | j                  j.                  | j                  j0                  | j                  j2                  «      | _        | j"                  j5                  | j$                  j6                  | j                  | j8                  ff«       | j"                  j5                  | j$                  j:                  | j8                  ff«       t=        j>                  t@        jB                  «      rrtE        t<        tF        jH                  | j8                  tK        «      tK        | j                  «      ¬«       tE        t<        tF        jL                  | j8                  ¬«       | jN                  s| j                   r^| jP                  j	                  «        | jP                  jS                  d«       tU        tW        jX                  | j"                  «      «       yy# 1 sw Y   �Œ6xY w)z¤Clear pools and terminate monitors. Topology does not reopen on
        demand. Any further operations will raise
        :exc:`~.errors.InvalidOperation`.
        FTNrJ   rG   rM   )-r}   rp   r�   r¥   rŠ   r~   r�   rñ   Ú_monitorr¦   ry   ÚitemsrÆ   rŒ   r{   r|   rb   rc   r^   r0   r/   rq   ro   Úmax_set_versionÚmax_election_idrÇ   rj   rr   r[   Úpublish_topology_closedr   rf   rg   rh   r   r   rs   rt   ÚSTOP_TOPOLOGYr`   rd   ÚjoinrA   rˆ   r‰   )r�   Úold_tdrª   rµ   rº   s        r@   rŠ   zTopology.closeÌ  s¹  € ð
 �Z‰Zñ 	 Ø×&Ñ&ˆFØŸ-™-×.Ñ.Ó0ò @�Ø—‘”ÞØ×'Ñ'×.Ñ.¨v¯©Õ?ð@ð !%× 1Ñ 1× 7Ñ 7Ó 9ˆDÔØ#×0Ñ0×DÑDÓF×LÑLÓNò <‘�˜Ø˜dŸm™mÒ+Ø9;�D—M‘M 'Ñ*Õ6ð<ð
 × Ò Ø×!Ñ!×'Ñ'Ô)ÝØ×'Ñ'×.Ñ.¨t×/@Ñ/@ÔAà ˆDŒLØˆDŒL÷)	 ð. ×ÓØ—<‘<Ð+Ð+Ð+Ø—?‘?Ð.Ð.Ð.Ü 3Ü×%Ñ%ØØ×!Ñ!×2Ñ2Ø×!Ñ!×1Ñ1Ø×!Ñ!×1Ñ1Ø×!Ñ!×4Ñ4ó!ˆDÔð �L‰L×Ñà—O‘O×HÑHàØ×)Ñ)Ø×)Ñ)ððô	ð �L‰L×Ñ˜dŸo™o×EÑEÈ×HYÑHYÐG[Ð\Ô]Ü×$Ñ$¤W§]¡]Ô3ÜÜÜ*×:Ñ:Ø×,Ñ,Ü$(¨£LÜ# D×$5Ñ$5Ó6õô ÜÔ&8×&FÑ&FÐSW×SdÑSdõð ×Ò 4×#3Ò#3à×"Ñ"×(Ñ(Ô*Ø×"Ñ"×'Ñ'¨Ô*Ü ¤§¡¨T¯\©\Ó!:Õ;ð	 $4÷s	 ñ 	 ús   �A M:ÁBM:ÃA5M:Í:Nc                ó   — | j                   S rQ   )rp   r  s    r@   rÆ   zTopology.description  s   € à× Ñ Ð rT   c                ó6   — | j                   j                  «       S )z"Pop all session ids from the pool.)r„   Úpop_allr  s    r@   Úpop_all_sessionszTopology.pop_all_sessions  s   € à×!Ñ!×)Ñ)Ó+Ð+rT   c                ó8   — | j                   j                  |«      S )z>Start or resume a server session, or raise ConfigurationError.)r„   Úget_server_session)r�   Úsession_timeout_minutess     r@   r=  zTopology.get_server_session  s   € à×!Ñ!×4Ñ4Ð5LÓMÐMrT   c                ó:   — | j                   j                  |«       y rQ   )r„   Úreturn_server_session)r�   Úserver_sessions     r@   r@  zTopology.return_server_session  s   € Ø×Ñ×0Ñ0°Õ@rT   c                ó@   — t        j                  | j                  «      S )zmA Selection object, initially including all known servers.

        Hold the lock when calling this.
        )r#   Úfrom_topology_descriptionrp   r  s    r@   r  zTopology._new_selection  s   € ô
 ×2Ñ2°4×3DÑ3DÓEÐErT   c                óh  — | j                   rt        d«      ‚| j                  sàd| _        | j                  «        | j                  s| j
                  r| j                  j                  «        | j                  r6| j                  j                  t        v r| j                  j                  «        | j                  j                  r?| j                  t        | j                   d   t#        d| j$                  ddœ«      «      «       | j&                  j)                  «       D ]  }|j                  «        Œ y)z[Start monitors, or restart after a fork.

        Hold the lock when calling this.
        z"Cannot use MongoClient after closeTr   rM   é   )ÚokÚ	serviceIdÚmaxWireVersionN)r|   r   r{   rð   rb   r`   rd   r‹   rŒ   rÆ   rë   r.   rl   rŽ   rú   r"   rz   r   r[   r�   r¥   ©r�   rª   s     r@   r§   zTopology._ensure_opened&  sõ   € ð
 �<Š<Ü"Ð#GÓHÐHà�|Š|ØˆDŒLØ× Ñ Ô"ð ×Ò 4×#7Ò#7Ø×&Ñ&×+Ñ+Ô-ð × Ò  d×&6Ñ&6×&DÑ&DÔH^Ñ&^Ø×!Ñ!×&Ñ&Ô(à�~‰~×+Ò+à×$Ñ$Ü%Ø×,Ñ,¨QÑ/Ü Q°T×5FÑ5FÐZ\Ñ]Ó^óôð —m‘m×*Ñ*Ó,ò 	ˆFØ�K‰K�Mñ	rT   c                ó†  — | j                   j                  |«      }|€y|j                  j                  |j                  |j
                  «      ry|j                  j                  }|j                  }d }|rAt        |d«      r5t        |j                  t        «      r|j                  j                  d«      }t        ||«      S )NTÚdetailsÚtopologyVersion)r�   rí   Ú_poolÚstale_generationÚsock_generationÚ
service_idrÆ   Útopology_versionÚerrorÚhasattrÚ
isinstancerK  ÚdictÚ _is_stale_error_topology_version)r�   rµ   Úerr_ctxrª   Úcur_tvrR  Úerror_tvs          r@   Ú_is_stale_errorzTopology._is_stale_errorG  sž   € Ø—‘×"Ñ" 7Ó+ˆØˆ>àà�<‰<×(Ñ(¨×)@Ñ)@À'×BTÑBTÔUàð ×#Ñ#×4Ñ4ˆØ—‘ˆØˆÙ”W˜U IÔ.Ü˜%Ÿ-™-¬Ô.Ø Ÿ=™=×,Ñ,Ð->Ó?�ä/°¸ÓAÐArT   c                ó�  — | j                  ||«      ry | j                  |   }|j                  }|j                  }| j                  j
                  r|s|j                  sy t        |t        «      r|j                  ry t        |t        «      ry t        |t        t        f«      �r#t        |d«      r|j                  }n0t        |t        «      rdnd }|j                  j                  d|«      }|t         j"                  v rw|t         j$                  v }| j                  j
                  s| j'                  t)        ||¬«      «       |s|j*                  dk  r|j-                  |«       |j/                  «        y |j                  sD| j                  j
                  s| j'                  t)        ||¬«      «       |j-                  |«       y y t        |t0        «      rot        |t2        «      ry | j                  j
                  s| j'                  t)        ||¬«      «       |j-                  |«       |j4                  j7                  «        y y )NÚcodei{'  ©rR  é   )rZ  r�   rR  rP  rl   rŽ   Úcompleted_handshakerT  r   r   r   r   rS  r\  rK  rí   r   Ú_NOT_PRIMARY_CODESÚ_SHUTDOWN_CODESrú   r"   Úmax_wire_versionr¦   Úrequest_checkr   r   r0  Úcancel_check)	r�   rµ   rW  rª   rR  rP  Úerr_codeÚdefaultÚis_shutting_downs	            r@   Ú_handle_errorzTopology._handle_error[  sÎ  € Ø×Ñ ¨Ô1Øà—‘˜wÑ'ˆØ—‘ˆØ×'Ñ'ˆ
ð �>‰>×'Ò'±
À7×C^ÒC^Øä�eœ^Ô,°×1LÒ1Lð
 Ü˜œzÔ*àÜ˜¤Ô1AÐBÕCô �u˜fÔ%Ø Ÿ:™:‘ô $.¨e´_Ô#E™%È4�Ø Ÿ=™=×,Ñ,¨V°WÓ=�Øœ>×<Ñ<Ñ<Ø#+¬~×/MÑ/MÐ#MÐ à—~‘~×3Ò3Ø×(Ñ(Ô):¸7È%Ô)PÔQÙ#¨×(@Ñ(@ÀAÒ(Eà—L‘L Ô,Ø×$Ñ$Õ&Ø×0Ò0à—~‘~×3Ò3Ø×(Ñ(Ô):¸7È%Ô)PÔQà—‘˜ZÕ(ð 1ô ˜Ô0Ô1Ü˜%Ô!6Ô7Øð —>‘>×/Ò/Ø×$Ñ$Ô%6°wÀeÔ%LÔMà�L‰L˜Ô$ð �O‰O×(Ñ(Õ*ð 2rT   c                ój   — | j                   5  | j                  ||«       ddd«       y# 1 sw Y   yxY w)z®Handle an application error.

        May reset the server to Unknown, clear the pool, and request an
        immediate check depending on the error and the context.
        N)r}   rh  )r�   rµ   rW  s      r@   r*  zTopology.handle_errorŸ  s0   € ð �Z‰Zñ 	1Ø×Ñ˜w¨Ô0÷	1÷ 	1ñ 	1ús   �)©2c                ób   — | j                   j                  «       D ]  }|j                  «        Œ y)z3Wake all monitors. Hold the lock when calling this.N)r�   r¥   rc  rI  s     r@   rÎ   zTopology._request_check_all¨  s*   € à—m‘m×*Ñ*Ó,ò 	#ˆFØ× Ñ Õ"ñ	#rT   c           	     ó<  — | j                   j                  «       j                  «       D �]S  \  }}|| j                  vrÅ| j                  j                  || | j                  |«      | j                  ¬«      }d}| j                  r+| j                  �t        j                  | j                  «      }t        || j                  |«      || j                  | j                  |¬«      }|| j                  |<   |j                  «        ŒÚ| j                  |   j                   j"                  }|| j                  |   _        ||j"                  k7  s�Œ"| j                  |   j$                  j'                  |j"                  «       �ŒV t)        | j                  j                  «       «      D ]w  \  }}| j                   j+                  |«      rŒ"|j-                  «        t.        s%| j0                  j3                  |j4                  «       | j                  j7                  |«       Œy y)zrSync our Servers from TopologyDescription.server_descriptions.

        Hold the lock while calling this.
        )ró   Útopologyr×   r‘   N)ró   r×   ÚmonitorÚtopology_idÚ	listenersÚevents)rp   ry   r1  r�   rl   Úmonitor_classÚ_create_pool_for_monitorr`   rc   rˆ   r‰   r-   Ú_create_pool_for_serverr[   r^   r‹   rÆ   Úis_writabler×   Úupdate_is_writablerx   rü   rŠ   r~   r�   rñ   r0  Úpop)r�   rµ   rº   rm  rR   rª   Úwas_writables          r@   rð   zTopology._update_servers­  s²  € ð
  ×,Ñ,×@Ñ@ÓB×HÑHÓJó 	S‰KˆG�RØ˜dŸm™mÑ+ØŸ.™.×6Ñ6Ø')Ø!Ø×6Ñ6°wÓ?Ø&*§n¡nð	 7ó �ð �Ø×'Ò'¨D¯L©LÐ,DÜ"Ÿ;™; t§|¡|Ó4�DÜØ')Ø×5Ñ5°gÓ>Ø#Ø $× 1Ñ 1Ø"Ÿo™oØô�ð *0�—‘˜gÑ&Ø—‘•ð  $Ÿ}™}¨WÑ5×AÑA×MÑM�à57�—‘˜gÑ&Ô2à 2§>¡>Ô1Ø—M‘M 'Ñ*×/Ñ/×BÑBÀ2Ç>Á>ÖRð=	Sô@  $ D§M¡M×$7Ñ$7Ó$9Ó:ò 	+‰OˆG�VØ×$Ñ$×/Ñ/°Õ8Ø—‘”ÝØ×'Ñ'×.Ñ.¨v¯©Ô?Ø—‘×!Ñ! 'Õ*ñ	+rT   c                óz   — | j                   j                  || j                   j                  | j                  ¬«      S )N)Ú	client_id)rl   Ú
pool_classÚpool_optionsr[   r  s     r@   rs  z Topology._create_pool_for_serverÙ  s5   € Ø�~‰~×(Ñ(Ø�T—^‘^×0Ñ0¸D×<MÑ<Mð )ó 
ð 	
rT   c                óH  — | j                   j                  }t        |j                  |j                  |j                  |j
                  |j                  |j                  |j                  d|j                  ¬«	      }| j                   j                  ||d| j                  ¬«      S )NF)	Úconnect_timeoutÚsocket_timeoutÚssl_contextÚtls_allow_invalid_hostnamesÚevent_listenersÚappnameÚdriverÚpause_enabledÚ
server_apiT)Úis_sdamry  )rl   r{  r!   r}  Ú_ssl_contextr€  r]   r‚  rƒ  r…  rz  r[   )r�   rµ   ÚoptionsÚmonitor_pool_optionss       r@   rr  z!Topology._create_pool_for_monitorÞ  s“   € Ø—.‘.×-Ñ-ˆô
  +Ø#×3Ñ3Ø"×2Ñ2Ø×,Ñ,Ø(/×(KÑ(KØ#×4Ñ4Ø—O‘OØ—>‘>ØØ×)Ñ)ô
 
Ðð �~‰~×(Ñ(ØÐ)°4À4×CTÑCTð )ó 
ð 	
rT   c                ó0  ‡— | j                   j                  t        j                  t        j                  fv }|rd}n,| j                   j                  t        j
                  k(  rd}nd}| j                   j                  r|t        u r|ryd|z  S d|› d|› d�S t        | j                   j                  «       «      }t        | j                   j                  «       j                  «       «      }|s-|r&d	j                  || j                  j                  «      S d
|z  S |d   j                  Št        ˆfd„|dd D «       «      }|r=‰€d|z  S |r)t!        |«      j#                  | j$                  «      sd|z  S t'        ‰«      S dj)                  d„ |D «       «      S )zeFormat an error message if server selection fails.

        Hold the lock when calling this.
        zreplica set membersÚmongosesrÙ   zNo primary available for writeszNo %s available for writeszNo z match selector "ú"z)No {} available for replica set name "{}"zNo %s availabler   c              3  ó<   •K  — | ]  }|j                   ‰k(  –— Œ y ­wrQ   r]  )Ú.0rª   rR  s     €r@   ú	<genexpr>z*Topology._error_message.<locals>.<genexpr>  s   øè ø€ ÒG°�v—|‘| uÕ,ÑGùs   ƒrM   NzNo %s found yetz\Could not reach any servers in %s. Replica set is configured with internal hostnames or IPs?ú,c              3  ó`   K  — | ]&  }|j                   sŒt        |j                   «      –— Œ( y ­wrQ   )rR  Ústr)rŽ  rª   s     r@   r�  z*Topology._error_message.<locals>.<genexpr>,  s   è ø€ ÒX°fÈ6Ï<Ë<¤ F§L¡L× 1ÑXùs   ‚.”.)rp   rë   r/   r  r  ÚShardedr"  r'   rx   ry   r¥   Úformatrl   ro   rR  Úallr  Úintersectionrz   r’  r6  )r�   r¶   Úis_replica_setÚserver_pluralÚ	addressesrÙ   ÚsamerR  s          @r@   rË   zTopology._error_messageô  s™  ø€ ð
 ×*Ñ*×8Ñ8Ü×/Ñ/Ü×-Ñ-ð=
ð 
ˆñ
 Ø1‰MØ×Ñ×,Ñ,´×0EÑ0EÒEØ&‰Mà%ˆMà×Ñ×*Ò*àÔ3Ñ3Ù!Ø<à7¸-ÑGÐGà˜]˜OÐ+<¸X¸JÀaÐHÐHä˜T×.Ñ.×BÑBÓDÓEˆIÜ˜4×,Ñ,×@Ñ@ÓB×IÑIÓKÓLˆGÙÙ!àF×MÑMØ%ØŸ™×7Ñ7óð ð
 -¨}Ñ<Ð<ð ˜A‘J×$Ñ$ˆEÜÓG¸7À1À2¸;ÔGÓGˆDÙØ�=à,¨}Ñ<Ð<á!¬#¨i«.×*EÑ*EÀd×FZÑFZÔ*[ðFØHQñRðô
 ˜5“zÐ!à—x‘xÑXÀÔXÓXÐXrT   c                ó  — g }	 | j                   r6|j                  | j                   j                  «       «       | j                   rŒ6t	        j
                  |D �cg c]  }|j                  «       ‘Œ c}ddiŽ y # t        $ r Y Œ=w xY wc c}w )NÚreturn_exceptionsT)r�   rñ   rv  Ú
IndexErrorÚasyncioÚgatherr6  )r�   ÚtasksÚts      r@   r²   zTopology.cleanup_monitors.  su   € Øˆð	Ø×%Ò%Ø—‘˜T×0Ñ0×4Ñ4Ó6Ô7ð ×%Ó%ô 	�‰¨5Ö1 a˜Ÿ™�Ò1ÐJÀTÓJøô ò 	Ùð	üâ1s   „AA8 ÁBÁ8	BÂBc                ót   — d}| j                   sd}d| j                  j                  › d|› | j                  ›d�S )NÚ zCLOSED ú<ú ú>)r{   Ú	__class__Ú__name__rp   )r�   Úmsgs     r@   Ú__repr__zTopology.__repr__7  s>   € ØˆØ�|Š|ØˆCØ�4—>‘>×*Ñ*Ð+¨1¨S¨E°$×2CÑ2CÐ1FÀaÐHÐHrT   c                óš   — | j                   }t        t        |j                  «      «      |j                  |j
                  |j                  fS )z?The properties to use for MongoClient/Topology equality checks.)rl   ÚtupleÚsortedru   ro   r�   Úsrv_service_name)r�   Útss     r@   Úeq_propszTopology.eq_props=  s8   € à�^‰^ˆÜ”f˜RŸX™XÓ&Ó'¨×)<Ñ)<¸b¿g¹gÀr×GZÑGZÐ[Ð[rT   c                ó|   — t        || j                  «      r!| j                  «       |j                  «       k(  S t        S rQ   )rT  r§  r°  ÚNotImplemented)r�   Úothers     r@   Ú__eq__zTopology.__eq__B  s.   € Ü�e˜TŸ^™^Ô,Ø—=‘=“? e§n¡nÓ&6Ñ6Ð6ÜÐrT   c                ó4   — t        | j                  «       «      S rQ   )Úhashr°  r  s    r@   Ú__hash__zTopology.__hash__G  s   € Ü�D—M‘M“OÓ$Ð$rT   )r‘   r4   )rY   ÚNone)rY   Úfloat)NNNN)r¶   ú Callable[[Selection], Selection]r·   r’  r­   úOptional[float]rµ   úOptional[_Address]r¸   úOptional[int]r±   úOptional[list[Server]]rY   zlist[Server]rQ   )r¶   rº  r®   r¹  r·   r’  r¸   r½  rµ   r¼  r±   r¾  rY   úlist[ServerDescription])r¶   rº  r·   r’  r­   r»  rµ   r¼  r±   r¾  r¸   r½  rY   r-   )NN)
rµ   r6   r·   r’  r­   r½  r¸   r½  rY   r-   )FF)ró   r"   rô   rZ   rõ   rZ   rY   r¸  )rÿ   zlist[tuple[str, Any]]rY   r¸  )rµ   r6   rY   zOptional[Server])rµ   r6   rY   rZ   )rY   r¼  )r¶   rº  rY   úset[_Address])rY   rÀ  )rY   zOptional[ClusterTime])r  úOptional[Mapping[str, Any]]rY   r¸  )é   )r  rÍ   rY   r¸  )rY   r¿  )rY   r0   )rY   zlist[_ServerSession])r>  r½  rY   r(   )rA  r(   rY   r¸  )rY   r#   )rµ   r6   rW  r)  rY   rZ   )rµ   r6   rW  r)  rY   r¸  )rµ   r6   rY   r,   )r¶   rº  rY   r’  )rY   r’  )rY   z>tuple[tuple[_Address, ...], Optional[str], Optional[str], str])r³  ÚobjectrY   rZ   )rY   rÍ   )1r¨  Ú
__module__Ú__qualname__Ú__doc__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Š   ÚpropertyrÆ   r;  r=  r@  r  r§   rZ  rh  r*  rÎ   rð   rs  rr  rË   r²   rª  r°  r´  r·  © rT   r@   rC   rC   h   sð  „ Ù4óm4ó^%"óNð 59Ø&*Ø&*Ø8<ð-à2ð-ð ð-ð #2ð	-ð
 $ð-ð $ð-ð  6ð-ð 
ó-ðl 9=ðP#à2ðP#ð ðP#ð ð	P#ð
 $ðP#ð $ðP#ð  6ðP#ð 
!óP#ðl 59Ø&*Ø8<Ø&*ðà2ðð ðð #2ð	ð
 $ðð  6ðð $ðð 
óð: 59Ø&*Ø8<Ø&*ð à2ð ð ð ð #2ð	 ð
 $ð ð  6ð ð $ð ð 
ó ðL 37Ø&*ð
àð
ð ð
ð #0ð	
ð
 $ð
ð 
ó
ðH !Ø&+ð	E%à-ðE%ð ðE%ð  $ð	E%ð
 
óE%ðT !Ø&+ð	Oà-ðOð ðOð  $ð	Oð
 
óOó2ó:3ó*ó(óNóPóHóFó&ó6ó=ô3ó2óó"B<ðH ò!ó ð!ó,óNóAóFóóBBó(B+óH1ó#ó
*+óX
ó

ó,8YótKóIó\ó
ô
%rT   rC   c                  ó,   — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 dd„Zy)r)  z.An error with context for SDAM error handling.c                óJ   — || _         || _        || _        || _        || _        y rQ   )rR  rb  rO  r_  rP  )r�   rR  rb  rO  r_  rP  s         r@   r–   z_ErrorContext.__init__N  s*   € ð ˆŒ
Ø 0ˆÔØ.ˆÔØ#6ˆÔ Ø$ˆ�rT   N)
rR  ÚBaseExceptionrb  rÍ   rO  rÍ   r_  rZ   rP  zOptional[ObjectId])r¨  rÄ  rÅ  rÆ  r–   rÈ  rT   r@   r)  r)  K  s:   „ Ù8ð%àð%ð ð%ð ð	%ð
 "ð%ð 'ô%rT   r)  c                ó:   — | �|€y| d   |d   k7  ry| d   |d   k\  S )z9Return True if the error's topologyVersion is <= current.FÚ	processIdÚcounterrÈ  )Ú
current_tvrY  s     r@   rV  rV  ]  s<   € ð Ð˜XÐ-ØØ�+Ñ (¨;Ñ"7Ò7ØØ�iÑ  H¨YÑ$7Ñ7Ð7rT   c                ój   — | j                   |j                   }}|�|€y|d   |d   k7  ry|d   |d   kD  S )z4Return True if the new topologyVersion is < current.FrÍ  rÎ  )rQ  )Ú
current_sdÚnew_sdrÏ  Únew_tvs       r@   rè   rè   h  sN   € à#×4Ñ4°f×6MÑ6M�€JØÐ˜V˜^ØØ�+Ñ &¨Ñ"5Ò5ØØ�iÑ  6¨)Ñ#4Ñ4Ð4rT   )r;   z"weakref.ReferenceType[queue.Queue]rY   rZ   )rÏ  rÁ  rY  rÁ  rY   rZ   )rÑ  r"   rÒ  r"   rY   rZ   )[rÆ  Ú
__future__r   rž  rg   rž   r9   rÕ   r    rÃ   r£   rˆ   Úpathlibr   Útypingr   r   r   r   r	   r
   Úpymongor   r   r   r   Úpymongo.errorsr   r   r   r   r   r   r   r   r   Úpymongo.hellor   Úpymongo.lockr   r   r   Úpymongo.loggerr   r   r   r   r    Úpymongo.pool_optionsr!   Úpymongo.server_descriptionr"   Úpymongo.server_selectorsr#   r$   r%   r&   r'   Ú"pymongo.synchronous.client_sessionr(   r)   Úpymongo.synchronous.monitorr*   r+   Úpymongo.synchronous.poolr,   Úpymongo.synchronous.serverr-   Úpymongo.topology_descriptionr.   r/   r0   r1   r2   Úbsonr3   Úpymongo.synchronous.settingsr4   Úpymongo.typingsr5   r6   r~   r’  Ú__file__Úparentr¢   rA   rC   r)  rV  rè   rÈ  rT   r@   ú<module>ré     sð   ðñ Cå "ã Û Û 	Û Û Û 
Û Û Û Ý ß H× Hç DÓ D÷
÷ 
õ 
õ  ÷ñ ÷
õ õ -Ý 8÷õ ÷ Rß ?Ý )Ý -÷õ ñ ÝÝ=ß5à€á‘4˜“>×(Ñ(Ó)€ó÷"`%ñ `%÷F%ñ %ð$8Ø+ð8Ø7Rð8à	ó8ô5rT   