Ë
    *CàeæO  ã                   ó¦   — d Z ddlZddlZddlZddlZddlmZ 	 ddlZdZddl	m
Z
 ddlZddlmZ  G d	„ d
ej                  «      Zy# e$ r dZY Œ/w xY w)znetplan migrate command lineé    N)ÚglobFT)ÚOrderedDicté   )Úutilsc                   óJ   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	d„Z
ˆ xZS )
ÚNetplanMigratec                 ó,   •— t         ‰| �  dddd¬«       y )NÚmigratez/Migration of /etc/network/interfaces to netplanT)Ú
command_idÚdescriptionÚleafÚtesting)ÚsuperÚ__init__)ÚselfÚ	__class__s    €ú6/usr/share/netplan/netplan_cli/cli/commands/migrate.pyr   zNetplanMigrate.__init__%   s    ø€ Ü‰Ñ IØ%VØ"Ø!%ð 	õ 	'ó    c                 ó6  — d|v rHd|vri |d<   d|d   vrg |d   d<   |d   j                  d«      D ]  }|sŒ|d   dxx   |gz  cc<   Œ |d= d|v rId|vri |d<   d|d   vrg |d   d<   |d   j                  d«      D ]  }|sŒ|d   dxx   |gz  cc<   Œ |d= yy)zÂParse dns options (dns-nameservers and dns-search) from if_options
        (an interface options dict) into the interface configuration if_config
        Mutates the arguments in place.
        zdns-nameserversÚnameserversÚ	addressesú z
dns-searchÚsearchN)Úsplit)r   Ú
if_optionsÚ	if_configÚnsÚdomains        r   Úparse_dns_optionsz NetplanMigrate.parse_dns_options+   s  € ð
  
Ñ*Ø IÑ-Ø+-�	˜-Ñ(Ø )¨MÑ":Ñ:Ø8:�	˜-Ñ(¨Ñ5Ø Ð!2Ñ3×9Ñ9¸#Ó>ò >�áØà˜-Ñ(¨Ó5¸"¸Ñ=Ô5ð>ð Ð,Ð-Ø˜:Ñ%Ø IÑ-Ø+-�	˜-Ñ(Ø˜y¨Ñ7Ñ7Ø57�	˜-Ñ(¨Ñ2Ø$ \Ñ2×8Ñ8¸Ó=ò ?�áØØ˜-Ñ(¨Ó2°v°hÑ>Ô2ð	?ð
 ˜<Ñ(ð &r   c                 ó0  — d|v rT	 t        |d   «      }d|v r8|d   k(  s0t        j                  d|||d   «       t	        j
                  d«       |d<   |d= yy# t        $ r2 t        j                  d||d   «       t	        j
                  d«       Y Œ€w xY w)z”Parse out the MTU. Operates the same way as parse_dns_options
        iface is the name of the interface, used only to print error messages
        Úmtuz%s: cannot parse "%s" as an MTUr   z0%s: tried to set MTU=%d, but already have MTU=%dN)ÚintÚ
ValueErrorÚloggingÚerrorÚsysÚexit)r   Úifacer   r   r!   s        r   Ú	parse_mtuzNetplanMigrate.parse_mtuH   s§   € ð
 �JÑðÜ˜* UÑ+Ó,�ð
 ˜	Ñ!¨)°EÑ*:¸cÒ*AÜ—‘ÐPÐRWÐY\Ð^gÐhmÑ^nÔoÜ—‘˜”à"ˆI�eÑØ˜5Ñ!ð øô ò Ü—‘Ð?ÀÈ
ÐSXÑHYÔZÜ—‘˜–ðús   †A Á8BÂBc                 ó¨   — d|v rNd|v r>|d   |d   k(  s3t        j                  d||d   |d   «       t        j                  d«       |d   |d<   |d= yy)z°Parse out the manually configured MAC.
        Operates the same way as parse_dns_options
        iface is the name of the interface, used only to print error messages
        Ú	hwaddressÚ
macaddressz0%s: tried to set MAC %s, but already have MAC %sr   N)r$   r%   r&   r'   )r   r(   r   r   s       r   Úparse_hwaddresszNetplanMigrate.parse_hwaddress[   so   € ð ˜*Ñ$Ø˜yÑ(°¸<Ñ1HÈJÐWbÑLcÒ1cÜ—‘ÐPÐRWØ(¨Ñ5°yÀÑ7NôPä—‘˜”à&0°Ñ&=ˆI�lÑ#Ø˜;Ñ'ð %r   c                 ó<  — | j                   j                  dd¬«       | j                   j                  ddd¬«       | j                  | _        | j	                  «        t
        r*t        j                  d«       t        j                  d	«       | j                  «        y )
Nz
--root-dirzOSearch for and generate configuration files in this root directory instead of /)Úhelpz	--dry-runÚ
store_truezQPrint converted netplan configuration to stdout instead of writing/changing files)Úactionr/   z¥The `yaml` Python package couldn't be imported, and is needed for the migrate command.
To install it on Debian or Ubuntu-based system, run `apt install python3-yaml`é   )ÚparserÚadd_argumentÚcommand_migrateÚfuncÚ
parse_argsÚNO_YAMLr$   r%   r&   r'   Úrun_command)r   s    r   ÚrunzNetplanMigrate.runj   s‚   € Ø�‰× Ñ  Ø&wð 	!ô 	yà�‰× Ñ  °\Ø&yð 	!ô 	{à×(Ñ(ˆŒ	à�‰ÔÝÜ�M‰Mð Rô Sä�H‰H�QŒKØ×ÑÕr   c           
      óŽ  — i }	 | j                  | j                  xs d«      \  }}j                  «       D �]\  \  }}|j                  «       D �]B  \  }}t        j                  d|||«       |vr+t        j                  d|«       t        j                  d«       |d   dk(  rt        j                  d|«       Œm|d   dk(  rÈ|j                  d	i «      j                  d
i «      j                  |i «      }	| j                  |d   |	«       | j                  ||d   |	«       |d   rLt        j                  d|dj                  |d   j                  «       «      «       t        j                  d«       |dk(  rd|	d<   �Œ/|dk(  sJ ‚d|	d<   �Œ=|d   dk(  �rÎ|j                  d	i «      j                  d
i «      j                  |i «      }	d|	vrg |	d<   | j                  |d   |	«       | j                  ||d   |	«       | j                  ||d   |	«       |dk(  �rØt!        g d¢«      }
t!        g d¢«      }t!        |d   j                  «       «      }||
z
  }|rz|j#                  |«      D ]/  }t        j                  d|||«       t        j                  d«       Œ1 ||z
  D ]/  }t        j                  d|||«       t        j                  d«       Œ1 d|d   vr+t        j                  d|«       t        j                  d«       d|d   d   v r#|d   d   j%                  d«      d   }|d   d   }nNd|d   vr+t        j                  d|«       t        j                  d«       |d   d   }|d   d   dz   |d   d   z   }	 t'        j(                  |«      }	 t'        j,                  |d ¬!«      }|	dxx   t        «      dz   t        j0                  «      z   gz  cc<   d#|d   v s�Œ“|d   d#   |	d$<   �Œ |dk(  sJ ‚t!        g d%¢«      }
t!        g d&¢«      }t!        |d   j                  «       «      }||
z
  }|rz|j#                  |«      D ]/  }t        j                  d|||«       t        j                  d«       Œ1 ||z
  D ]/  }t        j                  d|||«       t        j                  d«       Œ1 d|d   vr+t        j                  d|«       t        j                  d«       d|d   d   v r#|d   d   j%                  d«      d   }|d   d   }nNd|d   vr+t        j                  d|«       t        j                  d«       |d   d   }|d   d   dz   |d   d   z   }	 t'        j2                  |«      }	 t'        j4                  |d ¬!«      }|	dxx   t        «      dz   t        j0                  «      z   gz  cc<   d#|d   v r|d   d#   |	d)<   d*|d   v s�Œ„|d   d*   d+k(  rd |	d*<   �Œ–|d   d*   d,k(  rd|	d*<   �Œ¨|d   d*   d-k(  r-t        j                  d.|«       t        j                  d«       �Œàt        j                  d/||d   d*   «       t        j                  d«       �Œt        j                  d0||d   «       t        j                  d«       �ŒE �Œ_ t6        j8                  j                  | j                  xs dd1«      }|rÔd|d	   d2<   t;        j<                  |«      }| j>                  rtA        |«       n´t6        j8                  j                  | j                  xs dd3«      }	 t7        jB                  t6        j8                  jE                  |«      «       	 tI        |d4«      5 }|jK                  |«       d d d «       t        jL                  d7|«       nt        jL                  d8«       | j>                  s1t        jL                  d9||«       t7        jN                  ||d:z   «       y y # t        $ r>}t        j                  t        |«      «       t        j                  d«       Y d }~�Œ	d }~ww xY w# t&        j*                  $ r8}t        j                  d|||«       t        j                  d«       Y d }~�Œîd }~ww xY w# t&        j.                  $ r8}t        j                  d"|||«       t        j                  d«       Y d }~�Œ$d }~ww xY w# t&        j*                  $ r8}t        j                  d'|||«       t        j                  d«       Y d }~�Œ«d }~ww xY w# t&        j.                  $ r8}t        j                  d(|||«       t        j                  d«       Y d }~�Œád }~ww xY w# tF        $ r Y �Œw xY w# 1 sw Y   �ŒxY w# tF        $ r/ t        j                  d5|«       t        j                  d6«       Y �Œ@w xY w);NÚ r   zConverting %s family %s %sz.%s: non-automatic interfaces are not supportedÚmethodÚloopbackzIgnoring loopback interface %sÚdhcpÚnetworkÚ	ethernetsÚoptionsz2%s: option(s) %s are not supported for dhcp methodz, ÚinetTÚdhcp4Úinet6Údhcp6Ústaticr   )ÚaddressÚnetmaskÚgateway)Ú	broadcastÚmetricÚpointopointÚscopez%s: unsupported %s option "%s"z%s: unknown %s option "%s"rH   z(%s: no address supplied in static methodú/r   rI   zE%s: address does not specify prefix length, and netmask not specifiedz-%s: error parsing "%s" as an IPv4 address: %sF)Ústrictz-%s: error parsing "%s" as an IPv4 network: %srJ   Úgateway4)rH   rI   rJ   Ú	accept_ra)rL   ÚmediaÚautoconfÚprivextrN   zpreferred-lifetimezdad-attemptszdad-intervalz-%s: error parsing "%s" as an IPv6 address: %sz-%s: error parsing "%s" as an IPv6 network: %sÚgateway6rR   Ú0Ú1Ú2z(%s: netplan does not support accept_ra=2z#%s: unexpected accept_ra value "%s"z%s: method %s is not supportedzetc/network/interfacesÚversionzetc/netplan/10-ifupdown.yamlÚxzC%s already exists; remove it if you want to run the migration againé   zmigration complete, wrote %sz>ifupdown does not configure any interfaces, nothing to migratez#renaming %s to %s.netplan-convertedz.netplan-converted)(Úparse_ifupdownÚroot_dirr#   r$   r%   Ústrr&   r'   ÚitemsÚdebugÚ
setdefaultr   r-   ÚjoinÚkeysr)   ÚsetÚintersectionr   Ú	ipaddressÚIPv4AddressÚAddressValueErrorÚIPv4NetworkÚNetmaskValueErrorÚ	prefixlenÚIPv6AddressÚIPv6NetworkÚosÚpathÚyamlÚdumpÚdry_runÚprintÚmakedirsÚdirnameÚFileExistsErrorÚopenÚwriteÚinfoÚrename)r   Únetplan_configÚifacesÚauto_ifacesÚer(   Úfamily_configÚfamilyÚconfigÚcÚsupported_optsÚunsupported_optsÚoptsÚbad_optsÚunsupportedÚunknownÚ	addr_specÚnet_specÚipaddrÚaÚipnetr   Únetplan_yamlÚdestÚfs                            r   r5   zNetplanMigrate.command_migratex   s:	  € Øˆð	Ø"&×"5Ñ"5°d·m±mÒ6IÀrÓ"JÑˆF�Kð %+§L¡L£Nó f	 Ñ ˆE�=Ø"/×"5Ñ"5Ó"7ó e ‘�˜Ü—‘Ð:¸EÀ6È6ÔRØ Ñ+Ü—M‘MÐ"RÐTYÔZÜ—H‘H˜Q”KØ˜(Ñ# zÒ1ä—M‘MÐ"BÀEÕJØ˜HÑ%¨Ò/Ø&×1Ñ1°)¸RÓ@×KÑKÈKÐY[Ó\×gÑgÐhmÐoqÓr�Aà×*Ñ*¨6°)Ñ+<¸aÔ@Ø×(Ñ(¨°°yÑ0AÀ1ÔEà˜iÒ(ÜŸ™Ð&ZØ&+¨T¯Y©Y°v¸iÑ7H×7MÑ7MÓ7OÓ-PôRäŸ™ œØ Ò'Ø%)˜˜'›
à%¨Ò0Ð0Ð0Ø%)˜˜'›
à˜HÑ%¨Ó1Ø&×1Ñ1°)¸RÓ@×KÑKÈKÐY[Ó\×gÑgÐhmÐoqÓr�Aà"¨!Ñ+Ø)+˜˜+™à×*Ñ*¨6°)Ñ+<¸aÔ@Ø—N‘N 5¨&°Ñ*;¸QÔ?Ø×(Ñ(¨°°yÑ0AÀ1ÔEð  Ó'ô
 *-Ò-NÓ)O˜Ü+.Ò/^Ó+_Ð(ä" 6¨)Ñ#4×#9Ñ#9Ó#;Ó<˜Ø#'¨.Ñ#8˜Ù#Ø/7×/DÑ/DÐEUÓ/Vò , Ü '§¡Ð.NÐPUÐW]Ð_jÔ kÜ #§¡¨¥ð,ð ,4Ð6FÑ+Fò , Ü '§¡Ð.JÈEÐSYÐ[bÔ cÜ #§¡¨¥ð,ð %¨F°9Ñ,=Ñ=Ü#ŸM™MÐ*TÐV[Ô\ÜŸH™H QœKà &¨Ñ"3°IÑ">Ñ>Ø(.¨yÑ(9¸)Ñ(D×(JÑ(JÈ3Ó(OÐPQÑ(R˜IØ'-¨iÑ'8¸Ñ'C™Hà(°°yÑ0AÑAÜ '§¡Ð.uØ.3ô!5ä #§¡¨¤Ø(.¨yÑ(9¸)Ñ(D˜IØ'-¨iÑ'8¸Ñ'CÀcÑ'IÈFÐS\ÑL]Ð^gÑLhÑ'h˜Hð(Ü%.×%:Ñ%:¸9Ó%E˜Fð
(Ü$-×$9Ñ$9¸(È5Ô$Q˜Eð
 ˜+›¬3¨v«;¸Ñ+<¼sÀ5Ç?Á?Ó?SÑ+SÐ*TÑT›à$¨¨yÑ(9Ó9à,2°9Ñ,=¸iÑ,H˜A˜j›Mð  &¨Ò0Ð0Ð0ô *-Ò-[Ó)\˜Ü+.ò 0oó ,pÐ(ô  # 6¨)Ñ#4×#9Ñ#9Ó#;Ó<˜Ø#'¨.Ñ#8˜Ù#Ø/7×/DÑ/DÐEUÓ/Vò , Ü '§¡Ð.NÐPUÐW]Ð_jÔ kÜ #§¡¨¥ð,ð ,4Ð6FÑ+Fò , Ü '§¡Ð.JÈEÐSYÐ[bÔ cÜ #§¡¨¥ð,ð %¨F°9Ñ,=Ñ=Ü#ŸM™MÐ*TÐV[Ô\ÜŸH™H QœKà &¨Ñ"3°IÑ">Ñ>Ø(.¨yÑ(9¸)Ñ(D×(JÑ(JÈ3Ó(OÐPQÑ(R˜IØ'-¨iÑ'8¸Ñ'C™Hà(°°yÑ0AÑAÜ '§¡Ð.uØ.3ô!5ä #§¡¨¤Ø(.¨yÑ(9¸)Ñ(D˜IØ'-¨iÑ'8¸Ñ'CÀcÑ'IÈFÐS\ÑL]Ð^gÑLhÑ'h˜Hð(Ü%.×%:Ñ%:¸9Ó%E˜Fð
(Ü$-×$9Ñ$9¸(È5Ô$Q˜Eð
 ˜+›¬3¨v«;¸Ñ+<¼sÀ5Ç?Á?Ó?SÑ+SÐ*TÑT›à$¨¨yÑ(9Ñ9à,2°9Ñ,=¸iÑ,H˜A˜j™Mà&¨&°Ñ*;Ó;Ø% iÑ0°Ñ=ÀÒDØ16  +£Ø!'¨	Ñ!2°;Ñ!?À3Ò!FØ15  +£Ø!'¨	Ñ!2°;Ñ!?À3Ò!FÜ '§¡Ð.XÐZ_Ô `Ü #§¡¨¦ä '§¡Ð.SÐUZØ.4°YÑ.?ÀÑ.Lô!Nä #§¡¨¦ô —M‘MÐ"BÀEÈ6ÐRZÑK[Ô\Ü—H‘H˜Q–KòKe ðf	 ôP —G‘G—L‘L §¡Ò!5°#Ð7OÓPˆ	áØ34ˆN˜9Ñ% iÑ0ÜŸ9™9 ^Ó4ˆLØ�|Š|Ü�lÕ#ä—w‘w—|‘| D§M¡MÒ$8°SÐ:XÓY�ðÜ—K‘K¤§¡§¡°Ó 5Ô6ð Ü˜d C›ð .¨AØŸ™ Ô-÷.ô
 —‘Ð;¸TÕBä�L‰LÐYÔZà�|Š|Ü�L‰LÐ>À	È9ÔUÜ�I‰I�i Ð-AÑ!AÕBð øôE ò 	Ü�M‰Mœ#˜a›&Ô!Ü�H‰H�Q�KŠKûð	ûôZ  )×:Ñ:ò (Ü#ŸM™MÐ*YÐ[`ÐbkÐmnÔoÜŸH™H QŸKšKûð(ûô  )×:Ñ:ò (Ü#ŸM™MÐ*YÐ[`ÐbjÐlmÔnÜŸH™H QŸKšKûð(ûôl  )×:Ñ:ò (Ü#ŸM™MÐ*YÐ[`ÐbkÐmnÔoÜŸH™H QŸKšKûð(ûô  )×:Ñ:ò (Ü#ŸM™MÐ*YÐ[`ÐbjÐlmÔnÜŸH™H QŸKšKûð(ûôN 'ò Úðú÷.ñ .ûä&ò  Ü—M‘MÐ"gÐimÔnÜ—H‘H˜Q—Kð ús³   „"_- Í:`7ÎbÕcÕ/d!Ü*2e/ Ýf Ý)e?Ý;f ß-	`4ß63`/à/`4à7bá
-a=á=bâcâ-cãcãdã&-dädä!e,ä4-e'å'e,å/	e<å;e<å?f	æf æ4gçgc                 óÐ  — d„ }g }t        |«      dz   }	 t        |dz   |z   «      5 }t        j                  d|j                  «       |D �]\  }|j                  «       }|r|j                  d«      rŒ(|j                  d«      r©t        j                  d«      } ||t        j                  j                  |j                  «      |«      }	t        j                  |	«      D ]J  }|j                  |«      sŒ|| j                  |t        j                  j                  |	|d |«      «      z  }ŒL Œâ|j                  d	«      rYt!         ||t        j                  j                  |j                  «      |«      «      D ]  }|| j                  |||d «      z  }Œ �ŒL|j#                  |«       �Œ_ 	 ddd«       |S # 1 sw Y   |S xY w# t$        $ r t        j                  d
||«       Y |S w xY w)zvReturn normalized lines from ifupdown config

        This resolves "source" and "source-directory" includes.
        c                 ód   — |j                  «       d   }|j                  d«      r| |z   S |dz   |z   S )Nr2   rO   )r   Ú
startswith)ÚrootdirÚcurdirÚlineÚargs       r   Úexpand_source_argzCNetplanMigrate._ifupdown_lines_from_file.<locals>.expand_source_argG  s6   € Ø—*‘*“,˜q‘/ˆCØ�~‰~˜cÔ"Ø ‘}Ð$à ‘| cÑ)Ð)r   r2   rO   z
reading %sú#zsource-directory z^[a-zA-Z0-9_-]+$Nzsource z%s/%s does not exist, ignoring)Úlenrx   r$   ra   ÚnameÚstripr”   ÚreÚcompilero   rp   rv   ÚlistdirÚmatchÚ_ifupdown_lines_from_filerc   r   ÚappendÚFileNotFoundError)
r   r•   rp   r™   ÚlinesÚrootdir_lenr‘   r—   Úvalid_reÚds
             r   r¢   z(NetplanMigrate._ifupdown_lines_from_fileB  s½  € ò
	*ð ˆÜ˜'“l QÑ&ˆð	KÜ�g ‘m dÑ*Ó+ð +¨qÜ—‘˜l¨A¯F©FÔ3Øó +�DàŸ:™:›<�DÙ 4§?¡?°3Ô#7Ø à—‘Ð':Ô;Ü#%§:¡:Ð.@Ó#A˜Ù-¨g´r·w±w·±ÀqÇvÁvÓ7NÐPTÓU˜Ü!#§¡¨A£ò s˜AØ'Ÿ~™~¨aÕ0Ø %¨×)GÑ)GÈÔQS×QXÑQX×Q]ÑQ]Ð^_Ð`kÐ`lÐ^mÐopÓQqÓ)rÑ r¡ñsð Ÿ™¨Ô3Ü!%Ñ&7¸ÄÇÁÇÁÐQR×QWÑQWÓAXÐZ^Ó&_Ó!`ò ^˜AØ! T×%CÑ%CÀGÈQÈ{È|È_Ó%]Ñ]™Eò^ð Ÿ™ TÖ*ñ!+÷+ð* ˆ÷++ð* ˆûô !ò 	KÜ�M‰MÐ:¸GÀTÕJØˆð	Kús6   •G ¦CF4Ã2B7F4Æ*G Æ4F>Æ9G Æ>G Ç G%Ç$G%c           	      ó˜  — dddddddœ}| j                  |d«      }t        «       }t        «       }d}d}|D �]  }|j                  «       }		 ||	d      }
t	        j
                  d|	|
«       d}d}t        |	«      |
dz   k7  r t        d|
|	d   t        |	«      dz
  fz  «      ‚|	d   dv r|j                  |	d   «       Œ…|	d   dk(  rt        d«      ‚|	d   dk(  rŒ¡|	d   dk(  rb|	d   dvrt        d|	d   z  «      ‚|	d   dvrt        d|	d   z  «      ‚|	d   }|	d   }|	d   i dœ|j                  |	d   t        «       «      |<   �Œt        d|	d   z  «      ‚ t	        j
                  d||«       ||fS # t        $ rR |r>t	        j
                  d||«       |j                  d¬	«      d   ||   |   d
   |	d   <   Y �Œ�t        d|	d   z  «      ‚w xY w)uW  Parse ifupdown configuration.

        Return (iface_name â†’  family â†’ {method, options}, auto_ifaces: set) tuple
        on successful parsing, or a ValueError when encountering an invalid file or
        ifupdown features which are not supported (such as "mapping").

        options is itself a dictionary option_name â†’ value.
        r2   r\   )Úautoú
allow-autoúallow-hotplugÚmappingú
no-scriptsr(   z/etc/network/interfacesNr   z$line fields %s (expected length: %i)z$in_options %s, parsing as option: %s)ÚmaxsplitrB   zUnknown stanza type %sz0Expected %i fields for stanza type %s but got %i)rª   r«   r¬   r­   zmapping stanza is not supportedr®   r(   r   )rC   rE   zUnknown address family %s)r>   rG   r?   zUnsupported method %s)r=   rB   z!stanza type %s is not implementedz,final parsed interfaces: %s; auto ifaces: %s)r¢   r   re   r   r$   ra   ÚKeyErrorr#   r›   Úaddrb   ÚNotImplementedError)r   r•   Úfieldlenr¥   r}   rª   Ú
in_optionsÚ	in_familyr—   ÚfieldsÚexp_lens              r   r]   zNetplanMigrate.parse_ifupdownh  sJ  € ð ¨QÀÈqÐ`aÐlmÑnˆð ×.Ñ.¨wÐ8QÓRˆä“ˆÜ‹uˆØˆ
Øˆ	ð ó '	[ˆDØ—Z‘Z“\ˆFðKà" 6¨!¡9Ñ-�Ü—‘ÐDÀfÈgÔVØ!�
Ø �	ô �6‹{˜g¨™kÒ)Ü Ð!SØ")¨6°!©9´c¸&³kÀA±oÐ!Fñ"Gó Hð Hð �a‰yÐCÑCØ—‘˜ ™Õ#Ø˜‘˜iÒ'Ü Ð!BÓCÐCØ˜‘˜lÒ*ØØ˜‘˜gÒ%Ø˜!‘9Ð$5Ñ5Ü$Ð%@À6È!Á9Ñ%LÓMÐMØ˜!‘9Ð$BÑBÜ$Ð%<¸vÀa¹yÑ%HÓIÐIØ# A™Y�
Ø" 1™I�	ØTZÐ[\ÑT]ÐjlÑIm�×!Ñ! &¨¡)¬[«]Ó;¸IÓFä)Ð*MÐPVÐWXÑPYÑ*YÓZÐZðO'	[ôR 	�‰ÐDÀfÈdÔSØ˜ˆ~ÐøôC ò KáÜ—M‘MÐ"HÈ*ÐVZÔ[ØJNÏ*É*Ð^_È*ÓJ`ÐabÑJc�F˜:Ñ& yÑ1°)Ñ<¸VÀA¹YÑGÚä$Ð%=ÀÀqÁ	Ñ%IÓJÐJðKús   Á#E.Å.AG	Æ7G	)rO   )Ú__name__Ú
__module__Ú__qualname__r   r   r)   r-   r:   r5   r¢   r]   Ú__classcell__)r   s   @r   r   r   $   s/   ø„ ô'ò)ò:"ò&(òòHCòT$÷L?r   r   )Ú__doc__r$   ro   r&   rž   r   rq   r8   ÚImportErrorÚcollectionsr   rg   r<   r   ÚNetplanCommandr   © r   r   ú<module>rÁ      s[   ðñ$ #ã Û 	Û 
Û 	Ý ðÛØ€Gõ $Û å ôC�U×)Ñ)õ Cøð ò Ø‚Gðús   šA ÁAÁA