Skip to content

Instantly share code, notes, and snippets.

@owen8877
Last active February 19, 2017 06:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save owen8877/6de893c1f542bd8dcba74d76b1203043 to your computer and use it in GitHub Desktop.
Save owen8877/6de893c1f542bd8dcba74d76b1203043 to your computer and use it in GitHub Desktop.
d3-learning 0 nottingham-map
license: cc-by-4.0
height: 800
border: no

By xDroid

Data based on our mcm thesis.

Introduction

The map is drawn for our mcm thesis (of course not for this time), to intuitively show the distribution of blocks with different functions. We also collect data on public transportation (mainly from bus station numbers).

The original code was written under node.js environment with the help of d3-node, rendering a svg file which can be easily converted to png or other picture types. Since I want to learn d3.js thoroughly, so I tranport the code to browser platform. (It is obvious that the work is very easy.)

Reading the code

We have a template to minify the trouble of writing htmls every time.

<!DOCTYPE html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="//danlevan.github.io/google-material-color/dist/palette.css" type="text/css" />
<style>
</style>
</head>
<body>
<script src="//d3js.org/d3.v3.min.js"></script>
<script src="//danlevan.github.io/google-material-color/dist/palette.js"></script>
<script></script>
</body>

Besides d3.js, I also use js and css files from google-material-color repo to simplify color picking work.

Where loads the data ?

Good question. Here.

d3.tsv("nottingham.tsv")
.row(d => {
  d.x = +d.x
  d.y = +d.y
  d.type = +d.type
  d.development = +d.development
  d.bus = d.bus === "true"
  return d
})
.get((error, data) => {
//...
}

The processing work

The work is mainly divided into two parts: displaying the blocks and drawing the legends.

Displaying blocks

These two functions are related: blockBackgroundLayer(blockSelection), busLayer(blockSelection, data). And they do the following things.

function blockBackgroundLayer(blockSelection) {
  blockSelection
    .append('rect')
      .attr('x', blockDimension.x)
      .attr('y', blockDimension.y)
      .attr('width', blockDimension.width)
      .attr('height', blockDimension.height)
      .style('fill', d => {
        return palette.get(typeMapping[d.type].color, developmentMapping[d.development])
      })
}

(If you ask 'where sets the x and y coordinate of the block', the answer is in the definition of blockSelection)

function busLayer(blockSelection, data) {
  busDot(blockSelection)
  busConnection(blockSelection, data)
}

function busDot(blockSelection) {
  blockSelection
    .append('circle')
    .attr('cx', `0.5`)
    .attr('cy', `0.5`)
    .attr('r', `0.3`)
    .style('visibility', d => d.bus ? 'visible' : 'collapse')
}

function busConnection(blockSelection, data) {
  let blockHasBus = data.filter(block => block.bus)
  const directions = [{dx: 1, dy: 0}, {dx: 0, dy: 1}, {dx: -1, dy: 0}, {dx: 0, dy: -1}]
  directions.map(direction => {
    blockSelection
      .append('line')
      .attr({
        x1: 0.5,
        y1: 0.5,
        x2: 0.5 * (1 + direction.dx),
        y2: 0.5 * (1 + direction.dy)
      })
      .style('visibility', d => {
        if (!d.bus)
          return 'collapse'
        
        let thisDirectionConnection = blockHasBus.filter(block => {
            return block.bus
              && block.x == d.x + direction.dx
              && block.y == d.y + direction.dy
          })
        
        return thisDirectionConnection.length >= 1 ? 'visible' : 'collapse'
      })
  })
}

Very naive implementation. Just search if the block has a neighbour both having bus stations.

Drawing the legends

We can reuse blockBackgroundLayer and busLayer to simplify codes.

function descriptionLegendLayer(chart) {
  let descriptionLegendSelection = chart
    .append('g')
    .attr('transform', `translate(${0.65 * chartDimension.width}, ${0.6 * chartDimension.height})`)
    
  descriptionLayer(descriptionLegendSelection)
  legendLayer(descriptionLegendSelection)
}

function descriptionLayer(descriptionLegendSelection) {
  descriptionLegendSelection
  .append('g')
    .style('class', 'palette-Grey-500 text')
    .append('text')
    .text('Visualized Data of Nottingham')
}

function legendLayer(descriptionLegendSelection) {
  let flatMap = function(array, lambda) { 
    return Array.prototype.concat.apply([], array.map(lambda)); 
  }
  
  let legendData = flatMap(typeMapping, (type, index) => {
    return [0,1,2,3,4].map(development => {
      return {y: development, x: index, development, type: index}
    })
  })
  
  let legendSelection = descriptionLegendSelection
    .append('g')
      .attr('transform', `scale(${scale(2)}, ${scale(2)}) translate(5, 1.5)`)
      .attr('class', 'legend')
      
  let legendIconSelection = legendSelection
    .selectAll('g')
      .data(legendData)
    .enter()
      .append('g')
        .attr('transform', (d) => `translate(${d.x}, ${d.y})`)
        
  blockBackgroundLayer(legendIconSelection)
  
  legendDescriptionLayer(legendSelection)
  
  busLegendLayer(legendSelection)
}

(I assume no one is interested in the implementation of busLegendLayer)

Credits

Many thanks to Chenjie Yu and Chen Cheng for collecting and processing the data.

<!DOCTYPE html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="//danlevan.github.io/google-material-color/dist/palette.css" type="text/css" />
<style>
.chart rect{
fill: #9E9E9E;
}
.chart circle{
fill-opacity: 0.4;
}
.chart line {
stroke: grey;
stroke-width: 0.3;
stroke-opacity: 0.3;
}
.chart text{
font: 20px sans-serif;
fill: steelblue;
text-anchor: start;
}
.legend text{
font: 15px sans-serif;
text-anchor: end;
fill: #616161;
}
</style>
</head>
<body>
<div class="chart">
<text>The data will be ready soon...</text>
</div>
<svg class="chart"></svg>
<script src="//d3js.org/d3.v4.min.js"></script>
<script src="//danlevan.github.io/google-material-color/dist/palette.js"></script>
<script>
/* global d3 */
/* global palette */
const chartDimension = {width: 800, height: 800}
const blockPadding = 0.08
const blockDimension = {
x: blockPadding,
y: blockPadding,
width: 1 - 2 * blockPadding,
height: 1 - 2 * blockPadding
}
const typeMapping = [
{desc: 'residential', color: 'Deep Orange'},
{desc: 'working', color: 'Teal'},
{desc: 'recreational', color: 'Yellow'},
{desc: 'open', color: 'Light Green'},
{desc: 'undeveloped', color: 'Grey'}
]
const developmentMapping = {
0: 100,
1: 200,
2: 300,
3: 500,
4: 'A400'
}
let chart = d3.select('svg')
let scale
chart
.attr('width', `${chartDimension.width}px`)
.attr('height', `${chartDimension.height}px`)
d3.tsv("nottingham.tsv")
.row(d => {
d.x = +d.x
d.y = +d.y
d.type = +d.type
d.development = +d.development
d.bus = d.bus === "true"
return d
})
.get((error, data) => {
scale = d3.scaleLinear()
.domain([0, d3.max(data, d => Math.max(d.x, d.y))])
.range([0, chartDimension.width])
let blockSelection = chart
.append('g')
.attr('transform', `scale(${scale(1)}, ${scale(1)})`)
.selectAll('g')
.data(data)
.enter()
.append('g')
.attr('transform', (d) => `translate(${d.x}, ${d.y})`)
blockBackgroundLayer(blockSelection)
busLayer(blockSelection, data)
descriptionLegendLayer(chart)
d3.select('div')
.style('visibility', 'collapse')
})
function blockBackgroundLayer(blockSelection) {
blockSelection
.append('rect')
.attr('x', blockDimension.x)
.attr('y', blockDimension.y)
.attr('width', blockDimension.width)
.attr('height', blockDimension.height)
.style('fill', d => {
return palette.get(typeMapping[d.type].color, developmentMapping[d.development])
})
}
function busLayer(blockSelection, data) {
busDot(blockSelection)
busConnection(blockSelection, data)
}
function busDot(blockSelection) {
blockSelection
.append('circle')
.attr('cx', `0.5`)
.attr('cy', `0.5`)
.attr('r', `0.3`)
.style('visibility', d => d.bus ? 'visible' : 'collapse')
}
function busConnection(blockSelection, data) {
let blockHasBus = data.filter(block => block.bus)
const directions = [{dx: 1, dy: 0}, {dx: 0, dy: 1}, {dx: -1, dy: 0}, {dx: 0, dy: -1}]
directions.map(direction => {
blockSelection
.append('line')
.attr('x1', 0.5)
.attr('y1', 0.5)
.attr('x2', 0.5 * (1 + direction.dx))
.attr('y2', 0.5 * (1 + direction.dy))
.style('visibility', d => {
if (!d.bus)
return 'collapse'
let thisDirectionConnection = blockHasBus.filter(block => {
return block.bus
&& block.x == d.x + direction.dx
&& block.y == d.y + direction.dy
})
return thisDirectionConnection.length >= 1 ? 'visible' : 'collapse'
})
})
}
function descriptionLegendLayer(chart) {
let descriptionLegendSelection = chart
.append('g')
.attr('transform', `translate(${0.65 * chartDimension.width}, ${0.6 * chartDimension.height})`)
descriptionLayer(descriptionLegendSelection)
legendLayer(descriptionLegendSelection)
}
function descriptionLayer(descriptionLegendSelection) {
descriptionLegendSelection
.append('g')
.style('class', 'palette-Grey-500 text')
.append('text')
.text('Visualized Data of Nottingham')
}
function legendLayer(descriptionLegendSelection) {
let flatMap = function(array, lambda) {
return Array.prototype.concat.apply([], array.map(lambda));
}
let legendData = flatMap(typeMapping, (type, index) => {
return [0,1,2,3,4].map(development => {
return {y: development, x: index, development, type: index}
})
})
let legendSelection = descriptionLegendSelection
.append('g')
.attr('transform', `scale(${scale(2)}, ${scale(2)}) translate(5, 1.5)`)
.attr('class', 'legend')
let legendIconSelection = legendSelection
.selectAll('g')
.data(legendData)
.enter()
.append('g')
.attr('transform', (d) => `translate(${d.x}, ${d.y})`)
blockBackgroundLayer(legendIconSelection)
legendDescriptionLayer(legendSelection)
busLegendLayer(legendSelection)
}
function legendDescriptionLayer(legendSelection) {
legendSelection
.append('g')
.selectAll('text')
.data(typeMapping.map(type => type.desc))
.enter()
.append('text')
.attr('transform', (d, i) => `translate(${i+0.7}, 5.5) rotate(-45) scale(${1 / scale(2)}, ${1 / scale(2)})`)
.text(d => d)
legendSelection
.append('text')
.attr('transform', `translate(4, 9) scale(${1 / scale(2)}, ${1 / scale(2)})`)
.style('font-weight', 'bold')
.text('Block Type')
legendSelection
.append('g')
.selectAll('text')
.data([0,1,2,3,4])
.enter()
.append('text')
.attr('transform', (d, i) => `translate(-0.3, ${i + 0.7}) scale(${1 / scale(2)}, ${1 / scale(2)})`)
.text(d => d)
legendSelection
.append('text')
.attr('transform', `translate(-1.3, -0.2) rotate(-90) scale(${1 / scale(2)}, ${1 / scale(2)})`)
.style('font-weight', 'bold')
.text('Development Level')
}
function busLegendLayer(legendSelection) {
let busLegendSelection = legendSelection
.append('g')
.attr('transform', `translate(-8, 6)`)
busLegendSelection
.append('text')
.style('font-weight', 'bold')
.attr('transform', (d, i) => `translate(5, -0.5) scale(${1 / scale(2)}, ${1 / scale(2)})`)
.text('Access to public transport')
let busLegendData = [
{x: 0, y: 0, development: 2, type: 4, bus: false, desc: "None"},
{x: 0, y: 1, development: 2, type: 4, bus: true, desc: "Exist"}
]
let busIconLegend = busLegendSelection
.selectAll('g')
.data(busLegendData)
.enter()
.append('g')
.attr('transform', (d) => `translate(${d.x}, ${d.y})`)
blockBackgroundLayer(busIconLegend)
busLayer(busIconLegend, busLegendData)
busIconLegend
.append('text')
.style('text-anchor', 'start')
.attr('transform', `translate(1.1, 0.8) scale(${1 / scale(2)}, ${1 / scale(2)})`)
.text(d => d.desc)
}
</script>
</body>
y x development type bus
0 17 0 4 false
0 18 0 4 false
0 19 1 4 false
0 20 0 4 false
0 21 0 4 false
0 22 1 3 false
0 23 2 4 false
0 24 2 4 false
0 25 1 0 true
0 26 1 0 false
0 27 1 2 true
0 28 3 1 false
1 16 2 4 false
1 17 0 4 false
1 18 2 3 false
1 19 1 3 false
1 20 1 3 false
1 21 2 4 false
1 22 1 3 false
1 23 0 4 false
1 24 1 4 false
1 25 1 0 false
1 26 1 1 false
1 27 1 1 false
1 28 1 1 false
1 29 1 3 false
1 30 0 4 false
1 31 0 4 false
1 32 1 4 false
1 33 1 4 false
2 14 1 4 false
2 15 1 4 false
2 16 1 4 false
2 17 1 0 false
2 18 0 4 false
2 19 1 0 false
2 20 1 3 false
2 21 1 3 false
2 22 1 3 false
2 23 1 0 false
2 24 2 1 false
2 25 2 0 false
2 26 3 1 true
2 27 2 1 true
2 28 0 4 true
2 29 0 4 true
2 30 0 4 false
2 31 0 4 false
2 32 0 4 false
2 33 1 0 false
2 34 1 2 true
2 35 2 2 true
2 36 3 2 false
2 37 2 1 false
3 11 2 2 false
3 12 1 2 false
3 13 0 4 false
3 14 0 4 false
3 15 1 0 false
3 16 1 0 false
3 17 1 3 false
3 18 2 2 false
3 19 1 3 false
3 20 1 3 false
3 21 2 3 false
3 22 1 3 false
3 23 2 0 false
3 24 2 2 false
3 25 3 1 true
3 26 2 1 true
3 27 1 0 true
3 28 1 0 false
3 29 1 0 false
3 30 1 2 false
3 31 2 2 true
3 32 1 0 false
3 33 2 2 false
3 34 1 0 true
3 35 1 2 false
3 36 2 2 true
3 37 3 2 false
3 38 2 3 false
3 39 2 2 false
3 40 1 3 false
3 41 2 3 false
4 11 2 3 false
4 12 1 2 false
4 13 2 1 false
4 14 0 4 false
4 15 1 2 true
4 16 1 0 false
4 17 1 3 false
4 18 1 0 false
4 19 1 0 false
4 20 1 0 false
4 21 2 2 true
4 22 1 0 true
4 23 1 0 true
4 24 2 2 true
4 25 3 2 false
4 26 1 0 false
4 27 2 0 true
4 28 1 0 true
4 29 1 0 true
4 30 1 2 true
4 31 2 1 true
4 32 1 0 true
4 33 2 0 true
4 34 2 0 true
4 35 1 2 true
4 36 2 2 true
4 37 1 0 true
4 38 1 1 false
4 39 1 2 false
4 40 1 0 false
4 41 1 0 false
4 42 1 4 false
5 13 3 1 true
5 14 3 2 true
5 15 3 2 true
5 16 3 1 true
5 17 3 2 false
5 18 2 2 false
5 19 0 4 true
5 20 1 0 false
5 21 2 0 true
5 22 3 0 true
5 23 3 1 false
5 24 2 2 true
5 25 3 2 false
5 26 1 3 false
5 27 1 3 false
5 28 2 2 false
5 29 1 0 false
5 30 1 0 true
5 31 1 0 false
5 32 1 0 true
5 33 2 0 true
5 34 3 0 false
5 35 3 0 false
5 36 1 0 true
5 37 1 2 false
5 38 1 0 true
5 39 1 0 true
5 40 1 2 false
5 41 1 0 false
5 42 1 0 false
6 13 2 3 false
6 14 1 0 false
6 15 2 2 true
6 16 2 0 true
6 17 2 0 true
6 18 3 2 true
6 19 3 2 true
6 20 2 0 false
6 21 1 0 false
6 22 1 0 true
6 23 2 2 true
6 24 2 1 true
6 25 2 2 true
6 26 2 0 true
6 27 1 3 false
6 28 1 1 true
6 29 2 1 true
6 30 2 0 true
6 31 1 0 false
6 32 2 1 false
6 33 2 1 true
6 34 2 0 true
6 35 0 4 true
6 36 2 0 false
6 37 2 0 false
6 38 2 0 false
6 39 3 0 true
6 40 2 0 true
6 41 1 0 true
7 15 3 0 false
7 16 2 0 true
7 17 1 1 false
7 18 1 2 false
7 19 2 2 false
7 20 2 1 false
7 21 2 1 false
7 22 3 1 false
7 23 3 1 false
7 24 1 0 false
7 25 1 2 false
7 26 1 0 true
7 27 1 0 false
7 28 1 2 false
7 29 3 1 false
7 30 1 0 false
7 31 0 4 false
7 32 0 4 false
7 33 0 4 true
7 34 3 0 true
7 35 1 2 true
7 36 1 0 false
7 37 2 2 false
7 38 1 2 false
7 39 3 1 false
7 40 3 1 true
7 41 2 1 true
7 42 2 0 true
8 15 1 0 false
8 16 1 0 false
8 17 2 3 false
8 18 3 3 false
8 19 2 3 false
8 20 2 1 false
8 21 3 1 false
8 22 3 1 true
8 23 3 2 true
8 24 1 0 false
8 25 1 0 false
8 26 1 0 false
8 27 2 0 true
8 28 1 0 true
8 29 1 0 true
8 30 3 1 true
8 31 3 1 true
8 32 2 0 true
8 33 2 0 true
8 34 1 0 true
8 35 1 1 true
8 36 1 0 true
8 37 1 0 false
8 38 1 1 true
8 39 2 0 true
8 40 1 0 true
8 41 1 0 false
8 42 1 0 false
8 43 1 0 false
8 44 1 1 true
9 14 1 3 false
9 15 1 0 true
9 16 2 0 true
9 17 1 2 false
9 18 3 0 false
9 19 3 0 true
9 20 3 2 true
9 21 2 0 false
9 22 2 1 true
9 23 3 0 false
9 24 2 1 false
9 25 2 1 true
9 26 1 0 true
9 27 2 0 false
9 28 2 0 true
9 29 2 0 true
9 30 1 1 true
9 31 1 1 false
9 32 1 1 false
9 33 3 0 true
9 34 1 0 true
9 35 2 0 false
9 36 1 0 false
9 37 1 3 true
9 38 3 1 true
9 39 2 0 true
9 40 2 1 true
9 41 2 1 true
9 42 2 0 true
9 43 2 1 true
9 44 3 1 true
10 14 1 0 false
10 15 1 0 false
10 16 1 0 false
10 17 1 0 false
10 18 1 3 false
10 19 1 3 false
10 20 1 0 false
10 21 2 3 false
10 22 2 1 true
10 23 3 1 false
10 24 2 1 false
10 25 2 1 true
10 26 2 0 true
10 27 2 0 true
10 28 2 0 true
10 29 3 1 false
10 30 2 1 true
10 31 1 0 true
10 32 1 0 true
10 33 2 0 false
10 34 1 0 false
10 35 1 0 true
10 36 1 2 false
10 37 1 0 true
10 38 2 1 false
10 39 2 1 true
10 40 2 1 false
10 41 1 0 false
10 42 1 0 false
10 43 2 0 false
10 44 3 1 true
11 17 1 4 false
11 18 1 4 false
11 19 1 1 false
11 20 2 3 false
11 21 1 0 true
11 22 1 0 false
11 23 2 1 false
11 24 1 0 false
11 25 2 0 true
11 26 1 2 false
11 27 1 1 true
11 28 3 1 false
11 29 1 0 true
11 30 1 0 false
11 31 2 0 true
11 32 1 0 false
11 33 2 0 false
11 34 2 0 false
11 35 3 1 true
11 36 3 1 true
11 37 3 0 true
11 38 3 1 true
11 39 3 1 true
11 40 2 0 true
11 41 2 0 false
11 42 1 0 true
11 43 2 0 true
11 44 1 1 false
11 45 1 0 false
11 46 1 0 true
11 47 1 0 false
12 3 0 4 false
12 4 0 4 false
12 5 0 4 false
12 6 0 4 false
12 12 1 0 false
12 13 1 0 false
12 14 1 1 false
12 15 1 0 true
12 16 1 0 true
12 17 1 2 true
12 18 2 1 true
12 19 3 1 true
12 20 2 1 true
12 21 1 0 true
12 22 1 0 true
12 23 1 0 true
12 24 1 3 false
12 25 1 3 false
12 26 1 0 false
12 27 1 1 true
12 28 3 2 true
12 29 3 1 true
12 30 3 1 true
12 31 3 1 true
12 32 2 0 true
12 33 3 0 true
12 34 2 0 false
12 35 1 3 false
12 36 2 2 true
12 37 3 1 true
12 38 3 1 true
12 39 1 0 true
12 40 1 0 true
12 41 1 0 false
12 42 3 0 false
12 43 2 0 true
12 44 3 2 false
12 45 1 0 false
12 46 1 0 false
12 47 1 0 false
12 48 1 0 true
12 49 1 0 false
12 50 1 0 false
13 4 0 4 false
13 5 1 4 false
13 6 1 1 false
13 7 1 1 false
13 8 0 4 false
13 9 1 1 false
13 10 1 0 false
13 11 1 0 true
13 12 1 0 true
13 13 2 3 false
13 14 1 0 false
13 15 1 1 false
13 16 1 0 false
13 17 1 1 false
13 18 2 1 false
13 19 2 0 false
13 20 1 2 true
13 21 3 2 false
13 22 2 1 true
13 23 3 1 false
13 24 1 0 false
13 25 2 0 true
13 26 2 2 false
13 27 2 2 false
13 28 3 1 true
13 29 2 3 false
13 30 1 3 false
13 31 1 0 false
13 32 1 1 false
13 33 1 1 false
13 34 1 0 true
13 35 1 0 false
13 36 1 2 false
13 37 3 1 false
13 38 3 1 false
13 39 3 0 false
13 40 2 2 false
13 41 1 0 true
13 42 2 1 true
13 43 1 0 true
13 44 2 3 true
13 45 3 3 false
13 46 3 3 true
13 47 3 1 true
13 48 2 0 true
13 49 1 0 true
13 50 1 1 true
14 4 1 1 false
14 5 1 4 false
14 6 1 4 false
14 7 3 1 false
14 8 3 1 false
14 9 1 0 false
14 10 1 0 true
14 11 1 0 false
14 12 1 0 false
14 13 1 3 false
14 14 2 3 false
14 15 3 3 false
14 16 3 3 false
14 17 3 0 false
14 18 3 0 true
14 19 3 2 true
14 20 2 0 true
14 21 1 0 true
14 22 1 2 true
14 23 2 1 true
14 24 2 0 true
14 25 2 1 true
14 26 1 3 true
14 27 2 0 true
14 28 2 0 true
14 29 1 3 true
14 30 1 4 false
14 31 1 2 true
14 32 1 0 false
14 33 1 0 true
14 34 1 1 true
14 35 1 0 true
14 36 1 0 true
14 37 1 0 true
14 38 1 0 false
14 39 1 0 false
14 40 1 0 false
14 41 1 2 true
14 42 1 1 true
14 43 1 0 false
14 44 1 0 false
14 45 2 3 true
14 46 1 0 true
14 47 1 0 true
14 48 2 1 true
14 49 2 1 true
15 5 2 4 false
15 6 3 1 false
15 7 3 1 false
15 8 2 1 true
15 9 1 1 false
15 10 3 0 false
15 11 3 0 false
15 12 1 3 false
15 13 2 3 false
15 14 1 0 false
15 15 3 0 false
15 16 3 0 false
15 17 2 0 false
15 18 1 1 false
15 19 2 1 true
15 20 2 0 true
15 21 2 0 false
15 22 1 0 false
15 23 1 1 true
15 24 1 2 true
15 25 3 2 false
15 26 3 1 true
15 27 3 1 false
15 28 2 1 true
15 29 3 1 true
15 30 2 2 true
15 31 3 1 true
15 32 3 1 true
15 33 2 1 false
15 34 2 0 false
15 35 2 1 false
15 36 3 1 false
15 37 2 1 true
15 38 2 0 false
15 39 1 0 false
15 40 1 0 false
15 41 1 1 true
15 42 1 0 false
15 43 1 0 true
15 44 1 0 true
15 45 1 0 true
15 46 2 1 true
15 47 3 1 true
15 48 3 0 false
15 49 2 0 false
15 50 1 0 false
16 6 0 4 false
16 7 1 4 false
16 8 1 4 false
16 9 1 0 true
16 10 3 0 false
16 11 3 1 true
16 12 2 0 true
16 13 3 0 true
16 14 3 0 false
16 15 2 0 true
16 16 1 0 false
16 17 1 0 false
16 18 1 0 true
16 19 2 0 true
16 20 3 0 true
16 21 3 0 false
16 22 2 0 false
16 23 2 0 true
16 24 2 2 true
16 25 1 2 true
16 26 1 0 false
16 27 2 0 false
16 28 2 0 false
16 29 2 0 true
16 30 1 3 false
16 31 2 0 true
16 32 2 1 true
16 33 2 1 true
16 34 2 0 true
16 35 1 0 false
16 36 1 0 false
16 37 2 1 true
16 38 1 0 false
16 39 1 0 false
16 40 2 0 true
16 41 2 0 false
16 42 2 0 false
16 43 2 0 false
16 44 1 1 false
16 45 2 2 false
16 46 1 0 false
16 47 3 1 false
16 48 2 1 true
16 49 2 1 false
16 50 1 0 true
16 51 1 0 true
17 7 1 3 false
17 8 0 4 false
17 9 2 0 false
17 10 1 0 true
17 11 2 0 false
17 12 2 0 true
17 13 3 0 true
17 14 3 1 true
17 15 3 0 true
17 16 2 0 true
17 17 2 0 true
17 18 2 0 false
17 19 2 0 false
17 20 3 0 false
17 21 2 0 true
17 22 2 0 false
17 23 2 0 true
17 24 1 1 false
17 25 1 1 false
17 26 2 0 false
17 27 2 0 false
17 28 1 3 true
17 29 1 3 false
17 30 2 1 false
17 31 1 2 true
17 32 1 1 true
17 33 2 1 false
17 34 2 2 false
17 35 2 0 true
17 36 3 0 false
17 37 1 0 true
17 38 2 0 true
17 39 1 2 true
17 40 1 3 false
17 41 1 1 false
17 42 1 1 false
17 43 1 0 false
17 44 1 0 true
17 45 1 0 false
17 46 1 0 false
17 47 2 1 false
17 48 2 0 false
17 49 1 0 true
17 50 1 0 true
17 51 1 1 false
18 8 0 4 true
18 9 2 1 true
18 10 1 0 true
18 11 3 1 true
18 12 2 1 false
18 13 1 2 false
18 14 2 2 false
18 15 2 1 true
18 16 1 3 false
18 17 1 3 false
18 18 2 2 true
18 19 1 1 true
18 20 1 1 true
18 21 1 1 false
18 22 2 0 true
18 23 2 0 false
18 24 1 3 false
18 25 1 0 false
18 26 1 2 false
18 27 1 0 true
18 28 2 0 false
18 29 2 1 true
18 30 2 2 false
18 31 1 1 true
18 32 3 1 false
18 33 2 1 false
18 34 2 1 true
18 35 2 1 false
18 36 2 1 true
18 37 2 0 false
18 38 1 1 true
18 39 3 1 true
18 40 1 0 false
18 41 1 0 false
18 42 1 0 false
18 43 2 0 true
18 44 1 2 true
18 45 2 3 false
18 46 3 3 true
18 47 2 3 false
18 48 2 0 true
18 49 3 0 true
18 50 1 1 false
18 51 2 1 false
19 6 0 4 false
19 7 0 4 false
19 8 0 4 false
19 9 2 2 false
19 10 3 0 true
19 11 2 0 true
19 12 1 2 true
19 13 2 0 false
19 14 1 0 false
19 15 2 0 false
19 16 3 1 true
19 17 3 1 true
19 18 2 2 true
19 19 1 3 false
19 20 1 3 false
19 21 1 0 false
19 22 1 0 false
19 23 2 2 true
19 24 2 1 true
19 25 1 0 true
19 26 1 0 true
19 27 3 1 false
19 28 3 1 false
19 29 1 0 false
19 30 1 0 false
19 31 1 1 true
19 32 2 1 true
19 33 2 0 true
19 34 2 0 true
19 35 2 0 false
19 36 2 0 true
19 37 2 1 false
19 38 3 1 true
19 39 1 0 false
19 40 1 0 false
19 41 1 0 false
19 42 1 1 false
19 43 1 0 true
19 44 2 3 false
19 45 1 3 false
19 46 1 3 false
19 47 1 1 true
19 48 1 1 true
19 49 2 0 true
19 50 2 1 true
19 51 1 0 true
19 52 1 0 false
19 53 2 0 false
19 54 1 3 false
19 55 1 0 false
19 56 1 0 false
20 5 1 4 false
20 6 1 4 false
20 7 0 4 true
20 8 2 1 true
20 9 2 1 false
20 10 2 1 true
20 11 2 0 true
20 12 1 0 true
20 13 1 1 true
20 14 2 1 true
20 15 3 2 false
20 16 3 2 false
20 17 3 2 false
20 18 1 0 true
20 19 3 0 true
20 20 3 1 false
20 21 2 1 false
20 22 3 1 true
20 23 2 0 false
20 24 1 3 false
20 25 3 1 true
20 26 1 2 true
20 27 2 1 true
20 28 2 1 true
20 29 1 0 false
20 30 2 0 false
20 31 3 0 false
20 32 2 1 true
20 33 1 1 true
20 34 1 2 false
20 35 1 3 true
20 36 1 3 false
20 37 1 3 false
20 38 2 3 true
20 39 1 0 false
20 40 3 0 false
20 41 3 0 false
20 42 2 0 true
20 43 2 1 false
20 44 2 3 false
20 45 1 3 true
20 46 2 0 true
20 47 1 1 false
20 48 1 0 true
20 49 1 0 true
20 50 1 0 false
20 51 2 0 true
20 52 3 0 false
20 53 2 0 false
20 54 2 0 true
20 55 2 1 true
20 56 1 2 true
20 57 1 2 true
21 5 1 4 false
21 6 0 4 false
21 7 1 0 true
21 8 2 1 true
21 9 2 0 true
21 10 2 1 false
21 11 3 1 false
21 12 2 0 false
21 13 2 0 false
21 14 1 1 false
21 15 1 0 true
21 16 2 1 true
21 17 1 0 true
21 18 2 1 true
21 19 1 1 true
21 20 1 0 true
21 21 1 0 true
21 22 3 1 false
21 23 2 0 false
21 24 1 0 false
21 25 1 0 true
21 26 1 0 true
21 27 1 3 false
21 28 1 0 true
21 29 2 1 false
21 30 1 1 true
21 31 1 3 true
21 32 3 1 false
21 33 1 1 true
21 34 1 3 false
21 35 2 3 false
21 36 1 2 false
21 37 1 2 false
21 38 2 0 false
21 39 1 2 false
21 40 3 0 false
21 41 3 0 true
21 42 3 0 true
21 43 3 0 true
21 44 2 1 false
21 45 3 0 false
21 46 3 0 true
21 47 2 0 false
21 48 2 1 true
21 49 1 1 true
21 50 1 0 false
21 51 1 1 false
21 52 1 0 true
21 53 1 1 false
21 54 1 0 false
21 55 1 0 false
21 56 2 0 false
21 57 1 1 false
21 58 1 0 false
22 4 1 4 false
22 5 0 4 false
22 6 1 0 true
22 7 1 2 false
22 8 1 0 true
22 9 2 0 false
22 10 1 0 true
22 11 3 1 true
22 12 3 1 true
22 13 2 1 true
22 14 3 2 true
22 15 3 2 false
22 16 2 1 false
22 17 2 1 false
22 18 2 1 false
22 19 1 0 true
22 20 2 0 true
22 21 2 1 true
22 22 1 1 true
22 23 1 0 true
22 24 2 1 true
22 25 1 0 true
22 26 2 0 true
22 27 2 0 false
22 28 2 1 false
22 29 3 1 true
22 30 2 2 true
22 31 2 1 true
22 32 2 2 true
22 33 2 1 true
22 34 2 2 false
22 35 1 0 false
22 36 2 1 false
22 37 2 3 false
22 38 1 3 false
22 39 3 0 true
22 40 2 1 true
22 41 2 0 true
22 42 2 0 true
22 43 3 0 false
22 44 2 1 false
22 45 2 0 true
22 46 1 0 false
22 47 1 0 false
22 48 2 2 false
22 49 2 0 false
22 50 2 1 true
22 51 1 1 true
22 52 2 0 true
22 53 1 0 false
22 54 1 0 true
22 55 1 0 true
22 56 1 0 true
22 57 2 0 true
22 58 1 0 false
22 59 1 0 true
22 60 1 1 true
23 4 0 4 false
23 5 1 0 true
23 6 1 2 true
23 7 2 1 true
23 8 1 0 false
23 9 3 1 true
23 10 3 2 true
23 11 3 2 true
23 12 3 1 true
23 13 1 0 true
23 14 2 3 false
23 15 1 0 false
23 16 1 0 true
23 17 2 0 false
23 18 2 0 true
23 19 1 1 true
23 20 1 0 true
23 21 2 0 false
23 22 1 0 false
23 23 2 0 false
23 24 2 0 false
23 25 2 0 false
23 26 2 1 false
23 27 2 1 false
23 28 1 1 true
23 29 2 0 false
23 30 2 1 false
23 31 3 0 false
23 32 2 0 false
23 33 2 0 true
23 34 2 1 true
23 35 2 0 false
23 36 1 0 false
23 37 2 3 false
23 38 3 1 true
23 39 3 0 false
23 40 3 1 true
23 41 3 1 false
23 42 3 1 true
23 43 2 0 true
23 44 2 0 true
23 45 2 0 true
23 46 2 0 false
23 47 2 0 true
23 48 2 2 true
23 49 2 1 true
23 50 1 3 false
23 51 1 0 false
23 52 1 0 true
23 53 1 1 true
23 54 1 2 false
23 55 1 0 false
23 56 1 0 true
23 57 1 0 false
23 58 1 0 true
23 59 1 1 true
23 60 1 0 true
23 61 1 0 true
24 3 1 0 true
24 4 1 1 true
24 5 1 0 true
24 6 1 1 true
24 7 1 1 true
24 8 1 1 true
24 9 1 1 true
24 10 2 2 true
24 11 1 1 true
24 12 1 0 true
24 13 1 1 true
24 14 1 1 true
24 15 1 0 true
24 16 1 0 true
24 17 2 2 true
24 18 2 2 true
24 19 1 0 true
24 20 1 1 true
24 21 1 0 true
24 22 1 0 true
24 23 1 0 true
24 24 2 1 true
24 25 2 0 true
24 26 2 0 true
24 27 2 1 false
24 28 2 1 true
24 29 3 0 true
24 30 2 1 true
24 31 3 1 true
24 32 3 2 true
24 33 3 0 true
24 34 2 1 true
24 35 2 2 true
24 36 2 2 false
24 37 3 0 true
24 38 3 2 true
24 39 3 2 false
24 40 3 2 true
24 41 3 1 true
24 42 2 1 true
24 43 2 1 true
24 44 2 1 true
24 45 3 1 true
24 46 3 1 true
24 47 3 0 true
24 48 2 0 false
24 49 2 0 false
24 50 3 0 true
24 51 2 0 false
24 52 3 0 false
24 53 1 0 true
24 54 2 1 false
24 55 1 3 false
24 56 2 0 false
24 57 1 3 false
24 58 2 3 false
24 59 2 1 false
24 60 1 1 true
24 61 1 1 true
24 62 1 0 false
25 4 0 4 false
25 5 1 2 true
25 6 1 1 true
25 7 1 0 false
25 8 1 0 false
25 9 2 2 false
25 10 2 2 false
25 11 1 0 false
25 12 1 0 false
25 13 2 1 true
25 14 1 1 false
25 15 2 0 true
25 16 1 1 false
25 17 1 2 false
25 18 1 3 false
25 19 2 3 false
25 20 2 3 false
25 21 2 3 false
25 22 1 0 false
25 23 2 0 false
25 24 1 0 true
25 25 2 0 false
25 26 2 1 false
25 27 3 1 true
25 28 2 0 false
25 29 1 0 false
25 30 3 1 false
25 31 3 0 false
25 32 2 0 true
25 33 1 0 false
25 34 2 0 false
25 35 1 0 false
25 36 1 0 false
25 37 2 1 false
25 38 1 2 true
25 39 1 2 true
25 40 2 1 true
25 41 2 1 true
25 42 2 2 true
25 43 2 1 true
25 44 3 1 true
25 45 3 0 true
25 46 2 0 true
25 47 2 1 false
25 48 2 0 true
25 49 2 0 true
25 50 2 1 true
25 51 1 0 false
25 52 2 3 false
25 53 3 3 false
25 54 3 3 false
25 55 2 3 false
25 56 1 3 false
25 57 1 3 false
25 58 2 3 false
25 59 1 3 false
25 60 1 0 false
25 61 1 3 false
25 62 1 3 false
26 5 1 0 false
26 6 1 0 false
26 7 1 0 true
26 8 1 0 true
26 9 1 0 false
26 10 1 1 true
26 11 1 1 true
26 12 1 0 true
26 13 1 3 false
26 14 2 3 false
26 15 1 3 false
26 16 1 3 false
26 17 1 3 false
26 18 2 3 false
26 19 2 3 false
26 20 1 3 false
26 21 2 3 false
26 22 1 1 false
26 23 2 0 true
26 24 3 0 true
26 25 2 0 true
26 26 3 1 false
26 27 2 1 true
26 28 2 1 false
26 29 2 1 true
26 30 1 0 true
26 31 1 0 true
26 32 1 1 false
26 33 1 0 false
26 34 2 0 false
26 35 2 0 false
26 36 2 0 false
26 37 2 0 false
26 38 2 1 false
26 39 2 1 true
26 40 3 1 true
26 41 3 2 true
26 42 2 1 false
26 43 2 1 true
26 44 3 1 true
26 45 3 1 true
26 46 2 2 true
26 47 2 0 true
26 48 2 1 true
26 49 2 1 true
26 50 2 0 true
26 51 2 0 true
26 52 1 0 false
26 53 2 1 false
26 54 1 1 false
26 55 0 4 true
26 56 0 4 false
26 57 1 4 false
26 58 0 4 false
26 59 2 3 false
26 60 2 3 false
26 61 1 3 false
26 62 1 3 false
26 63 2 3 false
27 7 1 0 true
27 8 1 0 false
27 9 1 1 true
27 10 1 1 true
27 11 1 1 true
27 12 1 0 false
27 13 3 3 false
27 14 3 3 false
27 15 2 3 false
27 16 1 3 false
27 17 2 1 false
27 18 2 2 false
27 19 3 3 false
27 20 2 3 false
27 21 2 3 false
27 22 3 3 false
27 23 2 0 true
27 24 1 0 false
27 25 2 0 true
27 26 1 0 false
27 27 2 1 true
27 28 1 2 true
27 29 1 0 false
27 30 1 1 false
27 31 1 1 true
27 32 1 1 true
27 33 1 1 true
27 34 1 1 true
27 35 2 0 false
27 36 2 1 false
27 37 3 1 true
27 38 3 1 false
27 39 3 2 true
27 40 3 1 false
27 41 3 1 true
27 42 3 1 false
27 43 3 1 false
27 44 3 2 false
27 45 3 1 false
27 46 3 1 false
27 47 2 2 false
27 48 1 1 true
27 49 2 1 true
27 50 3 1 true
27 51 2 1 true
27 52 2 1 false
27 53 2 1 true
27 54 1 3 false
27 55 0 4 false
27 56 0 4 false
27 57 1 3 false
27 58 2 3 false
27 59 2 3 false
27 60 1 3 false
27 61 2 3 false
28 8 1 0 true
28 9 1 0 false
28 10 1 0 false
28 11 1 0 false
28 12 1 0 true
28 13 1 0 false
28 14 2 3 false
28 15 2 3 false
28 16 3 3 false
28 17 2 3 false
28 18 2 3 false
28 19 1 3 false
28 20 2 3 false
28 21 2 3 true
28 22 2 0 false
28 23 2 1 false
28 24 2 0 true
28 25 2 1 false
28 26 3 2 true
28 27 3 1 true
28 28 2 1 false
28 29 2 2 true
28 30 2 1 true
28 31 3 1 false
28 32 2 1 false
28 33 2 1 false
28 34 1 2 true
28 35 2 2 true
28 36 3 1 false
28 37 3 1 false
28 38 2 2 true
28 39 2 0 false
28 40 2 1 true
28 41 2 0 false
28 42 2 0 true
28 43 2 2 false
28 44 2 1 false
28 45 2 1 false
28 46 3 1 false
28 47 2 1 false
28 48 2 1 false
28 49 3 1 false
28 50 2 1 false
28 51 2 1 false
28 52 2 1 false
28 53 2 3 false
28 55 2 3 false
28 56 3 1 false
28 57 2 3 false
28 58 1 3 false
28 59 2 3 false
28 60 2 3 false
29 11 1 0 false
29 14 1 1 false
29 15 2 3 false
29 16 1 3 false
29 17 2 3 false
29 18 2 3 false
29 19 1 1 true
29 20 1 3 true
29 21 3 0 true
29 22 3 0 true
29 23 3 0 false
29 24 2 1 false
29 25 2 1 false
29 26 1 1 true
29 27 2 1 true
29 28 3 1 true
29 29 1 2 false
29 30 2 1 false
29 31 2 1 true
29 32 2 1 false
29 33 2 3 false
29 34 1 1 true
29 35 2 1 false
29 36 3 1 true
29 37 3 0 false
29 38 3 0 true
29 39 3 0 true
29 40 1 1 true
29 41 2 0 true
29 42 2 0 false
29 43 2 0 false
29 44 3 1 false
29 45 3 1 false
30 15 2 1 true
30 16 1 3 true
30 17 1 0 true
30 18 2 1 false
30 19 1 1 true
30 20 2 1 false
30 21 2 3 false
30 22 2 1 false
30 23 2 1 true
30 24 2 1 true
30 25 3 1 true
30 26 2 0 false
30 27 1 0 true
30 28 1 2 false
30 29 2 1 false
30 30 3 1 false
30 31 3 1 true
30 32 3 1 false
30 33 2 1 false
30 34 2 1 false
30 35 3 1 false
30 36 2 0 true
30 37 3 0 false
30 38 2 0 true
30 39 2 0 false
30 40 2 0 false
30 41 1 0 true
30 42 1 0 true
30 43 1 0 true
30 44 2 0 true
31 15 1 0 true
31 16 3 0 true
31 17 3 0 true
31 18 2 0 false
31 19 2 1 false
31 20 2 3 true
31 21 2 3 false
31 22 2 3 false
31 23 3 1 false
31 24 3 3 false
31 25 2 1 false
31 26 2 1 true
31 27 2 1 false
31 28 1 1 false
31 29 1 1 false
31 30 1 1 false
31 31 1 1 true
31 32 1 1 false
31 33 2 1 false
31 34 2 1 false
31 35 1 1 true
31 36 1 1 true
31 37 1 3 false
31 38 1 3 false
31 40 1 1 false
31 41 1 3 false
31 42 1 0 false
31 43 2 0 false
31 44 1 3 false
32 19 2 1 false
32 20 2 1 true
32 21 2 1 true
32 22 2 3 false
32 23 3 2 true
32 24 1 3 false
32 25 2 1 false
32 26 2 3 false
32 27 1 1 false
32 28 1 1 false
32 29 1 1 false
32 30 2 2 false
32 31 2 1 false
32 32 1 1 false
32 33 2 1 false
32 34 2 1 false
32 35 2 1 true
32 36 1 0 true
32 37 1 0 true
32 38 1 0 true
32 41 1 3 false
32 42 1 3 false
32 43 1 1 false
33 21 1 0 false
33 22 1 0 false
33 23 1 3 false
33 24 1 3 false
33 25 3 1 false
33 26 3 1 false
33 27 1 1 false
33 28 2 1 false
33 29 1 1 false
33 30 2 1 false
33 31 2 1 false
33 32 2 1 true
33 33 2 1 false
33 34 3 1 false
33 35 1 2 false
33 36 1 3 false
33 37 2 1 false
33 38 1 1 false
34 23 2 1 false
34 24 1 1 false
34 25 1 1 false
34 26 2 1 true
34 27 1 1 false
34 28 1 1 false
34 29 2 3 false
34 30 1 1 false
34 31 1 1 true
34 32 1 1 false
34 33 2 1 false
34 34 1 1 true
34 35 1 1 false
34 36 1 0 true
34 37 2 0 false
34 38 1 3 false
35 24 2 1 false
35 25 2 1 true
35 26 2 1 false
35 27 2 1 true
35 28 1 3 false
35 29 1 3 false
35 30 1 3 true
35 31 1 3 false
35 32 1 3 false
35 33 1 2 false
35 34 1 3 false
35 35 1 1 true
35 36 1 1 true
35 37 1 0 true
36 26 1 1 false
36 27 1 3 false
36 28 1 4 false
36 29 1 4 false
36 30 1 3 false
36 31 2 1 false
36 32 1 3 false
36 33 1 3 false
36 34 1 1 false
36 35 1 1 false
36 36 1 0 true
36 37 2 0 false
37 28 1 3 false
37 29 1 3 false
37 30 1 3 false
37 31 1 4 false
37 32 1 4 false
37 33 1 1 true
37 34 1 0 true
37 35 1 0 false
37 36 2 0 true
37 37 1 0 true
38 29 1 0 false
38 30 1 0 false
38 31 1 4 false
38 32 1 4 false
38 33 1 3 false
38 34 2 0 true
38 35 2 0 false
38 36 2 0 true
38 37 1 0 false
39 26 2 3 false
39 27 3 3 false
39 28 1 0 false
39 29 1 0 false
39 30 2 0 true
39 31 1 1 false
39 32 1 0 false
39 33 1 3 false
39 34 1 0 true
39 35 1 0 true
39 36 1 0 true
39 37 2 1 false
40 23 2 3 false
40 24 2 3 false
40 25 2 3 false
40 26 3 1 false
40 27 3 1 false
40 28 2 1 true
40 29 2 0 false
40 30 2 0 true
40 31 2 2 true
40 32 2 0 true
40 33 1 0 false
40 34 2 0 false
40 35 2 0 false
40 36 2 0 false
40 37 2 1 false
41 21 1 3 false
41 22 2 3 false
41 23 2 3 false
41 24 1 0 false
41 25 1 0 false
41 26 2 1 false
41 27 1 0 false
41 28 2 0 false
41 29 1 1 true
41 30 1 0 false
41 31 1 0 true
41 32 2 0 true
41 33 2 0 true
41 34 0 4 false
41 35 0 4 false
41 36 1 4 false
41 37 0 4 false
42 18 1 3 false
42 19 1 3 false
42 20 1 3 false
42 21 2 3 false
42 22 2 1 false
42 23 2 1 false
42 24 1 0 false
42 25 1 0 true
42 26 1 0 true
42 27 2 1 true
42 28 2 0 true
42 29 2 0 true
42 30 2 0 true
42 31 2 0 true
42 32 2 0 false
42 33 2 0 false
42 34 1 2 true
42 35 0 4 false
42 36 0 4 false
42 37 1 4 false
43 19 0 4 false
43 20 1 3 false
43 21 0 4 false
43 22 1 0 true
43 23 2 0 true
43 24 2 2 false
43 25 2 1 true
43 26 2 0 false
43 27 2 0 true
43 28 2 1 true
43 29 2 1 true
43 30 2 1 true
43 31 1 3 false
43 32 2 0 false
43 33 2 0 true
43 34 1 1 false
43 35 0 4 false
43 36 0 4 false
43 37 2 0 false
44 22 1 0 false
44 23 2 0 true
44 24 3 0 true
44 25 2 0 true
44 26 1 1 true
44 27 2 0 false
44 28 2 0 false
44 29 2 1 true
44 30 2 1 true
44 31 2 1 true
44 32 2 1 true
44 33 2 1 true
44 34 3 1 false
44 35 0 4 false
44 36 0 4 false
45 24 2 0 true
45 25 2 0 true
45 26 1 0 false
45 27 1 0 false
45 28 3 0 false
45 29 2 1 true
45 30 3 2 false
45 31 2 0 false
45 32 3 0 true
45 33 1 3 false
46 27 2 1 false
46 28 2 2 true
46 29 2 0 false
46 30 2 1 true
46 31 2 0 true
46 32 2 2 false
47 29 2 1 false
47 30 2 0 false
47 31 1 0 true
38 28 0 4 false
38 27 0 4 false
39 25 0 4 false
39 24 0 4 false
38 25 0 4 false
38 26 0 4 false
39 23 0 4 false
40 22 0 4 false
40 21 0 4 false
40 20 0 4 false
40 19 0 4 false
40 18 0 4 false
40 17 0 4 false
40 16 0 4 false
41 16 0 4 false
41 17 0 4 false
41 18 0 4 false
41 19 0 4 false
41 20 0 4 false
42 17 0 4 false
42 16 0 4 false
43 16 0 4 false
43 15 0 4 false
43 17 0 4 false
43 18 0 4 false
44 21 0 4 false
39 19 0 4 false
39 18 0 4 false
39 17 0 4 false
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment