
    Vhhx                     D   d dl mZmZmZ eZd dlZd dlZd dlZd dl	Z	dZ
	 d dlZdZd dlmZmZ d dlmZ d Zd Zd	 Zd
 Zd Zd ZddZddZd Zd ZddZd Z d Z!ddZ"ddZ#ddZ$d Z% G d de&      Z' G d de&      Z(y# e$ r dZ e	j                         Z
Y xw xY w)    )absolute_importdivisionprint_functionNTF)env_fallbackmissing_required_lib)__version__c                      t        t        dddgddt        dgf      t        ddd	gdd
t        dgf      t        dddgddt        dgf      t        dddt        dgf            S )NstrhostpoolF	localhostXENSERVER_HOST)typealiasesrequireddefaultfallbackuseradminrootXENSERVER_USERpasspwdTXENSERVER_PASSWORD)r   r   r   no_logr   boolXENSERVER_VALIDATE_CERTS)r   r   r   r   )hostnameusernamepasswordvalidate_certs)dictr        t/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/module_utils/xenserver.pyxenserver_common_argument_specr&      s    5%v.$) ,/?.@A	 5%w/$$ ,/?.@A	C
 5%uo$! ,/C.DE	G
 %*$(&25O4P%QS# r$   c                 2    ddddd}|j                  |       S )z4Maps XAPI VM power states to module VM power states.	poweredon
poweredoff	suspendedpaused)runninghaltedr*   r+   get)power_statemodule_power_state_maps     r%   xapi_to_module_vm_power_stater2   4   s+      	 "%%k22r$   c                 6    ddddddd}|j                  |       S )z4Maps module VM power states to XAPI VM power states.r,   r-   r*   )r(   r)   	restartedr*   shutdownguestrebootguestr.   )r0   vm_power_state_maps     r%   module_to_xapi_vm_power_stater8   @   s1      !  !!+..r$   c                     | j                  d      }t        |      dk7  ry|D ]+  }|j                         s yt        |      }|dk  s|dkD  s+ y y)zValidates given string as IPv4 address for given string.

    Args:
        ip_addr (str): string to validate as IPv4 address.

    Returns:
        bool: True if string is valid IPv4 address, else False.
    .   Fr      T)splitlenisdigitint)ip_addrip_addr_splitip_addr_octetip_addr_octet_ints       r%   is_valid_ip_addrrE   N   sc     MM#&M
=Q& $$&.q $5$; r$   c                     | j                  d      }t        |      dk7  ryg d}|D ]  }||vs y |d   dk7  r|d   dk7  s|d	   dk7  s|d
   dk7  ry|d   dk7  r|d	   dk7  s|d
   dk7  ry|d	   dk7  r	|d
   dk7  ryy)zValidates given string as IPv4 netmask.

    Args:
        ip_netmask (str): string to validate as IPv4 netmask.

    Returns:
        bool: True if string is valid IPv4 netmask, else False.
    r:   r;   F)	0128192224240248252254255r   rO      rG         T)r=   r>   )
ip_netmaskip_netmask_splitvalid_octet_valuesip_netmask_octets       r%   is_valid_ip_netmaskrW   h   s     "'',
!V, #55 e#)9!)<)CGWXYGZ^aGaeuvwex|e	!		%+;A+>#+EIYZ[I\`cIc	!		%*:1*=*Dr$   c                 R    | j                         syt        |       }|dk  s|dkD  ryy)zValidates given string as IPv4 prefix.

    Args:
        ip_prefix (str): string to validate as IPv4 prefix.

    Returns:
        bool: True if string is valid IPv4 prefix, else False.
    Fr       Tr?   r@   )	ip_prefixip_prefix_ints     r%   is_valid_ip_prefixr]      s1     	NMqMB.r$   c                     |rd}nt        |       }|r=dj                  dD cg c]"  }t        ddt        |       z
  z  |z	  dz        $ c}      S yc c}w )ab  Converts IPv4 prefix to netmask.

    Args:
        ip_prefix (str): IPv4 prefix to convert.
        skip_check (bool): Skip validation of IPv4 prefix
            (default: False). Use if you are sure IPv4 prefix is valid.

    Returns:
        str: IPv4 netmask equivalent to given IPv4 prefix if
        IPv4 prefix is valid, else an empty string.
    Tr:   )         r   l    rY   r<    )r]   joinr
   r@   )r[   
skip_checkip_prefix_validis       r%   ip_prefix_to_netmaskrg      s[     ,Y7xxYghTUjR#i.-@AQF$NOhii is   'Ac                     |rd}nt        |       }|rRt        t        | j                  d      D cg c]%  }t	        t        |            j                  d      ' c}            S yc c}w )ag  Converts IPv4 netmask to prefix.

    Args:
        ip_netmask (str): IPv4 netmask to convert.
        skip_check (bool): Skip validation of IPv4 netmask
            (default: False). Use if you are sure IPv4 netmask is valid.

    Returns:
        str: IPv4 prefix equivalent to given IPv4 netmask if
        IPv4 netmask is valid, else an empty string.
    Tr:   1rb   )rW   r
   sumr=   binr@   count)rS   rd   ip_netmask_validrf   s       r%   ip_netmask_to_prefixrn      s]     .z:3
8H8H8MN1CF))#.NOPP Os   *A&c                    | j                         } | j                  d      }|d   dk(  r|j                  d       |d   dk(  r|j                  d       t        |      dkD  ry|j	                  d      dkD  ry|j	                  d      dk(  r|j                  d       nt        |      dk7  ryt        j                  d      }|D ]  }t        |j                  |            r y y	)
zValidates given string as IPv6 address.

    Args:
        ip6_addr (str): string to validate as IPv6 address.

    Returns:
        bool: True if string is valid IPv6 address, else False.
    :r   rb   ra   FrP   z^[0-9a-f]{1,4}$T)
lowerr=   popr>   rl   removerecompiler   match)ip6_addrip6_addr_splitip6_addr_hextet_regexip6_addr_hextets       r%   is_valid_ip6_addrr|      s     ~~H^^C(NaB1bR2
>QB!#			b	!Q	&b!~!#JJ'89) )//@A r$   c                 R    | j                         syt        |       }|dk  s|dkD  ryy)zValidates given string as IPv6 prefix.

    Args:
        ip6_prefix (str): string to validate as IPv6 prefix.

    Returns:
        bool: True if string is valid IPv6 prefix, else False.
    Fr      TrZ   )
ip6_prefixip6_prefix_ints     r%   is_valid_ip6_prefixr      s1     _N^c1r$   c                    t         j                  |       }|dv rd}n|dk(  rd}n
|dk(  rd}n|}d}|r	 |j                  d|z  |f      }|S |ri	 |j                  d|z  |f      }

s|rL| j                  ||d|d
       |S t        |
      dkD  r| j                  |d|d|d       |S |
d   }|S | j                  |d|d       |S # t        j                  $ r'}	|r| j                  ||d	|d
       Y d}	~	|S d}	~	ww xY w# t        j                  $ r)}	| j                  d|	j                  z         Y d}	~	d}	~	ww xY w)aK  Finds and returns a reference to arbitrary XAPI object.

    An object is searched by using either name (name_label) or UUID
    with UUID taken precedence over name.

    Args:
        module: Reference to Ansible module object.
        name (str): Name (name_label) of an object to search for.
        uuid (str): UUID of an object to search for.
        obj_type (str): Any valid XAPI object type. See XAPI docs.
        fail (bool): Should function fail with error message if object
            is not found or exit silently (default: True). The function
            always fails if multiple objects with same name are found.
        msg_prefix (str): A string error messages should be prefixed
            with (default: "").

    Returns:
        XAPI reference to found object or None if object is not found
        and fail=False.
    )templatesnapshotVMzhome serverr   z	ISO imageVDINz%s.get_by_uuidz with UUID 'z' not found!msgz%s.get_by_name_labelXAPI ERROR: %sz with name 'rP   z	multiple zs with name 'z' found! Please use UUID.r   z#no valid name or UUID supplied for !)XAPIconnectxenapi_requestXenAPIFailure	fail_jsondetailsr>   )modulenameuuidobj_typefail
msg_prefixxapi_sessionreal_obj_typeobj_reffobj_ref_lists              r%   get_object_refr     s   * <<'L++	]	"	[	  G 	f #112B]2RUYT[\G0 N) 
	?'667MP]7]`d_fgL
   U]_c%d e N "\fhprv!wx N	 #1oG N 	:W_`aN/ ~~ 	f  U]_c%d e* N/	f ~~ 	?!1AII!=>>	?s/   C D D$DDE
!EE
c                    |r|dk(  ri S t         j                  |       }	 |j                  j                  j	                  |      }|d   dk7  r.|j                  j
                  j	                  |d         }||d<   ni |d<   |d   D cg c]'  }|j                  j                  j	                  |      ) }}t        |d       }||d<   |d   D ]:  }|d   dk7  r)|j                  j                  j	                  |d         }ni }||d<   < |d   D 	cg c]'  }	|j                  j                  j	                  |	      ) }
}	t        |
d       }
|
|d<   |d   D ]:  }|d	   dk7  r)|j                  j                  j	                  |d	         }ni }||d	<   < |d
   dk7  r.|j                  j                  j	                  |d
         }||d
<   ni |d
<   t        |       }|d   dk\  r*|d   dk\  r"|j                  d
      rd|d
   d   v rd|d<   |S d|d<   	 |S c c}w c c}	w # t        j                  $ r*}| j!                  d|j"                  z         Y d}~S d}~ww xY w)zGathers all VM parameters available in XAPI database.

    Args:
        module: Reference to Ansible module object.
        vm_ref (str): XAPI reference to VM.

    Returns:
        dict: VM parameters.
    OpaqueRef:NULLaffinityVBDsc                     t        | d         S )N
userdevicer@   )vm_vbd_paramss    r%   <lambda>z"gather_vm_params.<locals>.<lambda>f  s    RUVcdpVqRr r$   )keyr   VIFsc                     t        | d         S )Ndevicer   )vm_vif_paramss    r%   r   z"gather_vm_params.<locals>.<lambda>x  s    RUVcdlVmRn r$   networkguest_metricsr      rP   zfeature-static-ip-settingothernativecustomization_agentcustomr   r   N)r   r   xenapir   
get_recordr   VBDsortedr   VIFr   VM_guest_metricsget_xenserver_versionr/   r   r   r   r   )r   vm_refr   	vm_paramsvm_affinity
vm_vbd_refvm_vbd_params_listr   vm_vdi_params
vm_vif_refvm_vif_params_listr   vm_network_paramsvm_guest_metricsxenserver_versionr   s                   r%   gather_vm_paramsr   D  s    V//	<<'LA; ''**55f=	
 Z $44&--22==i
>STK$/Ij!$&Ij! `iio_pqQ[l1155@@Lqq
 $$6<rs.	& 'v. 	1MU#'77 , 3 3 7 7 B B=QVCW X "#0M% 	1 `iio_pqQ[l1155@@Lqq
 $$6<no.	& 'v. 	9MY'+;;$0$7$7$?$?$J$J=YbKc$d!$&!'8M)$	9 _%)99+22CCNNyYhOij)9Io&)+Io& 2&9a A%*;A*>!*C	VeHf+y/I'/RR/7I+,  08I+,
 m r$ rB >> ;-		9::;s>   A'H ,H3AH ,H=CH H 
H I1IIc                 B   |si S t         j                  |       }i dt        |d   j                               d|d   d|d   d|d   d|d	   d
|d   j	                  d
d      dt        |d         t        |d   j	                  dd            t        t        |d         dz        ddg di dg d|d   j	                  dd      d|d   d|d   d|d   d|d   d|d   }|d   D ]  }|d   dk(  rq|j                  j                  j                  |d    d!         }t        |d    d"         |d    d   |d    d   |d   |d   |d#   |d$   d%}|d   j                  |       ||d   d&k(  s|d'   r|d   j                  d()       |d   j                  d*)       |d   j                  |d    d   +        |d,   D ]O  }|d-   j	                  di       }|d.   d   |d/   |d#   |d0   |j	                  d1|d#   z  d      dddt        |j                               D 	cg c]  }	|	j                  d2|d#   z        s||	   ! c}	ddd3}
|d   d4k(  rv|d5   r6|d5   d6   r.|d5   d6   j                  d7      d8   |
d9<   t        |
d9         |
d:<   |d;   |
d<<   |d=   r%|d=   d6   r|d=   d6   j                  d7      d8   |
d><   |d?   |
d@<   n2|d   dAk(  r*|d   }dBD ]   }|j	                  dC|d#   d7|d      |
|<   " |d   j                  |
       R |S c c}	w )DzGathers VM facts.

    Args:
        module: Reference to Ansible module object.
        vm_params (dict): A dictionary with VM parameters as returned
            by gather_vm_params() function.

    Returns:
        dict: VM facts.
    stater0   r   
name_label	name_descname_descriptionr   is_templateis_a_templatefolderother_configrb   hardware	VCPUs_maxplatformzcores-per-socketri   memory_dynamic_maxi   )num_cpusnum_cpu_cores_per_socket	memory_mbdiskscdromnetworkshome_serverr   domidxenstore_datar   r   r   Diskr   SRvirtual_sizer   r   )sizer   r   srsr_uuid	os_devicevbd_userdeviceCDemptynone)r   iso)iso_namer   r   r   MACMTUz%s/ipz%s/ipv6/)r   mac
vif_devicemtuipprefixnetmaskgatewayip6prefix6gateway6r   ipv4_addressesr   /rP   r   r   ipv4_gatewayr   ipv6_addressesr   ipv6_gatewayr   r   )r   r   r   r   r   zvm-data/networks/)r   r   r2   rr   r/   r@   r   r   r   appendupdater   keys
startswithr=   rg   )r   r   r   vm_factsr   vm_disk_sr_paramsvm_disk_paramsr   vm_guest_metrics_networksipv6r   vm_xenstore_datar   s                r%   gather_vm_factsr    s    	<<'L.y/G/M/M/OP	,' 	Y12 		&!	
 	y1 	)N+//"= 	Ik23(+Ij,A,E,EFXZ],^(_S+?!@AGKL
 	 	 	B 	y,00rB  	7#!" 	Ij)#$ 		.1%& 	?3'( 	y)>?)H. #6* V F* , 3 3 6 6 A A-PUBVW[B\ ] M%0@A%e,\:*512DE'5,V4*84"/"=N W$$^46"d*W%!((f(5!((e(4!((-2F|2T(U)V, #6* $7$-o$>$B$B:r$R! "),\: ''1 '+//-:Q0QSUV@FG`GeGeGg@h Vlpl{l{  }G }J  KS  }T}T mU-d3 V
 *+x7-.=AQ3RST3U.;<L.Ma.P.V.VWZ.[\].^!(+/CDUV^D_/`!),+8+Hi(-.=AQ3RST3U/<=M/Nq/Q/W/WX[/\]^/_!),,9.,Ij),-9(9L y'7';';XefnXoqr<suw'x!!$y 	##$56I$7L O5Vs   (LLc                    |r|dk(  r| j                  d       t        j                  |       }|j                  dd      j                  dd      j	                         }t        |      }d}	 t        |j                  j                  j                  |      j	                               }||k7  r|dk(  r| j                  s|d	k(  r)|j                  j                  j                  |dd       n|d
k(  r)|j                  j                  j                  |dd       n||dk(  rv|j                  j                  j                  |       nO|d	k(  r4| j                  s=|j                  j                  j                  |       n|dk(  rO|dv r4| j                  s |j                  j                  j                  |       n| j                  d|z         n|d
k(  rP|dk(  r4| j                  s|j                  j                  j!                  |       n| j                  d|z         nm|dk(  r|dk(  r| j                  sV|dk(  r'|j                  j                  j#                  |       n*|j                  j$                  j                  j#                  |      }t'        | ||      }	|	r| j                  d|	z         n| j                  d|z         n|dk(  r|dk(  r| j                  s|dk(  r&|j                  j                  j)                  |       n|j                  j$                  j                  j)                  |      }t'        | ||      }	|	rA| j                  d|	z         n+| j                  d|z         n| j                  d|z         d}||fS # t*        j,                  $ r,}
| j                  d|
j.                  z         Y d}
~
||fS d}
~
ww xY w)a  Controls VM power state.

    Args:
        module: Reference to Ansible module object.
        vm_ref (str): XAPI reference to VM.
        power_state (str): Power state to put VM into. Accepted values:

            - poweredon
            - poweredoff
            - restarted
            - suspended
            - shutdownguest
            - rebootguest

        timeout (int): timeout in seconds (default: 300).

    Returns:
        tuple (bool, str): Bool element is True if VM power state has
        changed by calling this function, else False. Str element carries
        a value of resulting power state as defined by XAPI - 'running',
        'halted' or 'suspended'.
    r   z9Cannot set VM power state. Invalid VM reference supplied!r   _rb   -Fr(   r)   r*   r+   r4   )r+   r(   z Cannot restart VM in state '%s'!z Cannot suspend VM in state '%s'!r5   r   z!Guest shutdown task failed: '%s'!z/Cannot shutdown guest when VM is in state '%s'!r6   zGuest reboot task failed: '%s'!z-Cannot reboot guest when VM is in state '%s'!z-Requested VM power state '%s' is unsupported!Tr   N)r   r   r   replacerr   r8   r2   r   r   get_power_state
check_modestartresumeunpausehard_shutdownhard_rebootsuspendclean_shutdownAsyncwait_for_taskclean_rebootr   r   r   )r   r   r0   timeoutr   vm_power_state_resultingstate_changedvm_power_state_currenttask_reftask_resultr   s              r%   set_vm_power_stater    s   0 V//XY<<'L%%c2.66sB?EEGK<[IMC;!>|?R?R?U?U?e?efl?m?s?s?u!v![0k)(( .=$++..44VUEJ/;>$++..55feUK/8;$++..66v>,(( ''**88@+)-DD!,,$++..::6B$$)KNd)d$e+)[8!,,$++..66v>$$)KNd)d$e/)[8!,,"a<(//22AA&I'3':':'@'@'C'C'R'RSY'ZH*7'*RK* & 0 05X[f5f 0 g$$)Z]s)s$t-)[8!,,"a<(//22??G'3':':'@'@'C'C'P'PQW'XH*7'*RK* & 0 05VYd5d 0 e$$)X[q)q$r  %TWb%b c M 344 >> ;-		9::344;s   -L.N O2OOc                    |r|dk(  r| j                  d       t        j                  |       }d}d}|dk(  rd}n|}	 |dkD  ra|j                  j                  j                  |      j                         }|dk(  r t        j                  |       |dk7  r||z  }]|d	k(  rn|}nd
}|j                  j                  j                  |       |S # t        j                  $ r*}| j                  d|j                  z         Y d}~|S d}~ww xY w)a  Waits for async XAPI task to finish.

    Args:
        module: Reference to Ansible module object.
        task_ref (str): XAPI reference to task.
        timeout (int): timeout in seconds (default: 300).

    Returns:
        str: failure message on failure, else an empty string.
    r   z6Cannot wait for task. Invalid task reference supplied!r   rQ   rb   r   rP   pendingsuccessr  r   N)r   r   r   r   task
get_statusrr   timesleepdestroyr   r   r   )	r   r  r  r   intervalresult	time_lefttask_statusr   s	            r%   r  r  l  s    x#33UV<<'LHF !|		;!m&--22==hGMMOKi'

8$ a<)I	) % F  ((2 M >> ;-		9::M;s   BC D
 DD
c                    |r|dk(  r| j                  d       t        j                  |       }i }	 t        |j                  j
                  j                  |      j                               }|dk7  r| j                  d|z         d}|dk(  rd}n|}|dkD  r|j                  j
                  j                  |      }|dk7  r1|j                  j                  j                  |      }|d	   }	d
|	v r	 |S t        j                  |       |dk7  r||z  }|dkD  r| j                  d       	 |S # t        j                  $ r*}
| j                  d|
j                  z         Y d}
~
|S d}
~
ww xY w)ai  Waits for VM to acquire an IP address.

    Args:
        module: Reference to Ansible module object.
        vm_ref (str): XAPI reference to VM.
        timeout (int): timeout in seconds (default: 300).

    Returns:
        dict: VM guest metrics as retrieved by
        VM_guest_metrics.get_record() XAPI method with info
        on IP address acquired.
    r   z=Cannot wait for VM IP address. Invalid VM reference supplied!r   r(   z7Cannot wait for VM IP address when VM is in state '%s'!rQ   r   rP   r   z0/ipz$Timed out waiting for VM IP address!r   N)r   r   r   r2   r   r   r	  rr   get_guest_metricsr   r   r!  r"  r   r   r   )r   r   r  r   r   vm_power_stater$  r&  vm_guest_metrics_refvm_ipsr   s              r%   wait_for_vm_ip_addressr-    s    V//\]<<'L%; 7|7J7J7M7M7]7]^d7e7k7k7mn[(!Z]k!kl a<II!m#/#6#6#9#9#K#KF#S #'77#/#6#6#G#G#R#RSg#h )*5V#  JJx  !|X%	 !m" !GH
  >> ;-		9::;s$   B?D. 4$D. D. .E+E&&E+c                 \   t         j                  |       }|j                  j                  j	                  |j
                        }	 |j                  j                  j                  |      d   j                  d      D cg c]  }t        |       }}|S c c}w # t        $ r g d}Y |S w xY w)zReturns XenServer version.

    Args:
        module: Reference to Ansible module object.

    Returns:
        list: Element [0] is major version. Element [1] is minor version.
        Element [2] is update number.
    product_versionr:   )r   r   r   )r   r   r   sessionget_this_host_sessionr   get_software_versionr=   r@   
ValueError)r   r   host_refversion_numberr   s        r%   r   r     s     <<'L""**889N9NOH&GSGZGZG_G_GtGtu}G~  @Q  HR  HX  HX  Y\  H]  ^^S0  ^  ^ 	 ^ &%&s$   9B ?BB B B+*B+c                   &    e Zd ZdZdZedd       Zy)r   z"Class for XAPI session management.Nc           	         | j                   | j                   S |j                  d   }|j                  d   }|j                  d   }|j                  d    }|dk(  rt        j                         | _         d}d}nH|j	                  d      s|j	                  d	      sd
|z  }	 t        j
                  ||      | _         |sd}	 | j                   j                  ||t        d       |r)t        j                  | j                   j                         | j                   S # t        $ r t        j
                  |      | _         Y w xY w# t        j                  $ r/}|j                  d|d|d|j                         Y d}~d}~ww xY w)a  Establishes XAPI connection and returns session reference.

        If no existing session is available, establishes a new one
        and returns it, else returns existing one.

        Args:
            module: Reference to Ansible module object.
            disconnect_atexit (bool): Controls if method should
                register atexit handler to disconnect from XenServer
                on module exit (default: True).

        Returns:
            XAPI session reference.
        Nr   r   r    r!   r   rb   zhttp://zhttps://z	http://%s)
ignore_sslAnsiblez!Unable to log on to XenServer at z as z: r   )_xapi_sessionparamsr   
xapi_localr   Session	TypeErrorlogin_with_passwordANSIBLE_VERSIONr   r   r   atexitregisterlogout)clsr   disconnect_atexitr   r   r    r9  r   s           r%   r   zXAPI.connect   sm     ($$$==,==,==,'788
{" & 1 1 3CHH &&y1(:M:Mj:Y&1	= %+NN8
$S!
 	t11(HoW`a
 OOC--445   !  =$*NN8$<!= ~~ 	tT\^fhihqhq!rss	ts*   !D "E #E EF%FF)T)__name__
__module____qualname____doc__r;  classmethodr   r#   r$   r%   r   r     s    ,M8! 8!r$   r   c                       e Zd ZdZd Zy)XenServerObjectao  Base class for all XenServer objects.

    This class contains active XAPI session reference and common
    attributes with useful info about XenServer host/pool.

    Attributes:
        module: Reference to Ansible module object.
        xapi_session: Reference to XAPI session.
        pool_ref (str): XAPI reference to a pool currently connected to.
        default_sr_ref (str): XAPI reference to a pool default
            Storage Repository.
        host_ref (str): XAPI rerefence to a host currently connected to.
        xenserver_version (list of str): Contains XenServer major and
            minor version.
    c                 0   t         s!|j                  dt        d      t               || _        t
        j                  |      | _        	 | j                  j                  j                  j                         d   | _        | j                  j                  j                  j                  | j                        | _        t        |      | _        y# t         j"                  $ r3}| j                  j                  d|j$                  z         Y d}~yd}~ww xY w)zInits XenServerObject using common module parameters.

        Args:
            module: Reference to Ansible module object.
        Fr   )changedr   	exceptionr   r   r   N)
HAS_XENAPIr   r   XENAPI_IMP_ERRr   r   r   r   r   r   get_allpool_refget_default_SRdefault_sr_refr   r   r   r   r   )selfr   r   s      r%   __init__zXenServerObject.__init__M  s     U0DX0NZhi LL0	D --4499AACAFDM"&"3"3":":"?"?"N"Nt}}"]D%:6%BD"~~ 	DKK!!&6&B!CC	Ds   
BC D")DDN)rG  rH  rI  rJ  rX  r#   r$   r%   rM  rM  <  s     Dr$   rM  )F)Nr   Trb   )i,  ))
__future__r   r   r   r   __metaclass__rB  r!  ru   	tracebackrR  r   rQ  ImportError
format_excansible.module_utils.basicr   r   $ansible.module_utils.ansible_releaser   rA  r&   r2   r8   rE   rW   r]   rg   rn   r|   r   r   r   r  r  r  r-  r   objectr   rM  r#   r$   r%   <module>ra     s    A @   	 ,J
 J O2	3/4<(..#L(?DSlePg5T8v<~,=!6 =!@"Df "DS  ,J)Y))+N,s   B BB