Ë
    x[hbŽ  ã                   ó°  — U d dl Z d dlZd dlZd dlmZmZmZmZ d dl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 erd dlmZ  ej0                  e«      ZdZdg d¢iZg d¢Zd	d
ddddddddddddddœdddddddddd dd!œd"œZeeeeef   f   e d#<   d$e!d%dfd&„Z"d'„ Z# G d(„ d)e$«      Z%d*„ Z& G d+„ d,«      Z' G d-„ d.«      Z(d/„ Z)d6d0„Z*d1„ Z+d2„ Z,	 	 d7d3e!d4e-d%e'fd5„Z.y)8é    N)ÚTYPE_CHECKINGÚAnyÚDictÚOptional)Ú	lifecycleÚsafeyamlÚutil)	Úfind_interface_name_from_macÚget_interfaces_by_macÚipv4_mask_to_net_prefixÚipv6_mask_to_net_prefixÚis_ip_networkÚis_ipv4_networkÚis_ipv6_addressÚis_ipv6_networkÚnet_prefix_to_ipv4_mask©ÚRendereré   ©ÚversionÚconfigÚnetwork_state)Ú	addressesÚdhcp4údhcp4-overridesÚdhcp6údhcp6-overridesÚgateway4Úgateway6Ú
interfacesÚmatchÚmtuÚnameserversÚrendererúset-nameÚ	wakeonlanú	accept-raÚoptionalz	ad-selectzarp-intervalzarp-ip-targetzarp-validatez
down-delayzfail-over-mac-policyz	lacp-ratezmii-monitor-intervalz	min-linksÚmodeúgratuitous-arpÚprimaryzprimary-reselect-policyzup-delayztransmit-hash-policy)zbond-ad-selectzbond-arp-intervalzbond-arp-ip-targetzbond-arp-validatezbond-downdelayzbond-fail-over-maczbond-lacp-ratezbond-miimonzbond-min-linksz	bond-modezbond-num-grat-arpzbond-primaryzbond-primary-reselectzbond-updelayzbond-xmit-hash-policyzageing-timeÚpriorityzforward-delayz
hello-timezmax-agez	path-costzport-priorityÚstp)Úbridge_ageingÚbridge_bridgeprioÚ	bridge_fdÚbridge_gcintÚbridge_helloÚbridge_maxageÚbridge_maxwaitÚbridge_pathcostÚbridge_portprioÚ
bridge_stpÚbridge_waitport)ÚbondÚbridgeÚNET_CONFIG_TO_V2ÚdiktÚreturnc                 óF   — d| v sd| v rt        j                  ddd¬«       yy)z8Warn about deprecations of v2 properties for all devicesr   r    z$The use of `gateway4` and `gateway6`z22.4zbFor more info check out: https://docs.cloud-init.io/en/latest/topics/network-config-format-v2.html)Ú
deprecatedÚdeprecated_versionÚextra_messageN)r   Ú	deprecate)r=   s    ú=/usr/lib/python3/dist-packages/cloudinit/net/network_state.pyÚwarn_deprecated_all_devicesrE   W   s0   € à�TÑ˜Z¨4Ñ/Ü×ÑØ=Ø%ðXö	
ð 0ó    c                 óL   — t        | «      }|D ]  }|j                  |«       Œ |S ©N)ÚsetÚdiscard)ÚexpectedÚactualÚmissingÚkeys       rD   Ú	diff_keysrO   b   s+   € Ü�(‹m€GØò ˆØ�‰˜Õðà€NrF   c                   ó   — e Zd Zy)ÚInvalidCommandN)Ú__name__Ú
__module__Ú__qualname__© rF   rD   rQ   rQ   i   s   „ ØrF   rQ   c                 ó   ‡ — ˆ fd„}|S )Nc                 óF   •‡ — t        j                  ‰ «      ˆ ˆfd„«       }|S )Nc                 ó`   •— ‰rt        ‰|«      }|rt        d|›d‰›�«      ‚ ‰| |g|¢­i |¤ŽS )NzCommand missing z of required keys )rO   rQ   )ÚselfÚcommandÚargsÚkwargsÚmissing_keysÚfuncÚrequired_keyss        €€rD   Ú	decoratorz7ensure_command_keys.<locals>.wrapper.<locals>.decoratoro   sE   ø€ áÜ(¨¸Ó@�ÙÝ(â'©ð8óð ñ ˜˜gÐ7¨Ò7°Ñ7Ð7rF   )Ú	functoolsÚwraps)r^   r`   r_   s   ` €rD   Úwrapperz$ensure_command_keys.<locals>.wrappern   s&   ù€ Ü	�‰˜Ó	ô	8ó 
ð	8ð ÐrF   rU   )r_   rc   s   ` rD   Úensure_command_keysrd   m   s   ø€ ôð €NrF   c                   ó¬   — e Zd Zefdedefd„Zedefd„«       Zed„ «       Z	ed„ «       Z
ed„ «       Zed	„ «       Zdd„Zdd„Zd„ Zd„ Zededd fd„«       Zy
)ÚNetworkStater   r   c                 ó‚   — t        j                  |«      | _        || _        |j	                  dd«      | _        d | _        y )NÚuse_ipv6F)ÚcopyÚdeepcopyÚ_network_stateÚ_versionÚgetrh   Ú_has_default_route)rY   r   r   s      rD   Ú__init__zNetworkState.__init__€   s8   € ô #Ÿm™m¨MÓ:ˆÔØˆŒØ%×)Ñ)¨*°eÓ<ˆŒØ"&ˆÕrF   r>   c                 ó    — | j                   d   S )Nr   )rk   ©rY   s    rD   r   zNetworkState.configˆ   s   € à×"Ñ" 8Ñ,Ð,rF   c                 ó   — | j                   S rH   )rl   rq   s    rD   r   zNetworkState.versionŒ   s   € à�}‰}ÐrF   c                 óJ   — 	 | j                   d   d   S # t        $ r g cY S w xY w)NÚdnsr$   ©rk   ÚKeyErrorrq   s    rD   Údns_nameserverszNetworkState.dns_nameservers�   s1   € ð	Ø×&Ñ& uÑ-¨mÑ<Ð<øÜò 	ØŠIð	úó   ‚ ”"¡"c                 óJ   — 	 | j                   d   d   S # t        $ r g cY S w xY w)Nrt   Úsearchru   rq   s    rD   Údns_searchdomainszNetworkState.dns_searchdomains—   s1   € ð	Ø×&Ñ& uÑ-¨hÑ7Ð7øÜò 	ØŠIð	úrx   c                 ó\   — | j                   €| j                  «       | _         | j                   S rH   )rn   Ú_maybe_has_default_routerq   s    rD   Úhas_default_routezNetworkState.has_default_routež   s+   € à×"Ñ"Ð*Ø&*×&CÑ&CÓ&EˆDÔ#Ø×&Ñ&Ð&rF   Nc              #   ó–   K  — | j                   j                  di «      }|j                  «       D ]  }|€|–— Œ
 ||«      sŒ|–— Œ y ­w)Nr!   )rk   rm   Úvalues)rY   Úfilter_funcÚifacesÚifaces       rD   Úiter_interfaceszNetworkState.iter_interfaces¤   sK   è ø€ Ø×$Ñ$×(Ñ(¨°rÓ:ˆØ—]‘]“_ò 	 ˆEØÐ"Ø“á˜uÕ%Ø“Kñ	 ùs   ‚?A	ÁA	c              #   óv   K  — | j                   j                  dg «      D ]  }|� ||«      sŒ|–— Œ|–— Œ y ­w©NÚroutes©rk   rm   )rY   r�   Úroutes      rD   Úiter_routeszNetworkState.iter_routes­   s@   è ø€ Ø×(Ñ(×,Ñ,¨X°rÓ:ò 	ˆEØÐ&Ù˜uÕ%Ø“Kà“ñ	ùs   ‚*9­9c                 ó  — | j                  «       D ]  }| j                  |«      sŒ y | j                  «       D ]E  }|j                  dg «      D ].  }|j                  dg «      D ]  }| j                  |«      sŒ   y Œ0 ŒG y)NTÚsubnetsr‡   F)rŠ   Ú_is_default_router„   rm   )rY   r‰   rƒ   Úsubnets       rD   r}   z%NetworkState._maybe_has_default_routeµ   s�   € Ø×%Ñ%Ó'ò 	ˆEØ×%Ñ% eÕ,Ùð	ð ×)Ñ)Ó+ò 	$ˆEØŸ)™) I¨rÓ2ò $�Ø#ŸZ™Z¨°"Ó5ò $�EØ×-Ñ-¨eÕ4Û#ñ$ñ$ð	$ð
 rF   c                 óX   — d}|j                  d«      dk(  xr |j                  d«      |v S )N)z::z0.0.0.0Úprefixr   Únetwork)rm   )rY   r‰   Údefault_netss      rD   r�   zNetworkState._is_default_routeÀ   s0   € Ø(ˆà�I‰I�hÓ 1Ñ$ÒM¨¯©°9Ó)=ÀÐ)Mð	
rF   c                 ó4   — i }d|v r|d   |d<    | d|ifi |¤ŽS )záInstantiates a `NetworkState` without interpreting its data.

        That means only `config` and `version` are copied.

        :param network_state: Network state data.
        :return: Instance of `NetworkState`.
        r   r   rU   )Úclsr   r\   s      rD   Úto_passthroughzNetworkState.to_passthroughÆ   s5   € ð ˆØ˜Ñ%Ø -¨iÑ 8ˆF�9ÑÙ�H˜mÐ,Ñ7°Ñ7Ð7rF   rH   )rR   rS   rT   ÚNETWORK_STATE_VERSIONÚdictÚintro   Úpropertyr   r   rw   r{   r~   r„   rŠ   r}   r�   Úclassmethodr•   rU   rF   rD   rf   rf      s»   „ à2Gñ'Ø!ð'Ø,/ó'ð ð-˜ò -ó ð-ð ñó ðð ñó ðð ñó ðð ñ'ó ð'ó
 óò	ò
ð ð8¨4ð 8°Nò 8ó ñ8rF   rf   c                   óü  — e Zd Zi g g g dœdddœZeddf	 d)d„Zedefd„«       Zed„ «       Z	e	j                  d	„ «       Z	d
„ Zd„ Zd„ Zd„ Zd*d„Zd*d„Zd*d„Z edg«      d„ «       Z edg«      d„ «       Z eg d¢«      d„ «       Z eg d¢«      d„ «       Z eddg«      d„ «       Z edg«      d„ «       Zd„ Z edg«      d„ «       Z edg«      d„ «       Z edg«      d „ «       Zd!„ Zd"„ Zd#„ Zd$„ Z d%„ Z!d+d&„Z"d,d'„Z#d(„ Z$y)-ÚNetworkStateInterpreter©r$   rz   FN)r!   r‡   rt   rh   r   c                 óÞ  — || _         || _        t        j                  | j                  «      | _        || j
                  d<   d| _        i | _        || _        | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                   | j"                  | j$                  | j&                  | j(                  | j*                  dœ| _        y )Nr   F)r:   Úbondsr;   ÚbridgesÚ	ethernetsÚ
infinibandÚloopbackÚ
nameserverÚphysicalr‰   ÚvlanÚvlansÚwifis)rl   Ú_configri   rj   Úinitial_network_staterk   Ú_parsedÚ_interface_dns_mapÚ	_rendererÚhandle_bondÚhandle_bondsÚhandle_bridgeÚhandle_bridgesÚhandle_ethernetsÚhandle_infinibandÚhandle_loopbackÚhandle_nameserverÚhandle_physicalÚhandle_routeÚhandle_vlanÚhandle_vlansÚhandle_wifisÚcommand_handlers)rY   r   r   r%   s       rD   ro   z NetworkStateInterpreter.__init__á   sÎ   € ð  ˆŒØˆŒÜ"Ÿm™m¨D×,FÑ,FÓGˆÔØ(.ˆ×Ñ˜HÑ%ØˆŒØ(*ˆÔØ!ˆŒà×$Ñ$Ø×&Ñ&Ø×(Ñ(Ø×*Ñ*Ø×.Ñ.Ø×0Ñ0Ø×,Ñ,Ø×0Ñ0Ø×,Ñ,Ø×&Ñ&Ø×$Ñ$Ø×&Ñ&Ø×&Ñ&ñ!
ˆÕrF   r>   c                 ó  — ddl m} | j                  dk(  rJt        | j                  |«      r4t
        j                  d«       t        j                  | j                  «      S t        | j                  | j                  ¬«      S )Nr   r   é   zPassthrough netplan v2 config©r   )Úcloudinit.net.netplanr   rl   Ú
isinstancer­   ÚLOGÚdebugrf   r•   r©   rk   )rY   ÚNetplanRenderers     rD   r   z%NetworkStateInterpreter.network_stateþ   sW   € åEà�=‰=˜AÒ¤*¨T¯^©^¸_Ô"MÜ�I‰IÐ5Ô6Ü×.Ñ.¨t¯|©|Ó<Ð<Ü˜D×/Ñ/¸¿¹ÔGÐGrF   c                 ó8   — | j                   j                  d«      S ©Nrh   rˆ   rq   s    rD   rh   z NetworkStateInterpreter.use_ipv6  s   € à×"Ñ"×&Ñ& zÓ2Ð2rF   c                 ó>   — | j                   j                  d|i«       y rÅ   )rk   Úupdate)rY   Úvals     rD   rh   z NetworkStateInterpreter.use_ipv6  s   € à×Ñ×"Ñ" J°Ð#4Õ5rF   c                 ót   — | j                   | j                  | j                  dœ}t        j                  |«      S )Nr   )rl   r©   rk   r   Údumps)rY   Ústates     rD   ÚdumpzNetworkStateInterpreter.dump  s1   € à—}‘}Ø—l‘lØ!×0Ñ0ñ
ˆô
 �~‰~˜eÓ$Ð$rF   c                 ó(  — d|vr t         j                  d«       t        d«      ‚t        |d      }t	        ||«      }|r%d|z  }t         j                  |«       t        |«      ‚|D �cg c]	  }|dvsŒ|‘Œ c}D ]  }t        | |||   «       Œ y c c}w )Nr   z$Invalid state, missing version fieldzInvalid state, missing keys: %sr¾   )rÁ   ÚerrorÚ
ValueErrorÚNETWORK_STATE_REQUIRED_KEYSrO   Úsetattr)rY   rË   r_   r]   ÚmsgÚkrN   s          rD   ÚloadzNetworkStateInterpreter.load  s–   € Ø˜EÑ!Ü�I‰IÐ<Ô=ÜÐCÓDÐDä3°E¸)Ñ4DÑEˆÜ  °Ó6ˆÙØ3°|ÑDˆCÜ�I‰I�cŒNÜ˜S“/Ð!ð  -ÖE˜!°¸Ò0D’AÒEò 	+ˆCÜ�D˜#˜u S™zÕ*ñ	+ùÒEs   Á(	BÁ2Bc                 ó@   — t        j                  | j                  «      S rH   )r   rÊ   rk   rq   s    rD   Údump_network_statez*NetworkStateInterpreter.dump_network_state'  s   € Ü�~‰~˜d×1Ñ1Ó2Ð2rF   c                 ó4   — | j                   | j                  dœS )N)r   r   )rl   r©   rq   s    rD   Úas_dictzNetworkStateInterpreter.as_dict*  s   € ØŸ=™=°D·L±LÑAÐArF   c                 ó¨   — | j                   dk(  r| j                  |¬«       d| _        y | j                   dk(  r| j                  |¬«       d| _        y y )Nr   ©Úskip_brokenTr½   )rl   Úparse_config_v1r«   Úparse_config_v2)rY   rÛ   s     rD   Úparse_configz$NetworkStateInterpreter.parse_config-  sO   € Ø�=‰=˜AÒØ× Ñ ¨[Ð Ô9ØˆD�LØ�]‰]˜aÒØ× Ñ ¨[Ð Ô9ØˆD�Lð  rF   c                 ó"  — | j                   D ]   }|d   }	 | j                  |   }	  ||«       Œ" | j                  j                  «       D ]*  \  }}d }	 | j                  d   |   }|sŒ|\  }	}
|	|
dœ|d	<   Œ, y # t        $ r}t        d|z  «      |‚d }~ww xY w# t        $ rA |s‚ t
        j                  d|d¬«       t
        j                  | j                  «       «       Y ŒÔw xY w# t        $ r }t        dj                  |«      «      |‚d }~ww xY w)
NÚtypez"No handler found for  command '%s'úSkipping invalid command: %sT©Úexc_infor!   zINameserver specified for interface {0}, but interface {0} does not exist!r�   rt   )r©   r»   rv   ÚRuntimeErrorrQ   rÁ   ÚwarningrÂ   rÖ   r¬   Úitemsrk   rÏ   Úformat)rY   rÛ   rZ   Úcommand_typeÚhandlerÚeÚ	interfacert   rƒ   r$   rz   s              rD   rÜ   z'NetworkStateInterpreter.parse_config_v15  sD  € Ø—|‘|ò 	9ˆGØ" 6™?ˆLðØ×/Ñ/°Ñ=�ð
	9Ù˜Õ ð	9ð$ #×5Ñ5×;Ñ;Ó=ò 	‰NˆI�sØˆEðØ×+Ñ+¨LÑ9¸)ÑD�ò Ø&)Ñ#�˜Và#.Ø$ñ ��e’ñ	øô ò Ü"Ø8¸<ÑGóàðûðûô "ò 9Ù"Øä—K‘KØ6¸È$ð  ô ô —I‘I˜d×5Ñ5Ó7Ö8ð9ûô ò Ü ð8ß8>¹¸yÓ8Ióð ðûðúsA   –A8¦BÁC%Á8	BÂBÂBÂAC"Ã!C"Ã%	DÃ.D	Ä	Dc                 óº  — ddl m} t        | j                  |«      ry | j                  j                  «       D ]4  \  }}|dv rŒ	 | j                  |   }	  ||«       | j                  |«       Œ6 y # t        $ r}t        d|z  «      |‚d }~ww xY w# t        $ rA |s‚ t        j                  d|d¬«       t        j                  | j                  «       «       Y Œ¡w xY w)Nr   r   )r   r%   z!No handler found for command '%s'rá   Trâ   )r¿   r   rÀ   r­   r©   ræ   r»   rv   rä   Ú
_v2_commonrQ   rÁ   rå   rÂ   rÖ   )rY   rÛ   rÃ   rè   rZ   ré   rê   s          rD   rÝ   z'NetworkStateInterpreter.parse_config_v2X  sà   € ÝEä�d—n‘n oÔ6àà%)§\¡\×%7Ñ%7Ó%9ò 	9Ñ!ˆL˜'ØÐ6Ñ6ØðØ×/Ñ/°Ñ=�ð

9Ù˜Ô Ø—‘ Õ(ñ	9øô
 ò Ü"Ø7¸,ÑFóàðûðûô "ò 9Ù"Øä—K‘KØ6¸È$ð  ô ô —I‘I˜d×5Ñ5Ó7Ö8ð9ús+   ÁA0ÁBÁ0	BÁ9BÂBÂACÃCÚnamec                 ó$   — | j                  |«      S rH   ©r¶   ©rY   rZ   s     rD   r´   z'NetworkStateInterpreter.handle_loopbackt  s   € à×#Ñ# GÓ,Ð,rF   c                 ó(  — | j                   j                  di «      }|j                  |d   i «      }|j                  di «      j                  «       D ]  \  }}|j                  ||i«       Œ t	        |j                  d«      «      }| j
                  sJ|D ]E  }|j                  d«      j                  d«      st        |j                  d«      «      sŒ>d| _         n |j                  d	d
«      }|�t        j                  |«      }|j                  dd
«      }	|	�t        j                  |	«      }	|j                  dd
«      }
|
�t        j                  |
«      }
|j                  |j                  d«      |j                  d«      |j                  d«      |j                  d«      dd|j                  d«      d
d
|||	|
dœ«       |j                  d|j                  d«      «      }| j                   d   j                  ||i«       | j                  «        y
)zþ
        command = {
            'type': 'physical',
            'mac_address': 'c0:d6:9f:2c:e8:80',
            'name': 'eth0',
            'subnets': [
                {'type': 'dhcp4'}
             ],
            'accept-ra': 'true'
        }
        r!   rî   ÚparamsrŒ   rà   Ú6ÚaddressTr(   Nr'   r)   Ú	config_idÚmac_addressÚinetÚmanualr#   )rö   rî   rà   r÷   rø   r*   r#   rõ   ÚgatewayrŒ   r(   r'   r)   )rk   rm   ræ   rÇ   Ú_normalize_subnetsrh   Úendswithr   r	   Úis_truerÖ   )rY   rZ   r!   rƒ   ÚparamrÈ   rŒ   rŽ   Ú	accept_rar'   r)   Ú	iface_keys               rD   r¶   z'NetworkStateInterpreter.handle_physicalx  sâ  € ð ×(Ñ(×,Ñ,¨\¸2Ó>ˆ
Ø—‘˜w v™°Ó3ˆØ!Ÿ+™+ h°Ó3×9Ñ9Ó;ò 	'‰JˆE�3Ø�L‰L˜% ˜Õ&ð	'ô % W§[¡[°Ó%;Ó<ˆð �}Š}Ø!ò �Ø—:‘:˜fÓ%×.Ñ.¨sÔ3´Ø—J‘J˜yÓ)õ8ð %)�D”MÙðð —K‘K ¨TÓ2ˆ	ØÐ ÜŸ™ YÓ/ˆIØ—K‘K ¨TÓ2ˆ	ØÐ ÜŸ™ YÓ/ˆIØ—;‘;˜z¨4Ó0ˆØÐÜ—|‘| HÓ-ˆHØ�‰à$Ÿ[™[¨Ó5ØŸ™ FÓ+ØŸ™ FÓ+Ø&Ÿ{™{¨=Ó9ØØ Ø—{‘{ 5Ó)ØØØ"Ø&Ø&Ø$ñô	
ð" —K‘K ¨W¯[©[¸Ó-@ÓAˆ	Ø×Ñ˜LÑ)×0Ñ0°)¸UÐ1CÔDØ×ÑÕ!rF   )rî   Úvlan_idÚ	vlan_linkc                 ó  — | j                   j                  di «      }| j                  |«       |j                  |j                  d«      i «      }|j                  d«      |d<   |j                  d«      |d<   |j                  |d   |i«       y)zâ
        auto eth0.222
        iface eth0.222 inet static
                address 10.10.10.1
                netmask 255.255.255.0
                hwaddress ether BC:76:4E:06:96:B3
                vlan-raw-device eth0
        r!   rî   r  zvlan-raw-devicer  N)rk   rm   r¶   rÇ   )rY   rZ   r!   rƒ   s       rD   r¸   z#NetworkStateInterpreter.handle_vlanµ  s�   € ð ×(Ñ(×,Ñ,¨\¸2Ó>ˆ
Ø×Ñ˜WÔ%Ø—‘˜wŸ{™{¨6Ó2°BÓ7ˆØ#*§;¡;¨{Ó#;ˆÐÑ Ø"Ÿ;™; yÓ1ˆˆiÑØ×Ñ˜5 ™=¨%Ð0Õ1rF   )rî   Úbond_interfacesró   c                 ó  — | j                  |«       | j                  j                  d«      }|j                  |j                  d«      i «      }|j                  d«      j                  «       D ]  \  }}|j	                  ||i«       Œ |j	                  ddi«       | j                  d   j	                  |d   |i«       |j                  d«      D ]·  }||vr|ddœ}| j                  |«       | j                  j                  di «      }|j                  |«      }|j                  d«      |d	<   |j                  d«      j                  «       D ]  \  }}|j	                  ||i«       Œ | j                  d   j	                  ||i«       Œ¹ y
)aU  
        #/etc/network/interfaces
        auto eth0
        iface eth0 inet manual
            bond-master bond0
            bond-mode 802.3ad

        auto eth1
        iface eth1 inet manual
            bond-master bond0
            bond-mode 802.3ad

        auto bond0
        iface bond0 inet static
             address 192.168.0.10
             gateway 192.168.0.1
             netmask 255.255.255.0
             bond-slaves none
             bond-mode 802.3ad
             bond-miimon 100
             bond-downdelay 200
             bond-updelay 200
             bond-lacp-rate 4
        r!   rî   ró   zbond-slavesÚnoner  r:   )rî   rà   zbond-masterN)r¶   rk   rm   ræ   rÇ   )	rY   rZ   r!   rƒ   rþ   rÈ   ÚifnameÚcmdÚbond_ifs	            rD   r®   z#NetworkStateInterpreter.handle_bondÆ  sw  € ð6 	×Ñ˜WÔ%Ø×(Ñ(×,Ñ,¨\Ó:ˆ
Ø—‘˜wŸ{™{¨6Ó2°BÓ7ˆØ!Ÿ+™+ hÓ/×5Ñ5Ó7ò 	'‰JˆE�3Ø�L‰L˜% ˜Õ&ð	'à�‰�m VÐ,Ô-Ø×Ñ˜LÑ)×0Ñ0°%¸±-ÀÐ1GÔHð —k‘kÐ"3Ó4ò 	HˆFØ˜ZÑ'à"Ø"ñ�ð
 ×$Ñ$ SÔ)à×,Ñ,×0Ñ0°¸rÓBˆJØ —n‘n VÓ,ˆGØ%,§[¡[°Ó%8ˆG�MÑ"à%Ÿk™k¨(Ó3×9Ñ9Ó;ò -‘
��sØ—‘  s˜|Õ,ð-à×Ñ Ñ-×4Ñ4°f¸gÐ5FÕGñ	HrF   Úbridge_interfacesc                 ó¨  — | j                   j                  di «      }|j                  d«      D ]  }||v rŒd|i}| j                  |«       Œ | j                   j                  di «      }| j                  |«       |j                  |j                  d«      i «      }|d   |d<   |j                  di «      j                  «       D ]  \  }}|j	                  ||i«       Œ |j                  d«      }|�Lt        |t        «      s<|dv rd	}n"|d
v rd}nt        dj                  |¬«      «      ‚|j	                  d|i«       |j	                  |d   |i«       y)a¿  
            auto br0
            iface br0 inet static
                    address 10.10.10.1
                    netmask 255.255.255.0
                    bridge_ports eth0 eth1
                    bridge_stp off
                    bridge_fd 0
                    bridge_maxwait 0

        bridge_params = [
            "bridge_ports",
            "bridge_ageing",
            "bridge_bridgeprio",
            "bridge_fd",
            "bridge_gcint",
            "bridge_hello",
            "bridge_hw",
            "bridge_maxage",
            "bridge_maxwait",
            "bridge_pathcost",
            "bridge_portprio",
            "bridge_stp",
            "bridge_waitport",
        ]
        r!   r
  rî   Úbridge_portsró   r8   N)ÚonÚ1r   T)ÚoffÚ0r   Fz2Cannot convert bridge_stp value ({stp}) to boolean)r.   )	rk   rm   r¶   ræ   rÇ   rÀ   ÚboolrÏ   rç   )	rY   rZ   r!   r  r  rƒ   rþ   rÈ   r8   s	            rD   r°   z%NetworkStateInterpreter.handle_bridgeû  sg  € ð> ×(Ñ(×,Ñ,¨\¸2Ó>ˆ
Ø—k‘kÐ"5Ó6ò 	&ˆFØ˜Ñ#Øð ˜ðˆCð × Ñ  Õ%ð	&ð ×(Ñ(×,Ñ,¨\¸2Ó>ˆ
Ø×Ñ˜WÔ%Ø—‘˜wŸ{™{¨6Ó2°BÓ7ˆØ 'Ð(;Ñ <ˆˆnÑØ!Ÿ+™+ h°Ó3×9Ñ9Ó;ò 	'‰JˆE�3Ø�L‰L˜% ˜Õ&ð	'ð —Y‘Y˜|Ó,ˆ
ØÐ!¬*°ZÄÔ*FØ˜^Ñ+Ø!‘
Ø˜Ñ.Ø"‘
ä ðß%™v¨*˜vÓ5óð ð �L‰L˜,¨
Ð3Ô4à×Ñ˜5 ™=¨%Ð0Õ1rF   c                 ó&   — | j                  |«       y rH   rð   rñ   s     rD   r³   z)NetworkStateInterpreter.handle_infiniband<  s   € à×Ñ˜WÕ%rF   c                 óâ   — g }g }d|v r0|d   }t        |t        «      s|g}|D ]  }|j                  |«       Œ d|v r0|d   }t        |t        «      s|g}|D ]  }|j                  |«       Œ ||fS )Nrõ   rz   )rÀ   ÚlistÚappend)rY   rZ   r$   rz   ÚaddrsÚaddrÚpathsÚpaths           rD   Ú
_parse_dnsz"NetworkStateInterpreter._parse_dns@  s•   € ØˆØˆØ˜ÑØ˜IÑ&ˆEÜ˜e¤TÔ*Ø˜�Øò )�Ø×"Ñ" 4Õ(ð)à�wÑØ˜HÑ%ˆEÜ˜e¤TÔ*Ø˜�Øò $�Ø—‘˜dÕ#ð$à˜FÐ"Ð"rF   rõ   c                 óä   — | j                   j                  d«      }| j                  |«      \  }}d|v r||f| j                  |d   <   y |d   j	                  |«       |d   j	                  |«       y )Nrt   rë   r$   rz   )rk   rm   r  r¬   Úextend)rY   rZ   rt   r$   rz   s        rD   rµ   z)NetworkStateInterpreter.handle_nameserverQ  sw   € à×!Ñ!×%Ñ% eÓ,ˆØ"Ÿo™o¨gÓ6Ñˆ�VØ˜'Ñ!àØð=ˆD×#Ñ# G¨KÑ$8Ò9ð
 �Ñ×%Ñ% kÔ2Ø�‰M× Ñ  Õ(rF   c                 óx   — | j                   j                  d«      }| j                  |«      \  }}||dœ||   d<   y )Nr!   r�   rt   )rk   rm   r  )rY   rZ   rƒ   Ú_ifacer$   rz   s         rD   Ú_handle_individual_nameserverz5NetworkStateInterpreter._handle_individual_nameserver^  s>   € à×$Ñ$×(Ñ(¨Ó6ˆØ"Ÿo™o¨gÓ6Ñˆ�VØ/:ÀfÑMˆˆu‰�eÒrF   Údestinationc                 óR   — | j                   d   j                  t        |«      «       y r†   )rk   r  Ú_normalize_routerñ   s     rD   r·   z$NetworkStateInterpreter.handle_routed  s!   € à×Ñ˜HÑ%×,Ñ,Ô-=¸gÓ-FÕGrF   c                 ó*   — | j                  |d¬«       y)aç  
        v2_command = {
          bond0: {
            'interfaces': ['interface0', 'interface1'],
            'parameters': {
               'mii-monitor-interval': 100,
               'mode': '802.3ad',
               'xmit_hash_policy': 'layer3+4'}},
          bond1: {
            'bond-slaves': ['interface2', 'interface7'],
            'parameters': {
                'mode': 1,
            }
          }
        }

        v1_command = {
            'type': 'bond'
            'name': 'bond0',
            'bond_interfaces': [interface0, interface1],
            'params': {
                'bond-mode': '802.3ad',
                'bond_miimon: 100,
                'bond_xmit_hash_policy': 'layer3+4',
            }
        }

        r:   ©Úcmd_typeN©Ú_handle_bond_bridgerñ   s     rD   r¯   z$NetworkStateInterpreter.handle_bondsi  s   € ð: 	× Ñ  °6Ð Õ:rF   c                 ó*   — | j                  |d¬«       y)a÷  
        v2_command = {
          br0: {
            'interfaces': ['interface0', 'interface1'],
            'forward-delay': 0,
            'stp': False,
            'maxwait': 0,
          }
        }

        v1_command = {
            'type': 'bridge'
            'name': 'br0',
            'bridge_interfaces': [interface0, interface1],
            'params': {
                'bridge_stp': 'off',
                'bridge_fd: 0,
                'bridge_maxwait': 0
            }
        }

        r;   r$  Nr&  rñ   s     rD   r±   z&NetworkStateInterpreter.handle_bridgesˆ  s   € ð. 	× Ñ  °8Ð Õ<rF   c                 ó’  — t        «       }|j                  «       D �])  \  }}|ddœ}|j                  di «      }|j                  dd«      }|s t        j	                  d|t        |«      «       ||d<   |}|j                  d«      }	|	r|	}n#|r!|r|j                  «       }
t        |
«      }|r|}||d	<   |j                  d
d«      }|rd
|i|d<   dD ]  }||v sŒ||   ||<   Œ t        |«       | j                  |«      }t        |«      dkD  r|j                  d|i«       t        j	                  d|«       | j                  |«       �Œ, y)a�  
        ethernets:
          eno1:
            match:
              macaddress: 00:11:22:33:44:55
              driver: hv_netvsc
            wakeonlan: true
            dhcp4: true
            dhcp6: false
            addresses:
              - 192.168.14.2/24
              - 2001:1::1/64
            gateway4: 192.168.14.1
            gateway6: 2001:1::2
            nameservers:
              search: [foo.local, bar.local]
              addresses: [8.8.8.8, 8.8.4.4]
          lom:
            match:
              driver: ixgbe
            set-name: lom1
            dhcp6: true
            accept-ra: true
          switchports:
            match:
              name: enp2*
            mtu: 1280

        command = {
            'type': 'physical',
            'mac_address': 'c0:d6:9f:2c:e8:80',
            'name': 'eth0',
            'subnets': [
                {'type': 'dhcp4'}
             ]
        }
        r¥   )rö   rà   r"   Ú
macaddressNzHNetworkState Version2: missing "macaddress" info in config entry: %s: %sr÷   r&   rî   Údriverró   )r#   r"   r'   r(   r)   r   rŒ   z!v2(ethernets) -> v1(physical):
%s)r   ræ   rm   rÁ   rÂ   ÚstrÚlowerr
   rE   Ú_v2_to_v1_ipcfgÚlenrÇ   r¶   )rY   rZ   Úifaces_by_macÚethÚcfgÚphy_cmdr"   r÷   rî   Úset_nameÚlcase_mac_addressÚmacr+  rN   rŒ   s                  rD   r²   z(NetworkStateInterpreter.handle_ethernets¡  sf  € ôZ .Ó/ˆàŸ™›ó .	*‰HˆC�à Ø"ñˆGð —G‘G˜G RÓ(ˆEØŸ)™) L°$Ó7ˆKÙÜ—	‘	ð.àÜ˜“Hô	ð &1ˆG�MÑ"ð ˆDØ—w‘w˜zÓ*ˆHÙØ‘Ù¡Ø$/×$5Ñ$5Ó$7Ð!Ü2Ð3DÓE�ÙØ�DØ"ˆG�F‰Oà—Y‘Y˜x¨Ó.ˆFÙØ%-¨vÐ$6�˜Ñ!ØMò ,�Ø˜#’:Ø#& s¡8�G˜C’Lð,ô (¨Ô,à×*Ñ*¨3Ó/ˆGÜ�7‹|˜aÒØ—‘ 	¨7Ð3Ô4ä�I‰IÐ:¸GÔDØ× Ñ  Ö)ñ].	*rF   c                 ó^  — |j                  «       D ]š  \  }}d||j                  d«      |j                  d«      dœ}d|v r|d   |d<   t        |«       | j                  |«      }t	        |«      dkD  r|j                  d|i«       t        j                  d|«       | j                  |«       Œœ y	)
aq  
        v2_vlans = {
            'eth0.123': {
                'id': 123,
                'link': 'eth0',
                'dhcp4': True,
            }
        }

        v1_command = {
            'type': 'vlan',
            'name': 'eth0.123',
            'vlan_link': 'eth0',
            'vlan_id': 123,
            'subnets': [{'type': 'dhcp4'}],
        }
        r¦   ÚidÚlink)rà   rî   r  r  r#   r   rŒ   zv2(vlans) -> v1(vlan):
%sN)	ræ   rm   rE   r.  r/  rÇ   rÁ   rÂ   r¸   )rY   rZ   r¦   r2  Úvlan_cmdrŒ   s         rD   r¹   z$NetworkStateInterpreter.handle_vlans   s¨   € ð$ !Ÿ™›ò 	'‰IˆD�#àØØŸ7™7 4›=Ø ŸW™W V›_ñ	ˆHð ˜‰|Ø"% e¡*�˜‘Ü'¨Ô,Ø×*Ñ*¨3Ó/ˆGÜ�7‹|˜aÒØ—‘ ¨GÐ 4Ô5Ü�I‰IÐ2°HÔ=Ø×Ñ˜XÕ&ñ	'rF   c                 ó.   — t         j                  d«       y )NzOWifi configuration is only available to distros with netplan rendering support.)rÁ   rå   rñ   s     rD   rº   z$NetworkStateInterpreter.handle_wifis"  s   € Ü�‰ð*õ	
rF   c                 ó2  — t         j                  d|«       |j                  «       D ]n  \  }}d|v sŒ|j                  d«      j                  d«      }|j                  d«      j                  d«      }ddi}|r||d<   |r||d<   | j	                  ||«       Œp y )Nzv2_common: handling config:
%sr$   rz   r   rà   r¤   rõ   )rÁ   rÂ   ræ   rm   r  )rY   r2  rƒ   Údev_cfgrz   rt   Úname_cmds          rD   rí   z"NetworkStateInterpreter._v2_common(  sš   € Ü�	‰	Ð3°SÔ9Ø!Ÿi™i›kò 
	D‰NˆE�7Ø Ò'Ø Ÿ™ ]Ó3×7Ñ7¸ÓA�Ø—k‘k -Ó0×4Ñ4°[ÓA�Ø" LÐ1�ÙØ)/�H˜XÑ&ÙØ*-�H˜YÑ'à×2Ñ2°8¸UÕCñ
	DrF   c                 ó  ‡
— t        d„ t        j                  |«      j                  «       D «       «      Š
|j                  «       D �]7  \  }}t        d„ |j                  «       D «       «      }|j                  di «      }|j	                  dd«      }|r||d<   d|d||d	z   |j                  d
«      dt        ˆ
fd„|j                  «       D «       «      i}d|v r|d   |d<   t        |«       | j                  |«      }	t        |	«      dkD  r|j                  d|	i«       t        j                  d|||«       |dk(  r| j                  |«       �Œ|dk(  r| j                  |«       �Œt        dj                  |¬«      «      ‚ y)z(Common handler for bond and bridge typesc              3   ó*   K  — | ]  \  }}||f–— Œ y ­wrH   rU   ©Ú.0rÓ   Úvs      rD   ú	<genexpr>z>NetworkStateInterpreter._handle_bond_bridge.<locals>.<genexpr>:  s   è ø€ ò 
Ù�q˜!ˆQ�ŒFñ
ùs   ‚c              3   ó:   K  — | ]  \  }}|t         vr||f–— Œ y ­wrH   )ÚNETWORK_V2_KEY_FILTER)rB  rN   Úvalues      rD   rD  z>NetworkStateInterpreter._handle_bond_bridge.<locals>.<genexpr>?  s)   è ø€ ò á �S˜%ØÔ3Ñ3ð �e”ñùs   ‚Ú
parameterszgratuitious-arpNr+   rà   rî   Ú_interfacesr!   ró   c              3   ó2   •K  — | ]  \  }}‰|   |f–— Œ y ­wrH   rU   )rB  rÓ   rC  Úv2key_to_v1s      €rD   rD  z>NetworkStateInterpreter._handle_bond_bridge.<locals>.<genexpr>O  s   øè ø€ ÒN±t°q¸! ¨A¡°Ô2ÑNùs   ƒr#   r   rŒ   zv2(%s) -> v1(%s):
%sr;   r:   z Unknown command type: {cmd_type}r$  )r—   r<   rm   ræ   ÚpoprE   r.  r/  rÇ   rÁ   rÂ   r°   r®   rÏ   rç   )rY   rZ   r%  Ú	item_nameÚitem_cfgÚitem_paramsró   Ú
grat_valueÚv1_cmdrŒ   rK  s             @rD   r'  z+NetworkStateInterpreter._handle_bond_bridge6  s†  ø€ ô ñ 
Ü/×3Ñ3°HÓ=×CÑCÓEô
ó 
ˆð $+§=¡=£?ó %	ÑˆI�xÜñ à$,§N¡NÓ$4ôó ˆKð !—_‘_ \°2Ó6ˆFØŸ™Ð$5°tÓ<ˆJÙØ+5�Ð'Ñ(ð ˜Ø˜	Ø˜=Ñ(¨(¯,©,°|Ó*DØœ$ÓN¸v¿|¹|»~ÔNÓNð	ˆFð ˜Ñ Ø (¨¡��u‘ä'¨Ô1Ø×*Ñ*¨8Ó4ˆGÜ�7‹|˜aÒØ—‘˜y¨'Ð2Ô3ä�I‰IÐ-¨x¸À6ÔJØ˜8Ò#Ø×"Ñ" 6Ö*Ø˜VÒ#Ø× Ñ  Ö(ä Ø6×=Ñ=Ø!)ð >ó óð ñC%	rF   c                 ó   — d„ }g }|j                  d«      r.ddi} ||j                  di «      |«       |j                  |«       |j                  d«      r5ddi}d| _         ||j                  di «      |«       |j                  |«       d}d}i }|j                  d	g «      D ]Ö  }d
|dœ}d|v r+d|v rQ|€O|j                  d«      }|j                  d|i«       n*d|v r&|€$|j                  d«      }|j                  d|i«       d|v ra|s_|j                  d«      j                  d	«      }	|	r|	|d<   |j                  d«      j                  d«      }
|
r|
|d<   |j                  |«       |j                  |«       ŒØ g }|j                  dg «      D ]]  }|j                  t	        |j                  d«      |j                  d«      |j                  d«      |j                  d«      dœ«      «       Œ_ t        |«      rt        |«      r||d   d<   |S )z7Common ipconfig extraction from v2 to v1 subnets array.c                 ó   — d| v r	| d   |d<   y y )Nzroute-metricÚmetricrU   )Ú	overridesrŽ   s     rD   Ú_add_dhcp_overrideszDNetworkStateInterpreter._v2_to_v1_ipcfg.<locals>._add_dhcp_overridesh  s   € Ø Ñ*Ø#,¨^Ñ#<��xÒ ð +rF   r   rà   r   r   Tr   Nr   Ústatic)rà   rõ   ú:r    rú   r   r$   rw   rz   Ú
dns_searchr‡   ÚtoÚviarT  r#   )r   rú   rT  r#   r   )rm   r  rh   rÇ   r"  r/  )rY   r2  rV  rŒ   rŽ   r   r    r$   rõ   r   rz   r‡   r‰   s                rD   r.  z'NetworkStateInterpreter._v2_to_v1_ipcfge  s  € ò	=ð ˆØ�7‰7�7ÔØ˜gÐ&ˆFÙ §¡Ð(9¸2Ó >ÀÔGØ�N‰N˜6Ô"Ø�7‰7�7ÔØ˜gÐ&ˆFØ ˆDŒMÙ §¡Ð(9¸2Ó >ÀÔGØ�N‰N˜6Ô"àˆØˆØˆØ—w‘w˜{¨BÓ/ò 	#ˆGà Ø"ñˆFð
 �g‰~Ø Ñ$¨Ð)9Ø"Ÿw™w zÓ2�HØ—M‘M 9¨hÐ"7Õ8à Ñ$¨Ð)9Ø"Ÿw™w zÓ2�HØ—M‘M 9¨hÐ"7Ô8à Ñ#©KØŸG™G MÓ2×6Ñ6°{ÓC�	ÙØ5>�KÐ 1Ñ2ØŸ™ Ó/×3Ñ3°HÓ=�ÙØ06�K Ñ-Ø—‘˜kÔ*à�N‰N˜6Õ"ð1	#ð4 ˆØ—W‘W˜X rÓ*ò 
	ˆEØ�M‰MÜ à',§y¡y°£Ø#(§9¡9¨UÓ#3Ø"'§)¡)¨HÓ"5Ø$Ÿy™y¨Ó/ñ	óõ	ð
	ô ˆwŒ<œC œKØ#)ˆG�A‰J�xÑ àˆrF   )r%   zOptional[Renderer])T)r>   NrH   )%rR   rS   rT   rª   r–   ro   r™   rf   r   rh   ÚsetterrÌ   rÔ   rÖ   rØ   rÞ   rÜ   rÝ   rd   r´   r¶   r¸   r®   r°   r³   r  rµ   r  r·   r¯   r±   r²   r¹   rº   rí   r'  r.  rU   rF   rD   rœ   rœ   Õ   sÞ  „ àØàØñ
ð Øñ	Ðð &ØØ)-ð	
ð 'ó	
ð: ðH˜|ò Hó ðHð ñ3ó ð3ð ‡_�_ñ6ó ð6ò%ò+ò 3òBó ó!óF9ñ8 ˜&˜Ó"ñ-ó #ð-ñ ˜&˜Ó"ñ:"ó #ð:"ñx Ò9Ó:ñ2ó ;ð2ñ  Ò>Ó?ñ2Hó @ð2Hñh ˜&Ð"5Ð6Ó7ñ>2ó 8ð>2ñ@ ˜&˜Ó"ñ&ó #ð&ò#ñ" ˜)˜Ó%ñ
)ó &ð
)ñ ˜)˜Ó%ñNó &ðNñ
 ˜-˜Ó)ñHó *ðHò;ò>=ò2]*ò~ 'òD
óDó-ó^ArF   rœ   c                 óV  — t        j                  | «      } t        d„ | j                  «       D «       «      }| j	                  d«      dv r|j                  t        |d¬«      «       | j	                  dg «      D �cg c]  }t        |«      ‘Œ c}|d<   d„ }dD ]  } |||«       Œ |S c c}w )	Nc              3   ó0   K  — | ]  \  }}|sŒ	||f–— Œ y ­wrH   rU   rA  s      rD   rD  z$_normalize_subnet.<locals>.<genexpr>¬  s   è ø€ Ò@¡D A qºa˜!˜QœÑ@ùs   ‚
�	rà   )rW  Ústatic6)rõ   Ú
ip_address©Úaddress_keysr‡   c                 ób   — || v r+t        | |   t        «      s| |   j                  «       | |<   y y y rH   )rÀ   r  Úsplit)Úsnetrî   s     rD   Úlistifyz"_normalize_subnet.<locals>.listify¼  s3   € Ø�4‰<¤
¨4°©:´tÔ <Ø˜d™×)Ñ)Ó+ˆD�ŠJð !=ˆ<rF   )rY  rw   )ri   rj   r—   ræ   rm   rÇ   Ú_normalize_net_keysr"  )rŽ   Únormal_subnetÚrrf  rÓ   s        rD   Ú_normalize_subnetrj  ©  s°   € ä�]‰]˜6Ó"€FÜÑ@¨F¯L©L«NÔ@Ó@€Mà‡z�z�&ÓÐ2Ñ2Ø×ÑÜØðôô	
ð &,§Z¡Z°¸"Ó%=öØ !Ô˜Õò€M�(Ñò,ð /ò "ˆÙ�˜qÕ!ð"ð Ðùòs   Á9B&c                 óØ  — | j                  «       D ��ci c]  \  }}|s|dk(  sŒ||“Œ }}}d}|D ]  }|j                  |«      sŒ|} n |s7ddj                  |«      ›d| ›�}t        j	                  |«       t        |«      ‚t        |j                  |«      «      }t        |«      s%t        j	                  d|«       t        d|› d�«      ‚t        |«      }	t        |«      }
|j                  d	«      }d
|v r[|j                  d
«      \  }}}|||<   |	rt        |«      }nl|
rt        |«      }n^t        j	                  d|«       t        d|› d�«      ‚d|v rt        |d   «      }n&|r|
rt        |«      }n|r|	rt        |«      }n|	rdnd}d|v r1t        |d   «      t        |«      k7  rt        j                  d||«       ||d<   |	r	d	|v r|d	= |S |
rt        |d   «      |d	<   |S c c}}w )a¬  Normalize dictionary network keys returning prefix and address keys.

    @param network: A dict of network-related definition containing prefix,
        netmask and address_keys.
    @param address_keys: A tuple of keys to search for representing the address
        or cidr. The first address_key discovered will be used for
        normalization.

    @returns: A dict containing normalized prefix and matching addr_key.
    r   Nz No config network address keys [ú,z] found in z$Address %s is not a valid ip networkzAddress z is not a valid ip addressÚnetmaskú/r�   é@   é   z;Overwriting existing 'prefix' with '%s' in network info: %s)ræ   rm   ÚjoinrÁ   rÎ   rÏ   r,  r   r   r   Ú	partitionr   r   r˜   rå   r   )r‘   rb  rÓ   rC  ÚnetÚaddr_keyrN   Úmessager  Úipv6Úipv4rm  Ú	addr_partÚ_Úmaybe_prefixr�   s                   rD   rg  rg  Æ  s  € ð $ŸM™M›O×
;‘D�A�q©q°A¸³Fˆ1ˆa‰4Ð
;€CÑ
;Ø€HØò ˆØ�7‰7�3�<ØˆHÙðò à�H‰H�\Õ"Ùð
ˆô 	�	‰	�'ÔÜ˜Ó!Ð!äˆs�w‰w�xÓ Ó!€DÜ˜ÔÜ�	‰	Ð8¸$Ô?Ü˜8 D 6Ð)CÐDÓEÐEä˜4Ó €DÜ˜4Ó €Dà�g‰g�iÓ €GØ
ˆd�{Ø%)§^¡^°CÓ%8Ñ"ˆ	�1�lØ!ˆˆH‰Ùä,¨\Ó:‰FÙä,¨\Ó:‰Fô �I‰IÐ<¸dÔCÜ˜x¨ vÐ-GÐHÓIÐIØ	�S‰Ü�S˜‘]Ó#‰Ù	‘TÜ(¨Ó1‰Ù	‘TÜ(¨Ó1‰á‘ ˆà�3�œ3˜s 8™}Ó-´°V³Ò<Ü�‰ØIØØô	
ð
 €Cˆ�Máð ˜ÑØ�I�ð €Jñ 
Ü0°°X±Ó?ˆˆI‰à€Jùó} <s
   ”G&¤G&c                 ó<  — t        d„ | j                  «       D «       «      }d|v r|d   |d<   |d= |j                  t        |d¬«      «       |j	                  d«      }|r	 t        |«      |d<   |S |S # t        $ r }t        dj                  |«      «      |‚d}~ww xY w)	aƒ  normalize a route.
    return a dictionary with only:
       'type': 'route' (only present if it was present in input)
       'network': the network portion of the route as a string.
       'prefix': the network prefix for address as an integer.
       'metric': integer metric (only if present in input).
       'netmask': netmask (string) equivalent to prefix iff network is ipv4.
    c              3   ó4   K  — | ]  \  }}|d vsŒ||f–— Œ y­w))Ú NNrU   rA  s      rD   rD  z#_normalize_route.<locals>.<genexpr>  s$   è ø€ ò Ù�1�a¨A°ZÒ,?ˆˆAŒñùs   ‚�	r   r‘   )r‘   r   ra  rT  z(Route config metric {} is not an integerN)	r—   ræ   rÇ   rg  rm   r˜   rÏ   Ú	TypeErrorrç   )r‰   Únormal_routerT  rê   s       rD   r"  r"    sÃ   € ô ñ Ø Ÿ;™;›=ôó €Lð ˜Ñ$Ø".¨}Ñ"=ˆ�YÑØ˜Ð'à×ÑÜØÐ'Aô	
ôð ×Ñ˜hÓ'€FÙð	Ü%(¨£[ˆL˜Ñ"ð
 Ðˆ<Ðøô	 ò 	ÜØ:×AÑAÀ&ÓIóàðûð	ús   Á A2 Á2	BÁ;BÂBc                 óF   — | sg } | D �cg c]  }t        |«      ‘Œ c}S c c}w rH   )rj  )rŒ   Úss     rD   rû   rû   4  s$   € ÙØˆØ*1Ö2 QÔ˜aÕ Ò2Ð2ùÒ2s   ‰Ú
net_configrÛ   c                 óÜ   — d}| j                  d«      }| j                  d«      }|dk(  r| }|r.|�,t        |||¬«      }|j                  |¬«       |j                  }|st	        d| › �«      ‚|S )zfParses the config, returns NetworkState object

    :param net_config: curtin network config dict
    Nr   r   r½   )r   r   r%   rÚ   zpNo valid network_state object created from network config. Did you specify the correct version? Network config:
)rm   rœ   rÞ   r   rä   )r‚  rÛ   r%   rË   r   r   Únsis          rD   Úparse_net_config_datar…  :  s‘   € ð €EØ�n‰n˜YÓ'€GØ�^‰^˜HÓ%€FØ�!‚|ð ˆá�6Ð%Ü%Ø F°Xô
ˆð 	×Ñ [ÐÔ1Ø×!Ñ!ˆáÜðEàˆlðó
ð 	
ð €LrF   )rU   )TN)/ri   ra   ÚloggingÚtypingr   r   r   r   Ú	cloudinitr   r   r	   Úcloudinit.netr
   r   r   r   r   r   r   r   r   Úcloudinit.net.rendererr   Ú	getLoggerrR   rÁ   r–   rÐ   rF  r<   r,  Ú__annotations__r—   rE   rO   Ú	ExceptionrQ   rd   rf   rœ   rj  rg  r"  rû   r  r…  rU   rF   rD   ú<module>rŽ     s`  ðô Û Û ß 5Ó 5ç /Ñ /÷
÷ 
õ 
ñ Ý/à€g×Ñ˜Ó!€àÐ àÒ-ðÐ òÐ ð* &Ø+Ø-Ø+Ø&Ø4Ø%Ø-Ø%ØØ-Ø!Ø!:Ø"Ø!7ñð$ 'Ø'Ø$ØØ$Ø"ØØ&Ø*ØØññ%/Ð �$�s˜D  c ™NÐ*Ñ+ó ðD
 dð 
¨tó 
òô	�Yô 	ò÷$S8ñ S8÷lQñ Qòhó:IòXòD3ð ØñØðàðð ô	rF   