ó
    cÛ–i l  ã                   ó�  • S SK r S SKrS SKJr  S SKrS SKrS SKJr  S SK	J
r
  S SK	Jr  S SKJrJrJrJr  S SKJr  S SKJr  S SKJrJr  S S	KJr  S S
KJr  S SKJrJrJr  S SKrS SKrS SK J!r!J"r"  S SK#J$r$  S SK%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-  \" SSS\.SSS9\" SSS\.SSS9\" SSSSSS9\" S S!S"S#9\" S$S%\/" \R`                  " 5       5      S&9\" S'S(S)S"S*S+9\" S,S-S.S"S*S+9\" S/S0S1S2S3S49/r1\" S5S6SS7SS9\" S8S9SS:SS9/r2S;r3 " S< S=\5      r4S> r5S? r6S@ r7 " SA SB\45      r8 " SC SD\95      r: " SE SF\45      r; " SG SH\45      r< " SI SJ\5      r=g)Ké    N)Údefaultdict)Údsdb)Únttime2unix)ÚCommandÚSuperCommandÚCommandErrorÚOption)ÚSamDB)Ú	dot_graph)Údistance_matrixÚCOLOUR_SETS)Úfull_matrix)Úis_colour_wanted)Ú
SCOPE_BASEÚSCOPE_SUBTREEÚLdbError)ÚKCCÚldif_import_export)ÚKCCError)Úget_partition_mapsÚget_partitionÚget_own_cursorÚget_utdvÚget_utdv_edgesÚget_utdv_distancesÚget_utdv_max_distanceÚget_kcc_and_dsasz-Hz--URLz%LDB URL for database or target serverÚURLÚH)ÚhelpÚtypeÚmetavarÚdestz-oz--outputzwrite here (default stdout)ÚFILE)r    r!   r"   Údefaultz
--distancez&Distance matrix graph output (default)ÚformatÚdistanceÚstore_const)r    r#   ÚconstÚactionz--utf8zUse utf-8 Unicode charactersÚ
store_true)r    r*   z--color-schemez,use this colour scheme (implies --color=yes))r    Úchoicesz-Sz--shorten-namesz don't print long common suffixesF)r    r*   r%   z-rz--talk-to-remotezquery other DCs' databasesz--no-keyzomit the explanatory keyÚstore_falseTÚkey)r    r*   r%   r#   z--dotzGraphviz dot outputÚdotz--xdotzattempt to call Graphviz xdotÚxdotÚ__temp__c                   ó”   • \ rS rSrSrSr\R                  \R                  \R                  S.r
\\-   rSrS rSS jrS	 rS
 rS rSrg)ÚGraphCommandéR   z Base class for graphing commandsz%prog [options])Ú	sambaoptsÚversionoptsÚcredopts© c                 óZ   • UR                  5       nUR                  USS9n[        XUS9nU$ )NT©Úfallback_machine)ÚurlÚcredentialsÚlp)Úget_loadparmÚget_credentialsr
   )Úselfr   r5   r7   r>   ÚcredsÚsamdbs          Ú8/usr/lib/python3/dist-packages/samba/netcmd/visualize.pyÚget_dbÚGraphCommand.get_db^   s6   € Ø×#Ñ#Ó%ˆØ×(Ñ(¨¸dÐ(ÐCˆÜ˜!°2Ñ6ˆØˆó    Nc                 ó   • Ub  US:X  a  [        XR                  S9  gU[        L a:  [        R                  " SUS9u  pB[        US5      n[        R                  " U5        O[        US5      nUR                  U5        UR                  5         U$ )aW  Decide whether we're dealing with a filename, a tempfile, or
stdout, and write accordingly.

:param s: the string to write
:param fn: a destination
:param suffix: suffix, if destination is a tempfile

If fn is None or "-", write to stdout.
If fn is visualize.TEMP_FILE, write to a temporary file
Otherwise fn should be a filename to write to.
NÚ-©Úfileúsamba-tool-visualise)ÚprefixÚsuffixÚw)	ÚprintÚoutfÚ	TEMP_FILEÚtempfileÚmkstempÚopenÚosÚcloseÚwrite)rA   ÚsÚfnrN   ÚfdÚfs         rD   rX   ÚGraphCommand.writed   sw   € ð ‰:˜˜s›ä�!Ÿ)™)Ò$Øà”Š?Ü×%Ò%Ð-CØ-3ñ5‰FˆBä�R˜“ˆAÜ�HŠH�R�Lä�R˜“ˆAà	�‰�Œ
Ø	�‰Œ	Øˆ	rG   c                 ó|   • U(       d-  U(       a%  UR                  5       R                  S5      (       a  ggUS:X  a  gU$ )z5Heuristics to work out what output format was wanted.ú.dotr/   r'   r0   )ÚlowerÚendswith)rA   r&   Úoutputs      rD   Úcalc_output_formatÚGraphCommand.calc_output_format�   s4   € ææ˜&Ÿ,™,›.×1Ñ1°&×9Ñ9Øà!à�VÓØàˆrG   c                 óô   • Uc  U R                  U[        5      nOU R                  X5      n[        R                  R	                  SS5      n[
        R                  " XC/5        [        R                  " U5        g )NÚSAMBA_TOOL_XDOT_PATHz/usr/bin/xdot)rX   rR   rV   ÚenvironÚgetÚ
subprocessÚcallÚremove)rA   rY   rb   rZ   r0   s        rD   Ú	call_xdotÚGraphCommand.call_xdot�   sS   € Ø‰>Ø—‘˜AœyÓ)‰Bà—‘˜AÓ&ˆBÜ�z‰z�~‰~Ð4°oÓFˆÜ�Š˜˜
Ô#Ü
�	Š	�"�rG   c                 ó²   • Ub  U$ US;   a  U R                   n[        X R                  S9nU(       d  gS[        R                  R                  SS5      ;   a  gg)	z–Heuristics to work out the colour scheme for distance matrices.
Returning None means no colour, otherwise it should be a colour
from graph.COLOUR_SETSN)rI   N)ÚhintÚ256colorÚTERMÚ zxterm-256color-heatmapÚansi)rQ   r   Úrequested_colourrV   rg   rh   )rA   Úcolor_schemerb   Úwant_colours       rD   Úcalc_distance_color_schemeÚ'GraphCommand.calc_distance_color_scheme˜   sV   € ð Ñ#àÐà�[Ó Ø—Y‘YˆFä& v×4IÑ4IÑJˆÞØð
 œŸ™Ÿ™¨°Ó3Ó3Ø+ØrG   )Nr_   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚsynopsisÚoptionsÚSambaOptionsÚVersionOptionsÚCredentialsOptionsÚtakes_optiongroupsÚCOMMON_OPTIONSÚDOT_OPTIONSÚtakes_optionsÚ
takes_argsrE   rX   rc   rl   rw   Ú__static_attributes__r8   rG   rD   r3   r3   R   sW   † Ù*à €Hà×)Ñ)Ø×-Ñ-Ø×.Ñ.ñÐð
 # [Ñ0€MØ€Jòôò:òõrG   r3   c                 ód   • [         R                  " SU 5      nU(       a  UR                  S5      $ U $ )zBHelper function for sorting and grouping DNs by site, if
possible.z$CN=Servers,CN=\s*([^,]+)\s*,CN=Sitesé   )ÚreÚsearchÚgroup)ÚdnÚms     rD   Úget_dnstr_siter�   ¯   s+   € ô 	�	Š	Ð9¸2Ó>€AÞØ�w‰w�q‹zÐà€IrG   c                 ó   • [        U S   5      $ )zXHelper function for sorting and grouping lists of (DN, ...) tuples
by site, if possible.r   )r�   )Úts    rD   Úget_dnstrlist_siter“   ¹   s   € ô ˜!˜A™$ÓÐrG   c                 óÂ   • SSK Jn  [        U 5      n[        U[        5      (       a  UR	                  S5      n[        U" U5      R                  5       SS SS9S-  nS	U-  $ )
zMGenerate a randomish but consistent darkish colour based on the
given object.r   )Úmd5Úutf8Né   é   )Úbasei z#%06x)Úhashlibr•   ÚstrÚ
isinstanceÚencodeÚintÚ	hexdigest)Úxr•   Útmp_strÚcs       rD   Úcolour_hashr£   ¿   sZ   € õ Ü�!‹f€GÜ�'œ3×ÑØ—.‘. Ó(ˆÜ‰C�‹L×"Ñ"Ó$ R aÐ(¨rÑ2°XÑ=€AØ�Q‰;ÐrG   c                   óL   • \ rS rSrSr\\-   \" SSSSS9/-   r     S
S jr	S	r
g)Úcmd_repséÊ   zrepsFrom/repsTo from every DSAú-pú--partitionúrestrict to this partitionN©r    r%   c                 óð  • UR                  5       nUR                  USS9n[        XU5      u  nnUR                  n[	        UR
                  U
5      n
[        S 5      n0 nU GHH  n[        USS9nU(       a  UR
                  R                  U[        S/S9n[        US   S   S   5      n[        SU< S	U< S
3[        R                  S9   UR                  SU-  UU5        UR!                  XU5        O#UR                  XU5        UR!                  XUUS9  [#        UR%                  5       5      nUU:w  a�  [        S[        R                  S9  UU-
   H  n[        SU-  [        R                  S9  M      [        SU-  [        R                  S9  UU-
   H  n[        SU-  [        R                  S9  M      U Hë  nU	S:X  a  UU:X  a  M  U	S:X  a  UU:w  a  M  UR'                  SU-   5      nUR)                  U5        UU[        UR*                  5      '   UR-                  5       u  nn UR/                  5        H*  u  n!n"U
b  U!U
:X  d  M  UU!   S   R1                  UU"45        M,     U R/                  5        H*  u  n!n"U
b  U!U
:X  d  M  UU!   S   R1                  UU"45        M,     Mí     GMK     / / S./ / S.S.n#[3        UR
                  5      u  n$n%UR/                  5        HÁ  u  n&n!U#R/                  5        H§  u  n'n(U!U'    H˜  u  nn"U%R5                  U&U&5      n)U"R6                   H0  n*U(S   R1                  UU[        U*R8                  5         U)45        M2     U"R:                   H0  n*U(S   R1                  U[        U*R8                  5         UU)45        M2     Mš     M©     MÃ     U R=                  XÒ5      S:X  aÍ  U R?                  UU5      nSSS.n+U#R/                  5        H¡  u  n'n(U(R/                  5        H‡  u  n,n-[        [@        5      n.U- H  u  n/n0n!U.U!   R1                  U/U045        M     U.R/                  5        H;  u  n!n1[C        S U1UUUU[D        S9n2S U+U,   U!-  < S U2< 3n2U RG                  U2U5        M=     M‰     M£     g / n3/ n4/ n5[#        5       n60 n7[#        5       n8U#R/                  5        Hå  u  n'n9U9R/                  5        HË  u  n,n-U- H¿  u  n/n0n!U7RI                  U![K        U!U,45      5      n:U'S:X  a  S!OS"n;U,S:X  a  S#OS$n<U6RM                  U/5        U6RM                  U05        U5R1                  U/U045        U3R1                  U:5        S%U;< S&U<< 3n=U4R1                  U=5        U8RM                  U!S'U,RO                  5       -   U:U=45        MÁ     MÍ     Mç     / n>U(       a\  [Q        U85       H+  u  n!n,n:n;U>R1                  S(S)U:< S*U;< 3U!< S+U,< 345        M-     U>R1                  S,5        U>R1                  S-5        [S        U6U5SU3U4UU>S.9n2US/:X  a  U RU                  U2U5        g U RG                  U2U5        g ! [         a-  n[        SU< S	U< S
3[        R                  S9   S nAGM  S nAff = f)0NTr:   c                  ó    • [        [        5      $ )N)r   Úlistr8   rG   rD   Ú<lambda>Úcmd_reps.run.<locals>.<lambda>ã   s	   € ¤k´$Ô&7rG   )ÚreadonlyÚdNSHostName©ÚscopeÚattrsr   zAttempting to contact ldap://ú (Ú)rJ   ú	ldap://%súCould not contact ldap://)Úforced_local_dsazfound extra DSAs:z   %sz(missing DSAs (known locally, not by %s):ÚothersrA   úCN=NTDS Settings,ÚcurrentÚneeded)ÚtoÚfrom)r½   r¼   r¿   r¾   r'   zRepsFrom objects for %szRepsTo objects for %s)r¿   r¾   )r–   ÚcolourÚshorten_namesÚgenerate_keyÚgrouping_functionÚ
ÚdottedÚsolidrU   Úemptyzstyle="z"; arrowhead=ÚrepsFzcolor="z"; Ú )Fz style="dotted"; arrowhead="open"zrepsFromTo is needed)Fzstyle="solid"; arrowhead="open"zrepsFromTo currently exists)ÚdirectedÚedge_colorsÚedge_stylesrÁ   Ú	key_itemsr0   )+r?   r@   r   Úunix_nowr   rC   r   r   rŒ   r   r›   rP   ÚsysÚstderrÚ
load_samdbr   ÚrunÚsetÚ	list_dsasÚget_dsaÚtranslate_ntdsconnÚdsa_guidÚget_rep_tablesÚitemsÚappendr   rh   Úrep_repsFromÚsource_dsa_obj_guidÚ
rep_repsTorc   rw   r­   r   r�   rX   Ú
setdefaultr£   ÚaddÚtitleÚsortedr   rl   )?rA   r   rb   rÁ   r.   Útalk_to_remoter5   r7   r6   ÚmodeÚ	partitionru   r–   r&   r0   r>   rB   Ú	local_kccÚdsasrÎ   Únc_repsÚguid_to_dnstrÚdsa_dnÚkccÚresÚdns_nameÚeÚdsas_from_hereÚdsaÚ	remote_dnÚ
remote_dsar¢   ÚnÚpartÚrepÚ	all_edgesÚshort_partitionsÚlong_partitionsÚpartnameÚstateÚ	edgelistsÚ
short_nameÚrÚheader_stringsÚ	directionrÙ   Ú
part_edgesÚsrcr#   ÚedgesrY   Úedge_coloursrÌ   Ú	dot_edgesÚdot_verticesÚused_coloursÚkey_setÚedgelistrÀ   Ú	linestyleÚarrowÚstylerÍ   s?                                                                  rD   rÒ   Úcmd_reps.runÒ   s‹  € ð ×#Ñ#Ó%ˆØ×(Ñ(¨¸dÐ(ÐCˆÜ*¨1°%Ó8‰ˆ	�4Ø×%Ñ%ˆä! )§/¡/°9Ó=ˆ	ô
 Ñ7Ó8ˆàˆô
 ˆFÜ�h¨Ñ.ˆCÞØ—o‘o×,Ñ,¨VÜ3=Ø4A°?ð -ð D�ô ˜s 1™v mÑ4°QÑ7Ó8�ÝÛ£ð)äŸ:™:ò'ðØ—N‘N ;°Ñ#9¸2¸uÔEð —‘˜˜uÕ%à—‘˜q eÔ,Ø—‘˜˜u°v�Ñ>ä  §¡£Ó1ˆNØ�~Ó%ÜÐ)´·
±
Ò;Ø*¨TÔ1�CÜ˜' C™-¬c¯j©jÔ9ñ 2äÐ@À6ÑIÜŸ:™:ò'à  >Ô1�CÜ˜' C™-¬c¯j©jÔ9ñ 2ó ,�	Ø˜8Ó#¨	°VÓ(;ÙØ˜V“^¨	°VÓ(;Ùà Ÿ[™[Ð)<¸yÑ)HÓI�
Ø×&Ñ& zÔ2Ø:C�œc *×"5Ñ"5Ó6Ñ7ð "×0Ñ0Ó2‘��1Ø!"§¡¦‘I�D˜#Ø Ñ(¨D°IÕ,=Ø ™ iÑ0×7Ñ7¸À¸ÖFñ "+ð "#§¡¦‘I�D˜#Ø Ñ(¨D°IÕ,=Ø ™ hÑ/×6Ñ6¸À°}ÖEó "+ô ,ñA ðf ')°"Ñ5Ø')°2Ñ 6ñ8ˆ	ô -?¸y¿¹Ó,OÑ)Ð˜/à%Ÿm™mžo‰NˆH�dØ$-§O¡OÖ$5Ñ ��yØ#'¨¤;‘K�F˜CØ!0×!4Ñ!4°X¸xÓ!H�JØ ×-Ô-˜Ø! &Ñ)×0Ñ0Ø#Ø*¬3¨q×/DÑ/DÓ+EÑFØ'ð)ö*ñ .ð
 !Ÿ^œ^˜Ø! $™×.Ñ.Ø*¬3¨q×/DÑ/DÓ+EÑFØ#Ø'ð)ö*ó ,ó $/ó %6ñ .ð$ ×"Ñ" 6Ó2°jÓ@Ø×:Ñ:¸<Ø;AóCˆLð 2Ø-ñˆNð %.§O¡OÖ$5Ñ ��yØ(1¯©Ö(9Ñ$�I˜uÜ!,¬TÓ!2�JÛ+0™˜˜T 4Ø" 4Ñ(×/Ñ/°°d°Ö<ñ ,1à'1×'7Ñ'7Ö'9™˜˜eÜ+¨D°%Ø15Ø3?Ø:GØ9<Ü>LñN™ð +9¸Ñ*CÀdÔ*JÊAÐN˜ØŸ
™
 1 fÖ-ó (:ó	 ):ñ %6ð àˆØˆØˆ	Ü“uˆØˆÜ“%ˆØ(Ÿ™Ö0‰OˆE�8Ø$,§N¡NÖ$4Ñ �	˜5Û',‘O�C˜˜tØ)×4Ñ4°dÜ5@À$ØBKðBMó 6NóO�Fð -2°XÓ,=¡À7�IØ&/°4Ó&7™F¸W�EØ ×$Ñ$ SÔ)Ø ×$Ñ$ TÔ*Ø×$Ñ$ c¨4 [Ô1Ø ×'Ñ'¨Õ/Û:CÂUÐK�EØ×&Ñ& uÔ-Ø—K‘K  v°	·±Ó0AÑ'AØ!'¨ð!0ö 1ó (-ó %5ñ  1ð" ˆ	ÞÜ6<¸W¶oÑ2��i ¨Ø× Ñ ¡%Û6<ºiÐ"HÛ-1²9Ð"=ð"?ö @ñ 7Fð ×Ñð 6ô 7ð ×Ñð =ô >ô �l IØ#Ø".Ø"-Ø$1Ø )ñ+ˆð �VÓØ�N‰N˜1˜fÕ%à�J‰J�q˜&Õ!øôI  ó ÝÃË!ÐLÜ"Ÿz™zò+æûðús   ÃX>Ø>
Y5Ù!Y0Ù0Y5r8   )NNFTFNNNrA   NNNNF)ry   rz   r{   r|   r}   r„   r…   r	   r†   rÒ   rˆ   r8   rG   rD   r¥   r¥   Ê   sB   † Ù$à" [Ñ0Ùˆt�]Ð)EØñ	ð4ñ €Mð
 6;Ø%*Ø7;Ø6:Ø).÷	h"rG   r¥   c                   ó$   • \ rS rSrSrS rS rSrg)ÚNTDSConni}  zTCollects observation counts for NTDS connections, so we know
whether all DSAs agree.c                 óF   • SU l         SU l        SU l        Xl        X l        g )Nr   F)ÚobservationsÚsrc_attestsÚdest_attestsr   r#   )rA   r   r#   s      rD   Ú__init__ÚNTDSConn.__init__€  s$   € ØˆÔØ ˆÔØ!ˆÔØŒØ�	rG   c                 óˆ   • U =R                   S-  sl         XR                  :X  a  SU l        XR                  :X  a  SU l        g g )NrŠ   T)r  r   r  r#   r  )rA   Úattesters     rD   ÚattestÚNTDSConn.attest‡  s<   € Ø×Ò˜QÑÕØ—x‘xÓØ#ˆDÔØ—y‘yÓ Ø $ˆDÕð !rG   )r#   r  r  r   r  N)ry   rz   r{   r|   r}   r  r  rˆ   r8   rG   rD   r  r  }  s   † ñòõ%rG   r  c                   óR   • \ rS rSrSr\\-   \" SSSS9/-   rS r	      S
S jr
S	rg)Úcmd_ntdsconni�  zDraw the NTDSConnection graphz--importldifz#graph from samba_kcc generated ldifNrª   c                 ó¨   • [         R                  " SS9n[        R                  R	                  US5      nX@l        [        R                  " XBU5      nU$ )NrL   )rM   zimported.ldb)rS   ÚmkdtemprV   ÚpathÚjoinÚ_tmp_fn_to_deleter   Úldif_to_samdb)rA   Úldifr>   ÚdrZ   rC   s         rD   Úimport_ldif_dbÚcmd_ntdsconn.import_ldif_db–  sD   € Ü×ÒÐ$:Ñ;ˆÜ�W‰W�\‰\˜!˜^Ó,ˆØ!#ÔÜ"×0Ò0°¸Ó>ˆØˆ	rG   c                 ór  • UR                  5       nUc  UR                  USS9nOS nU R                  XÎ5      n[        XU5      u  nnUR                  R                  SS5      S   n[        5       n/ nU GH8  nU(       ac  UR                  R                  U[        S/S9nUS   S   S   n U R                  SU-  UU5      nUR                  5       nUR!                  5       nOU R                  XU5      nSU-   nUnUR                  U[        S/S9nUS   S   S   S:H  nUR#                  UU(       a  SOS45        UR                  U[$        SS/S/S9nU HR  n['        UR(                  5      nUUR+                  S5      S-   S  nUR-                  ['        US   S   5      UU45        MT     GM;     U(       aX  XR.                  :X  aI  [0        R2                  " U5        [0        R4                  " [0        R6                  R9                  U5      5        0 n U H5  u  n!n"n#U!U"4n$U$U ;   a  U U$   nO[;        U$6 nUU U$'   UR=                  U#5        M7     [?        [A        U5      6 u  nn%U RC                  X²5      S:X  Ga  U RE                  U	U5      n	[F        U	   n&U&RI                  SS5      n'U&RI                  SS5      n(/ n)SU%;   a  U)R-                  S5        U(       d  U RK                  5       n*SU-  n+GO@/ n*/ n,/ n-/ n.U RM                  5        Hƒ  u  nn/U/RN                  (       a7  U*R-                  U5        U/RP                  (       d  U,R-                  U5        ML  MN  U/RP                  (       a  U-R-                  U5        Mr  U.R-                  U5        M…     Sn+U.(       a.  U)R-                  S5        U. H  nU)R-                  SU-  5        M     U-(       a.  U)R-                  S5        U- H  nU)R-                  SU-  5        M     U,(       a.  U)R-                  S5        U, H  nU)R-                  SU-  5        M     [S        UU*U
U	UU[T        U%S 9n0SRW                  U)5      n)U)(       a  S!U'< S"U(< S!U)< 3n)U RY                  S!U+< S#U0< S!U)< 3U5        g / n1/ n2/ n3/ n4[[        U5      n5[A        U RM                  5       5       GH  u  n$nU1R-                  U$5        UR\                  U5:X  d  U(       d$  U2R-                  S$5        U3R-                  S5        MS  URN                  (       aH  U3R-                  S5        URP                  (       a  U2R-                  S%5        M™  U2R-                  S&5        M¬  URP                  (       a$  U2R-                  S'5        U3R-                  S(5        Má  U2R-                  S'5        U3R-                  S)5        GM     / n6U(       ag  U6R-                  S*5        S+ H%  u  n7n8U7U2;   d  M  U6R-                  S,S-U7-  U845        M'     S. H%  u  n9n8U9U3;   d  M  U6R-                  S,S/U9-  U845        M'     U(       a  S0n+OSU-  n+[_        [A        U5      U1SU+U2U4U3UU6S19	n0US2:X  a  U Ra                  U0U5        g U RY                  U0U5        g ! [         a-  n[        S	U< S
U< S3[        R                  S9   S nAGM=  S nAff = f)3NTr:   Ú,rŠ   r±   r²   r   r·   r¸   rµ   r¶   rJ   r»   zmsDS-isRODCÚTRUEÚRODCrr   z(objectClass=nTDSConnection)Ú
fromServerzsearch_options:0:2)r³   Ú
expressionr´   Úcontrolsr'   ÚheaderÚresetz/No outbound connections are expected from RODCszNTDS Connections known to %sz-NTDS Connections known to each destination DCzTThe following connections are alleged by DCs other than the source and destination:
z  %s -> %s
zbThe following connections are alleged by DCs other than the destination but including the source:
zRThe following connections (included in the chart) are not known to the source DC:
)r–   rÀ   rÁ   rÂ   rÃ   Úrow_commentsrÄ   ÚNOTESú

z#000000ú#0000ffú#cc00ffz#ff0000ústyle=dashedústyle=dotted)Fzcolor="#000000"zNTDS Connection))r0  zmissing from some DCs)r1  zmissing from source DCFz
color="%s"))r2  zunknown to destination)r3  z!unknown to source and destinationzcolor="#ff0000; %s"zNTDS Connections)rÊ   rà   rË   Úedge_labelsrÌ   rÁ   rÍ   r0   )1r?   r@   r"  r   Úmy_dsa_dnstrÚsplitrÓ   rC   rŒ   r   rE   r   rP   rÏ   rÐ   Úget_dsServiceNameÚ	domain_dnrß   r   r›   rŽ   ÚindexrÚ   r  rV   rk   Úrmdirr  Údirnamer  r  Úziprá   rc   rw   r   rh   ÚkeysrÙ   r  r  r   r“   r  rX   Úlenr  r   rl   ):rA   r   rb   rÁ   r.   râ   r5   r7   r6   ru   r–   r&   Ú
importldifr0   r>   rB   rå   ræ   Úlocal_dsa_dnÚverticesÚattested_edgesré   rë   rì   rC   rí   Úntds_dnrŽ   Úis_rodcÚmsgÚmsgdnÚdest_dnr  r   r#   r  ÚkÚrodc_statusÚcoloursÚc_headerÚc_resetÚepilogÚgraph_edgesrà   Úsource_deniesÚdest_deniesÚ	both_denyÚconnrY   r  r  rÌ   r4  Ú	n_serversrÍ   rÀ   Údescr
  s:                                                             rD   rÒ   Úcmd_ntdsconn.run�  s”  € ð ×#Ñ#Ó%ˆØÑØ×,Ñ,¨RÀ$Ð,ÐG‰EàˆEØ×#Ñ# JÓ3ˆAä*¨1°%Ó8‰ˆ	�4Ø ×-Ñ-×3Ñ3°C¸Ó;¸AÑ>ˆÜ“5ˆØˆÜˆFÞØ—o‘o×,Ñ,¨VÜ3=Ø4A°?ð -ð D�ð ˜q™6 -Ñ0°Ñ3�ðØ ŸK™K¨°hÑ(>À	Ø(0ó2�Eð  ×1Ñ1Ó3�Ø—_‘_Ó&‘àŸ™ A°(Ó;�Ø-°Ñ6�Ø�à—,‘,˜wÜ%/Ø&3 _ð ð 6ˆCð ˜!‘f˜]Ñ+¨AÑ.°&Ñ8ˆGà�L‰L˜'®W¡6¸"Ð=Ô>à—,‘,˜rÜ%2Ø*HØ&2 ^ð *>Ð(>ð ð !ˆCó �Ü˜CŸF™F›�Ø §¡¨CÓ 0°1Ñ 4Ð 5Ð6�Ø×%Ñ%¤s¨3¨|Ñ+<¸QÑ+?Ó'@Ø'.°ð'9ö :ô ñM öX ˜!×5Ñ5Ó5Ü�IŠI�aŒLÜ�HŠH”R—W‘W—_‘_ QÓ'Ô(ð ˆÛ#1ÑˆC��xØ�d�ˆAØ�E‹zØ˜!‘H‘ä˜a�L�Ø��a‘Ø�H‰H�XÖñ $2ô !$¤V¨HÓ%5Ð 6Ñˆ�+à×"Ñ" 6Ó2°jÔ@Ø×:Ñ:¸<Ø;AóCˆLä! ,Ñ/ˆGØ—{‘{ 8¨RÓ0ˆHØ—k‘k '¨2Ó.ˆGàˆFØ˜Ó$Ø—‘ÐOÔPæ!ð $Ÿj™j›l�Ø6¸ÑE’ð !�Ø "�Ø �Ø�	Ø$Ÿ{™{ž}‘G�A�tØ×(×(Ø#×*Ñ*¨1Ô-Ø#×/×/Ø)×0Ñ0°Ö3ñ  0à×)×)Ø#×*Ñ*¨1Ö-à!×(Ñ(¨Ö+ñ  -ð H�æØ—M‘Mð #3ô 4ó '˜ØŸ™ n°qÑ&8Ö9ñ 'æØ—M‘Mð #<ô =ó )˜ØŸ™ n°qÑ&8Ö9ñ )æ Ø—M‘Mð #Fô Gó +˜ØŸ™ n°qÑ&8Ö9ñ +ô   ¨+Ø%)Ø'3Ø.;Ø-0Ü2DØ-8ñ:ˆAð —W‘W˜V“_ˆFßÛ.6Û.5Ú.4ð6�ð �JŠJ«5Û+,Ú+1ð3à4:ô<ð àˆ	ØˆØˆØˆÜ˜“Iˆ	Ü˜5Ÿ;™;›=×)‰DˆAˆqØ×Ñ˜QÔØ�~‰~ Ó*¶.Ø×#Ñ# IÔ.Ø×"Ñ" 2Ö&Ø——Ø×"Ñ" 2Ô&Ø—=—=Ø ×'Ñ'¨	Ö2à ×'Ñ'¨	Ö2Ø——Ø×#Ñ# IÔ.Ø×"Ñ" >Ö2à×#Ñ# IÔ.Ø×"Ñ" >×2ñ! *ð$ ˆ	ÞØ×Ñð 1ô 2ó!H‘�˜à˜\Õ)Ø×$Ñ$ e¨\¸FÑ-BÀDÐ%IÖJñ!Hó
 G‘��tð ˜KÕ'Ø×$Ñ$ eØ&;¸eÑ&CØ&*ð&,ö -ñ	 Gö Ø&‰Eà2°\ÑAˆEä”f˜XÓ&¨	Ø#Ø!Ø".Ø"-Ø"-Ø$1Ø )ñ+ˆð �VÓØ�N‰N˜1˜fÕ%à�J‰J�q˜&Õ!øôE  ó ÝÃË!ÐLÜ"Ÿz™zò+æûðús   Â+Y?Ù?
Z6Ú	!Z1Ú1Z6)r  )NNFTFNNNNNNNF)ry   rz   r{   r|   r}   r„   r…   r	   r†   r"  rÒ   rˆ   r8   rG   rD   r  r  �  sH   † Ù#Ø" [Ñ0Ùˆ~Ð$IØñ	ð4ñ €Mò
ð 6;Ø%*Ø7;ØØ/3Ø÷]"rG   r  c            	       óX   • \ rS rSrSr\\" SSSSS9\" SS	\S
S9/-   r      SS jr	Sr
g)Úcmd_uptodatenessi}  zvisualize uptodateness vectorsr§   r¨   r©   Nrª   z--max-digitsé   z,display this many digits of out-of-date-ness)r%   r!   r    c                 óˆ  • U(       d  [        SU R                  S9  g UR                  5       nUR                  USS9n[	        UUU5      u  nnUR
                  U l        [        U R
                  U5      n[        U R
                  5      u  nnU R                  U	U5      n	UR                  5        H‘  u  nnUUS 4;  a  M  [        UUUUU5      n[        UU5      n[        U5      n[        U[        [        U5      5      5      nUS:  a  SnSU-  n[!        UU
U	UU["        UUSSS	9
nU R%                  S
U< SU< 3U5        M“     g )Nz>this won't work without talking to the remote servers (use -r)rJ   Tr:   rŠ   é
   ÚDCzout-of-date-ness)	r–   rÀ   rÁ   rÂ   rÃ   Úcolour_scaleÚdigitsÚylabelÚxlabelrÄ   r/  )rP   rQ   r?   r@   r   rC   r   r   rw   rÙ   r   r   r   Úminr>  r›   r   r�   rX   )rA   r   rb   rÁ   r.   râ   r5   r7   r6   ru   r–   r&   r?  r0   rä   Ú
max_digitsr>   rB   rå   ræ   rö   r÷   Ú	part_nameÚpart_dnÚ
utdv_edgesÚ	distancesÚmax_distancer]  Úc_scalerY   s                                 rD   rÒ   Úcmd_uptodateness.run‡  sQ  € ö Üð Ø#'§9¡9ò.àð ×#Ñ#Ó%ˆØ×(Ñ(¨¸dÐ(ÐCˆÜ*¨1¨b°%Ó8‰ˆ	�4Ø—_‘_ˆŒ
Ü! $§*¡*¨iÓ8ˆ	ä,>¸t¿z¹zÓ,JÑ)Ð˜/Ø×6Ñ6°|Ø7=ó?ˆð #3×"8Ñ"8Ö":ÑˆI�wØ ¨$ Ó/Ùä'¨	°4¸À"ÀeÓLˆJä*¨:°tÓ<ˆIä0°Ó;ˆLä˜¤S¬¨\Ó):Ó%;Ó<ˆFØ˜‹zØ�Ø˜F‘lˆGä˜IØ!%Ø#/Ø*7Ø),Ü.<Ø)0Ø#)Ø#'Ø#5ñ	7ˆAð �JŠJ£y²!Ð4°fÖ=ò5 #;rG   )rC   )NNFTFNNNNFNNFNrX  )ry   rz   r{   r|   r}   r„   r	   rž   r†   rÒ   rˆ   r8   rG   rD   rW  rW  }  sQ   † Ù(à"Ùˆt�]Ð)EØñ	áˆ~ q¨sØBñ	Dð&ñ €Mð 6;Ø%*Ø7;ØØ04Ø34÷1>rG   rW  c                   ó¤   • \ rS rSrSr0 r\" 5       R                  5        H+  u  rr	\R                  S5      (       d  M  \	" 5       \\SS '   M-     Srg)Úcmd_visualizei»  z:Produces graphical representations of Samba network state.Úcmd_é   Nr8   )ry   rz   r{   r|   r}   ÚsubcommandsÚglobalsrÙ   rH  ÚvÚ
startswithrˆ   r8   rG   rD   rj  rj  »  sB   † ÙDØ€Ká“	—‘Ö!‰ˆˆ1Ø�<‰<˜×ÓÙ!"£ˆK˜˜!˜"˜Óô "rG   rj  )>rV   rÏ   Úcollectionsr   ri   rS   Úsamba.getoptÚgetoptr   Úsambar   r   Úsamba.netcmdr   r   r   r	   Úsamba.samdbr
   Úsamba.graphr   r   r   r   Úsamba.colourr   Úldbr   r   r   Útimer‹   Ú	samba.kccr   r   Úsamba.kcc.kcc_utilsr   Úsamba.uptodatenessr   r   r   r   r   r   r   r   r›   r­   r=  r„   r…   rR   r3   r�   r“   r£   r¥   Úobjectr  r  rW  rj  r8   rG   rD   Ú<module>r     s«  ðó( 
Û 
Ý #Û Û Ý Ý Ý ß DÓ DÝ Ý !ß 4Ý #Ý )ç 3Ñ 3Û Û 	ß -Ý (÷	÷ 	ó 	ñ ˆ4�ÐFØ˜U¨ñ.á
ˆ4�Ð"?Ø˜V¨Tñ3á
ˆ<ÐFØ 
°=ñBá
ˆ8Ð8Øñ á
Ðð $;á˜×(Ò(Ó*Ó+ñ-ñ ˆ4Ð"Ø2Ø¨ñ/ñ ˆ4Ð#Ð*FØ¨ñ/á
ˆ:Ð6Ø¨°Eñ;ð#€ñ, ˆ7Ð.°XØ˜}ñ.á
ˆ8Ð9ÀØ ñ/ð€ð €	ôZ�7ô Zòzò òôp"ˆ|ô p"ôf%ˆvô %ô$k"�<ô k"ô\;>�|ô ;>ô|%�Lõ %rG   