
    VhMw                     4   d Z dZdZddlmZ 	 ddlZddlmZ ddl	m
Z
 ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ dZdZ ej.                  e      d        Z ej.                  e      d        Zd Zd Zd Zd Zd Zedk(  r e        yy# e$ r Y w xY w)a  
---
module: route53
version_added: 5.0.0
short_description: add or delete entries in Amazons Route 53 DNS service
description:
  - Creates and deletes DNS records in Amazons Route 53 service.
  - This module was originally added to C(community.aws) in release 1.0.0.
options:
  state:
    description:
      - Specifies the state of the resource record.
    required: true
    aliases: [ 'command' ]
    choices: [ 'present', 'absent', 'get', 'create', 'delete' ]
    type: str
  zone:
    description:
      - The DNS zone to modify.
      - This is a required parameter, if parameter O(hosted_zone_id) is not supplied.
    type: str
  hosted_zone_id:
    description:
      - The Hosted Zone ID of the DNS zone to modify.
      - This is a required parameter, if parameter O(zone) is not supplied.
    type: str
  record:
    description:
      - The full DNS record to create or delete.
    required: true
    type: str
  ttl:
    description:
      - The TTL, in second, to give the new record.
      - Mutually exclusive with O(alias).
    default: 3600
    type: int
  type:
    description:
      - The type of DNS record to create.
      - Support for V(SSHFP) was added in release 9.2.0. See AWS Doc for more information
        U(https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/ResourceRecordTypes.html).
    required: true
    choices: [ 'A', 'CNAME', 'MX', 'AAAA', 'TXT', 'PTR', 'SRV', 'SPF', 'CAA', 'NS', 'SOA', 'SSHFP' ]
    type: str
  alias:
    description:
      - Indicates if this is an alias record.
      - Mutually exclusive with O(ttl).
      - Defaults to V(false).
    type: bool
  alias_hosted_zone_id:
    description:
      - The hosted zone identifier.
    type: str
  alias_evaluate_target_health:
    description:
      - Whether or not to evaluate an alias target health. Useful for aliases to Elastic Load Balancers.
    type: bool
    default: false
  value:
    description:
      - The new value when creating a DNS record. YAML lists or multiple comma-spaced values are allowed for non-alias records.
    type: list
    elements: str
  overwrite:
    description:
      - Whether an existing record should be overwritten on create if values do not match.
    type: bool
  retry_interval:
    description:
      - In the case that Route 53 is still servicing a prior request, this module will wait and try again after this many seconds.
        If you have many domain names, the default of V(500) seconds may be too long.
    default: 500
    type: int
  private_zone:
    description:
      - If set to V(true), the private zone matching the requested name within the domain will be used if there are both public and private zones.
      - The default is to use the public zone.
    type: bool
    default: false
  identifier:
    description:
      - Have to be specified for Weighted, latency-based and failover resource record sets only.
        An identifier that differentiates among multiple resource record sets that have the same combination of DNS name and type.
    type: str
  weight:
    description:
      - Weighted resource record sets only. Among resource record sets that
        have the same combination of DNS name and type, a value that
        determines what portion of traffic for the current resource record set
        is routed to the associated location.
      - Mutually exclusive with O(region) and O(failover).
    type: int
  region:
    description:
      - Latency-based resource record sets only Among resource record sets
        that have the same combination of DNS name and type, a value that
        determines which region this should be associated with for the
        latency-based routing
      - Mutually exclusive with O(weight) and O(failover).
    type: str
  geo_location:
    description:
      - Allows to control how Amazon Route 53 responds to DNS queries based on the geographic origin of the query.
      - Two geolocation resource record sets that specify same geographic location cannot be created.
      - Non-geolocation resource record sets that have the same values for the Name and Type elements as geolocation
        resource record sets cannot be created.
    suboptions:
      continent_code:
        description:
          - The two-letter code for the continent.
          - Specifying O(geo_location.continent_code) with either O(geo_location.country_code) or O(geo_location.subdivision_code)
            returns an InvalidInput error.
        type: str
      country_code:
        description:
          - The two-letter code for a country.
          - Amazon Route 53 uses the two-letter country codes that are specified in ISO standard 3166-1 alpha-2 .
        type: str
      subdivision_code:
        description:
          - The two-letter code for a state of the United States.
          - To specify O(geo_location.subdivision_code), O(geo_location.country_code) must be set to V(US).
        type: str
    type: dict
    version_added: 3.3.0
    version_added_collection: community.aws
  health_check:
    description:
      - Health check to associate with this record
    type: str
  failover:
    description:
      - Failover resource record sets only. Whether this is the primary or
        secondary resource record set. Allowed values are V(PRIMARY) and V(SECONDARY).
      - Mutually exclusive with O(weight) and O(region).
    type: str
    choices: ['SECONDARY', 'PRIMARY']
  vpc_id:
    description:
      - When used in conjunction with O(private_zone=true), this will only modify records in the private hosted zone attached to this VPC.
      - This allows you to have multiple private hosted zones, all with the same name, attached to different VPCs.
    type: str
  wait:
    description:
      - Wait until the changes have been replicated to all Amazon Route 53 DNS servers.
    type: bool
    default: false
  wait_timeout:
    description:
      - How long to wait for the changes to be replicated, in seconds.
    default: 300
    type: int
author:
  - Bruce Pennypacker (@bpennypacker)
  - Mike Buzzetti (@jimbydamonk)
extends_documentation_fragment:
  - amazon.aws.common.modules
  - amazon.aws.boto3
a
  
nameservers:
  description: Nameservers associated with the zone.
  returned: when state is 'get'
  type: list
  sample:
  - ns-1036.awsdns-00.org.
  - ns-516.awsdns-00.net.
  - ns-1504.awsdns-00.co.uk.
  - ns-1.awsdns-00.com.
resource_record_sets:
  description: Info specific to the resource record.
  returned: when state is 'get'
  type: complex
  contains:
    alias:
      description: Whether this is an alias.
      returned: always
      type: bool
      sample: false
    failover:
      description: Whether this is the primary or secondary resource record set.
      returned: always
      type: str
      sample: "PRIMARY"
    geo_location:
      description: Geograpic location based on which Route53 resonds to DNS queries.
      returned: when configured
      type: dict
      sample: { continent_code: "NA", country_code: "US", subdivision_code: "CA" }
      version_added: 3.3.0
      version_added_collection: community.aws
    health_check:
      description: Health check associated with this record.
      returned: always
      type: str
    identifier:
      description: An identifier that differentiates among multiple resource record sets that have the same combination of DNS name and type.
      returned: always
      type: str
    name:
      description: Domain name for the record set.
      returned: always
      type: str
      sample: "new.foo.com"
    record:
      description: Domain name for the record set.
      returned: always
      type: str
      sample: "new.foo.com"
    region:
      description: Which region this should be associated with for latency-based routing.
      returned: always
      type: str
      sample: "us-west-2"
    resource_records:
      description: Information about the resource records to act upon.
      type: list
      returned: always
      sample: [{"value": "1.1.1.1"}]
    ttl:
      description: Resource record cache TTL.
      returned: always
      type: str
      sample: "3600"
    type:
      description: Resource record set type.
      returned: always
      type: str
      sample: "A"
    value:
      description: Record value.
      returned: always
      type: str
      sample: "52.43.18.27"
    values:
      description: Record Values.
      returned: always
      type: list
      sample:
      - 52.43.18.27
    weight:
      description: Weight of the record.
      returned: always
      type: str
      sample: '3'
    zone:
      description: Zone this record set belongs to.
      returned: always
      type: str
      sample: "foo.bar.com"
wait_id:
  description:
    - The wait ID for the applied change. Can be used to wait for the change to propagate later on when O(wait=false).
  type: str
  returned: when changed
  version_added: 6.3.0
a4  
- name: Add new.foo.com as an A record with 3 IPs and wait until the changes have been replicated
  amazon.aws.route53:
    state: present
    zone: foo.com
    record: new.foo.com
    type: A
    ttl: 7200
    value: 1.1.1.1,2.2.2.2,3.3.3.3
    wait: true

- name: Update new.foo.com as an A record with a list of 3 IPs and wait until the changes have been replicated
  amazon.aws.route53:
    state: present
    zone: foo.com
    record: new.foo.com
    type: A
    ttl: 7200
    value:
      - 1.1.1.1
      - 2.2.2.2
      - 3.3.3.3
    wait: true

- name: Retrieve the details for new.foo.com
  amazon.aws.route53:
    state: get
    zone: foo.com
    record: new.foo.com
    type: A
  register: rec

- name: Delete new.foo.com A record using the results from the get command
  amazon.aws.route53:
    state: absent
    zone: foo.com
    record: "{{ rec.set.record }}"
    ttl: "{{ rec.set.ttl }}"
    type: "{{ rec.set.type }}"
    value: "{{ rec.set.value }}"

# Add an AAAA record.  Note that because there are colons in the value
# that the IPv6 address must be quoted. Also shows using the old form command=create.
- name: Add an AAAA record
  amazon.aws.route53:
    command: create
    zone: foo.com
    record: localhost.foo.com
    type: AAAA
    ttl: 7200
    value: "::1"

# For more information on SRV records see:
# https://en.wikipedia.org/wiki/SRV_record
- name: Add a SRV record with multiple fields for a service on port 22222
  amazon.aws.route53:
    state: present
    zone: foo.com
    record: "_example-service._tcp.foo.com"
    type: SRV
    value: "0 0 22222 host1.foo.com,0 0 22222 host2.foo.com"

# Note that TXT and SPF records must be surrounded
# by quotes when sent to Route 53:
- name: Add a TXT record.
  amazon.aws.route53:
    state: present
    zone: foo.com
    record: localhost.foo.com
    type: TXT
    ttl: 7200
    value: '"bar"'

- name: Add an alias record that points to an Amazon ELB
  amazon.aws.route53:
    state: present
    zone: foo.com
    record: elb.foo.com
    type: A
    value: "{{ elb_dns_name }}"
    alias: true
    alias_hosted_zone_id: "{{ elb_zone_id }}"

- name: Retrieve the details for elb.foo.com
  amazon.aws.route53:
    state: get
    zone: foo.com
    record: elb.foo.com
    type: A
  register: rec

- name: Delete an alias record using the results from the get command
  amazon.aws.route53:
    state: absent
    zone: foo.com
    record: "{{ rec.set.record }}"
    ttl: "{{ rec.set.ttl }}"
    type: "{{ rec.set.type }}"
    value: "{{ rec.set.value }}"
    alias: true
    alias_hosted_zone_id: "{{ rec.set.alias_hosted_zone_id }}"

- name: Add an alias record that points to an Amazon ELB and evaluates it health
  amazon.aws.route53:
    state: present
    zone: foo.com
    record: elb.foo.com
    type: A
    value: "{{ elb_dns_name }}"
    alias: true
    alias_hosted_zone_id: "{{ elb_zone_id }}"
    alias_evaluate_target_health: true

- name: Add an AAAA record with Hosted Zone ID
  amazon.aws.route53:
    state: present
    zone: foo.com
    hosted_zone_id: Z2AABBCCDDEEFF
    record: localhost.foo.com
    type: AAAA
    ttl: 7200
    value: "::1"

- name: Use a routing policy to distribute traffic
  amazon.aws.route53:
    state: present
    zone: foo.com
    record: www.foo.com
    type: CNAME
    value: host1.foo.com
    ttl: 30
    # Routing policy
    identifier: "host1@www"
    weight: 100
    health_check: "d994b780-3150-49fd-9205-356abdd42e75"

- name: Add a CAA record (RFC 6844)
  amazon.aws.route53:
    state: present
    zone: example.com
    record: example.com
    type: CAA
    value:
      - 0 issue "ca.example.net"
      - 0 issuewild ";"
      - 0 iodef "mailto:security@example.com"

- name: Create a record with geo_location - country_code
  amazon.aws.route53:
    state: present
    zone: '{{ zone_one }}'
    record: 'geo-test.{{ zone_one }}'
    identifier: "geohost@www"
    type: A
    value: 1.1.1.1
    ttl: 30
    geo_location:
      country_code: US

- name: Create a record with geo_location - subdivision code
  amazon.aws.route53:
    state: present
    zone: '{{ zone_one }}'
    record: 'geo-test.{{ zone_one }}'
    identifier: "geohost@www"
    type: A
    value: 1.1.1.1
    ttl: 30
    geo_location:
      country_code: US
      subdivision_code: TX

- name: Add new.foo.com as an SSHFP record
  amazon.aws.route53:
    state: present
    zone: test-zone.com
    record: new.foo.com
    type: SSHFP
    ttl: 7200
    value: 1 1 11F1A11D1111112B111C1B11B1C11C11C1234567

- name: Delete new.foo.com as an SSHFP record
  amazon.aws.route53:
    state: absent
    zone: test-zone.com
    record: new.foo.com
    type: SSHFP
    )
itemgetterN)	to_native)camel_dict_to_snake_dict)is_boto3_error_message)AnsibleAWSModule)AWSRetry)scrub_none_parameters)
get_waiter
      )retriesc                 j    | j                  d      } |j                  di |j                         d   S )Nlist_resource_record_setsResourceRecordSets get_paginatorpaginatebuild_full_resultroute53kwargs	paginators      f/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/amazon/aws/plugins/modules/route53.py_list_record_setsr     s8    %%&ABI9''99;<PQQ    c                 j    | j                  d      } |j                  di |j                         d   S )Nlist_hosted_zonesHostedZonesr   r   r   s      r   _list_hosted_zonesr      s7    %%&9:I9''99;MJJr   c                    t        | |      }|D ]m  }|d   j                         j                  d      |d<   |j                         |f|d   j                         |d   fk7  rT|r||j	                  d      k7  rk|c S  y )NHostedZoneIdNameunicode_escapeTypeSetIdentifier)r   encodedecodelowerget)r   zone_idrecord_namerecord_typerecord_identifierrecord_sets_results
record_sets          r   
get_recordr2     s    +G'J) 	
'/668??@PQ
6-*V2D2J2J2LjY_N`1aa!2jnn_6U!U	 r   c                 ,   t        |       }|D ]  }|j                  |d   j                  dd            }|d   j                  dd      }||k(  sB|d   |k(  sK|r0| j	                  d|	      }	||	d
   D 
cg c]  }
|
d   	 c}
v sy|c S |c S  yc c}
w )zFinds a zone by name or zone_idConfigPrivateZoneFIdz/hostedzone/ r$   T	aws_retryr6   VPCsVPCIdN)r    booleanr+   replaceget_hosted_zone)r   module	zone_namewant_privatewant_vpc_idhosted_zones_resultszoneprivate_zoner,   hosted_zonevs              r   get_zone_id_by_namerH     s    -g6$  ~~d8n&8&8&NOt*$$^R8<'DLI,E &555Q{67J"K!1W:"KK"N 	 #Ls   6Bc                    | syt        |       }||d<   ||d<   | j                  dd      |d<   | j                  d      j                         j                  d      |d<   | j                  d	d      |d
<   | j                  dd      |d<   | j                  dd      |d<   | j                  dd      |d<   | j                  dd      |d<   | j                  dd      |d<   |d
   rt	        |d
         |d
<   |d   rt	        |d         |d<   |d   rt	        |d         |d<   | j                  d      rdd|d<   | d   j                  d      |d<   | d   j                  d      g|d<   | d   j                  d      |d<   | d   j                  d      |d<   |S d|d<   | j                  d       D cg c]  }|j                  d!       }}d"j                  t        |            |d<   t        |      |d<   |S c c}w )#z
    Formats a record in a way that's consistent with the pre-boto3 migration values
    as well as returning the 'normal' boto3 style values
    NrD   hosted_zone_idr&   typer$   r%   recordTTLttlr'   
identifierWeightweightRegionregionFailoverfailoverHealthCheckIdhealth_checkAliasTargetTaliasDNSNamevaluevaluesr#   alias_hosted_zone_idEvaluateTargetHealthalias_evaluate_target_healthFResourceRecordsValue,)dictr+   r(   r)   strjoinsorted)	record_inzone_inr,   rL   rrecordss         r   format_recordrk     s   
 )_FF6N&F]]640F6N }}V,335<<=MNF8MM%.F5M$==$?F< }}Xt4F8 }}Xt4F8"z48F:&]]?DAF>e}F5M*uhvh/0xhvh/0x}}]#w#M266yAw%m488CDx)2=)A)E)En)U%&1:=1I1M1MNd1e-. M  w+4==9J+KLa155>LL((6'?3w!'?xM	 Ms   ,G3c                     | j                  d|      d   d   t        | |      }t        t        fd|            d   d   }|D cg c]  }|d	   	 c}S c c}w )
NTr8   
HostedZoner$   r"   c                 (    | d   k(  xr | d   dk(  S )Nr$   r&   NSr   )rL   hosted_zone_names    r   <lambda>z-get_hosted_zone_nameservers.<locals>.<lambda>@  s     fVn0@@[VF^W[E[ r   r   r`   ra   )r>   r   listfilter)r   r,   resource_records_setsnameservers_records	ns_recordrp   s        @r   get_hosted_zone_nameserversrw   ;  st    ..'.J<XY_`-gGL[]rs		 1DD9IgDDDs   
Ac                  r   t        dvi dt        ddg ddg      dt        d      d	t        d      d
t        dd      dt        dd      dt        ddg d      dt        d      dt        d      dt        dd      dt        dd      dt        d      dt        dd      dt        dd      dt        d      d t        d      d!t        d      d"t        d#t        t        d      t        d      t        d      $      d%      d&t        d      d't        dd(d)g*      d+t        d      d,t        dd      d-t        dd.      } t        | ddd	ggddggdd/dgfdd0dgffd1d2gt        d3d3d3d34      5      }|j                  d   d6v rd0}n(|j                  d   d7v rd8}n|j                  d   d9k(  rd9}|j                  j                  d      xs d:j	                         }|j                  j                  d	      }|j                  j                  d      }|j                  j                  d
      j	                         }|j                  j                  d      }|j                  j                  d      xs g }|j                  j                  d      }	|j                  j                  d      }
|j                  j                  d      }|j                  j                  d      }|j                  d+   d}n|j                  j                  d      }|j                  j                  d      }|j                  j                  d       }|j                  j                  d!      }|j                  j                  d&      }|j                  j                  d'      }|j                  j                  d+      }|j                  j                  d,      }|j                  j                  d-      }|j                  j                  d"      }|d;d  d<k7  r|d<z  }|d;d  d<k7  r|d<z  }d0k(  s|d8k(  r>|	r t        |      d=k7  r|j                  d>?       ||||||j                  d@?       t        j                  t        |dAgt        dB|      C      }	 |j                  dD|E      }|xs t!        ||||      }|dG|xs | dH}|j                  |?       t#        ||||      }t%        |||||||D cg c]  }t        |I       c}||dJ	      }|r|j                  dK      }|j                  dL      } |j                  dM      }!|r| s|!r|j                  ddNO       t'        || |!g      s|j                  ddPO       |j                  dM      r5|j                  dL      j	                         dQk7  r|j                  ddRO       i |dS<   |r||dS   dT<   | r| |dS   dU<   |!r|!|dS   dV<   |d8k(  r/|-|j                  dW      |dW<   |dX   s|j                  dX      |dX<   |	r"t        |
|dY   |Z      |d[<   dX|v r|dX= dW|v r|dW= |d\k(  r:t)        |dX   t+        d]      ^      |dX<   |rt)        |dX   t+        d]      ^      |dX<   |d0k(  r$||k(  rt-        |      g}"|j/                  d|"_       |d9k(  ri|d`k(  r|j                  dag       }#nt1        ||      }#t3        |||      }$|$|j/                  dg |#g b       t-        |      g}"|j/                  d|$|#|"b       |d8k(  r|s|j/                  dc       |d0k(  s|d8k(  r;|d0k(  r&|r$|j                  d   s|j                  dd?       de}%n|j5                         }%d }&|j6                  sp	 |j9                  d|t        t        %|f      gg      h      }'|'di   dj   }&|r;t;        |dk      }(|(j=                  |'di   dj   t        t>        |t>        z  l      m       t3        |||      }$t3        |||      })t        d|&|d8k7  rt-        |)      gni s      }*|jL                  r&|*jO                  dt|$|d8k7  rt-        |)      ni dui        |j.                  dvi |* y # t        j                  j                  $ r}|j                  |dF?       Y d }~d }~ww xY wc c}w # tA        dn      $ r |j/                  dc       Y t        j                  jB                  $ r}|j                  |do?       Y d }~d }~wt        j                  jD                  t        j                  jF                  f$ r}|j                  |dp?       Y d }~kd }~wtH        $ r*}|j                  dqtK        |       dr?       Y d }~d }~ww xY w)wNstaterd   T)absentcreatedeleter+   presentcommand)rK   requiredchoicesaliasesrD   )rK   rJ   rL   )rK   r   rN   inti  )rK   defaultrK   )AAAAACAACNAMEMXro   PTRSOASPFSSHFPSRVTXT)rK   r   r   rY   boolr]   r_   Fr[   rr   )rK   elements	overwriteretry_intervali  rE   rO   rQ   rS   geo_locationrc   )continent_codecountry_codesubdivision_code)rK   optionsr   rW   rU   PRIMARY	SECONDARY)rK   r   vpc_idwaitwait_timeouti,  r}   r{   )rU   rS   rQ   )rY   rN   )rO   )rU   rS   rQ   r   )argument_specsupports_check_moderequired_one_ofrequired_togetherrequired_ifmutually_exclusiverequired_by)r}   r{   )rz   r|   r|   r+   r7   .   zBparameter 'value' must contain a single dns name for alias records)msgzuYou have specified identifier which makes sense only if you specify one of: weight, region, geo_location or failover.PriorRequestNotComplete<   )r   delaycatch_extra_error_codes	max_delayr   )retry_decoratorzFailed to connect to AWSzZone z does not exist in Route53)ra   )	r$   r&   rP   rR   rT   rM   r`   rV   r'   r   r   r   zfWhile using geo_location, continent_code is mutually exclusive with country_code and subdivision_code.)changedr   z\To use geo_location please specify either continent_code, country_code, or subdivision_code.usz=To use subdivision_code, you must specify country_code as US.GeoLocationContinentCodeCountryCodeSubdivisionCoderM   r`   r   )r#   rZ   r^   rX   r   ra   )key)r   rt   ro   r\   )r   setnameserversresource_record_sets)r   zIRecord already exists with different value. Set 'overwrite' to replace itUPSERT)ActionResourceRecordSet)Changes)r9   r#   ChangeBatch
ChangeInfor6   resource_record_sets_changed)DelayMaxAttempts)r6   WaiterConfigzbut it already existsz:Timeout waiting for resource records changes to be appliedzFailed to update recordszUnhandled exception. ())r   wait_idr   diff)beforeafterr   )(rc   r   paramsr+   r*   len	fail_jsonr   jittered_backoffMAX_AWS_RETRIESmaxclientbotocore
exceptionsHTTPClientErrorfail_json_awsrH   r2   r	   anyrf   r   r   	exit_jsonrw   rk   upper
check_modechange_resource_record_setsr
   r   
WAIT_RETRYr   WaiterErrorBotoCoreErrorClientError	Exceptionr   _diffupdate)+r   r?   
command_inrh   hosted_zone_id_inttl_inrg   type_invalue_inalias_inalias_hosted_zone_id_inalias_evaluate_target_health_inretry_interval_inprivate_zone_inidentifier_in	weight_in	region_inhealth_check_infailover_in	vpc_id_inwait_inwait_timeout_inr   r   r   er,   errmsg
aws_recordr[   resource_record_setr   r   r   rr_setsnsformatted_awsr~   r   r   waiterformatted_recordreturn_results+                                              r   mainr   F  s
    #/_jsit
# u	#
 '# .# eT*# i
# # "u-# &*vu%E#  /!#" F###$ 4%#& vu5'#( U#)#* +#, -#. #/d>Naekpaq 
/#< u%=#> 59k*BC?#@ A#B vu-C#D uc2E#MJ #  "234#%;<= i'+h	*
 -

 $""(	
#F2 }}W!66
	w	#7	7
	w	5	(
}}  (.B557G))*:;]]u%F!!(+113Imm'G}}  )/RH}}  )H$mm//0FG&,mm&7&78V&W#))*:;}}X* --++N;MM%%l3M!!(+I!!(+Imm''7O--##J/K!!(+Imm'Gmm''7O==$$^4Lrs|s3~S	Xx!7H*!ef)"38KP\Pd'1   //!: ;b+,	O@--	?-K
  l#6wQ`bk#lG 5$566PQV$GWi-PJ/#?GHe5 1H,*
	
 %))*:;#''7'++,>?|/?)   NL2BCDr  
 ./L4D4D^4T4Z4Z4\`d4dU0op .0M*BP.?@L.}=DT./@AX*"8%/^^E%:E""#455?^^DU5V 12-10QK!@.
M*
  33#$56''#E* %178KL]8^dnovdw1x-.,2:>O3PV`ahVi,jJ()X*0C"C+,?@AgFUd?"-B -Wg>B%j'7C UY[\+J78Mr`ghXj'Xx!7!j==-  %p qG &&(GG	K*1*M*M$ $gQd*e)fg +N +'
 2,?EG#G-KL2<@F!%($3z$A"  & "*gw?M$%8'7KMW[cMc67GHIikM ||+KUYaKa56FGgi	
 F%}%E .. @Q$>??@*  I\ &&=> 	,U+"".. 	f  (d ee--++
 	D   (B CC 	K#9)A,q!IJJ	KsU   3b c&A/c c0c		c f68f6d--:f6'f  f6f11f6__main__) DOCUMENTATIONRETURNEXAMPLESoperatorr   r   ImportErroransible.module_utils._textr   0ansible.module_utils.common.dict_transformationsr   <ansible_collections.amazon.aws.plugins.module_utils.botocorer   ;ansible_collections.amazon.aws.plugins.module_utils.modulesr   ;ansible_collections.amazon.aws.plugins.module_utils.retriesr   Bansible_collections.amazon.aws.plugins.module_utils.transformationr	   ;ansible_collections.amazon.aws.plugins.module_utils.waitersr
   r   r   r   r   r    r2   rH   rk   rw   r   __name__r   r   r   <module>r	     s   `Da
F{z  	 1 U _ X P d R
 ?3R 4R
 ?3K 4K
",(VE_&D	 zF w  		s   B BB