| line | true | false | branch | 
 
| 22 | 2 | 0 | if defined $str | 
 
| 24 | 108 | 0 | if defined $str | 
 
| 31 | 63 | 5 | unless $p =~ m[\./]u or $p =~ m[/\.]u or $p =~ m[//]u | 
 
| 33 | 15 | 15 | $p =~ m[^/]u ? : | 
 
| 34 | 7 | 23 | $p =~ /^\./u ? : | 
 
| 35 | 12 | 18 | $p =~ m[/$]u || $p =~ m[/\.$]u || $p =~ m[/\.\.$]u ? : | 
 
| 38 | 15 | 15 | if $is_abs | 
 
| 42 | 2 | 134 | unless $i | 
 
| 43 | 49 | 85 | if ($i eq '..') { } | 
 
|  | 78 | 7 | elsif ($i ne '.') { } | 
 
| 44 | 16 | 33 | if ($is_abs) { } | 
 
| 47 | 21 | 12 | if (@n and $n[0] ne '..') { } | 
 
| 58 | 15 | 15 | $is_abs ? : | 
 
|  | 12 | 18 | $is_dir ? : | 
 
| 59 | 7 | 23 | if $is_dot | 
 
| 70 | 0 | 81 | if (&Encode::is_utf8($uri)) | 
 
| 81 | 36 | 45 | if $authority | 
 
| 83 | 35 | 46 | if $scheme | 
 
| 85 | 36 | 45 | if ($host) | 
 
| 86 | 1 | 35 | if ($host =~ /[^\p{ASCII}]/u) { } | 
 
| 88 | 3 | 0 | if (/[^\p{ASCII}]/u) { } | 
 
| 103 | 73 | 8 | if $path | 
 
| 105 | 73 | 8 | if $path | 
 
| 107 | 35 | 46 | if $query | 
 
| 137 | 34 | 0 | if $self->scheme | 
 
| 139 | 32 | 2 | if $self->{'host'} | 
 
| 141 | 1 | 33 | if ($self->{'user'}) | 
 
| 143 | 1 | 0 | if $self->{'password'} | 
 
| 147 | 32 | 2 | if (my $host = $self->{'host'}) | 
 
| 148 | 1 | 31 | if ($iri and $host =~ /xn--/u) | 
 
| 150 | 3 | 0 | if (/^xn--/u) { } | 
 
| 161 | 2 | 32 | if ($self->{'port'}) | 
 
| 162 | 0 | 0 | unless ($self->{'scheme'} eq 'http' and $self->{'port'} == 80 or $self->{'scheme'} eq 'https' and $self->{'port'} == 443) | 
 
| 170 | 32 | 2 | if (my $path = $self->{'path'}) | 
 
| 171 | 1 | 31 | if $iri | 
 
| 175 | 14 | 20 | if (my $query = $self->{'query'}) | 
 
| 176 | 1 | 13 | if $iri | 
 
| 180 | 5 | 29 | if $self->{'fragment'} | 
 
| 199 | 2 | 26 | if $self->{'scheme'} | 
 
| 201 | 2 | 24 | if ($self->{'host'}) | 
 
| 212 | 21 | 3 | if ($self->{'path'}) { } | 
 
| 213 | 20 | 1 | unless ($self->{'path'} =~ m[^/]u) |