orienteering - using r to optimise mini mountain marathon routes - pete dodd sheffield r users march...

30
OrienteeRing! Sheffield R user group Pete Dodd March, 2015

Upload: paul-richards

Post on 17-Jul-2015

193 views

Category:

Software


3 download

TRANSCRIPT

OrienteeRing!Sheffield R user group

Pete Dodd

March, 2015

This talk

Using R to grab, visualize, and analyse data from a mini mountainmarathon

I getting data from web tables with rvestI manipulating the dataI visualisation with ggplot2I mapping with ggmapI analysis of speeds and leg lengthsI genetic algorithms for optimisation with GA

Mountain marathons: what are they?

Figure 1: A real event map

The data

Figure 2: The data at sportident.co.uk

rvest

library(rvest)library(ggplot2)rurl <- 'http://www.sportident.co.uk/results/....html'rurl %>% html() %>% html_table() %>% as.data.frame() %>%

ggplot(.,aes(x=Score)) %>%+geom_histogram(binwidth=10) %>% print

rvest

Figure 3: Distribution of scores.

Data manipulationdata frame sdf with position, score and route:

## [1] "Pos" "Name"## [3] "Team" "Category"## [5] "Score" "Time"## [7] "Points" "Bonus.Penalty"## [9] "Manual.Adj" "Controls..in.order.visited"

data frame sdf splits:

## [1] "Pos" "Name" "Category" "Score"## [5] "Time" "X.U.00A0." "X.U.00A0..1" "X.U.00A0..2"## [9] "X.U.00A0..3" "X.U.00A0..4" "X.U.00A0..5" "X.U.00A0..6"## [13] "X.U.00A0..7" "X.U.00A0..8" "X.U.00A0..9" "X.U.00A0..10"## [17] "X.U.00A0..11" "X.U.00A0..12" "X.U.00A0..13" "X.U.00A0..14"## [21] "X.U.00A0..15" "X.U.00A0..16" "X.U.00A0..17" "X.U.00A0..18"## [25] "X.U.00A0..19"

Data manipulation

CN <- c('S1',paste0('10',1:9),paste0('1',10:24),'F1')

getpath <- function(pos){tt <- tdf$Controls..in.order.visited[pos]tt2 <- unlist(strsplit(tt,', '))tt3 <- sapply(X=tt2,FUN = function(x)which(CN==x))g <- G[tt3,] #df of controlsg$Pos <- posg$Pos <- factor(g$Pos)tt <- gettimez(sdf[pos,6:ncol(sdf)]) #splitsg$split <- tt[!is.na(tt)]return(g)

}

Data manipulationlibrary(grid) #for arrowBP <- ggplot(data=G,aes(x=LON,y=LAT,label=Value)) +

geom_point(shape=1,size=3) +geom_text(size=4,hjust=-.5,color='red') +

scale_shape_discrete(solid=FALSE)

for(i in 1:nrow(tdf)){GP <- BP+

geom_segment(data=getpath(i),aes(xend=c(tail(LON,n=-1),NA),yend=c(tail(LAT,n=-1),NA),color=split),arrow = arrow(angle = 15, ends = "last", length = unit(0.2, "inches")),alpha=.9)+ggtitle(paste0(i,': ',tdf[i,2],'\nScore: ',tdf$Score[i],', penalty: ',tdf$Bonus.Penalty[i]))+scale_colour_gradient(limits=c(0,45),high='red',low='blue') + theme(plot.title = element_text(hjust = 0))

ggsave(GP,file=paste0('graphs/GP',sprintf("%03d",i),'.png'))}

Use FFMPEG to make movie!

Example routes

Example routes

Example routes

Example routes

Example routes

Mapping

library(ggmap)bbox <- make_bbox(LON, LAT, G, f = .8)map <- get_map(location = bbox,maptype='terrain')mp <- ggmap(map) + geom_point(data=G,aes(x=LON,y=LAT),shape=1,size=3)+

geom_text(data=G,aes(x=LON,y=LAT,label=Value),size=4,hjust=-.5,color='red')+scale_shape_discrete(solid=FALSE) + ylim(c(min(G$LAT)-eps,max(G$LAT)+eps)) +

xlim(c(min(G$LON)-eps,max(G$LON)+eps))

NB geom_leg needed rather than arrow for some reason.

Example routes

Example routes

Example routes

Example routes

Example routes

Mapping

Lessons:

I easy to use & integrates well with ggplot2I osm can be used rather than google, but service only runs in

middle of night!I discrete zoom levels can be awkward if you’re in betweenI bbox’s are square; although you can trim the display with xlim

etc.I usual shenanigans with different coordinate systems

Analysis

●●

●●

30

40

20

20

30

20

20

30

30

20

10

30

20 30

30

20

20

20

20

10

20

403030

53.23

53.25

53.27

53.29

53.31

−1.64 −1.62 −1.60 −1.58 −1.56LON

LAT

Analysis

Need a way of standardizing the leg durations, given splits fromdifferent runners.

One might imagine for leg i and runner j , split Tij

Tij = di/sj

where di is an inherent leg duration, and sj is a relative speed. Then

logTij = log di − log sj

Suggests linear regression:

lm(log(split) ~ leg + Pos + 0)

Analysis

●●●

●●

●●

●●

●●●●

●●●

●●

●●

●●●

●●

●●●

●●

●●●●●

●●

●●●

●●

●●●

●●

●●●●

●●

●●

●●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

0.00

0.25

0.50

0.75

1.00

0 50 100 150position

Spe

ed r

elat

ive

to w

inne

r

Optimization problem

I Combinatorial optimisation problem, similar to the travellingsalesman problem

I These problems are (NP) hardI Need to encode routes and their fitness (including penalties)

I sample a route as a permutation of 1:no_checkpoints,extracting the points between 1 and no_checkpoints

I 26! ≈ 4× 1026 (cf Avogadro’s number)I =⇒ need heuristics; not true solutions

Genetic algorithms

A class of optimization algorithms inspired by evolution.

There is a population of solutions with:

I a notion of fitnessI generationsI mutationI crossover (sex)

Package GA

Makes using these techniques pretty easy:

GA <- ga(type = "permutation", fitness = fitness,min = 1, max = length(ptz),popSize = 1e2, maxiter = 1e4,run = 5e3, pmutation = 0.2)

Package GA

0 2000 4000 6000 8000 10000

010

020

030

040

0

Generation

Fitn

ess

valu

e

●●●●●●

●●●●●●●●●

●●●●●●●●

●●●●●●●●●●

●●●●●●●●●●●●●●●●●●●●●●●●

●●●●●●●●●●●●●

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

●●●●

●●●●●●

●●●●●●●●●●●●●

●●●●●●●●●●●●●●●●●●

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

●●●●●●●●●●●●●●●●●●●●●●

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

●●●●●●●●●●●●●●●●●

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

●●●●●●●●●●●●●●●●●●●●●●●●●

●●●●●●●●●●●●●●●●●

●●●●●

●●●

●●●

●●●●●●●●●

●●●

●●

●●●

●●●●●●●●●●●●●●●●●●

●●

●●●●

●●●

●●

●●●

●●

●●●●●

●●●●

●●●●●●●●●●●

●●●●●●●

●●●●●

●●●●●

●●

●●●●●●●●●

●●●●●●●●●

●●●

●●●●

●●●●●●●●●●●●●●●

●●●●●●●●●●

●●●●●●●●●●●●●●

●●●●●●●●●●

●●

●●●

●●●●

●●●●●●●●●●●

●●●

●●

●●●●

●●●

●●●●●●●●●●●●●●

●●

●●●●●●●●

●●●●●●

●●●●●

●●●●●

●●●●●●

●●●●

●●●

●●

●●●

●●●

●●

●●●●

●●

●●

●●●●●

●●●

●●●●●●

●●●

●●

●●

●●●●

●●●

●●●●

●●●

●●●

●●

●●

●●●●●●●●●●●●●●●●●

●●●●

●●

●●●●

●●●●

●●●

●●●

●●●

●●●●●●●●

●●●●

●●

●●

●●●

●●

●●

●●●●●●●●

●●

●●●●●

●●

●●●●

●●

●●●

●●●●●

●●

●●

●●●●●●

●●

●●●●●●●

●●●

●●●●

●●●●●

●●

●●

●●●

●●

●●●●

●●●●

●●●

●●●●●

●●●

●●●●

●●●●●●

●●●●●

●●

●●

●●

●●

●●

●●●●

●●●

●●

●●

●●

●●●

●●●

●●

●●●

●●●

●●●●●●●

●●●●●●●●●

●●●

●●●●

●●●

●●●●●

●●

●●

●●●●●●

●●●●●

●●

●●●●

●●●●

●●

●●●

●●●●

●●●

●●

●●

●●

●●

●●●●

●●

●●

●●●

●●●

●●

●●●

●●

●●●

●●

●●●●●●●●●●●●●●

●●●●●●

●●●●

●●●

●●

●●●

●●

●●●●●

●●

●●●●

●●

●●

●●●

●●

●●●●

●●

●●

●●

●●●

●●●

●●●●

●●●●●

●●●●●

●●●●●●●●●●

●●

●●

●●

●●●●

●●

●●●●

●●●

●●●

●●●

●●

●●●●●

●●

●●

●●●●●

●●

●●

●●

●●

●●●●●

●●●

●●●●●●●

●●

●●●

●●

●●

●●

●●●●

●●

●●

●●

●●●●●

●●●●

●●●

●●

●●●●●●●

●●

●●●●●●●

●●●●

●●

●●

●●

●●●●

●●●●

●●●

●●

●●●

●●

●●●●

●●

●●●

●●

●●

●●

●●●

●●

●●●●●●

●●●

●●

●●●

●●

●●●

●●

●●●●

●●●

●●

●●●●●●

●●

●●●●●

●●

●●

●●●●●●●

●●●●

●●

●●●

●●●●●

●●

●●

●●

●●●

●●●

●●

●●

●●●●●●●●●●

●●

●●●●●●

●●

●●●

●●●●●●●●●

●●

●●

●●●

●●

●●

●●●●●

●●

●●

●●

●●●

●●●

●●●

●●

●●●●

●●●●●●

●●

●●●

●●●

●●

●●●

●●●

●●●●●●

●●●●

●●

●●

●●

●●

●●

●●●●

●●

●●●●●●●●●

●●●

●●

●●

●●

●●●●

●●●●●●●●

●●

●●●●

●●●●

●●

●●

●●●

●●●

●●

●●●●●●●●

●●

●●●

●●

●●

●●●

●●

●●●●●●

●●

●●

●●●●●●

●●●

●●●●●

●●●●●

●●

●●

●●●●

●●●

●●

●●●

●●

●●●

●●●●●

●●●

●●●●

●●

●●●

●●●●

●●

●●

●●●●

●●

●●●●

●●●●●

●●

●●

●●

●●●

●●●●

●●

●●

●●●●

●●

●●

●●●●

●●

●●●●

●●●

●●●●

●●●

●●●●●●●

●●●

●●

●●●●

●●●

●●●●

●●●●●

●●

●●

●●●

●●●

●●

●●

●●●

●●

●●

●●●●●●

●●●●●

●●

●●●●

●●●●

●●●

●●●●●●●

●●

●●●●●●●●●●

●●●●●●●●●●

●●●●

●●

●●●●

●●

●●

●●

●●●

●●●

●●

●●●●

●●

●●

●●

●●

●●

●●●

●●●

●●

●●●

●●

●●

●●●●

●●

●●●

●●●

●●

●●●

●●●●

●●●

●●●●

●●

●●

●●

●●●●

●●●

●●●

●●●

●●

●●●

●●

●●

●●

●●

●●

●●●●●

●●

●●●●●●●●

●●●●●●

●●●

●●

●●●

●●●●●●●

●●●

●●●

●●

●●●●●

●●

●●

●●●●●●

●●

●●

●●●●

●●

●●●

●●●●●●

●●●●

●●

●●●●

●●

●●

●●●

●●

●●●●

●●●

●●

●●●●

●●●●●●

●●

●●●

●●

●●●●●

●●●

●●●●

●●●●

●●●●

●●●●

●●

●●

●●●●

●●●

●●

●●●●●●●●●

●●●●

●●●

●●

●●

●●●

●●●●●●

●●●

●●●

●●●

●●

●●

●●

●●●●

●●

●●●●●

●●●

●●●

●●

●●

●●●●

●●●●●

●●●●●●

●●●●●●●●

●●

●●●●●●●

●●

●●●●●●

●●

●●●

●●

●●●●●●

●●●

●●●●●●

●●

●●●●

●●●●●●

●●

●●

●●

●●

●●

●●●

●●●

●●

●●

●●

●●●●●●●

●●

●●●

●●

●●

●●

●●

●●●

●●

●●●●

●●

●●●

●●

●●

●●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●

●●●●●

●●

●●●●

●●

●●

●●●●●

●●

●●●

●●

●●

●●

●●●●●●

●●

●●●●●

●●

●●●

●●●●●

●●●●●●

●●

●●●

●●

●●

●●●

●●●

●●●●●●

●●

●●

●●

●●●

●●●●

●●

●●

●●●●

●●

●●●●

●●

●●

●●

●●●

●●●

●●

●●

●●

●●●

●●

●●

●●●

●●

●●

●●●

●●

●●

●●

●●●

●●

●●●●

●●●

●●

●●

●●●

●●●

●●●●●

●●●

●●

●●

●●

●●

●●

●●●

●●●●

●●●●●●

●●

●●●●

●●

●●●●

●●

●●

●●

●●●●●

●●●

●●●

●●●●●

●●

●●●●

●●

●●●●

●●●●

●●

●●

●●

●●●

●●

●●●

●●●

●●●●

●●●

●●

●●

●●●

●●

●●

●●●

●●

●●●

●●●

●●●

●●●

●●

●●●

●●

●●●

●●

●●●●

●●

●●●

●●

●●

●●●●●●●●

●●●●●●

●●●

●●●

●●●

●●●

●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●●

●●●●

●●

●●

●●

●●●

●●●●●

●●●

●●

●●●●

●●●

●●●●

●●●●

●●●

●●

●●

●●●

●●●

●●●●

●●●●

●●●●●●

●●

●●●●●●

●●●●

●●●●●●

●●●

●●●

●●●●●

●●

●●●●

●●

●●●

●●●

●●

●●

●●●●

●●●

●●

●●

●●●●●●

●●●

●●

●●

●●●●●

●●●●●●●●●●●●●●●●●●

●●●●●

●●●

●●●

●●●●●●

●●●

●●●●

●●●●

●●●

●●●

●●●

●●●

●●●●

●●●●●●

●●

●●●●●

●●●●

●●

●●●●

●●●●●●●●●

●●●

●●●●●●

●●●●●

●●●●

●●●

●●●

●●●

●●

●●●●●●●●●●

●●●●●●●

●●●

●●●

●●

●●●●●●●●●

●●●●

●●

●●●●

●●

●●●●

●●

●●

●●●

●●●●●

●●●●

●●

●●●

●●●

●●

●●●●●●●●

●●

●●●

●●

●●

●●

●●

●●●

●●●

●●

●●●●

●●●

●●●

●●

●●●●●

●●

●●●●

●●

●●

●●●●

●●

●●●

●●●

●●●

●●●

●●●●

●●●●

●●●

●●●●

●●

●●

●●

●●●●●●●●●●

●●●●●

●●

●●

●●

●●●●●●

●●●●

●●●

●●●

●●●

●●

●●●

●●●

●●●

●●●●

●●●●●●●

●●

●●●

●●

●●

●●●●

●●

●●●●

●●●●

●●●

●●●●

●●●●

●●●●

●●●

●●●

●●●●●●●●●●●

●●

●●●

●●●●

●●●●●●●

●●●

●●

●●●●●●●

●●

●●●

●●●

●●●●●

●●

●●

●●●

●●

●●●●●●●●

●●

●●

●●

●●

●●

●●

●●●●

●●●

●●●

●●

●●●●

●●

●●

●●

●●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●●●

●●●●

●●●

●●●

●●●

●●

●●

●●●●

●●

●●●

●●●●

●●

●●●

●●●●●

●●●●●

●●●

●●●

●●●

●●

●●●

●●

●●●

●●

●●●●●

●●●

●●●●

●●●●

●●●

●●●

●●

●●

●●

●●

●●

●●●

●●

●●●●

●●

●●

●●

●●●●

●●

●●

●●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●●●●●

●●●

●●●

●●●●●

●●●

●●

●●

●●

●●

●●●●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●

●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●●

●●

●●●

●●

●●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●●●●

●●

●●

●●

●●●

●●●

●●

●●●●

●●

●●

●●●

●●●●●

●●●

●●●●

●●

●●

●●

●●

●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●

●●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●●●●

●●

●●●●

●●

●●●

●●●●

●●●●

●●●

●●●

●●

●●●

●●

●●

●●

●●

●●●

●●

●●●

●●

●●

●●●●

●●

●●●

●●

●●

●●●

●●●●●●●●

●●

●●

●●●●●●

●●●●

●●●●

●●

●●

●●

●●●●●

●●

●●●●

●●

●●

●●●

●●●

●●●

●●

●●

●●●

●●

●●●

●●

●●●●

●●

●●

●●

●●

●●

●●●●

●●●

●●●

●●●●●●

●●●

●●

●●●

●●

●●●

●●

●●

●●

●●●●

●●

●●

●●

●●●●

●●●●

●●

●●●

●●●●

●●●

●●

●●●●

●●

●●

●●

●●●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●

●●

●●

●●●

●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●●

●●●

●●

●●

●●●

●●

●●

●●●●●●●

●●

●●●●

●●

●●

●●

●●●●

●●●●●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●●●●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●

●●

●●●●

●●

●●●

●●●

●●

●●

●●

●●

●●

●●

●●●●●

●●

●●

●●●●

●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●●●●●

●●●

●●●●

●●

●●●

●●

●●

●●●●

●●

●●

●●

●●●

●●

●●●

●●●

●●

●●●

●●

●●

●●●

●●

●●

●●

●●

●●●

●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●●

●●●●●

●●

●●

●●●●●

●●

●●●

●●

●●●

●●●

●●

●●

●●

●●●

●●●●●

●●

●●

●●

●●●

●●●

●●●●

●●●

●●

●●●

●●

●●●●●

●●●●●●

●●●●●

●●

●●●●

●●●

●●●●

●●

●●●

●●●

●●

●●●

●●

●●

●●

●●●

●●

●●

●●●●●

●●

●●

●●●●

●●●●

●●

●●

●●

●●

●●●●●●

●●

●●

●●●●

●●

●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●●●

●●●

●●●●●●●

●●

●●

●●●

●●●●●●

●●

●●

●●●●●●

●●

●●

●●●

●●●

●●●

●●

●●●

●●●●●●

●●●●

●●●

●●●

●●

●●●●

●●

●●

●●●●●●●

●●

●●

●●

●●

●●

●●●●

●●●

●●●

●●●

●●●●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●

●●

●●

●●

●●●

●●●

●●

●●●

●●

●●●

●●

●●

●●

●●

●●

●●●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●

●●●●●

●●

●●

●●●

●●

●●●

●●●●●●

●●

●●●

●●

●●

●●

●●●●●●

●●●

●●●●

●●

●●

●●

●●

●●●●●

●●●

●●●

●●

●●●●

●●

●●●●

●●●

●●●

●●

●●●●●

●●

●●

●●●●●●

●●

●●

●●

●●●●●

●●●

●●●

●●●●●

●●●●

●●●

●●●●●

●●

●●

●●

●●●●

●●●●●●

●●

●●●●

●●

●●

●●●●

●●●●●●

●●●●

●●●●

●●

●●●●

●●

●●

●●

●●●

●●

●●●

●●

●●

●●

●●

●●●

●●

●●

●●●●

●●

●●●

●●●

●●

●●

●●

●●

●●

●●●●●●

●●

●●

●●●

●●

●●●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●●

●●

●●

●●●●

●●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●●

●●●●

●●●

●●●

●●

●●

●●

●●

●●●●●●●

●●

●●

●●●

●●

●●

●●

●●●●●●

●●●●

●●

●●●

●●

●●●●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●●

●●●●●

●●●

●●

●●

●●●

●●

●●●

●●●●●●●●●●●●

●●●●

●●

●●●●

●●●●

●●●

●●

●●

●●

●●

●●

●●●●

●●

●●

●●●●●●

●●●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●●

●●

●●●

●●

●●

●●●

●●

●●●

●●

●●●

●●

●●

●●

●●●

●●

●●●

●●

●●

●●●

●●

●●

●●●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●

●●

●●

●●●●●

●●●

●●●

●●

●●●

●●

●●

●●●

●●●●

●●

●●●

●●

●●

●●●

●●●

●●

●●●

●●

●●●●●●

●●●●●●

●●●

●●●

●●

●●

●●

●●●●

●●●●

●●●

●●●●

●●

●●

●●●

●●●●●

●●●

●●●●

●●●●●

●●

●●●●

●●●

●●

●●●●

●●●

●●●●

●●●

●●

●●●●●

●●

●●

●●●●●●●

●●●●●●

●●●●

●●●

●●●●

●●●

●●

●●

●●●●

●●

●●●

●●

●●●

●●●●●●

●●●

●●●

●●●●●●●●●

●●●●

●●●

●●●●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●●●

●●

●●●

●●

●●

●●●

●●●●●

●●●

●●

●●

●●●●

●●

●●

●●

●●●

●●●

●●●●●

●●

●●●

●●

●●

●●●●●

●●●●●●

●●●

●●

●●

●●

●●●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●●●

●●●

●●

●●●●●

●●

●●●

●●

●●

●●

●●

●●●

●●

●●

●●●●●●●●●●●

●●

●●●●

●●●●

●●

●●

●●●

●●

●●

●●●

●●●●

●●

●●

●●●

●●●●●

●●

●●

●●

●●●●

●●●●

●●

●●

●●●

●●●●●●

●●●●

●●

●●●●

●●

●●

●●

●●

●●

●●

●●●●

●●●

●●

●●

●●

●●

●●

●●●●

●●●

●●

●●●●●

●●

●●

●●●●

●●●

●●●●

●●●●

●●

●●●

●●●

●●●●●●●●

●●●●●●

●●●

●●●●●●

●●

●●

●●

●●●●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●●

●●●

●●

●●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●●

●●●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●●

●●

●●●

●●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●●

●●

●●

●●●

●●

●●

●●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●●

●●●

●●

●●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●●

●●●

●●

●●

●●

●●

●●●●●●

●●

●●

●●

●●

●●

●●●●

●●●

●●●

●●●

●●

●●●

●●

●●

●●

●●

●●

●●

●●

●●

●●●

●●

●●●●

●●

●●●●●●

●●

●●

●●

●●

●●

●●●●●●●

●●●

●●●●

●●●●●

●●●

●●

●●●●●●●

●●

●●●

●●

●●

●●

●●

●●●●●

●●

●●

●●

●●●

●●●

●●●●

●●

●●●●●●

●●

●●

●●

●●

●●

●●●●

●●

●●●

●●

●●

●●

●●●●

●●

●●

●●

●●●●

●●

●●

●●●

●●●

●●

●●

●●

●●●

●●●●

●●

●●

BestMean

Solution

● ●

●●

30

40

20

20

30

20

20

30

30

20

10

30

20 30

30

20

20

20

20

10

20

403030

0

10

20

30

40

split

Final Score: 463, Raw Score: 470Time: 246mins, penalty: 7

Figure 4: Cf winner’s score of 440

Winner’s actual route