!vQ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPNone276LiprouteIThe abstract data type to express an IPv6 address. To create this, use   . Or use Q  "2001:DB8::1" :: , for example. Also,  "2001:DB8::1"/ can be used as literal with OverloadedStrings.)read "2001:db8:00:00:00:00:00:01" :: IPv6 2001:db8::1$read "2001:db8:11e:c00::101" :: IPv62001:db8:11e:c00::101/read "2001:db8:11e:c00:aa:bb:192.0.2.1" :: IPv62001:db8:11e:c00:aa:bb:c000:201"read "2001:db8::192.0.2.1" :: IPv62001:db8::c000:201 read "0::ffff:192.0.2.1" :: IPv6::ffff:192.0.2.1read "0::0:c000:201" :: IPv6 ::192.0.2.1read "::0.0.0.1" :: IPv6::1iprouteIThe abstract data type to express an IPv4 address. To create this, use   . Or use Q  "192.0.2.1" :: , for example. Also,  "192.0.2.1"/ can be used as literal with OverloadedStrings.read "192.0.2.1" :: IPv4 192.0.2.1iprouteA unified IP data for  and 6. To create this, use the data constructors. Or use Q  "192.0.2.1" :: , for example. Also,  "192.0.2.1"/ can be used as literal with OverloadedStrings.;(read "192.0.2.1" :: IP) == IPv4 (read "192.0.2.1" :: IPv4)True](read "2001:db8:00:00:00:00:00:01" :: IP) == IPv6 (read "2001:db8:00:00:00:00:00:01" :: IPv6)TrueRiproute1Show an IPv4 address in the dot-decimal notation.SiproutehShow an IPv6 address in the most appropriate notation, based on recommended representation proposed by  "http://tools.ietf.org/html/rfc5952RFC 5952.U/The implementation is completely compatible with the current implementation of the  inet_ntop function in glibc./ iprouteThe   function takes a list of T and returns .toIPv4 [192,0,2,1] 192.0.2.1 iprouteThe   function takes a list of T and returns .!toIPv6 [0x2001,0xDB8,0,0,0,0,0,1] 2001:db8::1 iprouteThe   function takes a list of T: where each member repserents a single byte and returns .4toIPv6b [0x20,0x01,0xD,0xB8,0,0,0,0,0,0,0,0,0,0,0,1] 2001:db8::1iprouteThe  function converts  to a list of T.fromIPv4 (toIPv4 [192,0,2,1]) [192,0,2,1]iprouteThe   function converts  to a list of T.,fromIPv6 (toIPv6 [0x2001,0xDB8,0,0,0,0,0,1])[8193,3512,0,0,0,0,0,1]iprouteThe  function converts  to a list of T. where each member represents a single byte.@fromIPv6b (toIPv6b [0x20,0x01,0xD,0xB8,0,0,0,0,0,0,0,0,0,0,0,1])%[32,1,13,184,0,0,0,0,0,0,0,0,0,0,0,1]iprouteThe  function converts U to .iprouteThe  function converts  to U.iprouteThe  function converts V to .iprouteThe  function converts  to V.iproute-Convert IPv4 address to IPv4-embedded-in-IPv6iprouteConvert W to . Since: 1.7.4.XiprouteWEquality over IP addresses. Correctly compare IPv4 and IPv4-embedded-in-IPv6 addresses.V(read "2001:db8:00:00:00:00:00:01" :: IP) == (read "2001:db8:00:00:00:00:00:01" :: IP)TrueV(read "2001:db8:00:00:00:00:00:01" :: IP) == (read "2001:db8:00:00:00:00:00:05" :: IP)False4(read "127.0.0.1" :: IP) == (read "127.0.0.1" :: IP)True3(read "127.0.0.1" :: IP) == (read "10.0.0.1" :: IP)False;(read "::ffff:127.0.0.1" :: IP) == (read "127.0.0.1" :: IP)True;(read "::ffff:127.0.0.1" :: IP) == (read "127.0.0.9" :: IP)False;(read "::ffff:127.0.0.1" :: IP) >= (read "127.0.0.1" :: IP)True;(read "::ffff:127.0.0.1" :: IP) <= (read "127.0.0.1" :: IP)True) YZRS [\]^_`abcdefghNone7'ijklmnoNone27=?GaiprouteThe Addr range consists of an address, a contiguous mask, and mask length. The contiguous mask and the mask length are essentially same information but contained for pre calculation.To create this, use  makeAddrRange or Q "192.0.2.0/24" ::   . Also, "192.0.2.0/24"/ can be used as literal with OverloadedStrings.%read "192.0.2.1/24" :: AddrRange IPv4 192.0.2.0/246read "2001:db8:00:00:00:00:00:01/48" :: AddrRange IPv6 2001:db8::/48iprouteThe " function returns an address from .iprouteThe  function returns a contiguous  mask from .iprouteThe % function returns a mask length from .iprouteA unified data for   and  . To create this, use Q "192.0.2.0/24" ::  . Also, "192.0.2.0/24"/ can be used as literal with OverloadedStrings.U(read "192.0.2.1/24" :: IPRange) == IPv4Range (read "192.0.2.0/24" :: AddrRange IPv4)Truew(read "2001:db8:00:00:00:00:00:01/48" :: IPRange) == IPv6Range (read "2001:db8:00:00:00:00:00:01/48" :: AddrRange IPv6)True pqrstuvNoneej!iproute'toIPv4 [127,0,2,1] `masked` intToMask 7 126.0.0.0"iprouteThe " function takes an !3 and a contiguous mask and returned a masked !.#iprouteThe # function takes an T representing the number of bits to be set in the returned contiguous mask. When this integer is positive the bits will be starting from the MSB and from the LSB otherwise.intToMask 16 :: IPv4 255.255.0.0intToMask (-16) :: IPv4 0.0.255.255intToMask 16 :: IPv6ffff::intToMask (-16) :: IPv6::ffff$iprouteThe >:> operator takes two  . It returns w if the first  contains the second . Otherwise, it returns x.FmakeAddrRange ("127.0.2.1" :: IPv4) 8 >:> makeAddrRange "127.0.2.1" 24TrueFmakeAddrRange ("127.0.2.1" :: IPv4) 24 >:> makeAddrRange "127.0.2.1" 8FalseKmakeAddrRange ("2001:DB8::1" :: IPv6) 16 >:> makeAddrRange "2001:DB8::1" 32TrueKmakeAddrRange ("2001:DB8::1" :: IPv6) 32 >:> makeAddrRange "2001:DB8::1" 16False%iprouteThe  toMatchedTo function take an ! address and an , and returns w# if the range contains the address.@("127.0.2.0" :: IPv4) `isMatchedTo` makeAddrRange "127.0.2.1" 24True@("127.0.2.0" :: IPv4) `isMatchedTo` makeAddrRange "127.0.2.1" 32FalseD("2001:DB8::1" :: IPv6) `isMatchedTo` makeAddrRange "2001:DB8::1" 32TrueD("2001:DB8::" :: IPv6) `isMatchedTo` makeAddrRange "2001:DB8::1" 128False&iprouteThe & functions takes an !Y address and a mask length. It creates a bit mask from the mask length and masks the ! address, then returns  made of them.$makeAddrRange (toIPv4 [127,0,2,1]) 8 127.0.0.0/83makeAddrRange (toIPv6 [0x2001,0xDB8,0,0,0,0,0,1]) 82000::/8'iproute1Convert IPv4 range to IPV4-embedded-in-IPV6 range(iprouteThe unmakeAddrRange functions take a 5 and returns the network address and a mask length./addrRangePair ("127.0.0.0/8" :: AddrRange IPv4) (127.0.0.0,8),addrRangePair ("2000::/8" :: AddrRange IPv6) (2000::,8)!#"$%&'(Nonee  NonefO$  !"#$%&'($    !"#&$%('None7)iprouteThe Tree structure for IP routing table based on TRIE with one way branching removed. This is an abstract data type, so you cannot touch its inside. Please use 5 or < , instead.,iproute!A class to contain IPv4 and IPv6.-iprouteThe - function takes T and returns an ,* address whose only n-th bit is set..iprouteThe . function takes an , address and an test bit , address and returns w. is the bit is unset, otherwise returns x.4iprouteThe 4, function returns an empty IP routing table.*(empty :: IPRTable IPv4 ()) == fromList []True5iprouteThe 5( function inserts a value with a key of  to ) and returns a new ).P(insert ("127.0.0.1" :: AddrRange IPv4) () empty) == fromList [("127.0.0.1",())]True:iprouteThe :& function deletes a value by a key of  from ) and returns a new ).Odelete "127.0.0.1" (insert "127.0.0.1" () empty) == (empty :: IPRTable IPv4 ())True<iprouteThe < function looks up ) with a key of  . If a routing information in )* matches the key, its value is returned.\let v4 = ["133.4.0.0/16","133.5.0.0/16","133.5.16.0/24","133.5.23.0/24"] :: [AddrRange IPv4]let rt = fromList $ zip v4 v4lookup "127.0.0.1" rtNothinglookup "133.3.0.1" rtNothinglookup "133.4.0.0" rtJust 133.4.0.0/16lookup "133.4.0.1" rtJust 133.4.0.0/16lookup "133.5.16.0" rtJust 133.5.16.0/24lookup "133.5.16.1" rtJust 133.5.16.0/24=iprouteThe = function looks up ) with a key of  . If a routing information in )4 matches the key, both key and value are returned.:set -XOverloadedStrings[let rt = fromList ([("192.168.0.0/24", 1), ("10.10.0.0/16", 2)] :: [(AddrRange IPv4, Int)])lookupKeyValue "127.0.0.1" rtNothinglookupKeyValue "192.168.0.1" rtJust (192.168.0.0/24,1)lookupKeyValue "10.10.0.1" rtJust (10.10.0.0/16,2)?iproute? is a version of <P that returns all entries matching the given key, not just the longest match.:set -XOverloadedStringsnlet rt = fromList ([("192.168.0.0/24", 1), ("10.10.0.0/16", 2), ("10.0.0.0/8", 3)] :: [(AddrRange IPv4, Int)])lookupAll "127.0.0.1" rt[]lookupAll "192.168.0.1" rt[(192.168.0.0/24,1)]lookupAll "10.10.0.1" rt![(10.10.0.0/16,2),(10.0.0.0/8,3)]@iprouteThe @ function looks up ) with a key of /. If the key matches routing informations in ), they are returned.\let v4 = ["133.4.0.0/16","133.5.0.0/16","133.5.16.0/24","133.5.23.0/24"] :: [AddrRange IPv4]&let rt = fromList $ zip v4 $ repeat ()4findMatch "133.4.0.0/15" rt :: [(AddrRange IPv4,())]K[(133.4.0.0/16,()),(133.5.0.0/16,()),(133.5.16.0/24,()),(133.5.23.0/24,())]AiprouteThe AD function creates a new IP routing table from a list of a pair of IPrange and value.BiprouteThe B& function creates a list of a pair of & and value from an IP routing table.DiprouteO(n). Fold the keys and values in the IPRTable using the given left-associative binary operator. This function is equivalent to Data.Map.foldlWithKey with necessary to IPRTable changes. Since: 1.7.5EiprouteO(n). Fold the keys and values in the IPRTable using the given right-associative binary operator. This function is equivalent to Data.Map.foldrWithKey with necessary to IPRTable changes. Since: 1.7.5Hiproute Since: 1.7.5IiprouteNote that Semigroup and Monoid instances are right-biased. That is, if both arguments have the same key, the value from the right argument will be used. Since: 1.7.5)+*,.-/0123456789:;<=>?@ABCDE,.-/0123)+*456789:;<=>?@ABCDENone),-.45:<=?@ABDE,-.)45:<=?@ABDEy        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a_`b_`cdefghijklmnopqrstuvwxyz{|}~\]\]$iproute-1.7.7-Bl4bYsnCshE2skMbTxGTocData.IP.InternalData.IPData.IP.RouteTable.Internal Data.IP.Addr Data.IP.Mask Data.IP.Range Data.IP.OpData.IP.RouteTableIPv6IP6IPv4IP4IPv6AddrIPv4AddrIPipv4ipv6toIPv4toIPv6toIPv6bfromIPv4fromIPv6 fromIPv6bfromHostAddress toHostAddressfromHostAddress6toHostAddress6 ipv4ToIPv6 fromSockAddr AddrRangeaddrmaskmlenIPRange IPv4Range IPv6Range ipv4range ipv6rangeAddrmasked intToMask>:> isMatchedTo makeAddrRangeipv4RangeToIPv6 addrRangePairIPRTableNilNodeRoutable intToTBitisZero intToTBitIPv4 intToTBitIPv6intToTBitsWord32intToTBitsIPv4intToTBitsIPv6emptyinsertlinkglue keyToTestBitisLeftdeletenodelookuplookupKeyValuesearch lookupAll findMatchfromListtoListfoldt foldlWithKey foldrWithKey$fRoutableIPv6$fRoutableIPv4$fMonoidIPRTable$fSemigroupIPRTable$fTraversableIPRTable$fFoldableIPRTable$fFunctorIPRTable $fEqIPRTable$fGenericIPRTable$fGeneric1IPRTable$fShowIPRTablebase Text.ReadreadshowIPv4showIPv6ghc-prim GHC.TypesInt&network-2.8.0.0-AkCJm1aNSYz7ekXKYyI0pFNetwork.Socket.Types HostAddress HostAddress6SockAddr$fEqIP ip6ToInteger integerToIP6parseIP parseIPv4 parseIPv6digip4ip4' skipSpaceshexcolon2formatip6ip6' ip4Embedded fixByteOrdermaskIPv4maskIPv6shift128 shiftL128 shiftR128 fromIP6Addr toIP6Addr parseIPRangeparseIPv4RangeparseIPv6Rangeip4range maskedIPv4ip6range maskedIPv6TrueFalse