�����JFIF��XX����������    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222�����"����4���������������������������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������,�PG"Z_�4�˷����kjز�Z�,F+��_z�,�© �����zh6�٨�ic�fu������������������������������������#ډb���_�N��?�����������wQ���5-�~�I���8���������������������������������TK<5o�Iv-������������������k�_U_������������������������������~b�M��d��������Ӝ�U�Hh��?]��E�w��Q���k�{��_}qFW7HTՑ��Y��F�����?_�'ϔ��_�Ջt������������������������=||I �����6�έ"�����D���/[�k�9����Y�8������ds|\���Ҿp6�Ҵ���]��.����6���z<�v��@]�i%������������������������$j��~����g��J>��no����pM[me�i$[�����������s�o�ᘨ�˸ nɜG-�ĨU�ycP���3.DB�li�;���������������������hj���x����7Z^�N�h��������N3u{�:j�����x�힞��#M��&��jL P@��_���� P�������������������&��o8��������9������@Sz���6�t7#O�ߋ �����s}Yf�T������lmr����Z)'N��k�۞p�����w\�T���������������ȯ?�8`���O��i{wﭹW�[�r�� ��Q4F�׊������3m&L�=��h3�������z~��#����\�l :�F,j@�� ʱ�wQT����8�"kJO����6�֚l������������������}����R�>ډK���]��y����&����p�}b������;N�1�m�r$����|��7�>e�@���B�TM*-i�H��g�D�)� E�m�|�ؘbҗ�a���Ҿ����������������t4�����o���G��*oCN�rP���Q��@z,|?W[0���������:�n,j���WiE��W������$~/�hp\��?��{(�0���+�Y8rΟ�+����>S-S���������������VN;���}�s?.����� w��9��˟<���Mq4�Wv'������{)0�1mB����V����W[��������8�/<� �%���wT^�5���b��)iM� p�g�N�&ݝ������������VO~��q���u���9��� ����!��J27�����$����O-���! �:���%H��� ـ�������y�ΠM=t{!S�� �oK8�������t<����è��������:a��������[������ա�H���~��w��Qz`�p����o�^ ������Q��n����� �,uu�C��$ ^���,�������8�#��:�6��e�|~�����������!�3��3.�\0�����q��o�4`.|� ����y�Q�`~;�d�ׯ,��O�Zw�������`73�v�܋�<�����Ȏ�� ـ4k��5�K�a�u�=9Yd��$>x�A�&�� j0� ���vF��� Y���|�y��� ~�6�@c��1vOp��������Ig�����4��l�OD�����L����� R���c���j�_�uX�6��3?nk��Wy�f;^*B� ��@���~a�`��Eu�������+�����6�L��.ü>��}y���}_�O�6�͐�:�Yr���G�X��kG������l^w����������~㒶sy���Iu�!���� W ��X��N�7BV��O��!X�2����wvG�R�f�T#�����t�/?���%8�^�W�aT����G�cL�M���I��(J����1~�8�?aT ���]����AS�E��(��*E}� 2������#I/�׍qz��^t�̔���������b�Yz4x����t�){ OH�����+(E��A&�N�������XT��o��"�XC����'���)}�J�z�p� ����~5�}�^����+�6����w��c��Q�|�Lp�d�H��}�(�.|����k��c4^�����"�����Z?ȕ ��a<�������L�!0�39C� �Eu�����C�F�Ew�ç ;�n?�*o���B�8�bʝ���'#Rqf����M}7����]�������s2tcS{�\icTx;�\��7K���P������ʇ Z O-��~�������c>"��?��������P�����E��O�8��@�8��G��Q�g�a�Վ���󁶠��䧘��_%#r�>�����1�z�a���eb��qcP��ѵ��n���#L��� =��׀t� L�7�`�����V����A{�C:�g���e@�����w1 Xp�3�c3�ġ�������p��M"'-�@n4���fG���B3�DJ�8[Jo�ߐ���gK)ƛ��$���� �������8�3�����+���� �����6�ʻ���� ���S�kI�*KZlT _`�������?��K�����QK�d���������B`�s}�>���`������*�>��,*@J�d�oF*�����弝��O}�k��s��]��y�ߘ�������c1G�V���<=�7��7����6��q�PT��tXԀ�!9*4�4Tހ���3XΛex�46�������Y��D ����� ����BdemDa����\�_l,����G�/���֌7���Y�](�xTt^%�GE�����4�}bT����ڹ�����;��Y)���B�Q��u��>J/J ���⮶.�XԄ��j�ݳ������+E��d ���r�5�_D�����1 ���o�� �B�x�΢�#����<��W�����8���R6�@���g�M�.��� dr�D��>(otU��@�x=��~v���2� ӣ�d�oBd�����3�eO�6�㣷����������ݜ�6��6Y��Qz`����S��{���\P��~z m5{J/L��1������<�e�ͅPu���b�]�ϔ��������'�������f�b� Zpw��c`"��i���BD@:)ִ�:�]��h���v�E��w���T�l�������P����"Ju�}��وV ��J��G6��. J/�Qgl߭�e�����@�z�Zev2u����)]կ���������7x�������s�M�-<ɯ�c��r��v�����@��$�ޮ}lk���a����'����>x��O\�Z������Fu>������ck#��&:��`�$��ai�>2Δ����l���oF[h�������lE�ܺ�Π���k:)���`������� $[6�����9�����kOw�\|�����8}������ބ:��񶐕��������I�A1/���=�2[�,�!��.}gN#�u����b���� ~���������݊��}34q�����d�E��L��������c��$���"�[q�U�硬g^��%B ��z���r�p�������J�ru%v\h�����1Y�ne`������ǥ:g����pQM~�^��Xi� ��`S�:V2������9.�P���V������?B�k�� ��������AEvw%�_�9C�Q����wKekP�ؠ�\������;Io d�{ ߞo�c1eP�����\� `����E=���@K<�Y��������eڼ�J����w����{av�F�'�M�@��������������/J��+9p����|]���������Iw &`���8���&�M�hg���[�{�������Xj���%��Ӓ�������������������$��(�����ʹN�������<>�I���RY�����K2�NPlL�ɀ�)��&e��������B+ь����(������������������� � �JTx����_?EZ� }@���� 6�U���뙢ط�z��dWI��n` D����噥�[��uV��"�G&�����Ú����2�g�}&m���������������������?ċ���"����Om#�������������������������� ��{���������������������ON��"S�X���Ne��ysQ���@�������������Fn��Vg�����dX�~nj����������������������]J�<�K]:����FW���b�������62����������=��5f����JKw����bf�X������������������������55��~J �%^�������:�-�QIE��P��v�nZum� z � ~ə ���� ���ة����;�f��\v�������g�8�1��f2�������������������������4;�V���ǔ�)�������������������9���1\������������������������������c��v�/'Ƞ�w������������������$�4�R-��t����������������������������������� e�6�/�ġ �̕Ecy�J���u�B���<�W�ַ~�w[B1L۲�-JS΂�{���΃�������������������������������������������A��20�c#���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������@���� 0!1@AP"#2Q`$3V�%45a6�FRUq����� ������^7ׅ,$n��������+��F�`��2X'��0vM��p�L=�������5��8������u�p~���.�`r�����\����O��,ư�0oS ��_�M�����l���4�kv\JSd���x���SW�<��Ae�IX����������$I���w�:S���y���›R��9�Q[���,�5�;�@]�%���u�@ *ro�lbI �� ��+���%m:�͇ZV�����u�̉����θau<�fc�.����{�4Ա� �Q����*�Sm��8\ujqs]{kN���)qO�y�_*dJ�b�7���yQqI&9�ԌK!�M}�R�;�������S�T���1���i[U�ɵz�]��U)V�S6���3$K{��ߊ<�(� E]Զ[ǼENg�����'�\?#)Dkf��J���o��v���'�%ƞ�&K�u��!��b�35LX�Ϸ��63$K�a�;�9>,R��W��3�3� d�JeTYE.Mϧ��-�o�j3+y��y^�c�������VO�9NV\nd�1 ��!͕_)a�v;����թ�M�lWR1��)El��P;��yوÏ�u 3�k�5Pr6<�⒲l�!˞*��u־�n�!�l:����UNW ��%��Chx8vL'��X�@��*��)���̮��ˍ��� ����D-M�+J�U�kvK����+�x8��cY������?�Ԡ��~3mo��|�u@[XeY�C�\Kp�x8�oC�C�&����N�~3-H���� ��MX�s�u<`���~"WL��$8ξ��3���a�)|:@�m�\���^�`�@ҷ)�5p+��6���p�%i)P M���ngc�����#0Aruz���RL+xSS?���ʮ}()#�t��mˇ!��0}}y����<�e� �-ή�Ԩ��X������ MF���ԙ~l L.3���}�V뽺�v������멬��Nl�)�2����^�Iq��a��M��qG��T�����c3#������3U�Ǎ���}��לS�|qa��ڃ�+���-��2�f����/��bz��ڐ�� �ݼ[2�ç����k�X�2�* �Z�d���J�G����M*9W���s{��w���T��x��y,�in�O�v��]���n����P�$��JB@=4�OTI�n��e�22a\����q�d���%�$��(���:���: /*�K[PR�fr\nڙdN���F�n�$�4��[�� U�zƶ����� �mʋ���,�ao�u 3�z� �x��Kn����\[��VFmbE;�_U��&V�Gg�]L�۪&#n%�$ɯ��dG���D�TI=�%+AB�Ru#��b4�1�»x�cs�YzڙJG��f��Il���d�eF'T� iA��T���uC�$����Y��H?����[!G`}���ͪ� �纤Hv\������j�Ex�K���!���OiƸ�Yj�+u-<���'q����uN�*�r\��+�]���<�wOZ.fp�ێ��,-*)V?j-kÊ#�`�r��dV����(�ݽBk�����G�ƛk�QmUڗe��Z���f}|����8�8��a���i��3'J�����~G_�^���d�8w������ R�`(�~�.��u���l�s+g�bv���W���lGc}��u���afE~1�Ue������Z�0�8�=e�� f@/�jqEKQQ�J���oN��J���W5~M>$6�Lt�;$ʳ{���^��6�{����v6���ķܰg�V�cnn �~z�x�«�,2�u�?cE+Ș�H؎�%�Za�)���X>uW�Tz�Nyo����s���FQƤ��$��*�&�LLXL)�1�" L��eO��ɟ�9=���:t��Z���c��Ž���Y?�ӭV�wv�~,Y��r�ۗ�|�y��GaF�����C�����.�+� ���v1���fήJ�����]�S��T��B��n5sW}y�$��~z�'�c ��8 ��� ,! �p��VN�S��N�N�q��y8z˱�A��4��*��'������2n<�s���^ǧ˭P�Jޮɏ�U�G�L�J�*#��<�V��t7�8����TĜ>��i}K%,���)[��z�21z ?�N�i�n1?T�I�R#��m-�����������������1����lA�`��fT5+��ܐ�c�q՝��ʐ��,���3�f2U�եmab��#ŠdQ�y>\��)�SLY����w#��.���ʑ�f��� ,"+�w�~�N�'�c�O�3F�������N<���)j��&��,-� �љ���֊�_�zS���TǦ����w�>��?�������n��U仆�V���e�����0���$�C�d���rP �m�׈e�Xm�Vu� �L��.�bֹ��� �[Դaզ���*��\y�8�Է:�Ez\�0�Kq�C b��̘��cө���Q��=0Y��s�N��S.����3.���O�o:���#���v7�[#߫ ��5�܎�L���Er4���9n��COWlG�^��0k�%<���ZB���aB_���������'=��{i�v�l�$�uC���mƎҝ{�c㱼�y]���W�i ��ߧc��m�H� m�"�"�����;Y�ߝ�Z�Ǔ�����:S#��|}�y�,/k�Ld� TA�(�AI$+I3��;Y*���Z��}|��ӧO��d�v��..#:n��f>�>���ȶI�TX��� 8��y����"d�R�|�)0���=���n4��6ⲑ�+��r<�O�܂~zh�z����7ܓ�HH�Ga롏���nCo�>������a ���~]���R���̲c?�6(�q�;5%� |�uj�~z8R�=X��I�V=�|{v�Gj\gc��q����z�؋%M�ߍ����1y��#��@f^���^�>N������#x#۹��6�Y~�?�dfPO��{��P�4��V��u1E1J �*|���%����JN��`eWu�zk M6���q t[�� ��g�G���v��WIG��u_ft����5�j�"�Y�:T��ɐ���*�;� e5���4����q$C��2d�}���� _S�L#m�Yp��O�.�C�;��c����Hi#֩%+) �Ӎ��ƲV���SYź��g |���tj��3�8���r|���V��1#;.SQ�A[���S������#���`n�+���$��$�I �P\[�@�s��(�ED�z���P��])8�G#��0B��[ى��X�II�q<��9�~[Z멜�Z�⊔IWU&A>�P~�#��dp<�?����7���c��'~���5 ��+$���lx@�M�dm��n<=e�dyX��?{�|Aef ,|n3�<~z�ƃ�uۧ�����P��Y,�ӥQ�*g�#먙R�\���;T��i,��[9Qi歉����c>]9�� ��"�c��P�� �Md?٥��If�ت�u��k��/����F��9�c*9��Ǎ:�ØF���z�n*�@|I�ށ9����N3{'��[�'ͬ�Ҳ4��#}��!�V� Fu��,�,mTIk���v C�7v���B�6k�T9��1�*l� '~��ƞF��lU��'�M ����][ΩũJ_�{�i�I�n��$����L�� j��O�dx�����kza۪��#�E��Cl����x˘�o�����V���ɞ�ljr��)�/,�߬h�L��#��^��L�ф�,íMƁe�̩�NB�L�����iL����q�}��(��q��6IçJ$�W�E$��:������=#����(�K�B����zђ <��K(�N�۫K�w��^O{!����)��H���>x�������lx�?>Պ�+�>�W���,Ly!_�D���Ō�l���Q�!�[ �S����J��1��Ɛ�Y}��b,+�Lo�x�ɓ)����=�y�oh�@�꥟/��I��ѭ=��P�y9��� �ۍYӘ�e+�p�Jnϱ?V\SO%�(�t� ���=?MR�[Ș�����d�/ ��n�l��B�7j� ��!�;ӥ�/�[-���A�>��dN�sLj ��,ɪv��=1c�.SQ�O3�U���ƀ�ܽ�E����������̻��9G�ϷD�7(�}��Ävӌ\��y�_0[w ���<΍>����a_��[0+�L��F.�޺��f�>oN�T����q;���y\��bՃ��y�jH�<|q-eɏ�_?_9+P���Hp$�����[ux�K w�Mw��N�ی'$Y2�=��q���KB��P��~�������Yul:�[<����F1�2�O���5=d����]Y�sw:���Ϯ���E��j,_Q��X��z`H1,#II ��d�wr��P˂@�ZJV����y$�\y�{}��^~���[:N����ߌ�U�������O��d�����ؾe��${p>G��3c���Ė�lʌ�� ת��[��`ϱ�-W����dg�I��ig2��� ��}s ��ؤ(%#sS@���~���3�X�nRG�~\jc3�v��ӍL��M[JB�T��s3}��j�Nʖ��W����;7���ç?=X�F=-�=����q�ߚ���#���='�c��7���ڑW�I(O+=:uxq�������������e2�zi+�kuG�R��������0�&e�n���iT^J����~\jy���p'dtG��s����O��3����9* �b#Ɋ�� p������[Bws�T�>d4�ۧs���nv�n���U���_�~,�v����ƜJ1��s�� �QIz���)�(lv8M���U=�;����56��G���s#�K���MP�=��LvyGd��}�VwWBF�'�à �?MH�U�g2�� ����!�p�7Q��j��ڴ����=��j�u��� Jn�A s���uM������e��Ɔ�Ҕ�!)�'��8Ϣ�ٔ���ޝ(��Vp���צ֖d=�IC�J�Ǡ{q������kԭ�߸���i��@K����u�|�p=..�*+����x�����z[Aqġ#s2a�Ɗ���RR�)*HRsi�~�a &f��M��P����-K�L@��Z��Xy�'x�{}��Zm+���:�)�) IJ�-i�u���� ���ܒH��'��L(7�y�GӜq���� j��� 6ߌg1�g�o���,kر���tY�?W,���p���e���f�OQS��!K�۟cҒA�|ս�j�>��=⬒��˧L[�� �߿2JaB~R��u�:��Q�] �0H~���]�7��Ƽ�I���(�}��cq '�ήET���q�?f�ab���ӥvr� �)o��-Q��_'����ᴎo��K������;��V���o��%���~OK ����*��b�f:���-ťIR��`B�5!RB@���ï�� �u �̯e\�_U�_������� g�ES��3��������QT��a�����x����U<~�c?�*�#]�MW,[8O�a�x��]�1bC|踤�P��lw5V%�)�{t�<��d��5���0i�XSU��m:��Z�┵�i�"��1�^B�-��P�hJ��&)O��*�D��c�W��vM��)����}���P��ܗ-q����\mmζZ-l@�}��a��E�6��F�@��&Sg@���ݚ�M����� ȹ 4����#p�\H����dYDo�H���"��\��..R�B�H�z_�/5˘����6��KhJR��P�mƶi�m���3��,#c�co��q�a)*P�t����R�m�k�7x�D�E�\Y�閣_X�<���~�)���c[[�BP����6�Yq���S��0����%_����;��Àv�~�| VS؇ ��'O0��F0��\���U�-�d@�����7�SJ*z��3n��y��P����O����������m�~�P�3|Y��ʉr#�C�<�G~�.,! ���bqx���h~0=��!ǫ�jy����l��O,�[B��~��|9��ٱ����Xly�#�i�B��g%�S��������tˋ���e���ې��\[d�t)��.+u�|1 ������#�~Oj����hS�%��i.�~X���I�H�m��0n���c�1uE�q��cF�RF�o���7� �O�ꮧ� ���ۛ{��ʛi5�rw?׌#Qn�TW��~?y$��m\�\o����%W� ?=>S�N@�� �Ʈ���R����N�)�r"C�:��:����� �����#��qb��Y�. �6[��2K����2u�Ǧ�HYR��Q�MV��� �G�$��Q+.>�����nNH��q�^��� ����q��mM��V��D�+�-�#*�U�̒ ���p욳��u:�������IB���m����PV@O���r[b= �� ��1U�E��_Nm�yKbN�O���U�}�the�`�|6֮P>�\2�P�V���I�D�i�P�O;�9�r�mAHG�W�S]��J*�_�G��+kP�2����Ka�Z���H�'K�x�W�MZ%�O�YD�Rc+o��?�q��Ghm��d�S�oh�\�D�|:W������UA�Qc yT�q��������~^�H��/��#p�CZ���T�I�1�ӏT����4��"�ČZ�����}��`w�#�*,ʹ�� ��0�i��課�Om�*�da��^gJ݅{���l�e9uF#T�ֲ��̲�ٞC"�q���ߍ ոޑ�o#�XZTp����@ o�8��(jd��xw�]�,f���`~��|,s��^����f�1���t��|��m�򸄭/ctr��5s��7�9Q�4�H1꠲BB@�l9@���C�����+�wp�xu�£Yc�9��?`@#�o�mH�s2��)�=��2�.�l����jg�9$�Y�S�%*L������R�Y������7Z���,*=�䷘$�������arm�o�ϰ���UW.|�r�uf����IGw�t����Zwo��~5 ��YյhO+=8fF�)�W�7�L9lM�̘·Y���֘YLf�큹�pRF���99.A �"wz��=E\Z���'a� 2��Ǚ�#;�'}�G���*��l��^"q��+2FQ� hj��kŦ��${���ޮ-�T�٭cf�|�3#~�RJ����t��$b�(R��(����r���dx� >U b�&9,>���%E\� Ά�e�$��'�q't��*�א���ެ�b��-|d���SB�O�O��$�R+�H�)�܎�K��1m`;�J�2�Y~9��O�g8=vqD`K[�F)k�[���1m޼c��n���]s�k�z$@��)!I �x՝"v��9=�ZA=`Ɠi �:�E��)`�7��vI��}d�YI�_ �o�:ob���o ���3Q��&D&�2=�� �Ά��;>�h����y.*ⅥS������Ӭ�+q&����j|UƧ�����}���J0��WW< ۋS�)jQR�j���Ư��rN)�Gű�4Ѷ(�S)Ǣ�8��i��W52���No˓� ۍ%�5brOn�L�;�n��\G����=�^U�dI���8$�&���h��'���+�(������cȁ߫k�l��S^���cƗjԌE�ꭔ��gF���Ȓ��@���}O���*;e�v�WV���YJ\�]X'5��ղ�k�F��b 6R�o՜m��i N�i�����>J����?��lPm�U��}>_Z&�KK��q�r��I�D�Չ~�q�3fL�:S�e>���E���-G���{L�6p�e,8��������QI��h��a�Xa��U�A'���ʂ���s�+טIjP�-��y�8ۈZ?J$��W�P� ��R�s�]��|�l(�ԓ��sƊi��o(��S0���Y� 8�T97.�����WiL��c�~�dxc�E|�2!�X�K�Ƙਫ਼�$((�6�~|d9u+�qd�^3�89��Y�6L�.I�����?���iI�q���9�)O/뚅����O���X��X�V��ZF[�یgQ�L��K1���RҖr@v�#��X�l��F���Нy�S�8�7�kF!A��sM���^rkp�jP�DyS$N���q���nxҍ!U�f�!eh�i�2�m����`�Y�I�9r�6� �TF���C}/�y�^���Η���5d�'��9A-��J��>{�_l+�`��A���[�'��յ�ϛ#w:݅�%��X�}�&�PSt�Q�"�-��\縵�/����$Ɨh�Xb�*�y��BS����;W�ջ_mc�����vt?2}1�;qS�d�d~u:2k5�2�R�~�z+|HE!)�Ǟl��7`��0�<�,�2*���Hl-��x�^����'_TV�gZA�'j� ^�2Ϊ��N7t�����?w�� �x1��f��Iz�C-Ȗ��K�^q�;���-W�DvT�7��8�Z�������� hK�(P:��Q- �8�n�Z���܃e貾�<�1�YT<�,�����"�6{�/ �?�͟��|1�:�#g��W�>$����d��J��d�B���=��jf[��%rE^��il:��B���x���Sּ�1հ��,�=��*�7 fcG��#q� �eh?��2�7�����,�!7x��6�n�LC�4x��},Geǝ�tC.��vS �F�43��zz\��;QYC,6����~;RYS/6���|2���5���v��T��i����������mlv��������&� �nRh^ejR�LG�f���? �ۉҬܦƩ��|��Ȱ����>3����!v��i�ʯ�>�v��オ�X3e���_1z�Kȗ\<������!�8���V��]��?b�k41�Re��T�q��mz��TiOʦ�Z��Xq���L������q"+���2ۨ��8}�&N7XU7Ap�d�X��~�׿��&4e�o�F��� �H�����O���č�c�� 懴�6���͉��+)��v;j��ݷ�� �UV�� i��� j���Y9GdÒJ1��詞�����V?h��l�����l�cGs�ځ�������y�Ac������\V3�? �� ܙg�>qH�S,�E�W�[�㺨�uch�⍸�O�}���a��>�q�6�n6�����N6�q��������N� ���! 1AQaq�0@����"2BRb�#Pr���3C`��Scst���$4D���%Td���� ?�����N����a��3��m���C���w��������xA�m�q�m����m������$����4n淿t'��C"w��zU=D�\R+w�p+Y�T�&�պ@��ƃ��3ޯ?�Aﶂ��aŘ���@-�����Q�=���9D��ռ�ѻ@��M�V��P��܅�G5�f�Y<�u=,EC)�<�Fy'�"�&�չ�X~f��l�KԆV��?�� �W�N����=(� �;���{�r����ٌ�Y���h{�١������jW����P���Tc�����X�K�r��}���w�R��%��?���E��m�� �Y�q|����\lEE4����r���}�lsI�Y������f�$�=�d�yO����p�����yBj8jU�o�/�S��?�U��*������ˍ�0�������u�q�m [�?f����a�� )Q�>����6#������� ?����0UQ����,IX���(6ڵ[�DI�MNލ�c&���υ�j\��X�R|,4��� j������T�hA�e��^���d���b<����n�� �즇�=!���3�^�`j�h�ȓr��jẕ�c�,ٞX����-����a�ﶔ���#�$��]w�O��Ӫ�1y%��L�Y<�wg#�ǝ�̗`�x�xa�t�w��»1���o7o5��>�m뭛C���Uƃߜ}�C���y1Xνm�F8�jI���]����H���ۺиE@I�i;r�8ӭ�����V�F�Շ| ��&?�3|x�B�MuS�Ge�=Ӕ�#BE5G������Y!z��_e��q�р/W>|-�Ci߇�t�1ޯќd�R3�u��g�=0 5��[?�#͏��q�cf���H��{ ?u�=?�?ǯ���}Z��z���hmΔ�BFTW�����<�q��(v� ��!��z���iW]*�J�V�z��gX֧A�q�&��/w���u�gYӘa���; �i=����g:��?2�dž6�ى�k�4�>�Pxs����}������G�9���3 ���)gG�R<>r h�$��'nc�h�P��Bj��J�ҧH� -��N1���N��?��~��}-q!=��_2hc�M��l�vY%UE�@|�v����M2�.Y[|y�"Eï��K�ZF,�ɯ?,q�?v�M 80jx�"�;�9vk�����+ ֧�� �ȺU��?�%�vcV��mA�6��Qg^M�����A}�3�nl� QRN�l8�kkn�'�����(��M�7m9و�q���%ޟ���*h$Zk"��$�9��: �?U8�Sl��,,|ɒ��xH(ѷ����Gn�/Q�4�P��G�%��Ա8�N��!� �&�7�;���eKM7�4��9R/%����l�c>�x;������>��C�:�����t��h?aKX�bhe�ᜋ^�$�Iհ �hr7%F$�E��Fd���t��5���+�(M6�t����Ü�UU|zW�=a�Ts�Tg������dqP�Q����b'�m���1{|Y����X�N��b �P~��F^F:����k6�"�j!�� �I�r�`��1&�-$�Bevk:y���#y�w��I0��x��=D�4��tU���P�ZH��ڠ底taP��6����b>�xa�����Q�#� WeF��ŮNj�p�J* mQ�N�����*I�-*�ȩ�F�g�3 �5��V�ʊ�ɮ�a��5F���O@{���NX��?����H�]3��1�Ri_u��������ѕ�� ����0��� F��~��:60�p�͈�S��qX#a�5>���`�o&+�<2�D����: �������ڝ�$�nP���*)�N�|y�Ej�F�5ټ�e���ihy�Z �>���k�bH�a�v��h�-#���!�Po=@k̆IEN��@��}Ll?j�O������߭�ʞ���Q|A07x���wt!xf���I2?Z��<ץ�T���cU�j��]���陎Ltl �}5�ϓ��$�,��O�mˊ�;�@O��jE��j(�ا,��LX���LO���Ц�90�O �.����a��nA���7������j4 ��W��_ٓ���zW�jcB������y՗+EM�)d���N�g6�y1_x��p�$Lv�:��9�"z��p���ʙ$��^��JԼ*�ϭ����o���=x�Lj�6�J��u82�A�H�3$�ٕ@�=Vv�]�'�qEz�;I˼��)��=��ɯ���x �/�W(V���p�����$ �m�������u�����񶤑Oqˎ�T����r��㠚x�sr�GC��byp�G��1ߠ�w e�8�$⿄����/�M{*}��W�]˷.�CK\�ުx���/$�WP�w���r� |i���&�}�{�X� �>��$-��l���?-z���g����lΆ���(F���h�vS*���b���߲ڡn,|)mrH[���a�3�ר�[1��3o_�U�3�TC�$��(�=�)0�kgP���� ��u�^=��4 �WYCҸ:��vQ�ר�X�à��tk�m,�t*��^�,�}D*�� �"(�I��9R����>`�`��[~Q]�#af��i6l��8���6�:,s�s�N6�j"�A4���IuQ��6E,�GnH��zS�HO�uk�5$�I�4��ؤ�Q9�@��C����wp��BGv[]�u�Ov����0I4���\��y�����Q�Ѹ��~>Z��8�T��a��q�ޣ;z��a���/��S��I:�ܫ_�|������>=Z����8:�S��U�I�J��"IY���8%b8���H��:�QO�6�;7�I�S��J��ҌAά3��>c���E+&jf$eC+�z�;��V����� �r���ʺ������my�e���aQ�f&��6�ND���.:��NT�vm�<- u���ǝ\MvZY�N�NT��-A�>jr!S��n�O 1�3�Ns�%�3D@���`������ܟ 1�^c<���� �a�ɽ�̲�Xë#�w�|y�cW�=�9I*H8�p�^(4���՗�k��arOcW�tO�\�ƍR��8����'�K���I�Q�����?5�>[�}��yU�ײ -h��=��% q�ThG�2�)���"ו3]�!kB��*p�FDl�A���,�eEi�H�f�Ps�����5�H:�Փ~�H�0Dت�D�I����h�F3�������c��2���E��9�H��5�zԑ�ʚ�i�X�=:m�xg�hd(�v����׊�9iS��O��d@0ڽ���:�p�5�h-��t�&���X�q�ӕ,��ie�|���7A�2���O%P��E��htj��Y1��w�Ѓ!����  ���� ࢽ��My�7�\�a�@�ţ�J ��4�Ȼ�F�@o�̒?4�wx��)��]�P��~�����u�����5�����7X ��9��^ܩ�U;Iꭆ 5 �������eK2�7(�{|��Y׎ �V��\"���Z�1� Z�����}��(�Ǝ"�1S���_�vE30>���p;� ΝD��%x�W�?W?v����o�^V�i�d��r[��/&>�~`�9Wh��y�;���R���� ;;ɮT��?����r$�g1�K����A��C��c��K��l:�'��3 c�ﳯ*"t8�~l��)���m��+U,z��`(��>yJ�?����h>��]��v��ЍG*�{`��;y]��I�T� ;c��NU�fo¾h���/$���|NS���1�S�"�H��V���T���4��uhǜ�]�v;���5�͠x��'C\�SBpl���h}�N����� A�Bx���%��ޭ�l��/����T��w�ʽ]D�=����K���ž�r㻠l4�S�O?=�k �M:� ��c�C�a�#ha���)�ѐxc�s���gP�iG���{+���x���Q���I= �� z��ԫ+ �8"�k�ñ�j=|����c ��y��CF��/���*9ж�h{ �?4�o� ��k�m�Q�N�x��;�Y��4膚�a�w?�6�>�e]�����Q�r�:����g�,i"�����ԩA��*M�<�G��b�if��l^M��5�� �Ҩ�{����6J��ZJ�����P�*�����Y���ݛu�_4�9�I8�7���������,^ToR���m4�H��?�N�S�ѕw��/S��甍�@�9H�S�T��t�ƻ���ʒU��*{Xs�@����f������֒Li�K{H�w^���������Ϥm�tq���s� ���ք��f:��o~s��g�r��ט� �S�ѱC�e]�x���a��) ���(b-$(�j>�7q�B?ӕ�F��hV25r[7 Y� }L�R��}����*sg+��x�r�2�U=�*'WS��ZDW]�WǞ�<��叓���{�$�9Ou4��y�90-�1�'*D`�c�^o?(�9��u���ݐ��'PI&� f�Jݮ�������:wS����jfP1F:X �H�9dԯ����˝[�_54 �}*;@�ܨ�� ð�yn�T���?�ןd�#���4rG�ͨ��H�1�|-#���Mr�S3��G�3�����)�.᧏3v�z֑��r����$G"�`j �1t��x0<Ɔ�Wh6�y�6��,œ�Ga��gA����y��b��)���h�D��ß�_�m��ü �gG;��e�v��ݝ�nQ� ��C����-�*��o���y�a��M��I�>�<���]obD��"�:���G�A��-\%LT�8���c�)��+y76���o�Q�#*{�(F�⽕�y����=���rW�\p���۩�c���A���^e6��K������ʐ�cVf5$�'->���ՉN"���F�"�UQ@�f��Gb~��#�&�M=��8�ט�JNu9��D��[̤�s�o�~������� G��9T�tW^g5y$b��Y'��س�Ǵ�=��U-2 #�MC�t(�i� �lj�@Q 5�̣i�*�O����s�x�K�f��}\��M{E�V�{�υ��Ƈ�����);�H����I��fe�Lȣr�2��>��W��I�Ȃ6������i��k�� �5�YOxȺ����>��Y�f5'��|��H+��98pj�n�.O�y�������jY��~��i�w'������l�;�s�2��Y��:'lg�ꥴ)o#'Sa�a�K��Z� �m��}�`169�n���"���x��I ��*+� }F<��cГ���F�P�������ֹ*�PqX�x۩��,� ��N�� �4<-����%����:��7����W���u�`����� $�?�I��&����o��o��`v�>��P��"��l���4��5'�Z�gE���8���?��[�X�7(��.Q�-��*���ތL@̲����v��.5���[��=�t\+�CNܛ��,g�SQnH����}*F�G16���&:�t��4ُ"A��̣��$�b �|����#rs��a�����T�� ]�<�j��B�S�('$�ɻ� �wP;�/�n��?�ݜ��x�F��yUn�~mL*-�������Xf�wd^�a�}��f�,=t�׵i�.2/wpN�Ep8�OР���•��R�FJ� 55TZ��T �ɭ�<��]��/�0�r�@�f��V��V����Nz�G��^���7hZi����k��3�,kN�e|�vg�1{9]_i��X5y7� 8e]�U����'�-2,���e"����]ot�I��Y_��n�(JҼ��1�O ]bXc���Nu�No��pS���Q_���_�?i�~�x h5d'�(qw52] ��'ޤ�q��o1�R!���`ywy�A4u���h<קy���\[~�4�\ X�Wt/� 6�����n�F�a8��f���z �3$�t(���q��q�x��^�XWeN'p<-v�!�{�(>ӽDP7��ո0�y)�e$ٕv�Ih'Q�EA�m*�H��RI��=:��� ���4牢) �%_iN�ݧ�l]� �Nt���G��H�L��� ɱ�g<���1V�,�J~�ٹ�"K��Q�� 9�HS�9�?@��k����r�;we݁�]I�!{ �@�G�[�"��`���J:�n]�{�cA�E����V��ʆ���#��U9�6����j�#Y�m\��q�e4h�B�7��C�������d<�?J����1g:ٳ���=Y���D�p�ц� ׈ǔ��1�]26؜oS�'��9�V�FVu�P�h�9�xc�oq�X��p�o�5��Ա5$�9W�V(�[Ak�aY錎qf;�'�[�|���b�6�Ck��)��#a#a˙��8���=äh�4��2��C��4tm^ �n'c����]GQ$[Wҿ��i���vN�{Fu ��1�gx��1┷���N�m��{j-,��x�� Ūm�ЧS�[�s���Gna���䑴�� x�p 8<������97�Q���ϴ�v�aϚG��Rt�Һ׈�f^\r��WH�JU�7Z���y)�vg=����n��4�_)y��D'y�6�]�c�5̪��\� �PF�k����&�c;��cq�$~T�7j ���nç]�<�g ":�to�t}�159�<�/�8������m�b�K#g'I'.W������6��I/��>v��\�MN��g���m�A�yQL�4u�Lj�j9��#44�t��l^�}L����n��R��!��t��±]��r��h6ٍ>�yҏ�N��fU�� ���� Fm@�8}�/u��jb9������he:A�y�ծw��GpΧh�5����l}�3p468��)U��d��c����;Us/�֔�YX�1�O2��uq�s��`hwg�r~�{ R��mhN��؎*q 42�*th��>�#���E����#��Hv�O����q�}������6�e��\�,Wk�#���X��b>��p}�դ��3���T5��†��6��[��@��P�y*n��|'f�֧>�lư΂�̺����SU�'*�q�p�_S�����M�� '��c�6������m�� ySʨ;M��r���Ƌ�m�Kxo,���Gm�P��A�G�:��i��w�9�}M(�^�V��$ǒ�ѽ�9���|���� �a����J�SQ�a���r�B;����}���ٻ֢�2�%U���c�#�g���N�a�ݕ�'�v�[�OY'��3L�3�;,p�]@�S��{ls��X�'���c�jw��k'a�.��}�}&�� �dP�*�bK=ɍ!����;3n�gΊU�ߴmt�'*{,=SzfD� A��ko~�G�aoq�_mi}#�m�������P�Xhύ�����mxǍ�΂���巿zf��Q���c���|kc�����?���W��Y�$���_Lv����l߶��c���`?����l�j�ݲˏ!V��6����U�Ђ(A���4y)H���p�Z_�x��>���e���R��$�/�`^'3qˏ�-&Q�=?��CFVR �D�fV�9��{�8g�������n�h�(P"��6�[�D���< E�����~0<@�`�G�6����Hг�cc�� �c�K.5��D��d�B���`?�XQ��2��ٿyqo&+�1^� DW�0�ꊩ���G�#��Q�nL3��c���������/��x ��1�1�[y�x�პCW��C�c�UĨ80�m�e�4.{�m��u���I=��f�����0QRls9���f���������9���~f�����Ǩ��a�"@�8���ȁ�Q����#c�ic������G��$���G���r/$W�(��W���V�"��m�7�[m�A�m����bo��D� j����۳� l���^�k�h׽����� ��#� iXn�v��eT�k�a�^Y�4�BN���ĕ���0������� !01@Q"2AaPq3BR�������?�����@4�Q�����T3,���㺠�W�[=JK�Ϟ���2�r^7��vc�:�9 �E�ߴ�w�S#d���Ix��u��:��Hp��9E!�� V 2;73|F��9Y���*ʬ�F��D����u&���y؟��^EA��A��(ɩ���^��GV:ݜDy�`��Jr29ܾ�㝉��[���E;Fzx��YG��U�e�Y�C���� ����v-tx����I�sם�Ę�q��Eb�+P\ :>�i�C'�;�����k|z�رn�y]�#ǿb��Q��������w�����(�r|ӹs��[�D��2v-%��@;�8<a���[\o[ϧw��I!��*0�krs)�[�J9^��ʜ��p1)� "��/_>��o��<1����A�E�y^�C��`�x1'ܣn�p��s`l���fQ��):�l����b>�Me�jH^?�kl3(�z:���1ŠK&?Q�~�{�ٺ�h�y���/�[��V�|6��}�KbX����mn[-��7�5q�94�������dm���c^���h� X��5��<�eޘ>G���-�}�دB�ޟ� ��|�rt�M��V+�]�c?�-#ڛ��^ǂ}���Lkr���O��u�>�-D�ry� D?:ޞ�U��ǜ�7�V��?瓮�"�#���r��չģVR;�n���/_� ؉v�ݶe5d�b9��/O��009�G���5n�W����JpA�*�r9�>�1��.[t���s�F���nQ� V 77R�]�ɫ8����_0<՜�IF�u(v��4��F�k�3��E)��N:��yڮe��P�`�1}�$WS��J�SQ�N�j��ٺ��޵�#l���ј(�5=��5�lǏmoW�v-�1����v,W�mn��߀$x�<����v�j(����c]��@#��1������Ǔ���o'��u+����;G�#�޸��v-lη��/(`i⣍Pm^����ԯ̾9Z��F��������n��1��� ��]�[��)�'�������:�֪�W��FC����� �B9،!?���]��V��A�Վ�M��b�w��G F>_DȬ0¤�#�QR�[V��kz���m�w�"��9ZG�7'[��=�Q����j8R?�zf�\a�=��O�U����*oB�A�|G���2�54 �p��.w7� �� ���&������ξxGHp� B%��$g�����t�Џ򤵍z���HN�u�Я�-�'4��0���;_���3������� !01"@AQa2Pq#3BR�������?����ʩca��en��^��8���<�u#��m*08r��y�N"�<�Ѳ0��@\�p��� �����Kv�D��J8�Fҽ� �f�Y��-m�ybX�NP����}�!*8t(�OqѢ��Q�wW�K��ZD��Δ^e��!� ��B�K��p~�����e*l}z#9ң�k���q#�Ft�o��S�R����-�w�!�S���Ӥß|M�l޶V��!eˈ�8Y���c�ЮM2��tk���� ������J�fS����Ö*i/2�����n]�k�\���|4yX�8��U�P.���Ы[���l��@"�t�<������5�lF���vU�����W��W��;�b�cД^6[#7@vU�xgZv��F�6��Q,K�v��� �+Ъ��n��Ǣ��Ft���8��0��c�@�!�Zq s�v�t�;#](B��-�nῃ~���3g������5�J�%���O������n�kB�ĺ�.r��+���#�N$?�q�/�s�6��p��a����a��J/��M�8��6�ܰ"�*������ɗud"\w���aT(����[��F��U՛����RT�b���n�*��6���O��SJ�.�ij<�v�MT��R\c��5l�sZB>F��<7�;EA��{��E���Ö��1U/�#��d1�a�n.1ě����0�ʾR�h��|�R��Ao�3�m3 ��%�� ���28Q�� ��y��φ���H�To�7�lW>����#i`�q���c����a��� �m,B�-j����݋�'mR1Ήt�>��V��p���s�0IbI�C.���1R�ea�����]H�6�����������4B>��o��](��$B���m�����a�!=���?�B� K�Ǿ+�Ծ"�n���K��*��+��[T#�{�E�J�S����Q�����s�5�:�U�\wĐ�f�3����܆&�)�����I���Ԇw��E T�lrTf6Q|R�h:��[K�� �z��c֧�G�C��%\��_�a��84��HcO�bi��ؖV��7H �)*ģK~Xhչ0��4?�0��� �E<���}3���#���u�?�� ��|g�S�6ꊤ�|�I#Hڛ� �ա��w�X��9��7���Ŀ%�SL��y6č��|�F�a 8���b���$�sק�h���b9RAu7�˨p�Č�_\*w��묦��F ����4D~�f����|(�"m���NK��i�S�>�$d7SlA��/�²����SL��|6N�}���S�˯���g��]6��; �#�.��<���q'Q�1|KQ$�����񛩶"�$r�b:���N8�w@��8$�� �AjfG|~�9F ���Y��ʺ��Bwؒ������M:I岎�G��`s�YV5����6��A �b:�W���G�q%l�����F��H���7�������Fsv7���k�� 403WebShell
403Webshell
Server IP : 2.57.91.161  /  Your IP : 216.73.216.150
Web Server : LiteSpeed
System : Linux in-mum-web1874.main-hosting.eu 5.14.0-570.21.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Jun 11 07:22:35 EDT 2025 x86_64
User : u862839997 ( 862839997)
PHP Version : 8.2.30
Disable Function : system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /opt/alt/python311/lib/python3.11/site-packages/pyroute2/iproute/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /opt/alt/python311/lib/python3.11/site-packages/pyroute2/iproute/__pycache__/linux.cpython-311.pyc
�

�8�g9I��r�ddlZddlZddlZddlZddlmZddlmZddlm	Z	m
Z
mZddlm
Z
ddlmZmZddlmZddlmZdd	lmZmZmZmZmZmZmZdd
lmZmZm Z ddl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPddlQmRZRdd
lSmTZTddlUmVZVddlWmXZXddlYmZZZm[Z[m\Z\ddl]m^Z^ddl_m`Z`ddlambZbddlcmdZdddlemfZfddlgmhZhddlimjZkddlimlZlddlmmnZnmoZoddlpmqZqmrZrmsZsddltmuZumvZvddlwmxZxddlymzZzm{Z{ddl|m}Z}ddl~mZm�Z�dd l�m�Z�m�Z�d!d"l�m�Z�d#Z�ej�e���Z�d$�Z�d%�Z�Gd&�d'��Z�Gd(�d)e�e[��Z�Gd*�d+ee�e\��Z�Gd,�d-e�ef��Z�Gd.�d/e�eZ��Z�dS)0�N)�partial)�chain)�AF_INET�AF_INET6�	AF_UNSPEC)�config)�AF_MPLS�
basestring)�	AF_BRIDGE)�LAB_API)�	NLM_F_ACK�NLM_F_ATOMIC�NLM_F_CREATE�
NLM_F_DUMP�
NLM_F_REQUEST�
NLM_F_ROOT�NLMSG_ERROR)�NetlinkDumpInterrupted�NetlinkError�	SkipInode)/�RTM_DELADDR�RTM_DELLINK�RTM_DELLINKPROP�RTM_DELNEIGH�RTM_DELQDISC�RTM_DELROUTE�RTM_DELRULE�
RTM_DELTCLASS�RTM_DELTFILTER�RTM_GETADDR�RTM_GETLINK�RTM_GETNEIGH�RTM_GETNEIGHTBL�RTM_GETNSID�RTM_GETQDISC�RTM_GETROUTE�RTM_GETRULE�RTM_GETSTATS�
RTM_GETTCLASS�RTM_GETTFILTER�RTM_NEWADDR�RTM_NEWLINK�RTM_NEWLINKPROP�RTM_NEWNEIGH�RTM_NEWNETNS�RTM_NEWNSID�RTM_NEWPROBE�RTM_NEWQDISC�RTM_NEWROUTE�RTM_NEWRULE�
RTM_NEWTCLASS�RTM_NEWTFILTER�RTM_SETLINK�RTMGRP_IPV4_IFADDR�RTMGRP_IPV4_ROUTE�RTMGRP_IPV4_RULE�RTMGRP_IPV6_IFADDR�RTMGRP_IPV6_ROUTE�RTMGRP_IPV6_RULE�RTMGRP_LINK�RTMGRP_MPLS_ROUTE�RTMGRP_NEIGH�	TC_H_ROOT�ndmsg�rt_proto�rt_scope�rt_type)�fibmsg)�	ifaddrmsg)�ifinfmsg)�
ifstatsmsg)�ChaoticIPRSocket�
IPBatchSocket�	IPRSocket)�ndtmsg)�nsidmsg)�nsinfmsg)�	probe_msg)�RawIPRSocket)�rtmsg)�plugins)�tcmsg)�AddressFieldFilter�AddressIPRouteFilter)�BridgeFieldFilter�BridgeIPRouteFilter�BridgePortFieldFilter)�LinkFieldFilter�LinkIPRouteFilter)�RequestProcessor)�NeighbourFieldFilter�NeighbourIPRouteFilter)�ProbeFieldFilter)�RouteFieldFilter�RouteIPRouteFilter)�RuleFieldFilter�RuleIPRouteFilter�)�default_routes�c�|�d|vr|�d��|fSi}d|vr|�d��|d<||fS)N�match�family)�pop)�kwarg�	new_kwargs  �I/opt/alt/python311/lib/python3.11/site-packages/pyroute2/iproute/linux.py�get_dump_filterrntsU���%����y�y��!�!�5�(�(��	��u���"'�)�)�H�"5�"5�I�h���i���c��t|t��r*d�|�d��D��\}}|dz|z}|S)Nc�6�g|]}t|r|ndd����S)�0�)�int��.0�xs  rm�
<listcomp>z$transform_handle.<locals>.<listcomp>�s*��N�N�N�q�#�1�o�a�a�#�r�2�2�N�N�Nro�:rs)�
isinstancer
�split)�handle�major�minors   rm�transform_handler~sJ���&�*�%�%�*�N�N�F�L�L��<M�<M�N�N�N�����5�.�E�)���Mroc�|��eZdZdZ�fd�Zd�Zd2d�Zd3d�Zd	�Zd2d
�Z	d4d�Z
d5d
�Zd�Zd�Z
edfd�Zefd�Zedfd�Zedfd�Zd6d�Zed���Zed���Zed���Zd7d�Zd�Zd�Zd�Zd�Zd�Zd8d�Zd9d!�Zd7d"�Z ee!fd#�Z"d2d$�Z#d%�Z$d&�Z%d'�Z&d(�Z'd)�Z(d*�Z)d+�Z*d,�Z+d-�Z,d:d.�Z-d/�Z.d0�Z/d1�Z0�xZ1S);�RTNL_APIaf
    `RTNL_API` should not be instantiated by itself. It is intended
    to be used as a mixin class. Following classes use `RTNL_API`:

    * `IPRoute` -- RTNL API to the current network namespace
    * `NetNS` -- RTNL API to another network namespace
    * `IPBatch` -- RTNL compiler
    * `ShellIPR` -- RTNL via standard I/O, runs IPRoute in a shell

    It is an old-school API, that provides access to rtnetlink as is.
    It helps you to retrieve and change almost all the data, available
    through rtnetlink::

        from pyroute2 import IPRoute
        ipr = IPRoute()
        # create an interface
        ipr.link('add', ifname='brx', kind='bridge')
        # lookup the index
        dev = ipr.link_lookup(ifname='brx')[0]
        # bring it down
        ipr.link('set', index=dev, state='down')
        # change the interface MAC address and rename it just for fun
        ipr.link('set', index=dev,
                 address='00:11:22:33:44:55',
                 ifname='br-ctrl')
        # add primary IP address
        ipr.addr('add', index=dev,
                 address='10.0.0.1', mask=24,
                 broadcast='10.0.0.255')
        # add secondary IP address
        ipr.addr('add', index=dev,
                 address='10.0.0.2', mask=24,
                 broadcast='10.0.0.255')
        # bring it up
        ipr.link('set', index=dev, state='up')
    c�����d|vr|d�_ntj�_t��j|i|���js�fd�}�j�_|�_dSdS)N�
netns_pathc�8��t�j|i|����S�N)�tuple�	_genmatch)�argvrk�selfs  �rm�filter_messagesz*RTNL_API.__init__.<locals>.filter_messages�s"����^�T�^�T�;�U�;�;�<�<�<ro)r�r�super�__init__�
nlm_generatorr�r�)r�r�rkr��	__class__s`   �rmr�zRTNL_API.__init__�s������5� � �#�L�1�D�O�O�$�/�D�O������$�(�%�(�(�(��!�	3�
=�
=�
=�
=�
=�"�1�D�N�#2�D� � � �
	3�	3roc#��K�|D]�}t|d��r||��r|V��"t|t��r�g}|D]�}t|t��r|f}nt|t��r|}n�4|j|�}|�:t
||��r%|�|||�����z|�|||k����t|��r|V���dS)a�
        Filter messages using `dump_filter`. The filter might be a
        callable, then it will be called for every message in the list.
        Or it might be a dict, where keys are used to get values
        from messages, and dict values are used to match the message.

        The method might be called directly. It is also used by calls
        like `ipr.link('dump', ....)`, where keyword arguments work as
        `dump_filter` for `ipr.filter_messages()`.

        A callable `dump_filter` must return True or False:

        .. code-block:: python

            # get all links with names starting with eth:
            #
            ipr.filter_messages(
                lambda x: x.get_attr('IFLA_IFNAME').startswith('eth'),
                ipr.link('dump')
            )

        A dict `dump_filter` can have callables as values:

        .. code-block:: python

            # get all links with names starting with eth, and
            # MAC address in a database:
            #
            ipr.filter_messages(
                {
                    'ifname': lambda x: x.startswith('eth'),
                    'address': lambda x: x in database,
                },
                ipr.link('dump')
            )

        ... or constants to compare with:

        .. code-block:: python

            # get all links in state up:
            #
            ipr.filter_message({'state': 'up'}, ipr.link('dump'))
        �__call__N)	�hasattrrz�dict�strr��
get_nested�callable�append�all)r��dump_filter�msgs�msg�matches�key�nkey�values        rmr�zRTNL_API.filter_messages�s1����\�	�	�C��{�J�/�/�
��;�s�#�#���I�I�I���K��.�.�
���&�B�B�C�!�#�s�+�+�!� #�v���#�C��/�/�!�"��� �*�C�N�D�1�E��(�X�k�#�6F�-G�-G�(����'7�{�3�'7��'>�'>�?�?�?�?����{�3�'7�5�'@�A�A�A�A��w�<�<���I�I�I��)	�	roNc#�K�|jddkrd|j|j|j|jgi}�nt
|j|jt|jd��gtt|jt���gtt|jt���gt|jgtt|jt���gtt|jt���gt t|jt"���gt$t|jt���gt(t|jt���gi	}|���D])\}}||�|n|jzr|D]}|��D]}|V����*dS)a;
        Dump network objects.

        On OpenBSD:

        * get_links()
        * get_addr()
        * get_neighbours()
        * get_routes()

        On Linux:

        * get_links()
        * get_addr()
        * get_neighbours()
        * get_vlans()
        * dump FDB
        * IPv4 and IPv6 rules
        r�OpenBSDrd�dump)riN)�uname�	get_links�get_addr�get_neighbours�
get_routesr>�	get_vlansr�fdbr8rr;rr@r9r<r?r	r:�	get_rulesr=�items�groups)r�r��
groups_map�group�methods�methodr�s       rmr�z
RTNL_API.dump�s�����6�:�a�=�I�%�%���N��M��'��O�	��J�J���N��N��D�H�f�-�-��
#�W�T�]�7�%K�%K�%K�$L�"�W�T�]�8�%L�%L�%L�$M��t�2�3�!�G�D�O�G�$L�$L�$L�#M�!�G�D�O�H�$M�$M�$M�#N�!�G�D�O�G�$L�$L�$L�#M� �7�4�>�'�#J�#J�#J�"K� �7�4�>�(�#K�#K�#K�"L��J�)�.�.�0�0�	"�	"�N�E�7��&�"4���$�+�F�
"�%�"�"�F�%�v�x�x�"�"��!�	�	�	�	�"��	"�	"ro�
皙�����?c�.�tj��}t��}||ztj��krM	||fi|��}|r|Stj|��n#t$rYnwxYw||ztj��k�Mt	���)a
        Run `method` with a positional argument `command` and keyword
        arguments `**spec` every `interval` seconds, but not more than
        `timeout`, until it returns a result which doesn't evaluate to
        `False`.

        Example:

        .. code-block:: python

            # create a bridge interface and wait for it:
            #
            spec = {
                'ifname': 'br0',
                'kind': 'bridge',
                'state': 'up',
                'br_stp_state': 1,
            }
            ipr.link('add', **spec)
            ret = ipr.poll(ipr.link, 'dump', **spec)

            assert ret[0].get('ifname') == 'br0'
            assert ret[0].get('state') == 'up'
            assert ret[0].get(('linkinfo', 'data', 'br_stp_state')) == 1
        )�timer��sleepr�TimeoutError)r�r��command�timeout�interval�spec�ctime�rets        rm�pollz
RTNL_API.poll9s���4�	�����g�g���g�o��	���+�+�
��f�W�-�-��-�-�����J��
�8�$�$�$�$��)�
�
�
���
����
�g�o��	���+�+��n�n�s�A�
A�
A,�+A,c��t��}t||����t�������}t
|d<d|d<|�dd��|d<d|d<|���D]M\}}tj|��}|�	|��r|�|d
�
||g���Nt|�|td�����S)a�
        Run a network probe.

        The API will trigger a network probe from the environment it
        works in. For NetNS it will be the network namespace, for
        remote IPRoute instances it will be the host it runs on.

        Running probes via API allows to test network connectivity
        between the environments in a simple uniform way.

        Supported arguments:

        * kind -- probe type, for now only ping is supported
        * dst -- target to run the probe against
        * num -- number of probes to run
        * timeout -- timeout for the whole request

        Examples::

            ipr.probe("add", kind="ping", dst="10.0.0.1")

        By default ping probe will send one ICMP request towards
        the target. To change this, use num argument::

            ipr.probe(
                "add",
                kind="ping",
                dst="10.0.0.1",
                num=4,
                timeout=10
            )

        Timeout for the ping probe by default is 1 second, which
        may not be enough to run multiple requests.

        In the next release more probe types are planned, like TCP
        port probe.
        ��context�primerird�proto�portr� �dst_lenN�attrs��msg_type�	msg_flags)rPr\�apply_filterr_�finalizer�getr��name2nla�	valid_nlar�r��nlm_requestr1)r�r�rkr��requestr�r��nlas        rm�probezRTNL_API.probecs���N�k�k��
�U�%�8�8�8�
�\�*�,�,�
-�
-�
�X�Z�Z�	� ��H�
���G���i�i���*�*��F����I��!�-�-�/�/�	2�	2�J�C���$�S�)�)�C��}�}�S�!�!�
2�e�&7��G��#�#�S�%�L�1�1�1���T�%�%�c�L�A�%�N�N�O�O�Oroc���t��}t|d<|�|t��}��t	|��S�fd�|D��S)z\
        Get all queue disciplines for all interfaces or for specified
        one.
        riNc�,��g|]}|d�k�|��S��index�)rvrwr�s  �rmrxz'RTNL_API.get_qdiscs.<locals>.<listcomp>�s'���:�:�:�!�a��j�E�&9�&9�A�&9�&9�&9ro)rTrr�r%r�)r�r�r�r�s `  rm�
get_qdiscszRTNL_API.get_qdiscs�sW���
�g�g��!��H�
����s�L�1�1���=���:�:��:�:�:�:�s�:�:�:�:rorc���t��}t|d<||d<t|��|d<t|��|d<t|�|t
����S)zI
        Get filters for specified interface, handle and parent.
        rir�r|�parent)rTrrr�r�r*)r�r�r|r�r�s     rm�get_filterszRTNL_API.get_filters�s_���g�g��!��H�
���G��(��0�0��H�
�(��0�0��H�
��T�%�%�c�>�:�:�;�;�;roc��t��}t|d<||d<t|�|t����S)z6
        Get classes for specified interface.
        rir�)rTrr�r�r))r�r�r�s   rm�get_classeszRTNL_API.get_classes�s=���g�g��!��H�
���G���T�%�%�c�=�9�9�:�:�:roc�b�t|��\}}|�dtd|���S)z:
        Dump available vlan info on bridge ports
        r��)ri�ext_maskrh)rn�linkr)r�rkr�s   rmr�zRTNL_API.get_vlans�s:��-�U�3�3���U��y�y��9�q���
�
�	
roc��g}|pdg}|ddkrdg}|ddkrd}nd}|D].}|dkr||d<|�|j|fi|�����/|S)aY
        Get network interfaces.

        By default returns all interfaces. Arguments vector
        can contain interface indices or a special keyword
        'all'::

            ip.get_links()
            ip.get_links('all')
            ip.get_links(1, 2, 3)

            interfaces = [1, 2, 3]
            ip.get_links(*interfaces)
        rr�r�r�r�)�extendr�)r�r�rk�result�links�cmdr�s       rmr�zRTNL_API.get_links�s������������8�u����C�E���8�q�=�=��C�C��C��	3�	3�E��q�y�y�!&��g���M�M�)�$�)�C�1�1�5�1�1�2�2�2�2��
roc�6�|�d||p|���S)a�
        Dump ARP cache records.

        The `family` keyword sets the family for the request:
        e.g. `AF_INET` or `AF_INET6` for arp cache, `AF_BRIDGE`
        for fdb.

        If other keyword arguments not empty, they are used as
        filter. Also, one can explicitly set filter as a function
        with the `match` parameter.

        Examples::

            # get neighbours on the 3rd link:
            ip.get_neighbours(ifindex=3)

            # get a particular record by dst:
            ip.get_neighbours(dst='172.16.0.1')

            # get fdb records:
            ip.get_neighbours(AF_BRIDGE)

            # and filter them by a function:
            ip.get_neighbours(AF_BRIDGE, match=lambda x: x['state'] == 2)
        r��rirh)�neigh�r�rirhrks    rmr�zRTNL_API.get_neighbours�s ��4�z�z�&��u�~��z�F�F�Froc�x�t��}||d<t|�|t����S)z&
        Get neighbour tables
        ri)rMr�r�r#)r�rir�s   rm�get_ntableszRTNL_API.get_ntabless4���h�h����H�
��T�%�%�c�?�;�;�<�<�<roc�6�|�d||p|���S)a�
        Dump addresses.

        If family is not specified, both AF_INET and AF_INET6 addresses
        will be dumped::

            # get all addresses
            ip.get_addr()

        It is possible to apply filters on the results::

            # get addresses for the 2nd interface
            ip.get_addr(index=2)

            # get addresses with IFA_LABEL == 'eth0'
            ip.get_addr(label='eth0')

            # get all the subnet addresses on the interface, identified
            # by broadcast address (should be explicitly specified upon
            # creation)
            ip.get_addr(index=2, broadcast='192.168.1.255')

        A custom predicate can be used as a filter::

            ip.get_addr(match=lambda x: x['index'] == 1)
        r�r�)�addrr�s    rmr�zRTNL_API.get_addrs ��6�y�y���e�n�u�y�E�E�Eroc�n�|�tttztzf||p|���S)a
        Get all rules. By default return all rules. To explicitly
        request the IPv4 rules use `family=AF_INET`.

        Example::
            ip.get_rules() # get all the rules for all families
            ip.get_rules(family=AF_INET6)  # get only IPv6 rules
        r�)�ruler'rrrr�s    rmr�zRTNL_API.get_rules7s;���y�y�
�-�*�4�|�C�D���.�5��
�
�	
ro�c��t|�d��t��r|�d|d���S|�d||p|���S)aF
        Get all routes. You can specify the table. There
        are up to 4294967295 routing classes (tables), and the kernel
        returns all the routes on each request. So the
        routine filters routes from full output. Note the number of
        tables is increased from 255 in Linux 2.6+.

        Example::

            ip.get_routes()  # get all the routes for all families
            ip.get_routes(family=AF_INET6)  # get only IPv6 routes
            ip.get_routes(table=254)  # get routes from 254 table

        The default family=255 is a hack. Despite the specs,
        the kernel returns only IPv4 routes for AF_UNSPEC family.
        But it returns all the routes for all the families if one
        uses an invalid value here. Hack but true. And let's hope
        the kernel team will not fix this bug.
        �dstr�)r�r�r�)rzr�r��router�s    rmr�zRTNL_API.get_routesFsY��*�e�i�i��&�&��,�,�	K��:�:�e��u��:�6�6�6��:�:�f�V�5�>�E�:�J�J�Jroc�z�tj|tj��}tj|��j}||fS)z3Open a file (read only) and return its (fd, inode).)�os�open�O_RDONLY�fstat�st_ino)�path�fd�inodes   rm�	open_filezRTNL_API.open_filecs1���W�T�2�;�
'�
'�������#���E�{�roc�.�tj|��dS)z9Close a file that was previously opened with open_file().N)r��close)r�s rm�
close_filezRTNL_API.close_filejs��	�������roc�(�tj��S)z&Return the PID of the current process.)r��getpidr�rorm�get_pidzRTNL_API.get_pidos���y�{�{�roc�D�tj�|||��Sr�)rH�ifinfo�register_link_kind)r�r��pkg�modules    rmrzRTNL_API.register_link_kindts����1�1�$��V�D�D�Droc�@�tj�|��Sr�)rHr�unregister_link_kind)r��kinds  rmr
zRTNL_API.unregister_link_kindws����3�3�D�9�9�9roc�>�tj���Sr�)rHr�list_link_kind)r�s rmr
zRTNL_API.list_link_kindzs����-�-�/�/�/roc���t��}d|d<d}t��}t��}	|�|��\}}||d<|d|vrt���|�|d��d|fg|d<	|�|tt��D]}|�d��|d<n#t$rYnwxYwd|fg|d<n&#t$r}t|j���d}~wwxYw	|dkr|�|��n!#|dkr|�|��wwxYwt|d	d
<|j|d	d<d|d
<|S)N����netnsidrr��	NETNSA_FDr��NETNSA_NSID�NSINFO_PATH�header�type�targetr/�event)rOrNr�r�addr�r$r�get_attr�	Exception�OSError�errnorr/r)	r�r��registry�item�nsfd�infor�r��es	         rm�_dump_one_nszRTNL_API._dump_one_ns�s����z�z��$��Y�����y�y���i�i��	&� �N�N�4�0�0�M�T�5�!�D��M��G�}��(�(��k�k�!��L�L��g��'�'�'�)�$�/�0�C��L�
� �,�,�S�+�}�M�M���D�'+�m�m�M�&B�&B�D��O�����
�
�
���
����+�T�2�3�D��M�M���	%�	%�	%��A�G�$�$�$�����	%����
��a�x�x�����%�%�%����a�x�x�����%�%�%�%�����!-��X��v��#'�;��X��x� �&��W�
��sN�AC"�<C	�C"�	
C�C"�C�C"�!D%�"
D�,D�D�D%�%Ec#�K�tj|��D]=}|�tj�|��}	|�||��V��.#t$rY�:wxYwdSr�)r��listdir�sepr"r)r�r�r�name�nspaths     rm�	_dump_dirzRTNL_API._dump_dir�s������J�t�$�$�	�	�D�"&��r�v�v�t�t�4�F�
��'�'���9�9�9�9�9�9���
�
�
���
����
	�	s�A�
A�Ac#��K�tjd��D]O}	t|��n#t$rY�wxYw	|�d|z|��V��@#t
$rY�LwxYwdS)Nz/procz/proc/%s/ns/net)r�r$rt�
ValueErrorr"r)r�rr&s   rm�
_dump_proczRTNL_API._dump_proc�s������J�w�'�'�		�		�D�
��D�	�	�	�	���
�
�
���
����
��'�'�(9�D�(@�(�K�K�K�K�K�K���
�
�
���
����		�		s�*�
7�7�A�
A$�#A$c��t��}|�|d�d|f��|�|d�d|f��|�|d�d|f��|�|d�d|f��|�|tt��}|D].}|�d��|�d��d�cSdS)	z�Return a dict containing the result of a RTM_GETNSID query.
        This loosely corresponds to the "ip netns list-id" command.
        Nr�r�
NETNSA_PIDr�NETNSA_TARGET_NSID�NETNSA_CURRENT_NSID)�nsid�current_nsid)rNr�r�r$rr)r�r0�pidr��target_nsidr��response�rs        rm�get_netnsidzRTNL_API.get_netnsid�s����i�i������L����� 5�6�6�6��?���L����s� 3�4�4�4�
�>���L����b� 1�2�2�2��"���L���!5�{� C�D�D�D��#�#�C��m�D�D���	�	�A��
�
�=�1�1� !�
�
�+@� A� A���
�
�
�
�troFc#�nK�t��}i}|���D]P}|�d��}|�7||vrg||<||�|�d�����Qg}|jD]+}|�|�||�����,|r(|�|�|����|D][}	|D]E}	|	d=|�|	dg��D]}|	d�d|f��� |	V��F�L#t$rY�XwxYwdS)z�
        A prototype method to list available netns and associated
        interfaces. A bit weird to have it here and not under
        `pyroute2.netns`, but it uses RTNL to get all the info.
        �IFLA_LINK_NETNSIDN�IFLA_IFNAMEr�rr��NSINFO_PEER)	�setr�rr�r�r(r+r�r)
r��	list_procr�peers�peerr�viewsr��viewrs
          rm�get_netns_infozRTNL_API.get_netns_info�s������5�5�����N�N�$�$�	D�	D�D��m�m�$7�8�8�G��"��%�'�'�%'�E�'�N��g��%�%�d�m�m�M�&B�&B�C�C�C�����O�	9�	9�D��L�L�����h�7�7�8�8�8�8��	4��L�L�����2�2�3�3�3��	�	�D�

� �
�
�D��W�
�!&�	�	�$�y�/�2� >� >�D�D���W�
�,�,�m�T�-B�C�C�C�C��J�J�J�J�
���
�
�
���
����	�	s�AD%�%
D2�1D2c�n�t��}|�|dkr|d�d��n|d�d|f��|�|d�d|f��|�|d�d|f��|�|ttt
z��S)z�Assigns an id to a peer netns using RTM_NEWNSID query.
        The kernel chooses an unique id if nsid is omitted.
        This corresponds to the "ip netns set" command.
        Nrr�)rrrr-r)rNr�r�r0rr
)r�r0r2r�r�s     rm�set_netnsidzRTNL_API.set_netnsids���
�i�i���<�4�!�8�8���L��� ;�<�<�<�<���L����� 5�6�6�6��?���L����s� 3�4�4�4�
�>���L����b� 1�2�2�2�����[�-�)�2K�L�L�Lroc��t��}||d<|�|tttzt
���}|�|S|�d|i|��S)z$
        Get default routes
        ri)r�r��parserN�table)rRr�r&rrrer�)r�rirFr��routess     rm�get_default_routeszRTNL_API.get_default_routes&sh���g�g����H�
��!�!��!� �=�0�!�	"�
�
���=��M��'�'��%�(8�&�A�A�Aroc���|rDt|��hd�kr/	|jdi|��D]}|dgcSdS#t$rgcYSwxYwd�|�|p|���D��S)aA
        Lookup interface index (indeces) by first level NLA
        value.

        Example::

            ip.link_lookup(address="52:54:00:9d:4e:3d")
            ip.link_lookup(ifname="lo")
            ip.link_lookup(operstate="UP")

        Please note, that link_lookup() returns list, not one
        value.
        >r��ifname�altnamer�r�c��g|]
}|d��Sr�r�)rvr�s  rmrxz(RTNL_API.link_lookup.<locals>.<listcomp>Ps)�����"&��W�
���ro)rhN)r�)r;r�rr�)r�rhrkr�s    rm�link_lookupzRTNL_API.link_lookup9s����	�S��Z�Z�"@�"@�"@�@�@�
�%�D�I�5�5�u�5�5�+�+�D� ��M�?�*�*�*�+�+���
�
�
��	�	�	�
������*.�.�.�u�~��.�*N�*N����
s�5�A�Ac��g}|j|i|��D]9}|�|tt���|�|���:|S)z�
        Flush routes -- purge route records from a table.
        Arguments are the same as for `get_routes()`
        routine. Actually, this routine implements a pipe from
        `get_routes()` to `nlm_request()`.
        r�)r��putrrr�)r�r�rkr�r�s     rm�flush_routeszRTNL_API.flush_routesZs[����$�T�_�d�4�e�4�4�	�	�E��H�H�U�\�]�H�K�K�K��J�J�u������
roc��ttz}g}|j|i|��D]4}|�|t|���|�|���5|S)a
        Flush IP addresses.

        Examples::

            # flush all addresses on the interface with index 2:
            ipr.flush_addr(index=2)

            # flush all addresses with IFA_LABEL='eth0':
            ipr.flush_addr(label='eth0')
        r�)rrr�rOrr�)r�r�rk�flagsr�r�s      rm�
flush_addrzRTNL_API.flush_addrgse���}�,����!�D�M�4�1�5�1�1�	�	�D��H�H�T�K�5�H�A�A�A��J�J�t������
roc��ttz}g}|j|i|��D]4}|�|t|���|�|���5|S)a
        Flush rules. Please keep in mind, that by default the function
        operates on **all** rules of **all** families. To work only on
        IPv4 rules, one should explicitly specify `family=AF_INET`.

        Examples::

            # flush all IPv4 rule with priorities above 5 and below 32000
            ipr.flush_rules(family=AF_INET, priority=lambda x: 5 < x < 32000)

            # flush all IPv6 rules that point to table 250:
            ipr.flush_rules(family=socket.AF_INET6, table=250)
        r�)rrr�rOrr�)r�r�rkrRr�r�s      rm�flush_ruleszRTNL_API.flush_ruleszse���}�,����"�D�N�D�2�E�2�2�	�	�D��H�H�T�K�5�H�A�A�A��J�J�t������
roc�&�|dkrJt��}|�dd��|d<d|d<|D]
}||||<�|j|fi|��S|dvrd|vr|}n|�dd��}td	ftd	fd�}|�||��\}}t��}|�dd��|d<t|d
<t||����	t|�������}	|d�d
d|	didf��|�
|||���}
|�|�||
��}
|jr"|t zt kst#|
��}
|
S)aO
        Set bridge port parameters. Example::

            idx = ip.link_lookup(ifname='eth0')
            ip.brport("set", index=idx, unicast_flood=0, cost=200)
            ip.brport("show", index=idx)

        Possible keywords are NLA names for the `protinfo_bridge` class,
        without the prefix and in lower letters.
        r;r�r�bridge_slaver�r��showrhNr�rir�r��
IFLA_PROTINFOi�r�)r�rjr�r!�make_request_typerHr�rr\r�rYr�r�r�r�r�rr�)r�r�rk�	linkkwargr�rh�command_mapr�r��protinfor�s           rm�brportzRTNL_API.brport�s����e������I�!&���7�A�!6�!6�I�g�� .�I�f���
,�
,��!&�s��	�#����4�9�W�2�2�	�2�2�2��'�'�'�g�U�.B�.B��E�E��I�I�g�t�,�,�E�!�&�)� �&�)�
�
�� $�5�5�g�{�K�K���)��j�j���y�y��!�,�,��G��!��H�
��U�%�8�8�8�
�\�/��8�8�
9�
9�
�X�Z�Z�	�
	�G����
�w���(9�:�F�C�	
�	
�	
����s�W�	��J�J�����&�&�u�c�2�2�C���	�i�*�&<�
�&J�&J���*�*�C��
roc���tdftdfd�}t|d<t��t	|��g|d<|�||��\}}t
|j||ffi|����S)a'
        Vlan filters is another approach to support vlans in Linux.
        Before vlan filters were introduced, there was only one way
        to bridge vlans: one had to create vlan interfaces and
        then add them as ports::

                    +------+      +----------+
            net --> | eth0 | <--> | eth0.500 | <---+
                    +------+      +----------+     |
                                                   v
                    +------+                    +-----+
            net --> | eth1 |                    | br0 |
                    +------+                    +-----+
                                                   ^
                    +------+      +----------+     |
            net --> | eth2 | <--> | eth2.500 | <---+
                    +------+      +----------+

        It means that one has to create as many bridges, as there were
        vlans. Vlan filters allow to bridge together underlying interfaces
        and create vlans already on the bridge::

            # v500 label shows which interfaces have vlan filter

                    +------+ v500
            net --> | eth0 | <-------+
                    +------+         |
                                     v
                    +------+      +-----+    +---------+
            net --> | eth1 | <--> | br0 |<-->| br0v500 |
                    +------+      +-----+    +---------+
                                     ^
                    +------+ v500    |
            net --> | eth2 | <-------+
                    +------+

        In this example vlan 500 will be allowed only on ports `eth0` and
        `eth2`, though all three eth nics are bridged.

        Some example code::

            # create bridge
            ip.link("add",
                    ifname="br0",
                    kind="bridge")

            # attach a port
            ip.link("set",
                    index=ip.link_lookup(ifname="eth0")[0],
                    master=ip.link_lookup(ifname="br0")[0])

            # set vlan filter
            ip.vlan_filter("add",
                           index=ip.link_lookup(ifname="eth0")[0],
                           vlan_info={"vid": 500})

            # create vlan interface on the bridge
            ip.link("add",
                    ifname="br0v500",
                    kind="vlan",
                    link=ip.link_lookup(ifname="br0")[0],
                    vlan_id=500)

            # set all UP
            ip.link("set",
                    index=ip.link_lookup(ifname="br0")[0],
                    state="up")
            ip.link("set",
                    index=ip.link_lookup(ifname="br0v500")[0],
                    state="up")
            ip.link("set",
                    index=ip.link_lookup(ifname="eth0")[0],
                    state="up")

            # set IP address
            ip.addr("add",
                    index=ip.link_lookup(ifname="br0v500")[0],
                    address="172.16.5.2",
                    mask=24)

            Now all the traffic to the network 172.16.5.2/24 will go
            to vlan 500 only via ports that have such vlan filter.

        Required arguments for `vlan_filter()`: `index` and `vlan_info`.

        Vlan info dict::

            ip.vlan_filter('add',
                            index=<ifindex>,
                            vlan_info =
                            {'vid': <single or range>,
                            'pvid': <bool>,
                            'flags': int or list}

        More details:
            * kernel:Documentation/networking/switchdev.txt
            * pyroute2.netlink.rtnl.ifinfmsg:... vlan_info

        Setting PVID or specifying a range will specify the approprate flags.

        One can specify `flags` as int or as a list of flag names:
            * `master` == 0x1
            * `pvid` == 0x2
            * `untagged` == 0x4
            * `range_begin` == 0x8
            * `range_end` == 0x10
            * `brentry` == 0x20

        E.g.::

            {'vid': 20, 'pvid': true }

            # is equal to
            {'vid': 20, 'flags': ['pvid', 'untagged']}

            # is equal to
            {'vid': 20, 'flags': 6}

            # range
            {'vid': '100-199'}

        Required arguments for `vlan_filter()`: `index` and `vlan_tunnel_info`.

        Vlan tunnel info dict::

            ip.vlan_filter('add',
                          index=<ifindex>,
                          vlan_tunnel_info =
                          {'vid': <single or range>,
                          'id': <single or range>}

        vlan_tunnel_info appears to only use the 'range_begin' and 'range_end'
        flags from vlan_info. Specifying a range will automatically send the
        needed flags.

        Example::

            {'vid': 20, 'id: 20}
            {'vid': '200-299', 'id': '200-299'}

        The above directives can be combined as in the example::

          ip.vlan_filter('add',
                        index=7,
                        vlan_info={'vid': 600},
                        vlan_tunnel_info={'vid': 600, 'id': 600})

        Commands:

        **add**

        Add vlan filter to a bridge port. Example::

          ip.vlan_filter("add", index=2, vlan_info={"vid": 200})

        **del**

        Remove vlan filter from a bridge port. Example::

          ip.vlan_filter("del", index=2, vlan_info={"vid": 200})

        �req)r�delri�kwarg_filter)r7rrrWrXr[r�r�)r�r�rkr]rRs     rm�vlan_filterzRTNL_API.vlan_filter�s���H ��'���'�
�
��
$��h�������(�(�!
��n��
 �1�1�'�;�G�G���%��Y�T�Y���/�9�9�5�9�9�:�:�:roc���d}|dkrt|��\}}t|d<d|vr|�d��|d<|dv�r|�dd��tjdzs�|�dd��tjdz|d<|�dd��tjd	tjd
zzs |dxxtjd	zcc<|�dd��tjdtjd
zzs,|�dd��tjdz|d<|�||d<|j|fi|��S)a	
        Bridge forwarding database management.

        More details:
            * kernel:Documentation/networking/switchdev.txt
            * pyroute2.netlink.rtnl.ndmsg

        **add**

        Add a new FDB record. Works in the same way as ARP cache
        management, but some additional NLAs can be used::

            # simple FDB record
            #
            ip.fdb('add',
                   ifindex=ip.link_lookup(ifname='br0')[0],
                   lladdr='00:11:22:33:44:55',
                   dst='10.0.0.1')

            # specify vlan
            # NB: vlan should exist on the device, use
            # `vlan_filter()`
            #
            ip.fdb('add',
                   ifindex=ip.link_lookup(ifname='br0')[0],
                   lladdr='00:11:22:33:44:55',
                   dst='10.0.0.1',
                   vlan=200)

            # specify vxlan id and port
            # NB: works only for vxlan devices, use
            # `link("add", kind="vxlan", ...)`
            #
            # if port is not specified, the default one is used
            # by the kernel.
            #
            # if vni (vxlan id) is equal to the device vni,
            # the kernel doesn't report it back
            #
            ip.fdb('add',
                   ifindex=ip.link_lookup(ifname='vx500')[0]
                   lladdr='00:11:22:33:44:55',
                   dst='10.0.0.1',
                   port=5678,
                   vni=600)

            # or specify src_vni for a vlan-aware vxlan device
            ip.fdb('add',
                   ifindex=ip.link_lookup(ifname='vx500')[0]
                   lladdr='00:11:22:33:44:55',
                   dst='10.0.0.1',
                   port=5678,
                   src_vni=600)

        **append**

        Append a new FDB record. The same syntax as for **add**.

        **del**

        Remove an existing FDB record. The same syntax as for **add**.

        **dump**

        Dump all the FDB records. If any `**kwarg` is provided,
        results will be filtered::

            # dump all the records
            ip.fdb('dump')

            # show only specific lladdr, dst, vlan etc.
            ip.fdb('dump', lladdr='00:11:22:33:44:55')
            ip.fdb('dump', dst='10.0.0.1')
            ip.fdb('dump', vlan=200)

        Nr�ri�nud�state)rrbr�r�noarp�	permanent�	reachablerRr��masterrh)rnrrjr�rB�statesrRr�)r�r�rkr�s    rmr�zRTNL_API.fdbwsq��Z���f���!0��!7�!7��K��#��h���E�>�>�"�Y�Y�u�-�-�E�'�N��/�/�/��I�I�g�q�!�!�E�L��$9�9�
0�#�Y�Y�w��2�2�U�\�'�5J�J�E�'�N��9�9�W�a�(�(���[�)�E�L��,E�E��
<��g����%�,�{�";�;�����9�9�W�a�(�(���F�#�e�k�(�&;�;��
M�"'���7�A�!6�!6���V�9L�!L��g���"�(�E�'�N��t�z�'�+�+�U�+�+�+roc�&�tdftdftdftdftdftdftdftdftdftdfd�
}d	}tj��}|dkrt	|��\}}t||�
���t�����t|�����	��}|�
||��\}}|jD]A}	|dkr|jr
|	ddkr�|�
|	dd��||	d<�B|���D]X\}
}tj�|
��}|�|��r|�|d
�||g���Y|�|||���}
|dkr|r|�||
��}
|jr"|t*zt*kst-|
��}
|
S)a=
        Neighbours operations, same as `ip neigh` or `bridge fdb`

        **add**

        Add a neighbour record, e.g.::

            from pyroute2 import IPRoute
            from pyroute2.netlink.rtnl import ndmsg

            # add a permanent record on veth0
            idx = ip.link_lookup(ifname='veth0')[0]
            ip.neigh('add',
                     dst='172.16.45.1',
                     lladdr='00:11:22:33:44:55',
                     ifindex=idx,
                     state=ndmsg.states['permanent'])

        **set**

        Set an existing record or create a new one, if it doesn't exist.
        The same as above, but the command is "set"::

            ip.neigh('set',
                     dst='172.16.45.1',
                     lladdr='00:11:22:33:44:55',
                     ifindex=idx,
                     state=ndmsg.states['permanent'])


        **change**

        Change an existing record. If the record doesn't exist, fail.

        **del**

        Delete an existing record.

        **dump**

        Dump all the records in the NDB::

            ip.neigh('dump')

        **get**

        Get specific record (dst and ifindex are mandatory). Available
        only on recent kernel::

            ip.neigh('get',
                     dst='172.16.45.1',
                     ifindex=idx)
        �create�replace�changerar�r�r�)
rr;rorprb�remove�deleter�r�r�Nr�r�ifindexr�r�)r.rr"rBrnr\r�r]r^r�r[�fields�strict_checkrjr�r�r�r�r�r�r�rr�)r�r�rkr]r�r�r�r�r��fieldr�r�r�r�s              rmr�zRTNL_API.neigh�s#��n!�(�+� �)�,�$�i�0�#�X�.� �%�(�#�U�+�#�U�+�!�6�*� �%�(�#�X�.�
�
�����k�m�m���f���!0��!7�!7��K��
�U�%�8�8�8�
�\�.�0�0�
1�
1�
�\�0��9�9�
:�
:�
�X�Z�Z�		�#�4�4�W�k�J�J���)��Z�	5�	5�E��6�!�!��%�"��!�H�	�)�)��#�K�K��a��!�4�4�C��a��M�M�!�-�-�/�/�	2�	2�J�C���+�&�&�s�+�+�C��}�}�S�!�!�
2�e�&7��G��#�#�S�%�L�1�1�1�����s�X���K�K���f������&�&�{�C�8�8�C���	�i�*�&<�
�&J�&J���*�*�C��
roc��tdftdftdftdftdftdftdftdft
dft
dfd�
}d}i}t
��}|dkrt|��\}}|rz|�d��r	|d}nt��t|��g}t||�	��}|D]}|�|���|�
��|�||��\}	}
|jD]'}|�|d
d
��||d
<�(|���D][\}}
t%|���|��}|�|��r|
�|d�||
g���\|�||	|
���}|dkr�|��t/|t0��rbt||�	���t�����td�����
��}|�||��}|jr"|
t6zt6kst9|��}|S)
u-)
        Link operations.

        Keywords to set up ifinfmsg fields:
            * index -- interface index
            * family -- AF_BRIDGE for bridge operations, otherwise 0
            * flags -- device flags
            * change -- change mask

        All other keywords will be translated to NLA names, e.g.
        `mtu -> IFLA_MTU`, `af_spec -> IFLA_AF_SPEC` etc. You can
        provide a complete NLA structure or let filters do it for
        you. E.g., these pairs show equal statements::

            # set device MTU
            ip.link("set", index=x, mtu=1000)
            ip.link("set", index=x, IFLA_MTU=1000)

            # add vlan device
            ip.link("add", ifname="test", kind="dummy")
            ip.link("add", ifname="test",
                    IFLA_LINKINFO={'attrs': [['IFLA_INFO_KIND', 'dummy']]})

        Filters are implemented in the `pyroute2.iproute.req` module.
        You can contribute your own if you miss shortcuts.

        Commands:

        **add**

        To create an interface, one should specify the interface kind::

            ip.link("add",
                    ifname="test",
                    kind="dummy")

        The kind can be any of those supported by kernel. It can be
        `dummy`, `bridge`, `bond` etc. On modern kernels one can specify
        even interface index::

            ip.link("add",
                    ifname="br-test",
                    kind="bridge",
                    index=2345)

        Specific type notes:

        ► geneve

        Create GENEVE tunnel::

            ip.link("add",
                    ifname="genx",
                    kind="geneve",
                    geneve_id=42,
                    geneve_remote="172.16.0.101")

        Support for GENEVE over IPv6 is also included; use `geneve_remote6`
        to configure a remote IPv6 address.

        ► gre

        Create GRE tunnel::

            ip.link("add",
                    ifname="grex",
                    kind="gre",
                    gre_local="172.16.0.1",
                    gre_remote="172.16.0.101",
                    gre_ttl=16)

        The keyed GRE requires explicit iflags/oflags specification::

            ip.link("add",
                    ifname="grex",
                    kind="gre",
                    gre_local="172.16.0.1",
                    gre_remote="172.16.0.101",
                    gre_ttl=16,
                    gre_ikey=10,
                    gre_okey=10,
                    gre_iflags=32,
                    gre_oflags=32)

        Support for GRE over IPv6 is also included; use `kind=ip6gre` and
        `ip6gre_` as the prefix for its values.

        ► ipip

        Create ipip tunnel::

            ip.link("add",
                    ifname="tun1",
                    kind="ipip",
                    ipip_local="172.16.0.1",
                    ipip_remote="172.16.0.101",
                    ipip_ttl=16)

        Support for sit and ip6tnl is also included; use `kind=sit` and `sit_`
        as prefix for sit tunnels, and `kind=ip6tnl` and `ip6tnl_` prefix for
        ip6tnl tunnels.

        ► macvlan

        Macvlan interfaces act like VLANs within OS. The macvlan driver
        provides an ability to add several MAC addresses on one interface,
        where every MAC address is reflected with a virtual interface in
        the system.

        In some setups macvlan interfaces can replace bridge interfaces,
        providing more simple and at the same time high-performance
        solution::

            ip.link("add",
                    ifname="mvlan0",
                    kind="macvlan",
                    link=ip.link_lookup(ifname="em1")[0],
                    macvlan_mode="private").commit()

        Several macvlan modes are available: "private", "vepa", "bridge",
        "passthru". Ususally the default is "vepa".

        ► macvtap

        Almost the same as macvlan, but creates also a character tap device::

            ip.link("add",
                    ifname="mvtap0",
                    kind="macvtap",
                    link=ip.link_lookup(ifname="em1")[0],
                    macvtap_mode="vepa").commit()

        Will create a device file `"/dev/tap%s" % index`

        ► tuntap

        Possible `tuntap` keywords:

        * `mode` — "tun" or "tap"
        * `uid` — integer
        * `gid` — integer
        * `ifr` — dict of tuntap flags (see ifinfmsg:... tuntap_data)

        Create a tap interface::

            ip.link("add",
                    ifname="tap0",
                    kind="tuntap",
                    mode="tap")

        Tun/tap interfaces are created using `ioctl()`, but the library
        provides a transparent way to manage them using netlink API.

        ► veth

        To properly create `veth` interface, one should specify
        `peer` also, since `veth` interfaces are created in pairs::

            # simple call
            ip.link("add", ifname="v1p0", kind="veth", peer="v1p1")

            # set up specific veth peer attributes
            ip.link("add",
                    ifname="v1p0",
                    kind="veth",
                    peer={"ifname": "v1p1",
                          "net_ns_fd": "test_netns"})

        ► vlan

        VLAN interfaces require additional parameters, `vlan_id` and
        `link`, where `link` is a master interface to create VLAN on::

            ip.link("add",
                    ifname="v100",
                    kind="vlan",
                    link=ip.link_lookup(ifname="eth0")[0],
                    vlan_id=100)

        There is a possibility to create also 802.1ad interfaces::

            # create external vlan 802.1ad, s-tag
            ip.link("add",
                    ifname="v100s",
                    kind="vlan",
                    link=ip.link_lookup(ifname="eth0")[0],
                    vlan_id=100,
                    vlan_protocol=0x88a8)

            # create internal vlan 802.1q, c-tag
            ip.link("add",
                    ifname="v200c",
                    kind="vlan",
                    link=ip.link_lookup(ifname="v100s")[0],
                    vlan_id=200,
                    vlan_protocol=0x8100)


        ► vrf

        VRF interfaces (see linux/Documentation/networking/vrf.txt)::

            ip.link("add",
                    ifname="vrf-foo",
                    kind="vrf",
                    vrf_table=42)

        ► vxlan

        VXLAN interfaces are like VLAN ones, but require a bit more
        parameters::

            ip.link("add",
                    ifname="vx101",
                    kind="vxlan",
                    vxlan_link=ip.link_lookup(ifname="eth0")[0],
                    vxlan_id=101,
                    vxlan_group='239.1.1.1',
                    vxlan_ttl=16)

        All possible vxlan parameters are listed in the module
        `pyroute2.netlink.rtnl.ifinfmsg:... vxlan_data`.

        ► ipoib

        IPoIB driver provides an ability to create several ip interfaces
        on one interface.
        IPoIB interfaces requires the following parameter:

        `link` : The master interface to create IPoIB on.

        The following parameters can also be provided:

        * `pkey`- Inifiniband partition key the ip interface is associated with
        * `mode`- Underlying infiniband transport mode. One
          of:  ['datagram' ,'connected']
        * `umcast`- If set(1), multicast group membership for this interface is
          handled by user space.

        Example::

            ip.link("add",
                    ifname="ipoib1",
                    kind="ipoib",
                    link=ip.link_lookup(ifname="ib0")[0],
                    pkey=10)

        **set**

        Set interface attributes::

            # get interface index
            x = ip.link_lookup(ifname="eth0")[0]
            # put link down
            ip.link("set", index=x, state="down")
            # rename and set MAC addr
            ip.link("set", index=x, address="00:11:22:33:44:55", name="bala")
            # set MTU and TX queue length
            ip.link("set", index=x, mtu=1000, txqlen=2000)
            # bring link up
            ip.link("set", index=x, state="up")

        Seting bridge or tunnel attributes require `kind` to be
        specified in order to properly encode `IFLA_LINKINFO`::

            ip.link("set",
                    index=x,
                    kind="bridge",
                    br_forward_delay=2000)

            ip.link("set",
                    index=x,
                    kind="gre",
                    gre_local="10.0.0.1",
                    gre_remote="10.1.0.103")

        Keyword "state" is reserved. State can be "up" or "down",
        it is a shortcut::

            state="up":   flags=1, mask=1
            state="down": flags=0, mask=0

        SR-IOV virtual function setup::

            # get PF index
            x = ip.link_lookup(ifname="eth0")[0]
            # setup macaddr
            ip.link("set",
                    index=x,                          # PF index
                    vf={"vf": 0,                      # VF index
                        "mac": "00:11:22:33:44:55"})  # address
            # setup vlan
            ip.link("set",
                    index=x,           # PF index
                    vf={"vf": 0,       # VF index
                        "vlan": 100})  # the simplest case
            # setup QinQ
            ip.link("set",
                    index=x,                           # PF index
                    vf={"vf": 0,                       # VF index
                        "vlan": [{"vlan": 100,         # vlan id
                                  "proto": 0x88a8},    # 802.1ad
                                 {"vlan": 200,         # vlan id
                                  "proto": 0x8100}]})  # 802.1q

        **update**

        Almost the same as `set`, except it uses different flags
        and message type. Mostly does the same, but in some cases
        differs. If you're not sure what to use, use `set`.

        **del**

        Destroy the interface::

            ip.link("del", index=ip.link_lookup(ifname="dummy0")[0])

        **dump**

        Dump info for all interfaces

        **get**

        Get specific interface info::

            ip.link("get", index=ip.link_lookup(ifname="br0")[0])

        Get extended attributes like SR-IOV setup::

            ip.link("get", index=3, ext_mask=1)
        rarnr�r�r�)
r;�updaterrb�property_add�property_delrqrrr�r�Nrcr�rr�r�)r,r7rr-rr!rHrnr�rZr[r\r�r�r[rtrjr�rr�r�r�r�rzr�r�r�rr�)r�r�rkr]r�r�r��filters�rfilterr�r�rvr�r�r�r�s                rmr�z
RTNL_API.linkNs���Z
 ��'�"�H�-���*���'�,�h�7�,�e�4�"�E�*�"�E�*� �&�)���'�
�
�������j�j���f���!0��!7�!7��K���	��y�y��(�(�
J���/���*�,�,�.?��.H�.H�I��&�u�E�B�B�B�G�"�
.�
.���$�$�W�-�-�-�-�������"�4�4�W�k�J�J���)��Z�	5�	5�E�#�K�K��a��!�4�4�C��a��M�M�"�-�-�/�/�	2�	2�J�C���s�)�)�$�$�S�)�)�C��}�}�S�!�!�
2�e�&7��G��#�#�S�%�L�1�1�1�����s�X���K�K���f����!8��+�t�,�,�
�$�[��L�L�L�!�\�/�"3�"3�4�4�!�\�"3�F�";�";�<�<��X�Z�Z�	��&�&�{�C�8�8�C���	�i�*�&<�
�&J�&J���*�*�C��
roc�x�|dvrgS|r?tjdt��td|��}|�|��d|vrtjdt��t
dftdftdftdft
dftd	fd
�}d}t��}|d	krt|��\}}t||����t�����t|�������}|�||��\}	}
|jD]3}|d
dkr%|�|d
d
��||d
<�4|���D]M\}}
tj|��}|�|��r|
�|d�||
g���N|�||	|
d����}|d	kr|�|�||��}|jr"|
t2zt2kst5|��}|S)a
        Address operations

        * command -- add, delete, replace, dump
        * index -- device index
        * address -- IPv4 or IPv6 address
        * mask -- address mask
        * family -- socket.AF_INET for IPv4 or socket.AF_INET6 for IPv6
        * scope -- the address scope, see /etc/iproute2/rt_scopes
        * kwarg -- dictionary, any ifaddrmsg field or NLA

        Later the method signature will be changed to::

            def addr(self, command, match=None, **kwarg):
                # the method body

        So only keyword arguments (except of the command) will be accepted.
        The reason for this change is an unification of API.

        Example::

            idx = 62
            ip.addr('add', index=idx, address='10.0.0.1', mask=24)
            ip.addr('add', index=idx, address='10.0.0.2', mask=24)

        With more NLAs::

            # explicitly set broadcast address
            ip.addr('add', index=idx,
                    address='10.0.0.3',
                    broadcast='10.0.0.255',
                    prefixlen=24)

            # make the secondary address visible to ifconfig: add label
            ip.addr('add', index=idx,
                    address='10.0.0.4',
                    broadcast='10.0.0.255',
                    prefixlen=24,
                    label='eth0:1')

        Configure p2p address on an interface::

            ip.addr('add', index=idx,
                    address='10.1.1.2',
                    mask=24,
                    local='10.1.1.1')
        )r�r;zMpositional arguments for IPRoute.addr() are deprecated, use keyword arguments)r��address�	prefixlenri�scoperh�maskz2usage of mask is deprecated, use prefixlen insteadrnraror�)rrbrqrrror�Nr�rrRr�c�0�|ddtkS)Nrr)r)rws rm�<lambda>zRTNL_API.addr.<locals>.<lambda>:s���(��F� 3�{� B�ro)r�r��	terminate)�warnings�warn�DeprecationWarning�ziprxr+rr rGrnr\r�rUrVr�r[rtrjr�r�r�r�r�r�r�rr�)r�r�r�rk�converted_argvr]r�r�r�r�r�rvr�r�r�r�s                rmr�z
RTNL_API.addr�sw��`�n�$�$��I��
	)��M�(�"�
�
�
�
!�M����N�
�L�L��(�(�(��U�?�?��M�D�"�
�
�
�
 ��*���'�"�E�*�"�E�*�#�Y�/� �&�)�

�
�����k�k���f���!0��!7�!7��K��
�U�%�8�8�8�
�\�,�.�.�
/�
/�
�\�.�w�7�7�
8�
8�
�X�Z�Z�		�#�4�4�W�k�J�J���)��Z�	9�	9�E��Q�x�7�"�"� '���E�!�H�a� 8� 8��E�!�H�
��"�-�-�/�/�	2�	2�J�C���$�S�)�)�C��}�}�S�!�!�
2�e�&7��G��#�#�S�%�L�1�1�1��������B�B�	�
�
���f����!8��&�&�{�C�8�8�C���	�i�*�&<�
�&J�&J���*�*�C��
roc���|dkrdS|dkrtS|dkr/tj|��}|�t|d��r|jSdStdft
dft
dft
dftd	ftd
ftdftdftd	ftd
ftdftdftd	ftd
fd�}|dkrh|d
krd���
��D��}t|tttf��r"tt�fd�|D�����S��||��\}}t#��}	t%|��}dD]&}
|
|vr ||
�t%||
��||
<�'||	d<||	d<d|vr|d|	d<|�dd��}|tvr�t|}|�dt)|dd
����|	d<t|d��r|�|	|��|r;|ttfvr|�|��}n4|�|��}n|�dt0��|	d<|�|	d�d|g��|�|	d�d|g��t��|	||�����S)a�	
        "Swiss knife" for traffic control. With the method you can
        add, delete or modify qdiscs, classes and filters.

        * command -- add or delete qdisc, class, filter.
        * kind -- a string identifier -- "sfq", "htb", "u32" and so on.
        * handle -- integer or string

        Command can be one of ("add", "del", "add-class", "del-class",
        "add-filter", "del-filter") (see `commands` dict in the code).

        Handle notice: traditional iproute2 notation, like "1:0", actually
        represents two parts in one four-bytes integer::

            1:0    ->    0x10000
            1:1    ->    0x10001
            ff:0   ->   0xff0000
            ffff:1 -> 0xffff0001

        Target notice: if your target is a class/qdisc that applies an
        algorithm that can only apply to upstream traffic profile, but your
        keys variable explicitly references a match that is only relevant for
        upstream traffic, the kernel will reject the filter.  Unless you're
        dealing with devices like IMQs

        For pyroute2 tc() you can use both forms: integer like 0xffff0000
        or string like 'ffff:0000'. By default, handle is 0, so you can add
        simple classless queues w/o need to specify handle. Ingress queue
        causes handle to be 0xffff0000.

        So, to set up sfq queue on interface 1, the function call
        will be like that::

            ip = IPRoute()
            ip.tc("add", "sfq", 1)

        Instead of string commands ("add", "del"...), you can use also
        module constants, `RTM_NEWQDISC`, `RTM_DELQDISC` and so on::

            ip = IPRoute()
            flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_CREATE | NLM_F_EXCL
            ip.tc((RTM_NEWQDISC, flags), "sfq", 1)

        It should be noted that "change", "change-class" and
        "change-filter" work like "replace", "replace-class" and
        "replace-filter", except they will fail if the node doesn't
        exist (while it would have been created by "replace"). This is
        not the same behaviour as with "tc" where "change" can be used
        to modify the value of some options while leaving the others
        unchanged. However, as not all entities support this
        operation, we believe the "change" commands as implemented
        here are more useful.


        Also available "modules" (returns tc plugins dict) and "help"
        commands::

            help(ip.tc("modules")["htb"])
            print(ip.tc("help", "htb"))
        r;N�modules�help�__doc__zNo help availablernrarpro)rrbrqrrrproz	add-classz	del-classzchange-classz
replace-classz
add-filterz
del-filterz
change-filterzreplace-filterrbrc�6�g|]}|ddk�|d��S)r�rdr�rus  rmrxzRTNL_API.tc.<locals>.<listcomp>�s,�����#$�A�g�J�!�O�O�A�g�J�O�O�Oroc3�F�K�|]}��d|���V��dS)rbr�N)�tc)rvrwr�s  �rm�	<genexpr>zRTNL_API.tc.<locals>.<genexpr>�s3�����#K�#K��D�G�G�E��G�$;�$;�#K�#K�#K�#K�#K�#Kro)r�r�defaultr�r|r �optsr��fix_msgr��TCA_KIND�TCA_OPTIONSr�)�
tc_pluginsr�r�r�r2rr5rr6rr�rz�listr�r;rr[rTrrj�getattrr��get_class_parameters�get_parametersrAr�r�)r�r�rr�r|rk�pr]rRr�rr�s`           rmr�zRTNL_API.tcDs$���z�e����F��i������f�����t�$�$�A��}���I�!6�!6�}��y� �*�*�!�(�+� �%�(�#�U�+�#�U�+�#�X�.�$�i�0�'��2�'��/�*�H�5�+�Y�7�)�8�4�)�5�1�,�h�7�-�y�9�
�
�� �e�����z�z���(,���(8�(8������%�$��s�!3�4�4�
N��E�#K�#K�#K�#K�U�#K�#K�#K�L�M�M�M��/�/���E�E�����g�g��!�&�)�)��3�	<�	<�D��u�}�}��t��!8�.�u�T�{�;�;��d�����G����H�
��U�?�?���-�C��K��y�y���&�&���:����4� �A�!�I�I�h���8�Q�0G�0G�H�H�C��M��q�)�$�$�
&��	�	�#�u�%�%�%��
3��}�m�<�<�<��1�1�%�8�8�D�D��+�+�E�2�2�D��!�I�I�h�	�:�:�C��M�����L����T� 2�3�3�3�����L����� 5�6�6�6��T�%�%�c�G�u�%�M�M�N�N�Nroc�	�|dvr6|�dd��pd|d<|�dd��pd|d<d|vr|dvr|}n|�dd��}|�d	d��}t||�
���t	�����t|�������}|}tdftdftdftd
ftdftdftdftdftdftdftdfd�}|�
||��\}}t��}|js#|�dd��}	|	dkr|	nd|d<|�dt��|d<|�dtd��|d<|�dd��p|�dd��|d<|�dd��|d<|�dd��|d<|�dd��|d<|�dtd ��|d<|�dt d ��|d<g|d!<|dt"kr+t%|��D]}
|
d"vr|�|
���|D]�}
tj|
��}|d#kr	||
s�%||
��|d!�|||
g��|dt*dfvr�|
d$kr�t-||
��dkrg||
d}|�d!g��}
|
D]@}|dd%kr2|d&�d'��dkrt0nt|d<n�A��|�||||�(��}|r�t5|t6��rdt||�
���t	d)�*�����td�������}|�||��}|jr"|t<zt<kst%|��}|S)+a� 
        Route operations.

        Keywords to set up rtmsg fields:

        * dst_len, src_len -- destination and source mask(see `dst` below)
        * tos -- type of service
        * table -- routing table
        * proto -- `redirect`, `boot`, `static` (see `rt_proto`)
        * scope -- routing realm
        * type -- `unicast`, `local`, etc. (see `rt_type`)

        `pyroute2/netlink/rtnl/rtmsg.py` rtmsg.nla_map:

        * table -- routing table to use (default: 254)
        * gateway -- via address
        * prefsrc -- preferred source IP address
        * dst -- the same as `prefix`
        * iif -- incoming traffic interface
        * oif -- outgoing traffic interface

        etc.

        One can specify mask not as `dst_len`, but as a part of `dst`,
        e.g.: `dst="10.0.0.0/24"`.

        Commands:

        **add**

        Example::

            ipr.route("add", dst="10.0.0.0/24", gateway="192.168.0.1")

        ...

        More `route()` examples. Blackhole route::

            ipr.route(
                "add",
                dst="10.0.0.0/24",
                type="blackhole",
            )

        Create a route with metrics::

            ipr.route(
                "add",
                dst="172.16.0.0/24",
                gateway="10.0.0.10",
                metrics={
                    "mtu": 1400,
                    "hoplimit": 16,
                },
            )

        Multipath route::

            ipr.route(
                "add",
                dst="10.0.0.0/24",
                multipath=[
                    {"gateway": "192.168.0.1", "hops": 2},
                    {"gateway": "192.168.0.2", "hops": 1},
                    {"gateway": "192.168.0.3"},
                ],
            )

        MPLS lwtunnel on eth0::

            ipr.route(
                "add",
                dst="10.0.0.0/24",
                oif=ip.link_lookup(ifname="eth0"),
                encap={
                    "type": "mpls",
                    "labels": "200/300",
                },
            )

        IPv6 next hop for IPv4 dst::

            ipr.route(
                "add",
                prefsrc="10.127.30.4",
                dst="172.16.0.0/24",
                via={"family": AF_INET6, "addr": "fe80::1337"},
                oif=ipr.link_lookup(ifname="eth0"),
                table=100,
            )

        Create MPLS route: push label::

            # $ sudo modprobe mpls_router
            # $ sudo sysctl net.mpls.platform_labels=1024
            ipr.route(
                "add",
                family=AF_MPLS,
                oif=ipr.link_lookup(ifname="eth0"),
                dst=0x200,
                newdst=[0x200, 0x300],
            )

        MPLS multipath::

            ipr.route(
                "add",
                dst="10.0.0.0/24",
                table=20,
                multipath=[
                    {
                        "gateway": "192.168.0.1",
                        "encap": {"type": "mpls", "labels": 200},
                    },
                    {
                        "ifindex": ipr.link_lookup(ifname="eth0"),
                        "encap": {"type": "mpls", "labels": 300},
                    },
                ],
            )

        MPLS target can be int, string, dict or list::

            "labels": 300    # simple label
            "labels": "300"  # the same
            "labels": (200, 300)  # stacked
            "labels": "200/300"   # the same

            # explicit label definition
            "labels": {
                "bos": 1,
                "label": 300,
                "tc": 0,
                "ttl": 16,
            }

        Create SEG6 tunnel encap mode (kernel >= 4.10)::

            ipr.route(
                "add",
                dst="2001:0:0:10::2/128",
                oif=idx,
                encap={
                    "type": "seg6",
                    "mode": "encap",
                    "segs": "2000::5,2000::6",
                },
            )

        Create SEG6 tunnel inline mode (kernel >= 4.10)::

            ipr.route(
                "add",
                dst="2001:0:0:10::2/128",
                oif=idx,
                encap={
                    "type": "seg6",
                    "mode": "inline",
                    "segs": ["2000::5", "2000::6"],
                },
            )

        Create SEG6 tunnel inline mode with hmac (kernel >= 4.10)::

            ipr.route(
                "add",
                dst="2001:0:0:22::2/128",
                oif=idx,
                encap={
                    "type": "seg6",
                    "mode": "inline",
                    "segs": "2000::5,2000::6,2000::7,2000::8",
                    "hmac": 0xf,
                },
            )

        Create SEG6 tunnel with ip4ip6 encapsulation (kernel >= 4.14)::

            ipr.route(
                "add",
                dst="172.16.0.0/24",
                oif=idx,
                encap={
                    "type": "seg6",
                    "mode": "encap",
                    "segs": "2000::5,2000::6",
                },
            )

        Create SEG6LOCAL tunnel End.DX4 action (kernel >= 4.14)::

            ipr.route(
                "add",
                dst="2001:0:0:10::2/128",
                oif=idx,
                encap={
                    "type": "seg6local",
                    "action": "End.DX4",
                    "nh4": "172.16.0.10",
                },
            )

        Create SEG6LOCAL tunnel End.DT6 action (kernel >= 4.14)::

            ipr.route(
                "add",
                dst="2001:0:0:10::2/128",
                oif=idx,
                encap={
                    "type": "seg6local",
                    "action": "End.DT6",
                    "table": "10",
                },
            )

        Create SEG6LOCAL tunnel End.DT4 action (kernel >= 5.11)::

            # $ sudo modprobe vrf
            # $ sudo sysctl -w net.vrf.strict_mode=1
            ipr.link(
                "add",
                ifname="vrf-foo",
                kind="vrf",
                vrf_table=10,
            )
            ipr.route(
                "add",
                dst="2001:0:0:10::2/128",
                oif=idx,
                encap={
                    "type": "seg6local",
                    "action": "End.DT4",
                    "vrf_table": 10,
                },
            )

        Create SEG6LOCAL tunnel End.DT46 action (kernel >= 5.14)::

            # $ sudo modprobe vrf
            # $ sudo sysctl -w net.vrf.strict_mode=1

            ip.link('add',
                    ifname='vrf-foo',
                    kind='vrf',
                    vrf_table=10)

            ip.route('add',
                     dst='2001:0:0:10::2/128',
                     oif=idx,
                     encap={'type': 'seg6local',
                            'action': 'End.DT46',
                            'vrf_table': 10})

        Create SEG6LOCAL tunnel End.B6 action (kernel >= 4.14)::

            ipr.route(
                "add",
                dst="2001:0:0:10::2/128",
                oif=idx,
                encap={
                    "type": "seg6local",
                    "action": "End.B6",
                    "srh": {"segs": "2000::5,2000::6"},
                },
            )

        Create SEG6LOCAL tunnel End.B6 action with hmac (kernel >= 4.14)::

            ipr.route(
                "add",
                dst="2001:0:0:10::2/128",
                oif=idx,
                encap={
                    "type": "seg6local",
                    "action": "End.B6",
                    "srh": {
                        "segs": "2000::5,2000::6",
                        "hmac": 0xf,
                    },
                },
            )

        **change**, **replace**, **append**

        Commands `change`, `replace` and `append` have the same meanings
        as in ip-route(8): `change` modifies only existing route, while
        `replace` creates a new one, if there is no such route yet.
        `append` allows to create an IPv6 multipath route.

        **del**

        Remove the route. The same syntax as for **add**.

        **get**

        Get route by spec.

        **dump**

        Dump all routes.
        )rr;rorpr�r��staticr�unicastrhrXN�callbackr�rnrorpr�rar�r�)rr;rorpr�rbrqrrr�rYr�rFrfr��rir��universer�r�r�src_len�tosrR�unspecr�)r��newdst�via�	multipath�oif�RTA_DSTr��RTA_GATEWAYrdry)r�r�r�F)�add_defaults)r�rjr\r�r`rar�r3rr&r[rRrurrDrErCr	r�r�r�r�len�findrr�rzr�r�r�r)r�r�rkrhr�r�r]rRr�rFr�r��hopr��attrr�s                rmr�zRTNL_API.route�s���^	�C�C�C�"�Y�Y�w��9�9�E�X�E�'�N�!�I�I�f�i�8�8�E�I�E�&�M��%���G�/?�$?�$?��E�E��I�I�g�t�,�,�E��9�9�Z��.�.���U�%�8�8�8�
�\�*�,�,�
-�
-�
�\�,�W�5�5�
6�
6�
�X�Z�Z�		���!�(�+� �)�,�$�i�0�#�X�.�#�X�.� �%�(�#�U�+�#�U�+� �%�(�!�6�*�!�6�*�
�
�� �1�1�'�;�G�G���%��g�g��� �	:��I�I�g�s�+�+�E�$)�S�L�L�5�5�c�C��L��	�	�(�G�4�4��H�
��y�y��(�:�*>�?�?��G�����9�d�3�3�K�u�y�y���7K�7K��I�����9�a�0�0��I���Y�Y�u�a�(�(��E�
��y�y��!�,�,��G���i�i����(9�:�:��F���y�y��(�8�*<�=�=��G����G���x�=�G�#�#��U�|�|�
#�
#���J�J�J��I�I�c�N�N�N���	&�	&�C��.��%�%�C��i����c�
����S�z�%��G��#�#�S�%��*�$5�6�6�6��x�=�Y��$4�4�4��k�)�)�c�%��*�o�o��.A�.A�#�C�j��m�� #����� 4� 4��$)�&�&�D�#�A�w�-�7�7�(,�A�w�|�|�C�'8�'8�A�'=�'=�%-�H�)0�!$�H�
�
!&��
 8������'�U�X��
�
���	3��%��&�&�
�$�U�%�@�@�@�!�\�"2��"F�"F�"F�G�G�!�\�"4�V�"<�"<�=�=��X�Z�Z�	��&�&�u�c�2�2�C���	�e�j�&8�J�&F�&F���*�*�C��
roc��|dkrdSd|vr	|dkr|}n|�dd��}t||����t�����t	|�������}tdftdftdftdftdfd�}|�	||��\}}t��}|�d	d
��}|dkr|nd|d	<d
D]}	|�|	d
��||	<�g|d<|D]X}	|tkr|jr|	dvr�tj
|	��}
||	�#|d�|
||	g���Y|�|||���}|r�t!|t"��rbt||����t�����t	d�������}|�||��}|jr"|t(zt(kst+|��}|S)u6

        Rule operations

            - command — add, delete
            - table — 0 < table id < 253
            - priority — 0 < rule's priority < 32766
            - action — type of rule, default 'FR_ACT_NOP' (see fibmsg.py)
            - rtscope — routing scope, default RT_SCOPE_UNIVERSE
                `(RT_SCOPE_UNIVERSE|RT_SCOPE_SITE|                RT_SCOPE_LINK|RT_SCOPE_HOST|RT_SCOPE_NOWHERE)`
            - family — rule's family (socket.AF_INET (default) or
                socket.AF_INET6)
            - src — IP source for Source Based (Policy Based) routing's rule
            - dst — IP for Destination Based (Policy Based) routing's rule
            - src_len — Mask for Source Based (Policy Based) routing's rule
            - dst_len — Mask for Destination Based (Policy Based) routing's
                rule
            - iifname — Input interface for Interface Based (Policy Based)
                routing's rule
            - oifname — Output interface for Interface Based (Policy Based)
                routing's rule
            - uid_range — Range of user identifiers, a string like "1000:1234"
            - dport_range — Range of destination ports, a string like "80-120"
            - sport_range — Range of source ports, as a string like "80-120"

        All packets route via table 10::

            # 32000: from all lookup 10
            # ...
            ip.rule('add', table=10, priority=32000)

        Default action::

            # 32001: from all lookup 11 unreachable
            # ...
            iproute.rule('add',
                         table=11,
                         priority=32001,
                         action='FR_ACT_UNREACHABLE')

        Use source address to choose a routing table::

            # 32004: from 10.64.75.141 lookup 14
            # ...
            iproute.rule('add',
                         table=14,
                         priority=32004,
                         src='10.64.75.141')

        Use dst address to choose a routing table::

            # 32005: from 10.64.75.141/24 lookup 15
            # ...
            iproute.rule('add',
                         table=15,
                         priority=32005,
                         dst='10.64.75.141',
                         dst_len=24)

        Match fwmark::

            # 32006: from 10.64.75.141 fwmark 0xa lookup 15
            # ...
            iproute.rule('add',
                         table=15,
                         priority=32006,
                         dst='10.64.75.141',
                         fwmark=10)
        r;Nrhr�r�rnra)rrbrqrrr�rFrr�r�)rir�r��actionr�rRr�)rh�priorityr�)rjr\r�rbrcr�r4rr'r[rFr�rur�r�r�rzr�r�r�rr�)r�r�rkrhr�r]rRr�rFr�r�r�s            rmr�z
RTNL_API.ruleR	sf��L�e����F��%���G�v�$5�$5��E�E��I�I�g�t�,�,�E��U�%�8�8�8�
�\�/�+�+�
,�
,�
�\�+�G�4�4�
5�
5�
�X�Z�Z�		� ��*���'�"�E�*�"�E�*� �&�)�
�
���/�/���E�E�����h�h�����G�Q�'�'�� %����u�u�#��G��M�	+�	+�C��{�{�3��*�*�C��H�H���G���	9�	9�C��+�%�%�$�*;�%��/�/�/���/�#�&�&�C��s�|�'��G��#�#�S�'�#�,�$7�8�8�8�����s�W���F�F���	3��%��&�&�
�$�U�%�@�@�@�!�\�/�"3�"3�4�4�!�\�"3�F�";�";�<�<��X�Z�Z�	��&�&�u�c�2�2�C���	�e�j�&8�J�&F�&F���*�*�C��
roc���|dkrd|vr|}n|�dd��}tdftdfd�}|�||��\}}t��}|�dd��|d<|�dd	��|d<|�|||�
��}|�|�||��}|jr"|tztkst|��}|S)z"
        Stats prototype.
        r�rhNr�)r�r��filter_mask�rsrr�)
rjr(r[rIr�r�r�r�rr�)r�r�rkrhr]rRr�r�s        rm�statszRTNL_API.stats�	s��
�v���G�5�$8�$8��E�E��I�I�g�t�,�,�E�"�6�*� �%�(�
�
���/�/���E�E�����l�l��"�Y�Y�}�b�9�9��M�����9�a�0�0��I�����s�W���F�F�����&�&�u�c�2�2�C���	�e�j�&8�J�&F�&F���*�*�C��
ror�)r�r�)rrr)r)r�N)NNN)NNNN)F)Nrr)2�__name__�
__module__�__qualname__r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r��staticmethodr�rrrr
r
r"r(r+r6rArC�
DEFAULT_TABLErHrMrPrSrUr_rdr�r�r�r�r�r�r�r��
__classcell__)r�s@rmr�r��s��������#�#�J3�3�3�3�3�B�B�B�L8"�8"�8"�8"�t$�$�$�$�T:P�:P�:P�@;�;�;�;�	<�	<�	<�	<�;�;�;�;�
�
�
�&���>%.�T�G�G�G�G�8"+�=�=�=�=�(�t�F�F�F�F�: )��

�

�

�

�K�K�K�K�:����\������\������\��E�E�E�E�:�:�:�0�0�0�&�&�&�P���
�
�
�����60�0�0�0�dM�M�M�M�6)2��B�B�B�B�&����B������&���6/�/�/�bo;�o;�o;�bh,�h,�h,�\g�g�g�RC�C�C�Jo�o�o�bAO�AO�AO�AO�FI�I�I�V{�{�{�z������ror�c��eZdZdZdS)�IPBatcha
    Netlink requests compiler. Does not send any requests, but
    instead stores them in the internal binary buffer. The
    contents of the buffer can be used to send batch requests,
    to test custom netlink parsers and so on.

    Uses `RTNL_API` and provides all the same API as normal
    `IPRoute` objects::

        # create the batch compiler
        ipb = IPBatch()
        # compile requests into the internal buffer
        ipb.link("add", index=550, ifname="test", kind="dummy")
        ipb.link("set", index=550, state="up")
        ipb.addr("add", index=550, address="10.0.0.2", mask=24)
        # save the buffer
        data = ipb.batch
        # reset the buffer
        ipb.reset()
        ...
        # send the buffer
        IPRoute().sendto(data, (0, 0))

    N�r�r�r�r�r�rormr�r��	s��������2	�Dror�c��eZdZdZdS)�IPRoutezO
    Regular ordinary utility class, see RTNL API for the list of methods.
    Nr�r�rormr�r�
���������	�Dror�c��eZdZdZdS)�
RawIPRoutezx
    The same as `IPRoute`, but does not use the netlink proxy.
    Thus it can not manage e.g. tun/tap interfaces.
    Nr�r�rormr�r�
s��������
	�Dror�c��eZdZdZdS)�ChaoticIPRoutezL
    IPRoute interface for chaotic tests - raising exceptions randomly.
    Nr�r�rormr�r�
r�ror�)��loggingr�r�r��	functoolsr�	itertoolsr�socketrrr�pyroute2r�pyroute2.commonr	r
�pyroute2.configr�pyroute2.labr�pyroute2.netlinkr
rrrrrr�pyroute2.netlink.exceptionsrrr�pyroute2.netlink.rtnlrrrrrrrrrr r!r"r#r$r%r&r'r(r)r*r+r,r-r.r/r0r1r2r3r4r5r6r7r8r9r:r;r<r=r>r?r@rArBrCrDrE�pyroute2.netlink.rtnl.fibmsgrF�pyroute2.netlink.rtnl.ifaddrmsgrG�pyroute2.netlink.rtnl.ifinfmsgrH� pyroute2.netlink.rtnl.ifstatsmsgrI�pyroute2.netlink.rtnl.iprsocketrJrKrL�pyroute2.netlink.rtnl.ndtmsgrM�pyroute2.netlink.rtnl.nsidmsgrN�pyroute2.netlink.rtnl.nsinfmsgrO�pyroute2.netlink.rtnl.probe_msgrP� pyroute2.netlink.rtnl.riprsocketrQ�pyroute2.netlink.rtnl.rtmsgrR�pyroute2.netlink.rtnl.tcmsgrSr�rT�pyroute2.requests.addressrUrV�pyroute2.requests.bridgerWrXrY�pyroute2.requests.linkrZr[�pyroute2.requests.mainr\�pyroute2.requests.neighbourr]r^�pyroute2.requests.prober_�pyroute2.requests.router`ra�pyroute2.requests.rulerbrc�parsersrer��	getLoggerr��logrnrr�r�r�r�r�r�rorm�<module>r�sW������	�	�	�	���������������������/�/�/�/�/�/�/�/�/�/�������/�/�/�/�/�/�/�/�%�%�%�%�%�%� � � � � � �����������������������������
0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�0�b0�/�/�/�/�/�5�5�5�5�5�5�3�3�3�3�3�3�7�7�7�7�7�7�����������
0�/�/�/�/�/�1�1�1�1�1�1�3�3�3�3�3�3�5�5�5�5�5�5�9�9�9�9�9�9�-�-�-�-�-�-�=�=�=�=�=�=�-�-�-�-�-�-�N�N�N�N�N�N�N�N�����������
F�E�E�E�E�E�E�E�3�3�3�3�3�3���������5�4�4�4�4�4�H�H�H�H�H�H�H�H�E�E�E�E�E�E�E�E�#�#�#�#�#�#��
��g���!�!�� � � ����d%�d%�d%�d%�d%�d%�d%�d%�RK	�	�	�	�	�h�
�	�	�	�:	�	�	�	�	�g�x��	�	�	�	�	�	�	�	��<�	�	�	�	�	�	�	�	�X�/�	�	�	�	�	ro

Youez - 2016 - github.com/yon3zu
LinuXploit