[tor-commits] [metrics-web/release] Integrate RelaySearch (Fixes: #25392)

karsten at torproject.org karsten at torproject.org
Wed Sep 26 15:20:35 UTC 2018


commit 32a35f3f95ad0516a26f44170e576d0f9a026fc3
Author: Iain R. Learmonth <irl at fsfe.org>
Date:   Mon Jul 2 10:28:18 2018 +0100

    Integrate RelaySearch (Fixes: #25392)
    
    This is using commit b6e6c3235806c9d1521dbc2c08cecee626466928 of atlas.git.
    
     * Removes submodule for RS.
     * Move two license files to basedirectory; these should be merged.
     * Move atlas.css into css folder
     * Fonts in both were identical
     * Changes all findable paths to the new setting
     * js libs were simply copied; these should be sorted out more
     * Merged rs/img and rs/images folder into images
    
    Thanks to iwakeh for the bulk of the work in this commit.
---
 .gitignore                                         |    5 +
 .gitmodules                                        |    3 -
 LICENCE.flags                                      |   35 +
 LICENSE.relaysearch                                |   23 +
 build.xml                                          |    2 +-
 .../torproject/metrics/web/RelaySearchServlet.java |    2 +-
 src/main/resources/web/css/atlas.css               |  103 ++
 src/main/resources/web/images/atlas.png            |  Bin 0 -> 3261 bytes
 src/main/resources/web/images/atlas.xcf            |  Bin 0 -> 14206 bytes
 src/main/resources/web/images/cc/_abkhazia.png     |  Bin 0 -> 442 bytes
 .../resources/web/images/cc/_basque-country.png    |  Bin 0 -> 445 bytes
 .../web/images/cc/_british-antarctic-territory.png |  Bin 0 -> 493 bytes
 src/main/resources/web/images/cc/_commonwealth.png |  Bin 0 -> 587 bytes
 src/main/resources/web/images/cc/_england.png      |  Bin 0 -> 327 bytes
 src/main/resources/web/images/cc/_gosquared.png    |  Bin 0 -> 444 bytes
 src/main/resources/web/images/cc/_kosovo.png       |  Bin 0 -> 560 bytes
 src/main/resources/web/images/cc/_mars.png         |  Bin 0 -> 417 bytes
 .../resources/web/images/cc/_nagorno-karabakh.png  |  Bin 0 -> 355 bytes
 src/main/resources/web/images/cc/_nato.png         |  Bin 0 -> 353 bytes
 .../resources/web/images/cc/_northern-cyprus.png   |  Bin 0 -> 407 bytes
 src/main/resources/web/images/cc/_olympics.png     |  Bin 0 -> 469 bytes
 src/main/resources/web/images/cc/_red-cross.png    |  Bin 0 -> 315 bytes
 src/main/resources/web/images/cc/_scotland.png     |  Bin 0 -> 472 bytes
 src/main/resources/web/images/cc/_somaliland.png   |  Bin 0 -> 441 bytes
 .../resources/web/images/cc/_south-ossetia.png     |  Bin 0 -> 287 bytes
 .../resources/web/images/cc/_united-nations.png    |  Bin 0 -> 507 bytes
 src/main/resources/web/images/cc/_unknown.png      |  Bin 0 -> 393 bytes
 src/main/resources/web/images/cc/_wales.png        |  Bin 0 -> 577 bytes
 src/main/resources/web/images/cc/ad.png            |  Bin 0 -> 528 bytes
 src/main/resources/web/images/cc/ae.png            |  Bin 0 -> 386 bytes
 src/main/resources/web/images/cc/af.png            |  Bin 0 -> 528 bytes
 src/main/resources/web/images/cc/ag.png            |  Bin 0 -> 410 bytes
 src/main/resources/web/images/cc/ai.png            |  Bin 0 -> 502 bytes
 src/main/resources/web/images/cc/al.png            |  Bin 0 -> 467 bytes
 src/main/resources/web/images/cc/am.png            |  Bin 0 -> 293 bytes
 src/main/resources/web/images/cc/an.png            |  Bin 0 -> 361 bytes
 src/main/resources/web/images/cc/ao.png            |  Bin 0 -> 416 bytes
 src/main/resources/web/images/cc/aq.png            |  Bin 0 -> 516 bytes
 src/main/resources/web/images/cc/ar.png            |  Bin 0 -> 389 bytes
 src/main/resources/web/images/cc/as.png            |  Bin 0 -> 560 bytes
 src/main/resources/web/images/cc/at.png            |  Bin 0 -> 295 bytes
 src/main/resources/web/images/cc/au.png            |  Bin 0 -> 442 bytes
 src/main/resources/web/images/cc/aw.png            |  Bin 0 -> 368 bytes
 src/main/resources/web/images/cc/ax.png            |  Bin 0 -> 362 bytes
 src/main/resources/web/images/cc/az.png            |  Bin 0 -> 437 bytes
 src/main/resources/web/images/cc/ba.png            |  Bin 0 -> 520 bytes
 src/main/resources/web/images/cc/bb.png            |  Bin 0 -> 379 bytes
 src/main/resources/web/images/cc/bd.png            |  Bin 0 -> 420 bytes
 src/main/resources/web/images/cc/be.png            |  Bin 0 -> 413 bytes
 src/main/resources/web/images/cc/bf.png            |  Bin 0 -> 343 bytes
 src/main/resources/web/images/cc/bg.png            |  Bin 0 -> 287 bytes
 src/main/resources/web/images/cc/bh.png            |  Bin 0 -> 449 bytes
 src/main/resources/web/images/cc/bi.png            |  Bin 0 -> 552 bytes
 src/main/resources/web/images/cc/bj.png            |  Bin 0 -> 387 bytes
 src/main/resources/web/images/cc/bl.png            |  Bin 0 -> 578 bytes
 src/main/resources/web/images/cc/bm.png            |  Bin 0 -> 491 bytes
 src/main/resources/web/images/cc/bn.png            |  Bin 0 -> 581 bytes
 src/main/resources/web/images/cc/bo.png            |  Bin 0 -> 418 bytes
 src/main/resources/web/images/cc/br.png            |  Bin 0 -> 529 bytes
 src/main/resources/web/images/cc/bs.png            |  Bin 0 -> 435 bytes
 src/main/resources/web/images/cc/bt.png            |  Bin 0 -> 581 bytes
 src/main/resources/web/images/cc/bv.png            |  Bin 0 -> 512 bytes
 src/main/resources/web/images/cc/bw.png            |  Bin 0 -> 292 bytes
 src/main/resources/web/images/cc/by.png            |  Bin 0 -> 436 bytes
 src/main/resources/web/images/cc/bz.png            |  Bin 0 -> 473 bytes
 src/main/resources/web/images/cc/ca.png            |  Bin 0 -> 389 bytes
 src/main/resources/web/images/cc/cc.png            |  Bin 0 -> 462 bytes
 src/main/resources/web/images/cc/cd.png            |  Bin 0 -> 573 bytes
 src/main/resources/web/images/cc/cf.png            |  Bin 0 -> 358 bytes
 src/main/resources/web/images/cc/cg.png            |  Bin 0 -> 471 bytes
 src/main/resources/web/images/cc/ch.png            |  Bin 0 -> 335 bytes
 src/main/resources/web/images/cc/ci.png            |  Bin 0 -> 421 bytes
 src/main/resources/web/images/cc/ck.png            |  Bin 0 -> 516 bytes
 src/main/resources/web/images/cc/cl.png            |  Bin 0 -> 367 bytes
 src/main/resources/web/images/cc/cm.png            |  Bin 0 -> 464 bytes
 src/main/resources/web/images/cc/cn.png            |  Bin 0 -> 506 bytes
 src/main/resources/web/images/cc/co.png            |  Bin 0 -> 293 bytes
 src/main/resources/web/images/cc/cr.png            |  Bin 0 -> 289 bytes
 src/main/resources/web/images/cc/cs.png            |  Bin 0 -> 439 bytes
 src/main/resources/web/images/cc/ct.png            |  Bin 0 -> 403 bytes
 src/main/resources/web/images/cc/cu.png            |  Bin 0 -> 457 bytes
 src/main/resources/web/images/cc/cv.png            |  Bin 0 -> 333 bytes
 src/main/resources/web/images/cc/cw.png            |  Bin 0 -> 379 bytes
 src/main/resources/web/images/cc/cx.png            |  Bin 0 -> 542 bytes
 src/main/resources/web/images/cc/cy.png            |  Bin 0 -> 499 bytes
 src/main/resources/web/images/cc/cz.png            |  Bin 0 -> 432 bytes
 src/main/resources/web/images/cc/de.png            |  Bin 0 -> 295 bytes
 src/main/resources/web/images/cc/dj.png            |  Bin 0 -> 440 bytes
 src/main/resources/web/images/cc/dk.png            |  Bin 0 -> 326 bytes
 src/main/resources/web/images/cc/dm.png            |  Bin 0 -> 504 bytes
 src/main/resources/web/images/cc/do.png            |  Bin 0 -> 411 bytes
 src/main/resources/web/images/cc/dz.png            |  Bin 0 -> 565 bytes
 src/main/resources/web/images/cc/ec.png            |  Bin 0 -> 421 bytes
 src/main/resources/web/images/cc/ee.png            |  Bin 0 -> 293 bytes
 src/main/resources/web/images/cc/eg.png            |  Bin 0 -> 374 bytes
 src/main/resources/web/images/cc/eh.png            |  Bin 0 -> 473 bytes
 src/main/resources/web/images/cc/er.png            |  Bin 0 -> 552 bytes
 src/main/resources/web/images/cc/es.png            |  Bin 0 -> 417 bytes
 src/main/resources/web/images/cc/et.png            |  Bin 0 -> 495 bytes
 src/main/resources/web/images/cc/eu.png            |  Bin 0 -> 530 bytes
 src/main/resources/web/images/cc/fi.png            |  Bin 0 -> 328 bytes
 src/main/resources/web/images/cc/fj.png            |  Bin 0 -> 516 bytes
 src/main/resources/web/images/cc/fk.png            |  Bin 0 -> 503 bytes
 src/main/resources/web/images/cc/fm.png            |  Bin 0 -> 400 bytes
 src/main/resources/web/images/cc/fo.png            |  Bin 0 -> 354 bytes
 src/main/resources/web/images/cc/fr.png            |  Bin 0 -> 421 bytes
 src/main/resources/web/images/cc/ga.png            |  Bin 0 -> 293 bytes
 src/main/resources/web/images/cc/gb.png            |  Bin 0 -> 542 bytes
 src/main/resources/web/images/cc/gd.png            |  Bin 0 -> 454 bytes
 src/main/resources/web/images/cc/ge.png            |  Bin 0 -> 337 bytes
 src/main/resources/web/images/cc/gf.png            |  Bin 0 -> 545 bytes
 src/main/resources/web/images/cc/gg.png            |  Bin 0 -> 353 bytes
 src/main/resources/web/images/cc/gh.png            |  Bin 0 -> 349 bytes
 src/main/resources/web/images/cc/gi.png            |  Bin 0 -> 381 bytes
 src/main/resources/web/images/cc/gl.png            |  Bin 0 -> 374 bytes
 src/main/resources/web/images/cc/gm.png            |  Bin 0 -> 292 bytes
 src/main/resources/web/images/cc/gn.png            |  Bin 0 -> 417 bytes
 src/main/resources/web/images/cc/gp.png            |  Bin 0 -> 488 bytes
 src/main/resources/web/images/cc/gq.png            |  Bin 0 -> 491 bytes
 src/main/resources/web/images/cc/gr.png            |  Bin 0 -> 361 bytes
 src/main/resources/web/images/cc/gs.png            |  Bin 0 -> 557 bytes
 src/main/resources/web/images/cc/gt.png            |  Bin 0 -> 419 bytes
 src/main/resources/web/images/cc/gu.png            |  Bin 0 -> 390 bytes
 src/main/resources/web/images/cc/gw.png            |  Bin 0 -> 421 bytes
 src/main/resources/web/images/cc/gy.png            |  Bin 0 -> 553 bytes
 src/main/resources/web/images/cc/hk.png            |  Bin 0 -> 542 bytes
 src/main/resources/web/images/cc/hm.png            |  Bin 0 -> 673 bytes
 src/main/resources/web/images/cc/hn.png            |  Bin 0 -> 344 bytes
 src/main/resources/web/images/cc/hr.png            |  Bin 0 -> 519 bytes
 src/main/resources/web/images/cc/ht.png            |  Bin 0 -> 397 bytes
 src/main/resources/web/images/cc/hu.png            |  Bin 0 -> 295 bytes
 src/main/resources/web/images/cc/ic.png            |  Bin 0 -> 469 bytes
 src/main/resources/web/images/cc/id.png            |  Bin 0 -> 293 bytes
 src/main/resources/web/images/cc/ie.png            |  Bin 0 -> 421 bytes
 src/main/resources/web/images/cc/il.png            |  Bin 0 -> 363 bytes
 src/main/resources/web/images/cc/im.png            |  Bin 0 -> 511 bytes
 src/main/resources/web/images/cc/in.png            |  Bin 0 -> 385 bytes
 src/main/resources/web/images/cc/io.png            |  Bin 0 -> 658 bytes
 src/main/resources/web/images/cc/iq.png            |  Bin 0 -> 421 bytes
 src/main/resources/web/images/cc/ir.png            |  Bin 0 -> 480 bytes
 src/main/resources/web/images/cc/is.png            |  Bin 0 -> 360 bytes
 src/main/resources/web/images/cc/it.png            |  Bin 0 -> 421 bytes
 src/main/resources/web/images/cc/je.png            |  Bin 0 -> 516 bytes
 src/main/resources/web/images/cc/jm.png            |  Bin 0 -> 525 bytes
 src/main/resources/web/images/cc/jo.png            |  Bin 0 -> 442 bytes
 src/main/resources/web/images/cc/jp.png            |  Bin 0 -> 341 bytes
 src/main/resources/web/images/cc/ke.png            |  Bin 0 -> 456 bytes
 src/main/resources/web/images/cc/kg.png            |  Bin 0 -> 519 bytes
 src/main/resources/web/images/cc/kh.png            |  Bin 0 -> 422 bytes
 src/main/resources/web/images/cc/ki.png            |  Bin 0 -> 545 bytes
 src/main/resources/web/images/cc/km.png            |  Bin 0 -> 439 bytes
 src/main/resources/web/images/cc/kn.png            |  Bin 0 -> 558 bytes
 src/main/resources/web/images/cc/kp.png            |  Bin 0 -> 375 bytes
 src/main/resources/web/images/cc/kr.png            |  Bin 0 -> 536 bytes
 src/main/resources/web/images/cc/kw.png            |  Bin 0 -> 413 bytes
 src/main/resources/web/images/cc/ky.png            |  Bin 0 -> 513 bytes
 src/main/resources/web/images/cc/kz.png            |  Bin 0 -> 573 bytes
 src/main/resources/web/images/cc/la.png            |  Bin 0 -> 372 bytes
 src/main/resources/web/images/cc/lb.png            |  Bin 0 -> 385 bytes
 src/main/resources/web/images/cc/lc.png            |  Bin 0 -> 366 bytes
 src/main/resources/web/images/cc/li.png            |  Bin 0 -> 406 bytes
 src/main/resources/web/images/cc/lk.png            |  Bin 0 -> 510 bytes
 src/main/resources/web/images/cc/lr.png            |  Bin 0 -> 363 bytes
 src/main/resources/web/images/cc/ls.png            |  Bin 0 -> 378 bytes
 src/main/resources/web/images/cc/lt.png            |  Bin 0 -> 293 bytes
 src/main/resources/web/images/cc/lu.png            |  Bin 0 -> 295 bytes
 src/main/resources/web/images/cc/lv.png            |  Bin 0 -> 296 bytes
 src/main/resources/web/images/cc/ly.png            |  Bin 0 -> 401 bytes
 src/main/resources/web/images/cc/ma.png            |  Bin 0 -> 475 bytes
 src/main/resources/web/images/cc/mc.png            |  Bin 0 -> 293 bytes
 src/main/resources/web/images/cc/md.png            |  Bin 0 -> 492 bytes
 src/main/resources/web/images/cc/me.png            |  Bin 0 -> 461 bytes
 src/main/resources/web/images/cc/mf.png            |  Bin 0 -> 358 bytes
 src/main/resources/web/images/cc/mg.png            |  Bin 0 -> 374 bytes
 src/main/resources/web/images/cc/mh.png            |  Bin 0 -> 535 bytes
 src/main/resources/web/images/cc/mk.png            |  Bin 0 -> 503 bytes
 src/main/resources/web/images/cc/ml.png            |  Bin 0 -> 417 bytes
 src/main/resources/web/images/cc/mm.png            |  Bin 0 -> 367 bytes
 src/main/resources/web/images/cc/mn.png            |  Bin 0 -> 439 bytes
 src/main/resources/web/images/cc/mo.png            |  Bin 0 -> 508 bytes
 src/main/resources/web/images/cc/mp.png            |  Bin 0 -> 606 bytes
 src/main/resources/web/images/cc/mq.png            |  Bin 0 -> 473 bytes
 src/main/resources/web/images/cc/mr.png            |  Bin 0 -> 423 bytes
 src/main/resources/web/images/cc/ms.png            |  Bin 0 -> 509 bytes
 src/main/resources/web/images/cc/mt.png            |  Bin 0 -> 400 bytes
 src/main/resources/web/images/cc/mu.png            |  Bin 0 -> 293 bytes
 src/main/resources/web/images/cc/mv.png            |  Bin 0 -> 390 bytes
 src/main/resources/web/images/cc/mw.png            |  Bin 0 -> 352 bytes
 src/main/resources/web/images/cc/mx.png            |  Bin 0 -> 499 bytes
 src/main/resources/web/images/cc/my.png            |  Bin 0 -> 467 bytes
 src/main/resources/web/images/cc/mz.png            |  Bin 0 -> 461 bytes
 src/main/resources/web/images/cc/na.png            |  Bin 0 -> 578 bytes
 src/main/resources/web/images/cc/nc.png            |  Bin 0 -> 469 bytes
 src/main/resources/web/images/cc/ne.png            |  Bin 0 -> 344 bytes
 src/main/resources/web/images/cc/nf.png            |  Bin 0 -> 458 bytes
 src/main/resources/web/images/cc/ng.png            |  Bin 0 -> 329 bytes
 src/main/resources/web/images/cc/ni.png            |  Bin 0 -> 388 bytes
 src/main/resources/web/images/cc/nl.png            |  Bin 0 -> 295 bytes
 src/main/resources/web/images/cc/no.png            |  Bin 0 -> 360 bytes
 src/main/resources/web/images/cc/np.png            |  Bin 0 -> 657 bytes
 src/main/resources/web/images/cc/nr.png            |  Bin 0 -> 344 bytes
 src/main/resources/web/images/cc/nu.png            |  Bin 0 -> 431 bytes
 src/main/resources/web/images/cc/nz.png            |  Bin 0 -> 422 bytes
 src/main/resources/web/images/cc/om.png            |  Bin 0 -> 411 bytes
 src/main/resources/web/images/cc/pa.png            |  Bin 0 -> 438 bytes
 src/main/resources/web/images/cc/pe.png            |  Bin 0 -> 329 bytes
 src/main/resources/web/images/cc/pf.png            |  Bin 0 -> 389 bytes
 src/main/resources/web/images/cc/pg.png            |  Bin 0 -> 566 bytes
 src/main/resources/web/images/cc/ph.png            |  Bin 0 -> 521 bytes
 src/main/resources/web/images/cc/pk.png            |  Bin 0 -> 556 bytes
 src/main/resources/web/images/cc/pl.png            |  Bin 0 -> 293 bytes
 src/main/resources/web/images/cc/pm.png            |  Bin 0 -> 689 bytes
 src/main/resources/web/images/cc/pn.png            |  Bin 0 -> 529 bytes
 src/main/resources/web/images/cc/pr.png            |  Bin 0 -> 457 bytes
 src/main/resources/web/images/cc/ps.png            |  Bin 0 -> 399 bytes
 src/main/resources/web/images/cc/pt.png            |  Bin 0 -> 518 bytes
 src/main/resources/web/images/cc/pw.png            |  Bin 0 -> 412 bytes
 src/main/resources/web/images/cc/py.png            |  Bin 0 -> 380 bytes
 src/main/resources/web/images/cc/qa.png            |  Bin 0 -> 493 bytes
 src/main/resources/web/images/cc/re.png            |  Bin 0 -> 484 bytes
 src/main/resources/web/images/cc/ro.png            |  Bin 0 -> 417 bytes
 src/main/resources/web/images/cc/rs.png            |  Bin 0 -> 444 bytes
 src/main/resources/web/images/cc/ru.png            |  Bin 0 -> 287 bytes
 src/main/resources/web/images/cc/rw.png            |  Bin 0 -> 387 bytes
 src/main/resources/web/images/cc/sa.png            |  Bin 0 -> 540 bytes
 src/main/resources/web/images/cc/sb.png            |  Bin 0 -> 510 bytes
 src/main/resources/web/images/cc/sc.png            |  Bin 0 -> 525 bytes
 src/main/resources/web/images/cc/sd.png            |  Bin 0 -> 400 bytes
 src/main/resources/web/images/cc/se.png            |  Bin 0 -> 331 bytes
 src/main/resources/web/images/cc/sg.png            |  Bin 0 -> 445 bytes
 src/main/resources/web/images/cc/sh.png            |  Bin 0 -> 509 bytes
 src/main/resources/web/images/cc/si.png            |  Bin 0 -> 347 bytes
 src/main/resources/web/images/cc/sj.png            |  Bin 0 -> 512 bytes
 src/main/resources/web/images/cc/sk.png            |  Bin 0 -> 395 bytes
 src/main/resources/web/images/cc/sl.png            |  Bin 0 -> 295 bytes
 src/main/resources/web/images/cc/sm.png            |  Bin 0 -> 440 bytes
 src/main/resources/web/images/cc/sn.png            |  Bin 0 -> 464 bytes
 src/main/resources/web/images/cc/so.png            |  Bin 0 -> 365 bytes
 src/main/resources/web/images/cc/sr.png            |  Bin 0 -> 340 bytes
 src/main/resources/web/images/cc/ss.png            |  Bin 0 -> 475 bytes
 src/main/resources/web/images/cc/st.png            |  Bin 0 -> 462 bytes
 src/main/resources/web/images/cc/sv.png            |  Bin 0 -> 391 bytes
 src/main/resources/web/images/cc/sx.png            |  Bin 0 -> 589 bytes
 src/main/resources/web/images/cc/sy.png            |  Bin 0 -> 333 bytes
 src/main/resources/web/images/cc/sz.png            |  Bin 0 -> 469 bytes
 src/main/resources/web/images/cc/tc.png            |  Bin 0 -> 491 bytes
 src/main/resources/web/images/cc/td.png            |  Bin 0 -> 417 bytes
 src/main/resources/web/images/cc/tf.png            |  Bin 0 -> 425 bytes
 src/main/resources/web/images/cc/tg.png            |  Bin 0 -> 389 bytes
 src/main/resources/web/images/cc/th.png            |  Bin 0 -> 289 bytes
 src/main/resources/web/images/cc/tj.png            |  Bin 0 -> 388 bytes
 src/main/resources/web/images/cc/tk.png            |  Bin 0 -> 437 bytes
 src/main/resources/web/images/cc/tl.png            |  Bin 0 -> 514 bytes
 src/main/resources/web/images/cc/tm.png            |  Bin 0 -> 580 bytes
 src/main/resources/web/images/cc/tn.png            |  Bin 0 -> 498 bytes
 src/main/resources/web/images/cc/to.png            |  Bin 0 -> 369 bytes
 src/main/resources/web/images/cc/tr.png            |  Bin 0 -> 489 bytes
 src/main/resources/web/images/cc/tt.png            |  Bin 0 -> 544 bytes
 src/main/resources/web/images/cc/tv.png            |  Bin 0 -> 547 bytes
 src/main/resources/web/images/cc/tw.png            |  Bin 0 -> 429 bytes
 src/main/resources/web/images/cc/tz.png            |  Bin 0 -> 572 bytes
 src/main/resources/web/images/cc/ua.png            |  Bin 0 -> 293 bytes
 src/main/resources/web/images/cc/ug.png            |  Bin 0 -> 360 bytes
 src/main/resources/web/images/cc/um.png            |  Bin 0 -> 571 bytes
 src/main/resources/web/images/cc/us.png            |  Bin 0 -> 389 bytes
 src/main/resources/web/images/cc/uy.png            |  Bin 0 -> 405 bytes
 src/main/resources/web/images/cc/uz.png            |  Bin 0 -> 344 bytes
 src/main/resources/web/images/cc/va.png            |  Bin 0 -> 458 bytes
 src/main/resources/web/images/cc/vc.png            |  Bin 0 -> 521 bytes
 src/main/resources/web/images/cc/ve.png            |  Bin 0 -> 438 bytes
 src/main/resources/web/images/cc/vg.png            |  Bin 0 -> 494 bytes
 src/main/resources/web/images/cc/vi.png            |  Bin 0 -> 549 bytes
 src/main/resources/web/images/cc/vn.png            |  Bin 0 -> 368 bytes
 src/main/resources/web/images/cc/vu.png            |  Bin 0 -> 474 bytes
 src/main/resources/web/images/cc/wf.png            |  Bin 0 -> 424 bytes
 src/main/resources/web/images/cc/ws.png            |  Bin 0 -> 453 bytes
 src/main/resources/web/images/cc/xz.png            |  Bin 0 -> 393 bytes
 src/main/resources/web/images/cc/ye.png            |  Bin 0 -> 295 bytes
 src/main/resources/web/images/cc/yt.png            |  Bin 0 -> 538 bytes
 src/main/resources/web/images/cc/za.png            |  Bin 0 -> 486 bytes
 src/main/resources/web/images/cc/zm.png            |  Bin 0 -> 449 bytes
 src/main/resources/web/images/cc/zw.png            |  Bin 0 -> 479 bytes
 src/main/resources/web/images/flags/authority.png  |  Bin 0 -> 325 bytes
 src/main/resources/web/images/flags/badexit.png    |  Bin 0 -> 403 bytes
 src/main/resources/web/images/flags/bridge.png     |  Bin 0 -> 273 bytes
 src/main/resources/web/images/flags/country.png    |  Bin 0 -> 291 bytes
 src/main/resources/web/images/flags/directory.png  |  Bin 0 -> 280 bytes
 src/main/resources/web/images/flags/exit.png       |  Bin 0 -> 345 bytes
 .../resources/web/images/flags/fallbackdir.png     |  Bin 0 -> 458 bytes
 src/main/resources/web/images/flags/fast.png       |  Bin 0 -> 295 bytes
 .../resources/web/images/flags/fingerprint.png     |  Bin 0 -> 455 bytes
 src/main/resources/web/images/flags/guard.png      |  Bin 0 -> 371 bytes
 .../resources/web/images/flags/hibernating.png     |  Bin 0 -> 303 bytes
 src/main/resources/web/images/flags/hsdir.png      |  Bin 0 -> 479 bytes
 src/main/resources/web/images/flags/ipv4.png       |  Bin 0 -> 396 bytes
 src/main/resources/web/images/flags/ipv6.png       |  Bin 0 -> 406 bytes
 src/main/resources/web/images/flags/ipv6exit.png   |  Bin 0 -> 404 bytes
 .../resources/web/images/flags/noedconsensus.png   |  Bin 0 -> 350 bytes
 .../resources/web/images/flags/notrecommended.png  |  Bin 0 -> 381 bytes
 src/main/resources/web/images/flags/onion-alt.png  |  Bin 0 -> 411 bytes
 src/main/resources/web/images/flags/onion.png      |  Bin 0 -> 352 bytes
 .../resources/web/images/flags/reachableipv4.png   |  Bin 0 -> 370 bytes
 .../resources/web/images/flags/reachableipv6.png   |  Bin 0 -> 394 bytes
 src/main/resources/web/images/flags/relay.png      |  Bin 0 -> 357 bytes
 src/main/resources/web/images/flags/running.png    |  Bin 0 -> 244 bytes
 src/main/resources/web/images/flags/stable.png     |  Bin 0 -> 349 bytes
 src/main/resources/web/images/flags/tshirt.png     |  Bin 0 -> 321 bytes
 src/main/resources/web/images/flags/unmeasured.png |  Bin 0 -> 318 bytes
 .../resources/web/images/flags/unreachableipv4.png |  Bin 0 -> 382 bytes
 .../resources/web/images/flags/unreachableipv6.png |  Bin 0 -> 402 bytes
 src/main/resources/web/images/flags/v2dir.png      |  Bin 0 -> 485 bytes
 src/main/resources/web/images/flags/valid.png      |  Bin 0 -> 373 bytes
 .../web/images/glyphicons-halflings-white.png      |  Bin 0 -> 4352 bytes
 .../resources/web/images/glyphicons-halflings.png  |  Bin 0 -> 4352 bytes
 src/main/resources/web/images/noscript.png         |  Bin 0 -> 943 bytes
 src/main/resources/web/js/rs/app.build.js          |   18 +
 src/main/resources/web/js/rs/app.js                |   16 +
 src/main/resources/web/js/rs/boilerplate.js        |   11 +
 .../resources/web/js/rs/collections/aggregates.js  |  137 ++
 .../resources/web/js/rs/collections/results.js     |   90 ++
 src/main/resources/web/js/rs/fallback_dir.js       |   16 +
 src/main/resources/web/js/rs/helpers.js            |  290 ++++
 src/main/resources/web/js/rs/jquery.cookieBar.js   |   86 ++
 .../web/js/rs/libs/backbone/backbone.min.js        |    2 +
 .../web/js/rs/libs/bootstrap/bootstrap.min.js      |    7 +
 .../web/js/rs/libs/d3js/d3-array.v1.min.js         |    2 +
 .../js/rs/libs/d3js/d3-geo-projection.v2.min.js    |    2 +
 .../js/rs/libs/d3js/d3-geo-projection.v2.min.js.1  |    2 +
 .../resources/web/js/rs/libs/d3js/d3-geo.v1.min.js |    2 +
 .../resources/web/js/rs/libs/d3js/d3.v3.min.js     |    4 +
 .../web/js/rs/libs/d3js/topojson.v1.min.js         |    2 +
 .../js/rs/libs/datatables/dataTables.Sorting.js    |  162 ++
 .../js/rs/libs/datatables/dataTables.TorStatus.js  |   53 +
 .../js/rs/libs/datatables/dataTables.bootstrap.js  |  182 +++
 .../js/rs/libs/datatables/jquery.dataTables.min.js |  164 +++
 src/main/resources/web/js/rs/libs/jssha/sha1.js    |   21 +
 .../resources/web/js/rs/libs/require/require.js    |    5 +
 src/main/resources/web/js/rs/libs/require/text.js  |  408 ++++++
 .../web/js/rs/libs/underscore/underscore-min.js    | 1548 ++++++++++++++++++++
 src/main/resources/web/js/rs/main.js               |   42 +
 src/main/resources/web/js/rs/models/aggregate.js   |   26 +
 src/main/resources/web/js/rs/models/graph.js       |  211 +++
 src/main/resources/web/js/rs/models/relay.js       |  291 ++++
 src/main/resources/web/js/rs/router.js             |  299 ++++
 .../resources/web/js/rs/views/aggregate/map.js     |  277 ++++
 .../resources/web/js/rs/views/aggregate/search.js  |   47 +
 src/main/resources/web/js/rs/views/details/main.js |  249 ++++
 src/main/resources/web/js/rs/views/search/do.js    |   62 +
 src/main/resources/web/js/rs/views/search/main.js  |  113 ++
 src/main/resources/web/json/countries.topo.json    |    1 +
 src/main/resources/web/jsps/rs.jsp                 |    4 +-
 src/main/resources/web/rs                          |    1 -
 .../resources/web/templates/rs/aggregate/map.html  |   67 +
 .../web/templates/rs/aggregate/search.html         |  129 ++
 .../resources/web/templates/rs/details/bridge.html |  204 +++
 .../resources/web/templates/rs/details/error.html  |    5 +
 .../resources/web/templates/rs/details/router.html |  307 ++++
 src/main/resources/web/templates/rs/search/do.html |  133 ++
 .../resources/web/templates/rs/search/main.html    |  162 ++
 359 files changed, 6025 insertions(+), 8 deletions(-)

diff --git a/.gitignore b/.gitignore
index b546cef..b97f623 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,8 @@ legacy.config
 # other
 *~
 
+# Ignore git mergetool backup files
+*.orig
+
+# Ignore Vim swap files
+*.swp
diff --git a/.gitmodules b/.gitmodules
index 9cf7b11..99bca1b 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -4,6 +4,3 @@
 [submodule "src/submods/metrics-lib"]
 	path = src/submods/metrics-lib
 	url = https://git.torproject.org/metrics-lib.git
-[submodule "src/main/resources/web/rs"]
-	path = src/main/resources/web/rs
-	url = https://git.torproject.org/atlas.git
diff --git a/LICENCE.flags b/LICENCE.flags
new file mode 100644
index 0000000..95f81c4
--- /dev/null
+++ b/LICENCE.flags
@@ -0,0 +1,35 @@
+These flags are built from the sources at:
+
+ https://github.com/gosquared/flags
+
+To update these flags:
+
+ * apt install pngcrush imagemagick icnsutils rename
+ * git clone https://github.com/gosquared/flags
+ * cd flags; make
+ * cp flags/flags-iso/shiny/16/* $RELAYSEARCH/img/cc/
+ * cd $RELAYSEARCH/img/cc/; rename 'y/A-Z/a-z/' *.png; cp _unknown.png xz.png
+
+The flags are made available under the MIT license:
+
+-----------------------------------------------------------------------
+Copyright (c) 2017 Go Squared Ltd. http://www.gosquared.com/
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+-----------------------------------------------------------------------
diff --git a/LICENSE.relaysearch b/LICENSE.relaysearch
new file mode 100644
index 0000000..a36fe06
--- /dev/null
+++ b/LICENSE.relaysearch
@@ -0,0 +1,23 @@
+Copyright (c) 2012, 2013, Arturo Filastò
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/build.xml b/build.xml
index acf7f51..77ab672 100644
--- a/build.xml
+++ b/build.xml
@@ -182,7 +182,7 @@
                   includes="logback.xml" />
       <zipfileset dir="${resources}/web"
                   prefix=""
-                  includes="css/* images/* js/* fonts/** rs/**" />
+                  includes="css/* images/** js/** fonts/** templates/**" />
       <zipfileset dir="${resources}/web/jsps"
                   prefix="WEB-INF"
                   includes="*.jsp"/>
diff --git a/src/main/java/org/torproject/metrics/web/RelaySearchServlet.java b/src/main/java/org/torproject/metrics/web/RelaySearchServlet.java
index 9a235ce..a9c0dcb 100644
--- a/src/main/java/org/torproject/metrics/web/RelaySearchServlet.java
+++ b/src/main/java/org/torproject/metrics/web/RelaySearchServlet.java
@@ -23,7 +23,7 @@ public class RelaySearchServlet extends AnyServlet {
       HttpServletResponse response) throws IOException, ServletException {
 
     /* Forward the request to the JSP that does all the hard work. */
-    String[] additionalStylesheets = {"/rs/css/atlas.css"};
+    String[] additionalStylesheets = {"/css/atlas.css"};
     request.setAttribute("additionalStylesheets", additionalStylesheets);
     request.setAttribute("categories", this.categories);
     request.getRequestDispatcher("WEB-INF/rs.jsp").forward(request,
diff --git a/src/main/resources/web/css/atlas.css b/src/main/resources/web/css/atlas.css
new file mode 100644
index 0000000..2a2064f
--- /dev/null
+++ b/src/main/resources/web/css/atlas.css
@@ -0,0 +1,103 @@
+.progress {
+    width: 50%;
+    margin: 100px auto;
+    display: none;
+}
+
+.progress-bar {
+    width: 100%;
+}
+
+#secondary-search {
+    display: none;
+}
+
+a.alleged {
+	color: #FE9F30;
+}
+
+.flags {
+    padding: 2px;
+}
+
+span.flags {
+    display: inline-block;
+}
+
+.tooltip-inner {
+    text-align:left;
+}
+
+#outdatedData > div {
+    position:relative;
+    top:60px;
+}
+
+.circle {
+    display: inline-block;
+    vertical-align: middle;
+    background: #999999;
+    width: 10px;
+    height: 10px;
+    -moz-border-radius: 50%;
+    -webkit-border-radius: 50%;
+    border-radius: 50%;
+}
+
+.circle-online {
+    background: #25d918;
+}
+
+.circle-offline {
+    background: #ff1515;
+}
+
+#home-search, #home-aggregate-search, #home-advanced-search, #map-radio-buttons {
+    padding: 0;
+    margin: 0 0 10px 0;
+    width: 100%;
+}
+
+td, th {
+    padding: 2px!important;
+}
+
+.form-control {
+    max-width: none !important;
+}
+
+.flags-cell {
+    width: 150px;
+}
+
+/* Allow displaying long contact info (#23868) */
+dd {
+    -ms-word-break: break-all;
+    word-break: break-all;
+
+    /* Non standard for webkit */
+    word-break: break-word;
+
+    -webkit-hyphens: auto;
+    -moz-hyphens: auto;
+    hyphens: auto;
+}
+
+/* Override style.css from metrics.torproject.org style */
+td a {
+    padding-right: 0 !important;
+}
+
+.day-spinner {
+    width: 120px;
+    display: inline;
+}
+
+label.radio-inline {
+    display: inline !important;
+    width: auto;
+}
+
+#no-svg {
+    display: none;
+}
diff --git a/src/main/resources/web/images/atlas.png b/src/main/resources/web/images/atlas.png
new file mode 100644
index 0000000..b070884
Binary files /dev/null and b/src/main/resources/web/images/atlas.png differ
diff --git a/src/main/resources/web/images/atlas.xcf b/src/main/resources/web/images/atlas.xcf
new file mode 100644
index 0000000..9dd0824
Binary files /dev/null and b/src/main/resources/web/images/atlas.xcf differ
diff --git a/src/main/resources/web/images/cc/_abkhazia.png b/src/main/resources/web/images/cc/_abkhazia.png
new file mode 100644
index 0000000..ad5d130
Binary files /dev/null and b/src/main/resources/web/images/cc/_abkhazia.png differ
diff --git a/src/main/resources/web/images/cc/_basque-country.png b/src/main/resources/web/images/cc/_basque-country.png
new file mode 100644
index 0000000..616a65a
Binary files /dev/null and b/src/main/resources/web/images/cc/_basque-country.png differ
diff --git a/src/main/resources/web/images/cc/_british-antarctic-territory.png b/src/main/resources/web/images/cc/_british-antarctic-territory.png
new file mode 100644
index 0000000..114bcba
Binary files /dev/null and b/src/main/resources/web/images/cc/_british-antarctic-territory.png differ
diff --git a/src/main/resources/web/images/cc/_commonwealth.png b/src/main/resources/web/images/cc/_commonwealth.png
new file mode 100644
index 0000000..2cb8848
Binary files /dev/null and b/src/main/resources/web/images/cc/_commonwealth.png differ
diff --git a/src/main/resources/web/images/cc/_england.png b/src/main/resources/web/images/cc/_england.png
new file mode 100644
index 0000000..87d6ded
Binary files /dev/null and b/src/main/resources/web/images/cc/_england.png differ
diff --git a/src/main/resources/web/images/cc/_gosquared.png b/src/main/resources/web/images/cc/_gosquared.png
new file mode 100644
index 0000000..87fa676
Binary files /dev/null and b/src/main/resources/web/images/cc/_gosquared.png differ
diff --git a/src/main/resources/web/images/cc/_kosovo.png b/src/main/resources/web/images/cc/_kosovo.png
new file mode 100644
index 0000000..e143b3a
Binary files /dev/null and b/src/main/resources/web/images/cc/_kosovo.png differ
diff --git a/src/main/resources/web/images/cc/_mars.png b/src/main/resources/web/images/cc/_mars.png
new file mode 100644
index 0000000..7a472a7
Binary files /dev/null and b/src/main/resources/web/images/cc/_mars.png differ
diff --git a/src/main/resources/web/images/cc/_nagorno-karabakh.png b/src/main/resources/web/images/cc/_nagorno-karabakh.png
new file mode 100644
index 0000000..53d7a93
Binary files /dev/null and b/src/main/resources/web/images/cc/_nagorno-karabakh.png differ
diff --git a/src/main/resources/web/images/cc/_nato.png b/src/main/resources/web/images/cc/_nato.png
new file mode 100644
index 0000000..f52845a
Binary files /dev/null and b/src/main/resources/web/images/cc/_nato.png differ
diff --git a/src/main/resources/web/images/cc/_northern-cyprus.png b/src/main/resources/web/images/cc/_northern-cyprus.png
new file mode 100644
index 0000000..37e5cf6
Binary files /dev/null and b/src/main/resources/web/images/cc/_northern-cyprus.png differ
diff --git a/src/main/resources/web/images/cc/_olympics.png b/src/main/resources/web/images/cc/_olympics.png
new file mode 100644
index 0000000..c4a764c
Binary files /dev/null and b/src/main/resources/web/images/cc/_olympics.png differ
diff --git a/src/main/resources/web/images/cc/_red-cross.png b/src/main/resources/web/images/cc/_red-cross.png
new file mode 100644
index 0000000..c672f88
Binary files /dev/null and b/src/main/resources/web/images/cc/_red-cross.png differ
diff --git a/src/main/resources/web/images/cc/_scotland.png b/src/main/resources/web/images/cc/_scotland.png
new file mode 100644
index 0000000..3cccbb8
Binary files /dev/null and b/src/main/resources/web/images/cc/_scotland.png differ
diff --git a/src/main/resources/web/images/cc/_somaliland.png b/src/main/resources/web/images/cc/_somaliland.png
new file mode 100644
index 0000000..46ce0d5
Binary files /dev/null and b/src/main/resources/web/images/cc/_somaliland.png differ
diff --git a/src/main/resources/web/images/cc/_south-ossetia.png b/src/main/resources/web/images/cc/_south-ossetia.png
new file mode 100644
index 0000000..c076713
Binary files /dev/null and b/src/main/resources/web/images/cc/_south-ossetia.png differ
diff --git a/src/main/resources/web/images/cc/_united-nations.png b/src/main/resources/web/images/cc/_united-nations.png
new file mode 100644
index 0000000..732eef9
Binary files /dev/null and b/src/main/resources/web/images/cc/_united-nations.png differ
diff --git a/src/main/resources/web/images/cc/_unknown.png b/src/main/resources/web/images/cc/_unknown.png
new file mode 100644
index 0000000..44a6fc9
Binary files /dev/null and b/src/main/resources/web/images/cc/_unknown.png differ
diff --git a/src/main/resources/web/images/cc/_wales.png b/src/main/resources/web/images/cc/_wales.png
new file mode 100644
index 0000000..aad4ede
Binary files /dev/null and b/src/main/resources/web/images/cc/_wales.png differ
diff --git a/src/main/resources/web/images/cc/ad.png b/src/main/resources/web/images/cc/ad.png
new file mode 100644
index 0000000..c330f5c
Binary files /dev/null and b/src/main/resources/web/images/cc/ad.png differ
diff --git a/src/main/resources/web/images/cc/ae.png b/src/main/resources/web/images/cc/ae.png
new file mode 100644
index 0000000..351b5c5
Binary files /dev/null and b/src/main/resources/web/images/cc/ae.png differ
diff --git a/src/main/resources/web/images/cc/af.png b/src/main/resources/web/images/cc/af.png
new file mode 100644
index 0000000..1ae8674
Binary files /dev/null and b/src/main/resources/web/images/cc/af.png differ
diff --git a/src/main/resources/web/images/cc/ag.png b/src/main/resources/web/images/cc/ag.png
new file mode 100644
index 0000000..0f22d74
Binary files /dev/null and b/src/main/resources/web/images/cc/ag.png differ
diff --git a/src/main/resources/web/images/cc/ai.png b/src/main/resources/web/images/cc/ai.png
new file mode 100644
index 0000000..3a45b36
Binary files /dev/null and b/src/main/resources/web/images/cc/ai.png differ
diff --git a/src/main/resources/web/images/cc/al.png b/src/main/resources/web/images/cc/al.png
new file mode 100644
index 0000000..49d01e8
Binary files /dev/null and b/src/main/resources/web/images/cc/al.png differ
diff --git a/src/main/resources/web/images/cc/am.png b/src/main/resources/web/images/cc/am.png
new file mode 100644
index 0000000..6255e2e
Binary files /dev/null and b/src/main/resources/web/images/cc/am.png differ
diff --git a/src/main/resources/web/images/cc/an.png b/src/main/resources/web/images/cc/an.png
new file mode 100644
index 0000000..0fc1c3b
Binary files /dev/null and b/src/main/resources/web/images/cc/an.png differ
diff --git a/src/main/resources/web/images/cc/ao.png b/src/main/resources/web/images/cc/ao.png
new file mode 100644
index 0000000..f98f37b
Binary files /dev/null and b/src/main/resources/web/images/cc/ao.png differ
diff --git a/src/main/resources/web/images/cc/aq.png b/src/main/resources/web/images/cc/aq.png
new file mode 100644
index 0000000..a502638
Binary files /dev/null and b/src/main/resources/web/images/cc/aq.png differ
diff --git a/src/main/resources/web/images/cc/ar.png b/src/main/resources/web/images/cc/ar.png
new file mode 100644
index 0000000..e1fa97b
Binary files /dev/null and b/src/main/resources/web/images/cc/ar.png differ
diff --git a/src/main/resources/web/images/cc/as.png b/src/main/resources/web/images/cc/as.png
new file mode 100644
index 0000000..6b79481
Binary files /dev/null and b/src/main/resources/web/images/cc/as.png differ
diff --git a/src/main/resources/web/images/cc/at.png b/src/main/resources/web/images/cc/at.png
new file mode 100644
index 0000000..794bd2f
Binary files /dev/null and b/src/main/resources/web/images/cc/at.png differ
diff --git a/src/main/resources/web/images/cc/au.png b/src/main/resources/web/images/cc/au.png
new file mode 100644
index 0000000..11f4d1c
Binary files /dev/null and b/src/main/resources/web/images/cc/au.png differ
diff --git a/src/main/resources/web/images/cc/aw.png b/src/main/resources/web/images/cc/aw.png
new file mode 100644
index 0000000..98e7300
Binary files /dev/null and b/src/main/resources/web/images/cc/aw.png differ
diff --git a/src/main/resources/web/images/cc/ax.png b/src/main/resources/web/images/cc/ax.png
new file mode 100644
index 0000000..19312e9
Binary files /dev/null and b/src/main/resources/web/images/cc/ax.png differ
diff --git a/src/main/resources/web/images/cc/az.png b/src/main/resources/web/images/cc/az.png
new file mode 100644
index 0000000..9e2c6ba
Binary files /dev/null and b/src/main/resources/web/images/cc/az.png differ
diff --git a/src/main/resources/web/images/cc/ba.png b/src/main/resources/web/images/cc/ba.png
new file mode 100644
index 0000000..24b609d
Binary files /dev/null and b/src/main/resources/web/images/cc/ba.png differ
diff --git a/src/main/resources/web/images/cc/bb.png b/src/main/resources/web/images/cc/bb.png
new file mode 100644
index 0000000..d69f58d
Binary files /dev/null and b/src/main/resources/web/images/cc/bb.png differ
diff --git a/src/main/resources/web/images/cc/bd.png b/src/main/resources/web/images/cc/bd.png
new file mode 100644
index 0000000..266eff8
Binary files /dev/null and b/src/main/resources/web/images/cc/bd.png differ
diff --git a/src/main/resources/web/images/cc/be.png b/src/main/resources/web/images/cc/be.png
new file mode 100644
index 0000000..e3ea806
Binary files /dev/null and b/src/main/resources/web/images/cc/be.png differ
diff --git a/src/main/resources/web/images/cc/bf.png b/src/main/resources/web/images/cc/bf.png
new file mode 100644
index 0000000..20c6c2e
Binary files /dev/null and b/src/main/resources/web/images/cc/bf.png differ
diff --git a/src/main/resources/web/images/cc/bg.png b/src/main/resources/web/images/cc/bg.png
new file mode 100644
index 0000000..775550c
Binary files /dev/null and b/src/main/resources/web/images/cc/bg.png differ
diff --git a/src/main/resources/web/images/cc/bh.png b/src/main/resources/web/images/cc/bh.png
new file mode 100644
index 0000000..b3eb851
Binary files /dev/null and b/src/main/resources/web/images/cc/bh.png differ
diff --git a/src/main/resources/web/images/cc/bi.png b/src/main/resources/web/images/cc/bi.png
new file mode 100644
index 0000000..394a829
Binary files /dev/null and b/src/main/resources/web/images/cc/bi.png differ
diff --git a/src/main/resources/web/images/cc/bj.png b/src/main/resources/web/images/cc/bj.png
new file mode 100644
index 0000000..d8842e3
Binary files /dev/null and b/src/main/resources/web/images/cc/bj.png differ
diff --git a/src/main/resources/web/images/cc/bl.png b/src/main/resources/web/images/cc/bl.png
new file mode 100644
index 0000000..67a69ec
Binary files /dev/null and b/src/main/resources/web/images/cc/bl.png differ
diff --git a/src/main/resources/web/images/cc/bm.png b/src/main/resources/web/images/cc/bm.png
new file mode 100644
index 0000000..132e990
Binary files /dev/null and b/src/main/resources/web/images/cc/bm.png differ
diff --git a/src/main/resources/web/images/cc/bn.png b/src/main/resources/web/images/cc/bn.png
new file mode 100644
index 0000000..62882e8
Binary files /dev/null and b/src/main/resources/web/images/cc/bn.png differ
diff --git a/src/main/resources/web/images/cc/bo.png b/src/main/resources/web/images/cc/bo.png
new file mode 100644
index 0000000..7f4186b
Binary files /dev/null and b/src/main/resources/web/images/cc/bo.png differ
diff --git a/src/main/resources/web/images/cc/br.png b/src/main/resources/web/images/cc/br.png
new file mode 100644
index 0000000..6bb4378
Binary files /dev/null and b/src/main/resources/web/images/cc/br.png differ
diff --git a/src/main/resources/web/images/cc/bs.png b/src/main/resources/web/images/cc/bs.png
new file mode 100644
index 0000000..6a08b9d
Binary files /dev/null and b/src/main/resources/web/images/cc/bs.png differ
diff --git a/src/main/resources/web/images/cc/bt.png b/src/main/resources/web/images/cc/bt.png
new file mode 100644
index 0000000..fe1df29
Binary files /dev/null and b/src/main/resources/web/images/cc/bt.png differ
diff --git a/src/main/resources/web/images/cc/bv.png b/src/main/resources/web/images/cc/bv.png
new file mode 100644
index 0000000..160b6b5
Binary files /dev/null and b/src/main/resources/web/images/cc/bv.png differ
diff --git a/src/main/resources/web/images/cc/bw.png b/src/main/resources/web/images/cc/bw.png
new file mode 100644
index 0000000..b4a502b
Binary files /dev/null and b/src/main/resources/web/images/cc/bw.png differ
diff --git a/src/main/resources/web/images/cc/by.png b/src/main/resources/web/images/cc/by.png
new file mode 100644
index 0000000..55b61e8
Binary files /dev/null and b/src/main/resources/web/images/cc/by.png differ
diff --git a/src/main/resources/web/images/cc/bz.png b/src/main/resources/web/images/cc/bz.png
new file mode 100644
index 0000000..fd97f8a
Binary files /dev/null and b/src/main/resources/web/images/cc/bz.png differ
diff --git a/src/main/resources/web/images/cc/ca.png b/src/main/resources/web/images/cc/ca.png
new file mode 100644
index 0000000..06671e7
Binary files /dev/null and b/src/main/resources/web/images/cc/ca.png differ
diff --git a/src/main/resources/web/images/cc/cc.png b/src/main/resources/web/images/cc/cc.png
new file mode 100644
index 0000000..c10a918
Binary files /dev/null and b/src/main/resources/web/images/cc/cc.png differ
diff --git a/src/main/resources/web/images/cc/cd.png b/src/main/resources/web/images/cc/cd.png
new file mode 100644
index 0000000..724caf2
Binary files /dev/null and b/src/main/resources/web/images/cc/cd.png differ
diff --git a/src/main/resources/web/images/cc/cf.png b/src/main/resources/web/images/cc/cf.png
new file mode 100644
index 0000000..32cb360
Binary files /dev/null and b/src/main/resources/web/images/cc/cf.png differ
diff --git a/src/main/resources/web/images/cc/cg.png b/src/main/resources/web/images/cc/cg.png
new file mode 100644
index 0000000..7a1bc57
Binary files /dev/null and b/src/main/resources/web/images/cc/cg.png differ
diff --git a/src/main/resources/web/images/cc/ch.png b/src/main/resources/web/images/cc/ch.png
new file mode 100644
index 0000000..de304f3
Binary files /dev/null and b/src/main/resources/web/images/cc/ch.png differ
diff --git a/src/main/resources/web/images/cc/ci.png b/src/main/resources/web/images/cc/ci.png
new file mode 100644
index 0000000..47251d3
Binary files /dev/null and b/src/main/resources/web/images/cc/ci.png differ
diff --git a/src/main/resources/web/images/cc/ck.png b/src/main/resources/web/images/cc/ck.png
new file mode 100644
index 0000000..d74d1f4
Binary files /dev/null and b/src/main/resources/web/images/cc/ck.png differ
diff --git a/src/main/resources/web/images/cc/cl.png b/src/main/resources/web/images/cc/cl.png
new file mode 100644
index 0000000..57bf33e
Binary files /dev/null and b/src/main/resources/web/images/cc/cl.png differ
diff --git a/src/main/resources/web/images/cc/cm.png b/src/main/resources/web/images/cc/cm.png
new file mode 100644
index 0000000..1d13837
Binary files /dev/null and b/src/main/resources/web/images/cc/cm.png differ
diff --git a/src/main/resources/web/images/cc/cn.png b/src/main/resources/web/images/cc/cn.png
new file mode 100644
index 0000000..5ac1e13
Binary files /dev/null and b/src/main/resources/web/images/cc/cn.png differ
diff --git a/src/main/resources/web/images/cc/co.png b/src/main/resources/web/images/cc/co.png
new file mode 100644
index 0000000..85db6f6
Binary files /dev/null and b/src/main/resources/web/images/cc/co.png differ
diff --git a/src/main/resources/web/images/cc/cr.png b/src/main/resources/web/images/cc/cr.png
new file mode 100644
index 0000000..17eeb62
Binary files /dev/null and b/src/main/resources/web/images/cc/cr.png differ
diff --git a/src/main/resources/web/images/cc/cs.png b/src/main/resources/web/images/cc/cs.png
new file mode 100644
index 0000000..8254790
Binary files /dev/null and b/src/main/resources/web/images/cc/cs.png differ
diff --git a/src/main/resources/web/images/cc/ct.png b/src/main/resources/web/images/cc/ct.png
new file mode 100644
index 0000000..1e8b74b
Binary files /dev/null and b/src/main/resources/web/images/cc/ct.png differ
diff --git a/src/main/resources/web/images/cc/cu.png b/src/main/resources/web/images/cc/cu.png
new file mode 100644
index 0000000..cd80f6d
Binary files /dev/null and b/src/main/resources/web/images/cc/cu.png differ
diff --git a/src/main/resources/web/images/cc/cv.png b/src/main/resources/web/images/cc/cv.png
new file mode 100644
index 0000000..4fac2a3
Binary files /dev/null and b/src/main/resources/web/images/cc/cv.png differ
diff --git a/src/main/resources/web/images/cc/cw.png b/src/main/resources/web/images/cc/cw.png
new file mode 100644
index 0000000..340cee8
Binary files /dev/null and b/src/main/resources/web/images/cc/cw.png differ
diff --git a/src/main/resources/web/images/cc/cx.png b/src/main/resources/web/images/cc/cx.png
new file mode 100644
index 0000000..79452bb
Binary files /dev/null and b/src/main/resources/web/images/cc/cx.png differ
diff --git a/src/main/resources/web/images/cc/cy.png b/src/main/resources/web/images/cc/cy.png
new file mode 100644
index 0000000..664cd5c
Binary files /dev/null and b/src/main/resources/web/images/cc/cy.png differ
diff --git a/src/main/resources/web/images/cc/cz.png b/src/main/resources/web/images/cc/cz.png
new file mode 100644
index 0000000..196f74e
Binary files /dev/null and b/src/main/resources/web/images/cc/cz.png differ
diff --git a/src/main/resources/web/images/cc/de.png b/src/main/resources/web/images/cc/de.png
new file mode 100644
index 0000000..8458c23
Binary files /dev/null and b/src/main/resources/web/images/cc/de.png differ
diff --git a/src/main/resources/web/images/cc/dj.png b/src/main/resources/web/images/cc/dj.png
new file mode 100644
index 0000000..78660a1
Binary files /dev/null and b/src/main/resources/web/images/cc/dj.png differ
diff --git a/src/main/resources/web/images/cc/dk.png b/src/main/resources/web/images/cc/dk.png
new file mode 100644
index 0000000..a81768c
Binary files /dev/null and b/src/main/resources/web/images/cc/dk.png differ
diff --git a/src/main/resources/web/images/cc/dm.png b/src/main/resources/web/images/cc/dm.png
new file mode 100644
index 0000000..a9d8f89
Binary files /dev/null and b/src/main/resources/web/images/cc/dm.png differ
diff --git a/src/main/resources/web/images/cc/do.png b/src/main/resources/web/images/cc/do.png
new file mode 100644
index 0000000..4b2c207
Binary files /dev/null and b/src/main/resources/web/images/cc/do.png differ
diff --git a/src/main/resources/web/images/cc/dz.png b/src/main/resources/web/images/cc/dz.png
new file mode 100644
index 0000000..705dbba
Binary files /dev/null and b/src/main/resources/web/images/cc/dz.png differ
diff --git a/src/main/resources/web/images/cc/ec.png b/src/main/resources/web/images/cc/ec.png
new file mode 100644
index 0000000..234cf8c
Binary files /dev/null and b/src/main/resources/web/images/cc/ec.png differ
diff --git a/src/main/resources/web/images/cc/ee.png b/src/main/resources/web/images/cc/ee.png
new file mode 100644
index 0000000..c8f3721
Binary files /dev/null and b/src/main/resources/web/images/cc/ee.png differ
diff --git a/src/main/resources/web/images/cc/eg.png b/src/main/resources/web/images/cc/eg.png
new file mode 100644
index 0000000..96c93ed
Binary files /dev/null and b/src/main/resources/web/images/cc/eg.png differ
diff --git a/src/main/resources/web/images/cc/eh.png b/src/main/resources/web/images/cc/eh.png
new file mode 100644
index 0000000..621dc79
Binary files /dev/null and b/src/main/resources/web/images/cc/eh.png differ
diff --git a/src/main/resources/web/images/cc/er.png b/src/main/resources/web/images/cc/er.png
new file mode 100644
index 0000000..3530096
Binary files /dev/null and b/src/main/resources/web/images/cc/er.png differ
diff --git a/src/main/resources/web/images/cc/es.png b/src/main/resources/web/images/cc/es.png
new file mode 100644
index 0000000..c915d36
Binary files /dev/null and b/src/main/resources/web/images/cc/es.png differ
diff --git a/src/main/resources/web/images/cc/et.png b/src/main/resources/web/images/cc/et.png
new file mode 100644
index 0000000..f743e64
Binary files /dev/null and b/src/main/resources/web/images/cc/et.png differ
diff --git a/src/main/resources/web/images/cc/eu.png b/src/main/resources/web/images/cc/eu.png
new file mode 100644
index 0000000..70378d6
Binary files /dev/null and b/src/main/resources/web/images/cc/eu.png differ
diff --git a/src/main/resources/web/images/cc/fi.png b/src/main/resources/web/images/cc/fi.png
new file mode 100644
index 0000000..627ad2e
Binary files /dev/null and b/src/main/resources/web/images/cc/fi.png differ
diff --git a/src/main/resources/web/images/cc/fj.png b/src/main/resources/web/images/cc/fj.png
new file mode 100644
index 0000000..a90ae00
Binary files /dev/null and b/src/main/resources/web/images/cc/fj.png differ
diff --git a/src/main/resources/web/images/cc/fk.png b/src/main/resources/web/images/cc/fk.png
new file mode 100644
index 0000000..da821cc
Binary files /dev/null and b/src/main/resources/web/images/cc/fk.png differ
diff --git a/src/main/resources/web/images/cc/fm.png b/src/main/resources/web/images/cc/fm.png
new file mode 100644
index 0000000..5d73677
Binary files /dev/null and b/src/main/resources/web/images/cc/fm.png differ
diff --git a/src/main/resources/web/images/cc/fo.png b/src/main/resources/web/images/cc/fo.png
new file mode 100644
index 0000000..4264083
Binary files /dev/null and b/src/main/resources/web/images/cc/fo.png differ
diff --git a/src/main/resources/web/images/cc/fr.png b/src/main/resources/web/images/cc/fr.png
new file mode 100644
index 0000000..a76cb1a
Binary files /dev/null and b/src/main/resources/web/images/cc/fr.png differ
diff --git a/src/main/resources/web/images/cc/ga.png b/src/main/resources/web/images/cc/ga.png
new file mode 100644
index 0000000..3e8abf1
Binary files /dev/null and b/src/main/resources/web/images/cc/ga.png differ
diff --git a/src/main/resources/web/images/cc/gb.png b/src/main/resources/web/images/cc/gb.png
new file mode 100644
index 0000000..99a3cc3
Binary files /dev/null and b/src/main/resources/web/images/cc/gb.png differ
diff --git a/src/main/resources/web/images/cc/gd.png b/src/main/resources/web/images/cc/gd.png
new file mode 100644
index 0000000..e07a669
Binary files /dev/null and b/src/main/resources/web/images/cc/gd.png differ
diff --git a/src/main/resources/web/images/cc/ge.png b/src/main/resources/web/images/cc/ge.png
new file mode 100644
index 0000000..086967e
Binary files /dev/null and b/src/main/resources/web/images/cc/ge.png differ
diff --git a/src/main/resources/web/images/cc/gf.png b/src/main/resources/web/images/cc/gf.png
new file mode 100644
index 0000000..8332c4e
Binary files /dev/null and b/src/main/resources/web/images/cc/gf.png differ
diff --git a/src/main/resources/web/images/cc/gg.png b/src/main/resources/web/images/cc/gg.png
new file mode 100644
index 0000000..f2c1b71
Binary files /dev/null and b/src/main/resources/web/images/cc/gg.png differ
diff --git a/src/main/resources/web/images/cc/gh.png b/src/main/resources/web/images/cc/gh.png
new file mode 100644
index 0000000..b07163d
Binary files /dev/null and b/src/main/resources/web/images/cc/gh.png differ
diff --git a/src/main/resources/web/images/cc/gi.png b/src/main/resources/web/images/cc/gi.png
new file mode 100644
index 0000000..7a79f3e
Binary files /dev/null and b/src/main/resources/web/images/cc/gi.png differ
diff --git a/src/main/resources/web/images/cc/gl.png b/src/main/resources/web/images/cc/gl.png
new file mode 100644
index 0000000..a2ed3e9
Binary files /dev/null and b/src/main/resources/web/images/cc/gl.png differ
diff --git a/src/main/resources/web/images/cc/gm.png b/src/main/resources/web/images/cc/gm.png
new file mode 100644
index 0000000..b056657
Binary files /dev/null and b/src/main/resources/web/images/cc/gm.png differ
diff --git a/src/main/resources/web/images/cc/gn.png b/src/main/resources/web/images/cc/gn.png
new file mode 100644
index 0000000..243d8f0
Binary files /dev/null and b/src/main/resources/web/images/cc/gn.png differ
diff --git a/src/main/resources/web/images/cc/gp.png b/src/main/resources/web/images/cc/gp.png
new file mode 100644
index 0000000..dbb086d
Binary files /dev/null and b/src/main/resources/web/images/cc/gp.png differ
diff --git a/src/main/resources/web/images/cc/gq.png b/src/main/resources/web/images/cc/gq.png
new file mode 100644
index 0000000..9168ef2
Binary files /dev/null and b/src/main/resources/web/images/cc/gq.png differ
diff --git a/src/main/resources/web/images/cc/gr.png b/src/main/resources/web/images/cc/gr.png
new file mode 100644
index 0000000..9321a1e
Binary files /dev/null and b/src/main/resources/web/images/cc/gr.png differ
diff --git a/src/main/resources/web/images/cc/gs.png b/src/main/resources/web/images/cc/gs.png
new file mode 100644
index 0000000..fbd3fd7
Binary files /dev/null and b/src/main/resources/web/images/cc/gs.png differ
diff --git a/src/main/resources/web/images/cc/gt.png b/src/main/resources/web/images/cc/gt.png
new file mode 100644
index 0000000..dacd490
Binary files /dev/null and b/src/main/resources/web/images/cc/gt.png differ
diff --git a/src/main/resources/web/images/cc/gu.png b/src/main/resources/web/images/cc/gu.png
new file mode 100644
index 0000000..b0ac67b
Binary files /dev/null and b/src/main/resources/web/images/cc/gu.png differ
diff --git a/src/main/resources/web/images/cc/gw.png b/src/main/resources/web/images/cc/gw.png
new file mode 100644
index 0000000..c1e5415
Binary files /dev/null and b/src/main/resources/web/images/cc/gw.png differ
diff --git a/src/main/resources/web/images/cc/gy.png b/src/main/resources/web/images/cc/gy.png
new file mode 100644
index 0000000..63d5148
Binary files /dev/null and b/src/main/resources/web/images/cc/gy.png differ
diff --git a/src/main/resources/web/images/cc/hk.png b/src/main/resources/web/images/cc/hk.png
new file mode 100644
index 0000000..a4cf92c
Binary files /dev/null and b/src/main/resources/web/images/cc/hk.png differ
diff --git a/src/main/resources/web/images/cc/hm.png b/src/main/resources/web/images/cc/hm.png
new file mode 100644
index 0000000..a01389a
Binary files /dev/null and b/src/main/resources/web/images/cc/hm.png differ
diff --git a/src/main/resources/web/images/cc/hn.png b/src/main/resources/web/images/cc/hn.png
new file mode 100644
index 0000000..51f6eae
Binary files /dev/null and b/src/main/resources/web/images/cc/hn.png differ
diff --git a/src/main/resources/web/images/cc/hr.png b/src/main/resources/web/images/cc/hr.png
new file mode 100644
index 0000000..6e86e8d
Binary files /dev/null and b/src/main/resources/web/images/cc/hr.png differ
diff --git a/src/main/resources/web/images/cc/ht.png b/src/main/resources/web/images/cc/ht.png
new file mode 100644
index 0000000..3522053
Binary files /dev/null and b/src/main/resources/web/images/cc/ht.png differ
diff --git a/src/main/resources/web/images/cc/hu.png b/src/main/resources/web/images/cc/hu.png
new file mode 100644
index 0000000..ae5c6c9
Binary files /dev/null and b/src/main/resources/web/images/cc/hu.png differ
diff --git a/src/main/resources/web/images/cc/ic.png b/src/main/resources/web/images/cc/ic.png
new file mode 100644
index 0000000..c1d8d46
Binary files /dev/null and b/src/main/resources/web/images/cc/ic.png differ
diff --git a/src/main/resources/web/images/cc/id.png b/src/main/resources/web/images/cc/id.png
new file mode 100644
index 0000000..0640473
Binary files /dev/null and b/src/main/resources/web/images/cc/id.png differ
diff --git a/src/main/resources/web/images/cc/ie.png b/src/main/resources/web/images/cc/ie.png
new file mode 100644
index 0000000..c970d38
Binary files /dev/null and b/src/main/resources/web/images/cc/ie.png differ
diff --git a/src/main/resources/web/images/cc/il.png b/src/main/resources/web/images/cc/il.png
new file mode 100644
index 0000000..2f58f14
Binary files /dev/null and b/src/main/resources/web/images/cc/il.png differ
diff --git a/src/main/resources/web/images/cc/im.png b/src/main/resources/web/images/cc/im.png
new file mode 100644
index 0000000..c4a6b6a
Binary files /dev/null and b/src/main/resources/web/images/cc/im.png differ
diff --git a/src/main/resources/web/images/cc/in.png b/src/main/resources/web/images/cc/in.png
new file mode 100644
index 0000000..109281e
Binary files /dev/null and b/src/main/resources/web/images/cc/in.png differ
diff --git a/src/main/resources/web/images/cc/io.png b/src/main/resources/web/images/cc/io.png
new file mode 100644
index 0000000..3e74b6a
Binary files /dev/null and b/src/main/resources/web/images/cc/io.png differ
diff --git a/src/main/resources/web/images/cc/iq.png b/src/main/resources/web/images/cc/iq.png
new file mode 100644
index 0000000..f352c63
Binary files /dev/null and b/src/main/resources/web/images/cc/iq.png differ
diff --git a/src/main/resources/web/images/cc/ir.png b/src/main/resources/web/images/cc/ir.png
new file mode 100644
index 0000000..6fcdfa3
Binary files /dev/null and b/src/main/resources/web/images/cc/ir.png differ
diff --git a/src/main/resources/web/images/cc/is.png b/src/main/resources/web/images/cc/is.png
new file mode 100644
index 0000000..d535f7f
Binary files /dev/null and b/src/main/resources/web/images/cc/is.png differ
diff --git a/src/main/resources/web/images/cc/it.png b/src/main/resources/web/images/cc/it.png
new file mode 100644
index 0000000..a45445a
Binary files /dev/null and b/src/main/resources/web/images/cc/it.png differ
diff --git a/src/main/resources/web/images/cc/je.png b/src/main/resources/web/images/cc/je.png
new file mode 100644
index 0000000..2e04508
Binary files /dev/null and b/src/main/resources/web/images/cc/je.png differ
diff --git a/src/main/resources/web/images/cc/jm.png b/src/main/resources/web/images/cc/jm.png
new file mode 100644
index 0000000..6d93858
Binary files /dev/null and b/src/main/resources/web/images/cc/jm.png differ
diff --git a/src/main/resources/web/images/cc/jo.png b/src/main/resources/web/images/cc/jo.png
new file mode 100644
index 0000000..8e11b7b
Binary files /dev/null and b/src/main/resources/web/images/cc/jo.png differ
diff --git a/src/main/resources/web/images/cc/jp.png b/src/main/resources/web/images/cc/jp.png
new file mode 100644
index 0000000..a742140
Binary files /dev/null and b/src/main/resources/web/images/cc/jp.png differ
diff --git a/src/main/resources/web/images/cc/ke.png b/src/main/resources/web/images/cc/ke.png
new file mode 100644
index 0000000..e1ac097
Binary files /dev/null and b/src/main/resources/web/images/cc/ke.png differ
diff --git a/src/main/resources/web/images/cc/kg.png b/src/main/resources/web/images/cc/kg.png
new file mode 100644
index 0000000..70f5d3b
Binary files /dev/null and b/src/main/resources/web/images/cc/kg.png differ
diff --git a/src/main/resources/web/images/cc/kh.png b/src/main/resources/web/images/cc/kh.png
new file mode 100644
index 0000000..4690096
Binary files /dev/null and b/src/main/resources/web/images/cc/kh.png differ
diff --git a/src/main/resources/web/images/cc/ki.png b/src/main/resources/web/images/cc/ki.png
new file mode 100644
index 0000000..df235ed
Binary files /dev/null and b/src/main/resources/web/images/cc/ki.png differ
diff --git a/src/main/resources/web/images/cc/km.png b/src/main/resources/web/images/cc/km.png
new file mode 100644
index 0000000..310d53a
Binary files /dev/null and b/src/main/resources/web/images/cc/km.png differ
diff --git a/src/main/resources/web/images/cc/kn.png b/src/main/resources/web/images/cc/kn.png
new file mode 100644
index 0000000..bb3efe4
Binary files /dev/null and b/src/main/resources/web/images/cc/kn.png differ
diff --git a/src/main/resources/web/images/cc/kp.png b/src/main/resources/web/images/cc/kp.png
new file mode 100644
index 0000000..9716adc
Binary files /dev/null and b/src/main/resources/web/images/cc/kp.png differ
diff --git a/src/main/resources/web/images/cc/kr.png b/src/main/resources/web/images/cc/kr.png
new file mode 100644
index 0000000..f055313
Binary files /dev/null and b/src/main/resources/web/images/cc/kr.png differ
diff --git a/src/main/resources/web/images/cc/kw.png b/src/main/resources/web/images/cc/kw.png
new file mode 100644
index 0000000..af0191c
Binary files /dev/null and b/src/main/resources/web/images/cc/kw.png differ
diff --git a/src/main/resources/web/images/cc/ky.png b/src/main/resources/web/images/cc/ky.png
new file mode 100644
index 0000000..c787eb0
Binary files /dev/null and b/src/main/resources/web/images/cc/ky.png differ
diff --git a/src/main/resources/web/images/cc/kz.png b/src/main/resources/web/images/cc/kz.png
new file mode 100644
index 0000000..061b7c4
Binary files /dev/null and b/src/main/resources/web/images/cc/kz.png differ
diff --git a/src/main/resources/web/images/cc/la.png b/src/main/resources/web/images/cc/la.png
new file mode 100644
index 0000000..d68c937
Binary files /dev/null and b/src/main/resources/web/images/cc/la.png differ
diff --git a/src/main/resources/web/images/cc/lb.png b/src/main/resources/web/images/cc/lb.png
new file mode 100644
index 0000000..627a3aa
Binary files /dev/null and b/src/main/resources/web/images/cc/lb.png differ
diff --git a/src/main/resources/web/images/cc/lc.png b/src/main/resources/web/images/cc/lc.png
new file mode 100644
index 0000000..672aea9
Binary files /dev/null and b/src/main/resources/web/images/cc/lc.png differ
diff --git a/src/main/resources/web/images/cc/li.png b/src/main/resources/web/images/cc/li.png
new file mode 100644
index 0000000..f71507f
Binary files /dev/null and b/src/main/resources/web/images/cc/li.png differ
diff --git a/src/main/resources/web/images/cc/lk.png b/src/main/resources/web/images/cc/lk.png
new file mode 100644
index 0000000..61887d2
Binary files /dev/null and b/src/main/resources/web/images/cc/lk.png differ
diff --git a/src/main/resources/web/images/cc/lr.png b/src/main/resources/web/images/cc/lr.png
new file mode 100644
index 0000000..4918491
Binary files /dev/null and b/src/main/resources/web/images/cc/lr.png differ
diff --git a/src/main/resources/web/images/cc/ls.png b/src/main/resources/web/images/cc/ls.png
new file mode 100644
index 0000000..c8a5493
Binary files /dev/null and b/src/main/resources/web/images/cc/ls.png differ
diff --git a/src/main/resources/web/images/cc/lt.png b/src/main/resources/web/images/cc/lt.png
new file mode 100644
index 0000000..51513de
Binary files /dev/null and b/src/main/resources/web/images/cc/lt.png differ
diff --git a/src/main/resources/web/images/cc/lu.png b/src/main/resources/web/images/cc/lu.png
new file mode 100644
index 0000000..59b08cc
Binary files /dev/null and b/src/main/resources/web/images/cc/lu.png differ
diff --git a/src/main/resources/web/images/cc/lv.png b/src/main/resources/web/images/cc/lv.png
new file mode 100644
index 0000000..c31180d
Binary files /dev/null and b/src/main/resources/web/images/cc/lv.png differ
diff --git a/src/main/resources/web/images/cc/ly.png b/src/main/resources/web/images/cc/ly.png
new file mode 100644
index 0000000..8804e5a
Binary files /dev/null and b/src/main/resources/web/images/cc/ly.png differ
diff --git a/src/main/resources/web/images/cc/ma.png b/src/main/resources/web/images/cc/ma.png
new file mode 100644
index 0000000..2012156
Binary files /dev/null and b/src/main/resources/web/images/cc/ma.png differ
diff --git a/src/main/resources/web/images/cc/mc.png b/src/main/resources/web/images/cc/mc.png
new file mode 100644
index 0000000..0640473
Binary files /dev/null and b/src/main/resources/web/images/cc/mc.png differ
diff --git a/src/main/resources/web/images/cc/md.png b/src/main/resources/web/images/cc/md.png
new file mode 100644
index 0000000..01353a3
Binary files /dev/null and b/src/main/resources/web/images/cc/md.png differ
diff --git a/src/main/resources/web/images/cc/me.png b/src/main/resources/web/images/cc/me.png
new file mode 100644
index 0000000..9e275ec
Binary files /dev/null and b/src/main/resources/web/images/cc/me.png differ
diff --git a/src/main/resources/web/images/cc/mf.png b/src/main/resources/web/images/cc/mf.png
new file mode 100644
index 0000000..4aafb1f
Binary files /dev/null and b/src/main/resources/web/images/cc/mf.png differ
diff --git a/src/main/resources/web/images/cc/mg.png b/src/main/resources/web/images/cc/mg.png
new file mode 100644
index 0000000..c55a2f4
Binary files /dev/null and b/src/main/resources/web/images/cc/mg.png differ
diff --git a/src/main/resources/web/images/cc/mh.png b/src/main/resources/web/images/cc/mh.png
new file mode 100644
index 0000000..ed647dc
Binary files /dev/null and b/src/main/resources/web/images/cc/mh.png differ
diff --git a/src/main/resources/web/images/cc/mk.png b/src/main/resources/web/images/cc/mk.png
new file mode 100644
index 0000000..b8d15b8
Binary files /dev/null and b/src/main/resources/web/images/cc/mk.png differ
diff --git a/src/main/resources/web/images/cc/ml.png b/src/main/resources/web/images/cc/ml.png
new file mode 100644
index 0000000..40b696d
Binary files /dev/null and b/src/main/resources/web/images/cc/ml.png differ
diff --git a/src/main/resources/web/images/cc/mm.png b/src/main/resources/web/images/cc/mm.png
new file mode 100644
index 0000000..547b1d0
Binary files /dev/null and b/src/main/resources/web/images/cc/mm.png differ
diff --git a/src/main/resources/web/images/cc/mn.png b/src/main/resources/web/images/cc/mn.png
new file mode 100644
index 0000000..9c56174
Binary files /dev/null and b/src/main/resources/web/images/cc/mn.png differ
diff --git a/src/main/resources/web/images/cc/mo.png b/src/main/resources/web/images/cc/mo.png
new file mode 100644
index 0000000..108c88c
Binary files /dev/null and b/src/main/resources/web/images/cc/mo.png differ
diff --git a/src/main/resources/web/images/cc/mp.png b/src/main/resources/web/images/cc/mp.png
new file mode 100644
index 0000000..0a80d84
Binary files /dev/null and b/src/main/resources/web/images/cc/mp.png differ
diff --git a/src/main/resources/web/images/cc/mq.png b/src/main/resources/web/images/cc/mq.png
new file mode 100644
index 0000000..5d78e64
Binary files /dev/null and b/src/main/resources/web/images/cc/mq.png differ
diff --git a/src/main/resources/web/images/cc/mr.png b/src/main/resources/web/images/cc/mr.png
new file mode 100644
index 0000000..1b4b7f4
Binary files /dev/null and b/src/main/resources/web/images/cc/mr.png differ
diff --git a/src/main/resources/web/images/cc/ms.png b/src/main/resources/web/images/cc/ms.png
new file mode 100644
index 0000000..1689556
Binary files /dev/null and b/src/main/resources/web/images/cc/ms.png differ
diff --git a/src/main/resources/web/images/cc/mt.png b/src/main/resources/web/images/cc/mt.png
new file mode 100644
index 0000000..e77d8b2
Binary files /dev/null and b/src/main/resources/web/images/cc/mt.png differ
diff --git a/src/main/resources/web/images/cc/mu.png b/src/main/resources/web/images/cc/mu.png
new file mode 100644
index 0000000..c5352f3
Binary files /dev/null and b/src/main/resources/web/images/cc/mu.png differ
diff --git a/src/main/resources/web/images/cc/mv.png b/src/main/resources/web/images/cc/mv.png
new file mode 100644
index 0000000..94d63cf
Binary files /dev/null and b/src/main/resources/web/images/cc/mv.png differ
diff --git a/src/main/resources/web/images/cc/mw.png b/src/main/resources/web/images/cc/mw.png
new file mode 100644
index 0000000..838b135
Binary files /dev/null and b/src/main/resources/web/images/cc/mw.png differ
diff --git a/src/main/resources/web/images/cc/mx.png b/src/main/resources/web/images/cc/mx.png
new file mode 100644
index 0000000..d05b37a
Binary files /dev/null and b/src/main/resources/web/images/cc/mx.png differ
diff --git a/src/main/resources/web/images/cc/my.png b/src/main/resources/web/images/cc/my.png
new file mode 100644
index 0000000..bea68c4
Binary files /dev/null and b/src/main/resources/web/images/cc/my.png differ
diff --git a/src/main/resources/web/images/cc/mz.png b/src/main/resources/web/images/cc/mz.png
new file mode 100644
index 0000000..a919a16
Binary files /dev/null and b/src/main/resources/web/images/cc/mz.png differ
diff --git a/src/main/resources/web/images/cc/na.png b/src/main/resources/web/images/cc/na.png
new file mode 100644
index 0000000..9a584c3
Binary files /dev/null and b/src/main/resources/web/images/cc/na.png differ
diff --git a/src/main/resources/web/images/cc/nc.png b/src/main/resources/web/images/cc/nc.png
new file mode 100644
index 0000000..ad88c0c
Binary files /dev/null and b/src/main/resources/web/images/cc/nc.png differ
diff --git a/src/main/resources/web/images/cc/ne.png b/src/main/resources/web/images/cc/ne.png
new file mode 100644
index 0000000..258b692
Binary files /dev/null and b/src/main/resources/web/images/cc/ne.png differ
diff --git a/src/main/resources/web/images/cc/nf.png b/src/main/resources/web/images/cc/nf.png
new file mode 100644
index 0000000..33df782
Binary files /dev/null and b/src/main/resources/web/images/cc/nf.png differ
diff --git a/src/main/resources/web/images/cc/ng.png b/src/main/resources/web/images/cc/ng.png
new file mode 100644
index 0000000..4265810
Binary files /dev/null and b/src/main/resources/web/images/cc/ng.png differ
diff --git a/src/main/resources/web/images/cc/ni.png b/src/main/resources/web/images/cc/ni.png
new file mode 100644
index 0000000..6699ec0
Binary files /dev/null and b/src/main/resources/web/images/cc/ni.png differ
diff --git a/src/main/resources/web/images/cc/nl.png b/src/main/resources/web/images/cc/nl.png
new file mode 100644
index 0000000..e1ede53
Binary files /dev/null and b/src/main/resources/web/images/cc/nl.png differ
diff --git a/src/main/resources/web/images/cc/no.png b/src/main/resources/web/images/cc/no.png
new file mode 100644
index 0000000..9f79424
Binary files /dev/null and b/src/main/resources/web/images/cc/no.png differ
diff --git a/src/main/resources/web/images/cc/np.png b/src/main/resources/web/images/cc/np.png
new file mode 100644
index 0000000..23c3c6d
Binary files /dev/null and b/src/main/resources/web/images/cc/np.png differ
diff --git a/src/main/resources/web/images/cc/nr.png b/src/main/resources/web/images/cc/nr.png
new file mode 100644
index 0000000..008629e
Binary files /dev/null and b/src/main/resources/web/images/cc/nr.png differ
diff --git a/src/main/resources/web/images/cc/nu.png b/src/main/resources/web/images/cc/nu.png
new file mode 100644
index 0000000..354a67c
Binary files /dev/null and b/src/main/resources/web/images/cc/nu.png differ
diff --git a/src/main/resources/web/images/cc/nz.png b/src/main/resources/web/images/cc/nz.png
new file mode 100644
index 0000000..c44ca79
Binary files /dev/null and b/src/main/resources/web/images/cc/nz.png differ
diff --git a/src/main/resources/web/images/cc/om.png b/src/main/resources/web/images/cc/om.png
new file mode 100644
index 0000000..0e12bf9
Binary files /dev/null and b/src/main/resources/web/images/cc/om.png differ
diff --git a/src/main/resources/web/images/cc/pa.png b/src/main/resources/web/images/cc/pa.png
new file mode 100644
index 0000000..87f2a4b
Binary files /dev/null and b/src/main/resources/web/images/cc/pa.png differ
diff --git a/src/main/resources/web/images/cc/pe.png b/src/main/resources/web/images/cc/pe.png
new file mode 100644
index 0000000..792a9ce
Binary files /dev/null and b/src/main/resources/web/images/cc/pe.png differ
diff --git a/src/main/resources/web/images/cc/pf.png b/src/main/resources/web/images/cc/pf.png
new file mode 100644
index 0000000..5f9a5a5
Binary files /dev/null and b/src/main/resources/web/images/cc/pf.png differ
diff --git a/src/main/resources/web/images/cc/pg.png b/src/main/resources/web/images/cc/pg.png
new file mode 100644
index 0000000..8fb2eb6
Binary files /dev/null and b/src/main/resources/web/images/cc/pg.png differ
diff --git a/src/main/resources/web/images/cc/ph.png b/src/main/resources/web/images/cc/ph.png
new file mode 100644
index 0000000..fd9d8fb
Binary files /dev/null and b/src/main/resources/web/images/cc/ph.png differ
diff --git a/src/main/resources/web/images/cc/pk.png b/src/main/resources/web/images/cc/pk.png
new file mode 100644
index 0000000..819eea2
Binary files /dev/null and b/src/main/resources/web/images/cc/pk.png differ
diff --git a/src/main/resources/web/images/cc/pl.png b/src/main/resources/web/images/cc/pl.png
new file mode 100644
index 0000000..c3855d3
Binary files /dev/null and b/src/main/resources/web/images/cc/pl.png differ
diff --git a/src/main/resources/web/images/cc/pm.png b/src/main/resources/web/images/cc/pm.png
new file mode 100644
index 0000000..ba91d2c
Binary files /dev/null and b/src/main/resources/web/images/cc/pm.png differ
diff --git a/src/main/resources/web/images/cc/pn.png b/src/main/resources/web/images/cc/pn.png
new file mode 100644
index 0000000..18b8e38
Binary files /dev/null and b/src/main/resources/web/images/cc/pn.png differ
diff --git a/src/main/resources/web/images/cc/pr.png b/src/main/resources/web/images/cc/pr.png
new file mode 100644
index 0000000..bac124c
Binary files /dev/null and b/src/main/resources/web/images/cc/pr.png differ
diff --git a/src/main/resources/web/images/cc/ps.png b/src/main/resources/web/images/cc/ps.png
new file mode 100644
index 0000000..7145cbe
Binary files /dev/null and b/src/main/resources/web/images/cc/ps.png differ
diff --git a/src/main/resources/web/images/cc/pt.png b/src/main/resources/web/images/cc/pt.png
new file mode 100644
index 0000000..009ccc5
Binary files /dev/null and b/src/main/resources/web/images/cc/pt.png differ
diff --git a/src/main/resources/web/images/cc/pw.png b/src/main/resources/web/images/cc/pw.png
new file mode 100644
index 0000000..2fd3f7b
Binary files /dev/null and b/src/main/resources/web/images/cc/pw.png differ
diff --git a/src/main/resources/web/images/cc/py.png b/src/main/resources/web/images/cc/py.png
new file mode 100644
index 0000000..ab391d7
Binary files /dev/null and b/src/main/resources/web/images/cc/py.png differ
diff --git a/src/main/resources/web/images/cc/qa.png b/src/main/resources/web/images/cc/qa.png
new file mode 100644
index 0000000..995f281
Binary files /dev/null and b/src/main/resources/web/images/cc/qa.png differ
diff --git a/src/main/resources/web/images/cc/re.png b/src/main/resources/web/images/cc/re.png
new file mode 100644
index 0000000..a7ca8d0
Binary files /dev/null and b/src/main/resources/web/images/cc/re.png differ
diff --git a/src/main/resources/web/images/cc/ro.png b/src/main/resources/web/images/cc/ro.png
new file mode 100644
index 0000000..1f7d7e4
Binary files /dev/null and b/src/main/resources/web/images/cc/ro.png differ
diff --git a/src/main/resources/web/images/cc/rs.png b/src/main/resources/web/images/cc/rs.png
new file mode 100644
index 0000000..95b00cc
Binary files /dev/null and b/src/main/resources/web/images/cc/rs.png differ
diff --git a/src/main/resources/web/images/cc/ru.png b/src/main/resources/web/images/cc/ru.png
new file mode 100644
index 0000000..0d74832
Binary files /dev/null and b/src/main/resources/web/images/cc/ru.png differ
diff --git a/src/main/resources/web/images/cc/rw.png b/src/main/resources/web/images/cc/rw.png
new file mode 100644
index 0000000..d1ac663
Binary files /dev/null and b/src/main/resources/web/images/cc/rw.png differ
diff --git a/src/main/resources/web/images/cc/sa.png b/src/main/resources/web/images/cc/sa.png
new file mode 100644
index 0000000..9e91d7f
Binary files /dev/null and b/src/main/resources/web/images/cc/sa.png differ
diff --git a/src/main/resources/web/images/cc/sb.png b/src/main/resources/web/images/cc/sb.png
new file mode 100644
index 0000000..94a9ee2
Binary files /dev/null and b/src/main/resources/web/images/cc/sb.png differ
diff --git a/src/main/resources/web/images/cc/sc.png b/src/main/resources/web/images/cc/sc.png
new file mode 100644
index 0000000..0ff3930
Binary files /dev/null and b/src/main/resources/web/images/cc/sc.png differ
diff --git a/src/main/resources/web/images/cc/sd.png b/src/main/resources/web/images/cc/sd.png
new file mode 100644
index 0000000..41aa35e
Binary files /dev/null and b/src/main/resources/web/images/cc/sd.png differ
diff --git a/src/main/resources/web/images/cc/se.png b/src/main/resources/web/images/cc/se.png
new file mode 100644
index 0000000..803b87b
Binary files /dev/null and b/src/main/resources/web/images/cc/se.png differ
diff --git a/src/main/resources/web/images/cc/sg.png b/src/main/resources/web/images/cc/sg.png
new file mode 100644
index 0000000..24256ff
Binary files /dev/null and b/src/main/resources/web/images/cc/sg.png differ
diff --git a/src/main/resources/web/images/cc/sh.png b/src/main/resources/web/images/cc/sh.png
new file mode 100644
index 0000000..020b335
Binary files /dev/null and b/src/main/resources/web/images/cc/sh.png differ
diff --git a/src/main/resources/web/images/cc/si.png b/src/main/resources/web/images/cc/si.png
new file mode 100644
index 0000000..5b257f2
Binary files /dev/null and b/src/main/resources/web/images/cc/si.png differ
diff --git a/src/main/resources/web/images/cc/sj.png b/src/main/resources/web/images/cc/sj.png
new file mode 100644
index 0000000..160b6b5
Binary files /dev/null and b/src/main/resources/web/images/cc/sj.png differ
diff --git a/src/main/resources/web/images/cc/sk.png b/src/main/resources/web/images/cc/sk.png
new file mode 100644
index 0000000..f82cf6a
Binary files /dev/null and b/src/main/resources/web/images/cc/sk.png differ
diff --git a/src/main/resources/web/images/cc/sl.png b/src/main/resources/web/images/cc/sl.png
new file mode 100644
index 0000000..23695b3
Binary files /dev/null and b/src/main/resources/web/images/cc/sl.png differ
diff --git a/src/main/resources/web/images/cc/sm.png b/src/main/resources/web/images/cc/sm.png
new file mode 100644
index 0000000..64e5428
Binary files /dev/null and b/src/main/resources/web/images/cc/sm.png differ
diff --git a/src/main/resources/web/images/cc/sn.png b/src/main/resources/web/images/cc/sn.png
new file mode 100644
index 0000000..77a5d1d
Binary files /dev/null and b/src/main/resources/web/images/cc/sn.png differ
diff --git a/src/main/resources/web/images/cc/so.png b/src/main/resources/web/images/cc/so.png
new file mode 100644
index 0000000..021f6ca
Binary files /dev/null and b/src/main/resources/web/images/cc/so.png differ
diff --git a/src/main/resources/web/images/cc/sr.png b/src/main/resources/web/images/cc/sr.png
new file mode 100644
index 0000000..2b114de
Binary files /dev/null and b/src/main/resources/web/images/cc/sr.png differ
diff --git a/src/main/resources/web/images/cc/ss.png b/src/main/resources/web/images/cc/ss.png
new file mode 100644
index 0000000..8c6616c
Binary files /dev/null and b/src/main/resources/web/images/cc/ss.png differ
diff --git a/src/main/resources/web/images/cc/st.png b/src/main/resources/web/images/cc/st.png
new file mode 100644
index 0000000..7cb3ffa
Binary files /dev/null and b/src/main/resources/web/images/cc/st.png differ
diff --git a/src/main/resources/web/images/cc/sv.png b/src/main/resources/web/images/cc/sv.png
new file mode 100644
index 0000000..c595d57
Binary files /dev/null and b/src/main/resources/web/images/cc/sv.png differ
diff --git a/src/main/resources/web/images/cc/sx.png b/src/main/resources/web/images/cc/sx.png
new file mode 100644
index 0000000..0f0b589
Binary files /dev/null and b/src/main/resources/web/images/cc/sx.png differ
diff --git a/src/main/resources/web/images/cc/sy.png b/src/main/resources/web/images/cc/sy.png
new file mode 100644
index 0000000..7a0e97c
Binary files /dev/null and b/src/main/resources/web/images/cc/sy.png differ
diff --git a/src/main/resources/web/images/cc/sz.png b/src/main/resources/web/images/cc/sz.png
new file mode 100644
index 0000000..f3ce6c9
Binary files /dev/null and b/src/main/resources/web/images/cc/sz.png differ
diff --git a/src/main/resources/web/images/cc/tc.png b/src/main/resources/web/images/cc/tc.png
new file mode 100644
index 0000000..5edc6e9
Binary files /dev/null and b/src/main/resources/web/images/cc/tc.png differ
diff --git a/src/main/resources/web/images/cc/td.png b/src/main/resources/web/images/cc/td.png
new file mode 100644
index 0000000..2bbc6cb
Binary files /dev/null and b/src/main/resources/web/images/cc/td.png differ
diff --git a/src/main/resources/web/images/cc/tf.png b/src/main/resources/web/images/cc/tf.png
new file mode 100644
index 0000000..ff14546
Binary files /dev/null and b/src/main/resources/web/images/cc/tf.png differ
diff --git a/src/main/resources/web/images/cc/tg.png b/src/main/resources/web/images/cc/tg.png
new file mode 100644
index 0000000..7779981
Binary files /dev/null and b/src/main/resources/web/images/cc/tg.png differ
diff --git a/src/main/resources/web/images/cc/th.png b/src/main/resources/web/images/cc/th.png
new file mode 100644
index 0000000..485709a
Binary files /dev/null and b/src/main/resources/web/images/cc/th.png differ
diff --git a/src/main/resources/web/images/cc/tj.png b/src/main/resources/web/images/cc/tj.png
new file mode 100644
index 0000000..ab2805e
Binary files /dev/null and b/src/main/resources/web/images/cc/tj.png differ
diff --git a/src/main/resources/web/images/cc/tk.png b/src/main/resources/web/images/cc/tk.png
new file mode 100644
index 0000000..8761ab1
Binary files /dev/null and b/src/main/resources/web/images/cc/tk.png differ
diff --git a/src/main/resources/web/images/cc/tl.png b/src/main/resources/web/images/cc/tl.png
new file mode 100644
index 0000000..cde8db6
Binary files /dev/null and b/src/main/resources/web/images/cc/tl.png differ
diff --git a/src/main/resources/web/images/cc/tm.png b/src/main/resources/web/images/cc/tm.png
new file mode 100644
index 0000000..3200f49
Binary files /dev/null and b/src/main/resources/web/images/cc/tm.png differ
diff --git a/src/main/resources/web/images/cc/tn.png b/src/main/resources/web/images/cc/tn.png
new file mode 100644
index 0000000..fd2b160
Binary files /dev/null and b/src/main/resources/web/images/cc/tn.png differ
diff --git a/src/main/resources/web/images/cc/to.png b/src/main/resources/web/images/cc/to.png
new file mode 100644
index 0000000..ea666d2
Binary files /dev/null and b/src/main/resources/web/images/cc/to.png differ
diff --git a/src/main/resources/web/images/cc/tr.png b/src/main/resources/web/images/cc/tr.png
new file mode 100644
index 0000000..f605875
Binary files /dev/null and b/src/main/resources/web/images/cc/tr.png differ
diff --git a/src/main/resources/web/images/cc/tt.png b/src/main/resources/web/images/cc/tt.png
new file mode 100644
index 0000000..7f3a033
Binary files /dev/null and b/src/main/resources/web/images/cc/tt.png differ
diff --git a/src/main/resources/web/images/cc/tv.png b/src/main/resources/web/images/cc/tv.png
new file mode 100644
index 0000000..5228a55
Binary files /dev/null and b/src/main/resources/web/images/cc/tv.png differ
diff --git a/src/main/resources/web/images/cc/tw.png b/src/main/resources/web/images/cc/tw.png
new file mode 100644
index 0000000..b0602f3
Binary files /dev/null and b/src/main/resources/web/images/cc/tw.png differ
diff --git a/src/main/resources/web/images/cc/tz.png b/src/main/resources/web/images/cc/tz.png
new file mode 100644
index 0000000..b3ed426
Binary files /dev/null and b/src/main/resources/web/images/cc/tz.png differ
diff --git a/src/main/resources/web/images/cc/ua.png b/src/main/resources/web/images/cc/ua.png
new file mode 100644
index 0000000..5c920e3
Binary files /dev/null and b/src/main/resources/web/images/cc/ua.png differ
diff --git a/src/main/resources/web/images/cc/ug.png b/src/main/resources/web/images/cc/ug.png
new file mode 100644
index 0000000..7b99c10
Binary files /dev/null and b/src/main/resources/web/images/cc/ug.png differ
diff --git a/src/main/resources/web/images/cc/um.png b/src/main/resources/web/images/cc/um.png
new file mode 100644
index 0000000..c1dd965
Binary files /dev/null and b/src/main/resources/web/images/cc/um.png differ
diff --git a/src/main/resources/web/images/cc/us.png b/src/main/resources/web/images/cc/us.png
new file mode 100644
index 0000000..5706b57
Binary files /dev/null and b/src/main/resources/web/images/cc/us.png differ
diff --git a/src/main/resources/web/images/cc/uy.png b/src/main/resources/web/images/cc/uy.png
new file mode 100644
index 0000000..bc2a97d
Binary files /dev/null and b/src/main/resources/web/images/cc/uy.png differ
diff --git a/src/main/resources/web/images/cc/uz.png b/src/main/resources/web/images/cc/uz.png
new file mode 100644
index 0000000..b88e27e
Binary files /dev/null and b/src/main/resources/web/images/cc/uz.png differ
diff --git a/src/main/resources/web/images/cc/va.png b/src/main/resources/web/images/cc/va.png
new file mode 100644
index 0000000..da76146
Binary files /dev/null and b/src/main/resources/web/images/cc/va.png differ
diff --git a/src/main/resources/web/images/cc/vc.png b/src/main/resources/web/images/cc/vc.png
new file mode 100644
index 0000000..da26903
Binary files /dev/null and b/src/main/resources/web/images/cc/vc.png differ
diff --git a/src/main/resources/web/images/cc/ve.png b/src/main/resources/web/images/cc/ve.png
new file mode 100644
index 0000000..904c7ee
Binary files /dev/null and b/src/main/resources/web/images/cc/ve.png differ
diff --git a/src/main/resources/web/images/cc/vg.png b/src/main/resources/web/images/cc/vg.png
new file mode 100644
index 0000000..d337635
Binary files /dev/null and b/src/main/resources/web/images/cc/vg.png differ
diff --git a/src/main/resources/web/images/cc/vi.png b/src/main/resources/web/images/cc/vi.png
new file mode 100644
index 0000000..5fa3126
Binary files /dev/null and b/src/main/resources/web/images/cc/vi.png differ
diff --git a/src/main/resources/web/images/cc/vn.png b/src/main/resources/web/images/cc/vn.png
new file mode 100644
index 0000000..bffadb2
Binary files /dev/null and b/src/main/resources/web/images/cc/vn.png differ
diff --git a/src/main/resources/web/images/cc/vu.png b/src/main/resources/web/images/cc/vu.png
new file mode 100644
index 0000000..41ac003
Binary files /dev/null and b/src/main/resources/web/images/cc/vu.png differ
diff --git a/src/main/resources/web/images/cc/wf.png b/src/main/resources/web/images/cc/wf.png
new file mode 100644
index 0000000..79bf057
Binary files /dev/null and b/src/main/resources/web/images/cc/wf.png differ
diff --git a/src/main/resources/web/images/cc/ws.png b/src/main/resources/web/images/cc/ws.png
new file mode 100644
index 0000000..d0bdf9b
Binary files /dev/null and b/src/main/resources/web/images/cc/ws.png differ
diff --git a/src/main/resources/web/images/cc/xz.png b/src/main/resources/web/images/cc/xz.png
new file mode 100644
index 0000000..44a6fc9
Binary files /dev/null and b/src/main/resources/web/images/cc/xz.png differ
diff --git a/src/main/resources/web/images/cc/ye.png b/src/main/resources/web/images/cc/ye.png
new file mode 100644
index 0000000..19a9e90
Binary files /dev/null and b/src/main/resources/web/images/cc/ye.png differ
diff --git a/src/main/resources/web/images/cc/yt.png b/src/main/resources/web/images/cc/yt.png
new file mode 100644
index 0000000..3665c0e
Binary files /dev/null and b/src/main/resources/web/images/cc/yt.png differ
diff --git a/src/main/resources/web/images/cc/za.png b/src/main/resources/web/images/cc/za.png
new file mode 100644
index 0000000..2c2eff8
Binary files /dev/null and b/src/main/resources/web/images/cc/za.png differ
diff --git a/src/main/resources/web/images/cc/zm.png b/src/main/resources/web/images/cc/zm.png
new file mode 100644
index 0000000..a6e6eb5
Binary files /dev/null and b/src/main/resources/web/images/cc/zm.png differ
diff --git a/src/main/resources/web/images/cc/zw.png b/src/main/resources/web/images/cc/zw.png
new file mode 100644
index 0000000..cbf90eb
Binary files /dev/null and b/src/main/resources/web/images/cc/zw.png differ
diff --git a/src/main/resources/web/images/flags/authority.png b/src/main/resources/web/images/flags/authority.png
new file mode 100644
index 0000000..ebd207b
Binary files /dev/null and b/src/main/resources/web/images/flags/authority.png differ
diff --git a/src/main/resources/web/images/flags/badexit.png b/src/main/resources/web/images/flags/badexit.png
new file mode 100644
index 0000000..b5d8a73
Binary files /dev/null and b/src/main/resources/web/images/flags/badexit.png differ
diff --git a/src/main/resources/web/images/flags/bridge.png b/src/main/resources/web/images/flags/bridge.png
new file mode 100644
index 0000000..a0cbfa6
Binary files /dev/null and b/src/main/resources/web/images/flags/bridge.png differ
diff --git a/src/main/resources/web/images/flags/country.png b/src/main/resources/web/images/flags/country.png
new file mode 100644
index 0000000..9eda2b2
Binary files /dev/null and b/src/main/resources/web/images/flags/country.png differ
diff --git a/src/main/resources/web/images/flags/directory.png b/src/main/resources/web/images/flags/directory.png
new file mode 100644
index 0000000..c330702
Binary files /dev/null and b/src/main/resources/web/images/flags/directory.png differ
diff --git a/src/main/resources/web/images/flags/exit.png b/src/main/resources/web/images/flags/exit.png
new file mode 100644
index 0000000..ec9cb90
Binary files /dev/null and b/src/main/resources/web/images/flags/exit.png differ
diff --git a/src/main/resources/web/images/flags/fallbackdir.png b/src/main/resources/web/images/flags/fallbackdir.png
new file mode 100644
index 0000000..0c25009
Binary files /dev/null and b/src/main/resources/web/images/flags/fallbackdir.png differ
diff --git a/src/main/resources/web/images/flags/fast.png b/src/main/resources/web/images/flags/fast.png
new file mode 100644
index 0000000..7c65b9f
Binary files /dev/null and b/src/main/resources/web/images/flags/fast.png differ
diff --git a/src/main/resources/web/images/flags/fingerprint.png b/src/main/resources/web/images/flags/fingerprint.png
new file mode 100644
index 0000000..b1b1ebf
Binary files /dev/null and b/src/main/resources/web/images/flags/fingerprint.png differ
diff --git a/src/main/resources/web/images/flags/guard.png b/src/main/resources/web/images/flags/guard.png
new file mode 100644
index 0000000..1c55c39
Binary files /dev/null and b/src/main/resources/web/images/flags/guard.png differ
diff --git a/src/main/resources/web/images/flags/hibernating.png b/src/main/resources/web/images/flags/hibernating.png
new file mode 100644
index 0000000..5e6e2d4
Binary files /dev/null and b/src/main/resources/web/images/flags/hibernating.png differ
diff --git a/src/main/resources/web/images/flags/hsdir.png b/src/main/resources/web/images/flags/hsdir.png
new file mode 100644
index 0000000..19e3126
Binary files /dev/null and b/src/main/resources/web/images/flags/hsdir.png differ
diff --git a/src/main/resources/web/images/flags/ipv4.png b/src/main/resources/web/images/flags/ipv4.png
new file mode 100644
index 0000000..d9e3de8
Binary files /dev/null and b/src/main/resources/web/images/flags/ipv4.png differ
diff --git a/src/main/resources/web/images/flags/ipv6.png b/src/main/resources/web/images/flags/ipv6.png
new file mode 100644
index 0000000..1665726
Binary files /dev/null and b/src/main/resources/web/images/flags/ipv6.png differ
diff --git a/src/main/resources/web/images/flags/ipv6exit.png b/src/main/resources/web/images/flags/ipv6exit.png
new file mode 100644
index 0000000..8c731ec
Binary files /dev/null and b/src/main/resources/web/images/flags/ipv6exit.png differ
diff --git a/src/main/resources/web/images/flags/noedconsensus.png b/src/main/resources/web/images/flags/noedconsensus.png
new file mode 100644
index 0000000..e68495c
Binary files /dev/null and b/src/main/resources/web/images/flags/noedconsensus.png differ
diff --git a/src/main/resources/web/images/flags/notrecommended.png b/src/main/resources/web/images/flags/notrecommended.png
new file mode 100644
index 0000000..f7a93d4
Binary files /dev/null and b/src/main/resources/web/images/flags/notrecommended.png differ
diff --git a/src/main/resources/web/images/flags/onion-alt.png b/src/main/resources/web/images/flags/onion-alt.png
new file mode 100644
index 0000000..ace78cf
Binary files /dev/null and b/src/main/resources/web/images/flags/onion-alt.png differ
diff --git a/src/main/resources/web/images/flags/onion.png b/src/main/resources/web/images/flags/onion.png
new file mode 100644
index 0000000..e738fda
Binary files /dev/null and b/src/main/resources/web/images/flags/onion.png differ
diff --git a/src/main/resources/web/images/flags/reachableipv4.png b/src/main/resources/web/images/flags/reachableipv4.png
new file mode 100644
index 0000000..e929d87
Binary files /dev/null and b/src/main/resources/web/images/flags/reachableipv4.png differ
diff --git a/src/main/resources/web/images/flags/reachableipv6.png b/src/main/resources/web/images/flags/reachableipv6.png
new file mode 100644
index 0000000..b4f6990
Binary files /dev/null and b/src/main/resources/web/images/flags/reachableipv6.png differ
diff --git a/src/main/resources/web/images/flags/relay.png b/src/main/resources/web/images/flags/relay.png
new file mode 100644
index 0000000..ee171d4
Binary files /dev/null and b/src/main/resources/web/images/flags/relay.png differ
diff --git a/src/main/resources/web/images/flags/running.png b/src/main/resources/web/images/flags/running.png
new file mode 100644
index 0000000..6d716cf
Binary files /dev/null and b/src/main/resources/web/images/flags/running.png differ
diff --git a/src/main/resources/web/images/flags/stable.png b/src/main/resources/web/images/flags/stable.png
new file mode 100644
index 0000000..172e618
Binary files /dev/null and b/src/main/resources/web/images/flags/stable.png differ
diff --git a/src/main/resources/web/images/flags/tshirt.png b/src/main/resources/web/images/flags/tshirt.png
new file mode 100644
index 0000000..46384f0
Binary files /dev/null and b/src/main/resources/web/images/flags/tshirt.png differ
diff --git a/src/main/resources/web/images/flags/unmeasured.png b/src/main/resources/web/images/flags/unmeasured.png
new file mode 100644
index 0000000..8b0e43a
Binary files /dev/null and b/src/main/resources/web/images/flags/unmeasured.png differ
diff --git a/src/main/resources/web/images/flags/unreachableipv4.png b/src/main/resources/web/images/flags/unreachableipv4.png
new file mode 100644
index 0000000..497d4c6
Binary files /dev/null and b/src/main/resources/web/images/flags/unreachableipv4.png differ
diff --git a/src/main/resources/web/images/flags/unreachableipv6.png b/src/main/resources/web/images/flags/unreachableipv6.png
new file mode 100644
index 0000000..db44b88
Binary files /dev/null and b/src/main/resources/web/images/flags/unreachableipv6.png differ
diff --git a/src/main/resources/web/images/flags/v2dir.png b/src/main/resources/web/images/flags/v2dir.png
new file mode 100644
index 0000000..a68b7ee
Binary files /dev/null and b/src/main/resources/web/images/flags/v2dir.png differ
diff --git a/src/main/resources/web/images/flags/valid.png b/src/main/resources/web/images/flags/valid.png
new file mode 100644
index 0000000..6de0737
Binary files /dev/null and b/src/main/resources/web/images/flags/valid.png differ
diff --git a/src/main/resources/web/images/glyphicons-halflings-white.png b/src/main/resources/web/images/glyphicons-halflings-white.png
new file mode 100644
index 0000000..a20760b
Binary files /dev/null and b/src/main/resources/web/images/glyphicons-halflings-white.png differ
diff --git a/src/main/resources/web/images/glyphicons-halflings.png b/src/main/resources/web/images/glyphicons-halflings.png
new file mode 100644
index 0000000..92d4445
Binary files /dev/null and b/src/main/resources/web/images/glyphicons-halflings.png differ
diff --git a/src/main/resources/web/images/noscript.png b/src/main/resources/web/images/noscript.png
new file mode 100644
index 0000000..3bc118b
Binary files /dev/null and b/src/main/resources/web/images/noscript.png differ
diff --git a/src/main/resources/web/js/rs/app.build.js b/src/main/resources/web/js/rs/app.build.js
new file mode 100644
index 0000000..b460373
--- /dev/null
+++ b/src/main/resources/web/js/rs/app.build.js
@@ -0,0 +1,18 @@
+// This is used to build the app and compact it
+({
+    appDir: "../",
+    baseUrl: "js",
+    dir: "../build",
+    paths: {
+        jquery: 'libs/jquery/jquery-min',
+        underscore: 'libs/underscore/underscore-min',
+        backbone: 'libs/backbone/backbone-optamd3-min',
+        text: 'libs/require/text',
+        templates: '../templates'
+    },
+    modules: [
+        {
+            name: "main"
+        }
+    ]
+})
diff --git a/src/main/resources/web/js/rs/app.js b/src/main/resources/web/js/rs/app.js
new file mode 100644
index 0000000..839579c
--- /dev/null
+++ b/src/main/resources/web/js/rs/app.js
@@ -0,0 +1,16 @@
+// ~ app.js ~
+define([
+  'jquery',
+  'underscore',
+  'backbone',
+  'router', // Request router.js
+], function($, _, Backbone, Router){
+  var initialize = function(){
+    // Pass in our Router module and call it's initialize function
+    Router.initialize();
+  };
+
+  return {
+    initialize: initialize
+  };
+});
diff --git a/src/main/resources/web/js/rs/boilerplate.js b/src/main/resources/web/js/rs/boilerplate.js
new file mode 100644
index 0000000..68be69c
--- /dev/null
+++ b/src/main/resources/web/js/rs/boilerplate.js
@@ -0,0 +1,11 @@
+// This is the boilerplate file
+// it should be used as a base for every module
+define([
+  'jquery',
+  'underscore',
+  'backbone'
+], function($, _, Backbone){
+  /* YOU CODE GOES HERE */
+  return {};
+});
+
diff --git a/src/main/resources/web/js/rs/collections/aggregates.js b/src/main/resources/web/js/rs/collections/aggregates.js
new file mode 100644
index 0000000..9ddce23
--- /dev/null
+++ b/src/main/resources/web/js/rs/collections/aggregates.js
@@ -0,0 +1,137 @@
+// ~ collections/aggregates ~
+define([
+  'jquery',
+  'underscore',
+  'backbone',
+  'models/aggregate'
+], function($, _, Backbone, aggregateModel){
+  var aggregatesCollection = Backbone.Collection.extend({
+    model: aggregateModel,
+    baseurl: 'https://onionoo.torproject.org/details?running=true&type=relay&fields=country,guard_probability,middle_probability,exit_probability,consensus_weight,consensus_weight_fraction,advertised_bandwidth,flags,as_number,as_name,measured,version',
+    url: '',
+    aType: 'cc',
+    lookup: function(options) {
+      var success = options.success;
+      var error = options.error;
+      var err = -1;
+      var collection = this;
+      options.success = $.getJSON(this.url, function(response) {
+        checkIfDataIsUpToDate(options.success.getResponseHeader("Last-Modified"));
+        this.fresh_until = response.fresh_until;
+        this.valid_after = response.valid_after;
+        var aggregates = {};
+        var relaysPublished = response.relays_published;
+        var bridgesPublished = response.bridges_published;
+        options.error = function(options) {
+          error(options.error, collection, options);
+        }
+        _.each(response.relays, function(relay) {
+          /* If a relay country is unknown, use XZ as the country code.
+             This code will never be assigned for use with ISO 3166-1 and is "user-assigned".
+             Fun fact: UN/LOCODE assigns XZ to represent installations in international waters. */
+          relay.country = ((typeof relay.country) == "undefined") ? "xz" : relay.country;
+          relay.as_number = ((typeof relay.as_number) == "undefined") ? 0 : relay.as_number;
+          if (relay.as_number == 0) relay.as_name = "Unknown";
+
+          var ccAggregate = false;
+          var asAggregate = false;
+          var versionAggregate = false;
+
+          if (collection.aType == "all") {
+            aggregateKey = "zz"; // A user-assigned ISO 3166-1 code, but really just a static key
+          } else if (collection.aType == "cc") {
+            aggregateKey = relay.country;
+            ccAggregate = true;
+          } else if (collection.aType == "as") {
+            aggregateKey = relay.as_number;
+            asAggregate = true;
+          } else if (collection.aType == "version") {
+            aggregateKey = relay.version.split(".").slice(0, 3).join(".") + ".";
+            versionAggregate = true;
+          } else {
+            aggregateKey = relay.country + "/" + relay.as_number;
+            ccAggregate = asAggregate = true;
+          }
+
+          if (!(aggregateKey in aggregates)) {
+            aggregates[aggregateKey] = new aggregateModel;
+            if (ccAggregate) {
+              aggregates[aggregateKey].country = relay.country;
+            } else {
+              aggregates[aggregateKey].country = new Set();
+            }
+            if (asAggregate) {
+              aggregates[aggregateKey].as = relay.as_number;
+            } else {
+              aggregates[aggregateKey].as = new Set();
+            }
+            if (versionAggregate) {
+              aggregates[aggregateKey].version = aggregateKey;
+            }
+            aggregates[aggregateKey].as_name = relay.as_name;
+          }
+
+          if (!ccAggregate) {
+            if (relay.country !== "xz") aggregates[aggregateKey].country.add(relay.country);
+          }
+          if (!asAggregate) {
+            if (relay.as_number !== 0) aggregates[aggregateKey].as.add(relay.as_number);
+          }
+          aggregates[aggregateKey].relays++;
+          if ((typeof relay.guard_probability) !== "undefined") aggregates[aggregateKey].guard_probability += relay.guard_probability;
+          if ((typeof relay.middle_probability) !== "undefined") aggregates[aggregateKey].middle_probability += relay.middle_probability;
+          if ((typeof relay.exit_probability) !== "undefined") aggregates[aggregateKey].exit_probability += relay.exit_probability;
+          if ((typeof relay.consensus_weight) !== "undefined") aggregates[aggregateKey].consensus_weight += relay.consensus_weight;
+          if ((typeof relay.consensus_weight_fraction) !== "undefined") aggregates[aggregateKey].consensus_weight_fraction += relay.consensus_weight_fraction;
+          if ((typeof relay.advertised_bandwidth) !== "undefined" && relay.advertised_bandwidth > 0) {
+            aggregates[aggregateKey].advertised_bandwidth += relay.advertised_bandwidth;
+            if (relay.measured) {
+              aggregates[aggregateKey].consensus_weight_to_bandwidth_count++;
+              aggregates[aggregateKey].consensus_weight_to_bandwidth += ((relay.consensus_weight*1024)/relay.advertised_bandwidth); // This is divided by number of relays for which data existed below to provide a mean average
+            }
+          }
+          _.each(relay.flags, function(flag) {
+            if (flag == "Guard") aggregates[aggregateKey].guards++;
+            if (flag == "Exit") aggregates[aggregateKey].exits++;
+          });
+        });
+        if (Object.keys(aggregates).length == 0) {
+          error(0);
+          return false;
+        }
+        var aggregatesArr = [];
+        _.each(Object.keys(aggregates), function(aggregateKey) {
+          var aggregate = aggregates[aggregateKey];
+          if ((typeof aggregate.as) !== "string") {
+            if (aggregate.as.size == 1) {
+              aggregate.as.forEach(function(value1, value2, set) {
+                aggregate.as = value1;
+              });
+            }
+          }
+          if ((typeof aggregate.country) !== "string") {
+            if (aggregate.country.size == 1) {
+              aggregate.country.forEach(function(value1, value2, set) {
+                aggregate.country = value1;
+              });
+            }
+          }
+          if (aggregate.consensus_weight_to_bandwidth_count > 0) {
+            aggregate.consensus_weight_to_bandwidth = aggregate.consensus_weight_to_bandwidth/aggregate.consensus_weight_to_bandwidth_count;
+          }
+          aggregatesArr.push(aggregate);
+        });
+        collection[options.add ? 'add' : 'reset'](aggregatesArr, options);
+        success(err, relaysPublished, bridgesPublished);
+      }).fail(function(jqXHR, textStatus, errorThrown) {
+        if(jqXHR.statusText == "error") {
+          error(2);
+        } else {
+          error(3);
+        }
+      });
+    }
+  });
+  return aggregatesCollection;
+});
+
diff --git a/src/main/resources/web/js/rs/collections/results.js b/src/main/resources/web/js/rs/collections/results.js
new file mode 100644
index 0000000..73ef819
--- /dev/null
+++ b/src/main/resources/web/js/rs/collections/results.js
@@ -0,0 +1,90 @@
+// ~ collections/results ~
+define([
+  'jquery',
+  'underscore',
+  'backbone',
+  'models/relay'
+], function($, _, Backbone, relayModel){
+	var resultsCollection = Backbone.Collection.extend({
+		model: relayModel,
+		baseurl: 'https://onionoo.torproject.org/details?search=',
+		url: '',
+		lookup: function(options) {
+            var success = options.success;
+            var error = options.error;
+            var err = 0;
+            var collection = this;
+            options.success = $.getJSON(this.url, function(response) {
+                checkIfDataIsUpToDate(options.success.getResponseHeader("Last-Modified"));
+                this.fresh_until = response.fresh_until;
+                this.valid_after = response.valid_after;
+                var relays = [];
+                var relaysPublished = response.relays_published;
+                var bridgesPublished = response.bridges_published;
+                options.error = function(options) {
+                    error(options.error, collection, options);
+                }
+                _.each(response.relays, function(relay, resultsC) {
+                    crelay = new relayModel;
+                    crelay.fingerprint = relay.fingerprint;
+                    crelay.relay = relay;
+                    crelay.relay.is_bridge = false;
+                    relays.push(crelay);
+                });
+                _.each(response.bridges, function(relay, resultsC) {
+                    crelay = new relayModel;
+                    crelay.fingerprint = relay.hashed_fingerprint;
+                    crelay.relay = relay;
+                    crelay.relay.is_bridge = true;
+                    relays.push(crelay);
+                });
+                if (relays.length == 0) {
+                    error(0);
+                    return false;
+                } else if (relays.length > 2000) {
+                   relays = relays.slice(0, 2000);
+                   err = 4;
+                }
+                var lookedUpRelays = 0;
+                var relayChunks = relays.chunk(600);
+                var chunkedLookup = function() {
+                  _.each(relayChunks.pop(), function(relay) {
+                      relay.lookup({
+                          success: function(){
+                              lookedUpRelays++;
+                          },
+                          error: function() {
+                              lookedUpRelays++;
+                              error(0);
+                          }
+                      });
+                  });
+                  if (lookedUpRelays == relays.length) {
+                    $('.progress-bar').width("100%");
+                    $('.progress-bar').html("Rendering results...");
+                    setTimeout(function() {
+                      collection[options.add ? 'add' : 'reset'](relays, options);
+                      success(err, relaysPublished, bridgesPublished);
+                    }, 500);
+                  } else {
+                    $('.progress-bar').width((lookedUpRelays / relays.length * 100) + "%");
+                    $('.progress-bar').html(lookedUpRelays + " of " + relays.length + " loaded");
+                    setTimeout(chunkedLookup, 50);
+                  }
+                }
+                chunkedLookup();
+            }).fail(
+                function(jqXHR, textStatus, errorThrown) {
+                if(jqXHR.statusText == "error") {
+                    error(2);
+                } else {
+                    error(3);
+                }
+                }
+            );
+        }
+
+	});
+	return resultsCollection;
+});
+
diff --git a/src/main/resources/web/js/rs/fallback_dir.js b/src/main/resources/web/js/rs/fallback_dir.js
new file mode 100644
index 0000000..93f97c5
--- /dev/null
+++ b/src/main/resources/web/js/rs/fallback_dir.js
@@ -0,0 +1,16 @@
+
+
+/*
+This file is generated by scripts/fallback_dir.py.
+
+To update run:
+
+python3 scripts/fallback_dir.py > js/fallback_dir.js
+*/
+
+var fallbackDirs = ["001524DD403D729F08F7E5D77813EF12756CFA8D", "0111BA9B604669E636FFD5B503F382A4B7AD6E80", "025B66CEBC070FCB0519D206CF0CF4965C20C96E", "0756B7CD4DFC8182BE23143FAC0642F515182CEB", "0B85617241252517E8ECF2CFC7F4C1A32DCD153F", "0BEA4A88D069753218EAAAD6D22EA87B9A1319D6", "0CF8F3E6590F45D50B70F2F7DA6605ECA6CD408F", "0D3EBA17E1C78F1E9900BABDB23861D46FCAF163", "0E8C0C8315B66DB5F703804B3889A1DD66C67CE0", "11DF0017A43AF1F08825CD5D973297F81AB00FF3", "12AD30E5D25AA67F519780E2111E611A455FDC89", "12FD624EE73CEF37137C90D38B2406A66F68FAA2", "136F9299A5009A4E0E96494E723BDB556FB0A26B", "16102E458460349EE45C0901DAA6C30094A9BBEA", "175921396C7C426309AB03775A9930B6F611F794", "185663B7C12777F052B2C2D23D7A239D8DA88A0F", "1938EBACBB1A7BFA888D9623C90061130E63BB3F", "1AE039EE0B11DB79E4B4B29CBA9F752864A0259E", "1C90D3AEADFF3BCD079810632C8B85637924A58E", "1DBAED235E3957DE1ABD25B4206BE71406FB61F8", "1ECD73B936CB6E6B3CD647CC204F108D9DF2C9F7", "1F6ABD086F40B890A33C93CC4606EE68B31C9556", "1FA8F638
 298645BE58AC905276680889CB795A94", "20462CBA5DA4C2D963567D17D0B7249718114A68", "204DFD2A2C6A0DC1FA0EACB495218E0B661704FD", "230A8B2A8BA861210D9B4BA97745AEC217A94207", "231C2B9C8C31C295C472D031E06964834B745996", "2BA2C8E96B2590E1072AECE2BDB5C48921BF8510", "2CDCFED0142B28B002E89D305CBA2E26063FADE2", "2F0F32AB1E5B943CA7D062C03F18960C86E70D94", "30C19B81981F450C402306E2E7CFB6C3F79CB6B2", "328E54981C6DDD7D89B89E418724A4A7881E3192", "330CD3DB6AD266DC70CDB512B036957D03D9BC59", "33DA0CAB7C27812EFF2E22C9705630A54D101FEB", "3711E80B5B04494C971FB0459D4209AB7F2EA799", "379FB450010D17078B3766C2273303C358C3A442", "387B065A38E4DAA16D9D41C2964ECBC4B31D30FF", "39F096961ED2576975C866D450373A9913AFDC92", "3B33F6FCA645AD4E91428A3AF7DC736AD9FB727B", "3C79699D4FBC37DE1A212D5033B56DAE079AC0EF", "3D7E274A87D9A89AF064C13D1EE4CA1F184F2600", "3E53D3979DB07EFD736661C934A1DED14127B684", "4061C553CA88021B8302F0814365070AAE617270", "40E7D6CE5085E4CDDA31D51A29D1457EB53F12AD", "41C59606AFE1D1AA6EC6EF6719690B856F0B6
 587", "439D0447772CB107B886F7782DBC201FA26B92D1", "4623A9EC53BFD83155929E56D6F7B55B5E718C24", "46791D156C9B6C255C2665D4D8393EC7DBAA7798", "484A10BA2B8D48A5F0216674C8DD50EF27BC32F3", "489D94333DF66D57FFE34D9D59CC2D97E2CB0053", "4CC9CC9195EC38645B699A33307058624F660CCF", "4F0DB7E687FC7C0AE55C8F243DA8B0EB27FBF1F2", "50586E25BE067FD1F739998550EDDCB1A14CA5B2", "51E1CF613FD6F9F11FE24743C91D6F9981807D82", "52BFADA8BEAA01BA46C8F767F83C18E2FE50C1B9", "587E0A9552E4274B251F29B5B2673D38442EE4BF", "58ED9C9C35E433EE58764D62892B4FFD518A3CD0", "5E56738E7F97AA81DEEF59AF28494293DFBFCCDF", "5F4CD12099AF20FAF9ADFDCEC65316A376D0201C", "616081EC829593AF4232550DE6FFAA1D75B37A90", "68F175CCABE727AA2D2309BCD8789499CEE36ED7", "6A7551EEE18F78A9813096E82BF84F740D32B911", "6EF897645B79B6CB35E853B32506375014DE3621", "72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE", "7600680249A22080ECC6173FBBF64D6FCF330A61", "763C9556602BD6207771A7A3D958091D44C43228", "774555642FDC1E1D4FDF2E0C31B7CA9501C5C9C7", "775B0FAFDE71AADC23FFC8
 782B7BEB1D5A92733E", "789EA6C9AE9ADDD8760903171CFA9AC5741B0C70", "78E2BE744A53631B4AAB781468E94C52AB73968B", "79E169B25E4C7CE99584F6ED06F379478F23E2B8", "7A32C9519D80CA458FC8B034A28F5F6815649A98", "7BB70F8585DFC27E75D692970C0EEB0F22983A63", "7BFB908A3AA5B491DA4CA72CCBEE0E1F2A939B55", "7D05A38E39FC5D29AFE6BE487B9B4DC9E635D09E", "7FA8E7E44F1392A4E40FFC3B69DB3B00091B7FD3", "80AAF8D5956A43C197104CEF2550CD42D165C6FB", "8456DFA94161CDD99E480C2A2992C366C6564410", "855BC2DABE24C861CD887DB9B2E950424B49FC34", "8567AD0A6369ED08527A8A8533A5162AC00F7678", "86C281AD135058238D7A337D546C902BE8505DDE", "88487BDD980BF6E72092EE690E8C51C0AA4A538C", "8C00FA7369A7A308F6A137600F0FA07990D9D451", "8D79F73DCD91FC4F5017422FAC70074D6DB8DD81", "9007C1D8E4F03D506A4A011B907A9E8D04E3C605", "91D23D8A539B83D2FB56AA67ECD4D75CC093AC55", "9285B22F7953D7874604EEE2B470609AD81C74E9", "92CFD9565B24646CAC2D172D3DB503D69E777B8A", "92ECC9E0E2AF81BB954719B189AC362E254AD4A5", "9772EFB535397C942C3AB8804FB35CFFAD012438", "998BF3E
 D7F70E33D1C307247B9626D9E7573C438", "9A0D54D3A6D2E0767596BF1515E6162A75B3293F", "9A68B85A02318F4E7E87F2828039FBD5D75B0142", "9B31F1F1C1554F9FFB3455911F82E818EF7C7883", "9EC5E097663862DF861A18C32B37C5F82284B27D", "9F2856F6D2B89AD4EF6D5723FAB167DB5A53519A", "9F7D6E6420183C2B76D3CE99624EBC98A21A967E", "9FBEB75E8BC142565F12CBBE078D63310236A334", "A0F06C2FADF88D3A39AA3072B406F09D7095AC9E", "A10C4F666D27364036B562823E5830BC448E046A", "A2E6BB5C391CD46B38C55B4329C35304540771F1", "A478E421F83194C114F41E94F95999672AED51FE", "A4C98CEA3F34E05299417E9F885A642C88EF6029", "A9406A006D6E7B5DA30F2C6D4E42A338B5E340B2", "AC66FFA4AB35A59EBBF5BF4C70008BF24D8A7A5C", "ACD889D86E02EDDAB1AFD81F598C0936238DC6D0", "ACDD9E85A05B127BA010466C13C8C47212E8A38F", "AD19490C7DBB26D3A68EFC824F67E69B0A96E601", "B0279A521375F3CB2AE210BDBFC645FDD2E1973A", "B0553175AADB0501E5A61FC61CEA3970BE130FF2", "B06F093A3D4DFAD3E923F4F28A74901BD4F74EB1", "B0CD9F9B5B60651ADC5919C0F1EAA87DBA1D9249", "B143D439B72D239A419F8DCE07B8A8EB1B48
 6FA7", "B291D30517D23299AD7CEE3E60DFE60D0E3A4664", "B4CAFD9CBFB34EC5DAAC146920DC7DFAFE91EA20", "B5212DB685A2A0FCFBAE425738E478D12361710D", "B6904ADD4C0D10CDA7179E051962350A69A63243", "B83DC1558F0D34353BB992EF93AFEAFDB226A73E", "B86137AE9681701901C6720E55C16805B46BD8E3", "BC630CBBB518BE7E9F4E09712AB0269E9DC7D626", "BCEDF6C193AA687AE471B8A22EBF6BC57C2D285E", "BCEF908195805E03E92CCFE669C48738E556B9C5", "BD552C165E2ED2887D3F1CCE9CFF155DDA2D86E6", "BF735F669481EE1CCC348F0731551C933D1E2278", "C2AAB088555850FC434E68943F551072042B85F1", "C37BC191AC389179674578C3E6944E925FE186C2", "C414F28FD2BEC1553024299B31D4E726BEB8E788", "C5A53BCC174EF8FD0DCB223E4AA929FA557DEDB2", "CE47F0356D86CF0A1A2008D97623216D560FB0A8", "CED527EAC230E7B56E5B363F839671829C3BA01B", "D30E9D4D639068611D6D96861C95C2099140B805", "D3E5EDDBE5159388704D6785BE51930AAFACEC6F", "D64366987CB39F61AD21DBCF8142FA0577B92811", "D760C5B436E42F93D77EF2D969157EEA14F9B39C", "D8B7A3A6542AA54D0946B9DC0257C53B6C376679", "DAA39FC00B196B353C2A2
 71459C305C429AF09E4", "DD823AFB415380A802DCAEB9461AE637604107FB", "DD8BD7307017407FCC36F8D04A688F74A0774C02", "DED6892FF89DBD737BA689698A171B2392EB3E82", "E3DB2E354B883B59E8DC56B3E7A353DDFD457812", "E480D577F58E782A5BC4FA6F49A6650E9389302F", "E589316576A399C511A9781A73DA4545640B479D", "E781F4EC69671B3F1864AE2753E0890351506329", "E81EF60A73B3809F8964F73766B01BAA0A171E20", "EFEACD781604EB80FBC025EDEDEA2D523AEAAA2F", "F4263275CF54A6836EE7BD527B1328836A6F06E1", "F70B7C5CD72D74C7F9F2DC84FA9D20D51BA13610", "F93D8F37E35C390BCAD9F9069E13085B745EC216", "FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B", "FE296180018833AF03A8EACD5894A614623D3F76"];
+
+function IsFallbackDir(fingerprint) {
+  return $.inArray(fingerprint, fallbackDirs) > -1;
+}
+
diff --git a/src/main/resources/web/js/rs/helpers.js b/src/main/resources/web/js/rs/helpers.js
new file mode 100644
index 0000000..dfff6c8
--- /dev/null
+++ b/src/main/resources/web/js/rs/helpers.js
@@ -0,0 +1,290 @@
+var CountryCodes = {
+  "ad" : "Andorra",
+  "ae" : "United Arab Emirates",
+  "af" : "Afghanistan",
+  "ag" : "Antigua and Barbuda",
+  "ai" : "Anguilla",
+  "al" : "Albania",
+  "am" : "Armenia",
+  "an" : "Netherlands Antilles",
+  "ao" : "Angola",
+  "aq" : "Antarctica",
+  "ar" : "Argentina",
+  "as" : "American Samoa",
+  "at" : "Austria",
+  "au" : "Australia",
+  "aw" : "Aruba",
+  "ax" : "Aland Islands",
+  "az" : "Azerbaijan",
+  "ba" : "Bosnia and Herzegovina",
+  "bb" : "Barbados",
+  "bd" : "Bangladesh",
+  "be" : "Belgium",
+  "bf" : "Burkina Faso",
+  "bg" : "Bulgaria",
+  "bh" : "Bahrain",
+  "bi" : "Burundi",
+  "bj" : "Benin",
+  "bl" : "Saint Bartelemey",
+  "bm" : "Bermuda",
+  "bn" : "Brunei",
+  "bo" : "Bolivia",
+  "br" : "Brazil",
+  "bs" : "Bahamas",
+  "bt" : "Bhutan",
+  "bv" : "Bouvet Island",
+  "bw" : "Botswana",
+  "by" : "Belarus",
+  "bz" : "Belize",
+  "ca" : "Canada",
+  "cc" : "Cocos (Keeling) Islands",
+  "cd" : "Democratic Republic of the Congo",
+  "cf" : "Central African Republic",
+  "cg" : "Congo",
+  "ch" : "Switzerland",
+  "ci" : "Côte d'Ivoire",
+  "ck" : "Cook Islands",
+  "cl" : "Chile",
+  "cm" : "Cameroon",
+  "cn" : "China",
+  "co" : "Colombia",
+  "cr" : "Costa Rica",
+  "cu" : "Cuba",
+  "cv" : "Cape Verde",
+  "cx" : "Christmas Island",
+  "cy" : "Cyprus",
+  "cz" : "Czech Republic",
+  "de" : "Germany",
+  "dj" : "Djibouti",
+  "dk" : "Denmark",
+  "dm" : "Dominica",
+  "do" : "Dominican Republic",
+  "dz" : "Algeria",
+  "ec" : "Ecuador",
+  "ee" : "Estonia",
+  "eg" : "Egypt",
+  "eh" : "Western Sahara",
+  "er" : "Eritrea",
+  "es" : "Spain",
+  "et" : "Ethiopia",
+  "fi" : "Finland",
+  "fj" : "Fiji",
+  "fk" : "Falkland Islands (Malvinas)",
+  "fm" : "Federated States of Micronesia",
+  "fo" : "Faroe Islands",
+  "fr" : "France",
+  "fx" : "Metropolitan France",
+  "ga" : "Gabon",
+  "gb" : "United Kingdom",
+  "gd" : "Grenada",
+  "ge" : "Georgia",
+  "gf" : "French Guiana",
+  "gg" : "Guernsey",
+  "gh" : "Ghana",
+  "gi" : "Gibraltar",
+  "gl" : "Greenland",
+  "gm" : "Gambia",
+  "gn" : "Guinea",
+  "gp" : "Guadeloupe",
+  "gq" : "Equatorial Guinea",
+  "gr" : "Greece",
+  "gs" : "South Georgia and the South Sandwich Islands",
+  "gt" : "Guatemala",
+  "gu" : "Guam",
+  "gw" : "Guinea-Bissau",
+  "gy" : "Guyana",
+  "hk" : "Hong Kong",
+  "hm" : "Heard Island and McDonald Islands",
+  "hn" : "Honduras",
+  "hr" : "Croatia",
+  "ht" : "Haiti",
+  "hu" : "Hungary",
+  "id" : "Indonesia",
+  "ie" : "Ireland",
+  "il" : "Israel",
+  "im" : "Isle of Man",
+  "in" : "India",
+  "io" : "British Indian Ocean Territory",
+  "iq" : "Iraq",
+  "ir" : "Iran",
+  "is" : "Iceland",
+  "it" : "Italy",
+  "je" : "Jersey",
+  "jm" : "Jamaica",
+  "jo" : "Jordan",
+  "jp" : "Japan",
+  "ke" : "Kenya",
+  "kg" : "Kyrgyzstan",
+  "kh" : "Cambodia",
+  "ki" : "Kiribati",
+  "km" : "Comoros",
+  "kn" : "Saint Kitts and Nevis",
+  "kp" : "North Korea",
+  "kr" : "Republic of Korea",
+  "kw" : "Kuwait",
+  "ky" : "Cayman Islands",
+  "kz" : "Kazakhstan",
+  "la" : "Laos",
+  "lb" : "Lebanon",
+  "lc" : "Saint Lucia",
+  "li" : "Liechtenstein",
+  "lk" : "Sri Lanka",
+  "lr" : "Liberia",
+  "ls" : "Lesotho",
+  "lt" : "Lithuania",
+  "lu" : "Luxembourg",
+  "lv" : "Latvia",
+  "ly" : "Libya",
+  "ma" : "Morocco",
+  "mc" : "Monaco",
+  "md" : "Republic of Moldova",
+  "me" : "Montenegro",
+  "mf" : "Saint Martin",
+  "mg" : "Madagascar",
+  "mh" : "Marshall Islands",
+  "mk" : "Macedonia",
+  "ml" : "Mali",
+  "mm" : "Burma",
+  "mn" : "Mongolia",
+  "mo" : "Macau",
+  "mp" : "Northern Mariana Islands",
+  "mq" : "Martinique",
+  "mr" : "Mauritania",
+  "ms" : "Montserrat",
+  "mt" : "Malta",
+  "mu" : "Mauritius",
+  "mv" : "Maldives",
+  "mw" : "Malawi",
+  "mx" : "Mexico",
+  "my" : "Malaysia",
+  "mz" : "Mozambique",
+  "na" : "Namibia",
+  "nc" : "New Caledonia",
+  "ne" : "Niger",
+  "nf" : "Norfolk Island",
+  "ng" : "Nigeria",
+  "ni" : "Nicaragua",
+  "nl" : "Netherlands",
+  "no" : "Norway",
+  "np" : "Nepal",
+  "nr" : "Nauru",
+  "nu" : "Niue",
+  "nz" : "New Zealand",
+  "om" : "Oman",
+  "pa" : "Panama",
+  "pe" : "Peru",
+  "pf" : "French Polynesia",
+  "pg" : "Papua New Guinea",
+  "ph" : "Philippines",
+  "pk" : "Pakistan",
+  "pl" : "Poland",
+  "pm" : "Saint Pierre and Miquelon",
+  "pn" : "Pitcairn Islands",
+  "pr" : "Puerto Rico",
+  "ps" : "Palestinian Territory",
+  "pt" : "Portugal",
+  "pw" : "Palau",
+  "py" : "Paraguay",
+  "qa" : "Qatar",
+  "re" : "Reunion",
+  "ro" : "Romania",
+  "rs" : "Serbia",
+  "ru" : "Russia",
+  "rw" : "Rwanda",
+  "sa" : "Saudi Arabia",
+  "sb" : "Solomon Islands",
+  "sc" : "Seychelles",
+  "sd" : "Sudan",
+  "se" : "Sweden",
+  "sg" : "Singapore",
+  "sh" : "Saint Helena",
+  "si" : "Slovenia",
+  "sj" : "Svalbard and Jan Mayen",
+  "sk" : "Slovakia",
+  "sl" : "Sierra Leone",
+  "sm" : "San Marino",
+  "sn" : "Senegal",
+  "so" : "Somalia",
+  "sr" : "Suriname",
+  "ss" : "South Sudan",
+  "st" : "São Tomé and Príncipe",
+  "sv" : "El Salvador",
+  "sy" : "Syrian Arab Republic",
+  "sz" : "Swaziland",
+  "tc" : "Turks and Caicos Islands",
+  "td" : "Chad",
+  "tf" : "French Southern Territories",
+  "tg" : "Togo",
+  "th" : "Thailand",
+  "tj" : "Tajikistan",
+  "tk" : "Tokelau",
+  "tl" : "East Timor",
+  "tm" : "Turkmenistan",
+  "tn" : "Tunisia",
+  "to" : "Tonga",
+  "tr" : "Turkey",
+  "tt" : "Trinidad and Tobago",
+  "tv" : "Tuvalu",
+  "tw" : "Taiwan",
+  "tz" : "United Republic of Tanzania",
+  "ua" : "Ukraine",
+  "ug" : "Uganda",
+  "um" : "United States Minor Outlying Islands",
+  "us" : "United States",
+  "uy" : "Uruguay",
+  "uz" : "Uzbekistan",
+  "va" : "Vatican City",
+  "vc" : "Saint Vincent and the Grenadines",
+  "ve" : "Venezuela",
+  "vg" : "British Virgin Islands",
+  "vi" : "United States Virgin Islands",
+  "vn" : "Vietnam",
+  "vu" : "Vanuatu",
+  "wf" : "Wallis and Futuna",
+  "ws" : "Samoa",
+  "xz" : "Unknown",
+  "ye" : "Yemen",
+  "yt" : "Mayotte",
+  "za" : "South Africa",
+  "zm" : "Zambia",
+  "zw" : "Zimbabwe"
+}
+
+function hrBandwidth(bw) {
+    var bw_k = bw/1024;
+    var bw_m = bw_k/1024;
+
+    if (bw_m >= 1) {
+        return Math.round(bw_m * 100) / 100 + " MiB/s";
+    } else if (bw_k >= 1) {
+        return Math.round(bw_k * 100) / 100 + " KiB/s";
+    }
+
+    return bw + " B/s";
+}
+
+function checkIfDataIsUpToDate(lastModifiedHeader) {
+    // check if onionoo document is up to date:
+    var lastModified = new Date(Date.parse(lastModifiedHeader));
+    var currentTime = new Date();
+    var hoursSinceLastUpdate =  (currentTime.getTime() - lastModified.getTime()) / (1000 * 60 * 60);
+    if (hoursSinceLastUpdate > 24 && $("#outdatedData").length==0) {
+        $('<div id="outdatedData" class="alert alert-danger"><strong>Outdated data!</strong><p>The Relay Search data source (Onionoo) was last updated: '+lastModified+'. This issue should be resolved soon, please try again later for more recent information.</p></div>').insertAfter(".container > h1");
+    }
+}
+
+window.onhashchange = function(){
+    // close mobile menu on hash change
+    if ($('.nav-collapse').height()>50) {
+        $('.btn-navbar').click();
+    }
+}
+
+Object.defineProperty(Array.prototype, 'chunk', {
+    value: function(chunkSize) {
+        var R = [];
+        for (var i=0; i<this.length; i+=chunkSize)
+            R.push(this.slice(i,i+chunkSize));
+        return R;
+    }
+});
diff --git a/src/main/resources/web/js/rs/jquery.cookieBar.js b/src/main/resources/web/js/rs/jquery.cookieBar.js
new file mode 100644
index 0000000..2bbb2ce
--- /dev/null
+++ b/src/main/resources/web/js/rs/jquery.cookieBar.js
@@ -0,0 +1,86 @@
+/*!
+ * jQuery Cookiebar Plugin
+ * https://github.com/carlwoodhouse/jquery.cookieBar
+ *
+ * Copyright 2012-17, Carl Woodhouse. the cookie function is inspired by https://github.com/carhartl/jquery-cookie
+ * Disclaimer: if you still get fined for not complying with the eu cookielaw, it's not our fault.
+ * Licence: MIT
+ */
+
+(function ($) {
+	$.cookie = function (key, value, options) {
+		if (arguments.length > 1 && (!/Object/.test(Object.prototype.toString.call(value)) || value === null || value === undefined)) {
+			options = $.extend({}, options);
+
+			if (value === null || value === undefined) {
+				options.expires = -1;
+			}
+
+			if (typeof options.expires === 'number') {
+				var days = options.expires, t = options.expires = new Date();
+				t.setDate(t.getDate() + days);
+			}
+
+			value = String(value);
+
+			return (document.cookie = [
+				encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value),
+				options.expires ? '; expires=' + options.expires.toUTCString() : '', // max-age is not supported by IE
+				options.path ? '; path=' + options.path : '',
+				options.domain ? '; domain=' + options.domain : '',
+				options.secure ? '; secure' : ''
+			].join(''));
+		}
+		options = value || {};
+		var decode = options.raw ? function (s) { return s; } : decodeURIComponent;
+
+		var pairs = document.cookie.split('; ');
+		for (var i = 0, pair; pair = pairs[i] && pairs[i].split('='); i++) {
+			// IE
+			if (decode(pair[0]) === key) return decode(pair[1] || '');
+		}
+		return null;
+	};
+
+	$.fn.cookieBar = function (options) {
+		var settings = $.extend({
+			'closeButton': 'none',
+			'hideOnClose': true,
+			'secure': false,
+			'path': '/',
+			'domain': ''
+		}, options);
+
+		return this.each(function () {
+			var cookiebar = $(this);
+
+			// just in case they didnt hide it by default.
+			cookiebar.hide();
+
+			// if close button not defined. define it!
+			if (settings.closeButton == 'none') {
+				cookiebar.append('<a class="cookiebar-close">Continue</a>');
+				$.extend(settings, { 'closeButton': '.cookiebar-close' });
+			}
+
+			if ($.cookie('cookiebar') != 'hide') {
+				cookiebar.show();
+			}
+
+			cookiebar.find(settings.closeButton).click(function () {
+				if (settings.hideOnClose) {
+					cookiebar.hide();
+				}
+				$.cookie('cookiebar', 'hide', { path: settings.path, secure: settings.secure, domain: settings.domain, expires: 30 });
+				cookiebar.trigger('cookieBar-close');
+				return false;
+			});
+		});
+	};
+
+	// self injection init
+	$.cookieBar = function (options) {
+		$('body').prepend('<div class="ui-widget"><div style="display: none;" class="cookie-message ui-widget-header blue"><p>By using this website you allow us to place cookies on your computer. They are harmless and never personally identify you.</p></div></div>');
+		$('.cookie-message').cookieBar(options);
+	};
+})(jQuery);
diff --git a/src/main/resources/web/js/rs/libs/backbone/backbone.min.js b/src/main/resources/web/js/rs/libs/backbone/backbone.min.js
new file mode 100644
index 0000000..435a72c
--- /dev/null
+++ b/src/main/resources/web/js/rs/libs/backbone/backbone.min.js
@@ -0,0 +1,2 @@
+(function(t){var e=typeof self=="object"&&self.self===self&&self||typeof global=="object"&&global.global===global&&global;if(typeof define==="function"&&define.amd){define(["underscore","jquery","exports"],function(i,r,n){e.Backbone=t(e,n,i,r)})}else if(typeof exports!=="undefined"){var i=require("underscore"),r;try{r=require("jquery")}catch(n){}t(e,exports,i,r)}else{e.Backbone=t(e,{},e._,e.jQuery||e.Zepto||e.ender||e.$)}})(function(t,e,i,r){var n=t.Backbone;var s=Array.prototype.slice;e.VERSION="1.3.3";e.$=r;e.noConflict=function(){t.Backbone=n;return this};e.emulateHTTP=false;e.emulateJSON=false;var a=function(t,e,r){switch(t){case 1:return function(){return i[e](this[r])};case 2:return function(t){return i[e](this[r],t)};case 3:return function(t,n){return i[e](this[r],o(t,this),n)};case 4:return function(t,n,s){return i[e](this[r],o(t,this),n,s)};default:return function(){var t=s.call(arguments);t.unshift(this[r]);return i[e].apply(i,t)}}};var h=function(t,e,r){i.each(e,function(
 e,n){if(i[n])t.prototype[n]=a(e,n,r)})};var o=function(t,e){if(i.isFunction(t))return t;if(i.isObject(t)&&!e._isModel(t))return l(t);if(i.isString(t))return function(e){return e.get(t)};return t};var l=function(t){var e=i.matches(t);return function(t){return e(t.attributes)}};var u=e.Events={};var c=/\s+/;var f=function(t,e,r,n,s){var a=0,h;if(r&&typeof r==="object"){if(n!==void 0&&"context"in s&&s.context===void 0)s.context=n;for(h=i.keys(r);a<h.length;a++){e=f(t,e,h[a],r[h[a]],s)}}else if(r&&c.test(r)){for(h=r.split(c);a<h.length;a++){e=t(e,h[a],n,s)}}else{e=t(e,r,n,s)}return e};u.on=function(t,e,i){return d(this,t,e,i)};var d=function(t,e,i,r,n){t._events=f(v,t._events||{},e,i,{context:r,ctx:t,listening:n});if(n){var s=t._listeners||(t._listeners={});s[n.id]=n}return t};u.listenTo=function(t,e,r){if(!t)return this;var n=t._listenId||(t._listenId=i.uniqueId("l"));var s=this._listeningTo||(this._listeningTo={});var a=s[n];if(!a){var h=this._listenId||(this._listenId=i.uniqueId("l")
 );a=s[n]={obj:t,objId:n,id:h,listeningTo:s,count:0}}d(t,e,r,this,a);return this};var v=function(t,e,i,r){if(i){var n=t[e]||(t[e]=[]);var s=r.context,a=r.ctx,h=r.listening;if(h)h.count++;n.push({callback:i,context:s,ctx:s||a,listening:h})}return t};u.off=function(t,e,i){if(!this._events)return this;this._events=f(g,this._events,t,e,{context:i,listeners:this._listeners});return this};u.stopListening=function(t,e,r){var n=this._listeningTo;if(!n)return this;var s=t?[t._listenId]:i.keys(n);for(var a=0;a<s.length;a++){var h=n[s[a]];if(!h)break;h.obj.off(e,r,this)}return this};var g=function(t,e,r,n){if(!t)return;var s=0,a;var h=n.context,o=n.listeners;if(!e&&!r&&!h){var l=i.keys(o);for(;s<l.length;s++){a=o[l[s]];delete o[a.id];delete a.listeningTo[a.objId]}return}var u=e?[e]:i.keys(t);for(;s<u.length;s++){e=u[s];var c=t[e];if(!c)break;var f=[];for(var d=0;d<c.length;d++){var v=c[d];if(r&&r!==v.callback&&r!==v.callback._callback||h&&h!==v.context){f.push(v)}else{a=v.listening;if(a&&--a.co
 unt===0){delete o[a.id];delete a.listeningTo[a.objId]}}}if(f.length){t[e]=f}else{delete t[e]}}return t};u.once=function(t,e,r){var n=f(p,{},t,e,i.bind(this.off,this));if(typeof t==="string"&&r==null)e=void 0;return this.on(n,e,r)};u.listenToOnce=function(t,e,r){var n=f(p,{},e,r,i.bind(this.stopListening,this,t));return this.listenTo(t,n)};var p=function(t,e,r,n){if(r){var s=t[e]=i.once(function(){n(e,s);r.apply(this,arguments)});s._callback=r}return t};u.trigger=function(t){if(!this._events)return this;var e=Math.max(0,arguments.length-1);var i=Array(e);for(var r=0;r<e;r++)i[r]=arguments[r+1];f(m,this._events,t,void 0,i);return this};var m=function(t,e,i,r){if(t){var n=t[e];var s=t.all;if(n&&s)s=s.slice();if(n)_(n,r);if(s)_(s,[e].concat(r))}return t};var _=function(t,e){var i,r=-1,n=t.length,s=e[0],a=e[1],h=e[2];switch(e.length){case 0:while(++r<n)(i=t[r]).callback.call(i.ctx);return;case 1:while(++r<n)(i=t[r]).callback.call(i.ctx,s);return;case 2:while(++r<n)(i=t[r]).callback.call(
 i.ctx,s,a);return;case 3:while(++r<n)(i=t[r]).callback.call(i.ctx,s,a,h);return;default:while(++r<n)(i=t[r]).callback.apply(i.ctx,e);return}};u.bind=u.on;u.unbind=u.off;i.extend(e,u);var y=e.Model=function(t,e){var r=t||{};e||(e={});this.cid=i.uniqueId(this.cidPrefix);this.attributes={};if(e.collection)this.collection=e.collection;if(e.parse)r=this.parse(r,e)||{};var n=i.result(this,"defaults");r=i.defaults(i.extend({},n,r),n);this.set(r,e);this.changed={};this.initialize.apply(this,arguments)};i.extend(y.prototype,u,{changed:null,validationError:null,idAttribute:"id",cidPrefix:"c",initialize:function(){},toJSON:function(t){return i.clone(this.attributes)},sync:function(){return e.sync.apply(this,arguments)},get:function(t){return this.attributes[t]},escape:function(t){return i.escape(this.get(t))},has:function(t){return this.get(t)!=null},matches:function(t){return!!i.iteratee(t,this)(this.attributes)},set:function(t,e,r){if(t==null)return this;var n;if(typeof t==="object"){n=t;r=e
 }else{(n={})[t]=e}r||(r={});if(!this._validate(n,r))return false;var s=r.unset;var a=r.silent;var h=[];var o=this._changing;this._changing=true;if(!o){this._previousAttributes=i.clone(this.attributes);this.changed={}}var l=this.attributes;var u=this.changed;var c=this._previousAttributes;for(var f in n){e=n[f];if(!i.isEqual(l[f],e))h.push(f);if(!i.isEqual(c[f],e)){u[f]=e}else{delete u[f]}s?delete l[f]:l[f]=e}if(this.idAttribute in n)this.id=this.get(this.idAttribute);if(!a){if(h.length)this._pending=r;for(var d=0;d<h.length;d++){this.trigger("change:"+h[d],this,l[h[d]],r)}}if(o)return this;if(!a){while(this._pending){r=this._pending;this._pending=false;this.trigger("change",this,r)}}this._pending=false;this._changing=false;return this},unset:function(t,e){return this.set(t,void 0,i.extend({},e,{unset:true}))},clear:function(t){var e={};for(var r in this.attributes)e[r]=void 0;return this.set(e,i.extend({},t,{unset:true}))},hasChanged:function(t){if(t==null)return!i.isEmpty(this.chan
 ged);return i.has(this.changed,t)},changedAttributes:function(t){if(!t)return this.hasChanged()?i.clone(this.changed):false;var e=this._changing?this._previousAttributes:this.attributes;var r={};for(var n in t){var s=t[n];if(i.isEqual(e[n],s))continue;r[n]=s}return i.size(r)?r:false},previous:function(t){if(t==null||!this._previousAttributes)return null;return this._previousAttributes[t]},previousAttributes:function(){return i.clone(this._previousAttributes)},fetch:function(t){t=i.extend({parse:true},t);var e=this;var r=t.success;t.success=function(i){var n=t.parse?e.parse(i,t):i;if(!e.set(n,t))return false;if(r)r.call(t.context,e,i,t);e.trigger("sync",e,i,t)};B(this,t);return this.sync("read",this,t)},save:function(t,e,r){var n;if(t==null||typeof t==="object"){n=t;r=e}else{(n={})[t]=e}r=i.extend({validate:true,parse:true},r);var s=r.wait;if(n&&!s){if(!this.set(n,r))return false}else if(!this._validate(n,r)){return false}var a=this;var h=r.success;var o=this.attributes;r.success=fun
 ction(t){a.attributes=o;var e=r.parse?a.parse(t,r):t;if(s)e=i.extend({},n,e);if(e&&!a.set(e,r))return false;if(h)h.call(r.context,a,t,r);a.trigger("sync",a,t,r)};B(this,r);if(n&&s)this.attributes=i.extend({},o,n);var l=this.isNew()?"create":r.patch?"patch":"update";if(l==="patch"&&!r.attrs)r.attrs=n;var u=this.sync(l,this,r);this.attributes=o;return u},destroy:function(t){t=t?i.clone(t):{};var e=this;var r=t.success;var n=t.wait;var s=function(){e.stopListening();e.trigger("destroy",e,e.collection,t)};t.success=function(i){if(n)s();if(r)r.call(t.context,e,i,t);if(!e.isNew())e.trigger("sync",e,i,t)};var a=false;if(this.isNew()){i.defer(t.success)}else{B(this,t);a=this.sync("delete",this,t)}if(!n)s();return a},url:function(){var t=i.result(this,"urlRoot")||i.result(this.collection,"url")||F();if(this.isNew())return t;var e=this.get(this.idAttribute);return t.replace(/[^\/]$/,"$&/")+encodeURIComponent(e)},parse:function(t,e){return t},clone:function(){return new this.constructor(this.a
 ttributes)},isNew:function(){return!this.has(this.idAttribute)},isValid:function(t){return this._validate({},i.extend({},t,{validate:true}))},_validate:function(t,e){if(!e.validate||!this.validate)return true;t=i.extend({},this.attributes,t);var r=this.validationError=this.validate(t,e)||null;if(!r)return true;this.trigger("invalid",this,r,i.extend(e,{validationError:r}));return false}});var b={keys:1,values:1,pairs:1,invert:1,pick:0,omit:0,chain:1,isEmpty:1};h(y,b,"attributes");var x=e.Collection=function(t,e){e||(e={});if(e.model)this.model=e.model;if(e.comparator!==void 0)this.comparator=e.comparator;this._reset();this.initialize.apply(this,arguments);if(t)this.reset(t,i.extend({silent:true},e))};var w={add:true,remove:true,merge:true};var E={add:true,remove:false};var I=function(t,e,i){i=Math.min(Math.max(i,0),t.length);var r=Array(t.length-i);var n=e.length;var s;for(s=0;s<r.length;s++)r[s]=t[s+i];for(s=0;s<n;s++)t[s+i]=e[s];for(s=0;s<r.length;s++)t[s+n+i]=r[s]};i.extend(x.prot
 otype,u,{model:y,initialize:function(){},toJSON:function(t){return this.map(function(e){return e.toJSON(t)})},sync:function(){return e.sync.apply(this,arguments)},add:function(t,e){return this.set(t,i.extend({merge:false},e,E))},remove:function(t,e){e=i.extend({},e);var r=!i.isArray(t);t=r?[t]:t.slice();var n=this._removeModels(t,e);if(!e.silent&&n.length){e.changes={added:[],merged:[],removed:n};this.trigger("update",this,e)}return r?n[0]:n},set:function(t,e){if(t==null)return;e=i.extend({},w,e);if(e.parse&&!this._isModel(t)){t=this.parse(t,e)||[]}var r=!i.isArray(t);t=r?[t]:t.slice();var n=e.at;if(n!=null)n=+n;if(n>this.length)n=this.length;if(n<0)n+=this.length+1;var s=[];var a=[];var h=[];var o=[];var l={};var u=e.add;var c=e.merge;var f=e.remove;var d=false;var v=this.comparator&&n==null&&e.sort!==false;var g=i.isString(this.comparator)?this.comparator:null;var p,m;for(m=0;m<t.length;m++){p=t[m];var _=this.get(p);if(_){if(c&&p!==_){var y=this._isModel(p)?p.attributes:p;if(e.par
 se)y=_.parse(y,e);_.set(y,e);h.push(_);if(v&&!d)d=_.hasChanged(g)}if(!l[_.cid]){l[_.cid]=true;s.push(_)}t[m]=_}else if(u){p=t[m]=this._prepareModel(p,e);if(p){a.push(p);this._addReference(p,e);l[p.cid]=true;s.push(p)}}}if(f){for(m=0;m<this.length;m++){p=this.models[m];if(!l[p.cid])o.push(p)}if(o.length)this._removeModels(o,e)}var b=false;var x=!v&&u&&f;if(s.length&&x){b=this.length!==s.length||i.some(this.models,function(t,e){return t!==s[e]});this.models.length=0;I(this.models,s,0);this.length=this.models.length}else if(a.length){if(v)d=true;I(this.models,a,n==null?this.length:n);this.length=this.models.length}if(d)this.sort({silent:true});if(!e.silent){for(m=0;m<a.length;m++){if(n!=null)e.index=n+m;p=a[m];p.trigger("add",p,this,e)}if(d||b)this.trigger("sort",this,e);if(a.length||o.length||h.length){e.changes={added:a,removed:o,merged:h};this.trigger("update",this,e)}}return r?t[0]:t},reset:function(t,e){e=e?i.clone(e):{};for(var r=0;r<this.models.length;r++){this._removeReference(
 this.models[r],e)}e.previousModels=this.models;this._reset();t=this.add(t,i.extend({silent:true},e));if(!e.silent)this.trigger("reset",this,e);return t},push:function(t,e){return this.add(t,i.extend({at:this.length},e))},pop:function(t){var e=this.at(this.length-1);return this.remove(e,t)},unshift:function(t,e){return this.add(t,i.extend({at:0},e))},shift:function(t){var e=this.at(0);return this.remove(e,t)},slice:function(){return s.apply(this.models,arguments)},get:function(t){if(t==null)return void 0;return this._byId[t]||this._byId[this.modelId(t.attributes||t)]||t.cid&&this._byId[t.cid]},has:function(t){return this.get(t)!=null},at:function(t){if(t<0)t+=this.length;return this.models[t]},where:function(t,e){return this[e?"find":"filter"](t)},findWhere:function(t){return this.where(t,true)},sort:function(t){var e=this.comparator;if(!e)throw new Error("Cannot sort a set without a comparator");t||(t={});var r=e.length;if(i.isFunction(e))e=i.bind(e,this);if(r===1||i.isString(e)){th
 is.models=this.sortBy(e)}else{this.models.sort(e)}if(!t.silent)this.trigger("sort",this,t);return this},pluck:function(t){return this.map(t+"")},fetch:function(t){t=i.extend({parse:true},t);var e=t.success;var r=this;t.success=function(i){var n=t.reset?"reset":"set";r[n](i,t);if(e)e.call(t.context,r,i,t);r.trigger("sync",r,i,t)};B(this,t);return this.sync("read",this,t)},create:function(t,e){e=e?i.clone(e):{};var r=e.wait;t=this._prepareModel(t,e);if(!t)return false;if(!r)this.add(t,e);var n=this;var s=e.success;e.success=function(t,e,i){if(r)n.add(t,i);if(s)s.call(i.context,t,e,i)};t.save(null,e);return t},parse:function(t,e){return t},clone:function(){return new this.constructor(this.models,{model:this.model,comparator:this.comparator})},modelId:function(t){return t[this.model.prototype.idAttribute||"id"]},_reset:function(){this.length=0;this.models=[];this._byId={}},_prepareModel:function(t,e){if(this._isModel(t)){if(!t.collection)t.collection=this;return t}e=e?i.clone(e):{};e.co
 llection=this;var r=new this.model(t,e);if(!r.validationError)return r;this.trigger("invalid",this,r.validationError,e);return false},_removeModels:function(t,e){var i=[];for(var r=0;r<t.length;r++){var n=this.get(t[r]);if(!n)continue;var s=this.indexOf(n);this.models.splice(s,1);this.length--;delete this._byId[n.cid];var a=this.modelId(n.attributes);if(a!=null)delete this._byId[a];if(!e.silent){e.index=s;n.trigger("remove",n,this,e)}i.push(n);this._removeReference(n,e)}return i},_isModel:function(t){return t instanceof y},_addReference:function(t,e){this._byId[t.cid]=t;var i=this.modelId(t.attributes);if(i!=null)this._byId[i]=t;t.on("all",this._onModelEvent,this)},_removeReference:function(t,e){delete this._byId[t.cid];var i=this.modelId(t.attributes);if(i!=null)delete this._byId[i];if(this===t.collection)delete t.collection;t.off("all",this._onModelEvent,this)},_onModelEvent:function(t,e,i,r){if(e){if((t==="add"||t==="remove")&&i!==this)return;if(t==="destroy")this.remove(e,r);if(
 t==="change"){var n=this.modelId(e.previousAttributes());var s=this.modelId(e.attributes);if(n!==s){if(n!=null)delete this._byId[n];if(s!=null)this._byId[s]=e}}}this.trigger.apply(this,arguments)}});var S={forEach:3,each:3,map:3,collect:3,reduce:0,foldl:0,inject:0,reduceRight:0,foldr:0,find:3,detect:3,filter:3,select:3,reject:3,every:3,all:3,some:3,any:3,include:3,includes:3,contains:3,invoke:0,max:3,min:3,toArray:1,size:1,first:3,head:3,take:3,initial:3,rest:3,tail:3,drop:3,last:3,without:0,difference:0,indexOf:3,shuffle:1,lastIndexOf:3,isEmpty:1,chain:1,sample:3,partition:3,groupBy:3,countBy:3,sortBy:3,indexBy:3,findIndex:3,findLastIndex:3};h(x,S,"models");var k=e.View=function(t){this.cid=i.uniqueId("view");i.extend(this,i.pick(t,P));this._ensureElement();this.initialize.apply(this,arguments)};var T=/^(\S+)\s*(.*)$/;var P=["model","collection","el","id","attributes","className","tagName","events"];i.extend(k.prototype,u,{tagName:"div",$:function(t){return this.$el.find(t)},initia
 lize:function(){},render:function(){return this},remove:function(){this._removeElement();this.stopListening();return this},_removeElement:function(){this.$el.remove()},setElement:function(t){this.undelegateEvents();this._setElement(t);this.delegateEvents();return this},_setElement:function(t){this.$el=t instanceof e.$?t:e.$(t);this.el=this.$el[0]},delegateEvents:function(t){t||(t=i.result(this,"events"));if(!t)return this;this.undelegateEvents();for(var e in t){var r=t[e];if(!i.isFunction(r))r=this[r];if(!r)continue;var n=e.match(T);this.delegate(n[1],n[2],i.bind(r,this))}return this},delegate:function(t,e,i){this.$el.on(t+".delegateEvents"+this.cid,e,i);return this},undelegateEvents:function(){if(this.$el)this.$el.off(".delegateEvents"+this.cid);return this},undelegate:function(t,e,i){this.$el.off(t+".delegateEvents"+this.cid,e,i);return this},_createElement:function(t){return document.createElement(t)},_ensureElement:function(){if(!this.el){var t=i.extend({},i.result(this,"attribu
 tes"));if(this.id)t.id=i.result(this,"id");if(this.className)t["class"]=i.result(this,"className");this.setElement(this._createElement(i.result(this,"tagName")));this._setAttributes(t)}else{this.setElement(i.result(this,"el"))}},_setAttributes:function(t){this.$el.attr(t)}});e.sync=function(t,r,n){var s=H[t];i.defaults(n||(n={}),{emulateHTTP:e.emulateHTTP,emulateJSON:e.emulateJSON});var a={type:s,dataType:"json"};if(!n.url){a.url=i.result(r,"url")||F()}if(n.data==null&&r&&(t==="create"||t==="update"||t==="patch")){a.contentType="application/json";a.data=JSON.stringify(n.attrs||r.toJSON(n))}if(n.emulateJSON){a.contentType="application/x-www-form-urlencoded";a.data=a.data?{model:a.data}:{}}if(n.emulateHTTP&&(s==="PUT"||s==="DELETE"||s==="PATCH")){a.type="POST";if(n.emulateJSON)a.data._method=s;var h=n.beforeSend;n.beforeSend=function(t){t.setRequestHeader("X-HTTP-Method-Override",s);if(h)return h.apply(this,arguments)}}if(a.type!=="GET"&&!n.emulateJSON){a.processData=false}var o=n.err
 or;n.error=function(t,e,i){n.textStatus=e;n.errorThrown=i;if(o)o.call(n.context,t,e,i)};var l=n.xhr=e.ajax(i.extend(a,n));r.trigger("request",r,l,n);return l};var H={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};e.ajax=function(){return e.$.ajax.apply(e.$,arguments)};var $=e.Router=function(t){t||(t={});if(t.routes)this.routes=t.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var A=/\((.*?)\)/g;var C=/(\(\?)?:\w+/g;var R=/\*\w+/g;var j=/[\-{}\[\]+?.,\\\^$|#\s]/g;i.extend($.prototype,u,{initialize:function(){},route:function(t,r,n){if(!i.isRegExp(t))t=this._routeToRegExp(t);if(i.isFunction(r)){n=r;r=""}if(!n)n=this[r];var s=this;e.history.route(t,function(i){var a=s._extractParameters(t,i);if(s.execute(n,a,r)!==false){s.trigger.apply(s,["route:"+r].concat(a));s.trigger("route",r,a);e.history.trigger("route",s,r,a)}});return this},execute:function(t,e,i){if(t)t.apply(this,e)},navigate:function(t,i){e.history.navigate(t,i);return this},_bindRou
 tes:function(){if(!this.routes)return;this.routes=i.result(this,"routes");var t,e=i.keys(this.routes);while((t=e.pop())!=null){this.route(t,this.routes[t])}},_routeToRegExp:function(t){t=t.replace(j,"\\$&").replace(A,"(?:$1)?").replace(C,function(t,e){return e?t:"([^/?]+)"}).replace(R,"([^?]*?)");return new RegExp("^"+t+"(?:\\?([\\s\\S]*))?$")},_extractParameters:function(t,e){var r=t.exec(e).slice(1);return i.map(r,function(t,e){if(e===r.length-1)return t||null;return t?decodeURIComponent(t):null})}});var N=e.History=function(){this.handlers=[];this.checkUrl=i.bind(this.checkUrl,this);if(typeof window!=="undefined"){this.location=window.location;this.history=window.history}};var M=/^[#\/]|\s+$/g;var O=/^\/+|\/+$/g;var U=/#.*$/;N.started=false;i.extend(N.prototype,u,{interval:50,atRoot:function(){var t=this.location.pathname.replace(/[^\/]$/,"$&/");return t===this.root&&!this.getSearch()},matchRoot:function(){var t=this.decodeFragment(this.location.pathname);var e=t.slice(0,this.roo
 t.length-1)+"/";return e===this.root},decodeFragment:function(t){return decodeURI(t.replace(/%25/g,"%2525"))},getSearch:function(){var t=this.location.href.replace(/#.*/,"").match(/\?.+/);return t?t[0]:""},getHash:function(t){var e=(t||this).location.href.match(/#(.*)$/);return e?e[1]:""},getPath:function(){var t=this.decodeFragment(this.location.pathname+this.getSearch()).slice(this.root.length-1);return t.charAt(0)==="/"?t.slice(1):t},getFragment:function(t){if(t==null){if(this._usePushState||!this._wantsHashChange){t=this.getPath()}else{t=this.getHash()}}return t.replace(M,"")},start:function(t){if(N.started)throw new Error("Backbone.history has already been started");N.started=true;this.options=i.extend({root:"/"},this.options,t);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._hasHashChange="onhashchange"in window&&(document.documentMode===void 0||document.documentMode>7);this._useHashChange=this._wantsHashChange&&this._hasHashChange;this.
 _wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.history&&this.history.pushState);this._usePushState=this._wantsPushState&&this._hasPushState;this.fragment=this.getFragment();this.root=("/"+this.root+"/").replace(O,"/");if(this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!this.atRoot()){var e=this.root.slice(0,-1)||"/";this.location.replace(e+"#"+this.getPath());return true}else if(this._hasPushState&&this.atRoot()){this.navigate(this.getHash(),{replace:true})}}if(!this._hasHashChange&&this._wantsHashChange&&!this._usePushState){this.iframe=document.createElement("iframe");this.iframe.src="javascript:0";this.iframe.style.display="none";this.iframe.tabIndex=-1;var r=document.body;var n=r.insertBefore(this.iframe,r.firstChild).contentWindow;n.document.open();n.document.close();n.location.hash="#"+this.fragment}var s=window.addEventListener||function(t,e){return attachEvent("on"+t,e)};if(this._usePushState){s("popstate",this.checkUrl,false)}else i
 f(this._useHashChange&&!this.iframe){s("hashchange",this.checkUrl,false)}else if(this._wantsHashChange){this._checkUrlInterval=setInterval(this.checkUrl,this.interval)}if(!this.options.silent)return this.loadUrl()},stop:function(){var t=window.removeEventListener||function(t,e){return detachEvent("on"+t,e)};if(this._usePushState){t("popstate",this.checkUrl,false)}else if(this._useHashChange&&!this.iframe){t("hashchange",this.checkUrl,false)}if(this.iframe){document.body.removeChild(this.iframe);this.iframe=null}if(this._checkUrlInterval)clearInterval(this._checkUrlInterval);N.started=false},route:function(t,e){this.handlers.unshift({route:t,callback:e})},checkUrl:function(t){var e=this.getFragment();if(e===this.fragment&&this.iframe){e=this.getHash(this.iframe.contentWindow)}if(e===this.fragment)return false;if(this.iframe)this.navigate(e);this.loadUrl()},loadUrl:function(t){if(!this.matchRoot())return false;t=this.fragment=this.getFragment(t);return i.some(this.handlers,function(e)
 {if(e.route.test(t)){e.callback(t);return true}})},navigate:function(t,e){if(!N.started)return false;if(!e||e===true)e={trigger:!!e};t=this.getFragment(t||"");var i=this.root;if(t===""||t.charAt(0)==="?"){i=i.slice(0,-1)||"/"}var r=i+t;t=this.decodeFragment(t.replace(U,""));if(this.fragment===t)return;this.fragment=t;if(this._usePushState){this.history[e.replace?"replaceState":"pushState"]({},document.title,r)}else if(this._wantsHashChange){this._updateHash(this.location,t,e.replace);if(this.iframe&&t!==this.getHash(this.iframe.contentWindow)){var n=this.iframe.contentWindow;if(!e.replace){n.document.open();n.document.close()}this._updateHash(n.location,t,e.replace)}}else{return this.location.assign(r)}if(e.trigger)return this.loadUrl(t)},_updateHash:function(t,e,i){if(i){var r=t.href.replace(/(javascript:|#).*$/,"");t.replace(r+"#"+e)}else{t.hash="#"+e}}});e.history=new N;var q=function(t,e){var r=this;var n;if(t&&i.has(t,"constructor")){n=t.constructor}else{n=function(){return r.a
 pply(this,arguments)}}i.extend(n,r,e);n.prototype=i.create(r.prototype,t);n.prototype.constructor=n;n.__super__=r.prototype;return n};y.extend=x.extend=$.extend=k.extend=N.extend=q;var F=function(){throw new Error('A "url" property or function must be specified')};var B=function(t,e){var i=e.error;e.error=function(r){if(i)i.call(e.context,t,r,e);t.trigger("error",t,r,e)}};return e});
+//# sourceMappingURL=backbone-min.map
\ No newline at end of file
diff --git a/src/main/resources/web/js/rs/libs/bootstrap/bootstrap.min.js b/src/main/resources/web/js/rs/libs/bootstrap/bootstrap.min.js
new file mode 100644
index 0000000..133aeec
--- /dev/null
+++ b/src/main/resources/web/js/rs/libs/bootstrap/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.
 handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.5",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a)
 {"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.5",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.pr
 op("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"o
 bject"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),th
 is.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)
 ),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"
 ),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"
 ))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.5",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!
 (e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element
 [c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Construc
 tor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==type
 of b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.5",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h
 =" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.
 find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignore
 BackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTran
 sitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$eleme
 nt.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this
 .$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.ap
 pend(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=nul
 l,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.5",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+t
 his.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a
 (b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=fun
 ction(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k
 .right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.of
 fset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return th
 is.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.to
 p=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.
 getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.5",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",t
 emplate:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var
  d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.5",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.
 scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+
 b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),
+d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.5",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.
 trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constru
 ctor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.5",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=
 c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix
 "+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
\ No newline at end of file
diff --git a/src/main/resources/web/js/rs/libs/d3js/d3-array.v1.min.js b/src/main/resources/web/js/rs/libs/d3js/d3-array.v1.min.js
new file mode 100644
index 0000000..508c424
--- /dev/null
+++ b/src/main/resources/web/js/rs/libs/d3js/d3-array.v1.min.js
@@ -0,0 +1,2 @@
+// https://d3js.org/d3-array/ Version 1.2.1. Copyright 2017 Mike Bostock.
+!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r(n.d3=n.d3||{})}(this,function(n){"use strict";function r(n){return function(r,t){return f(n(r),t)}}function t(n,r){return[n,r]}function e(n,r,t){var e=(r-n)/Math.max(0,t),o=Math.floor(Math.log(e)/Math.LN10),u=e/Math.pow(10,o);return o>=0?(u>=b?10:u>=q?5:u>=L?2:1)*Math.pow(10,o):-Math.pow(10,-o)/(u>=b?10:u>=q?5:u>=L?2:1)}function o(n,r,t){var e=Math.abs(r-n)/Math.max(0,t),o=Math.pow(10,Math.floor(Math.log(e)/Math.LN10)),u=e/o;return u>=b?o*=10:u>=q?o*=5:u>=L&&(o*=2),r<n?-o:o}function u(n){return n.length}var f=function(n,r){return n<r?-1:n>r?1:n>=r?0:NaN},l=function(n){return 1===n.length&&(n=r(n)),{left:function(r,t,e,o){for(null==e&&(e=0),null==o&&(o=r.length);e<o;){var u=e+o>>>1;n(r[u],t)<0?e=u+1:o=u}return e},right:function(r,t,e,o){for(null==e&&(e=0),null==o&&(o=r.length);e<o;){var u=e+o>>>1;n(r[u],t)>0?o=u:e=u+1}return e}}},i=l(f),a=i.righ
 t,h=i.left,c=function(n,r){null==r&&(r=t);for(var e=0,o=n.length-1,u=n[0],f=new Array(o<0?0:o);e<o;)f[e]=r(u,u=n[++e]);return f},s=function(n,r,e){var o,u,f,l,i=n.length,a=r.length,h=new Array(i*a);for(null==e&&(e=t),o=f=0;o<i;++o)for(l=n[o],u=0;u<a;++u,++f)h[f]=e(l,r[u]);return h},g=function(n,r){return r<n?-1:r>n?1:r>=n?0:NaN},M=function(n){return null===n?NaN:+n},v=function(n,r){var t,e,o=n.length,u=0,f=-1,l=0,i=0;if(null==r)for(;++f<o;)isNaN(t=M(n[f]))||(e=t-l,l+=e/++u,i+=e*(t-l));else for(;++f<o;)isNaN(t=M(r(n[f],f,n)))||(e=t-l,l+=e/++u,i+=e*(t-l));if(u>1)return i/(u-1)},p=function(n,r){var t=v(n,r);return t?Math.sqrt(t):t},d=function(n,r){var t,e,o,u=n.length,f=-1;if(null==r){for(;++f<u;)if(null!=(t=n[f])&&t>=t)for(e=o=t;++f<u;)null!=(t=n[f])&&(e>t&&(e=t),o<t&&(o=t))}else for(;++f<u;)if(null!=(t=r(n[f],f,n))&&t>=t)for(e=o=t;++f<u;)null!=(t=r(n[f],f,n))&&(e>t&&(e=t),o<t&&(o=t));return[e,o]},y=Array.prototype,N=y.slice,m=y.map,w=function(n){return function(){return n}},A=functio
 n(n){return n},x=function(n,r,t){n=+n,r=+r,t=(o=arguments.length)<2?(r=n,n=0,1):o<3?1:+t;for(var e=-1,o=0|Math.max(0,Math.ceil((r-n)/t)),u=new Array(o);++e<o;)u[e]=n+e*t;return u},b=Math.sqrt(50),q=Math.sqrt(10),L=Math.sqrt(2),k=function(n,r,t){var o,u,f,l,i=-1;if(r=+r,n=+n,t=+t,n===r&&t>0)return[n];if((o=r<n)&&(u=n,n=r,r=u),0===(l=e(n,r,t))||!isFinite(l))return[];if(l>0)for(n=Math.ceil(n/l),r=Math.floor(r/l),f=new Array(u=Math.ceil(r-n+1));++i<u;)f[i]=(n+i)*l;else for(n=Math.floor(n*l),r=Math.ceil(r*l),f=new Array(u=Math.ceil(n-r+1));++i<u;)f[i]=(n-i)/l;return o&&f.reverse(),f},S=function(n){return Math.ceil(Math.log(n.length)/Math.LN2)+1},j=function(){function n(n){var u,f,l=n.length,i=new Array(l);for(u=0;u<l;++u)i[u]=r(n[u],u,n);var h=t(i),c=h[0],s=h[1],g=e(i,c,s);Array.isArray(g)||(g=o(c,s,g),g=x(Math.ceil(c/g)*g,Math.floor(s/g)*g,g));for(var M=g.length;g[0]<=c;)g.shift(),--M;for(;g[M-1]>s;)g.pop(),--M;var v,p=new Array(M+1);for(u=0;u<=M;++u)v=p[u]=[],v.x0=u>0?g[u-1]:c,v.x1=u<M
 ?g[u]:s;for(u=0;u<l;++u)f=i[u],c<=f&&f<=s&&p[a(g,f,0,M)].push(n[u]);return p}var r=A,t=d,e=S;return n.value=function(t){return arguments.length?(r="function"==typeof t?t:w(t),n):r},n.domain=function(r){return arguments.length?(t="function"==typeof r?r:w([r[0],r[1]]),n):t},n.thresholds=function(r){return arguments.length?(e="function"==typeof r?r:w(Array.isArray(r)?N.call(r):r),n):e},n},F=function(n,r,t){if(null==t&&(t=M),e=n.length){if((r=+r)<=0||e<2)return+t(n[0],0,n);if(r>=1)return+t(n[e-1],e-1,n);var e,o=(e-1)*r,u=Math.floor(o),f=+t(n[u],u,n);return f+(+t(n[u+1],u+1,n)-f)*(o-u)}},_=function(n,r,t){return n=m.call(n,M).sort(f),Math.ceil((t-r)/(2*(F(n,.75)-F(n,.25))*Math.pow(n.length,-1/3)))},z=function(n,r,t){return Math.ceil((t-r)/(3.5*p(n)*Math.pow(n.length,-1/3)))},D=function(n,r){var t,e,o=n.length,u=-1;if(null==r){for(;++u<o;)if(null!=(t=n[u])&&t>=t)for(e=t;++u<o;)null!=(t=n[u])&&t>e&&(e=t)}else for(;++u<o;)if(null!=(t=r(n[u],u,n))&&t>=t)for(e=t;++u<o;)null!=(t=r(n[u],u,n))&&
 t>e&&(e=t);return e},I=function(n,r){var t,e=n.length,o=e,u=-1,f=0;if(null==r)for(;++u<e;)isNaN(t=M(n[u]))?--o:f+=t;else for(;++u<e;)isNaN(t=M(r(n[u],u,n)))?--o:f+=t;if(o)return f/o},O=function(n,r){var t,e=n.length,o=-1,u=[];if(null==r)for(;++o<e;)isNaN(t=M(n[o]))||u.push(t);else for(;++o<e;)isNaN(t=M(r(n[o],o,n)))||u.push(t);return F(u.sort(f),.5)},P=function(n){for(var r,t,e,o=n.length,u=-1,f=0;++u<o;)f+=n[u].length;for(t=new Array(f);--o>=0;)for(e=n[o],r=e.length;--r>=0;)t[--f]=e[r];return t},R=function(n,r){var t,e,o=n.length,u=-1;if(null==r){for(;++u<o;)if(null!=(t=n[u])&&t>=t)for(e=t;++u<o;)null!=(t=n[u])&&e>t&&(e=t)}else for(;++u<o;)if(null!=(t=r(n[u],u,n))&&t>=t)for(e=t;++u<o;)null!=(t=r(n[u],u,n))&&e>t&&(e=t);return e},B=function(n,r){for(var t=r.length,e=new Array(t);t--;)e[t]=n[r[t]];return e},C=function(n,r){if(t=n.length){var t,e,o=0,u=0,l=n[u];for(null==r&&(r=f);++o<t;)(r(e=n[o],l)<0||0!==r(l,l))&&(l=e,u=o);return 0===r(l,l)?u:void 0}},E=function(n,r,t){for(var e,o,u=
 (null==t?n.length:t)-(r=null==r?0:+r);u;)o=Math.random()*u--|0,e=n[u+r],n[u+r]=n[o+r],n[o+r]=e;return n},G=function(n,r){var t,e=n.length,o=-1,u=0;if(null==r)for(;++o<e;)(t=+n[o])&&(u+=t);else for(;++o<e;)(t=+r(n[o],o,n))&&(u+=t);return u},H=function(n){if(!(o=n.length))return[];for(var r=-1,t=R(n,u),e=new Array(t);++r<t;)for(var o,f=-1,l=e[r]=new Array(o);++f<o;)l[f]=n[f][r];return e},J=function(){return H(arguments)};n.bisect=a,n.bisectRight=a,n.bisectLeft=h,n.ascending=f,n.bisector=l,n.cross=s,n.descending=g,n.deviation=p,n.extent=d,n.histogram=j,n.thresholdFreedmanDiaconis=_,n.thresholdScott=z,n.thresholdSturges=S,n.max=D,n.mean=I,n.median=O,n.merge=P,n.min=R,n.pairs=c,n.permute=B,n.quantile=F,n.range=x,n.scan=C,n.shuffle=E,n.sum=G,n.ticks=k,n.tickIncrement=e,n.tickStep=o,n.transpose=H,n.variance=v,n.zip=J,Object.defineProperty(n,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/src/main/resources/web/js/rs/libs/d3js/d3-geo-projection.v2.min.js b/src/main/resources/web/js/rs/libs/d3js/d3-geo-projection.v2.min.js
new file mode 100644
index 0000000..1d93da8
--- /dev/null
+++ b/src/main/resources/web/js/rs/libs/d3js/d3-geo-projection.v2.min.js
@@ -0,0 +1,2 @@
+// https://d3js.org/d3-geo-projection/ Version 2.3.2. Copyright 2017 Mike Bostock.
+!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("d3-geo"),require("d3-array")):"function"==typeof define&&define.amd?define(["exports","d3-geo","d3-array"],r):r(n.d3=n.d3||{},n.d3,n.d3)}(this,function(n,r,e){"use strict";function t(n){return n>1?Mr:n<-1?-Mr:Math.asin(n)}function o(n){return n>1?0:n<-1?jr:Math.acos(n)}function i(n){return n>0?Math.sqrt(n):0}function u(n){return(gr(n)-gr(-n))/2}function a(n){return(gr(n)+gr(-n))/2}function c(n){function r(n,r){var e=lr(n),t=lr(r),i=mr(r),u=t*e,a=-((1-u?sr((1+u)/2)/(1-u):-.5)+o/(1+u));return[a*t*mr(n),a*i]}var e=Pr(n/2),o=2*sr(lr(n/2))/(e*e);return r.invert=function(r,e){var u,a=i(r*r+e*e),c=-n/2,f=50;if(!a)return[0,0];do{var l=c/2,g=lr(l),v=mr(l),s=Pr(l),p=sr(1/g);c-=u=(2/s*p-o*s-a)/(-p/(v*v)+1-o/(2*g*g))}while(ar(u)>Rr&&--f>0);var h=mr(c);return[fr(r*h,a*lr(c)),t(e*h/a)]},r}function f(n,r){var e=lr(r),t=function(n){return n?n/Math.sin(n):1}(o(e*lr(n/=2)));return[2*e*mr(n)*t,mr(r)*t]}function l(n)
 {function r(n,r){var a=lr(r),c=lr(n/=2);return[(1+a)*mr(n),(o*r>-fr(c,i)-.001?0:10*-o)+u+mr(r)*t-(1+a)*e*c]}var e=mr(n),t=lr(n),o=n>=0?1:-1,i=Pr(o*n),u=(1+e-t)/2;return r.invert=function(n,r){var a=0,c=0,f=50;do{var l=lr(a),g=mr(a),v=lr(c),s=mr(c),p=1+v,h=p*g-n,d=u+s*t-p*e*l-r,w=p*l/2,y=-g*s,m=e*p*g/2,P=t*v+e*l*s,R=y*m-P*w,b=(d*y-h*P)/R/2,j=(h*m-d*w)/R;a-=b,c-=j}while((ar(b)>Rr||ar(j)>Rr)&&--f>0);return o*c>-fr(lr(a),i)-.001?[2*a,c]:null},r}function g(n,r){var e=Pr(r/2),t=i(1-e*e),o=1+t*lr(n/=2),u=mr(n)*t/o,a=e/o,c=u*u,f=a*a;return[4/3*u*(3+c-3*f),4/3*a*(3+3*c-f)]}function v(n,r){var e=ar(r);return e<Er?[n,sr(Pr(Er+r/2))]:[n*lr(e)*(2*Sr-1/mr(e)),yr(r)*(2*Sr*(e-Er)-sr(Pr(e/2)))]}function s(n){function e(n,e){var o=r.geoAzimuthalEquidistantRaw(n,e);if(ar(n)>Mr){var a=fr(o[1],o[0]),c=i(o[0]*o[0]+o[1]*o[1]),f=u*wr((a-Mr)/u)+Mr,l=fr(mr(a-=f),2-lr(a));a=f+t(jr/c*mr(l))-l,o[0]=c*lr(a),o[1]=c*mr(a)}return o}var u=2*jr/n;return e.invert=function(n,e){var t=i(n*n+e*e);if(t>Mr){var a=fr(e,n),c
 =u*wr((a-Mr)/u)+Mr,f=a>c?-1:1,l=t*lr(c-a),g=1/Pr(f*o((l-jr)/i(jr*(jr-2*l)+t*t)));a=c+2*cr((g+f*i(g*g-3))/3),n=t*lr(a),e=t*mr(a)}return r.geoAzimuthalEquidistantRaw.invert(n,e)},e}function p(n,e){function t(t,o){var i=r.geoAzimuthalEqualAreaRaw(t/e,o);return i[0]*=n,i}return arguments.length<2&&(e=n),1===e?r.geoAzimuthalEqualAreaRaw:e===1/0?h:(t.invert=function(t,o){var i=r.geoAzimuthalEqualAreaRaw.invert(t/n,o);return i[0]*=e,i},t)}function h(n,r){return[n*lr(r)/lr(r/=2),2*mr(r)]}function d(){var n=p(1.68,2);return function(r,e){if(r+e<-1.4){var t=(r-e+1.6)*(r+e+1.4)/8;r+=t,e-=.8*t*mr(e+jr/2)}var o=n(r,e),i=(1-lr(r*e))/12;return o[1]<0&&(o[0]*=1+i),o[1]>0&&(o[1]*=1+i/1.5*o[0]*o[0]),o}}function w(n,r){var e,t=n*mr(r),o=30;do{r-=e=(r+mr(r)-t)/(1+lr(r))}while(ar(e)>Rr&&--o>0);return r/2}function y(n,r,e){function o(t,o){return[n*t*lr(o=w(e,o)),r*mr(o)]}return o.invert=function(o,i){return i=t(i/r),[o/(n*lr(i)),t((2*i+mr(2*i))/e)]},o}function m(n,r){var e=w(jr,r);return[qr*n/(1/lr(r)+Br
 /lr(e)),(r+Sr*mr(e))/qr]}function P(n,r){return[n*lr(r),r]}function R(n){function r(r,t){var o=e+n-t,i=o?r*lr(t)/o:o;return[o*mr(i),e-o*lr(i)]}if(!n)return P;var e=1/Pr(n);return r.invert=function(r,t){var o=i(r*r+(t=e-t)*t),u=e+n-o;return[o/lr(u)*fr(r,t),u]},r}function b(n){function r(r,e){var t=Mr-e,o=t?r*n*mr(t)/t:t;return[t*mr(o)/n,Mr-t*lr(o)]}return r.invert=function(r,e){var t=r*n,o=Mr-e,u=i(t*t+o*o),a=fr(t,o);return[(u?u/mr(u):1)*a/n,Mr-u]},r}function j(n,r,e,u,a,c){var f,l=lr(c);if(ar(n)>1||ar(c)>1)f=o(e*a+r*u*l);else{var g=mr(n/2),v=mr(c/2);f=2*t(i(g*g+r*u*v*v))}return ar(f)>Rr?[f,fr(u*mr(c),r*a-e*u*l)]:[0,0]}function M(n,r,e){return o((n*n+r*r-e*e)/(2*n*r))}function E(n){return n-2*jr*vr((n+jr)/(2*jr))}function A(n,r,e){for(var t,o=[[n[0],n[1],mr(n[1]),lr(n[1])],[r[0],r[1],mr(r[1]),lr(r[1])],[e[0],e[1],mr(e[1]),lr(e[1])]],i=o[2],u=0;u<3;++u,i=t)t=o[u],i.v=j(t[1]-i[1],i[3],i[2],t[3],t[2],t[0]-i[0]),i.point=[0,0];var a=M(o[0].v[0],o[2].v[0],o[1].v[0]),c=M(o[0].v[0],o[1].v[0]
 ,o[2].v[0]),f=jr-a;o[2].point[1]=0,o[0].point[0]=-(o[1].point[0]=o[0].v[0]/2);var l=[o[2].point[0]=o[0].point[0]+o[2].v[0]*lr(a),2*(o[0].point[1]=o[1].point[1]=o[2].v[0]*mr(a))];return function(n,r){var e,t=mr(r),i=lr(r),u=new Array(3);for(e=0;e<3;++e){var a=o[e];if(u[e]=j(r-a[1],a[3],a[2],i,t,n-a[0]),!u[e][0])return a.point;u[e][1]=E(u[e][1]-a.v[1])}var g=l.slice();for(e=0;e<3;++e){var v=2==e?0:e+1,s=M(o[e].v[0],u[e][0],u[v][0]);u[e][1]<0&&(s=-s),e?1==e?(s=c-s,g[0]-=u[e][0]*lr(s),g[1]-=u[e][0]*mr(s)):(s=f-s,g[0]+=u[e][0]*lr(s),g[1]+=u[e][0]*mr(s)):(g[0]+=u[e][0]*lr(s),g[1]-=u[e][0]*mr(s))}return g[0]/=3,g[1]/=3,g}}function S(n){return n[0]*=Cr,n[1]*=Cr,n}function k(n,e,t){var o=r.geoCentroid({type:"MultiPoint",coordinates:[n,e,t]}),i=[-o[0],-o[1]],u=r.geoRotation(i),a=r.geoProjection(A(S(u(n)),S(u(e)),S(u(t)))).rotate(i),c=a.center;return delete a.rotate,a.center=function(n){return arguments.length?c(u(n)):u.invert(c())},a.clipAngle(90)}function x(n,r){var e=i(1-mr(r));return[2/kr*
 n*e,kr*(1-e)]}function G(n){function r(n,r){return[n,(n?n/mr(n):1)*(mr(r)*lr(n)-e*lr(r))]}var e=Pr(n);return r.invert=e?function(n,r){n&&(r*=mr(n)/n);var t=lr(n);return[n,2*fr(i(t*t+e*e-r*r)-t,e-r)]}:function(n,r){return[n,t(n?r*Pr(n)/n:r)]},r}function C(n,r){return[Wr*n*(2*lr(2*r/3)-1)/kr,Wr*kr*mr(r/3)]}function z(n){function r(n,r){return[n*e,mr(r)/e]}var e=lr(n);return r.invert=function(n,r){return[n/e,t(r*e)]},r}function F(n){function r(n,r){return[n*e,(1+e)*Pr(r/2)]}var e=lr(n);return r.invert=function(n,r){return[n/e,2*cr(r/(1+e))]},r}function L(n,r){var e=i(8/(3*jr));return[e*n*(1-ar(r)/jr),e*r]}function q(n,r){var e=i(4-3*mr(ar(r)));return[2/i(6*jr)*n*e,yr(r)*i(2*jr/3)*(2-e)]}function B(n,r){var e=i(jr*(4+jr));return[2/e*n*(1+i(1-4*r*r/(jr*jr))),4/e*r]}function H(n,r){var e=(2+Mr)*mr(r);r/=2;for(var t=0,o=1/0;t<10&&ar(o)>Rr;t++){var u=lr(r);r-=o=(r+mr(r)*(u+2)-e)/(2*u*(1+u))}return[2/i(jr*(4+jr))*n*(1+lr(r)),2*i(jr/(4+jr))*mr(r)]}function I(n,r){return[n*(1+lr(r))/i(2+jr),2*
 r/i(2+jr)]}function W(n,r){for(var e=(1+Mr)*mr(r),t=0,o=1/0;t<10&&ar(o)>Rr;t++)r-=o=(r+mr(r)-e)/(1+lr(r));return e=i(2+jr),[n*(1+lr(r))/e,2*r/e]}function T(n,r){var e=mr(n/=2),t=lr(n),o=i(lr(r)),u=lr(r/=2),a=mr(r)/(u+Sr*t*o),c=i(2/(1+a*a)),f=i((Sr*u+(t+e)*o)/(Sr*u+(t-e)*o));return[Tr*(c*(f-1/f)-2*sr(f)),Tr*(c*a*(f+1/f)-2*cr(a))]}function D(n,r){var e=Pr(r/2);return[n*Dr*i(1-e*e),(1+Dr)*e]}function N(n,r){var e=r/2,t=lr(e);return[2*n/kr*lr(r)*t*t,kr*Pr(e)]}function Q(n){return[n[0]/2,t(Pr(n[1]/2*Cr))*Gr]}function V(n){return[2*n[0],2*cr(mr(n[1]*Cr))*Gr]}function _(n,e){function t(e,t){var a=r.geoAzimuthalEquidistantRaw(e,t),c=a[0],f=a[1],l=c*c+f*f;if(l>u){var g=i(l),v=fr(f,c),s=o*wr(v/o),p=v-s,h=n*lr(p),d=(n*mr(p)-p*mr(h))/(Mr-h),w=K(p,d),y=(jr-n)/O(w,h,jr);c=g;var m,P=50;do{c-=m=(n+O(w,h,c)*y-g)/(w(c)*y)}while(ar(m)>Rr&&--P>0);f=p*mr(c),c<Mr&&(f-=d*(c-Mr));var R=mr(s),b=lr(s);a[0]=c*b-f*R,a[1]=c*R+f*b}return a}var o=2*jr/e,u=n*n;return t.invert=function(e,t){var a=e*e+t*t;if(a>u){va
 r c=i(a),f=fr(t,e),l=o*wr(f/o),g=f-l;e=c*lr(g),t=c*mr(g);for(var v=e-Mr,s=mr(e),p=t/s,h=e<Mr?1/0:0,d=10;;){var w=n*mr(p),y=n*lr(p),m=mr(y),P=Mr-y,R=(w-p*m)/P,b=K(p,R);if(ar(h)<br||!--d)break;p-=h=(p*s-R*v-t)/(s-2*v*(P*(y+p*w*lr(y)-m)-w*(w-p*m))/(P*P))}e=(c=n+O(b,y,e)*(jr-n)/O(b,y,jr))*lr(f=l+p),t=c*mr(f)}return r.geoAzimuthalEquidistantRaw.invert(e,t)},t}function K(n,r){return function(e){var t=n*lr(e);return e<Mr&&(t-=r),i(1+t*t)}}function O(n,r,e){for(var t=(e-r)/50,o=n(r)+n(e),i=1,u=r;i<50;++i)o+=2*n(u+=t);return.5*o*t}function U(n,r){var e=n*n,t=r*r;return[n*(1-.162388*t)*(.87-952426e-9*e*e),r*(1+t/12)]}function J(n,r){var e=yr(n),o=yr(r),u=lr(r),a=lr(n)*u,c=mr(n)*u,f=mr(o*r);n=ar(fr(c,f)),r=t(a),ar(n-Mr)>Rr&&(n%=Mr);var l=function(n,r){if(r===Mr)return[0,0];var e,o,u=mr(r),a=u*u,c=a*a,f=1+c,l=1+3*c,g=1-c,v=t(1/i(f)),s=g+a*f*v,p=(1-u)/s,h=i(p),d=p*f,w=i(d),y=h*g;if(0===n)return[0,-(y+a*w)];var m,P=lr(r),R=1/P,b=2*u*P,j=(-s*P-(-3*a+v*l)*b*(1-u))/(s*s),M=-R*b,E=-R*(a*f*j+p*l*b),A=
 -2*R*(g*(.5*j/h)-2*a*h*b),S=4*n/jr;if(n>.222*jr||r<jr/4&&n>.175*jr){if(e=(y+a*i(d*(1+c)-y*y))/(1+c),n>jr/4)return[e,e];var k=e,x=.5*e;e=.5*(x+k),o=50;do{var G=i(d-e*e),C=e*(A+M*G)+E*t(e/w)-S;if(!C)break;C<0?x=e:k=e,e=.5*(x+k)}while(ar(k-x)>Rr&&--o>0)}else{e=Rr,o=25;do{var z=e*e,F=i(d-z),L=A+M*F,q=e*L+E*t(e/w)-S,B=L+(E-M*z)/F;e-=m=F?q/B:0}while(ar(m)>Rr&&--o>0)}return[e,-y-a*i(d-e*e)]}(n>jr/4?Mr-n:n,r);return n>jr/4&&(f=l[0],l[0]=-l[1],l[1]=-f),l[0]*=e,l[1]*=-o,l}function X(n,r){var e,o,c,f,l;if(r<Rr)return f=mr(n),o=lr(n),e=r*(n-f*o)/4,[f-e*o,o+e*f,1-r*f*f/2,n-e];if(r>=1-Rr)return e=(1-r)/4,o=a(n),f=function(n){return((n=gr(2*n))-1)/(n+1)}(n),c=1/o,l=o*u(n),[f+e*(l-n)/(o*o),c-e*f*c*(l-n),c+e*f*c*(l+n),2*cr(gr(n))-Mr+e*(l-n)/o];var g=[1,0,0,0,0,0,0,0,0],v=[i(r),0,0,0,0,0,0,0,0],s=0;for(o=i(1-r),l=1;ar(v[s]/g[s])>Rr&&s<8;)e=g[s++],v[s]=(e-o)/2,g[s]=(e+o)/2,o=i(e*o),l*=2;c=l*g[s]*n;do{c=(t(f=v[s]*mr(o=c)/g[s])+c)/2}while(--s);return[mr(c),f=lr(c),f/lr(c-o),c]}function Y(n,r){if(!r)retu
 rn n;if(1===r)return sr(Pr(n/2+Er));for(var e=1,t=i(1-r),o=i(r),u=0;ar(o)>Rr;u++){if(n%jr){var a=cr(t*Pr(n)/e);a<0&&(a+=jr),n+=a+~~(n/jr)*jr}else n+=n;o=(e+t)/2,t=i(e*t),o=((e=o)-t)/2}return n/(dr(2,u)*e)}function Z(n,r){var e=(Sr-1)/(Sr+1),t=i(1-e*e),o=Y(Mr,t*t),a=sr(Pr(jr/4+ar(r)/2)),c=gr(-1*a)/i(e),f=function(n,r){var e=n*n,t=r+1,o=1-e-r*r;return[.5*((n>=0?Mr:-Mr)-fr(o,2*n)),-.25*sr(o*o+4*e)+.5*sr(t*t+e)]}(c*lr(-1*n),c*mr(-1*n)),l=function(n,r,e){var t=ar(n),o=u(ar(r));if(t){var a=1/mr(t),c=1/(Pr(t)*Pr(t)),f=-(c+e*(o*o*a*a)-1+e),l=(-f+i(f*f-(e-1)*c*4))/2;return[Y(cr(1/i(l)),e)*yr(n),Y(cr(i((l/c-1)/e)),1-e)*yr(r)]}return[0,Y(cr(o),1-e)*yr(r)]}(f[0],f[1],t*t);return[-l[1],(r>=0?1:-1)*(.5*o-l[0])]}function $(n){function r(n,r){var i=u(n,r);n=i[0],r=i[1];var a=mr(r),c=lr(r),f=lr(n),l=o(e*a+t*c*f),g=mr(l),v=ar(g)>Rr?l/g:1;return[v*t*mr(n),(ar(n)>Mr?v:-v)*(e*c-t*a*f)]}var e=mr(n),t=lr(n),u=nn(n);return u.invert=nn(-n),r.invert=function(n,r){var t=i(n*n+r*r),o=-mr(t),a=lr(t),c=t*a,f=-r*
 o,l=t*e,g=i(c*c+f*f-l*l),v=fr(c*l+f*g,f*l-c*g),s=(t>Mr?-1:1)*fr(n*o,t*lr(v)*a+r*mr(v)*o);return u.invert(s,v)},r}function nn(n){var r=mr(n),e=lr(n);return function(n,o){var i=lr(o),u=lr(n)*i,a=mr(n)*i,c=mr(o);return[fr(a,u*e-c*r),t(c*e+u*r)]}}function rn(n){function r(r,l){var g,v=ar(l);if(v>e){var s=hr(n-1,pr(0,vr((r+jr)/a)));(g=x(r+=jr*(n-1)/n-s*a,v))[0]=g[0]*xr/t-xr*(n-1)/(2*n)+s*xr/n,g[1]=o+4*(g[1]-i)*u/xr,l<0&&(g[1]=-g[1])}else g=Jr(r,l);return g[0]*=c,g[1]/=f,g}var e=Ur*Cr,t=x(jr,e)[0]-x(-jr,e)[0],o=Jr(0,e)[1],i=x(0,e)[1],u=kr-i,a=xr/n,c=4/xr,f=o+u*u*4/xr;return r.invert=function(r,e){r/=c;var l=ar(e*=f);if(l>o){var g=hr(n-1,pr(0,vr((r+jr)/a))),v=x.invert(r=(r+jr*(n-1)/n-g*a)*t/xr,.25*(l-o)*xr/u+i);return v[0]-=jr*(n-1)/n-g*a,e<0&&(v[1]=-v[1]),v}return Jr.invert(r,e)},r}function en(n){function r(r,t){var o,v,s=1-mr(t);if(s&&s<2){var p,h=Mr-t,d=25;do{var w=mr(h),y=lr(h),m=a+fr(w,u-y),P=1+g-2*u*y;h-=p=(h-l*a-u*w+P*m-.5*s*e)/(2*u*w*m)}while(ar(p)>br&&--d>0);o=c*i(P),v=r*m/jr}else
  o=c*(n+s),v=r*a/jr;return[o*mr(v),f-o*lr(v)]}var e,u=1+n,a=t(mr(1/u)),c=2*i(jr/(e=jr+4*a*u)),f=.5*c*(u+i(n*(2+n))),l=n*n,g=u*u;return r.invert=function(n,r){var v=n*n+(r-=f)*r,s=(1+g-v/(c*c))/(2*u),p=o(s),h=mr(p),d=a+fr(h,u-s);return[t(n/i(v))*jr/d,t(1-2*(p-l*a-u*h+(1+g-2*u*s)*d)/e)]},r}function tn(n,r){return r>-Xr?(n=Lr(n,r),n[1]+=Yr,n):P(n,r)}function on(n,r){return ar(r)>Xr?(n=Lr(n,r),n[1]-=r>0?Yr:-Yr,n):P(n,r)}function un(n,r){return ar(n[0]-r[0])<Rr&&ar(n[1]-r[1])<Rr}function an(n,r){for(var e,t,o,i=-1,u=n.length,a=n[0],c=[];++i<u;){t=((e=n[i])[0]-a[0])/r,o=(e[1]-a[1])/r;for(var f=0;f<r;++f)c.push([a[0]+f*t,a[1]+f*o]);a=e}return c.push(e),c}function cn(n,r){return[3/xr*n*i(jr*jr/3-r*r),r]}function fn(n){function r(r,e){if(ar(ar(e)-Mr)<Rr)return[0,e<0?-2:2];var t=mr(e),o=dr((1+t)/(1-t),n/2),i=.5*(o+1/o)+lr(r*=n);return[2*mr(r)/i,(o-1/o)/i]}return r.invert=function(r,e){var o=ar(e);if(ar(o-2)<Rr)return r?null:[0,yr(e)*Mr];if(o>2)return null;var i=(r/=2)*r,u=(e/=2)*e,a=2*e/(1+i+
 u);return a=dr((1+a)/(1-a),1/n),[fr(2*r,1-i-u)/n,t((a-1)/(a+1))]},r}function ln(n,r){return[n*(1+i(lr(r)))/2,r/(lr(r/2)*lr(n/6))]}function gn(n,r){var e=n*n,t=r*r;return[n*(.975534+t*(-.0143059*e-.119161+-.0547009*t)),r*(1.00384+e*(.0802894+-.02855*t+199025e-9*e)+t*(.0998909+-.0491032*t))]}function vn(n,r){return[mr(n)/lr(r),Pr(r)*lr(n)]}function sn(n){function r(r,o){var i=o-n,u=ar(i)<Rr?r*e:ar(u=Er+o/2)<Rr||ar(ar(u)-Mr)<Rr?0:r*i/sr(Pr(u)/t);return[u,i]}var e=lr(n),t=Pr(Er+n/2);return r.invert=function(r,o){var i,u=o+n;return[ar(o)<Rr?r/e:ar(i=Er+u/2)<Rr||ar(ar(i)-Mr)<Rr?0:r*sr(Pr(i)/t)/o,u]},r}function pn(n,r){return[n,1.25*sr(Pr(Er+.4*r))]}function hn(n){function r(r,t){for(var o,i=lr(t),u=2/(1+i*lr(r)),a=u*i*mr(r),c=u*mr(t),f=e,l=n[f],g=l[0],v=l[1];--f>=0;)g=(l=n[f])[0]+a*(o=g)-c*v,v=l[1]+a*v+c*o;return g=a*(o=g)-c*v,v=a*v+c*o,[g,v]}var e=n.length-1;return r.invert=function(r,o){var u=20,a=r,c=o;do{for(var f,l=e,g=n[l],v=g[0],s=g[1],p=0,h=0;--l>=0;)p=v+a*(f=p)-c*h,h=s+a*h+c*f,v=
 (g=n[l])[0]+a*(f=v)-c*s,s=g[1]+a*s+c*f;var d,w,y=(p=v+a*(f=p)-c*h)*p+(h=s+a*h+c*f)*h;a-=d=((v=a*(f=v)-c*s-r)*p+(s=a*s+c*f-o)*h)/y,c-=w=(s*p-v*h)/y}while(ar(d)+ar(w)>Rr*Rr&&--u>0);if(u){var m=i(a*a+c*c),P=2*cr(.5*m),R=mr(P);return[fr(a*R,m*lr(P)),m?t(c*R/m):0]}},r}function dn(n,e){var t=r.geoProjection(hn(n)).rotate(e).clipAngle(90),o=r.geoRotation(e),i=t.center;return delete t.rotate,t.center=function(n){return arguments.length?i(o(n)):o.invert(i())},t}function wn(n,r){var e=t(7*mr(r)/(3*ge));return[ge*n*(2*lr(2*e/3)-1)/ve,9*mr(e/3)/ve]}function yn(n,r){for(var e,t=(1+Ar)*mr(r),o=r,u=0;u<25&&(o-=e=(mr(o/2)+mr(o)-t)/(.5*lr(o/2)+lr(o)),!(ar(e)<Rr));u++);return[n*(1+2*lr(o)/lr(o/2))/(3*Sr),2*i(3)*mr(o/2)/i(2+Sr)]}function mn(n,r){for(var e,t=i(6/(4+jr)),o=(1+jr/4)*mr(r),u=r/2,a=0;a<25&&(u-=e=(u/2+mr(u)-o)/(.5+lr(u)),!(ar(e)<Rr));a++);return[t*(.5+lr(u))*n/1.5,t*u]}function Pn(n,r){var e=r*r,t=e*e,o=e*t;return[n*(.84719-.13063*e+o*o*(.05494*e-.04515-.02326*t+.00331*o)),r*(1.01183+t*t*(.
 01926*e-.02625-.00396*t))]}function Rn(n,r){return[n*(1+lr(r))/2,2*(r-Pr(r/2))]}function bn(n,r){var e=r*r;return[n,r*(se+e*e*(pe+e*(he+de*e)))]}function jn(n,r){if(ar(r)<Rr)return[n,0];var e=Pr(r),t=n*mr(r);return[mr(t)/e,r+(1-lr(t))/e]}function Mn(n,r){return[n[0]*r[0]+n[1]*r[3],n[0]*r[1]+n[1]*r[4],n[0]*r[2]+n[1]*r[5]+n[2],n[3]*r[0]+n[4]*r[3],n[3]*r[1]+n[4]*r[4],n[3]*r[2]+n[4]*r[5]+n[5]]}function En(n,r){return[n[0]-r[0],n[1]-r[1]]}function An(n){return i(n[0]*n[0]+n[1]*n[1])}function Sn(n,e,t){var o,i,u=e.edges,a=u.length,c={type:"MultiPoint",coordinates:e.face},f=e.face.filter(function(n){return 90!==ar(n[1])}),l=r.geoBounds({type:"MultiPoint",coordinates:f}),g=!1,v=-1,s=l[1][0]-l[0][0],p=180===s||360===s?[(l[0][0]+l[1][0])/2,(l[0][1]+l[1][1])/2]:r.geoCentroid(c);if(t)for(;++v<a&&u[v]!==t;);++v;for(var h=0;h<a;++h)i=u[(h+v)%a],Array.isArray(i)?(g||(n.point((o=r.geoInterpolate(i[0],p)(Rr))[0],o[1]),g=!0),n.point((o=r.geoInterpolate(i[1],p)(Rr))[0],o[1])):(g=!1,i!==t&&Sn(n,i,e))}f
 unction kn(n,r){return n&&r&&n[0]===r[0]&&n[1]===r[1]}function xn(n){return n.project.invert||n.children&&n.children.some(xn)}function Gn(n,r){var e=x(n,r);return[e[0]*Ae,e[1]]}function Cn(n,r){for(var e=0,t=n.length,o=0;e<t;++e)o+=n[e]*r[e];return o}function zn(n){return[fr(n[1],n[0])*Gr,t(pr(-1,hr(1,n[2])))*Gr]}function Fn(n){var r=n[0]*Cr,e=n[1]*Cr,t=lr(e);return[t*lr(r),t*mr(r),mr(e)]}function Ln(n,r){return{type:"FeatureCollection",features:n.features.map(function(n){return qn(n,r)})}}function qn(n,r){return{type:"Feature",id:n.id,properties:n.properties,geometry:Bn(n.geometry,r)}}function Bn(n,e){if(!n)return null;if("GeometryCollection"===n.type)return function(n,r){return{type:"GeometryCollection",geometries:n.geometries.map(function(n){return Bn(n,r)})}}(n,e);var t;switch(n.type){case"Point":case"MultiPoint":t=Ge;break;case"LineString":case"MultiLineString":t=Ce;break;case"Polygon":case"MultiPolygon":case"Sphere":t=ze;break;default:return null}return r.geoStream(n,e(t)),t.r
 esult()}function Hn(n){function r(r,t){var o=e?Pr(r*e/2)/e:r/2;if(!t)return[2*o,-n];var i=2*cr(o*mr(t)),u=1/Pr(t);return[mr(i)*u,t+(1-lr(i))*u-n]}var e=mr(n);return r.invert=function(r,i){if(ar(i+=n)<Rr)return[e?2*cr(e*r/2)/e:r,0];var u,a=r*r+i*i,c=0,f=10;do{var l=Pr(c),g=1/lr(c),v=a-2*i*c+c*c;c-=u=(l*v+2*(c-i))/(2+v*g*g+2*(c-i)*l)}while(ar(u)>Rr&&--f>0);var s=r*(l=Pr(c)),p=Pr(ar(i)<ar(c+1/l)?.5*t(s):.5*o(s)+jr/4)/mr(c);return[e?2*cr(e*p)/e:2*p,c]},r}function In(n,r){var e,t=hr(18,36*ar(r)/jr),o=vr(t),i=t-o,u=(e=qe[o])[0],a=e[1],c=(e=qe[++o])[0],f=e[1],l=(e=qe[hr(19,++o)])[0],g=e[1];return[n*(c+i*(l-u)/2+i*i*(l-2*c+u)/2),(r>0?Mr:-Mr)*(f+i*(g-a)/2+i*i*(g-2*f+a)/2)]}function Wn(n,r){function e(r,e){var t=o(r,e),i=t[1],c=i*a/(n-1)+u;return[t[0]*u/c,i/c]}var o=function(n){function r(r,e){var t=lr(e),o=(n-1)/(n-t*lr(r));return[o*t*mr(r),o*mr(e)]}return r.invert=function(r,e){var o=r*r+e*e,u=i(o),a=(n-i(1-o*(n+1)/(n-1)))/((n-1)/u+u/(n-1));return[fr(r*a,u*i(1-a*a)),u?t(e*a/u):0]},r}(n);if(
 !r)return o;var u=lr(r),a=mr(r);return e.invert=function(r,e){var t=(n-1)/(n-1-e*a);return o.invert(t*r,t*e*u)},e}function Tn(n){return n.length>0}function Dn(n){return n===De||n===Qe?[0,n]:[He,function(n){return Math.floor(n*Be)/Be}(n)]}function Nn(n){var r=n[0],e=n[1],t=!1;return r<=Ie?(r=He,t=!0):r>=Te&&(r=We,t=!0),e<=Ne?(e=De,t=!0):e>=Ve&&(e=Qe,t=!0),t?[r,e]:n}function Qn(n){return n.map(Nn)}function Vn(n,r,e){for(var t=0,o=n.length;t<o;++t){var i=n[t].slice();e.push({index:-1,polygon:r,ring:i});for(var u=0,a=i.length;u<a;++u){var c=i[u],f=c[0],l=c[1];if(f<=Ie||f>=Te||l<=Ne||l>=Ve){i[u]=Nn(c);for(var g=u+1;g<a;++g){var v=i[g],s=v[0],p=v[1];if(s>Ie&&s<Te&&p>Ne&&p<Ve)break}if(g===u+1)continue;if(u){var h={index:-1,polygon:r,ring:i.slice(0,u+1)};h.ring[h.ring.length-1]=Dn(l),e[e.length-1]=h}else e.pop();if(g>=a)break;e.push({index:-1,polygon:r,ring:i=i.slice(g-1)}),i[0]=Dn(i[0][1]),u=-1,a=i.length}}}}function _n(n){var r,e,t,o,i,u,a=n.length,c={},f={};for(r=0;r<a;++r)t=(e=n[r]).rin
 g[0],i=e.ring[e.ring.length-1],t[0]!==i[0]||t[1]!==i[1]?(e.index=r,c[t]=f[i]=e):(e.polygon.push(e.ring),n[r]=null);for(r=0;r<a;++r)if(e=n[r]){if(t=e.ring[0],i=e.ring[e.ring.length-1],o=f[t],u=c[i],delete c[t],delete f[i],t[0]===i[0]&&t[1]===i[1]){e.polygon.push(e.ring);continue}o?(delete f[t],delete c[o.ring[0]],o.ring.pop(),n[o.index]=null,e={index:-1,polygon:o.polygon,ring:o.ring.concat(e.ring)},o===u?e.polygon.push(e.ring):(e.index=a++,n.push(c[e.ring[0]]=f[e.ring[e.ring.length-1]]=e))):u?(delete c[i],delete f[u.ring[u.ring.length-1]],e.ring.pop(),e={index:a++,polygon:u.polygon,ring:e.ring.concat(u.ring)},n[u.index]=null,n.push(c[e.ring[0]]=f[e.ring[e.ring.length-1]]=e)):(e.ring.push(e.ring[0]),e.polygon.push(e.ring))}}function Kn(n){var r={type:"Feature",geometry:On(n.geometry)};return null!=n.id&&(r.id=n.id),null!=n.bbox&&(r.bbox=n.bbox),null!=n.properties&&(r.properties=n.properties),r}function On(n){if(null==n)return n;var r,e,t,o;switch(n.type){case"GeometryCollection":r={ty
 pe:"GeometryCollection",geometries:n.geometries.map(On)};break;case"Point":r={type:"Point",coordinates:Nn(n.coordinates)};break;case"MultiPoint":case"LineString":r={type:n.type,coordinates:Qn(n.coordinates)};break;case"MultiLineString":r={type:"MultiLineString",coordinates:n.coordinates.map(Qn)};break;case"Polygon":var i=[];Vn(n.coordinates,i,e=[]),_n(e),r={type:"Polygon",coordinates:i};break;case"MultiPolygon":e=[],t=-1,o=n.coordinates.length;for(var u=new Array(o);++t<o;)Vn(n.coordinates[t],u[t]=[],e);_n(e),r={type:"MultiPolygon",coordinates:u.filter(Tn)};break;default:return n}return null!=n.bbox&&(r.bbox=n.bbox),r}function Un(n,r){var e=Pr(r/2),t=mr(Er*e);return[n*(.74482-.34588*t*t),1.70711*e]}function Jn(n){function e(n,e){var o=r.geoGnomonicRaw(n,e);return o[0]*=t,o}var t=lr(n);return e.invert=function(n,e){return r.geoGnomonicRaw.invert(n/t,e)},e}function Xn(n,r){return _e(Jn,n,r)}function Yn(n){function e(r,e){var c=o(lr(e)*lr(r-t)),f=o(lr(e)*lr(r-u));return c*=c,f*=f,[(c-f
 )/(2*n),(e<0?-1:1)*i(4*a*f-(a-c+f)*(a-c+f))/(2*n)]}if(!(n*=2))return r.geoAzimuthalEquidistantRaw;var t=-n/2,u=-t,a=n*n,c=Pr(u),f=.5/mr(u);return e.invert=function(n,r){var e,a,l=r*r,g=lr(i(l+(e=n+t)*e)),v=lr(i(l+(e=n+u)*e));return[fr(a=g-v,e=(g+v)*c),(r<0?-1:1)*o(i(e*e+a*a)*f)]},e}function Zn(n,r){return _e(Yn,n,r)}function $n(n,r){if(ar(r)<Rr)return[n,0];var e=ar(r/Mr),o=t(e);if(ar(n)<Rr||ar(ar(r)-Mr)<Rr)return[0,yr(r)*jr*Pr(o/2)];var u=lr(o),a=ar(jr/n-n/jr)/2,c=a*a,f=u/(e+u-1),l=f*(2/e-1),g=l*l,v=g+c,s=f-g,p=c+f;return[yr(n)*jr*(a*s+i(c*s*s-v*(f*f-g)))/v,yr(r)*jr*(l*p-a*i((c+1)*v-p*p))/v]}function nr(n,r){if(ar(r)<Rr)return[n,0];var e=ar(r/Mr),o=t(e);if(ar(n)<Rr||ar(ar(r)-Mr)<Rr)return[0,yr(r)*jr*Pr(o/2)];var u=lr(o),a=ar(jr/n-n/jr)/2,c=a*a,f=u*(i(1+c)-a*u)/(1+c*e*e);return[yr(n)*jr*f,yr(r)*jr*i(1-f*(2*a+f))]}function rr(n,r){if(ar(r)<Rr)return[n,0];var e=r/Mr,o=t(e);if(ar(n)<Rr||ar(ar(r)-Mr)<Rr)return[0,jr*Pr(o/2)];var u=(jr/n-n/jr)/2,a=e/(1+lr(o));return[jr*(yr(n)*i(u*u+1-a*a)-
 u),jr*a]}function er(n,r){if(!r)return[n,0];var e=ar(r);if(!n||e===Mr)return[0,r];var t=e/Mr,o=t*t,u=(8*t-o*(o+2)-5)/(2*o*(t-1)),a=u*u,c=t*u,f=o+a+2*c,l=t+3*u,g=n/Mr,v=g+1/g,s=yr(ar(n)-Mr)*i(v*v-4),p=s*s,h=(s*(f+a-1)+2*i(f*(o+a*p-1)+(1-o)*(o*(l*l+4*a)+12*c*a+4*a*a)))/(4*f+p);return[yr(n)*Mr*h,yr(r)*Mr*i(1+s*ar(h)-h*h)]}function tr(n,r){return[n*i(1-3*r*r/(jr*jr)),r]}function or(n,r){var e=.90631*mr(r),t=i(1-e*e),o=i(2/(1+t*lr(n/=3)));return[2.66723*t*o*mr(n),1.24104*e*o]}function ir(n,r){var e=lr(r),t=lr(n)*e,o=1-t,u=lr(n=fr(mr(n)*e,-mr(r))),a=mr(n);return e=i(1-t*t),[a*e-u*o,-u*e-a*o]}function ur(n,r){var e=f(n,r);return[(e[0]+n/Mr)/2,(e[1]+r)/2]}var ar=Math.abs,cr=Math.atan,fr=Math.atan2,lr=Math.cos,gr=Math.exp,vr=Math.floor,sr=Math.log,pr=Math.max,hr=Math.min,dr=Math.pow,wr=Math.round,yr=Math.sign||function(n){return n>0?1:n<0?-1:0},mr=Math.sin,Pr=Math.tan,Rr=1e-6,br=1e-12,jr=Math.PI,Mr=jr/2,Er=jr/4,Ar=Math.SQRT1_2,Sr=i(2),kr=i(jr),xr=2*jr,Gr=180/jr,Cr=jr/180;f.invert=function(n,
 r){if(!(n*n+4*r*r>jr*jr+Rr)){var e=n,t=r,u=25;do{var a,c=mr(e),f=mr(e/2),l=lr(e/2),g=mr(t),v=lr(t),s=mr(2*t),p=g*g,h=v*v,d=f*f,w=1-h*l*l,y=w?o(v*l)*i(a=1/w):a=0,m=2*y*v*f-n,P=y*g-r,R=a*(h*d+y*v*l*p),b=a*(.5*c*s-2*y*g*f),j=.25*a*(s*f-y*g*h*c),M=a*(p*l+y*d*v),E=b*j-M*R;if(!E)break;var A=(P*b-m*M)/E,S=(m*j-P*R)/E;e-=A,t-=S}while((ar(A)>Rr||ar(S)>Rr)&&--u>0);return[e,t]}};g.invert=function(n,r){if(n*=3/8,r*=3/8,!n&&ar(r)>1)return null;var e=1+n*n+r*r,o=i((e-i(e*e-4*r*r))/2),c=t(o)/3,f=o?function(n){return sr(n+i(n*n-1))}(ar(r/o))/3:function(n){return sr(n+i(n*n+1))}(ar(n))/3,l=lr(c),g=a(f),v=g*g-l*l;return[2*yr(n)*fr(u(f)*l,.25-v),2*yr(r)*fr(g*mr(c),.25+v)]};var zr=i(8),Fr=sr(1+Sr);v.invert=function(n,r){if((t=ar(r))<Fr)return[n,2*cr(gr(r))-Mr];var e,t,o=Er,i=25;do{var u=lr(o/2),a=Pr(o/2);o-=e=(zr*(o-Er)-sr(a)-t)/(zr-u*u/(2*a))}while(ar(e)>br&&--i>0);return[n/(lr(o)*(zr-1/mr(o))),yr(r)*o]};h.invert=function(n,r){var e=2*t(r/2);return[n*lr(e/2)/lr(e),e]};var Lr=y(Sr/Mr,Sr,jr),qr=2.00276,
 Br=1.11072;m.invert=function(n,r){var e,t,o=qr*r,i=r<0?-Er:Er,u=25;do{t=o-Sr*mr(i),i-=e=(mr(2*i)+2*i-jr*mr(t))/(2*lr(2*i)+2+jr*lr(t)*Sr*lr(i))}while(ar(e)>Rr&&--u>0);return t=o-Sr*mr(i),[n*(1/lr(t)+Br/lr(i))/qr,t]};var Hr=function(n){var e=0,t=r.geoProjectionMutator(n),o=t(e);return o.parallel=function(n){return arguments.length?t(e=n*Cr):e*Gr},o};P.invert=function(n,r){return[n/lr(r),r]};var Ir=y(1,4/jr,jr);x.invert=function(n,r){var e=(e=r/kr-1)*e;return[e>0?n*i(jr/e)/2:0,t(1-e)]};var Wr=i(3);C.invert=function(n,r){var e=3*t(r/(Wr*kr));return[kr*n/(Wr*(2*lr(2*e/3)-1)),e]};L.invert=function(n,r){var e=i(8/(3*jr)),t=r/e;return[n/(e*(1-ar(t)/jr)),t]};q.invert=function(n,r){var e=2-ar(r)/i(2*jr/3);return[n*i(6*jr)/(2*e),yr(r)*t((4-e*e)/3)]};B.invert=function(n,r){var e=i(jr*(4+jr))/2;return[n*e/(1+i(1-r*r*(4+jr)/(4*jr))),r*e/2]};H.invert=function(n,r){var e=r*i((4+jr)/jr)/2,o=t(e),u=lr(o);return[n/(2/i(jr*(4+jr))*(1+u)),t((o+e*(u+2))/(2+Mr))]};I.invert=function(n,r){var e=i(2+jr),t=r*
 e/2;return[e*n/(1+lr(t)),t]};W.invert=function(n,r){var e=1+Mr,o=i(e/2);return[2*n*o/(1+lr(r*=o)),t((r+mr(r))/e)]};var Tr=3+2*Sr;T.invert=function(n,r){if(!(e=g.invert(n/1.2,1.065*r)))return null;var e,t=e[0],o=e[1],u=20;n/=Tr,r/=Tr;do{var a=t/2,c=o/2,f=mr(a),l=lr(a),v=mr(c),s=lr(c),p=lr(o),h=i(p),d=v/(s+Sr*l*h),w=d*d,y=i(2/(1+w)),m=(Sr*s+(l+f)*h)/(Sr*s+(l-f)*h),P=i(m),R=P-1/P,b=P+1/P,j=y*R-2*sr(P)-n,M=y*d*b-2*cr(d)-r,E=v&&Ar*h*f*w/v,A=(Sr*l*s+h)/(2*(s+Sr*l*h)*(s+Sr*l*h)*h),S=-.5*d*y*y*y,k=S*E,x=S*A,G=(G=2*s+Sr*h*(l-f))*G*P,C=(Sr*l*s*h+p)/G,z=-Sr*f*v/(h*G),F=R*k-2*C/P+y*(C+C/m),L=R*x-2*z/P+y*(z+z/m),q=d*b*k-2*E/(1+w)+y*b*E+y*d*(C-C/m),B=d*b*x-2*A/(1+w)+y*b*A+y*d*(z-z/m),H=L*q-B*F;if(!H)break;var I=(M*L-j*B)/H,W=(j*q-M*F)/H;t-=I,o=pr(-Mr,hr(Mr,o-W))}while((ar(I)>Rr||ar(W)>Rr)&&--u>0);return ar(ar(o)-Mr)<Rr?[0,o]:u&&[t,o]};var Dr=lr(35*Cr);D.invert=function(n,r){var e=r/(1+Dr);return[n&&n/(Dr*i(1-e*e)),2*cr(e)]};N.invert=function(n,r){var e=cr(r/kr),t=lr(e),o=2*e;return[n*kr/2/(lr(o)*
 t*t),o]};var Nr=function(n,r,e,o,u,a,c,f){function l(i,l){if(!l)return[n*i/jr,0];var g=l*l,v=n+g*(r+g*(e+g*o)),s=l*(u-1+g*(a-f+g*c)),p=(v*v+s*s)/(2*s),h=i*t(v/p)/jr;return[p*mr(h),l*(1+g*f)+p*(1-lr(h))]}return arguments.length<8&&(f=0),l.invert=function(l,g){var v,s,p=jr*l/n,h=g,d=50;do{var w=h*h,y=n+w*(r+w*(e+w*o)),m=h*(u-1+w*(a-f+w*c)),P=y*y+m*m,R=2*m,b=P/R,j=b*b,M=t(y/b)/jr,E=p*M,A=y*y,S=(2*r+w*(4*e+6*w*o))*h,k=u+w*(3*a+5*w*c),x=(2*(y*S+m*(k-1))*R-P*(2*(k-1)))/(R*R),G=lr(E),C=mr(E),z=b*G,F=b*C,L=p/jr*(1/i(1-A/j))*(S*b-y*x)/j,q=F-l,B=h*(1+w*f)+b-z-g,H=x*C+z*L,I=z*M,W=1+x-(x*G-F*L),T=F*M,D=H*T-W*I;if(!D)break;p-=v=(B*H-q*W)/D,h-=s=(q*T-B*I)/D}while((ar(v)>Rr||ar(s)>Rr)&&--d>0);return[p,h]},l},Qr=Nr(2.8284,-1.6988,.75432,-.18071,1.76003,-.38914,.042555),Vr=Nr(2.583819,-.835827,.170354,-.038094,1.543313,-.411435,.082742),_r=Nr(5/6*jr,-.62636,-.0344,0,1.3493,-.05524,0,.045);U.invert=function(n,r){var e,t=n,o=r,i=50;do{var u=o*o;o-=e=(o*(1+u/12)-r)/(1+u/4)}while(ar(e)>Rr&&--i>0);i=50,n
 /=1-.162388*u;do{var a=(a=t*t)*a;t-=e=(t*(.87-952426e-9*a)-n)/(.87-.00476213*a)}while(ar(e)>Rr&&--i>0);return[t,o]};var Kr=Nr(2.6516,-.76534,.19123,-.047094,1.36289,-.13965,.031762),Or=function(n){function r(r,t){var o=r>0?-.5:.5,i=n(r+o*jr,t);return i[0]-=o*e,i}var e=n(Mr,0)[0]-n(-Mr,0)[0];return n.invert&&(r.invert=function(r,t){var o=r>0?-.5:.5,i=n.invert(r+o*e,t),u=i[0]-o*jr;return u<-jr?u+=2*jr:u>jr&&(u-=2*jr),i[0]=u,i}),r};J.invert=function(n,r){ar(n)>1&&(n=2*yr(n)-n),ar(r)>1&&(r=2*yr(r)-r);var e=yr(n),o=yr(r),u=-e*n,a=-o*r,c=a/u<1,f=function(n,r){for(var e=0,o=1,u=.5,a=50;;){var c=u*u,f=i(u),l=t(1/i(1+c)),g=1-c+u*(1+c)*l,v=(1-f)/g,s=i(v),p=v*(1+c),h=s*(1-c),d=i(p-n*n),w=r+h+u*d;if(ar(o-e)<br||0==--a||0===w)break;w>0?e=u:o=u,u=.5*(e+o)}if(!a)return null;var y=t(f),m=lr(y),P=1/m,R=2*f*m,b=(-g*m-(-3*u+l*(1+3*c))*R*(1-f))/(g*g);return[jr/4*(n*(-2*P*(.5*b/s*(1-c)-2*u*s*R)+-P*R*d)+-P*(u*(1+c)*b+v*(1+3*c)*R)*t(n/i(p))),y]}(c?a:u,c?u:a),l=f[0],g=f[1],v=lr(g);return c&&(l=-Mr-l),[e*(f
 r(mr(l)*v,-mr(g))+jr),o*t(lr(l)*v)]};Z.invert=function(n,r){var e=(Sr-1)/(Sr+1),t=i(1-e*e),o=function(n,r,e){var t,o,i;return n?(t=X(n,e),r?(o=X(r,1-e),i=o[1]*o[1]+e*t[0]*t[0]*o[0]*o[0],[[t[0]*o[2]/i,t[1]*t[2]*o[0]*o[1]/i],[t[1]*o[1]/i,-t[0]*t[2]*o[0]*o[2]/i],[t[2]*o[1]*o[2]/i,-e*t[0]*t[1]*o[0]/i]]):[[t[0],0],[t[1],0],[t[2],0]]):(o=X(r,1-e),[[0,o[0]/o[1]],[1/o[1],0],[o[2]/o[1],0]])}(.5*Y(Mr,t*t)-r,-n,t*t),u=function(n,r){var e=r[0]*r[0]+r[1]*r[1];return[(n[0]*r[0]+n[1]*r[1])/e,(n[1]*r[0]-n[0]*r[1])/e]}(o[0],o[1]);return[fr(u[1],u[0])/-1,2*cr(gr(-.5*sr(e*u[0]*u[0]+e*u[1]*u[1])))-Mr]};var Ur=41+48/36+37/3600,Jr=z(0),Xr=.7109889596207567,Yr=.0528035274542;tn.invert=function(n,r){return r>-Xr?Lr.invert(n,r-Yr):P.invert(n,r)};on.invert=function(n,r){return ar(r)>Xr?Lr.invert(n,r+(r>0?Yr:-Yr)):P.invert(n,r)};var Zr=function(n,t){function o(r,e){for(var o=e<0?-1:1,i=t[+(e<0)],u=0,a=i.length-1;u<a&&r>i[u][2][0];++u);var c=n(r-i[u][1][0],e);return c[0]+=n(i[u][1][0],o*e>o*i[u][0][1]?i[u][0][
 1]:e)[0],c}var i,u;n.invert&&(o.invert=function(r,e){for(var i=u[+(e<0)],a=t[+(e<0)],c=0,f=i.length;c<f;++c){var l=i[c];if(l[0][0]<=r&&r<l[1][0]&&l[0][1]<=e&&e<l[1][1]){var g=n.invert(r-n(a[c][1][0],0)[0],e);return g[0]+=a[c][1][0],un(o(g[0],g[1]),[r,e])?g:null}}});var a=r.geoProjection(o),c=a.stream;return a.stream=function(n){var e=a.rotate(),t=c(n),o=(a.rotate([0,0]),c(n));return a.rotate(e),t.sphere=function(){r.geoStream(i,o)},t},a.lobes=function(r){return arguments.length?(i=function(n){var r,t,o,i,u,a,c,f=[],l=n[0].length;for(c=0;c<l;++c)t=(r=n[0][c])[0][0],o=r[0][1],i=r[1][1],u=r[2][0],a=r[2][1],f.push(an([[t+Rr,o+Rr],[t+Rr,i-Rr],[u-Rr,i-Rr],[u-Rr,a+Rr]],30));for(c=n[1].length-1;c>=0;--c)t=(r=n[1][c])[0][0],o=r[0][1],i=r[1][1],u=r[2][0],a=r[2][1],f.push(an([[u-Rr,a-Rr],[u-Rr,i+Rr],[t+Rr,i+Rr],[t+Rr,o-Rr]],30));return{type:"Polygon",coordinates:[e.merge(f)]}}(r),t=r.map(function(n){return n.map(function(n){return[[n[0][0]*Cr,n[0][1]*Cr],[n[1][0]*Cr,n[1][1]*Cr],[n[2][0]*Cr,n[2
 ][1]*Cr]]})}),u=t.map(function(r){return r.map(function(r){var e,t=n(r[0][0],r[0][1])[0],o=n(r[2][0],r[2][1])[0],i=n(r[1][0],r[0][1])[1],u=n(r[1][0],r[1][1])[1];return i>u&&(e=i,i=u,u=e),[[t,i],[o,u]]})}),a):t.map(function(n){return n.map(function(n){return[[n[0][0]*Gr,n[0][1]*Gr],[n[1][0]*Gr,n[1][1]*Gr],[n[2][0]*Gr,n[2][1]*Gr]]})})},null!=t&&a.lobes(t),a},$r=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]],ne=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]],re=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]],ee=[[[[-180,0],[-90,90],[0,0]],[[0,0],[90,90],[180,0]]],[[[-180,0],[-90,-90],[0,0]],[[0,0],[90,-90],[180,0]
 ]]],te=[[[[-180,35],[-30,90],[0,35]],[[0,35],[30,90],[180,35]]],[[[-180,-10],[-102,-90],[-65,-10]],[[-65,-10],[5,-90],[77,-10]],[[77,-10],[103,-90],[180,-10]]]],oe=[[[[-180,0],[-110,90],[-40,0]],[[-40,0],[0,90],[40,0]],[[40,0],[110,90],[180,0]]],[[[-180,0],[-110,-90],[-40,0]],[[-40,0],[0,-90],[40,0]],[[40,0],[110,-90],[180,0]]]];cn.invert=function(n,r){return[xr/3*n/i(jr*jr/3-r*r),r]};var ie=jr/Sr;ln.invert=function(n,r){var e=ar(n),t=ar(r),u=Rr,a=Mr;t<ie?a*=t/ie:u+=6*o(ie/t);for(var c=0;c<25;c++){var f=mr(a),l=i(lr(a)),g=mr(a/2),v=lr(a/2),s=mr(u/6),p=lr(u/6),h=.5*u*(1+l)-e,d=a/(v*p)-t,w=l?-.25*u*f/l:0,y=.5*(1+l),m=(1+.5*a*g/v)/(v*p),P=a/v*(s/6)/(p*p),R=w*P-m*y,b=(h*P-d*y)/R,j=(d*w-h*m)/R;if(a-=b,u-=j,ar(b)<Rr&&ar(j)<Rr)break}return[n<0?-u:u,r<0?-a:a]};gn.invert=function(n,r){var e=yr(n)*jr,t=r/2,o=50;do{var i=e*e,u=t*t,a=e*t,c=e*(.975534+u*(-.0143059*i-.119161+-.0547009*u))-n,f=t*(1.00384+i*(.0802894+-.02855*u+199025e-9*i)+u*(.0998909+-.0491032*u))-r,l=.975534-u*(.119161+3*i*.01430
 59+.0547009*u),g=-a*(.238322+.2188036*u+.0286118*i),v=a*(.1605788+7961e-7*i+-.0571*u),s=1.00384+i*(.0802894+199025e-9*i)+u*(3*(.0998909-.02855*i)-.245516*u),p=g*v-s*l,h=(f*g-c*s)/p,d=(c*v-f*l)/p;e-=h,t-=d}while((ar(h)>Rr||ar(d)>Rr)&&--o>0);return o&&[e,t]};vn.invert=function(n,r){var e=n*n,u=r*r+1,a=e+u,c=n?Ar*i((a-i(a*a-4*e))/e):1/i(u);return[t(n*c),yr(r)*o(c)]};pn.invert=function(n,r){return[n,2.5*cr(gr(.8*r))-.625*jr]};var ue=[[.9972523,0],[.0052513,-.0041175],[.0074606,.0048125],[-.0153783,-.1968253],[.0636871,-.1408027],[.3660976,-.2937382]],ae=[[.98879,0],[0,0],[-.050909,0],[0,0],[.075528,0]],ce=[[.984299,0],[.0211642,.0037608],[-.1036018,-.0575102],[-.0329095,-.0320119],[.0499471,.1223335],[.026046,.0899805],[7388e-7,-.1435792],[.0075848,-.1334108],[-.0216473,.0776645],[-.0225161,.0853673]],fe=[[.9245,0],[0,0],[.01943,0]],le=[[.721316,0],[0,0],[-.00881625,-.00617325]],ge=i(6),ve=i(7);wn.invert=function(n,r){var e=3*t(r*ve/9);return[n*ve/(ge*(2*lr(2*e/3)-1)),t(3*mr(e)*ge/7)]};
 yn.invert=function(n,r){var e=r*i(2+Sr)/(2*i(3)),o=2*t(e);return[3*Sr*n/(1+2*lr(o)/lr(o/2)),t((e+mr(o))/(1+Ar))]};mn.invert=function(n,r){var e=i(6/(4+jr)),o=r/e;return ar(ar(o)-Mr)<Rr&&(o=o<0?-Mr:Mr),[1.5*n/(e*(.5+lr(o))),t((o/2+mr(o))/(1+jr/4))]};Pn.invert=function(n,r){var e,t,o,i,u=r,a=25;do{u-=e=(u*(1.01183+(o=(t=u*u)*t)*o*(.01926*t-.02625-.00396*o))-r)/(1.01183+o*o*(.21186*t-.23625+-.05148*o))}while(ar(e)>br&&--a>0);return t=u*u,o=t*t,i=t*o,[n/(.84719-.13063*t+i*i*(.05494*t-.04515-.02326*o+.00331*i)),u]};Rn.invert=function(n,r){for(var e=r/2,t=0,o=1/0;t<10&&ar(o)>Rr;++t){var i=lr(r/2);r-=o=(r-Pr(r/2)-e)/(1-.5/(i*i))}return[2*n/(1+lr(r)),r]};var se=1.0148,pe=.23185,he=-.14499,de=.02406,we=se,ye=5*pe,me=7*he,Pe=9*de,Re=1.790857183;bn.invert=function(n,r){r>Re?r=Re:r<-Re&&(r=-Re);var e,t=r;do{var o=t*t;t-=e=(t*(se+o*o*(pe+o*(he+de*o)))-r)/(we+o*o*(ye+o*(me+Pe*o)))}while(ar(e)>Rr);return[n,t]};jn.invert=function(n,r){if(ar(r)<Rr)return[n,0];var e,i=n*n+r*r,u=.5*r,a=10;do{var c=Pr(
 u),f=1/lr(u),l=i-2*r*u+u*u;u-=e=(c*l+2*(u-r))/(2+l*f*f+2*(u-r)*c)}while(ar(e)>Rr&&--a>0);return c=Pr(u),[(ar(r)<ar(u+1/c)?t(n*c):yr(n)*(o(ar(n*c))+Mr))/mr(u),u]};var be=function(n,r){var e=En(n[1],n[0]),t=En(r[1],r[0]),o=function(n,r){return fr(n[0]*r[1]-n[1]*r[0],n[0]*r[0]+n[1]*r[1])}(e,t),i=An(e)/An(t);return Mn([1,0,n[0][0],0,1,n[0][1]],Mn([i,0,0,0,i,0],Mn([lr(o),mr(o),0,-mr(o),lr(o),0],[1,0,-r[0][0],0,1,-r[0][1]])))},je=function(n,e,t){function o(n,r){if(n.edges=function(n){for(var r=n.length,e=[],t=n[r-1],o=0;o<r;++o)e.push([t,t=n[o]]);return e}(n.face),r.face){var e=n.shared=function(n,r){for(var e,t,o=n.length,i=null,u=0;u<o;++u){e=n[u];for(var a=r.length;--a>=0;)if(t=r[a],e[0]===t[0]&&e[1]===t[1]){if(i)return[i,e];i=e}}}(n.face,r.face),t=be(e.map(r.project),e.map(n.project));n.transform=r.transform?Mn(r.transform,t):t;for(var i=r.edges,u=0,a=i.length;u<a;++u)kn(e[0],i[u][1])&&kn(e[1],i[u][0])&&(i[u]=n),kn(e[0],i[u][0])&&kn(e[1],i[u][1])&&(i[u]=n);for(u=0,a=(i=n.edges).length
 ;u<a;++u)kn(e[0],i[u][0])&&kn(e[1],i[u][1])&&(i[u]=r),kn(e[0],i[u][1])&&kn(e[1],i[u][0])&&(i[u]=r)}else n.transform=r.transform;return n.children&&n.children.forEach(function(r){o(r,n)}),n}function i(n,r){var t,o=e(n,r),i=o.project([n*Gr,r*Gr]);return(t=o.transform)?[t[0]*i[0]+t[1]*i[1]+t[2],-(t[3]*i[0]+t[4]*i[1]+t[5])]:(i[1]=-i[1],i)}function u(n,r){var t=n.project.invert,o=n.transform,i=r;if(o&&(i=[(o=function(n){var r=1/(n[0]*n[4]-n[1]*n[3]);return[r*n[4],-r*n[1],r*(n[1]*n[5]-n[2]*n[4]),-r*n[3],r*n[0],r*(n[2]*n[3]-n[0]*n[5])]}(o))[0]*i[0]+o[1]*i[1]+o[2],o[3]*i[0]+o[4]*i[1]+o[5]]),t&&n===function(n){return e(n[0]*Cr,n[1]*Cr)}(a=t(i)))return a;for(var a,c=n.children,f=0,l=c&&c.length;f<l;++f)if(a=u(c[f],r))return a}o(n,{transform:[lr(t=null==t?-jr/6:t),mr(t),0,-mr(t),lr(t),0]}),xn(n)&&(i.invert=function(r,e){var t=u(n,[r,-e]);return t&&(t[0]*=Cr,t[1]*=Cr,t)});var a=r.geoProjection(i),c=a.stream;return a.stream=function(r){var e=a.rotate(),t=c(r),o=(a.rotate([0,0]),c(r));return a.ro
 tate(e),t.sphere=function(){o.polygonStart(),o.lineStart(),Sn(o,n),o.lineEnd(),o.polygonEnd()},t},a},Me=[[0,90],[-90,0],[0,0],[90,0],[180,0],[0,-90]],Ee=[[0,2,1],[0,3,2],[5,1,2],[5,2,3],[0,1,4],[0,4,3],[5,4,1],[5,3,4]].map(function(n){return n.map(function(n){return Me[n]})}),Ae=2/i(3);Gn.invert=function(n,r){return x.invert(n/Ae,r)};var Se=function(){},ke=[],xe=[],Ge={point:function(n,r){ke.push([n,r])},result:function(){var n=ke.length?ke.length<2?{type:"Point",coordinates:ke[0]}:{type:"MultiPoint",coordinates:ke}:null;return ke=[],n}},Ce={lineStart:Se,point:function(n,r){ke.push([n,r])},lineEnd:function(){ke.length&&(xe.push(ke),ke=[])},result:function(){var n=xe.length?xe.length<2?{type:"LineString",coordinates:xe[0]}:{type:"MultiLineString",coordinates:xe}:null;return xe=[],n}},ze={polygonStart:Se,lineStart:Se,point:function(n,r){ke.push([n,r])},lineEnd:function(){var n=ke.length;if(n){do{ke.push(ke[0].slice())}while(++n<4);xe.push(ke),ke=[]}},polygonEnd:Se,result:function(){if
 (!xe.length)return null;var n=[],r=[];return xe.forEach(function(e){!function(n){if((r=n.length)<4)return!1;for(var r,e=0,t=n[r-1][1]*n[0][0]-n[r-1][0]*n[0][1];++e<r;)t+=n[e-1][1]*n[e][0]-n[e-1][0]*n[e][1];return t<=0}(e)?r.push(e):n.push([e])}),r.forEach(function(r){var e=r[0];n.some(function(n){if(function(n,r){for(var e=r[0],t=r[1],o=!1,i=0,u=n.length,a=u-1;i<u;a=i++){var c=n[i],f=c[0],l=c[1],g=n[a],v=g[0],s=g[1];l>t^s>t&&e<(v-f)*(t-l)/(s-l)+f&&(o=!o)}return o}(n[0],e))return n.push(r),!0})||n.push([r])}),xe=[],n.length?n.length>1?{type:"MultiPolygon",coordinates:n}:{type:"Polygon",coordinates:n[0]}:null}},Fe=function(n){function e(r,e){var o=ar(r)<Mr,i=n(o?r:r>0?r-jr:r+jr,e),u=(i[0]-i[1])*Ar,a=(i[0]+i[1])*Ar;if(o)return[u,a];var c=t*Ar,f=u>0^a>0?-1:1;return[f*u-yr(a)*c,f*a-yr(u)*c]}var t=n(Mr,0)[0]-n(-Mr,0)[0];return n.invert&&(e.invert=function(r,e){var o=(r+e)*Ar,i=(e-r)*Ar,u=ar(o)<.5*t&&ar(i)<.5*t;if(!u){var a=t*Ar,c=o>0^i>0?-1:1,f=-c*r+(i>0?1:-1)*a,l=-c*e+(o>0?1:-1)*a;o=(-f-
 l)*Ar,i=(f-l)*Ar}var g=n.invert(o,i);return u||(g[0]+=o>0?jr:-jr),g}),r.geoProjection(e).rotate([-90,-90,45]).clipAngle(179.999)},Le=function(){return Fe(Z).scale(111.48)},qe=[[.9986,-.062],[1,0],[.9986,.062],[.9954,.124],[.99,.186],[.9822,.248],[.973,.31],[.96,.372],[.9427,.434],[.9216,.4958],[.8962,.5571],[.8679,.6176],[.835,.6769],[.7986,.7346],[.7597,.7903],[.7186,.8435],[.6732,.8936],[.6213,.9394],[.5722,.9761],[.5322,1]];qe.forEach(function(n){n[1]*=1.0144}),In.invert=function(n,r){var e=r/Mr,t=90*e,o=hr(18,ar(t/5)),i=pr(0,vr(o));do{var u=qe[i][1],a=qe[i+1][1],c=qe[hr(19,i+2)][1],f=c-u,l=c-2*a+u,g=2*(ar(e)-a)/f,v=l/f,s=g*(1-v*g*(1-2*v*g));if(s>=0||1===i){t=(r>=0?5:-5)*(s+o);var p,h=50;do{s=(o=hr(18,ar(t)/5))-(i=vr(o)),u=qe[i][1],a=qe[i+1][1],c=qe[hr(19,i+2)][1],t-=(p=(r>=0?Mr:-Mr)*(a+s*(c-u)/2+s*s*(c-2*a+u)/2)-r)*Gr}while(ar(p)>br&&--h>0);break}}while(--i>=0);var d=qe[i][0],w=qe[i+1][0],y=qe[hr(19,i+2)][0];return[n/(w+s*(y-d)/2+s*s*(y-2*w+d)/2),t*Cr]};var Be=1e4,He=-180,Ie=He+
 1e-4,We=180,Te=We-1e-4,De=-90,Ne=De+1e-4,Qe=90,Ve=Qe-1e-4;Un.invert=function(n,r){var e=r/1.70711,t=mr(Er*e);return[n/(.74482-.34588*t*t),2*cr(e)]};var _e=function(n,e,o){var i=r.geoInterpolate(e,o),u=i(.5),a=r.geoRotation([-u[0],-u[1]])(e),c=i.distance/2,f=-t(mr(a[1]*Cr)/mr(c)),l=[-u[0],-u[1],-(a[0]>0?jr-f:f)*Gr],g=r.geoProjection(n(c)).rotate(l),v=r.geoRotation(l),s=g.center;return delete g.rotate,g.center=function(n){return arguments.length?s(v(n)):v.invert(s())},g.clipAngle(90)};$n.invert=function(n,r){if(ar(r)<Rr)return[n,0];if(ar(n)<Rr)return[0,Mr*mr(2*cr(r/jr))];var e=(n/=jr)*n,t=(r/=jr)*r,u=e+t,a=u*u,c=-ar(r)*(1+u),f=c-2*t+e,l=-2*c+1+2*t+a,g=t/l+(2*f*f*f/(l*l*l)-9*c*f/(l*l))/27,v=(c-f*f/(3*l))/l,s=2*i(-v/3),p=o(3*g/(v*s))/3;return[jr*(u-1+i(1+2*(e-t)+a))/(2*n),yr(r)*jr*(-s*lr(p+jr/3)-f/(3*l))]};nr.invert=function(n,r){if(!n)return[0,Mr*mr(2*cr(r/jr))];var e=ar(n/jr),t=(1-e*e-(r/=jr)*r)/(2*e),o=i(t*t+1);return[yr(n)*jr*(o-t),yr(r)*Mr*mr(2*fr(i((1-2*t*e)*(t+o)-e),i(o+t+e)))]};
 rr.invert=function(n,r){if(!r)return[n,0];var e=r/jr,t=(jr*jr*(1-e*e)-n*n)/(2*jr*n);return[n?jr*(yr(n)*i(t*t+1)-t):0,Mr*mr(2*cr(e))]};er.invert=function(n,r){var e;if(!n||!r)return[n,r];r/=jr;var t=yr(n)*n/Mr,o=(t*t-1+4*r*r)/ar(t),u=o*o,a=2*r,c=50;do{var f=a*a,l=(8*a-f*(f+2)-5)/(2*f*(a-1)),g=(3*a-f*a-10)/(2*f*a),v=l*l,s=a*l,p=a+l,h=p*p,d=a+3*l,w=-2*p*(4*s*v+(1-4*f+3*f*f)*(1+g)+v*(14*f-6-u+(8*f-8-2*u)*g)+s*(12*f-8+(10*f-10-u)*g)),y=i(h*(f+v*u-1)+(1-f)*(f*(d*d+4*v)+v*(12*s+4*v)));a-=e=(o*(h+v-1)+2*y-t*(4*h+u))/(o*(2*l*g+2*p*(1+g))+w/y-8*p*(o*(-1+v+h)+2*y)*(1+g)/(u+4*h))}while(e>Rr&&--c>0);return[yr(n)*(i(o*o+4)+o)*jr/4,Mr*a]};var Ke=4*jr+3*i(3),Oe=2*i(2*jr*i(3)/Ke),Ue=y(Oe*i(3)/jr,Oe,Ke/6);tr.invert=function(n,r){return[n/i(1-3*r*r/(jr*jr)),r]};or.invert=function(n,r){var e=n/2.66723,o=r/1.24104,u=i(e*e+o*o),a=2*t(u/2);return[3*fr(n*Pr(a),2.66723*u),u&&t(r*mr(a)/(1.24104*.90631*u))]};ir.invert=function(n,r){var e=(n*n+r*r)/-2,o=i(-e*(2+e)),u=r*e+n*o,a=n*e-r*o,c=i(a*a+u*u);return[fr(o*
 u,c*(1+e)),c?-t(o*a/c):0]};ur.invert=function(n,r){var e=n,t=r,u=25;do{var a,c=lr(t),f=mr(t),l=mr(2*t),g=f*f,v=c*c,s=mr(e),p=lr(e/2),h=mr(e/2),d=h*h,w=1-v*p*p,y=w?o(c*p)*i(a=1/w):a=0,m=.5*(2*y*c*h+e/Mr)-n,P=.5*(y*f+t)-r,R=.5*a*(v*d+y*c*p*g)+.5/Mr,b=a*(s*l/4-y*f*h),j=.125*a*(l*h-y*f*v*s),M=.5*a*(g*p+y*d*c)+.5,E=b*j-M*R,A=(P*b-m*M)/E,S=(m*j-P*R)/E;e-=A,t-=S}while((ar(A)>Rr||ar(S)>Rr)&&--u>0);return[e,t]};n.geoAiry=function(){var n=Mr,e=r.geoProjectionMutator(c),t=e(n);return t.radius=function(r){return arguments.length?e(n=r*Cr):n*Gr},t.scale(179.976).clipAngle(147)},n.geoAiryRaw=c,n.geoAitoff=function(){return r.geoProjection(f).scale(152.63)},n.geoAitoffRaw=f,n.geoArmadillo=function(){var n=20*Cr,e=n>=0?1:-1,t=Pr(e*n),o=r.geoProjectionMutator(l),i=o(n),u=i.stream;return i.parallel=function(r){return arguments.length?(t=Pr((e=(n=r*Cr)>=0?1:-1)*n),o(n)):n*Gr},i.stream=function(r){var o=i.rotate(),a=u(r),c=(i.rotate([0,0]),u(r));return i.rotate(o),a.sphere=function(){c.polygonStart(),c
 .lineStart();for(var r=-180*e;e*r<180;r+=90*e)c.point(r,90*e);for(;e*(r-=n)>=-180;)c.point(r,e*-fr(lr(r*Cr/2),t)*Gr);c.lineEnd(),c.polygonEnd()},a},i.scale(218.695).center([0,28.0974])},n.geoArmadilloRaw=l,n.geoAugust=function(){return r.geoProjection(g).scale(66.1603)},n.geoAugustRaw=g,n.geoBaker=function(){return r.geoProjection(v).scale(112.314)},n.geoBakerRaw=v,n.geoBerghaus=function(){var n=5,e=r.geoProjectionMutator(s),o=e(n),i=o.stream,u=-lr(.01*Cr),a=mr(.01*Cr);return o.lobes=function(r){return arguments.length?e(n=+r):n},o.stream=function(r){var e=o.rotate(),c=i(r),f=(o.rotate([0,0]),i(r));return o.rotate(e),c.sphere=function(){f.polygonStart(),f.lineStart();for(var r=0,e=360/n,o=2*jr/n,i=90-180/n,c=Mr;r<n;++r,i-=e,c-=o)f.point(fr(a*lr(c),u)*Gr,t(a*mr(c))*Gr),i<-90?(f.point(-90,-180-i-.01),f.point(-90,-180-i+.01)):(f.point(90,i+.01),f.point(90,i-.01));f.lineEnd(),f.polygonEnd()},c},o.scale(87.8076).center([0,17.1875]).clipAngle(179.999)},n.geoBerghausRaw=s,n.geoBertin1953=f
 unction(){var n=r.geoProjection(d());return n.rotate([-16.5,-42]),delete n.rotate,n.scale(176.57).center([7.93,.09])},n.geoBertin1953Raw=d,n.geoBoggs=function(){return r.geoProjection(m).scale(160.857)},n.geoBoggsRaw=m,n.geoBonne=function(){return Hr(R).scale(123.082).center([0,26.1441]).parallel(45)},n.geoBonneRaw=R,n.geoBottomley=function(){var n=.5,e=r.geoProjectionMutator(b),t=e(n);return t.fraction=function(r){return arguments.length?e(n=+r):n},t.scale(158.837)},n.geoBottomleyRaw=b,n.geoBromley=function(){return r.geoProjection(Ir).scale(152.63)},n.geoBromleyRaw=Ir,n.geoChamberlin=k,n.geoChamberlinRaw=A,n.geoChamberlinAfrica=function(){return k([0,22],[45,22],[22.5,-22]).scale(380).center([22.5,2])},n.geoCollignon=function(){return r.geoProjection(x).scale(95.6464).center([0,30])},n.geoCollignonRaw=x,n.geoCraig=function(){return Hr(G).scale(249.828).clipAngle(90)},n.geoCraigRaw=G,n.geoCraster=function(){return r.geoProjection(C).scale(156.19)},n.geoCrasterRaw=C,n.geoCylindrical
 EqualArea=function(){return Hr(z).parallel(38.58).scale(195.044)},n.geoCylindricalEqualAreaRaw=z,n.geoCylindricalStereographic=function(){return Hr(F).scale(124.75)},n.geoCylindricalStereographicRaw=F,n.geoEckert1=function(){return r.geoProjection(L).scale(165.664)},n.geoEckert1Raw=L,n.geoEckert2=function(){return r.geoProjection(q).scale(165.664)},n.geoEckert2Raw=q,n.geoEckert3=function(){return r.geoProjection(B).scale(180.739)},n.geoEckert3Raw=B,n.geoEckert4=function(){return r.geoProjection(H).scale(180.739)},n.geoEckert4Raw=H,n.geoEckert5=function(){return r.geoProjection(I).scale(173.044)},n.geoEckert5Raw=I,n.geoEckert6=function(){return r.geoProjection(W).scale(173.044)},n.geoEckert6Raw=W,n.geoEisenlohr=function(){return r.geoProjection(T).scale(62.5271)},n.geoEisenlohrRaw=T,n.geoFahey=function(){return r.geoProjection(D).scale(137.152)},n.geoFaheyRaw=D,n.geoFoucaut=function(){return r.geoProjection(N).scale(135.264)},n.geoFoucautRaw=N,n.geoGilbert=function(n){function e(n){r
 eturn i(Q(n))}function o(n){e[n]=function(r){return arguments.length?(i[n](r),e):i[n]()}}null==n&&(n=r.geoOrthographic);var i=n(),u=r.geoEquirectangular().scale(Gr).precision(0).clipAngle(null).translate([0,0]);return i.invert&&(e.invert=function(n){return V(i.invert(n))}),e.stream=function(n){var r=i.stream(n),e=u.stream({point:function(n,e){r.point(n/2,t(Pr(-e/2*Cr))*Gr)},lineStart:function(){r.lineStart()},lineEnd:function(){r.lineEnd()},polygonStart:function(){r.polygonStart()},polygonEnd:function(){r.polygonEnd()}});return e.sphere=r.sphere,e},e.rotate=function(n){return arguments.length?(u.rotate(n),e):u.rotate()},e.center=function(n){return arguments.length?(i.center(Q(n)),e):V(i.center())},o("clipAngle"),o("clipExtent"),o("scale"),o("translate"),o("precision"),e.scale(249.5)},n.geoGingery=function(){var n=6,e=30*Cr,o=lr(e),i=mr(e),u=r.geoProjectionMutator(_),a=u(e,n),c=a.stream,f=-lr(.01*Cr),l=mr(.01*Cr);return a.radius=function(r){return arguments.length?(o=lr(e=r*Cr),i=mr(
 e),u(e,n)):e*Gr},a.lobes=function(r){return arguments.length?u(e,n=+r):n},a.stream=function(r){var e=a.rotate(),u=c(r),g=(a.rotate([0,0]),c(r));return a.rotate(e),u.sphere=function(){g.polygonStart(),g.lineStart();for(var r=0,e=2*jr/n,u=0;r<n;++r,u-=e)g.point(fr(l*lr(u),f)*Gr,t(l*mr(u))*Gr),g.point(fr(i*lr(u-e/2),o)*Gr,t(i*mr(u-e/2))*Gr);g.lineEnd(),g.polygonEnd()},u},a.rotate([90,-40]).scale(91.7095).clipAngle(179.999)},n.geoGingeryRaw=_,n.geoGinzburg4=function(){return r.geoProjection(Qr).scale(149.995)},n.geoGinzburg4Raw=Qr,n.geoGinzburg5=function(){return r.geoProjection(Vr).scale(153.93)},n.geoGinzburg5Raw=Vr,n.geoGinzburg6=function(){return r.geoProjection(_r).scale(130.945)},n.geoGinzburg6Raw=_r,n.geoGinzburg8=function(){return r.geoProjection(U).scale(131.747)},n.geoGinzburg8Raw=U,n.geoGinzburg9=function(){return r.geoProjection(Kr).scale(131.087)},n.geoGinzburg9Raw=Kr,n.geoGringorten=function(){return r.geoProjection(Or(J)).scale(239.75)},n.geoGringortenRaw=J,n.geoGuyou=fun
 ction(){return r.geoProjection(Or(Z)).scale(151.496)},n.geoGuyouRaw=Z,n.geoHammer=function(){var n=2,e=r.geoProjectionMutator(p),t=e(n);return t.coefficient=function(r){return arguments.length?e(n=+r):n},t.scale(169.529)},n.geoHammerRaw=p,n.geoHammerRetroazimuthal=function(){var n=0,e=r.geoProjectionMutator($),t=e(n),o=t.rotate,i=t.stream,u=r.geoCircle();return t.parallel=function(r){if(!arguments.length)return n*Gr;var o=t.rotate();return e(n=r*Cr).rotate(o)},t.rotate=function(r){return arguments.length?(o.call(t,[r[0],r[1]-n*Gr]),u.center([-r[0],-r[1]]),t):(r=o.call(t),r[1]+=n*Gr,r)},t.stream=function(n){return n=i(n),n.sphere=function(){n.polygonStart();var r,e=u.radius(89.99)().coordinates[0],t=e.length-1,o=-1;for(n.lineStart();++o<t;)n.point((r=e[o])[0],r[1]);for(n.lineEnd(),t=(e=u.radius(90.01)().coordinates[0]).length-1,n.lineStart();--o>=0;)n.point((r=e[o])[0],r[1]);n.lineEnd(),n.polygonEnd()},n},t.scale(79.4187).parallel(45).clipAngle(179.999)},n.geoHammerRetroazimuthalRaw=
 $,n.geoHealpix=function(){var n=4,t=r.geoProjectionMutator(rn),o=t(n),i=o.stream;return o.lobes=function(r){return arguments.length?t(n=+r):n},o.stream=function(t){var u=o.rotate(),a=i(t),c=(o.rotate([0,0]),i(t));return o.rotate(u),a.sphere=function(){r.geoStream(function(n){return{type:"Polygon",coordinates:[e.range(-180,180+n/2,n).map(function(n,r){return[n,1&r?90-1e-6:Ur]}).concat(e.range(180,-180-n/2,-n).map(function(n,r){return[n,1&r?1e-6-90:-Ur]}))]}}(180/n),c)},a},o.scale(239.75)},n.geoHealpixRaw=rn,n.geoHill=function(){var n=1,e=r.geoProjectionMutator(en),t=e(n);return t.ratio=function(r){return arguments.length?e(n=+r):n},t.scale(167.774).center([0,18.67])},n.geoHillRaw=en,n.geoHomolosine=function(){return r.geoProjection(on).scale(152.63)},n.geoHomolosineRaw=on,n.geoInterrupt=Zr,n.geoInterruptedBoggs=function(){return Zr(m,$r).scale(160.857)},n.geoInterruptedHomolosine=function(){return Zr(on,ne).scale(152.63)},n.geoInterruptedMollweide=function(){return Zr(Lr,re).scale(16
 9.529)},n.geoInterruptedMollweideHemispheres=function(){return Zr(Lr,ee).scale(169.529).rotate([20,0])},n.geoInterruptedSinuMollweide=function(){return Zr(tn,te).rotate([-20,-55]).scale(164.263).center([0,-5.4036])},n.geoInterruptedSinusoidal=function(){return Zr(P,oe).scale(152.63).rotate([-20,0])},n.geoKavrayskiy7=function(){return r.geoProjection(cn).scale(158.837)},n.geoKavrayskiy7Raw=cn,n.geoLagrange=function(){var n=.5,e=r.geoProjectionMutator(fn),t=e(n);return t.spacing=function(r){return arguments.length?e(n=+r):n},t.scale(124.75)},n.geoLagrangeRaw=fn,n.geoLarrivee=function(){return r.geoProjection(ln).scale(97.2672)},n.geoLarriveeRaw=ln,n.geoLaskowski=function(){return r.geoProjection(gn).scale(139.98)},n.geoLaskowskiRaw=gn,n.geoLittrow=function(){return r.geoProjection(vn).scale(144.049).clipAngle(89.999)},n.geoLittrowRaw=vn,n.geoLoximuthal=function(){return Hr(sn).parallel(40).scale(158.837)},n.geoLoximuthalRaw=sn,n.geoMiller=function(){return r.geoProjection(pn).scale(10
 8.318)},n.geoMillerRaw=pn,n.geoModifiedStereographic=dn,n.geoModifiedStereographicRaw=hn,n.geoModifiedStereographicAlaska=function(){return dn(ue,[152,-64]).scale(1500).center([-160.908,62.4864]).clipAngle(25)},n.geoModifiedStereographicGs48=function(){return dn(ae,[95,-38]).scale(1e3).clipAngle(55).center([-96.5563,38.8675])},n.geoModifiedStereographicGs50=function(){return dn(ce,[120,-45]).scale(359.513).clipAngle(55).center([-117.474,53.0628])},n.geoModifiedStereographicMiller=function(){return dn(fe,[-20,-18]).scale(209.091).center([20,16.7214]).clipAngle(82)},n.geoModifiedStereographicLee=function(){return dn(le,[165,10]).scale(250).clipAngle(130).center([-165,-10])},n.geoMollweide=function(){return r.geoProjection(Lr).scale(169.529)},n.geoMollweideRaw=Lr,n.geoMtFlatPolarParabolic=function(){return r.geoProjection(wn).scale(164.859)},n.geoMtFlatPolarParabolicRaw=wn,n.geoMtFlatPolarQuartic=function(){return r.geoProjection(yn).scale(188.209)},n.geoMtFlatPolarQuarticRaw=yn,n.geoM
 tFlatPolarSinusoidal=function(){return r.geoProjection(mn).scale(166.518)},n.geoMtFlatPolarSinusoidalRaw=mn,n.geoNaturalEarth=r.geoNaturalEarth1,n.geoNaturalEarthRaw=r.geoNaturalEarth1Raw,n.geoNaturalEarth2=function(){return r.geoProjection(Pn).scale(175.295)},n.geoNaturalEarth2Raw=Pn,n.geoNellHammer=function(){return r.geoProjection(Rn).scale(152.63)},n.geoNellHammerRaw=Rn,n.geoPatterson=function(){return r.geoProjection(bn).scale(139.319)},n.geoPattersonRaw=bn,n.geoPolyconic=function(){return r.geoProjection(jn).scale(103.74)},n.geoPolyconicRaw=jn,n.geoPolyhedral=je,n.geoPolyhedralButterfly=function(n){n=n||function(n){var e=r.geoCentroid({type:"MultiPoint",coordinates:n});return r.geoGnomonic().scale(1).translate([0,0]).rotate([-e[0],-e[1]])};var e=Ee.map(function(r){return{face:r,project:n(r)}});return[-1,0,0,1,0,1,4,5].forEach(function(n,r){var t=e[n];t&&(t.children||(t.children=[])).push(e[r])}),je(e[0],function(n,r){return e[n<-jr/2?r<0?6:4:n<0?r<0?2:0:n<jr/2?r<0?3:1:r<0?7:5]
 }).scale(101.858).center([0,45])},n.geoPolyhedralCollignon=function(n){n=n||function(n){var e=r.geoCentroid({type:"MultiPoint",coordinates:n});return r.geoProjection(Gn).translate([0,0]).scale(1).rotate(e[1]>0?[-e[0],0]:[180-e[0],180])};var e=Ee.map(function(r){return{face:r,project:n(r)}});return[-1,0,0,1,0,1,4,5].forEach(function(n,r){var t=e[n];t&&(t.children||(t.children=[])).push(e[r])}),je(e[0],function(n,r){return e[n<-jr/2?r<0?6:4:n<0?r<0?2:0:n<jr/2?r<0?3:1:r<0?7:5]}).scale(121.906).center([0,48.5904])},n.geoPolyhedralWaterman=function(n){n=n||function(n){var e=6===n.length?r.geoCentroid({type:"MultiPoint",coordinates:n}):n[0];return r.geoGnomonic().scale(1).translate([0,0]).rotate([-e[0],-e[1]])};var e=Ee.map(function(n){for(var r,e=n.map(Fn),t=e.length,o=e[t-1],i=[],u=0;u<t;++u)r=e[u],i.push(zn([.9486832980505138*o[0]+.31622776601683794*r[0],.9486832980505138*o[1]+.31622776601683794*r[1],.9486832980505138*o[2]+.31622776601683794*r[2]]),zn([.9486832980505138*r[0]+.316227766
 01683794*o[0],.9486832980505138*r[1]+.31622776601683794*o[1],.9486832980505138*r[2]+.31622776601683794*o[2]])),o=r;return i}),t=[],o=[-1,0,0,1,0,1,4,5];e.forEach(function(n,r){for(var i=Ee[r],u=i.length,a=t[r]=[],c=0;c<u;++c)e.push([i[c],n[(2*c+2)%(2*u)],n[(2*c+1)%(2*u)]]),o.push(r),a.push(function(n,r){return[n[1]*r[2]-n[2]*r[1],n[2]*r[0]-n[0]*r[2],n[0]*r[1]-n[1]*r[0]]}(Fn(n[(2*c+2)%(2*u)]),Fn(n[(2*c+1)%(2*u)])))});var i=e.map(function(r){return{project:n(r),face:r}});return o.forEach(function(n,r){var e=i[n];e&&(e.children||(e.children=[])).push(i[r])}),je(i[0],function(n,r){var e=lr(r),o=[e*lr(n),e*mr(n),mr(r)],u=n<-jr/2?r<0?6:4:n<0?r<0?2:0:n<jr/2?r<0?3:1:r<0?7:5,a=t[u];return i[Cn(a[0],o)<0?8+3*u:Cn(a[1],o)<0?8+3*u+1:Cn(a[2],o)<0?8+3*u+2:u]}).scale(110.625).center([0,45])},n.geoProject=function(n,r){var e,t=r.stream;if(!t)throw new Error("invalid projection");switch(n&&n.type){case"Feature":e=qn;break;case"FeatureCollection":e=Ln;break;default:e=Bn}return e(n,t)},n.geoGringorten
 Quincuncial=function(){return Fe(J).scale(176.423)},n.geoPeirceQuincuncial=Le,n.geoPierceQuincuncial=Le,n.geoQuantize=function(n,r){function e(n){var e=n.length,t=2,o=new Array(e);for(o[0]=+n[0].toFixed(r),o[1]=+n[1].toFixed(r);t<e;)o[t]=n[t],++t;return o}function t(n){return n.map(e)}function o(n){return n.map(t)}function i(n){if(null==n)return n;var r;switch(n.type){case"GeometryCollection":r={type:"GeometryCollection",geometries:n.geometries.map(i)};break;case"Point":r={type:"Point",coordinates:e(n.coordinates)};break;case"MultiPoint":case"LineString":r={type:n.type,coordinates:t(n.coordinates)};break;case"MultiLineString":case"Polygon":r={type:n.type,coordinates:o(n.coordinates)};break;case"MultiPolygon":r={type:"MultiPolygon",coordinates:n.coordinates.map(o)};break;default:return n}return null!=n.bbox&&(r.bbox=n.bbox),r}function u(n){var r={type:"Feature",properties:n.properties,geometry:i(n.geometry)};return null!=n.id&&(r.id=n.id),null!=n.bbox&&(r.bbox=n.bbox),r}if(!(0<=(r=+r
 )&&r<=20))throw new Error("invalid digits");if(null!=n)switch(n.type){case"Feature":return u(n);case"FeatureCollection":var a={type:"FeatureCollection",features:n.features.map(u)};return null!=n.bbox&&(a.bbox=n.bbox),a;default:return i(n)}return n},n.geoQuincuncial=Fe,n.geoRectangularPolyconic=function(){return Hr(Hn).scale(131.215)},n.geoRectangularPolyconicRaw=Hn,n.geoRobinson=function(){return r.geoProjection(In).scale(152.63)},n.geoRobinsonRaw=In,n.geoSatellite=function(){var n=2,e=0,t=r.geoProjectionMutator(Wn),i=t(n,e);return i.distance=function(r){return arguments.length?t(n=+r,e):n},i.tilt=function(r){return arguments.length?t(n,e=r*Cr):e*Gr},i.scale(432.147).clipAngle(o(1/n)*Gr-1e-6)},n.geoSatelliteRaw=Wn,n.geoSinuMollweide=function(){return r.geoProjection(tn).rotate([-20,-55]).scale(164.263).center([0,-5.4036])},n.geoSinuMollweideRaw=tn,n.geoSinusoidal=function(){return r.geoProjection(P).scale(152.63)},n.geoSinusoidalRaw=P,n.geoStitch=function(n){if(null==n)return n;swit
 ch(n.type){case"Feature":return Kn(n);case"FeatureCollection":var r={type:"FeatureCollection",features:n.features.map(Kn)};return null!=n.bbox&&(r.bbox=n.bbox),r;default:return On(n)}},n.geoTimes=function(){return r.geoProjection(Un).scale(146.153)},n.geoTimesRaw=Un,n.geoTwoPointAzimuthal=Xn,n.geoTwoPointAzimuthalRaw=Jn,n.geoTwoPointAzimuthalUsa=function(){return Xn([-158,21.5],[-77,39]).clipAngle(60).scale(400)},n.geoTwoPointEquidistant=Zn,n.geoTwoPointEquidistantRaw=Yn,n.geoTwoPointEquidistantUsa=function(){return Zn([-158,21.5],[-77,39]).clipAngle(130).scale(122.571)},n.geoVanDerGrinten=function(){return r.geoProjection($n).scale(79.4183)},n.geoVanDerGrintenRaw=$n,n.geoVanDerGrinten2=function(){return r.geoProjection(nr).scale(79.4183)},n.geoVanDerGrinten2Raw=nr,n.geoVanDerGrinten3=function(){return r.geoProjection(rr).scale(79.4183)},n.geoVanDerGrinten3Raw=rr,n.geoVanDerGrinten4=function(){return r.geoProjection(er).scale(127.16)},n.geoVanDerGrinten4Raw=er,n.geoWagner4=function(
 ){return r.geoProjection(Ue).scale(176.84)},n.geoWagner4Raw=Ue,n.geoWagner6=function(){return r.geoProjection(tr).scale(152.63)},n.geoWagner6Raw=tr,n.geoWagner7=function(){return r.geoProjection(or).scale(172.632)},n.geoWagner7Raw=or,n.geoWiechel=function(){return r.geoProjection(ir).rotate([0,-90,45]).scale(124.75).clipAngle(179.999)},n.geoWiechelRaw=ir,n.geoWinkel3=function(){return r.geoProjection(ur).scale(158.837)},n.geoWinkel3Raw=ur,Object.defineProperty(n,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/src/main/resources/web/js/rs/libs/d3js/d3-geo-projection.v2.min.js.1 b/src/main/resources/web/js/rs/libs/d3js/d3-geo-projection.v2.min.js.1
new file mode 100644
index 0000000..1d93da8
--- /dev/null
+++ b/src/main/resources/web/js/rs/libs/d3js/d3-geo-projection.v2.min.js.1
@@ -0,0 +1,2 @@
+// https://d3js.org/d3-geo-projection/ Version 2.3.2. Copyright 2017 Mike Bostock.
+!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("d3-geo"),require("d3-array")):"function"==typeof define&&define.amd?define(["exports","d3-geo","d3-array"],r):r(n.d3=n.d3||{},n.d3,n.d3)}(this,function(n,r,e){"use strict";function t(n){return n>1?Mr:n<-1?-Mr:Math.asin(n)}function o(n){return n>1?0:n<-1?jr:Math.acos(n)}function i(n){return n>0?Math.sqrt(n):0}function u(n){return(gr(n)-gr(-n))/2}function a(n){return(gr(n)+gr(-n))/2}function c(n){function r(n,r){var e=lr(n),t=lr(r),i=mr(r),u=t*e,a=-((1-u?sr((1+u)/2)/(1-u):-.5)+o/(1+u));return[a*t*mr(n),a*i]}var e=Pr(n/2),o=2*sr(lr(n/2))/(e*e);return r.invert=function(r,e){var u,a=i(r*r+e*e),c=-n/2,f=50;if(!a)return[0,0];do{var l=c/2,g=lr(l),v=mr(l),s=Pr(l),p=sr(1/g);c-=u=(2/s*p-o*s-a)/(-p/(v*v)+1-o/(2*g*g))}while(ar(u)>Rr&&--f>0);var h=mr(c);return[fr(r*h,a*lr(c)),t(e*h/a)]},r}function f(n,r){var e=lr(r),t=function(n){return n?n/Math.sin(n):1}(o(e*lr(n/=2)));return[2*e*mr(n)*t,mr(r)*t]}function l(n)
 {function r(n,r){var a=lr(r),c=lr(n/=2);return[(1+a)*mr(n),(o*r>-fr(c,i)-.001?0:10*-o)+u+mr(r)*t-(1+a)*e*c]}var e=mr(n),t=lr(n),o=n>=0?1:-1,i=Pr(o*n),u=(1+e-t)/2;return r.invert=function(n,r){var a=0,c=0,f=50;do{var l=lr(a),g=mr(a),v=lr(c),s=mr(c),p=1+v,h=p*g-n,d=u+s*t-p*e*l-r,w=p*l/2,y=-g*s,m=e*p*g/2,P=t*v+e*l*s,R=y*m-P*w,b=(d*y-h*P)/R/2,j=(h*m-d*w)/R;a-=b,c-=j}while((ar(b)>Rr||ar(j)>Rr)&&--f>0);return o*c>-fr(lr(a),i)-.001?[2*a,c]:null},r}function g(n,r){var e=Pr(r/2),t=i(1-e*e),o=1+t*lr(n/=2),u=mr(n)*t/o,a=e/o,c=u*u,f=a*a;return[4/3*u*(3+c-3*f),4/3*a*(3+3*c-f)]}function v(n,r){var e=ar(r);return e<Er?[n,sr(Pr(Er+r/2))]:[n*lr(e)*(2*Sr-1/mr(e)),yr(r)*(2*Sr*(e-Er)-sr(Pr(e/2)))]}function s(n){function e(n,e){var o=r.geoAzimuthalEquidistantRaw(n,e);if(ar(n)>Mr){var a=fr(o[1],o[0]),c=i(o[0]*o[0]+o[1]*o[1]),f=u*wr((a-Mr)/u)+Mr,l=fr(mr(a-=f),2-lr(a));a=f+t(jr/c*mr(l))-l,o[0]=c*lr(a),o[1]=c*mr(a)}return o}var u=2*jr/n;return e.invert=function(n,e){var t=i(n*n+e*e);if(t>Mr){var a=fr(e,n),c
 =u*wr((a-Mr)/u)+Mr,f=a>c?-1:1,l=t*lr(c-a),g=1/Pr(f*o((l-jr)/i(jr*(jr-2*l)+t*t)));a=c+2*cr((g+f*i(g*g-3))/3),n=t*lr(a),e=t*mr(a)}return r.geoAzimuthalEquidistantRaw.invert(n,e)},e}function p(n,e){function t(t,o){var i=r.geoAzimuthalEqualAreaRaw(t/e,o);return i[0]*=n,i}return arguments.length<2&&(e=n),1===e?r.geoAzimuthalEqualAreaRaw:e===1/0?h:(t.invert=function(t,o){var i=r.geoAzimuthalEqualAreaRaw.invert(t/n,o);return i[0]*=e,i},t)}function h(n,r){return[n*lr(r)/lr(r/=2),2*mr(r)]}function d(){var n=p(1.68,2);return function(r,e){if(r+e<-1.4){var t=(r-e+1.6)*(r+e+1.4)/8;r+=t,e-=.8*t*mr(e+jr/2)}var o=n(r,e),i=(1-lr(r*e))/12;return o[1]<0&&(o[0]*=1+i),o[1]>0&&(o[1]*=1+i/1.5*o[0]*o[0]),o}}function w(n,r){var e,t=n*mr(r),o=30;do{r-=e=(r+mr(r)-t)/(1+lr(r))}while(ar(e)>Rr&&--o>0);return r/2}function y(n,r,e){function o(t,o){return[n*t*lr(o=w(e,o)),r*mr(o)]}return o.invert=function(o,i){return i=t(i/r),[o/(n*lr(i)),t((2*i+mr(2*i))/e)]},o}function m(n,r){var e=w(jr,r);return[qr*n/(1/lr(r)+Br
 /lr(e)),(r+Sr*mr(e))/qr]}function P(n,r){return[n*lr(r),r]}function R(n){function r(r,t){var o=e+n-t,i=o?r*lr(t)/o:o;return[o*mr(i),e-o*lr(i)]}if(!n)return P;var e=1/Pr(n);return r.invert=function(r,t){var o=i(r*r+(t=e-t)*t),u=e+n-o;return[o/lr(u)*fr(r,t),u]},r}function b(n){function r(r,e){var t=Mr-e,o=t?r*n*mr(t)/t:t;return[t*mr(o)/n,Mr-t*lr(o)]}return r.invert=function(r,e){var t=r*n,o=Mr-e,u=i(t*t+o*o),a=fr(t,o);return[(u?u/mr(u):1)*a/n,Mr-u]},r}function j(n,r,e,u,a,c){var f,l=lr(c);if(ar(n)>1||ar(c)>1)f=o(e*a+r*u*l);else{var g=mr(n/2),v=mr(c/2);f=2*t(i(g*g+r*u*v*v))}return ar(f)>Rr?[f,fr(u*mr(c),r*a-e*u*l)]:[0,0]}function M(n,r,e){return o((n*n+r*r-e*e)/(2*n*r))}function E(n){return n-2*jr*vr((n+jr)/(2*jr))}function A(n,r,e){for(var t,o=[[n[0],n[1],mr(n[1]),lr(n[1])],[r[0],r[1],mr(r[1]),lr(r[1])],[e[0],e[1],mr(e[1]),lr(e[1])]],i=o[2],u=0;u<3;++u,i=t)t=o[u],i.v=j(t[1]-i[1],i[3],i[2],t[3],t[2],t[0]-i[0]),i.point=[0,0];var a=M(o[0].v[0],o[2].v[0],o[1].v[0]),c=M(o[0].v[0],o[1].v[0]
 ,o[2].v[0]),f=jr-a;o[2].point[1]=0,o[0].point[0]=-(o[1].point[0]=o[0].v[0]/2);var l=[o[2].point[0]=o[0].point[0]+o[2].v[0]*lr(a),2*(o[0].point[1]=o[1].point[1]=o[2].v[0]*mr(a))];return function(n,r){var e,t=mr(r),i=lr(r),u=new Array(3);for(e=0;e<3;++e){var a=o[e];if(u[e]=j(r-a[1],a[3],a[2],i,t,n-a[0]),!u[e][0])return a.point;u[e][1]=E(u[e][1]-a.v[1])}var g=l.slice();for(e=0;e<3;++e){var v=2==e?0:e+1,s=M(o[e].v[0],u[e][0],u[v][0]);u[e][1]<0&&(s=-s),e?1==e?(s=c-s,g[0]-=u[e][0]*lr(s),g[1]-=u[e][0]*mr(s)):(s=f-s,g[0]+=u[e][0]*lr(s),g[1]+=u[e][0]*mr(s)):(g[0]+=u[e][0]*lr(s),g[1]-=u[e][0]*mr(s))}return g[0]/=3,g[1]/=3,g}}function S(n){return n[0]*=Cr,n[1]*=Cr,n}function k(n,e,t){var o=r.geoCentroid({type:"MultiPoint",coordinates:[n,e,t]}),i=[-o[0],-o[1]],u=r.geoRotation(i),a=r.geoProjection(A(S(u(n)),S(u(e)),S(u(t)))).rotate(i),c=a.center;return delete a.rotate,a.center=function(n){return arguments.length?c(u(n)):u.invert(c())},a.clipAngle(90)}function x(n,r){var e=i(1-mr(r));return[2/kr*
 n*e,kr*(1-e)]}function G(n){function r(n,r){return[n,(n?n/mr(n):1)*(mr(r)*lr(n)-e*lr(r))]}var e=Pr(n);return r.invert=e?function(n,r){n&&(r*=mr(n)/n);var t=lr(n);return[n,2*fr(i(t*t+e*e-r*r)-t,e-r)]}:function(n,r){return[n,t(n?r*Pr(n)/n:r)]},r}function C(n,r){return[Wr*n*(2*lr(2*r/3)-1)/kr,Wr*kr*mr(r/3)]}function z(n){function r(n,r){return[n*e,mr(r)/e]}var e=lr(n);return r.invert=function(n,r){return[n/e,t(r*e)]},r}function F(n){function r(n,r){return[n*e,(1+e)*Pr(r/2)]}var e=lr(n);return r.invert=function(n,r){return[n/e,2*cr(r/(1+e))]},r}function L(n,r){var e=i(8/(3*jr));return[e*n*(1-ar(r)/jr),e*r]}function q(n,r){var e=i(4-3*mr(ar(r)));return[2/i(6*jr)*n*e,yr(r)*i(2*jr/3)*(2-e)]}function B(n,r){var e=i(jr*(4+jr));return[2/e*n*(1+i(1-4*r*r/(jr*jr))),4/e*r]}function H(n,r){var e=(2+Mr)*mr(r);r/=2;for(var t=0,o=1/0;t<10&&ar(o)>Rr;t++){var u=lr(r);r-=o=(r+mr(r)*(u+2)-e)/(2*u*(1+u))}return[2/i(jr*(4+jr))*n*(1+lr(r)),2*i(jr/(4+jr))*mr(r)]}function I(n,r){return[n*(1+lr(r))/i(2+jr),2*
 r/i(2+jr)]}function W(n,r){for(var e=(1+Mr)*mr(r),t=0,o=1/0;t<10&&ar(o)>Rr;t++)r-=o=(r+mr(r)-e)/(1+lr(r));return e=i(2+jr),[n*(1+lr(r))/e,2*r/e]}function T(n,r){var e=mr(n/=2),t=lr(n),o=i(lr(r)),u=lr(r/=2),a=mr(r)/(u+Sr*t*o),c=i(2/(1+a*a)),f=i((Sr*u+(t+e)*o)/(Sr*u+(t-e)*o));return[Tr*(c*(f-1/f)-2*sr(f)),Tr*(c*a*(f+1/f)-2*cr(a))]}function D(n,r){var e=Pr(r/2);return[n*Dr*i(1-e*e),(1+Dr)*e]}function N(n,r){var e=r/2,t=lr(e);return[2*n/kr*lr(r)*t*t,kr*Pr(e)]}function Q(n){return[n[0]/2,t(Pr(n[1]/2*Cr))*Gr]}function V(n){return[2*n[0],2*cr(mr(n[1]*Cr))*Gr]}function _(n,e){function t(e,t){var a=r.geoAzimuthalEquidistantRaw(e,t),c=a[0],f=a[1],l=c*c+f*f;if(l>u){var g=i(l),v=fr(f,c),s=o*wr(v/o),p=v-s,h=n*lr(p),d=(n*mr(p)-p*mr(h))/(Mr-h),w=K(p,d),y=(jr-n)/O(w,h,jr);c=g;var m,P=50;do{c-=m=(n+O(w,h,c)*y-g)/(w(c)*y)}while(ar(m)>Rr&&--P>0);f=p*mr(c),c<Mr&&(f-=d*(c-Mr));var R=mr(s),b=lr(s);a[0]=c*b-f*R,a[1]=c*R+f*b}return a}var o=2*jr/e,u=n*n;return t.invert=function(e,t){var a=e*e+t*t;if(a>u){va
 r c=i(a),f=fr(t,e),l=o*wr(f/o),g=f-l;e=c*lr(g),t=c*mr(g);for(var v=e-Mr,s=mr(e),p=t/s,h=e<Mr?1/0:0,d=10;;){var w=n*mr(p),y=n*lr(p),m=mr(y),P=Mr-y,R=(w-p*m)/P,b=K(p,R);if(ar(h)<br||!--d)break;p-=h=(p*s-R*v-t)/(s-2*v*(P*(y+p*w*lr(y)-m)-w*(w-p*m))/(P*P))}e=(c=n+O(b,y,e)*(jr-n)/O(b,y,jr))*lr(f=l+p),t=c*mr(f)}return r.geoAzimuthalEquidistantRaw.invert(e,t)},t}function K(n,r){return function(e){var t=n*lr(e);return e<Mr&&(t-=r),i(1+t*t)}}function O(n,r,e){for(var t=(e-r)/50,o=n(r)+n(e),i=1,u=r;i<50;++i)o+=2*n(u+=t);return.5*o*t}function U(n,r){var e=n*n,t=r*r;return[n*(1-.162388*t)*(.87-952426e-9*e*e),r*(1+t/12)]}function J(n,r){var e=yr(n),o=yr(r),u=lr(r),a=lr(n)*u,c=mr(n)*u,f=mr(o*r);n=ar(fr(c,f)),r=t(a),ar(n-Mr)>Rr&&(n%=Mr);var l=function(n,r){if(r===Mr)return[0,0];var e,o,u=mr(r),a=u*u,c=a*a,f=1+c,l=1+3*c,g=1-c,v=t(1/i(f)),s=g+a*f*v,p=(1-u)/s,h=i(p),d=p*f,w=i(d),y=h*g;if(0===n)return[0,-(y+a*w)];var m,P=lr(r),R=1/P,b=2*u*P,j=(-s*P-(-3*a+v*l)*b*(1-u))/(s*s),M=-R*b,E=-R*(a*f*j+p*l*b),A=
 -2*R*(g*(.5*j/h)-2*a*h*b),S=4*n/jr;if(n>.222*jr||r<jr/4&&n>.175*jr){if(e=(y+a*i(d*(1+c)-y*y))/(1+c),n>jr/4)return[e,e];var k=e,x=.5*e;e=.5*(x+k),o=50;do{var G=i(d-e*e),C=e*(A+M*G)+E*t(e/w)-S;if(!C)break;C<0?x=e:k=e,e=.5*(x+k)}while(ar(k-x)>Rr&&--o>0)}else{e=Rr,o=25;do{var z=e*e,F=i(d-z),L=A+M*F,q=e*L+E*t(e/w)-S,B=L+(E-M*z)/F;e-=m=F?q/B:0}while(ar(m)>Rr&&--o>0)}return[e,-y-a*i(d-e*e)]}(n>jr/4?Mr-n:n,r);return n>jr/4&&(f=l[0],l[0]=-l[1],l[1]=-f),l[0]*=e,l[1]*=-o,l}function X(n,r){var e,o,c,f,l;if(r<Rr)return f=mr(n),o=lr(n),e=r*(n-f*o)/4,[f-e*o,o+e*f,1-r*f*f/2,n-e];if(r>=1-Rr)return e=(1-r)/4,o=a(n),f=function(n){return((n=gr(2*n))-1)/(n+1)}(n),c=1/o,l=o*u(n),[f+e*(l-n)/(o*o),c-e*f*c*(l-n),c+e*f*c*(l+n),2*cr(gr(n))-Mr+e*(l-n)/o];var g=[1,0,0,0,0,0,0,0,0],v=[i(r),0,0,0,0,0,0,0,0],s=0;for(o=i(1-r),l=1;ar(v[s]/g[s])>Rr&&s<8;)e=g[s++],v[s]=(e-o)/2,g[s]=(e+o)/2,o=i(e*o),l*=2;c=l*g[s]*n;do{c=(t(f=v[s]*mr(o=c)/g[s])+c)/2}while(--s);return[mr(c),f=lr(c),f/lr(c-o),c]}function Y(n,r){if(!r)retu
 rn n;if(1===r)return sr(Pr(n/2+Er));for(var e=1,t=i(1-r),o=i(r),u=0;ar(o)>Rr;u++){if(n%jr){var a=cr(t*Pr(n)/e);a<0&&(a+=jr),n+=a+~~(n/jr)*jr}else n+=n;o=(e+t)/2,t=i(e*t),o=((e=o)-t)/2}return n/(dr(2,u)*e)}function Z(n,r){var e=(Sr-1)/(Sr+1),t=i(1-e*e),o=Y(Mr,t*t),a=sr(Pr(jr/4+ar(r)/2)),c=gr(-1*a)/i(e),f=function(n,r){var e=n*n,t=r+1,o=1-e-r*r;return[.5*((n>=0?Mr:-Mr)-fr(o,2*n)),-.25*sr(o*o+4*e)+.5*sr(t*t+e)]}(c*lr(-1*n),c*mr(-1*n)),l=function(n,r,e){var t=ar(n),o=u(ar(r));if(t){var a=1/mr(t),c=1/(Pr(t)*Pr(t)),f=-(c+e*(o*o*a*a)-1+e),l=(-f+i(f*f-(e-1)*c*4))/2;return[Y(cr(1/i(l)),e)*yr(n),Y(cr(i((l/c-1)/e)),1-e)*yr(r)]}return[0,Y(cr(o),1-e)*yr(r)]}(f[0],f[1],t*t);return[-l[1],(r>=0?1:-1)*(.5*o-l[0])]}function $(n){function r(n,r){var i=u(n,r);n=i[0],r=i[1];var a=mr(r),c=lr(r),f=lr(n),l=o(e*a+t*c*f),g=mr(l),v=ar(g)>Rr?l/g:1;return[v*t*mr(n),(ar(n)>Mr?v:-v)*(e*c-t*a*f)]}var e=mr(n),t=lr(n),u=nn(n);return u.invert=nn(-n),r.invert=function(n,r){var t=i(n*n+r*r),o=-mr(t),a=lr(t),c=t*a,f=-r*
 o,l=t*e,g=i(c*c+f*f-l*l),v=fr(c*l+f*g,f*l-c*g),s=(t>Mr?-1:1)*fr(n*o,t*lr(v)*a+r*mr(v)*o);return u.invert(s,v)},r}function nn(n){var r=mr(n),e=lr(n);return function(n,o){var i=lr(o),u=lr(n)*i,a=mr(n)*i,c=mr(o);return[fr(a,u*e-c*r),t(c*e+u*r)]}}function rn(n){function r(r,l){var g,v=ar(l);if(v>e){var s=hr(n-1,pr(0,vr((r+jr)/a)));(g=x(r+=jr*(n-1)/n-s*a,v))[0]=g[0]*xr/t-xr*(n-1)/(2*n)+s*xr/n,g[1]=o+4*(g[1]-i)*u/xr,l<0&&(g[1]=-g[1])}else g=Jr(r,l);return g[0]*=c,g[1]/=f,g}var e=Ur*Cr,t=x(jr,e)[0]-x(-jr,e)[0],o=Jr(0,e)[1],i=x(0,e)[1],u=kr-i,a=xr/n,c=4/xr,f=o+u*u*4/xr;return r.invert=function(r,e){r/=c;var l=ar(e*=f);if(l>o){var g=hr(n-1,pr(0,vr((r+jr)/a))),v=x.invert(r=(r+jr*(n-1)/n-g*a)*t/xr,.25*(l-o)*xr/u+i);return v[0]-=jr*(n-1)/n-g*a,e<0&&(v[1]=-v[1]),v}return Jr.invert(r,e)},r}function en(n){function r(r,t){var o,v,s=1-mr(t);if(s&&s<2){var p,h=Mr-t,d=25;do{var w=mr(h),y=lr(h),m=a+fr(w,u-y),P=1+g-2*u*y;h-=p=(h-l*a-u*w+P*m-.5*s*e)/(2*u*w*m)}while(ar(p)>br&&--d>0);o=c*i(P),v=r*m/jr}else
  o=c*(n+s),v=r*a/jr;return[o*mr(v),f-o*lr(v)]}var e,u=1+n,a=t(mr(1/u)),c=2*i(jr/(e=jr+4*a*u)),f=.5*c*(u+i(n*(2+n))),l=n*n,g=u*u;return r.invert=function(n,r){var v=n*n+(r-=f)*r,s=(1+g-v/(c*c))/(2*u),p=o(s),h=mr(p),d=a+fr(h,u-s);return[t(n/i(v))*jr/d,t(1-2*(p-l*a-u*h+(1+g-2*u*s)*d)/e)]},r}function tn(n,r){return r>-Xr?(n=Lr(n,r),n[1]+=Yr,n):P(n,r)}function on(n,r){return ar(r)>Xr?(n=Lr(n,r),n[1]-=r>0?Yr:-Yr,n):P(n,r)}function un(n,r){return ar(n[0]-r[0])<Rr&&ar(n[1]-r[1])<Rr}function an(n,r){for(var e,t,o,i=-1,u=n.length,a=n[0],c=[];++i<u;){t=((e=n[i])[0]-a[0])/r,o=(e[1]-a[1])/r;for(var f=0;f<r;++f)c.push([a[0]+f*t,a[1]+f*o]);a=e}return c.push(e),c}function cn(n,r){return[3/xr*n*i(jr*jr/3-r*r),r]}function fn(n){function r(r,e){if(ar(ar(e)-Mr)<Rr)return[0,e<0?-2:2];var t=mr(e),o=dr((1+t)/(1-t),n/2),i=.5*(o+1/o)+lr(r*=n);return[2*mr(r)/i,(o-1/o)/i]}return r.invert=function(r,e){var o=ar(e);if(ar(o-2)<Rr)return r?null:[0,yr(e)*Mr];if(o>2)return null;var i=(r/=2)*r,u=(e/=2)*e,a=2*e/(1+i+
 u);return a=dr((1+a)/(1-a),1/n),[fr(2*r,1-i-u)/n,t((a-1)/(a+1))]},r}function ln(n,r){return[n*(1+i(lr(r)))/2,r/(lr(r/2)*lr(n/6))]}function gn(n,r){var e=n*n,t=r*r;return[n*(.975534+t*(-.0143059*e-.119161+-.0547009*t)),r*(1.00384+e*(.0802894+-.02855*t+199025e-9*e)+t*(.0998909+-.0491032*t))]}function vn(n,r){return[mr(n)/lr(r),Pr(r)*lr(n)]}function sn(n){function r(r,o){var i=o-n,u=ar(i)<Rr?r*e:ar(u=Er+o/2)<Rr||ar(ar(u)-Mr)<Rr?0:r*i/sr(Pr(u)/t);return[u,i]}var e=lr(n),t=Pr(Er+n/2);return r.invert=function(r,o){var i,u=o+n;return[ar(o)<Rr?r/e:ar(i=Er+u/2)<Rr||ar(ar(i)-Mr)<Rr?0:r*sr(Pr(i)/t)/o,u]},r}function pn(n,r){return[n,1.25*sr(Pr(Er+.4*r))]}function hn(n){function r(r,t){for(var o,i=lr(t),u=2/(1+i*lr(r)),a=u*i*mr(r),c=u*mr(t),f=e,l=n[f],g=l[0],v=l[1];--f>=0;)g=(l=n[f])[0]+a*(o=g)-c*v,v=l[1]+a*v+c*o;return g=a*(o=g)-c*v,v=a*v+c*o,[g,v]}var e=n.length-1;return r.invert=function(r,o){var u=20,a=r,c=o;do{for(var f,l=e,g=n[l],v=g[0],s=g[1],p=0,h=0;--l>=0;)p=v+a*(f=p)-c*h,h=s+a*h+c*f,v=
 (g=n[l])[0]+a*(f=v)-c*s,s=g[1]+a*s+c*f;var d,w,y=(p=v+a*(f=p)-c*h)*p+(h=s+a*h+c*f)*h;a-=d=((v=a*(f=v)-c*s-r)*p+(s=a*s+c*f-o)*h)/y,c-=w=(s*p-v*h)/y}while(ar(d)+ar(w)>Rr*Rr&&--u>0);if(u){var m=i(a*a+c*c),P=2*cr(.5*m),R=mr(P);return[fr(a*R,m*lr(P)),m?t(c*R/m):0]}},r}function dn(n,e){var t=r.geoProjection(hn(n)).rotate(e).clipAngle(90),o=r.geoRotation(e),i=t.center;return delete t.rotate,t.center=function(n){return arguments.length?i(o(n)):o.invert(i())},t}function wn(n,r){var e=t(7*mr(r)/(3*ge));return[ge*n*(2*lr(2*e/3)-1)/ve,9*mr(e/3)/ve]}function yn(n,r){for(var e,t=(1+Ar)*mr(r),o=r,u=0;u<25&&(o-=e=(mr(o/2)+mr(o)-t)/(.5*lr(o/2)+lr(o)),!(ar(e)<Rr));u++);return[n*(1+2*lr(o)/lr(o/2))/(3*Sr),2*i(3)*mr(o/2)/i(2+Sr)]}function mn(n,r){for(var e,t=i(6/(4+jr)),o=(1+jr/4)*mr(r),u=r/2,a=0;a<25&&(u-=e=(u/2+mr(u)-o)/(.5+lr(u)),!(ar(e)<Rr));a++);return[t*(.5+lr(u))*n/1.5,t*u]}function Pn(n,r){var e=r*r,t=e*e,o=e*t;return[n*(.84719-.13063*e+o*o*(.05494*e-.04515-.02326*t+.00331*o)),r*(1.01183+t*t*(.
 01926*e-.02625-.00396*t))]}function Rn(n,r){return[n*(1+lr(r))/2,2*(r-Pr(r/2))]}function bn(n,r){var e=r*r;return[n,r*(se+e*e*(pe+e*(he+de*e)))]}function jn(n,r){if(ar(r)<Rr)return[n,0];var e=Pr(r),t=n*mr(r);return[mr(t)/e,r+(1-lr(t))/e]}function Mn(n,r){return[n[0]*r[0]+n[1]*r[3],n[0]*r[1]+n[1]*r[4],n[0]*r[2]+n[1]*r[5]+n[2],n[3]*r[0]+n[4]*r[3],n[3]*r[1]+n[4]*r[4],n[3]*r[2]+n[4]*r[5]+n[5]]}function En(n,r){return[n[0]-r[0],n[1]-r[1]]}function An(n){return i(n[0]*n[0]+n[1]*n[1])}function Sn(n,e,t){var o,i,u=e.edges,a=u.length,c={type:"MultiPoint",coordinates:e.face},f=e.face.filter(function(n){return 90!==ar(n[1])}),l=r.geoBounds({type:"MultiPoint",coordinates:f}),g=!1,v=-1,s=l[1][0]-l[0][0],p=180===s||360===s?[(l[0][0]+l[1][0])/2,(l[0][1]+l[1][1])/2]:r.geoCentroid(c);if(t)for(;++v<a&&u[v]!==t;);++v;for(var h=0;h<a;++h)i=u[(h+v)%a],Array.isArray(i)?(g||(n.point((o=r.geoInterpolate(i[0],p)(Rr))[0],o[1]),g=!0),n.point((o=r.geoInterpolate(i[1],p)(Rr))[0],o[1])):(g=!1,i!==t&&Sn(n,i,e))}f
 unction kn(n,r){return n&&r&&n[0]===r[0]&&n[1]===r[1]}function xn(n){return n.project.invert||n.children&&n.children.some(xn)}function Gn(n,r){var e=x(n,r);return[e[0]*Ae,e[1]]}function Cn(n,r){for(var e=0,t=n.length,o=0;e<t;++e)o+=n[e]*r[e];return o}function zn(n){return[fr(n[1],n[0])*Gr,t(pr(-1,hr(1,n[2])))*Gr]}function Fn(n){var r=n[0]*Cr,e=n[1]*Cr,t=lr(e);return[t*lr(r),t*mr(r),mr(e)]}function Ln(n,r){return{type:"FeatureCollection",features:n.features.map(function(n){return qn(n,r)})}}function qn(n,r){return{type:"Feature",id:n.id,properties:n.properties,geometry:Bn(n.geometry,r)}}function Bn(n,e){if(!n)return null;if("GeometryCollection"===n.type)return function(n,r){return{type:"GeometryCollection",geometries:n.geometries.map(function(n){return Bn(n,r)})}}(n,e);var t;switch(n.type){case"Point":case"MultiPoint":t=Ge;break;case"LineString":case"MultiLineString":t=Ce;break;case"Polygon":case"MultiPolygon":case"Sphere":t=ze;break;default:return null}return r.geoStream(n,e(t)),t.r
 esult()}function Hn(n){function r(r,t){var o=e?Pr(r*e/2)/e:r/2;if(!t)return[2*o,-n];var i=2*cr(o*mr(t)),u=1/Pr(t);return[mr(i)*u,t+(1-lr(i))*u-n]}var e=mr(n);return r.invert=function(r,i){if(ar(i+=n)<Rr)return[e?2*cr(e*r/2)/e:r,0];var u,a=r*r+i*i,c=0,f=10;do{var l=Pr(c),g=1/lr(c),v=a-2*i*c+c*c;c-=u=(l*v+2*(c-i))/(2+v*g*g+2*(c-i)*l)}while(ar(u)>Rr&&--f>0);var s=r*(l=Pr(c)),p=Pr(ar(i)<ar(c+1/l)?.5*t(s):.5*o(s)+jr/4)/mr(c);return[e?2*cr(e*p)/e:2*p,c]},r}function In(n,r){var e,t=hr(18,36*ar(r)/jr),o=vr(t),i=t-o,u=(e=qe[o])[0],a=e[1],c=(e=qe[++o])[0],f=e[1],l=(e=qe[hr(19,++o)])[0],g=e[1];return[n*(c+i*(l-u)/2+i*i*(l-2*c+u)/2),(r>0?Mr:-Mr)*(f+i*(g-a)/2+i*i*(g-2*f+a)/2)]}function Wn(n,r){function e(r,e){var t=o(r,e),i=t[1],c=i*a/(n-1)+u;return[t[0]*u/c,i/c]}var o=function(n){function r(r,e){var t=lr(e),o=(n-1)/(n-t*lr(r));return[o*t*mr(r),o*mr(e)]}return r.invert=function(r,e){var o=r*r+e*e,u=i(o),a=(n-i(1-o*(n+1)/(n-1)))/((n-1)/u+u/(n-1));return[fr(r*a,u*i(1-a*a)),u?t(e*a/u):0]},r}(n);if(
 !r)return o;var u=lr(r),a=mr(r);return e.invert=function(r,e){var t=(n-1)/(n-1-e*a);return o.invert(t*r,t*e*u)},e}function Tn(n){return n.length>0}function Dn(n){return n===De||n===Qe?[0,n]:[He,function(n){return Math.floor(n*Be)/Be}(n)]}function Nn(n){var r=n[0],e=n[1],t=!1;return r<=Ie?(r=He,t=!0):r>=Te&&(r=We,t=!0),e<=Ne?(e=De,t=!0):e>=Ve&&(e=Qe,t=!0),t?[r,e]:n}function Qn(n){return n.map(Nn)}function Vn(n,r,e){for(var t=0,o=n.length;t<o;++t){var i=n[t].slice();e.push({index:-1,polygon:r,ring:i});for(var u=0,a=i.length;u<a;++u){var c=i[u],f=c[0],l=c[1];if(f<=Ie||f>=Te||l<=Ne||l>=Ve){i[u]=Nn(c);for(var g=u+1;g<a;++g){var v=i[g],s=v[0],p=v[1];if(s>Ie&&s<Te&&p>Ne&&p<Ve)break}if(g===u+1)continue;if(u){var h={index:-1,polygon:r,ring:i.slice(0,u+1)};h.ring[h.ring.length-1]=Dn(l),e[e.length-1]=h}else e.pop();if(g>=a)break;e.push({index:-1,polygon:r,ring:i=i.slice(g-1)}),i[0]=Dn(i[0][1]),u=-1,a=i.length}}}}function _n(n){var r,e,t,o,i,u,a=n.length,c={},f={};for(r=0;r<a;++r)t=(e=n[r]).rin
 g[0],i=e.ring[e.ring.length-1],t[0]!==i[0]||t[1]!==i[1]?(e.index=r,c[t]=f[i]=e):(e.polygon.push(e.ring),n[r]=null);for(r=0;r<a;++r)if(e=n[r]){if(t=e.ring[0],i=e.ring[e.ring.length-1],o=f[t],u=c[i],delete c[t],delete f[i],t[0]===i[0]&&t[1]===i[1]){e.polygon.push(e.ring);continue}o?(delete f[t],delete c[o.ring[0]],o.ring.pop(),n[o.index]=null,e={index:-1,polygon:o.polygon,ring:o.ring.concat(e.ring)},o===u?e.polygon.push(e.ring):(e.index=a++,n.push(c[e.ring[0]]=f[e.ring[e.ring.length-1]]=e))):u?(delete c[i],delete f[u.ring[u.ring.length-1]],e.ring.pop(),e={index:a++,polygon:u.polygon,ring:e.ring.concat(u.ring)},n[u.index]=null,n.push(c[e.ring[0]]=f[e.ring[e.ring.length-1]]=e)):(e.ring.push(e.ring[0]),e.polygon.push(e.ring))}}function Kn(n){var r={type:"Feature",geometry:On(n.geometry)};return null!=n.id&&(r.id=n.id),null!=n.bbox&&(r.bbox=n.bbox),null!=n.properties&&(r.properties=n.properties),r}function On(n){if(null==n)return n;var r,e,t,o;switch(n.type){case"GeometryCollection":r={ty
 pe:"GeometryCollection",geometries:n.geometries.map(On)};break;case"Point":r={type:"Point",coordinates:Nn(n.coordinates)};break;case"MultiPoint":case"LineString":r={type:n.type,coordinates:Qn(n.coordinates)};break;case"MultiLineString":r={type:"MultiLineString",coordinates:n.coordinates.map(Qn)};break;case"Polygon":var i=[];Vn(n.coordinates,i,e=[]),_n(e),r={type:"Polygon",coordinates:i};break;case"MultiPolygon":e=[],t=-1,o=n.coordinates.length;for(var u=new Array(o);++t<o;)Vn(n.coordinates[t],u[t]=[],e);_n(e),r={type:"MultiPolygon",coordinates:u.filter(Tn)};break;default:return n}return null!=n.bbox&&(r.bbox=n.bbox),r}function Un(n,r){var e=Pr(r/2),t=mr(Er*e);return[n*(.74482-.34588*t*t),1.70711*e]}function Jn(n){function e(n,e){var o=r.geoGnomonicRaw(n,e);return o[0]*=t,o}var t=lr(n);return e.invert=function(n,e){return r.geoGnomonicRaw.invert(n/t,e)},e}function Xn(n,r){return _e(Jn,n,r)}function Yn(n){function e(r,e){var c=o(lr(e)*lr(r-t)),f=o(lr(e)*lr(r-u));return c*=c,f*=f,[(c-f
 )/(2*n),(e<0?-1:1)*i(4*a*f-(a-c+f)*(a-c+f))/(2*n)]}if(!(n*=2))return r.geoAzimuthalEquidistantRaw;var t=-n/2,u=-t,a=n*n,c=Pr(u),f=.5/mr(u);return e.invert=function(n,r){var e,a,l=r*r,g=lr(i(l+(e=n+t)*e)),v=lr(i(l+(e=n+u)*e));return[fr(a=g-v,e=(g+v)*c),(r<0?-1:1)*o(i(e*e+a*a)*f)]},e}function Zn(n,r){return _e(Yn,n,r)}function $n(n,r){if(ar(r)<Rr)return[n,0];var e=ar(r/Mr),o=t(e);if(ar(n)<Rr||ar(ar(r)-Mr)<Rr)return[0,yr(r)*jr*Pr(o/2)];var u=lr(o),a=ar(jr/n-n/jr)/2,c=a*a,f=u/(e+u-1),l=f*(2/e-1),g=l*l,v=g+c,s=f-g,p=c+f;return[yr(n)*jr*(a*s+i(c*s*s-v*(f*f-g)))/v,yr(r)*jr*(l*p-a*i((c+1)*v-p*p))/v]}function nr(n,r){if(ar(r)<Rr)return[n,0];var e=ar(r/Mr),o=t(e);if(ar(n)<Rr||ar(ar(r)-Mr)<Rr)return[0,yr(r)*jr*Pr(o/2)];var u=lr(o),a=ar(jr/n-n/jr)/2,c=a*a,f=u*(i(1+c)-a*u)/(1+c*e*e);return[yr(n)*jr*f,yr(r)*jr*i(1-f*(2*a+f))]}function rr(n,r){if(ar(r)<Rr)return[n,0];var e=r/Mr,o=t(e);if(ar(n)<Rr||ar(ar(r)-Mr)<Rr)return[0,jr*Pr(o/2)];var u=(jr/n-n/jr)/2,a=e/(1+lr(o));return[jr*(yr(n)*i(u*u+1-a*a)-
 u),jr*a]}function er(n,r){if(!r)return[n,0];var e=ar(r);if(!n||e===Mr)return[0,r];var t=e/Mr,o=t*t,u=(8*t-o*(o+2)-5)/(2*o*(t-1)),a=u*u,c=t*u,f=o+a+2*c,l=t+3*u,g=n/Mr,v=g+1/g,s=yr(ar(n)-Mr)*i(v*v-4),p=s*s,h=(s*(f+a-1)+2*i(f*(o+a*p-1)+(1-o)*(o*(l*l+4*a)+12*c*a+4*a*a)))/(4*f+p);return[yr(n)*Mr*h,yr(r)*Mr*i(1+s*ar(h)-h*h)]}function tr(n,r){return[n*i(1-3*r*r/(jr*jr)),r]}function or(n,r){var e=.90631*mr(r),t=i(1-e*e),o=i(2/(1+t*lr(n/=3)));return[2.66723*t*o*mr(n),1.24104*e*o]}function ir(n,r){var e=lr(r),t=lr(n)*e,o=1-t,u=lr(n=fr(mr(n)*e,-mr(r))),a=mr(n);return e=i(1-t*t),[a*e-u*o,-u*e-a*o]}function ur(n,r){var e=f(n,r);return[(e[0]+n/Mr)/2,(e[1]+r)/2]}var ar=Math.abs,cr=Math.atan,fr=Math.atan2,lr=Math.cos,gr=Math.exp,vr=Math.floor,sr=Math.log,pr=Math.max,hr=Math.min,dr=Math.pow,wr=Math.round,yr=Math.sign||function(n){return n>0?1:n<0?-1:0},mr=Math.sin,Pr=Math.tan,Rr=1e-6,br=1e-12,jr=Math.PI,Mr=jr/2,Er=jr/4,Ar=Math.SQRT1_2,Sr=i(2),kr=i(jr),xr=2*jr,Gr=180/jr,Cr=jr/180;f.invert=function(n,
 r){if(!(n*n+4*r*r>jr*jr+Rr)){var e=n,t=r,u=25;do{var a,c=mr(e),f=mr(e/2),l=lr(e/2),g=mr(t),v=lr(t),s=mr(2*t),p=g*g,h=v*v,d=f*f,w=1-h*l*l,y=w?o(v*l)*i(a=1/w):a=0,m=2*y*v*f-n,P=y*g-r,R=a*(h*d+y*v*l*p),b=a*(.5*c*s-2*y*g*f),j=.25*a*(s*f-y*g*h*c),M=a*(p*l+y*d*v),E=b*j-M*R;if(!E)break;var A=(P*b-m*M)/E,S=(m*j-P*R)/E;e-=A,t-=S}while((ar(A)>Rr||ar(S)>Rr)&&--u>0);return[e,t]}};g.invert=function(n,r){if(n*=3/8,r*=3/8,!n&&ar(r)>1)return null;var e=1+n*n+r*r,o=i((e-i(e*e-4*r*r))/2),c=t(o)/3,f=o?function(n){return sr(n+i(n*n-1))}(ar(r/o))/3:function(n){return sr(n+i(n*n+1))}(ar(n))/3,l=lr(c),g=a(f),v=g*g-l*l;return[2*yr(n)*fr(u(f)*l,.25-v),2*yr(r)*fr(g*mr(c),.25+v)]};var zr=i(8),Fr=sr(1+Sr);v.invert=function(n,r){if((t=ar(r))<Fr)return[n,2*cr(gr(r))-Mr];var e,t,o=Er,i=25;do{var u=lr(o/2),a=Pr(o/2);o-=e=(zr*(o-Er)-sr(a)-t)/(zr-u*u/(2*a))}while(ar(e)>br&&--i>0);return[n/(lr(o)*(zr-1/mr(o))),yr(r)*o]};h.invert=function(n,r){var e=2*t(r/2);return[n*lr(e/2)/lr(e),e]};var Lr=y(Sr/Mr,Sr,jr),qr=2.00276,
 Br=1.11072;m.invert=function(n,r){var e,t,o=qr*r,i=r<0?-Er:Er,u=25;do{t=o-Sr*mr(i),i-=e=(mr(2*i)+2*i-jr*mr(t))/(2*lr(2*i)+2+jr*lr(t)*Sr*lr(i))}while(ar(e)>Rr&&--u>0);return t=o-Sr*mr(i),[n*(1/lr(t)+Br/lr(i))/qr,t]};var Hr=function(n){var e=0,t=r.geoProjectionMutator(n),o=t(e);return o.parallel=function(n){return arguments.length?t(e=n*Cr):e*Gr},o};P.invert=function(n,r){return[n/lr(r),r]};var Ir=y(1,4/jr,jr);x.invert=function(n,r){var e=(e=r/kr-1)*e;return[e>0?n*i(jr/e)/2:0,t(1-e)]};var Wr=i(3);C.invert=function(n,r){var e=3*t(r/(Wr*kr));return[kr*n/(Wr*(2*lr(2*e/3)-1)),e]};L.invert=function(n,r){var e=i(8/(3*jr)),t=r/e;return[n/(e*(1-ar(t)/jr)),t]};q.invert=function(n,r){var e=2-ar(r)/i(2*jr/3);return[n*i(6*jr)/(2*e),yr(r)*t((4-e*e)/3)]};B.invert=function(n,r){var e=i(jr*(4+jr))/2;return[n*e/(1+i(1-r*r*(4+jr)/(4*jr))),r*e/2]};H.invert=function(n,r){var e=r*i((4+jr)/jr)/2,o=t(e),u=lr(o);return[n/(2/i(jr*(4+jr))*(1+u)),t((o+e*(u+2))/(2+Mr))]};I.invert=function(n,r){var e=i(2+jr),t=r*
 e/2;return[e*n/(1+lr(t)),t]};W.invert=function(n,r){var e=1+Mr,o=i(e/2);return[2*n*o/(1+lr(r*=o)),t((r+mr(r))/e)]};var Tr=3+2*Sr;T.invert=function(n,r){if(!(e=g.invert(n/1.2,1.065*r)))return null;var e,t=e[0],o=e[1],u=20;n/=Tr,r/=Tr;do{var a=t/2,c=o/2,f=mr(a),l=lr(a),v=mr(c),s=lr(c),p=lr(o),h=i(p),d=v/(s+Sr*l*h),w=d*d,y=i(2/(1+w)),m=(Sr*s+(l+f)*h)/(Sr*s+(l-f)*h),P=i(m),R=P-1/P,b=P+1/P,j=y*R-2*sr(P)-n,M=y*d*b-2*cr(d)-r,E=v&&Ar*h*f*w/v,A=(Sr*l*s+h)/(2*(s+Sr*l*h)*(s+Sr*l*h)*h),S=-.5*d*y*y*y,k=S*E,x=S*A,G=(G=2*s+Sr*h*(l-f))*G*P,C=(Sr*l*s*h+p)/G,z=-Sr*f*v/(h*G),F=R*k-2*C/P+y*(C+C/m),L=R*x-2*z/P+y*(z+z/m),q=d*b*k-2*E/(1+w)+y*b*E+y*d*(C-C/m),B=d*b*x-2*A/(1+w)+y*b*A+y*d*(z-z/m),H=L*q-B*F;if(!H)break;var I=(M*L-j*B)/H,W=(j*q-M*F)/H;t-=I,o=pr(-Mr,hr(Mr,o-W))}while((ar(I)>Rr||ar(W)>Rr)&&--u>0);return ar(ar(o)-Mr)<Rr?[0,o]:u&&[t,o]};var Dr=lr(35*Cr);D.invert=function(n,r){var e=r/(1+Dr);return[n&&n/(Dr*i(1-e*e)),2*cr(e)]};N.invert=function(n,r){var e=cr(r/kr),t=lr(e),o=2*e;return[n*kr/2/(lr(o)*
 t*t),o]};var Nr=function(n,r,e,o,u,a,c,f){function l(i,l){if(!l)return[n*i/jr,0];var g=l*l,v=n+g*(r+g*(e+g*o)),s=l*(u-1+g*(a-f+g*c)),p=(v*v+s*s)/(2*s),h=i*t(v/p)/jr;return[p*mr(h),l*(1+g*f)+p*(1-lr(h))]}return arguments.length<8&&(f=0),l.invert=function(l,g){var v,s,p=jr*l/n,h=g,d=50;do{var w=h*h,y=n+w*(r+w*(e+w*o)),m=h*(u-1+w*(a-f+w*c)),P=y*y+m*m,R=2*m,b=P/R,j=b*b,M=t(y/b)/jr,E=p*M,A=y*y,S=(2*r+w*(4*e+6*w*o))*h,k=u+w*(3*a+5*w*c),x=(2*(y*S+m*(k-1))*R-P*(2*(k-1)))/(R*R),G=lr(E),C=mr(E),z=b*G,F=b*C,L=p/jr*(1/i(1-A/j))*(S*b-y*x)/j,q=F-l,B=h*(1+w*f)+b-z-g,H=x*C+z*L,I=z*M,W=1+x-(x*G-F*L),T=F*M,D=H*T-W*I;if(!D)break;p-=v=(B*H-q*W)/D,h-=s=(q*T-B*I)/D}while((ar(v)>Rr||ar(s)>Rr)&&--d>0);return[p,h]},l},Qr=Nr(2.8284,-1.6988,.75432,-.18071,1.76003,-.38914,.042555),Vr=Nr(2.583819,-.835827,.170354,-.038094,1.543313,-.411435,.082742),_r=Nr(5/6*jr,-.62636,-.0344,0,1.3493,-.05524,0,.045);U.invert=function(n,r){var e,t=n,o=r,i=50;do{var u=o*o;o-=e=(o*(1+u/12)-r)/(1+u/4)}while(ar(e)>Rr&&--i>0);i=50,n
 /=1-.162388*u;do{var a=(a=t*t)*a;t-=e=(t*(.87-952426e-9*a)-n)/(.87-.00476213*a)}while(ar(e)>Rr&&--i>0);return[t,o]};var Kr=Nr(2.6516,-.76534,.19123,-.047094,1.36289,-.13965,.031762),Or=function(n){function r(r,t){var o=r>0?-.5:.5,i=n(r+o*jr,t);return i[0]-=o*e,i}var e=n(Mr,0)[0]-n(-Mr,0)[0];return n.invert&&(r.invert=function(r,t){var o=r>0?-.5:.5,i=n.invert(r+o*e,t),u=i[0]-o*jr;return u<-jr?u+=2*jr:u>jr&&(u-=2*jr),i[0]=u,i}),r};J.invert=function(n,r){ar(n)>1&&(n=2*yr(n)-n),ar(r)>1&&(r=2*yr(r)-r);var e=yr(n),o=yr(r),u=-e*n,a=-o*r,c=a/u<1,f=function(n,r){for(var e=0,o=1,u=.5,a=50;;){var c=u*u,f=i(u),l=t(1/i(1+c)),g=1-c+u*(1+c)*l,v=(1-f)/g,s=i(v),p=v*(1+c),h=s*(1-c),d=i(p-n*n),w=r+h+u*d;if(ar(o-e)<br||0==--a||0===w)break;w>0?e=u:o=u,u=.5*(e+o)}if(!a)return null;var y=t(f),m=lr(y),P=1/m,R=2*f*m,b=(-g*m-(-3*u+l*(1+3*c))*R*(1-f))/(g*g);return[jr/4*(n*(-2*P*(.5*b/s*(1-c)-2*u*s*R)+-P*R*d)+-P*(u*(1+c)*b+v*(1+3*c)*R)*t(n/i(p))),y]}(c?a:u,c?u:a),l=f[0],g=f[1],v=lr(g);return c&&(l=-Mr-l),[e*(f
 r(mr(l)*v,-mr(g))+jr),o*t(lr(l)*v)]};Z.invert=function(n,r){var e=(Sr-1)/(Sr+1),t=i(1-e*e),o=function(n,r,e){var t,o,i;return n?(t=X(n,e),r?(o=X(r,1-e),i=o[1]*o[1]+e*t[0]*t[0]*o[0]*o[0],[[t[0]*o[2]/i,t[1]*t[2]*o[0]*o[1]/i],[t[1]*o[1]/i,-t[0]*t[2]*o[0]*o[2]/i],[t[2]*o[1]*o[2]/i,-e*t[0]*t[1]*o[0]/i]]):[[t[0],0],[t[1],0],[t[2],0]]):(o=X(r,1-e),[[0,o[0]/o[1]],[1/o[1],0],[o[2]/o[1],0]])}(.5*Y(Mr,t*t)-r,-n,t*t),u=function(n,r){var e=r[0]*r[0]+r[1]*r[1];return[(n[0]*r[0]+n[1]*r[1])/e,(n[1]*r[0]-n[0]*r[1])/e]}(o[0],o[1]);return[fr(u[1],u[0])/-1,2*cr(gr(-.5*sr(e*u[0]*u[0]+e*u[1]*u[1])))-Mr]};var Ur=41+48/36+37/3600,Jr=z(0),Xr=.7109889596207567,Yr=.0528035274542;tn.invert=function(n,r){return r>-Xr?Lr.invert(n,r-Yr):P.invert(n,r)};on.invert=function(n,r){return ar(r)>Xr?Lr.invert(n,r+(r>0?Yr:-Yr)):P.invert(n,r)};var Zr=function(n,t){function o(r,e){for(var o=e<0?-1:1,i=t[+(e<0)],u=0,a=i.length-1;u<a&&r>i[u][2][0];++u);var c=n(r-i[u][1][0],e);return c[0]+=n(i[u][1][0],o*e>o*i[u][0][1]?i[u][0][
 1]:e)[0],c}var i,u;n.invert&&(o.invert=function(r,e){for(var i=u[+(e<0)],a=t[+(e<0)],c=0,f=i.length;c<f;++c){var l=i[c];if(l[0][0]<=r&&r<l[1][0]&&l[0][1]<=e&&e<l[1][1]){var g=n.invert(r-n(a[c][1][0],0)[0],e);return g[0]+=a[c][1][0],un(o(g[0],g[1]),[r,e])?g:null}}});var a=r.geoProjection(o),c=a.stream;return a.stream=function(n){var e=a.rotate(),t=c(n),o=(a.rotate([0,0]),c(n));return a.rotate(e),t.sphere=function(){r.geoStream(i,o)},t},a.lobes=function(r){return arguments.length?(i=function(n){var r,t,o,i,u,a,c,f=[],l=n[0].length;for(c=0;c<l;++c)t=(r=n[0][c])[0][0],o=r[0][1],i=r[1][1],u=r[2][0],a=r[2][1],f.push(an([[t+Rr,o+Rr],[t+Rr,i-Rr],[u-Rr,i-Rr],[u-Rr,a+Rr]],30));for(c=n[1].length-1;c>=0;--c)t=(r=n[1][c])[0][0],o=r[0][1],i=r[1][1],u=r[2][0],a=r[2][1],f.push(an([[u-Rr,a-Rr],[u-Rr,i+Rr],[t+Rr,i+Rr],[t+Rr,o-Rr]],30));return{type:"Polygon",coordinates:[e.merge(f)]}}(r),t=r.map(function(n){return n.map(function(n){return[[n[0][0]*Cr,n[0][1]*Cr],[n[1][0]*Cr,n[1][1]*Cr],[n[2][0]*Cr,n[2
 ][1]*Cr]]})}),u=t.map(function(r){return r.map(function(r){var e,t=n(r[0][0],r[0][1])[0],o=n(r[2][0],r[2][1])[0],i=n(r[1][0],r[0][1])[1],u=n(r[1][0],r[1][1])[1];return i>u&&(e=i,i=u,u=e),[[t,i],[o,u]]})}),a):t.map(function(n){return n.map(function(n){return[[n[0][0]*Gr,n[0][1]*Gr],[n[1][0]*Gr,n[1][1]*Gr],[n[2][0]*Gr,n[2][1]*Gr]]})})},null!=t&&a.lobes(t),a},$r=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]],ne=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]],re=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]],ee=[[[[-180,0],[-90,90],[0,0]],[[0,0],[90,90],[180,0]]],[[[-180,0],[-90,-90],[0,0]],[[0,0],[90,-90],[180,0]
 ]]],te=[[[[-180,35],[-30,90],[0,35]],[[0,35],[30,90],[180,35]]],[[[-180,-10],[-102,-90],[-65,-10]],[[-65,-10],[5,-90],[77,-10]],[[77,-10],[103,-90],[180,-10]]]],oe=[[[[-180,0],[-110,90],[-40,0]],[[-40,0],[0,90],[40,0]],[[40,0],[110,90],[180,0]]],[[[-180,0],[-110,-90],[-40,0]],[[-40,0],[0,-90],[40,0]],[[40,0],[110,-90],[180,0]]]];cn.invert=function(n,r){return[xr/3*n/i(jr*jr/3-r*r),r]};var ie=jr/Sr;ln.invert=function(n,r){var e=ar(n),t=ar(r),u=Rr,a=Mr;t<ie?a*=t/ie:u+=6*o(ie/t);for(var c=0;c<25;c++){var f=mr(a),l=i(lr(a)),g=mr(a/2),v=lr(a/2),s=mr(u/6),p=lr(u/6),h=.5*u*(1+l)-e,d=a/(v*p)-t,w=l?-.25*u*f/l:0,y=.5*(1+l),m=(1+.5*a*g/v)/(v*p),P=a/v*(s/6)/(p*p),R=w*P-m*y,b=(h*P-d*y)/R,j=(d*w-h*m)/R;if(a-=b,u-=j,ar(b)<Rr&&ar(j)<Rr)break}return[n<0?-u:u,r<0?-a:a]};gn.invert=function(n,r){var e=yr(n)*jr,t=r/2,o=50;do{var i=e*e,u=t*t,a=e*t,c=e*(.975534+u*(-.0143059*i-.119161+-.0547009*u))-n,f=t*(1.00384+i*(.0802894+-.02855*u+199025e-9*i)+u*(.0998909+-.0491032*u))-r,l=.975534-u*(.119161+3*i*.01430
 59+.0547009*u),g=-a*(.238322+.2188036*u+.0286118*i),v=a*(.1605788+7961e-7*i+-.0571*u),s=1.00384+i*(.0802894+199025e-9*i)+u*(3*(.0998909-.02855*i)-.245516*u),p=g*v-s*l,h=(f*g-c*s)/p,d=(c*v-f*l)/p;e-=h,t-=d}while((ar(h)>Rr||ar(d)>Rr)&&--o>0);return o&&[e,t]};vn.invert=function(n,r){var e=n*n,u=r*r+1,a=e+u,c=n?Ar*i((a-i(a*a-4*e))/e):1/i(u);return[t(n*c),yr(r)*o(c)]};pn.invert=function(n,r){return[n,2.5*cr(gr(.8*r))-.625*jr]};var ue=[[.9972523,0],[.0052513,-.0041175],[.0074606,.0048125],[-.0153783,-.1968253],[.0636871,-.1408027],[.3660976,-.2937382]],ae=[[.98879,0],[0,0],[-.050909,0],[0,0],[.075528,0]],ce=[[.984299,0],[.0211642,.0037608],[-.1036018,-.0575102],[-.0329095,-.0320119],[.0499471,.1223335],[.026046,.0899805],[7388e-7,-.1435792],[.0075848,-.1334108],[-.0216473,.0776645],[-.0225161,.0853673]],fe=[[.9245,0],[0,0],[.01943,0]],le=[[.721316,0],[0,0],[-.00881625,-.00617325]],ge=i(6),ve=i(7);wn.invert=function(n,r){var e=3*t(r*ve/9);return[n*ve/(ge*(2*lr(2*e/3)-1)),t(3*mr(e)*ge/7)]};
 yn.invert=function(n,r){var e=r*i(2+Sr)/(2*i(3)),o=2*t(e);return[3*Sr*n/(1+2*lr(o)/lr(o/2)),t((e+mr(o))/(1+Ar))]};mn.invert=function(n,r){var e=i(6/(4+jr)),o=r/e;return ar(ar(o)-Mr)<Rr&&(o=o<0?-Mr:Mr),[1.5*n/(e*(.5+lr(o))),t((o/2+mr(o))/(1+jr/4))]};Pn.invert=function(n,r){var e,t,o,i,u=r,a=25;do{u-=e=(u*(1.01183+(o=(t=u*u)*t)*o*(.01926*t-.02625-.00396*o))-r)/(1.01183+o*o*(.21186*t-.23625+-.05148*o))}while(ar(e)>br&&--a>0);return t=u*u,o=t*t,i=t*o,[n/(.84719-.13063*t+i*i*(.05494*t-.04515-.02326*o+.00331*i)),u]};Rn.invert=function(n,r){for(var e=r/2,t=0,o=1/0;t<10&&ar(o)>Rr;++t){var i=lr(r/2);r-=o=(r-Pr(r/2)-e)/(1-.5/(i*i))}return[2*n/(1+lr(r)),r]};var se=1.0148,pe=.23185,he=-.14499,de=.02406,we=se,ye=5*pe,me=7*he,Pe=9*de,Re=1.790857183;bn.invert=function(n,r){r>Re?r=Re:r<-Re&&(r=-Re);var e,t=r;do{var o=t*t;t-=e=(t*(se+o*o*(pe+o*(he+de*o)))-r)/(we+o*o*(ye+o*(me+Pe*o)))}while(ar(e)>Rr);return[n,t]};jn.invert=function(n,r){if(ar(r)<Rr)return[n,0];var e,i=n*n+r*r,u=.5*r,a=10;do{var c=Pr(
 u),f=1/lr(u),l=i-2*r*u+u*u;u-=e=(c*l+2*(u-r))/(2+l*f*f+2*(u-r)*c)}while(ar(e)>Rr&&--a>0);return c=Pr(u),[(ar(r)<ar(u+1/c)?t(n*c):yr(n)*(o(ar(n*c))+Mr))/mr(u),u]};var be=function(n,r){var e=En(n[1],n[0]),t=En(r[1],r[0]),o=function(n,r){return fr(n[0]*r[1]-n[1]*r[0],n[0]*r[0]+n[1]*r[1])}(e,t),i=An(e)/An(t);return Mn([1,0,n[0][0],0,1,n[0][1]],Mn([i,0,0,0,i,0],Mn([lr(o),mr(o),0,-mr(o),lr(o),0],[1,0,-r[0][0],0,1,-r[0][1]])))},je=function(n,e,t){function o(n,r){if(n.edges=function(n){for(var r=n.length,e=[],t=n[r-1],o=0;o<r;++o)e.push([t,t=n[o]]);return e}(n.face),r.face){var e=n.shared=function(n,r){for(var e,t,o=n.length,i=null,u=0;u<o;++u){e=n[u];for(var a=r.length;--a>=0;)if(t=r[a],e[0]===t[0]&&e[1]===t[1]){if(i)return[i,e];i=e}}}(n.face,r.face),t=be(e.map(r.project),e.map(n.project));n.transform=r.transform?Mn(r.transform,t):t;for(var i=r.edges,u=0,a=i.length;u<a;++u)kn(e[0],i[u][1])&&kn(e[1],i[u][0])&&(i[u]=n),kn(e[0],i[u][0])&&kn(e[1],i[u][1])&&(i[u]=n);for(u=0,a=(i=n.edges).length
 ;u<a;++u)kn(e[0],i[u][0])&&kn(e[1],i[u][1])&&(i[u]=r),kn(e[0],i[u][1])&&kn(e[1],i[u][0])&&(i[u]=r)}else n.transform=r.transform;return n.children&&n.children.forEach(function(r){o(r,n)}),n}function i(n,r){var t,o=e(n,r),i=o.project([n*Gr,r*Gr]);return(t=o.transform)?[t[0]*i[0]+t[1]*i[1]+t[2],-(t[3]*i[0]+t[4]*i[1]+t[5])]:(i[1]=-i[1],i)}function u(n,r){var t=n.project.invert,o=n.transform,i=r;if(o&&(i=[(o=function(n){var r=1/(n[0]*n[4]-n[1]*n[3]);return[r*n[4],-r*n[1],r*(n[1]*n[5]-n[2]*n[4]),-r*n[3],r*n[0],r*(n[2]*n[3]-n[0]*n[5])]}(o))[0]*i[0]+o[1]*i[1]+o[2],o[3]*i[0]+o[4]*i[1]+o[5]]),t&&n===function(n){return e(n[0]*Cr,n[1]*Cr)}(a=t(i)))return a;for(var a,c=n.children,f=0,l=c&&c.length;f<l;++f)if(a=u(c[f],r))return a}o(n,{transform:[lr(t=null==t?-jr/6:t),mr(t),0,-mr(t),lr(t),0]}),xn(n)&&(i.invert=function(r,e){var t=u(n,[r,-e]);return t&&(t[0]*=Cr,t[1]*=Cr,t)});var a=r.geoProjection(i),c=a.stream;return a.stream=function(r){var e=a.rotate(),t=c(r),o=(a.rotate([0,0]),c(r));return a.ro
 tate(e),t.sphere=function(){o.polygonStart(),o.lineStart(),Sn(o,n),o.lineEnd(),o.polygonEnd()},t},a},Me=[[0,90],[-90,0],[0,0],[90,0],[180,0],[0,-90]],Ee=[[0,2,1],[0,3,2],[5,1,2],[5,2,3],[0,1,4],[0,4,3],[5,4,1],[5,3,4]].map(function(n){return n.map(function(n){return Me[n]})}),Ae=2/i(3);Gn.invert=function(n,r){return x.invert(n/Ae,r)};var Se=function(){},ke=[],xe=[],Ge={point:function(n,r){ke.push([n,r])},result:function(){var n=ke.length?ke.length<2?{type:"Point",coordinates:ke[0]}:{type:"MultiPoint",coordinates:ke}:null;return ke=[],n}},Ce={lineStart:Se,point:function(n,r){ke.push([n,r])},lineEnd:function(){ke.length&&(xe.push(ke),ke=[])},result:function(){var n=xe.length?xe.length<2?{type:"LineString",coordinates:xe[0]}:{type:"MultiLineString",coordinates:xe}:null;return xe=[],n}},ze={polygonStart:Se,lineStart:Se,point:function(n,r){ke.push([n,r])},lineEnd:function(){var n=ke.length;if(n){do{ke.push(ke[0].slice())}while(++n<4);xe.push(ke),ke=[]}},polygonEnd:Se,result:function(){if
 (!xe.length)return null;var n=[],r=[];return xe.forEach(function(e){!function(n){if((r=n.length)<4)return!1;for(var r,e=0,t=n[r-1][1]*n[0][0]-n[r-1][0]*n[0][1];++e<r;)t+=n[e-1][1]*n[e][0]-n[e-1][0]*n[e][1];return t<=0}(e)?r.push(e):n.push([e])}),r.forEach(function(r){var e=r[0];n.some(function(n){if(function(n,r){for(var e=r[0],t=r[1],o=!1,i=0,u=n.length,a=u-1;i<u;a=i++){var c=n[i],f=c[0],l=c[1],g=n[a],v=g[0],s=g[1];l>t^s>t&&e<(v-f)*(t-l)/(s-l)+f&&(o=!o)}return o}(n[0],e))return n.push(r),!0})||n.push([r])}),xe=[],n.length?n.length>1?{type:"MultiPolygon",coordinates:n}:{type:"Polygon",coordinates:n[0]}:null}},Fe=function(n){function e(r,e){var o=ar(r)<Mr,i=n(o?r:r>0?r-jr:r+jr,e),u=(i[0]-i[1])*Ar,a=(i[0]+i[1])*Ar;if(o)return[u,a];var c=t*Ar,f=u>0^a>0?-1:1;return[f*u-yr(a)*c,f*a-yr(u)*c]}var t=n(Mr,0)[0]-n(-Mr,0)[0];return n.invert&&(e.invert=function(r,e){var o=(r+e)*Ar,i=(e-r)*Ar,u=ar(o)<.5*t&&ar(i)<.5*t;if(!u){var a=t*Ar,c=o>0^i>0?-1:1,f=-c*r+(i>0?1:-1)*a,l=-c*e+(o>0?1:-1)*a;o=(-f-
 l)*Ar,i=(f-l)*Ar}var g=n.invert(o,i);return u||(g[0]+=o>0?jr:-jr),g}),r.geoProjection(e).rotate([-90,-90,45]).clipAngle(179.999)},Le=function(){return Fe(Z).scale(111.48)},qe=[[.9986,-.062],[1,0],[.9986,.062],[.9954,.124],[.99,.186],[.9822,.248],[.973,.31],[.96,.372],[.9427,.434],[.9216,.4958],[.8962,.5571],[.8679,.6176],[.835,.6769],[.7986,.7346],[.7597,.7903],[.7186,.8435],[.6732,.8936],[.6213,.9394],[.5722,.9761],[.5322,1]];qe.forEach(function(n){n[1]*=1.0144}),In.invert=function(n,r){var e=r/Mr,t=90*e,o=hr(18,ar(t/5)),i=pr(0,vr(o));do{var u=qe[i][1],a=qe[i+1][1],c=qe[hr(19,i+2)][1],f=c-u,l=c-2*a+u,g=2*(ar(e)-a)/f,v=l/f,s=g*(1-v*g*(1-2*v*g));if(s>=0||1===i){t=(r>=0?5:-5)*(s+o);var p,h=50;do{s=(o=hr(18,ar(t)/5))-(i=vr(o)),u=qe[i][1],a=qe[i+1][1],c=qe[hr(19,i+2)][1],t-=(p=(r>=0?Mr:-Mr)*(a+s*(c-u)/2+s*s*(c-2*a+u)/2)-r)*Gr}while(ar(p)>br&&--h>0);break}}while(--i>=0);var d=qe[i][0],w=qe[i+1][0],y=qe[hr(19,i+2)][0];return[n/(w+s*(y-d)/2+s*s*(y-2*w+d)/2),t*Cr]};var Be=1e4,He=-180,Ie=He+
 1e-4,We=180,Te=We-1e-4,De=-90,Ne=De+1e-4,Qe=90,Ve=Qe-1e-4;Un.invert=function(n,r){var e=r/1.70711,t=mr(Er*e);return[n/(.74482-.34588*t*t),2*cr(e)]};var _e=function(n,e,o){var i=r.geoInterpolate(e,o),u=i(.5),a=r.geoRotation([-u[0],-u[1]])(e),c=i.distance/2,f=-t(mr(a[1]*Cr)/mr(c)),l=[-u[0],-u[1],-(a[0]>0?jr-f:f)*Gr],g=r.geoProjection(n(c)).rotate(l),v=r.geoRotation(l),s=g.center;return delete g.rotate,g.center=function(n){return arguments.length?s(v(n)):v.invert(s())},g.clipAngle(90)};$n.invert=function(n,r){if(ar(r)<Rr)return[n,0];if(ar(n)<Rr)return[0,Mr*mr(2*cr(r/jr))];var e=(n/=jr)*n,t=(r/=jr)*r,u=e+t,a=u*u,c=-ar(r)*(1+u),f=c-2*t+e,l=-2*c+1+2*t+a,g=t/l+(2*f*f*f/(l*l*l)-9*c*f/(l*l))/27,v=(c-f*f/(3*l))/l,s=2*i(-v/3),p=o(3*g/(v*s))/3;return[jr*(u-1+i(1+2*(e-t)+a))/(2*n),yr(r)*jr*(-s*lr(p+jr/3)-f/(3*l))]};nr.invert=function(n,r){if(!n)return[0,Mr*mr(2*cr(r/jr))];var e=ar(n/jr),t=(1-e*e-(r/=jr)*r)/(2*e),o=i(t*t+1);return[yr(n)*jr*(o-t),yr(r)*Mr*mr(2*fr(i((1-2*t*e)*(t+o)-e),i(o+t+e)))]};
 rr.invert=function(n,r){if(!r)return[n,0];var e=r/jr,t=(jr*jr*(1-e*e)-n*n)/(2*jr*n);return[n?jr*(yr(n)*i(t*t+1)-t):0,Mr*mr(2*cr(e))]};er.invert=function(n,r){var e;if(!n||!r)return[n,r];r/=jr;var t=yr(n)*n/Mr,o=(t*t-1+4*r*r)/ar(t),u=o*o,a=2*r,c=50;do{var f=a*a,l=(8*a-f*(f+2)-5)/(2*f*(a-1)),g=(3*a-f*a-10)/(2*f*a),v=l*l,s=a*l,p=a+l,h=p*p,d=a+3*l,w=-2*p*(4*s*v+(1-4*f+3*f*f)*(1+g)+v*(14*f-6-u+(8*f-8-2*u)*g)+s*(12*f-8+(10*f-10-u)*g)),y=i(h*(f+v*u-1)+(1-f)*(f*(d*d+4*v)+v*(12*s+4*v)));a-=e=(o*(h+v-1)+2*y-t*(4*h+u))/(o*(2*l*g+2*p*(1+g))+w/y-8*p*(o*(-1+v+h)+2*y)*(1+g)/(u+4*h))}while(e>Rr&&--c>0);return[yr(n)*(i(o*o+4)+o)*jr/4,Mr*a]};var Ke=4*jr+3*i(3),Oe=2*i(2*jr*i(3)/Ke),Ue=y(Oe*i(3)/jr,Oe,Ke/6);tr.invert=function(n,r){return[n/i(1-3*r*r/(jr*jr)),r]};or.invert=function(n,r){var e=n/2.66723,o=r/1.24104,u=i(e*e+o*o),a=2*t(u/2);return[3*fr(n*Pr(a),2.66723*u),u&&t(r*mr(a)/(1.24104*.90631*u))]};ir.invert=function(n,r){var e=(n*n+r*r)/-2,o=i(-e*(2+e)),u=r*e+n*o,a=n*e-r*o,c=i(a*a+u*u);return[fr(o*
 u,c*(1+e)),c?-t(o*a/c):0]};ur.invert=function(n,r){var e=n,t=r,u=25;do{var a,c=lr(t),f=mr(t),l=mr(2*t),g=f*f,v=c*c,s=mr(e),p=lr(e/2),h=mr(e/2),d=h*h,w=1-v*p*p,y=w?o(c*p)*i(a=1/w):a=0,m=.5*(2*y*c*h+e/Mr)-n,P=.5*(y*f+t)-r,R=.5*a*(v*d+y*c*p*g)+.5/Mr,b=a*(s*l/4-y*f*h),j=.125*a*(l*h-y*f*v*s),M=.5*a*(g*p+y*d*c)+.5,E=b*j-M*R,A=(P*b-m*M)/E,S=(m*j-P*R)/E;e-=A,t-=S}while((ar(A)>Rr||ar(S)>Rr)&&--u>0);return[e,t]};n.geoAiry=function(){var n=Mr,e=r.geoProjectionMutator(c),t=e(n);return t.radius=function(r){return arguments.length?e(n=r*Cr):n*Gr},t.scale(179.976).clipAngle(147)},n.geoAiryRaw=c,n.geoAitoff=function(){return r.geoProjection(f).scale(152.63)},n.geoAitoffRaw=f,n.geoArmadillo=function(){var n=20*Cr,e=n>=0?1:-1,t=Pr(e*n),o=r.geoProjectionMutator(l),i=o(n),u=i.stream;return i.parallel=function(r){return arguments.length?(t=Pr((e=(n=r*Cr)>=0?1:-1)*n),o(n)):n*Gr},i.stream=function(r){var o=i.rotate(),a=u(r),c=(i.rotate([0,0]),u(r));return i.rotate(o),a.sphere=function(){c.polygonStart(),c
 .lineStart();for(var r=-180*e;e*r<180;r+=90*e)c.point(r,90*e);for(;e*(r-=n)>=-180;)c.point(r,e*-fr(lr(r*Cr/2),t)*Gr);c.lineEnd(),c.polygonEnd()},a},i.scale(218.695).center([0,28.0974])},n.geoArmadilloRaw=l,n.geoAugust=function(){return r.geoProjection(g).scale(66.1603)},n.geoAugustRaw=g,n.geoBaker=function(){return r.geoProjection(v).scale(112.314)},n.geoBakerRaw=v,n.geoBerghaus=function(){var n=5,e=r.geoProjectionMutator(s),o=e(n),i=o.stream,u=-lr(.01*Cr),a=mr(.01*Cr);return o.lobes=function(r){return arguments.length?e(n=+r):n},o.stream=function(r){var e=o.rotate(),c=i(r),f=(o.rotate([0,0]),i(r));return o.rotate(e),c.sphere=function(){f.polygonStart(),f.lineStart();for(var r=0,e=360/n,o=2*jr/n,i=90-180/n,c=Mr;r<n;++r,i-=e,c-=o)f.point(fr(a*lr(c),u)*Gr,t(a*mr(c))*Gr),i<-90?(f.point(-90,-180-i-.01),f.point(-90,-180-i+.01)):(f.point(90,i+.01),f.point(90,i-.01));f.lineEnd(),f.polygonEnd()},c},o.scale(87.8076).center([0,17.1875]).clipAngle(179.999)},n.geoBerghausRaw=s,n.geoBertin1953=f
 unction(){var n=r.geoProjection(d());return n.rotate([-16.5,-42]),delete n.rotate,n.scale(176.57).center([7.93,.09])},n.geoBertin1953Raw=d,n.geoBoggs=function(){return r.geoProjection(m).scale(160.857)},n.geoBoggsRaw=m,n.geoBonne=function(){return Hr(R).scale(123.082).center([0,26.1441]).parallel(45)},n.geoBonneRaw=R,n.geoBottomley=function(){var n=.5,e=r.geoProjectionMutator(b),t=e(n);return t.fraction=function(r){return arguments.length?e(n=+r):n},t.scale(158.837)},n.geoBottomleyRaw=b,n.geoBromley=function(){return r.geoProjection(Ir).scale(152.63)},n.geoBromleyRaw=Ir,n.geoChamberlin=k,n.geoChamberlinRaw=A,n.geoChamberlinAfrica=function(){return k([0,22],[45,22],[22.5,-22]).scale(380).center([22.5,2])},n.geoCollignon=function(){return r.geoProjection(x).scale(95.6464).center([0,30])},n.geoCollignonRaw=x,n.geoCraig=function(){return Hr(G).scale(249.828).clipAngle(90)},n.geoCraigRaw=G,n.geoCraster=function(){return r.geoProjection(C).scale(156.19)},n.geoCrasterRaw=C,n.geoCylindrical
 EqualArea=function(){return Hr(z).parallel(38.58).scale(195.044)},n.geoCylindricalEqualAreaRaw=z,n.geoCylindricalStereographic=function(){return Hr(F).scale(124.75)},n.geoCylindricalStereographicRaw=F,n.geoEckert1=function(){return r.geoProjection(L).scale(165.664)},n.geoEckert1Raw=L,n.geoEckert2=function(){return r.geoProjection(q).scale(165.664)},n.geoEckert2Raw=q,n.geoEckert3=function(){return r.geoProjection(B).scale(180.739)},n.geoEckert3Raw=B,n.geoEckert4=function(){return r.geoProjection(H).scale(180.739)},n.geoEckert4Raw=H,n.geoEckert5=function(){return r.geoProjection(I).scale(173.044)},n.geoEckert5Raw=I,n.geoEckert6=function(){return r.geoProjection(W).scale(173.044)},n.geoEckert6Raw=W,n.geoEisenlohr=function(){return r.geoProjection(T).scale(62.5271)},n.geoEisenlohrRaw=T,n.geoFahey=function(){return r.geoProjection(D).scale(137.152)},n.geoFaheyRaw=D,n.geoFoucaut=function(){return r.geoProjection(N).scale(135.264)},n.geoFoucautRaw=N,n.geoGilbert=function(n){function e(n){r
 eturn i(Q(n))}function o(n){e[n]=function(r){return arguments.length?(i[n](r),e):i[n]()}}null==n&&(n=r.geoOrthographic);var i=n(),u=r.geoEquirectangular().scale(Gr).precision(0).clipAngle(null).translate([0,0]);return i.invert&&(e.invert=function(n){return V(i.invert(n))}),e.stream=function(n){var r=i.stream(n),e=u.stream({point:function(n,e){r.point(n/2,t(Pr(-e/2*Cr))*Gr)},lineStart:function(){r.lineStart()},lineEnd:function(){r.lineEnd()},polygonStart:function(){r.polygonStart()},polygonEnd:function(){r.polygonEnd()}});return e.sphere=r.sphere,e},e.rotate=function(n){return arguments.length?(u.rotate(n),e):u.rotate()},e.center=function(n){return arguments.length?(i.center(Q(n)),e):V(i.center())},o("clipAngle"),o("clipExtent"),o("scale"),o("translate"),o("precision"),e.scale(249.5)},n.geoGingery=function(){var n=6,e=30*Cr,o=lr(e),i=mr(e),u=r.geoProjectionMutator(_),a=u(e,n),c=a.stream,f=-lr(.01*Cr),l=mr(.01*Cr);return a.radius=function(r){return arguments.length?(o=lr(e=r*Cr),i=mr(
 e),u(e,n)):e*Gr},a.lobes=function(r){return arguments.length?u(e,n=+r):n},a.stream=function(r){var e=a.rotate(),u=c(r),g=(a.rotate([0,0]),c(r));return a.rotate(e),u.sphere=function(){g.polygonStart(),g.lineStart();for(var r=0,e=2*jr/n,u=0;r<n;++r,u-=e)g.point(fr(l*lr(u),f)*Gr,t(l*mr(u))*Gr),g.point(fr(i*lr(u-e/2),o)*Gr,t(i*mr(u-e/2))*Gr);g.lineEnd(),g.polygonEnd()},u},a.rotate([90,-40]).scale(91.7095).clipAngle(179.999)},n.geoGingeryRaw=_,n.geoGinzburg4=function(){return r.geoProjection(Qr).scale(149.995)},n.geoGinzburg4Raw=Qr,n.geoGinzburg5=function(){return r.geoProjection(Vr).scale(153.93)},n.geoGinzburg5Raw=Vr,n.geoGinzburg6=function(){return r.geoProjection(_r).scale(130.945)},n.geoGinzburg6Raw=_r,n.geoGinzburg8=function(){return r.geoProjection(U).scale(131.747)},n.geoGinzburg8Raw=U,n.geoGinzburg9=function(){return r.geoProjection(Kr).scale(131.087)},n.geoGinzburg9Raw=Kr,n.geoGringorten=function(){return r.geoProjection(Or(J)).scale(239.75)},n.geoGringortenRaw=J,n.geoGuyou=fun
 ction(){return r.geoProjection(Or(Z)).scale(151.496)},n.geoGuyouRaw=Z,n.geoHammer=function(){var n=2,e=r.geoProjectionMutator(p),t=e(n);return t.coefficient=function(r){return arguments.length?e(n=+r):n},t.scale(169.529)},n.geoHammerRaw=p,n.geoHammerRetroazimuthal=function(){var n=0,e=r.geoProjectionMutator($),t=e(n),o=t.rotate,i=t.stream,u=r.geoCircle();return t.parallel=function(r){if(!arguments.length)return n*Gr;var o=t.rotate();return e(n=r*Cr).rotate(o)},t.rotate=function(r){return arguments.length?(o.call(t,[r[0],r[1]-n*Gr]),u.center([-r[0],-r[1]]),t):(r=o.call(t),r[1]+=n*Gr,r)},t.stream=function(n){return n=i(n),n.sphere=function(){n.polygonStart();var r,e=u.radius(89.99)().coordinates[0],t=e.length-1,o=-1;for(n.lineStart();++o<t;)n.point((r=e[o])[0],r[1]);for(n.lineEnd(),t=(e=u.radius(90.01)().coordinates[0]).length-1,n.lineStart();--o>=0;)n.point((r=e[o])[0],r[1]);n.lineEnd(),n.polygonEnd()},n},t.scale(79.4187).parallel(45).clipAngle(179.999)},n.geoHammerRetroazimuthalRaw=
 $,n.geoHealpix=function(){var n=4,t=r.geoProjectionMutator(rn),o=t(n),i=o.stream;return o.lobes=function(r){return arguments.length?t(n=+r):n},o.stream=function(t){var u=o.rotate(),a=i(t),c=(o.rotate([0,0]),i(t));return o.rotate(u),a.sphere=function(){r.geoStream(function(n){return{type:"Polygon",coordinates:[e.range(-180,180+n/2,n).map(function(n,r){return[n,1&r?90-1e-6:Ur]}).concat(e.range(180,-180-n/2,-n).map(function(n,r){return[n,1&r?1e-6-90:-Ur]}))]}}(180/n),c)},a},o.scale(239.75)},n.geoHealpixRaw=rn,n.geoHill=function(){var n=1,e=r.geoProjectionMutator(en),t=e(n);return t.ratio=function(r){return arguments.length?e(n=+r):n},t.scale(167.774).center([0,18.67])},n.geoHillRaw=en,n.geoHomolosine=function(){return r.geoProjection(on).scale(152.63)},n.geoHomolosineRaw=on,n.geoInterrupt=Zr,n.geoInterruptedBoggs=function(){return Zr(m,$r).scale(160.857)},n.geoInterruptedHomolosine=function(){return Zr(on,ne).scale(152.63)},n.geoInterruptedMollweide=function(){return Zr(Lr,re).scale(16
 9.529)},n.geoInterruptedMollweideHemispheres=function(){return Zr(Lr,ee).scale(169.529).rotate([20,0])},n.geoInterruptedSinuMollweide=function(){return Zr(tn,te).rotate([-20,-55]).scale(164.263).center([0,-5.4036])},n.geoInterruptedSinusoidal=function(){return Zr(P,oe).scale(152.63).rotate([-20,0])},n.geoKavrayskiy7=function(){return r.geoProjection(cn).scale(158.837)},n.geoKavrayskiy7Raw=cn,n.geoLagrange=function(){var n=.5,e=r.geoProjectionMutator(fn),t=e(n);return t.spacing=function(r){return arguments.length?e(n=+r):n},t.scale(124.75)},n.geoLagrangeRaw=fn,n.geoLarrivee=function(){return r.geoProjection(ln).scale(97.2672)},n.geoLarriveeRaw=ln,n.geoLaskowski=function(){return r.geoProjection(gn).scale(139.98)},n.geoLaskowskiRaw=gn,n.geoLittrow=function(){return r.geoProjection(vn).scale(144.049).clipAngle(89.999)},n.geoLittrowRaw=vn,n.geoLoximuthal=function(){return Hr(sn).parallel(40).scale(158.837)},n.geoLoximuthalRaw=sn,n.geoMiller=function(){return r.geoProjection(pn).scale(10
 8.318)},n.geoMillerRaw=pn,n.geoModifiedStereographic=dn,n.geoModifiedStereographicRaw=hn,n.geoModifiedStereographicAlaska=function(){return dn(ue,[152,-64]).scale(1500).center([-160.908,62.4864]).clipAngle(25)},n.geoModifiedStereographicGs48=function(){return dn(ae,[95,-38]).scale(1e3).clipAngle(55).center([-96.5563,38.8675])},n.geoModifiedStereographicGs50=function(){return dn(ce,[120,-45]).scale(359.513).clipAngle(55).center([-117.474,53.0628])},n.geoModifiedStereographicMiller=function(){return dn(fe,[-20,-18]).scale(209.091).center([20,16.7214]).clipAngle(82)},n.geoModifiedStereographicLee=function(){return dn(le,[165,10]).scale(250).clipAngle(130).center([-165,-10])},n.geoMollweide=function(){return r.geoProjection(Lr).scale(169.529)},n.geoMollweideRaw=Lr,n.geoMtFlatPolarParabolic=function(){return r.geoProjection(wn).scale(164.859)},n.geoMtFlatPolarParabolicRaw=wn,n.geoMtFlatPolarQuartic=function(){return r.geoProjection(yn).scale(188.209)},n.geoMtFlatPolarQuarticRaw=yn,n.geoM
 tFlatPolarSinusoidal=function(){return r.geoProjection(mn).scale(166.518)},n.geoMtFlatPolarSinusoidalRaw=mn,n.geoNaturalEarth=r.geoNaturalEarth1,n.geoNaturalEarthRaw=r.geoNaturalEarth1Raw,n.geoNaturalEarth2=function(){return r.geoProjection(Pn).scale(175.295)},n.geoNaturalEarth2Raw=Pn,n.geoNellHammer=function(){return r.geoProjection(Rn).scale(152.63)},n.geoNellHammerRaw=Rn,n.geoPatterson=function(){return r.geoProjection(bn).scale(139.319)},n.geoPattersonRaw=bn,n.geoPolyconic=function(){return r.geoProjection(jn).scale(103.74)},n.geoPolyconicRaw=jn,n.geoPolyhedral=je,n.geoPolyhedralButterfly=function(n){n=n||function(n){var e=r.geoCentroid({type:"MultiPoint",coordinates:n});return r.geoGnomonic().scale(1).translate([0,0]).rotate([-e[0],-e[1]])};var e=Ee.map(function(r){return{face:r,project:n(r)}});return[-1,0,0,1,0,1,4,5].forEach(function(n,r){var t=e[n];t&&(t.children||(t.children=[])).push(e[r])}),je(e[0],function(n,r){return e[n<-jr/2?r<0?6:4:n<0?r<0?2:0:n<jr/2?r<0?3:1:r<0?7:5]
 }).scale(101.858).center([0,45])},n.geoPolyhedralCollignon=function(n){n=n||function(n){var e=r.geoCentroid({type:"MultiPoint",coordinates:n});return r.geoProjection(Gn).translate([0,0]).scale(1).rotate(e[1]>0?[-e[0],0]:[180-e[0],180])};var e=Ee.map(function(r){return{face:r,project:n(r)}});return[-1,0,0,1,0,1,4,5].forEach(function(n,r){var t=e[n];t&&(t.children||(t.children=[])).push(e[r])}),je(e[0],function(n,r){return e[n<-jr/2?r<0?6:4:n<0?r<0?2:0:n<jr/2?r<0?3:1:r<0?7:5]}).scale(121.906).center([0,48.5904])},n.geoPolyhedralWaterman=function(n){n=n||function(n){var e=6===n.length?r.geoCentroid({type:"MultiPoint",coordinates:n}):n[0];return r.geoGnomonic().scale(1).translate([0,0]).rotate([-e[0],-e[1]])};var e=Ee.map(function(n){for(var r,e=n.map(Fn),t=e.length,o=e[t-1],i=[],u=0;u<t;++u)r=e[u],i.push(zn([.9486832980505138*o[0]+.31622776601683794*r[0],.9486832980505138*o[1]+.31622776601683794*r[1],.9486832980505138*o[2]+.31622776601683794*r[2]]),zn([.9486832980505138*r[0]+.316227766
 01683794*o[0],.9486832980505138*r[1]+.31622776601683794*o[1],.9486832980505138*r[2]+.31622776601683794*o[2]])),o=r;return i}),t=[],o=[-1,0,0,1,0,1,4,5];e.forEach(function(n,r){for(var i=Ee[r],u=i.length,a=t[r]=[],c=0;c<u;++c)e.push([i[c],n[(2*c+2)%(2*u)],n[(2*c+1)%(2*u)]]),o.push(r),a.push(function(n,r){return[n[1]*r[2]-n[2]*r[1],n[2]*r[0]-n[0]*r[2],n[0]*r[1]-n[1]*r[0]]}(Fn(n[(2*c+2)%(2*u)]),Fn(n[(2*c+1)%(2*u)])))});var i=e.map(function(r){return{project:n(r),face:r}});return o.forEach(function(n,r){var e=i[n];e&&(e.children||(e.children=[])).push(i[r])}),je(i[0],function(n,r){var e=lr(r),o=[e*lr(n),e*mr(n),mr(r)],u=n<-jr/2?r<0?6:4:n<0?r<0?2:0:n<jr/2?r<0?3:1:r<0?7:5,a=t[u];return i[Cn(a[0],o)<0?8+3*u:Cn(a[1],o)<0?8+3*u+1:Cn(a[2],o)<0?8+3*u+2:u]}).scale(110.625).center([0,45])},n.geoProject=function(n,r){var e,t=r.stream;if(!t)throw new Error("invalid projection");switch(n&&n.type){case"Feature":e=qn;break;case"FeatureCollection":e=Ln;break;default:e=Bn}return e(n,t)},n.geoGringorten
 Quincuncial=function(){return Fe(J).scale(176.423)},n.geoPeirceQuincuncial=Le,n.geoPierceQuincuncial=Le,n.geoQuantize=function(n,r){function e(n){var e=n.length,t=2,o=new Array(e);for(o[0]=+n[0].toFixed(r),o[1]=+n[1].toFixed(r);t<e;)o[t]=n[t],++t;return o}function t(n){return n.map(e)}function o(n){return n.map(t)}function i(n){if(null==n)return n;var r;switch(n.type){case"GeometryCollection":r={type:"GeometryCollection",geometries:n.geometries.map(i)};break;case"Point":r={type:"Point",coordinates:e(n.coordinates)};break;case"MultiPoint":case"LineString":r={type:n.type,coordinates:t(n.coordinates)};break;case"MultiLineString":case"Polygon":r={type:n.type,coordinates:o(n.coordinates)};break;case"MultiPolygon":r={type:"MultiPolygon",coordinates:n.coordinates.map(o)};break;default:return n}return null!=n.bbox&&(r.bbox=n.bbox),r}function u(n){var r={type:"Feature",properties:n.properties,geometry:i(n.geometry)};return null!=n.id&&(r.id=n.id),null!=n.bbox&&(r.bbox=n.bbox),r}if(!(0<=(r=+r
 )&&r<=20))throw new Error("invalid digits");if(null!=n)switch(n.type){case"Feature":return u(n);case"FeatureCollection":var a={type:"FeatureCollection",features:n.features.map(u)};return null!=n.bbox&&(a.bbox=n.bbox),a;default:return i(n)}return n},n.geoQuincuncial=Fe,n.geoRectangularPolyconic=function(){return Hr(Hn).scale(131.215)},n.geoRectangularPolyconicRaw=Hn,n.geoRobinson=function(){return r.geoProjection(In).scale(152.63)},n.geoRobinsonRaw=In,n.geoSatellite=function(){var n=2,e=0,t=r.geoProjectionMutator(Wn),i=t(n,e);return i.distance=function(r){return arguments.length?t(n=+r,e):n},i.tilt=function(r){return arguments.length?t(n,e=r*Cr):e*Gr},i.scale(432.147).clipAngle(o(1/n)*Gr-1e-6)},n.geoSatelliteRaw=Wn,n.geoSinuMollweide=function(){return r.geoProjection(tn).rotate([-20,-55]).scale(164.263).center([0,-5.4036])},n.geoSinuMollweideRaw=tn,n.geoSinusoidal=function(){return r.geoProjection(P).scale(152.63)},n.geoSinusoidalRaw=P,n.geoStitch=function(n){if(null==n)return n;swit
 ch(n.type){case"Feature":return Kn(n);case"FeatureCollection":var r={type:"FeatureCollection",features:n.features.map(Kn)};return null!=n.bbox&&(r.bbox=n.bbox),r;default:return On(n)}},n.geoTimes=function(){return r.geoProjection(Un).scale(146.153)},n.geoTimesRaw=Un,n.geoTwoPointAzimuthal=Xn,n.geoTwoPointAzimuthalRaw=Jn,n.geoTwoPointAzimuthalUsa=function(){return Xn([-158,21.5],[-77,39]).clipAngle(60).scale(400)},n.geoTwoPointEquidistant=Zn,n.geoTwoPointEquidistantRaw=Yn,n.geoTwoPointEquidistantUsa=function(){return Zn([-158,21.5],[-77,39]).clipAngle(130).scale(122.571)},n.geoVanDerGrinten=function(){return r.geoProjection($n).scale(79.4183)},n.geoVanDerGrintenRaw=$n,n.geoVanDerGrinten2=function(){return r.geoProjection(nr).scale(79.4183)},n.geoVanDerGrinten2Raw=nr,n.geoVanDerGrinten3=function(){return r.geoProjection(rr).scale(79.4183)},n.geoVanDerGrinten3Raw=rr,n.geoVanDerGrinten4=function(){return r.geoProjection(er).scale(127.16)},n.geoVanDerGrinten4Raw=er,n.geoWagner4=function(
 ){return r.geoProjection(Ue).scale(176.84)},n.geoWagner4Raw=Ue,n.geoWagner6=function(){return r.geoProjection(tr).scale(152.63)},n.geoWagner6Raw=tr,n.geoWagner7=function(){return r.geoProjection(or).scale(172.632)},n.geoWagner7Raw=or,n.geoWiechel=function(){return r.geoProjection(ir).rotate([0,-90,45]).scale(124.75).clipAngle(179.999)},n.geoWiechelRaw=ir,n.geoWinkel3=function(){return r.geoProjection(ur).scale(158.837)},n.geoWinkel3Raw=ur,Object.defineProperty(n,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/src/main/resources/web/js/rs/libs/d3js/d3-geo.v1.min.js b/src/main/resources/web/js/rs/libs/d3js/d3-geo.v1.min.js
new file mode 100644
index 0000000..eb0e79d
--- /dev/null
+++ b/src/main/resources/web/js/rs/libs/d3js/d3-geo.v1.min.js
@@ -0,0 +1,2 @@
+// https://d3js.org/d3-geo/ Version 1.9.1. Copyright 2017 Mike Bostock.
+!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3-array")):"function"==typeof define&&define.amd?define(["exports","d3-array"],t):t(n.d3=n.d3||{},n.d3)}(this,function(n,t){"use strict";function r(){this.reset()}function i(n,t,r){var i=n.s=t+r,e=i-t,o=i-e;n.t=t-o+(r-e)}function e(n){return n>1?0:n<-1?Gt:Math.acos(n)}function o(n){return n>1?Tt:n<-1?-Tt:Math.asin(n)}function u(n){return(n=Kt(n/2))*n}function c(){}function a(n,t){n&&tr.hasOwnProperty(n.type)&&tr[n.type](n,t)}function l(n,t,r){var i,e=-1,o=n.length-r;for(t.lineStart();++e<o;)i=n[e],t.point(i[0],i[1],i[2]);t.lineEnd()}function f(n,t){var r=-1,i=n.length;for(t.polygonStart();++r<i;)l(n[r],t,1);t.polygonEnd()}function s(){or.point=h}function p(){g(it,et)}function h(n,t){or.point=g,it=n,et=t,ot=n*=It,ut=Ut(t=(t*=It)/2+kt),ct=Kt(t)}function g(n,t){t=(t*=It)/2+kt;var r=(n*=It)-ot,i=r>=0?1:-1,e=i*r,o=Ut(t),u=Kt(t),c=ct*u,a=ut*o+c*Ut(e),l=c*i*Kt(e);ir.add(Dt(l,a)),ot=n,ut=o,ct=u}function 
 v(n){return[Dt(n[1],n[0]),o(n[2])]}function d(n){var t=n[0],r=n[1],i=Ut(r);return[i*Ut(t),i*Kt(t),Kt(r)]}function E(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function y(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function S(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function m(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function M(n){var t=Vt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function x(n,t){dt.push(Et=[at=n,ft=n]),t<lt&&(lt=t),t>st&&(st=t)}function _(n,t){var r=d([n*It,t*It]);if(vt){var i=y(vt,r),e=y([i[1],-i[0],0],i);M(e),e=v(e);var o,u=n-pt,c=u>0?1:-1,a=e[0]*Ht*c,l=Wt(u)>180;l^(c*pt<a&&a<c*n)?(o=e[1]*Ht)>st&&(st=o):(a=(a+360)%360-180,l^(c*pt<a&&a<c*n)?(o=-e[1]*Ht)<lt&&(lt=o):(t<lt&&(lt=t),t>st&&(st=t))),l?n<pt?A(at,n)>A(at,ft)&&(ft=n):A(n,ft)>A(at,ft)&&(at=n):ft>=at?(n<at&&(at=n),n>ft&&(ft=n)):n>pt?A(at,n)>A(at,ft)&&(ft=n):A(n,ft)>A(at,ft)&&(at=n)}else dt.push(Et=[at=n,ft=n]);t<lt&&(lt=t),t>st&&(st=t),vt=r,pt=n}function N(){cr.point=_}function w
 (){Et[0]=at,Et[1]=ft,cr.point=x,vt=null}function C(n,t){if(vt){var r=n-pt;ur.add(Wt(r)>180?r+(r>0?360:-360):r)}else ht=n,gt=t;or.point(n,t),_(n,t)}function P(){or.lineStart()}function R(){C(ht,gt),or.lineEnd(),Wt(ur)>Ot&&(at=-(ft=180)),Et[0]=at,Et[1]=ft,vt=null}function A(n,t){return(t-=n)<0?t+360:t}function j(n,t){return n[0]-t[0]}function q(n,t){return n[0]<=n[1]?n[0]<=t&&t<=n[1]:t<n[0]||n[1]<t}function z(n,t){n*=It;var r=Ut(t*=It);b(r*Ut(n),r*Kt(n),Kt(t))}function b(n,t,r){mt+=(n-mt)/++yt,Mt+=(t-Mt)/yt,xt+=(r-xt)/yt}function L(){ar.point=O}function O(n,t){n*=It;var r=Ut(t*=It);qt=r*Ut(n),zt=r*Kt(n),bt=Kt(t),ar.point=G,b(qt,zt,bt)}function G(n,t){n*=It;var r=Ut(t*=It),i=r*Ut(n),e=r*Kt(n),o=Kt(t),u=Dt(Vt((u=zt*o-bt*e)*u+(u=bt*i-qt*o)*u+(u=qt*e-zt*i)*u),qt*i+zt*e+bt*o);St+=u,_t+=u*(qt+(qt=i)),Nt+=u*(zt+(zt=e)),wt+=u*(bt+(bt=o)),b(qt,zt,bt)}function T(){ar.point=z}function k(){ar.point=H}function F(){I(At,jt),ar.point=z}function H(n,t){At=n,jt=t,n*=It,t*=It,ar.point=I;var r=Ut(t);qt=
 r*Ut(n),zt=r*Kt(n),bt=Kt(t),b(qt,zt,bt)}function I(n,t){n*=It;var r=Ut(t*=It),i=r*Ut(n),e=r*Kt(n),u=Kt(t),c=zt*u-bt*e,a=bt*i-qt*u,l=qt*e-zt*i,f=Vt(c*c+a*a+l*l),s=o(f),p=f&&-s/f;Ct+=p*c,Pt+=p*a,Rt+=p*l,St+=s,_t+=s*(qt+(qt=i)),Nt+=s*(zt+(zt=e)),wt+=s*(bt+(bt=u)),b(qt,zt,bt)}function W(n,t){return[n>Gt?n-Ft:n<-Gt?n+Ft:n,t]}function B(n,t,r){return(n%=Ft)?t||r?fr(U(n),X(t,r)):U(n):t||r?X(t,r):W}function D(n){return function(t,r){return t+=n,[t>Gt?t-Ft:t<-Gt?t+Ft:t,r]}}function U(n){var t=D(n);return t.invert=D(-n),t}function X(n,t){function r(n,t){var r=Ut(t),a=Ut(n)*r,l=Kt(n)*r,f=Kt(t),s=f*i+a*e;return[Dt(l*u-s*c,a*i-f*e),o(s*u+l*c)]}var i=Ut(n),e=Kt(n),u=Ut(t),c=Kt(t);return r.invert=function(n,t){var r=Ut(t),a=Ut(n)*r,l=Kt(n)*r,f=Kt(t),s=f*u-l*c;return[Dt(l*u+f*c,a*i+s*e),o(s*i-a*e)]},r}function Y(n,t,r,i,e,o){if(r){var u=Ut(t),c=Kt(t),a=i*r;null==e?(e=t+i*Ft,o=t-a/2):(e=Z(u,e),o=Z(u,o),(i>0?e<o:e>o)&&(e+=i*Ft));for(var l,f=e;i>0?f>o:f<o;f-=a)l=v([u,-c*Ut(f),-c*Kt(f)]),n.point(l[0],l
 [1])}}function Z(n,t){(t=d(t))[0]-=n,M(t);var r=e(-t[1]);return((-t[2]<0?-r:r)+Ft-Ot)%Ft}function J(n,t,r,i){this.x=n,this.z=t,this.o=r,this.e=i,this.v=!1,this.n=this.p=null}function K(n){if(t=n.length){for(var t,r,i=0,e=n[0];++i<t;)e.n=r=n[i],r.p=e,e=r;e.n=r=n[0],r.p=e}}function Q(n){return n.length>1}function V(n,t){return((n=n.x)[0]<0?n[1]-Tt-Ot:Tt-n[1])-((t=t.x)[0]<0?t[1]-Tt-Ot:Tt-t[1])}function $(n,r,i,e){function o(t,o){return n<=t&&t<=i&&r<=o&&o<=e}function u(t,o,u,a){var f=0,s=0;if(null==t||(f=c(t,u))!==(s=c(o,u))||l(t,o)<0^u>0)do{a.point(0===f||3===f?n:i,f>1?e:r)}while((f=(f+u+4)%4)!==s);else a.point(o[0],o[1])}function c(t,e){return Wt(t[0]-n)<Ot?e>0?0:3:Wt(t[0]-i)<Ot?e>0?2:1:Wt(t[1]-r)<Ot?e>0?1:0:e>0?3:2}function a(n,t){return l(n.x,t.x)}function l(n,t){var r=c(n,1),i=c(t,1);return r!==i?r-i:0===r?t[1]-n[1]:1===r?n[0]-t[0]:2===r?n[1]-t[1]:t[0]-n[0]}return function(c){function l(n,t){o(n,t)&&x.point(n,t)}function f(t,u){var c=o(t,u);if(p&&h.push([t,u]),m)g=t,v=u,d=c,m=!1,c
 &&(x.lineStart(),x.point(t,u));else if(c&&S)x.point(t,u);else{var a=[E=Math.max(br,Math.min(zr,E)),y=Math.max(br,Math.min(zr,y))],l=[t=Math.max(br,Math.min(zr,t)),u=Math.max(br,Math.min(zr,u))];qr(a,l,n,r,i,e)?(S||(x.lineStart(),x.point(a[0],a[1])),x.point(l[0],l[1]),c||x.lineEnd(),M=!1):c&&(x.lineStart(),x.point(t,u),M=!1)}E=t,y=u,S=c}var s,p,h,g,v,d,E,y,S,m,M,x=c,_=_r(),N={point:l,lineStart:function(){N.point=f,p&&p.push(h=[]),m=!0,S=!1,E=y=NaN},lineEnd:function(){s&&(f(g,v),d&&S&&_.rejoin(),s.push(_.result())),N.point=l,S&&x.lineEnd()},polygonStart:function(){x=_,s=[],p=[],M=!0},polygonEnd:function(){var r=function(){for(var t=0,r=0,i=p.length;r<i;++r)for(var o,u,c=p[r],a=1,l=c.length,f=c[0],s=f[0],h=f[1];a<l;++a)o=s,u=h,s=(f=c[a])[0],h=f[1],u<=e?h>e&&(s-o)*(e-u)>(h-u)*(n-o)&&++t:h<=e&&(s-o)*(e-u)<(h-u)*(n-o)&&--t;return t}(),i=M&&r,o=(s=t.merge(s)).length;(i||o)&&(c.polygonStart(),i&&(c.lineStart(),u(null,null,1,c),c.lineEnd()),o&&wr(s,a,r,u,c),c.polygonEnd()),x=c,s=p=h=null}};r
 eturn N}}function nn(){Or.point=Or.lineEnd=c}function tn(n,t){sr=n*=It,pr=Kt(t*=It),hr=Ut(t),Or.point=rn}function rn(n,t){n*=It;var r=Kt(t*=It),i=Ut(t),e=Wt(n-sr),o=Ut(e),u=i*Kt(e),c=hr*r-pr*i*o,a=pr*r+hr*i*o;Lr.add(Dt(Vt(u*u+c*c),a)),sr=n,pr=r,hr=i}function en(n,t){return!(!n||!Ir.hasOwnProperty(n.type))&&Ir[n.type](n,t)}function on(n,t){return 0===Fr(n,t)}function un(n,t){var r=Fr(n[0],n[1]);return Fr(n[0],t)+Fr(t,n[1])<=r+Ot}function cn(n,t){return!!Pr(n.map(an),ln(t))}function an(n){return(n=n.map(ln)).pop(),n}function ln(n){return[n[0]*It,n[1]*It]}function fn(n,r,i){var e=t.range(n,r-Ot,i).concat(r);return function(n){return e.map(function(t){return[n,t]})}}function sn(n,r,i){var e=t.range(n,r-Ot,i).concat(r);return function(n){return e.map(function(t){return[t,n]})}}function pn(){function n(){return{type:"MultiLineString",coordinates:r()}}function r(){return t.range(Xt(u/E)*E,o,E).map(h).concat(t.range(Xt(f/y)*y,l,y).map(g)).concat(t.range(Xt(e/v)*v,i,v).filter(function(n){ret
 urn Wt(n%E)>Ot}).map(s)).concat(t.range(Xt(a/d)*d,c,d).filter(function(n){return Wt(n%y)>Ot}).map(p))}var i,e,o,u,c,a,l,f,s,p,h,g,v=10,d=v,E=90,y=360,S=2.5;return n.lines=function(){return r().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(u).concat(g(l).slice(1),h(o).reverse().slice(1),g(f).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.extentMajor(t).extentMinor(t):n.extentMinor()},n.extentMajor=function(t){return arguments.length?(u=+t[0][0],o=+t[1][0],f=+t[0][1],l=+t[1][1],u>o&&(t=u,u=o,o=t),f>l&&(t=f,f=l,l=t),n.precision(S)):[[u,f],[o,l]]},n.extentMinor=function(t){return arguments.length?(e=+t[0][0],i=+t[1][0],a=+t[0][1],c=+t[1][1],e>i&&(t=e,e=i,i=t),a>c&&(t=a,a=c,c=t),n.precision(S)):[[e,a],[i,c]]},n.step=function(t){return arguments.length?n.stepMajor(t).stepMinor(t):n.stepMinor()},n.stepMajor=function(t){return arguments.length?(E=+t[0],y=+t[1],n):[E,y]},n.stepMinor=function(t){retu
 rn arguments.length?(v=+t[0],d=+t[1],n):[v,d]},n.precision=function(t){return arguments.length?(S=+t,s=fn(a,c,90),p=sn(e,i,S),h=fn(f,l,90),g=sn(u,o,S),n):S},n.extentMajor([[-180,-90+Ot],[180,90-Ot]]).extentMinor([[-180,-80-Ot],[180,80+Ot]])}function hn(){Ur.point=gn}function gn(n,t){Ur.point=vn,gr=dr=n,vr=Er=t}function vn(n,t){Dr.add(Er*n-dr*t),dr=n,Er=t}function dn(){vn(gr,vr)}function En(n,t){Qr+=n,Vr+=t,++$r}function yn(){ui.point=Sn}function Sn(n,t){ui.point=mn,En(mr=n,Mr=t)}function mn(n,t){var r=n-mr,i=t-Mr,e=Vt(r*r+i*i);ni+=e*(mr+n)/2,ti+=e*(Mr+t)/2,ri+=e,En(mr=n,Mr=t)}function Mn(){ui.point=En}function xn(){ui.point=Nn}function _n(){wn(yr,Sr)}function Nn(n,t){ui.point=wn,En(yr=mr=n,Sr=Mr=t)}function wn(n,t){var r=n-mr,i=t-Mr,e=Vt(r*r+i*i);ni+=e*(mr+n)/2,ti+=e*(Mr+t)/2,ri+=e,ii+=(e=Mr*n-mr*t)*(mr+n),ei+=e*(Mr+t),oi+=3*e,En(mr=n,Mr=t)}function Cn(n){this._context=n}function Pn(n,t){hi.point=Rn,ai=fi=n,li=si=t}function Rn(n,t){fi-=n,si-=t,pi.add(Vt(fi*fi+si*si)),fi=n,si=t}funct
 ion An(){this._string=[]}function jn(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function qn(n){return function(t){var r=new zn;for(var i in n)r[i]=n[i];return r.stream=t,r}}function zn(){}function bn(n,t,r){var i=n.clipExtent&&n.clipExtent();return n.scale(150).translate([0,0]),null!=i&&n.clipExtent(null),rr(r,n.stream(Kr)),t(Kr.result()),null!=i&&n.clipExtent(i),n}function Ln(n,t,r){return bn(n,function(r){var i=t[1][0]-t[0][0],e=t[1][1]-t[0][1],o=Math.min(i/(r[1][0]-r[0][0]),e/(r[1][1]-r[0][1])),u=+t[0][0]+(i-o*(r[1][0]+r[0][0]))/2,c=+t[0][1]+(e-o*(r[1][1]+r[0][1]))/2;n.scale(150*o).translate([u,c])},r)}function On(n,t,r){return Ln(n,[[0,0],t],r)}function Gn(n,t,r){return bn(n,function(r){var i=+t,e=i/(r[1][0]-r[0][0]),o=(i-e*(r[1][0]+r[0][0]))/2,u=-e*r[0][1];n.scale(150*e).translate([o,u])},r)}function Tn(n,t,r){return bn(n,function(r){var i=+t,e=i/(r[1][1]-r[0][1]),o=-e*r[0][0],u=(i-e*(r[1][1]+r[0][1]))/2;n.scale(150*e).translate([o,u])},r)}fun
 ction kn(n){return Fn(function(){return n})()}function Fn(n){function t(n){return n=l(n[0]*It,n[1]*It),[n[0]*v+u,c-n[1]*v]}function r(n,t){return n=o(n,t),[n[0]*v+u,c-n[1]*v]}function i(){l=fr(a=B(m,M,x),o);var n=o(y,S);return u=d-n[0]*v,c=E+n[1]*v,e()}function e(){return h=g=null,t}var o,u,c,a,l,f,s,p,h,g,v=150,d=480,E=250,y=0,S=0,m=0,M=0,x=0,_=null,N=Ar,w=null,C=Wr,P=.5,R=di(r,P);return t.stream=function(n){return h&&g===n?h:h=Ei(function(n){return qn({point:function(t,r){var i=n(t,r);return this.stream.point(i[0],i[1])}})}(a)(N(R(C(g=n)))))},t.preclip=function(n){return arguments.length?(N=n,_=void 0,e()):N},t.postclip=function(n){return arguments.length?(C=n,w=f=s=p=null,e()):C},t.clipAngle=function(n){return arguments.length?(N=+n?jr(_=n*It):(_=null,Ar),e()):_*Ht},t.clipExtent=function(n){return arguments.length?(C=null==n?(w=f=s=p=null,Wr):$(w=+n[0][0],f=+n[0][1],s=+n[1][0],p=+n[1][1]),e()):null==w?null:[[w,f],[s,p]]},t.scale=function(n){return arguments.length?(v=+n,i()):v},t
 .translate=function(n){return arguments.length?(d=+n[0],E=+n[1],i()):[d,E]},t.center=function(n){return arguments.length?(y=n[0]%360*It,S=n[1]%360*It,i()):[y*Ht,S*Ht]},t.rotate=function(n){return arguments.length?(m=n[0]%360*It,M=n[1]%360*It,x=n.length>2?n[2]%360*It:0,i()):[m*Ht,M*Ht,x*Ht]},t.precision=function(n){return arguments.length?(R=di(r,P=n*n),e()):Vt(P)},t.fitExtent=function(n,r){return Ln(t,n,r)},t.fitSize=function(n,r){return On(t,n,r)},t.fitWidth=function(n,r){return Gn(t,n,r)},t.fitHeight=function(n,r){return Tn(t,n,r)},function(){return o=n.apply(this,arguments),t.invert=o.invert&&function(n){return(n=l.invert((n[0]-u)/v,(c-n[1])/v))&&[n[0]*Ht,n[1]*Ht]},i()}}function Hn(n){var t=0,r=Gt/3,i=Fn(n),e=i(t,r);return e.parallels=function(n){return arguments.length?i(t=n[0]*It,r=n[1]*It):[t*Ht,r*Ht]},e}function In(n,t){function r(n,t){var r=Vt(u-2*e*Kt(t))/e;return[r*Kt(n*=e),c-r*Ut(n)]}var i=Kt(n),e=(i+Kt(t))/2;if(Wt(e)<Ot)return function(n){function t(n,t){return[n*r,Kt(t)
 /r]}var r=Ut(n);return t.invert=function(n,t){return[n/r,o(t*r)]},t}(n);var u=1+i*(2*e-i),c=Vt(u)/e;return r.invert=function(n,t){var r=c-t;return[Dt(n,Wt(r))/e*Qt(r),o((u-(n*n+r*r)*e*e)/(2*e))]},r}function Wn(n){return function(t,r){var i=Ut(t),e=Ut(r),o=n(i*e);return[o*e*Kt(t),o*Kt(r)]}}function Bn(n){return function(t,r){var i=Vt(t*t+r*r),e=n(i),u=Kt(e),c=Ut(e);return[Dt(t*u,i*c),o(i&&r*u/i)]}}function Dn(n,t){return[n,Zt($t((Tt+t)/2))]}function Un(n){function t(){var t=Gt*c(),u=o(xr(o.rotate()).invert([0,0]));return l(null==f?[[u[0]-t,u[1]-t],[u[0]+t,u[1]+t]]:n===Dn?[[Math.max(u[0]-t,f),r],[Math.min(u[0]+t,i),e]]:[[f,Math.max(u[1]-t,r)],[i,Math.min(u[1]+t,e)]])}var r,i,e,o=kn(n),u=o.center,c=o.scale,a=o.translate,l=o.clipExtent,f=null;return o.scale=function(n){return arguments.length?(c(n),t()):c()},o.translate=function(n){return arguments.length?(a(n),t()):a()},o.center=function(n){return arguments.length?(u(n),t()):u()},o.clipExtent=function(n){return arguments.length?(null==
 n?f=r=i=e=null:(f=+n[0][0],r=+n[0][1],i=+n[1][0],e=+n[1][1]),t()):null==f?null:[[f,r],[i,e]]},t()}function Xn(n){return $t((Tt+n)/2)}function Yn(n,t){function r(n,t){o>0?t<-Tt+Ot&&(t=-Tt+Ot):t>Tt-Ot&&(t=Tt-Ot);var r=o/Jt(Xn(t),e);return[r*Kt(e*n),o-r*Ut(e*n)]}var i=Ut(n),e=n===t?Kt(n):Zt(i/Ut(t))/Zt(Xn(t)/Xn(n)),o=i*Jt(Xn(n),e)/e;return e?(r.invert=function(n,t){var r=o-t,i=Qt(e)*Vt(n*n+r*r);return[Dt(n,Wt(r))/e*Qt(r),2*Bt(Jt(o/i,1/e))-Tt]},r):Dn}function Zn(n,t){return[n,t]}function Jn(n,t){function r(n,t){var r=o-t,i=e*n;return[r*Kt(i),o-r*Ut(i)]}var i=Ut(n),e=n===t?Kt(n):(i-Ut(t))/(t-n),o=i/e+n;return Wt(e)<Ot?Zn:(r.invert=function(n,t){var r=o-t;return[Dt(n,Wt(r))/e*Qt(r),o-Qt(e)*Vt(n*n+r*r)]},r)}function Kn(n,t){var r=Ut(t),i=Ut(n)*r;return[r*Kt(n)/i,Kt(t)/i]}function Qn(n,t,r,i){return 1===n&&1===t&&0===r&&0===i?Wr:qn({point:function(e,o){this.stream.point(e*n+r,o*t+i)}})}function Vn(n,t){var r=t*t,i=r*r;return[n*(.8707-.131979*r+i*(i*(.003971*r-.001529*i)-.013791)),t*(1.00722
 6+r*(.015085+i*(.028874*r-.044475-.005916*i)))]}function $n(n,t){return[Ut(t)*Kt(n),Kt(t)]}function nt(n,t){var r=Ut(t),i=1+Ut(n)*r;return[r*Kt(n)/i,Kt(t)/i]}function tt(n,t){return[Zt($t((Tt+t)/2)),-n]}var rt=function(){return new r};r.prototype={constructor:r,reset:function(){this.s=this.t=0},add:function(n){i(Lt,n,this.t),i(this,Lt.s,this.s),this.s?this.t+=Lt.t:this.s=Lt.t},valueOf:function(){return this.s}};var it,et,ot,ut,ct,at,lt,ft,st,pt,ht,gt,vt,dt,Et,yt,St,mt,Mt,xt,_t,Nt,wt,Ct,Pt,Rt,At,jt,qt,zt,bt,Lt=new r,Ot=1e-6,Gt=Math.PI,Tt=Gt/2,kt=Gt/4,Ft=2*Gt,Ht=180/Gt,It=Gt/180,Wt=Math.abs,Bt=Math.atan,Dt=Math.atan2,Ut=Math.cos,Xt=Math.ceil,Yt=Math.exp,Zt=Math.log,Jt=Math.pow,Kt=Math.sin,Qt=Math.sign||function(n){return n>0?1:n<0?-1:0},Vt=Math.sqrt,$t=Math.tan,nr={Feature:function(n,t){a(n.geometry,t)},FeatureCollection:function(n,t){for(var r=n.features,i=-1,e=r.length;++i<e;)a(r[i].geometry,t)}},tr={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n
 [1],n[2])},MultiPoint:function(n,t){for(var r=n.coordinates,i=-1,e=r.length;++i<e;)n=r[i],t.point(n[0],n[1],n[2])},LineString:function(n,t){l(n.coordinates,t,0)},MultiLineString:function(n,t){for(var r=n.coordinates,i=-1,e=r.length;++i<e;)l(r[i],t,0)},Polygon:function(n,t){f(n.coordinates,t)},MultiPolygon:function(n,t){for(var r=n.coordinates,i=-1,e=r.length;++i<e;)f(r[i],t)},GeometryCollection:function(n,t){for(var r=n.geometries,i=-1,e=r.length;++i<e;)a(r[i],t)}},rr=function(n,t){n&&nr.hasOwnProperty(n.type)?nr[n.type](n,t):a(n,t)},ir=rt(),er=rt(),or={point:c,lineStart:c,lineEnd:c,polygonStart:function(){ir.reset(),or.lineStart=s,or.lineEnd=p},polygonEnd:function(){var n=+ir;er.add(n<0?Ft+n:n),this.lineStart=this.lineEnd=this.point=c},sphere:function(){er.add(Ft)}},ur=rt(),cr={point:x,lineStart:N,lineEnd:w,polygonStart:function(){cr.point=C,cr.lineStart=P,cr.lineEnd=R,ur.reset(),or.polygonStart()},polygonEnd:function(){or.polygonEnd(),cr.point=x,cr.lineStart=N,cr.lineEnd=w,ir<0?(a
 t=-(ft=180),lt=-(st=90)):ur>Ot?st=90:ur<-Ot&&(lt=-90),Et[0]=at,Et[1]=ft}},ar={sphere:c,point:z,lineStart:L,lineEnd:T,polygonStart:function(){ar.lineStart=k,ar.lineEnd=F},polygonEnd:function(){ar.lineStart=L,ar.lineEnd=T}},lr=function(n){return function(){return n}},fr=function(n,t){function r(r,i){return r=n(r,i),t(r[0],r[1])}return n.invert&&t.invert&&(r.invert=function(r,i){return(r=t.invert(r,i))&&n.invert(r[0],r[1])}),r};W.invert=W;var sr,pr,hr,gr,vr,dr,Er,yr,Sr,mr,Mr,xr=function(n){function t(t){return t=n(t[0]*It,t[1]*It),t[0]*=Ht,t[1]*=Ht,t}return n=B(n[0]*It,n[1]*It,n.length>2?n[2]*It:0),t.invert=function(t){return t=n.invert(t[0]*It,t[1]*It),t[0]*=Ht,t[1]*=Ht,t},t},_r=function(){var n,t=[];return{point:function(t,r){n.push([t,r])},lineStart:function(){t.push(n=[])},lineEnd:c,rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))},result:function(){var r=t;return t=[],n=null,r}}},Nr=function(n,t){return Wt(n[0]-t[0])<Ot&&Wt(n[1]-t[1])<Ot},wr=function(n,t,r,i,e){var 
 o,u,c=[],a=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,r,i=n[0],u=n[t];if(Nr(i,u)){for(e.lineStart(),o=0;o<t;++o)e.point((i=n[o])[0],i[1]);e.lineEnd()}else c.push(r=new J(i,n,null,!0)),a.push(r.o=new J(i,null,r,!1)),c.push(r=new J(u,n,null,!1)),a.push(r.o=new J(u,null,r,!0))}}),c.length){for(a.sort(t),K(c),K(a),o=0,u=a.length;o<u;++o)a[o].e=r=!r;for(var l,f,s=c[0];;){for(var p=s,h=!0;p.v;)if((p=p.n)===s)return;l=p.z,e.lineStart();do{if(p.v=p.o.v=!0,p.e){if(h)for(o=0,u=l.length;o<u;++o)e.point((f=l[o])[0],f[1]);else i(p.x,p.n.x,1,e);p=p.n}else{if(h)for(l=p.p.z,o=l.length-1;o>=0;--o)e.point((f=l[o])[0],f[1]);else i(p.x,p.p.x,-1,e);p=p.p}l=(p=p.o).z,h=!h}while(!p.v);e.lineEnd()}}},Cr=rt(),Pr=function(n,t){var r=t[0],i=t[1],e=[Kt(r),-Ut(r),0],u=0,c=0;Cr.reset();for(var a=0,l=n.length;a<l;++a)if(s=(f=n[a]).length)for(var f,s,p=f[s-1],h=p[0],g=p[1]/2+kt,v=Kt(g),E=Ut(g),S=0;S<s;++S,h=x,v=N,E=w,p=m){var m=f[S],x=m[0],_=m[1]/2+kt,N=Kt(_),w=Ut(_),C=x-h,P=C>=0?1:-1,R=P*C,A=R>Gt,
 j=v*N;if(Cr.add(Dt(j*P*Kt(R),E*w+j*Ut(R))),u+=A?C+P*Ft:C,A^h>=r^x>=r){var q=y(d(p),d(m));M(q);var z=y(e,q);M(z);var b=(A^C>=0?-1:1)*o(z[2]);(i>b||i===b&&(q[0]||q[1]))&&(c+=A^C>=0?1:-1)}}return(u<-Ot||u<Ot&&Cr<-Ot)^1&c},Rr=function(n,r,i,e){return function(o){function u(t,r){n(t,r)&&o.point(t,r)}function c(n,t){d.point(n,t)}function a(){m.point=c,d.lineStart()}function l(){m.point=u,d.lineEnd()}function f(n,t){v.push([n,t]),y.point(n,t)}function s(){y.lineStart(),v=[]}function p(){f(v[0][0],v[0][1]),y.lineEnd();var n,t,r,i,e=y.clean(),u=E.result(),c=u.length;if(v.pop(),h.push(v),v=null,c)if(1&e){if(r=u[0],(t=r.length-1)>0){for(S||(o.polygonStart(),S=!0),o.lineStart(),n=0;n<t;++n)o.point((i=r[n])[0],i[1]);o.lineEnd()}}else c>1&&2&e&&u.push(u.pop().concat(u.shift())),g.push(u.filter(Q))}var h,g,v,d=r(o),E=_r(),y=r(E),S=!1,m={point:u,lineStart:a,lineEnd:l,polygonStart:function(){m.point=f,m.lineStart=s,m.lineEnd=p,g=[],h=[]},polygonEnd:function(){m.point=u,m.lineStart=a,m.lineEnd=l,g=t.
 merge(g);var n=Pr(h,e);g.length?(S||(o.polygonStart(),S=!0),wr(g,V,n,i,o)):n&&(S||(o.polygonStart(),S=!0),o.lineStart(),i(null,null,1,o),o.lineEnd()),S&&(o.polygonEnd(),S=!1),g=h=null},sphere:function(){o.polygonStart(),o.lineStart(),i(null,null,1,o),o.lineEnd(),o.polygonEnd()}};return m}},Ar=Rr(function(){return!0},function(n){var t,r=NaN,i=NaN,e=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(o,u){var c=o>0?Gt:-Gt,a=Wt(o-r);Wt(a-Gt)<Ot?(n.point(r,i=(i+u)/2>0?Tt:-Tt),n.point(e,i),n.lineEnd(),n.lineStart(),n.point(c,i),n.point(o,i),t=0):e!==c&&a>=Gt&&(Wt(r-e)<Ot&&(r-=e*Ot),Wt(o-c)<Ot&&(o-=c*Ot),i=function(n,t,r,i){var e,o,u=Kt(n-r);return Wt(u)>Ot?Bt((Kt(t)*(o=Ut(i))*Kt(r)-Kt(i)*(e=Ut(t))*Kt(n))/(e*o*u)):(t+i)/2}(r,i,o,u),n.point(e,i),n.lineEnd(),n.lineStart(),n.point(c,i),t=0),n.point(r=o,i=u),e=c},lineEnd:function(){n.lineEnd(),r=i=NaN},clean:function(){return 2-t}}},function(n,t,r,i){var e;if(null==n)e=r*Tt,i.point(-Gt,e),i.point(0,e),i.point(Gt,e),i.point(Gt,0)
 ,i.point(Gt,-e),i.point(0,-e),i.point(-Gt,-e),i.point(-Gt,0),i.point(-Gt,e);else if(Wt(n[0]-t[0])>Ot){var o=n[0]<t[0]?Gt:-Gt;e=r*o/2,i.point(-o,e),i.point(0,e),i.point(o,e)}else i.point(t[0],t[1])},[-Gt,-Tt]),jr=function(n){function t(n,t){return Ut(n)*Ut(t)>e}function r(n,t,r){var i=[1,0,0],o=y(d(n),d(t)),u=E(o,o),c=o[0],a=u-c*c;if(!a)return!r&&n;var l=e*u/a,f=-e*c/a,s=y(i,o),p=m(i,l);S(p,m(o,f));var h=s,g=E(p,h),M=E(h,h),x=g*g-M*(E(p,p)-1);if(!(x<0)){var _=Vt(x),N=m(h,(-g-_)/M);if(S(N,p),N=v(N),!r)return N;var w,C=n[0],P=t[0],R=n[1],A=t[1];P<C&&(w=C,C=P,P=w);var j=P-C,q=Wt(j-Gt)<Ot;if(!q&&A<R&&(w=R,R=A,A=w),q||j<Ot?q?R+A>0^N[1]<(Wt(N[0]-C)<Ot?R:A):R<=N[1]&&N[1]<=A:j>Gt^(C<=N[0]&&N[0]<=P)){var z=m(h,(-g+_)/M);return S(z,p),[N,v(z)]}}}function i(t,r){var i=u?n:Gt-n,e=0;return t<-i?e|=1:t>i&&(e|=2),r<-i?e|=4:r>i&&(e|=8),e}var e=Ut(n),o=6*It,u=e>0,c=Wt(e)>Ot;return Rr(t,function(n){var e,o,a,l,f;return{lineStart:function(){l=a=!1,f=1},point:function(s,p){var h,g=[s,p],v=t(s,p),d=u?v?0
 :i(s,p):v?i(s+(s<0?Gt:-Gt),p):0;if(!e&&(l=a=v)&&n.lineStart(),v!==a&&(!(h=r(e,g))||Nr(e,h)||Nr(g,h))&&(g[0]+=Ot,g[1]+=Ot,v=t(g[0],g[1])),v!==a)f=0,v?(n.lineStart(),h=r(g,e),n.point(h[0],h[1])):(h=r(e,g),n.point(h[0],h[1]),n.lineEnd()),e=h;else if(c&&e&&u^v){var E;d&o||!(E=r(g,e,!0))||(f=0,u?(n.lineStart(),n.point(E[0][0],E[0][1]),n.point(E[1][0],E[1][1]),n.lineEnd()):(n.point(E[1][0],E[1][1]),n.lineEnd(),n.lineStart(),n.point(E[0][0],E[0][1])))}!v||e&&Nr(e,g)||n.point(g[0],g[1]),e=g,a=v,o=d},lineEnd:function(){a&&n.lineEnd(),e=null},clean:function(){return f|(l&&a)<<1}}},function(t,r,i,e){Y(e,n,o,i,t,r)},u?[0,-n]:[-Gt,n-Gt])},qr=function(n,t,r,i,e,o){var u,c=n[0],a=n[1],l=0,f=1,s=t[0]-c,p=t[1]-a;if(u=r-c,s||!(u>0)){if(u/=s,s<0){if(u<l)return;u<f&&(f=u)}else if(s>0){if(u>f)return;u>l&&(l=u)}if(u=e-c,s||!(u<0)){if(u/=s,s<0){if(u>f)return;u>l&&(l=u)}else if(s>0){if(u<l)return;u<f&&(f=u)}if(u=i-a,p||!(u>0)){if(u/=p,p<0){if(u<l)return;u<f&&(f=u)}else if(p>0){if(u>f)return;u>l&&(l=u)}if(u
 =o-a,p||!(u<0)){if(u/=p,p<0){if(u>f)return;u>l&&(l=u)}else if(p>0){if(u<l)return;u<f&&(f=u)}return l>0&&(n[0]=c+l*s,n[1]=a+l*p),f<1&&(t[0]=c+f*s,t[1]=a+f*p),!0}}}}},zr=1e9,br=-zr,Lr=rt(),Or={sphere:c,point:c,lineStart:function(){Or.point=tn,Or.lineEnd=nn},lineEnd:c,polygonStart:c,polygonEnd:c},Gr=function(n){return Lr.reset(),rr(n,Or),+Lr},Tr=[null,null],kr={type:"LineString",coordinates:Tr},Fr=function(n,t){return Tr[0]=n,Tr[1]=t,Gr(kr)},Hr={Feature:function(n,t){return en(n.geometry,t)},FeatureCollection:function(n,t){for(var r=n.features,i=-1,e=r.length;++i<e;)if(en(r[i].geometry,t))return!0;return!1}},Ir={Sphere:function(){return!0},Point:function(n,t){return on(n.coordinates,t)},MultiPoint:function(n,t){for(var r=n.coordinates,i=-1,e=r.length;++i<e;)if(on(r[i],t))return!0;return!1},LineString:function(n,t){return un(n.coordinates,t)},MultiLineString:function(n,t){for(var r=n.coordinates,i=-1,e=r.length;++i<e;)if(un(r[i],t))return!0;return!1},Polygon:function(n,t){return cn(n.co
 ordinates,t)},MultiPolygon:function(n,t){for(var r=n.coordinates,i=-1,e=r.length;++i<e;)if(cn(r[i],t))return!0;return!1},GeometryCollection:function(n,t){for(var r=n.geometries,i=-1,e=r.length;++i<e;)if(en(r[i],t))return!0;return!1}},Wr=function(n){return n},Br=rt(),Dr=rt(),Ur={point:c,lineStart:c,lineEnd:c,polygonStart:function(){Ur.lineStart=hn,Ur.lineEnd=dn},polygonEnd:function(){Ur.lineStart=Ur.lineEnd=Ur.point=c,Br.add(Wt(Dr)),Dr.reset()},result:function(){var n=Br/2;return Br.reset(),n}},Xr=1/0,Yr=Xr,Zr=-Xr,Jr=Zr,Kr={point:function(n,t){n<Xr&&(Xr=n),n>Zr&&(Zr=n),t<Yr&&(Yr=t),t>Jr&&(Jr=t)},lineStart:c,lineEnd:c,polygonStart:c,polygonEnd:c,result:function(){var n=[[Xr,Yr],[Zr,Jr]];return Zr=Jr=-(Yr=Xr=1/0),n}},Qr=0,Vr=0,$r=0,ni=0,ti=0,ri=0,ii=0,ei=0,oi=0,ui={point:En,lineStart:yn,lineEnd:Mn,polygonStart:function(){ui.lineStart=xn,ui.lineEnd=_n},polygonEnd:function(){ui.point=En,ui.lineStart=yn,ui.lineEnd=Mn},result:function(){var n=oi?[ii/oi,ei/oi]:ri?[ni/ri,ti/ri]:$r?[Qr/$r,Vr/
 $r]:[NaN,NaN];return Qr=Vr=$r=ni=ti=ri=ii=ei=oi=0,n}};Cn.prototype={_radius:4.5,pointRadius:function(n){return this._radius=n,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(n,t){switch(this._point){case 0:this._context.moveTo(n,t),this._point=1;break;case 1:this._context.lineTo(n,t);break;default:this._context.moveTo(n+this._radius,t),this._context.arc(n,t,this._radius,0,Ft)}},result:c};var ci,ai,li,fi,si,pi=rt(),hi={point:c,lineStart:function(){hi.point=Pn},lineEnd:function(){ci&&Rn(ai,li),hi.point=c},polygonStart:function(){ci=!0},polygonEnd:function(){ci=null},result:function(){var n=+pi;return pi.reset(),n}};An.prototype={_radius:4.5,_circle:jn(4.5),pointRadius:function(n){return(n=+n)!==this._radius&&(this._radius=n,this._circle=null),this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},l
 ineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._string.push("Z"),this._point=NaN},point:function(n,t){switch(this._point){case 0:this._string.push("M",n,",",t),this._point=1;break;case 1:this._string.push("L",n,",",t);break;default:null==this._circle&&(this._circle=jn(this._radius)),this._string.push("M",n,",",t,this._circle)}},result:function(){if(this._string.length){var n=this._string.join("");return this._string=[],n}return null}};zn.prototype={constructor:zn,point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var gi=16,vi=Ut(30*It),di=function(n,t){return+t?function(n,t){function r(i,e,u,c,a,l,f,s,p,h,g,v,d,E){var y=f-i,S=s-e,m=y*y+S*S;if(m>4*t&&d--){var M=c+h,x=a+g,_=l+v,N=Vt(M*M+x*x+_*_),w=o(_/=N),C=Wt(Wt(_)-1)<Ot||Wt(u-p)<Ot?(u+p)
 /2:Dt(x,M),P=n(C,w),R=P[0],A=P[1],j=R-i,q=A-e,z=S*j-y*q;(z*z/m>t||Wt((y*j+S*q)/m-.5)>.3||c*h+a*g+l*v<vi)&&(r(i,e,u,c,a,l,R,A,C,M/=N,x/=N,_,d,E),E.point(R,A),r(R,A,C,M,x,_,f,s,p,h,g,v,d,E))}}return function(t){function i(r,i){r=n(r,i),t.point(r[0],r[1])}function e(){y=NaN,_.point=o,t.lineStart()}function o(i,e){var o=d([i,e]),u=n(i,e);r(y,S,E,m,M,x,y=u[0],S=u[1],E=i,m=o[0],M=o[1],x=o[2],gi,t),t.point(y,S)}function u(){_.point=i,t.lineEnd()}function c(){e(),_.point=a,_.lineEnd=l}function a(n,t){o(f=n,t),s=y,p=S,h=m,g=M,v=x,_.point=o}function l(){r(y,S,E,m,M,x,s,p,f,h,g,v,gi,t),_.lineEnd=u,u()}var f,s,p,h,g,v,E,y,S,m,M,x,_={point:i,lineStart:e,lineEnd:u,polygonStart:function(){t.polygonStart(),_.lineStart=c},polygonEnd:function(){t.polygonEnd(),_.lineStart=e}};return _}}(n,t):function(n){return qn({point:function(t,r){t=n(t,r),this.stream.point(t[0],t[1])}})}(n)},Ei=qn({point:function(n,t){this.stream.point(n*It,t*It)}}),yi=function(){return Hn(In).scale(155.424).center([0,33.6442])},S
 i=function(){return yi().parallels([29.5,45.5]).scale(1070).translate([480,250]).rotate([96,0]).center([-.6,38.7])},mi=Wn(function(n){return Vt(2/(1+n))});mi.invert=Bn(function(n){return 2*o(n/2)});var Mi=Wn(function(n){return(n=e(n))&&n/Kt(n)});Mi.invert=Bn(function(n){return n});Dn.invert=function(n,t){return[n,2*Bt(Yt(t))-Tt]};Zn.invert=Zn;Kn.invert=Bn(Bt);Vn.invert=function(n,t){var r,i=t,e=25;do{var o=i*i,u=o*o;i-=r=(i*(1.007226+o*(.015085+u*(.028874*o-.044475-.005916*u)))-t)/(1.007226+o*(.045255+u*(.259866*o-.311325-.005916*11*u)))}while(Wt(r)>Ot&&--e>0);return[n/(.8707+(o=i*i)*(o*(o*o*o*(.003971-.001529*o)-.013791)-.131979)),i]};$n.invert=Bn(o);nt.invert=Bn(function(n){return 2*Bt(n)});tt.invert=function(n,t){return[-t,2*Bt(Yt(n))-Tt]};n.geoArea=function(n){return er.reset(),rr(n,or),2*er},n.geoBounds=function(n){var t,r,i,e,o,u,c;if(st=ft=-(at=lt=1/0),dt=[],rr(n,cr),r=dt.length){for(dt.sort(j),t=1,o=[i=dt[0]];t<r;++t)q(i,(e=dt[t])[0])||q(i,e[1])?(A(i[0],e[1])>A(i[0],i[1])&&(
 i[1]=e[1]),A(e[0],i[1])>A(i[0],i[1])&&(i[0]=e[0])):o.push(i=e);for(u=-1/0,t=0,i=o[r=o.length-1];t<=r;i=e,++t)e=o[t],(c=A(i[1],e[0]))>u&&(u=c,at=e[0],ft=i[1])}return dt=Et=null,at===1/0||lt===1/0?[[NaN,NaN],[NaN,NaN]]:[[at,lt],[ft,st]]},n.geoCentroid=function(n){yt=St=mt=Mt=xt=_t=Nt=wt=Ct=Pt=Rt=0,rr(n,ar);var t=Ct,r=Pt,i=Rt,e=t*t+r*r+i*i;return e<1e-12&&(t=_t,r=Nt,i=wt,St<Ot&&(t=mt,r=Mt,i=xt),(e=t*t+r*r+i*i)<1e-12)?[NaN,NaN]:[Dt(r,t)*Ht,o(i/Vt(e))*Ht]},n.geoCircle=function(){function n(){var n=i.apply(this,arguments),c=e.apply(this,arguments)*It,a=o.apply(this,arguments)*It;return t=[],r=B(-n[0]*It,-n[1]*It,0).invert,Y(u,c,a,1),n={type:"Polygon",coordinates:[t]},t=r=null,n}var t,r,i=lr([0,0]),e=lr(90),o=lr(6),u={point:function(n,i){t.push(n=r(n,i)),n[0]*=Ht,n[1]*=Ht}};return n.center=function(t){return arguments.length?(i="function"==typeof t?t:lr([+t[0],+t[1]]),n):i},n.radius=function(t){return arguments.length?(e="function"==typeof t?t:lr(+t),n):e},n.precision=function(t){return ar
 guments.length?(o="function"==typeof t?t:lr(+t),n):o},n},n.geoClipAntimeridian=Ar,n.geoClipCircle=jr,n.geoClipExtent=function(){var n,t,r,i=0,e=0,o=960,u=500;return r={stream:function(r){return n&&t===r?n:n=$(i,e,o,u)(t=r)},extent:function(c){return arguments.length?(i=+c[0][0],e=+c[0][1],o=+c[1][0],u=+c[1][1],n=t=null,r):[[i,e],[o,u]]}}},n.geoClipRectangle=$,n.geoContains=function(n,t){return(n&&Hr.hasOwnProperty(n.type)?Hr[n.type]:en)(n,t)},n.geoDistance=Fr,n.geoGraticule=pn,n.geoGraticule10=function(){return pn()()},n.geoInterpolate=function(n,t){var r=n[0]*It,i=n[1]*It,e=t[0]*It,c=t[1]*It,a=Ut(i),l=Kt(i),f=Ut(c),s=Kt(c),p=a*Ut(r),h=a*Kt(r),g=f*Ut(e),v=f*Kt(e),d=2*o(Vt(u(c-i)+a*f*u(e-r))),E=Kt(d),y=d?function(n){var t=Kt(n*=d)/E,r=Kt(d-n)/E,i=r*p+t*g,e=r*h+t*v,o=r*l+t*s;return[Dt(e,i)*Ht,Dt(o,Vt(i*i+e*e))*Ht]}:function(){return[r*Ht,i*Ht]};return y.distance=d,y},n.geoLength=Gr,n.geoPath=function(n,t){function r(n){return n&&("function"==typeof o&&e.pointRadius(+o.apply(this,argum
 ents)),rr(n,i(e))),e.result()}var i,e,o=4.5;return r.area=function(n){return rr(n,i(Ur)),Ur.result()},r.measure=function(n){return rr(n,i(hi)),hi.result()},r.bounds=function(n){return rr(n,i(Kr)),Kr.result()},r.centroid=function(n){return rr(n,i(ui)),ui.result()},r.projection=function(t){return arguments.length?(i=null==t?(n=null,Wr):(n=t).stream,r):n},r.context=function(n){return arguments.length?(e=null==n?(t=null,new An):new Cn(t=n),"function"!=typeof o&&e.pointRadius(o),r):t},r.pointRadius=function(n){return arguments.length?(o="function"==typeof n?n:(e.pointRadius(+n),+n),r):o},r.projection(n).context(t)},n.geoAlbers=Si,n.geoAlbersUsa=function(){function n(n){var t=n[0],r=n[1];return c=null,e.point(t,r),c||(o.point(t,r),c)||(u.point(t,r),c)}function t(){return r=i=null,n}var r,i,e,o,u,c,a=Si(),l=yi().rotate([154,0]).center([-2,58.5]).parallels([55,65]),f=yi().rotate([157,0]).center([-3,19.9]).parallels([8,18]),s={point:function(n,t){c=[n,t]}};return n.invert=function(n){var t=a
 .scale(),r=a.translate(),i=(n[0]-r[0])/t,e=(n[1]-r[1])/t;return(e>=.12&&e<.234&&i>=-.425&&i<-.214?l:e>=.166&&e<.234&&i>=-.214&&i<-.115?f:a).invert(n)},n.stream=function(n){return r&&i===n?r:r=function(n){var t=n.length;return{point:function(r,i){for(var e=-1;++e<t;)n[e].point(r,i)},sphere:function(){for(var r=-1;++r<t;)n[r].sphere()},lineStart:function(){for(var r=-1;++r<t;)n[r].lineStart()},lineEnd:function(){for(var r=-1;++r<t;)n[r].lineEnd()},polygonStart:function(){for(var r=-1;++r<t;)n[r].polygonStart()},polygonEnd:function(){for(var r=-1;++r<t;)n[r].polygonEnd()}}}([a.stream(i=n),l.stream(n),f.stream(n)])},n.precision=function(n){return arguments.length?(a.precision(n),l.precision(n),f.precision(n),t()):a.precision()},n.scale=function(t){return arguments.length?(a.scale(t),l.scale(.35*t),f.scale(t),n.translate(a.translate())):a.scale()},n.translate=function(n){if(!arguments.length)return a.translate();var r=a.scale(),i=+n[0],c=+n[1];return e=a.translate(n).clipExtent([[i-.455*
 r,c-.238*r],[i+.455*r,c+.238*r]]).stream(s),o=l.translate([i-.307*r,c+.201*r]).clipExtent([[i-.425*r+Ot,c+.12*r+Ot],[i-.214*r-Ot,c+.234*r-Ot]]).stream(s),u=f.translate([i-.205*r,c+.212*r]).clipExtent([[i-.214*r+Ot,c+.166*r+Ot],[i-.115*r-Ot,c+.234*r-Ot]]).stream(s),t()},n.fitExtent=function(t,r){return Ln(n,t,r)},n.fitSize=function(t,r){return On(n,t,r)},n.fitWidth=function(t,r){return Gn(n,t,r)},n.fitHeight=function(t,r){return Tn(n,t,r)},n.scale(1070)},n.geoAzimuthalEqualArea=function(){return kn(mi).scale(124.75).clipAngle(179.999)},n.geoAzimuthalEqualAreaRaw=mi,n.geoAzimuthalEquidistant=function(){return kn(Mi).scale(79.4188).clipAngle(179.999)},n.geoAzimuthalEquidistantRaw=Mi,n.geoConicConformal=function(){return Hn(Yn).scale(109.5).parallels([30,30])},n.geoConicConformalRaw=Yn,n.geoConicEqualArea=yi,n.geoConicEqualAreaRaw=In,n.geoConicEquidistant=function(){return Hn(Jn).scale(131.154).center([0,13.9389])},n.geoConicEquidistantRaw=Jn,n.geoEquirectangular=function(){return kn(Zn
 ).scale(152.63)},n.geoEquirectangularRaw=Zn,n.geoGnomonic=function(){return kn(Kn).scale(144.049).clipAngle(60)},n.geoGnomonicRaw=Kn,n.geoIdentity=function(){function n(){return e=o=null,u}var t,r,i,e,o,u,c=1,a=0,l=0,f=1,s=1,p=Wr,h=null,g=Wr;return u={stream:function(n){return e&&o===n?e:e=p(g(o=n))},postclip:function(e){return arguments.length?(g=e,h=t=r=i=null,n()):g},clipExtent:function(e){return arguments.length?(g=null==e?(h=t=r=i=null,Wr):$(h=+e[0][0],t=+e[0][1],r=+e[1][0],i=+e[1][1]),n()):null==h?null:[[h,t],[r,i]]},scale:function(t){return arguments.length?(p=Qn((c=+t)*f,c*s,a,l),n()):c},translate:function(t){return arguments.length?(p=Qn(c*f,c*s,a=+t[0],l=+t[1]),n()):[a,l]},reflectX:function(t){return arguments.length?(p=Qn(c*(f=t?-1:1),c*s,a,l),n()):f<0},reflectY:function(t){return arguments.length?(p=Qn(c*f,c*(s=t?-1:1),a,l),n()):s<0},fitExtent:function(n,t){return Ln(u,n,t)},fitSize:function(n,t){return On(u,n,t)},fitWidth:function(n,t){return Gn(u,n,t)},fitHeight:functi
 on(n,t){return Tn(u,n,t)}}},n.geoProjection=kn,n.geoProjectionMutator=Fn,n.geoMercator=function(){return Un(Dn).scale(961/Ft)},n.geoMercatorRaw=Dn,n.geoNaturalEarth1=function(){return kn(Vn).scale(175.295)},n.geoNaturalEarth1Raw=Vn,n.geoOrthographic=function(){return kn($n).scale(249.5).clipAngle(90+Ot)},n.geoOrthographicRaw=$n,n.geoStereographic=function(){return kn(nt).scale(250).clipAngle(142)},n.geoStereographicRaw=nt,n.geoTransverseMercator=function(){var n=Un(tt),t=n.center,r=n.rotate;return n.center=function(n){return arguments.length?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return arguments.length?r([n[0],n[1],n.length>2?n[2]+90:90]):(n=r(),[n[0],n[1],n[2]-90])},r([0,0,90]).scale(159.155)},n.geoTransverseMercatorRaw=tt,n.geoRotation=xr,n.geoStream=rr,n.geoTransform=function(n){return{stream:qn(n)}},Object.defineProperty(n,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/src/main/resources/web/js/rs/libs/d3js/d3.v3.min.js b/src/main/resources/web/js/rs/libs/d3js/d3.v3.min.js
new file mode 100644
index 0000000..7f3faa4
--- /dev/null
+++ b/src/main/resources/web/js/rs/libs/d3js/d3.v3.min.js
@@ -0,0 +1,4 @@
+d3=function(){function t(t){return t.target}function n(t){return t.source}function e(t,n){try{for(var e in n)Object.defineProperty(t.prototype,e,{value:n[e],enumerable:!1})}catch(r){t.prototype=n}}function r(t){for(var n=-1,e=t.length,r=[];e>++n;)r.push(t[n]);return r}function u(t){return Array.prototype.slice.call(t)}function i(){}function a(t){return t}function o(){return!0}function c(t){return"function"==typeof t?t:function(){return t}}function l(t,n,e){return function(){var r=e.apply(n,arguments);return r===n?t:r}}function f(t){return null!=t&&!isNaN(t)}function s(t){return t.length}function h(t){return t.trim().replace(/\s+/g," ")}function g(t){for(var n=1;t*n%1;)n*=10;return n}function p(t){return 1===t.length?function(n,e){t(null==n?e:null)}:t}function d(t){return t.responseText}function m(t){return JSON.parse(t.responseText)}function v(t){var n=Li.createRange();return n.selectNode(Li.body),n.createContextualFragment(t.responseText)}function y(t){return t.responseXML}function
  M(){}function b(t){function n(){for(var n,r=e,u=-1,i=r.length;i>++u;)(n=r[u].on)&&n.apply(this,arguments);return t}var e=[],r=new i;return n.on=function(n,u){var i,a=r.get(n);return 2>arguments.length?a&&a.on:(a&&(a.on=null,e=e.slice(0,i=e.indexOf(a)).concat(e.slice(i+1)),r.remove(n)),u&&e.push(r.set(n,{on:u})),t)},n}function x(t,n){return n-(t?Math.ceil(Math.log(t)/Math.LN10):1)}function _(t){return t+""}function w(t,n){var e=Math.pow(10,3*Math.abs(8-n));return{scale:n>8?function(t){return t/e}:function(t){return t*e},symbol:t}}function S(t){return function(n){return 0>=n?0:n>=1?1:t(n)}}function k(t){return function(n){return 1-t(1-n)}}function E(t){return function(n){return.5*(.5>n?t(2*n):2-t(2-2*n))}}function A(t){return t*t}function N(t){return t*t*t}function T(t){if(0>=t)return 0;if(t>=1)return 1;var n=t*t,e=n*t;return 4*(.5>t?e:3*(t-n)+e-.75)}function q(t){return function(n){return Math.pow(n,t)}}function C(t){return 1-Math.cos(t*Ti/2)}function z(t){return Math.pow(2,10*(t-1)
 )}function D(t){return 1-Math.sqrt(1-t*t)}function L(t,n){var e;return 2>arguments.length&&(n=.45),arguments.length?e=n/(2*Ti)*Math.asin(1/t):(t=1,e=n/4),function(r){return 1+t*Math.pow(2,10*-r)*Math.sin(2*(r-e)*Ti/n)}}function F(t){return t||(t=1.70158),function(n){return n*n*((t+1)*n-t)}}function H(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}function j(){Ci.event.stopPropagation(),Ci.event.preventDefault()}function P(){for(var t,n=Ci.event;t=n.sourceEvent;)n=t;return n}function R(t){for(var n=new M,e=0,r=arguments.length;r>++e;)n[arguments[e]]=b(n);return n.of=function(e,r){return function(u){try{var i=u.sourceEvent=Ci.event;u.target=t,Ci.event=u,n[u.type].apply(e,r)}finally{Ci.event=i}}},n}function O(t){var n=[t.a,t.b],e=[t.c,t.d],r=U(n),u=Y(n,e),i=U(I(e,n,-u))||0;n[0]*e[1]<e[0]*n[1]&&(n[0]*=-1,n[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(n[1],n[0]):Math.atan2(-e[0],e[1]))*Di,this.t
 ranslate=[t.e,t.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Di:0}function Y(t,n){return t[0]*n[0]+t[1]*n[1]}function U(t){var n=Math.sqrt(Y(t,t));return n&&(t[0]/=n,t[1]/=n),n}function I(t,n,e){return t[0]+=e*n[0],t[1]+=e*n[1],t}function V(t){return"transform"==t?Ci.interpolateTransform:Ci.interpolate}function Z(t,n){return n=n-(t=+t)?1/(n-t):0,function(e){return(e-t)*n}}function X(t,n){return n=n-(t=+t)?1/(n-t):0,function(e){return Math.max(0,Math.min(1,(e-t)*n))}}function B(){}function $(t,n,e){return new J(t,n,e)}function J(t,n,e){this.r=t,this.g=n,this.b=e}function G(t){return 16>t?"0"+Math.max(0,t).toString(16):Math.min(255,t).toString(16)}function K(t,n,e){var r,u,i,a=0,o=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(t))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return n(nn(u[0]),nn(u[1]),nn(u[2]))}return(i=oa.get(t))?n(i.r,i.g,i.b):(null!=t&&"#"===t.charAt(0)&&(4===t.length?(a=t.charAt(1),a+=a,o=t.charAt(2
 ),o+=o,c=t.charAt(3),c+=c):7===t.length&&(a=t.substring(1,3),o=t.substring(3,5),c=t.substring(5,7)),a=parseInt(a,16),o=parseInt(o,16),c=parseInt(c,16)),n(a,o,c))}function W(t,n,e){var r,u,i=Math.min(t/=255,n/=255,e/=255),a=Math.max(t,n,e),o=a-i,c=(a+i)/2;return o?(u=.5>c?o/(a+i):o/(2-a-i),r=t==a?(n-e)/o+(e>n?6:0):n==a?(e-t)/o+2:(t-n)/o+4,r*=60):u=r=0,en(r,u,c)}function Q(t,n,e){t=tn(t),n=tn(n),e=tn(e);var r=pn((.4124564*t+.3575761*n+.1804375*e)/sa),u=pn((.2126729*t+.7151522*n+.072175*e)/ha),i=pn((.0193339*t+.119192*n+.9503041*e)/ga);return ln(116*u-16,500*(r-u),200*(u-i))}function tn(t){return.04045>=(t/=255)?t/12.92:Math.pow((t+.055)/1.055,2.4)}function nn(t){var n=parseFloat(t);return"%"===t.charAt(t.length-1)?Math.round(2.55*n):n}function en(t,n,e){return new rn(t,n,e)}function rn(t,n,e){this.h=t,this.s=n,this.l=e}function un(t,n,e){function r(t){return t>360?t-=360:0>t&&(t+=360),60>t?i+(a-i)*t/60:180>t?a:240>t?i+(a-i)*(240-t)/60:i}function u(t){return Math.round(255*r(t))}var i,
 a;return t%=360,0>t&&(t+=360),n=0>n?0:n>1?1:n,e=0>e?0:e>1?1:e,a=.5>=e?e*(1+n):e+n-e*n,i=2*e-a,$(u(t+120),u(t),u(t-120))}function an(t,n,e){return new on(t,n,e)}function on(t,n,e){this.h=t,this.c=n,this.l=e}function cn(t,n,e){return ln(e,Math.cos(t*=zi)*n,Math.sin(t)*n)}function ln(t,n,e){return new fn(t,n,e)}function fn(t,n,e){this.l=t,this.a=n,this.b=e}function sn(t,n,e){var r=(t+16)/116,u=r+n/500,i=r-e/200;return u=gn(u)*sa,r=gn(r)*ha,i=gn(i)*ga,$(dn(3.2404542*u-1.5371385*r-.4985314*i),dn(-.969266*u+1.8760108*r+.041556*i),dn(.0556434*u-.2040259*r+1.0572252*i))}function hn(t,n,e){return an(180*(Math.atan2(e,n)/Ti),Math.sqrt(n*n+e*e),t)}function gn(t){return t>.206893034?t*t*t:(t-4/29)/7.787037}function pn(t){return t>.008856?Math.pow(t,1/3):7.787037*t+4/29}function dn(t){return Math.round(255*(.00304>=t?12.92*t:1.055*Math.pow(t,1/2.4)-.055))}function mn(t){return Vi(t,ba),t}function vn(t){return function(){return da(t,this)}}function yn(t){return function(){return ma(t,this)}}funct
 ion Mn(t,n){function e(){this.removeAttribute(t)}function r(){this.removeAttributeNS(t.space,t.local)}function u(){this.setAttribute(t,n)}function i(){this.setAttributeNS(t.space,t.local,n)}function a(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}function o(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}return t=Ci.ns.qualify(t),null==n?t.local?r:e:"function"==typeof n?t.local?o:a:t.local?i:u}function bn(t){return RegExp("(?:^|\\s+)"+Ci.requote(t)+"(?:\\s+|$)","g")}function xn(t,n){function e(){for(var e=-1;u>++e;)t[e](this,n)}function r(){for(var e=-1,r=n.apply(this,arguments);u>++e;)t[e](this,r)}t=t.trim().split(/\s+/).map(_n);var u=t.length;return"function"==typeof n?r:e}function _n(t){var n=bn(t);return function(e,r){if(u=e.classList)return r?u.add(t):u.remove(t);var u=e.className,i=null!=u.baseVal,a=i?u.baseVal:u;r?(n.lastIndex=0,n.test(a)||(a=h(a+" "+t),i?u.baseVal=
 a:e.className=a)):a&&(a=h(a.replace(n," ")),i?u.baseVal=a:e.className=a)}}function wn(t,n,e){function r(){this.style.removeProperty(t)}function u(){this.style.setProperty(t,n,e)}function i(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}return null==n?r:"function"==typeof n?i:u}function Sn(t,n){function e(){delete this[t]}function r(){this[t]=n}function u(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}return null==n?e:"function"==typeof n?u:r}function kn(t){return{__data__:t}}function En(t){return function(){return Ma(this,t)}}function An(t){return arguments.length||(t=Ci.ascending),function(n,e){return!n-!e||t(n.__data__,e.__data__)}}function Nn(t,n,e){function r(){var n=this[i];n&&(this.removeEventListener(t,n,n.$),delete this[i])}function u(){function u(t){var e=Ci.event;Ci.event=t,o[0]=a.__data__;try{n.apply(a,o)}finally{Ci.event=e}}var a=this,o=Ui(arguments);r.call(this),this.addEventListener(t,this[i]=u,u.$=e
 ),u._=n}var i="__on"+t,a=t.indexOf(".");return a>0&&(t=t.substring(0,a)),n?u:r}function Tn(t,n){for(var e=0,r=t.length;r>e;e++)for(var u,i=t[e],a=0,o=i.length;o>a;a++)(u=i[a])&&n(u,a,e);return t}function qn(t){return Vi(t,_a),t}function Cn(t,n){return Vi(t,Sa),t.id=n,t}function zn(t,n,e,r){var u=t.__transition__||(t.__transition__={active:0,count:0}),a=u[e];if(!a){var o=r.time;return a=u[e]={tween:new i,event:Ci.dispatch("start","end"),time:o,ease:r.ease,delay:r.delay,duration:r.duration},++u.count,Ci.timer(function(r){function i(r){return u.active>e?l():(u.active=e,h.start.call(t,f,n),a.tween.forEach(function(e,r){(r=r.call(t,f,n))&&d.push(r)}),c(r)||Ci.timer(c,0,o),1)}function c(r){if(u.active!==e)return l();for(var i=(r-g)/p,a=s(i),o=d.length;o>0;)d[--o].call(t,a);return i>=1?(l(),h.end.call(t,f,n),1):void 0}function l(){return--u.count?delete u[e]:delete t.__transition__,1}var f=t.__data__,s=a.ease,h=a.event,g=a.delay,p=a.duration,d=[];return r>=g?i(r):Ci.timer(i,g,o),1},0,o),a}
 }function Dn(t){return null==t&&(t=""),function(){this.textContent=t}}function Ln(t,n,e,r){var u=t.id;return Tn(t,"function"==typeof e?function(t,i,a){t.__transition__[u].tween.set(n,r(e.call(t,t.__data__,i,a)))}:(e=r(e),function(t){t.__transition__[u].tween.set(n,e)}))}function Fn(){for(var t,n=Date.now(),e=Ca;e;)t=n-e.then,t>=e.delay&&(e.flush=e.callback(t)),e=e.next;var r=Hn()-n;r>24?(isFinite(r)&&(clearTimeout(Na),Na=setTimeout(Fn,r)),Aa=0):(Aa=1,za(Fn))}function Hn(){for(var t=null,n=Ca,e=1/0;n;)n.flush?(delete qa[n.callback.id],n=t?t.next=n.next:Ca=n.next):(e=Math.min(e,n.then+n.delay),n=(t=n).next);return e}function jn(t,n){var e=t.ownerSVGElement||t;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>Da&&(Fi.scrollX||Fi.scrollY)){e=Ci.select(Li.body).append("svg").style("position","absolute").style("top",0).style("left",0);var u=e[0][0].getScreenCTM();Da=!(u.f||u.e),e.remove()}return Da?(r.x=n.pageX,r.y=n.pageY):(r.x=n.clientX,r.y=n.clientY),r=r.matrixTransform(t.getScreenCTM
 ().inverse()),[r.x,r.y]}var i=t.getBoundingClientRect();return[n.clientX-i.left-t.clientLeft,n.clientY-i.top-t.clientTop]}function Pn(){}function Rn(t){var n=t[0],e=t[t.length-1];return e>n?[n,e]:[e,n]}function On(t){return t.rangeExtent?t.rangeExtent():Rn(t.range())}function Yn(t,n){var e,r=0,u=t.length-1,i=t[r],a=t[u];return i>a&&(e=r,r=u,u=e,e=i,i=a,a=e),(n=n(a-i))&&(t[r]=n.floor(i),t[u]=n.ceil(a)),t}function Un(){return Math}function In(t,n,e,r){function u(){var u=Math.min(t.length,n.length)>2?Gn:Jn,c=r?X:Z;return a=u(t,n,c,e),o=u(n,t,c,Ci.interpolate),i}function i(t){return a(t)}var a,o;return i.invert=function(t){return o(t)},i.domain=function(n){return arguments.length?(t=n.map(Number),u()):t},i.range=function(t){return arguments.length?(n=t,u()):n},i.rangeRound=function(t){return i.range(t).interpolate(Ci.interpolateRound)},i.clamp=function(t){return arguments.length?(r=t,u()):r},i.interpolate=function(t){return arguments.length?(e=t,u()):e},i.ticks=function(n){return Bn(t,n
 )},i.tickFormat=function(n){return $n(t,n)},i.nice=function(){return Yn(t,Zn),u()},i.copy=function(){return In(t,n,e,r)},u()}function Vn(t,n){return Ci.rebind(t,n,"range","rangeRound","interpolate","clamp")}function Zn(t){return t=Math.pow(10,Math.round(Math.log(t)/Math.LN10)-1),t&&{floor:function(n){return Math.floor(n/t)*t},ceil:function(n){return Math.ceil(n/t)*t}}}function Xn(t,n){var e=Rn(t),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/n)/Math.LN10)),i=n/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Bn(t,n){return Ci.range.apply(Ci,Xn(t,n))}function $n(t,n){return Ci.format(",."+Math.max(0,-Math.floor(Math.log(Xn(t,n)[2])/Math.LN10+.01))+"f")}function Jn(t,n,e,r){var u=e(t[0],t[1]),i=r(n[0],n[1]);return function(t){return i(u(t))}}function Gn(t,n,e,r){var u=[],i=[],a=0,o=Math.min(t.length,n.length)-1;for(t[o]<t[0]&&(t=t.slice().reverse(),n=n.slice().reverse());o>=++a;)u.push(e(t[a-1],t[a])),i.push(
 r(n[a-1],n[a]));return function(n){var e=Ci.bisect(t,n,1,o)-1;return i[e](u[e](n))}}function Kn(t,n){function e(e){return t(n(e))}var r=n.pow;return e.invert=function(n){return r(t.invert(n))},e.domain=function(u){return arguments.length?(n=0>u[0]?Qn:Wn,r=n.pow,t.domain(u.map(n)),e):t.domain().map(r)},e.nice=function(){return t.domain(Yn(t.domain(),Un)),e},e.ticks=function(){var e=Rn(t.domain()),u=[];if(e.every(isFinite)){var i=Math.floor(e[0]),a=Math.ceil(e[1]),o=r(e[0]),c=r(e[1]);if(n===Qn)for(u.push(r(i));a>i++;)for(var l=9;l>0;l--)u.push(r(i)*l);else{for(;a>i;i++)for(var l=1;10>l;l++)u.push(r(i)*l);u.push(r(i))}for(i=0;o>u[i];i++);for(a=u.length;u[a-1]>c;a--);u=u.slice(i,a)}return u},e.tickFormat=function(t,u){if(2>arguments.length&&(u=La),!arguments.length)return u;var i,a=Math.max(.1,t/e.ticks().length),o=n===Qn?(i=-1e-12,Math.floor):(i=1e-12,Math.ceil);return function(t){return a>=t/r(o(n(t)+i))?u(t):""}},e.copy=function(){return Kn(t.copy(),n)},Vn(e,t)}function Wn(t){return 
 Math.log(0>t?0:t)/Math.LN10}function Qn(t){return-Math.log(t>0?0:-t)/Math.LN10}function te(t,n){function e(n){return t(r(n))}var r=ne(n),u=ne(1/n);return e.invert=function(n){return u(t.invert(n))},e.domain=function(n){return arguments.length?(t.domain(n.map(r)),e):t.domain().map(u)},e.ticks=function(t){return Bn(e.domain(),t)},e.tickFormat=function(t){return $n(e.domain(),t)},e.nice=function(){return e.domain(Yn(e.domain(),Zn))},e.exponent=function(t){if(!arguments.length)return n;var i=e.domain();return r=ne(n=t),u=ne(1/n),e.domain(i)},e.copy=function(){return te(t.copy(),n)},Vn(e,t)}function ne(t){return function(n){return 0>n?-Math.pow(-n,t):Math.pow(n,t)}}function ee(t,n){function e(n){return a[((u.get(n)||u.set(n,t.push(n)))-1)%a.length]}function r(n,e){return Ci.range(t.length).map(function(t){return n+e*t})}var u,a,o;return e.domain=function(r){if(!arguments.length)return t;t=[],u=new i;for(var a,o=-1,c=r.length;c>++o;)u.has(a=r[o])||u.set(a,t.push(a));return e[n.t].apply(e,
 n.a)},e.range=function(t){return arguments.length?(a=t,o=0,n={t:"range",a:arguments},e):a},e.rangePoints=function(u,i){2>arguments.length&&(i=0);var c=u[0],l=u[1],f=(l-c)/(Math.max(1,t.length-1)+i);return a=r(2>t.length?(c+l)/2:c+f*i/2,f),o=0,n={t:"rangePoints",a:arguments},e},e.rangeBands=function(u,i,c){2>arguments.length&&(i=0),3>arguments.length&&(c=i);var l=u[1]<u[0],f=u[l-0],s=u[1-l],h=(s-f)/(t.length-i+2*c);return a=r(f+h*c,h),l&&a.reverse(),o=h*(1-i),n={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,i,c){2>arguments.length&&(i=0),3>arguments.length&&(c=i);var l=u[1]<u[0],f=u[l-0],s=u[1-l],h=Math.floor((s-f)/(t.length-i+2*c)),g=s-f-(t.length-i)*h;return a=r(f+Math.round(g/2),h),l&&a.reverse(),o=Math.round(h*(1-i)),n={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return o},e.rangeExtent=function(){return Rn(n.a[0])},e.copy=function(){return ee(t,n)},e.domain(t)}function re(t,n){function e(){var e=0,i=n.length;for(u=[];i>++e;)u[e-1]=Ci.quantile(t,e/i);
 return r}function r(t){return isNaN(t=+t)?0/0:n[Ci.bisect(u,t)]}var u;return r.domain=function(n){return arguments.length?(t=n.filter(function(t){return!isNaN(t)}).sort(Ci.ascending),e()):t},r.range=function(t){return arguments.length?(n=t,e()):n},r.quantiles=function(){return u},r.copy=function(){return re(t,n)},e()}function ue(t,n,e){function r(n){return e[Math.max(0,Math.min(a,Math.floor(i*(n-t))))]}function u(){return i=e.length/(n-t),a=e.length-1,r}var i,a;return r.domain=function(e){return arguments.length?(t=+e[0],n=+e[e.length-1],u()):[t,n]},r.range=function(t){return arguments.length?(e=t,u()):e},r.copy=function(){return ue(t,n,e)},u()}function ie(t,n){function e(e){return n[Ci.bisect(t,e)]}return e.domain=function(n){return arguments.length?(t=n,e):t},e.range=function(t){return arguments.length?(n=t,e):n},e.copy=function(){return ie(t,n)},e}function ae(t){function n(t){return+t}return n.invert=n,n.domain=n.range=function(e){return arguments.length?(t=e.map(n),n):t},n.ticks
 =function(n){return Bn(t,n)},n.tickFormat=function(n){return $n(t,n)},n.copy=function(){return ae(t)},n}function oe(t){return t.innerRadius}function ce(t){return t.outerRadius}function le(t){return t.startAngle}function fe(t){return t.endAngle}function se(t){function n(n){function a(){f.push("M",i(t(s),l))}for(var o,f=[],s=[],h=-1,g=n.length,p=c(e),d=c(r);g>++h;)u.call(this,o=n[h],h)?s.push([+p.call(this,o,h),+d.call(this,o,h)]):s.length&&(a(),s=[]);return s.length&&a(),f.length?f.join(""):null}var e=he,r=ge,u=o,i=pe,a=i.key,l=.7;return n.x=function(t){return arguments.length?(e=t,n):e},n.y=function(t){return arguments.length?(r=t,n):r},n.defined=function(t){return arguments.length?(u=t,n):u},n.interpolate=function(t){return arguments.length?(a="function"==typeof t?i=t:(i=Ya.get(t)||pe).key,n):a},n.tension=function(t){return arguments.length?(l=t,n):l},n}function he(t){return t[0]}function ge(t){return t[1]}function pe(t){return t.join("L")}function de(t){return pe(t)+"Z"}function m
 e(t){for(var n=0,e=t.length,r=t[0],u=[r[0],",",r[1]];e>++n;)u.push("V",(r=t[n])[1],"H",r[0]);return u.join("")}function ve(t){for(var n=0,e=t.length,r=t[0],u=[r[0],",",r[1]];e>++n;)u.push("H",(r=t[n])[0],"V",r[1]);return u.join("")}function ye(t,n){return 4>t.length?pe(t):t[1]+xe(t.slice(1,t.length-1),_e(t,n))}function Me(t,n){return 3>t.length?pe(t):t[0]+xe((t.push(t[0]),t),_e([t[t.length-2]].concat(t,[t[1]]),n))}function be(t,n){return 3>t.length?pe(t):t[0]+xe(t,_e(t,n))}function xe(t,n){if(1>n.length||t.length!=n.length&&t.length!=n.length+2)return pe(t);var e=t.length!=n.length,r="",u=t[0],i=t[1],a=n[0],o=a,c=1;if(e&&(r+="Q"+(i[0]-2*a[0]/3)+","+(i[1]-2*a[1]/3)+","+i[0]+","+i[1],u=t[1],c=2),n.length>1){o=n[1],i=t[c],c++,r+="C"+(u[0]+a[0])+","+(u[1]+a[1])+","+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1];for(var l=2;n.length>l;l++,c++)i=t[c],o=n[l],r+="S"+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1]}if(e){var f=t[c];r+="Q"+(i[0]+2*o[0]/3)+","+(i[1]+2*o[1]/3)+","+f[0]+","+f[1]}ret
 urn r}function _e(t,n){for(var e,r=[],u=(1-n)/2,i=t[0],a=t[1],o=1,c=t.length;c>++o;)e=i,i=a,a=t[o],r.push([u*(a[0]-e[0]),u*(a[1]-e[1])]);return r}function we(t){if(3>t.length)return pe(t);var n=1,e=t.length,r=t[0],u=r[0],i=r[1],a=[u,u,u,(r=t[1])[0]],o=[i,i,i,r[1]],c=[u,",",i];for(Ne(c,a,o);e>++n;)r=t[n],a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),Ne(c,a,o);for(n=-1;2>++n;)a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),Ne(c,a,o);return c.join("")}function Se(t){if(4>t.length)return pe(t);for(var n,e=[],r=-1,u=t.length,i=[0],a=[0];3>++r;)n=t[r],i.push(n[0]),a.push(n[1]);for(e.push(Ae(Va,i)+","+Ae(Va,a)),--r;u>++r;)n=t[r],i.shift(),i.push(n[0]),a.shift(),a.push(n[1]),Ne(e,i,a);return e.join("")}function ke(t){for(var n,e,r=-1,u=t.length,i=u+4,a=[],o=[];4>++r;)e=t[r%u],a.push(e[0]),o.push(e[1]);for(n=[Ae(Va,a),",",Ae(Va,o)],--r;i>++r;)e=t[r%u],a.shift(),a.push(e[0]),o.shift(),o.push(e[1]),Ne(n,a,o);return n.join("")}function Ee(t,n){var e=t.length-1;if(e)for(var r,u,i=t[0][0],a=t[0][1]
 ,o=t[e][0]-i,c=t[e][1]-a,l=-1;e>=++l;)r=t[l],u=l/e,r[0]=n*r[0]+(1-n)*(i+u*o),r[1]=n*r[1]+(1-n)*(a+u*c);return we(t)}function Ae(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]}function Ne(t,n,e){t.push("C",Ae(Ua,n),",",Ae(Ua,e),",",Ae(Ia,n),",",Ae(Ia,e),",",Ae(Va,n),",",Ae(Va,e))}function Te(t,n){return(n[1]-t[1])/(n[0]-t[0])}function qe(t){for(var n=0,e=t.length-1,r=[],u=t[0],i=t[1],a=r[0]=Te(u,i);e>++n;)r[n]=(a+(a=Te(u=i,i=t[n+1])))/2;return r[n]=a,r}function Ce(t){for(var n,e,r,u,i=[],a=qe(t),o=-1,c=t.length-1;c>++o;)n=Te(t[o],t[o+1]),1e-6>Math.abs(n)?a[o]=a[o+1]=0:(e=a[o]/n,r=a[o+1]/n,u=e*e+r*r,u>9&&(u=3*n/Math.sqrt(u),a[o]=u*e,a[o+1]=u*r));for(o=-1;c>=++o;)u=(t[Math.min(c,o+1)][0]-t[Math.max(0,o-1)][0])/(6*(1+a[o]*a[o])),i.push([u||0,a[o]*u||0]);return i}function ze(t){return 3>t.length?pe(t):t[0]+xe(t,Ce(t))}function De(t){for(var n,e,r,u=-1,i=t.length;i>++u;)n=t[u],e=n[0],r=n[1]+Ra,n[0]=e*Math.cos(r),n[1]=e*Math.sin(r);return t}function Le(t){function n(n){function o(){m.
 push("M",l(t(y),g),h,s(t(v.reverse()),g),"Z")}for(var f,p,d,m=[],v=[],y=[],M=-1,b=n.length,x=c(e),_=c(u),w=e===r?function(){return p}:c(r),S=u===i?function(){return d}:c(i);b>++M;)a.call(this,f=n[M],M)?(v.push([p=+x.call(this,f,M),d=+_.call(this,f,M)]),y.push([+w.call(this,f,M),+S.call(this,f,M)])):v.length&&(o(),v=[],y=[]);return v.length&&o(),m.length?m.join(""):null}var e=he,r=he,u=0,i=ge,a=o,l=pe,f=l.key,s=l,h="L",g=.7;return n.x=function(t){return arguments.length?(e=r=t,n):r},n.x0=function(t){return arguments.length?(e=t,n):e},n.x1=function(t){return arguments.length?(r=t,n):r},n.y=function(t){return arguments.length?(u=i=t,n):i},n.y0=function(t){return arguments.length?(u=t,n):u},n.y1=function(t){return arguments.length?(i=t,n):i},n.defined=function(t){return arguments.length?(a=t,n):a},n.interpolate=function(t){return arguments.length?(f="function"==typeof t?l=t:(l=Ya.get(t)||pe).key,s=l.reverse||l,h=l.closed?"M":"L",n):f},n.tension=function(t){return arguments.length?(g=t,n
 ):g},n}function Fe(t){return t.radius}function He(t){return[t.x,t.y]}function je(t){return function(){var n=t.apply(this,arguments),e=n[0],r=n[1]+Ra;return[e*Math.cos(r),e*Math.sin(r)]}}function Pe(){return 64}function Re(){return"circle"}function Oe(t){var n=Math.sqrt(t/Ti);return"M0,"+n+"A"+n+","+n+" 0 1,1 0,"+-n+"A"+n+","+n+" 0 1,1 0,"+n+"Z"}function Ye(t,n){t.attr("transform",function(t){return"translate("+n(t)+",0)"})}function Ue(t,n){t.attr("transform",function(t){return"translate(0,"+n(t)+")"})}function Ie(t,n,e){if(r=[],e&&n.length>1){for(var r,u,i,a=Rn(t.domain()),o=-1,c=n.length,l=(n[1]-n[0])/++e;c>++o;)for(u=e;--u>0;)(i=+n[o]-u*l)>=a[0]&&r.push(i);for(--o,u=0;e>++u&&(i=+n[o]+u*l)<a[1];)r.push(i)}return r}function Ve(t){for(var n=t.source,e=t.target,r=Xe(n,e),u=[n];n!==r;)n=n.parent,u.push(n);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Ze(t){for(var n=[],e=t.parent;null!=e;)n.push(t),t=e,e=e.parent;return n.push(t),n}function Xe(t,n){if(t===n)ret
 urn t;for(var e=Ze(t),r=Ze(n),u=e.pop(),i=r.pop(),a=null;u===i;)a=u,u=e.pop(),i=r.pop();return a}function Be(t){t.fixed|=2}function $e(t){t.fixed&=-7}function Je(t){t.fixed|=4,t.px=t.x,t.py=t.y}function Ge(t){t.fixed&=-5}function Ke(t,n,e){var r=0,u=0;if(t.charge=0,!t.leaf)for(var i,a=t.nodes,o=a.length,c=-1;o>++c;)i=a[c],null!=i&&(Ke(i,n,e),t.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(t.point){t.leaf||(t.point.x+=Math.random()-.5,t.point.y+=Math.random()-.5);var l=n*e[t.point.index];t.charge+=t.pointCharge=l,r+=l*t.point.x,u+=l*t.point.y}t.cx=r/t.charge,t.cy=u/t.charge}function We(t){return t.x}function Qe(t){return t.y}function tr(t,n,e){t.y0=n,t.y=e}function nr(t){return Ci.range(t.length)}function er(t){for(var n=-1,e=t[0].length,r=[];e>++n;)r[n]=0;return r}function rr(t){for(var n,e=1,r=0,u=t[0][1],i=t.length;i>e;++e)(n=t[e][1])>u&&(r=e,u=n);return r}function ur(t){return t.reduce(ir,0)}function ir(t,n){return t+n[1]}function ar(t,n){return or(t,Math.ceil(Math.log(n
 .length)/Math.LN2+1))}function or(t,n){for(var e=-1,r=+t[0],u=(t[1]-r)/n,i=[];n>=++e;)i[e]=u*e+r;return i}function cr(t){return[Ci.min(t),Ci.max(t)]}function lr(t,n){return Ci.rebind(t,n,"sort","children","value"),t.nodes=t,t.links=gr,t}function fr(t){return t.children}function sr(t){return t.value}function hr(t,n){return n.value-t.value}function gr(t){return Ci.merge(t.map(function(t){return(t.children||[]).map(function(n){return{source:t,target:n}})}))}function pr(t,n){return t.value-n.value}function dr(t,n){var e=t._pack_next;t._pack_next=n,n._pack_prev=t,n._pack_next=e,e._pack_prev=n}function mr(t,n){t._pack_next=n,n._pack_prev=t}function vr(t,n){var e=n.x-t.x,r=n.y-t.y,u=t.r+n.r;return u*u-e*e-r*r>.001}function yr(t){function n(t){f=Math.min(t.x-t.r,f),s=Math.max(t.x+t.r,s),h=Math.min(t.y-t.r,h),g=Math.max(t.y+t.r,g)}if((e=t.children)&&(l=e.length)){var e,r,u,i,a,o,c,l,f=1/0,s=-1/0,h=1/0,g=-1/0;if(e.forEach(Mr),r=e[0],r.x=-r.r,r.y=0,n(r),l>1&&(u=e[1],u.x=u.r,u.y=0,n(u),l>2))for
 (i=e[2],_r(r,u,i),n(i),dr(r,i),r._pack_prev=i,dr(i,u),u=r._pack_next,a=3;l>a;a++){_r(r,u,i=e[a]);var p=0,d=1,m=1;for(o=u._pack_next;o!==u;o=o._pack_next,d++)if(vr(o,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==o._pack_prev&&!vr(c,i);c=c._pack_prev,m++);p?(m>d||d==m&&u.r<r.r?mr(r,u=o):mr(r=c,u),a--):(dr(r,i),u=i,n(i))}var v=(f+s)/2,y=(h+g)/2,M=0;for(a=0;l>a;a++)i=e[a],i.x-=v,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));t.r=M,e.forEach(br)}}function Mr(t){t._pack_next=t._pack_prev=t}function br(t){delete t._pack_next,delete t._pack_prev}function xr(t,n,e,r){var u=t.children;if(t.x=n+=r*t.x,t.y=e+=r*t.y,t.r*=r,u)for(var i=-1,a=u.length;a>++i;)xr(u[i],n,e,r)}function _r(t,n,e){var r=t.r+e.r,u=n.x-t.x,i=n.y-t.y;if(r&&(u||i)){var a=n.r+e.r,o=u*u+i*i;a*=a,r*=r;var c=.5+(r-a)/(2*o),l=Math.sqrt(Math.max(0,2*a*(r+o)-(r-=o)*r-a*a))/(2*o);e.x=t.x+c*u+l*i,e.y=t.y+c*i-l*u}else e.x=t.x+r,e.y=t.y}function wr(t){return 1+Ci.max(t,function(t){return t.y})}function Sr(t){return t.reduce(functio
 n(t,n){return t+n.x},0)/t.length}function kr(t){var n=t.children;return n&&n.length?kr(n[0]):t}function Er(t){var n,e=t.children;return e&&(n=e.length)?Er(e[n-1]):t}function Ar(t,n){return t.parent==n.parent?1:2}function Nr(t){var n=t.children;return n&&n.length?n[0]:t._tree.thread}function Tr(t){var n,e=t.children;return e&&(n=e.length)?e[n-1]:t._tree.thread}function qr(t,n){var e=t.children;if(e&&(u=e.length))for(var r,u,i=-1;u>++i;)n(r=qr(e[i],n),t)>0&&(t=r);return t}function Cr(t,n){return t.x-n.x}function zr(t,n){return n.x-t.x}function Dr(t,n){return t.depth-n.depth}function Lr(t,n){function e(t,r){var u=t.children;if(u&&(a=u.length))for(var i,a,o=null,c=-1;a>++c;)i=u[c],e(i,o),o=i;n(t,r)}e(t,null)}function Fr(t){for(var n,e=0,r=0,u=t.children,i=u.length;--i>=0;)n=u[i]._tree,n.prelim+=e,n.mod+=e,e+=n.shift+(r+=n.change)}function Hr(t,n,e){t=t._tree,n=n._tree;var r=e/(n.number-t.number);t.change+=r,n.change-=r,n.shift+=e,n.prelim+=e,n.mod+=e}function jr(t,n,e){return t._tree.an
 cestor.parent==n.parent?t._tree.ancestor:e}function Pr(t){return{x:t.x,y:t.y,dx:t.dx,dy:t.dy}}function Rr(t,n){var e=t.x+n[3],r=t.y+n[0],u=t.dx-n[1]-n[3],i=t.dy-n[0]-n[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Or(t,n){function e(t,e){return Ci.xhr(t,n,e).response(r)}function r(t){return e.parse(t.responseText)}function u(n){return n.map(i).join(t)}function i(t){return a.test(t)?'"'+t.replace(/\"/g,'""')+'"':t}var a=RegExp('["'+t+"\n]"),o=t.charCodeAt(0);return e.parse=function(t){var n;return e.parseRows(t,function(t){return n?n(t):(n=Function("d","return {"+t.map(function(t,n){return JSON.stringify(t)+": d["+n+"]"}).join(",")+"}"),void 0)})},e.parseRows=function(t,n){function e(){if(f>=l)return a;if(u)return u=!1,i;var n=f;if(34===t.charCodeAt(n)){for(var e=n;l>e++;)if(34===t.charCodeAt(e)){if(34!==t.charCodeAt(e+1))break;++e}f=e+2;var r=t.charCodeAt(e+1);return 13===r?(u=!0,10===t.charCodeAt(e+2)&&++f):10===r&&(u=!0),t.substring(n+1,e).replace(/""/
 g,'"')}for(;l>f;){var r=t.charCodeAt(f++),c=1;if(10===r)u=!0;else if(13===r)u=!0,10===t.charCodeAt(f)&&(++f,++c);else if(r!==o)continue;return t.substring(n,f-c)}return t.substring(n)}for(var r,u,i={},a={},c=[],l=t.length,f=0,s=0;(r=e())!==a;){for(var h=[];r!==i&&r!==a;)h.push(r),r=e();(!n||(h=n(h,s++)))&&c.push(h)}return c},e.format=function(t){return t.map(u).join("\n")},e}function Yr(t,n){oo.hasOwnProperty(t.type)&&oo[t.type](t,n)}function Ur(t,n,e){var r,u=-1,i=t.length-e;for(n.lineStart();i>++u;)r=t[u],n.point(r[0],r[1]);n.lineEnd()}function Ir(t,n){var e=-1,r=t.length;for(n.polygonStart();r>++e;)Ur(t[e],n,1);n.polygonEnd()}function Vr(t){return[Math.atan2(t[1],t[0]),Math.asin(Math.max(-1,Math.min(1,t[2])))]}function Zr(t,n){return qi>Math.abs(t[0]-n[0])&&qi>Math.abs(t[1]-n[1])}function Xr(t){var n=t[0],e=t[1],r=Math.cos(e);return[r*Math.cos(n),r*Math.sin(n),Math.sin(e)]}function Br(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function $r(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-
 t[0]*n[2],t[0]*n[1]-t[1]*n[0]]}function Jr(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}function Gr(t,n){return[t[0]*n,t[1]*n,t[2]*n]}function Kr(t){var n=Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t[2]/=n}function Wr(t){function n(n){function r(e,r){e=t(e,r),n.point(e[0],e[1])}function i(){f=0/0,d.point=a,n.lineStart()}function a(r,i){var a=Xr([r,i]),o=t(r,i);e(f,s,l,h,g,p,f=o[0],s=o[1],l=r,h=a[0],g=a[1],p=a[2],u,n),n.point(f,s)}function o(){d.point=r,n.lineEnd()}function c(){var t,r,c,m,v,y,M;i(),d.point=function(n,e){a(t=n,r=e),c=f,m=s,v=h,y=g,M=p,d.point=a},d.lineEnd=function(){e(f,s,l,h,g,p,c,m,t,v,y,M,u,n),d.lineEnd=o,o()}}var l,f,s,h,g,p,d={point:r,lineStart:i,lineEnd:o,polygonStart:function(){n.polygonStart(),d.lineStart=c},polygonEnd:function(){n.polygonEnd(),d.lineStart=i}};return d}function e(n,u,i,a,o,c,l,f,s,h,g,p,d,m){var v=l-n,y=f-u,M=v*v+y*y;if(M>4*r&&d--){var b=a+h,x=o+g,_=c+p,w=Math.sqrt(b*b+x*x+_*_),S=Math.asin(_/=w),k=qi>Math.abs(Math.abs(_)-1)?(i+s)/2:Mat
 h.atan2(x,b),E=t(k,S),A=E[0],N=E[1],T=A-n,q=N-u,C=y*T-v*q;(C*C/M>r||Math.abs((v*T+y*q)/M-.5)>.3)&&(e(n,u,i,a,o,c,A,N,k,b/=w,x/=w,_,d,m),m.point(A,N),e(A,N,k,b,x,_,l,f,s,h,g,p,d,m))}}var r=.5,u=16;return n.precision=function(t){return arguments.length?(u=(r=t*t)>0&&16,n):Math.sqrt(r)},n}function Qr(t,n){function e(t,n){var e=Math.sqrt(i-2*u*Math.sin(n))/u;return[e*Math.sin(t*=u),a-e*Math.cos(t)]}var r=Math.sin(t),u=(r+Math.sin(n))/2,i=1+r*(2*u-r),a=Math.sqrt(i)/u;return e.invert=function(t,n){var e=a-n;return[Math.atan2(t,e)/u,Math.asin((i-(t*t+e*e)*u*u)/(2*u))]},e}function tu(t){function n(t,n){r>t&&(r=t),t>i&&(i=t),u>n&&(u=n),n>a&&(a=n)}function e(){o.point=o.lineEnd=Pn}var r,u,i,a,o={point:n,lineStart:Pn,lineEnd:Pn,polygonStart:function(){o.lineEnd=e},polygonEnd:function(){o.point=n}};return function(n){return a=i=-(r=u=1/0),Ci.geo.stream(n,t(o)),[[r,u],[i,a]]}}function nu(t,n){if(!fo){++so,t*=zi;var e=Math.cos(n*=zi);ho+=(e*Math.cos(t)-ho)/so,go+=(e*Math.sin(t)-go)/so,po+=(Math.s
 in(n)-po)/so}}function eu(){var t,n;fo=1,ru(),fo=2;var e=mo.point;mo.point=function(r,u){e(t=r,n=u)},mo.lineEnd=function(){mo.point(t,n),uu(),mo.lineEnd=uu}}function ru(){function t(t,u){t*=zi;var i=Math.cos(u*=zi),a=i*Math.cos(t),o=i*Math.sin(t),c=Math.sin(u),l=Math.atan2(Math.sqrt((l=e*c-r*o)*l+(l=r*a-n*c)*l+(l=n*o-e*a)*l),n*a+e*o+r*c);so+=l,ho+=l*(n+(n=a)),go+=l*(e+(e=o)),po+=l*(r+(r=c))}var n,e,r;fo>1||(1>fo&&(fo=1,so=ho=go=po=0),mo.point=function(u,i){u*=zi;var a=Math.cos(i*=zi);n=a*Math.cos(u),e=a*Math.sin(u),r=Math.sin(i),mo.point=t})}function uu(){mo.point=nu}function iu(t,n){var e=Math.cos(t),r=Math.sin(t);return function(u,i,a,o){null!=u?(u=au(e,u),i=au(e,i),(a>0?i>u:u>i)&&(u+=2*a*Ti)):(u=t+2*a*Ti,i=t);for(var c,l=a*n,f=u;a>0?f>i:i>f;f-=l)o.point((c=Vr([e,-r*Math.cos(f),-r*Math.sin(f)]))[0],c[1])}}function au(t,n){var e=Xr(n);e[0]-=t,Kr(e);var r=Math.acos(Math.max(-1,Math.min(1,-e[1])));return((0>-e[2]?-r:r)+2*Math.PI-qi)%(2*Math.PI)}function ou(t,n,e){return function(r){f
 unction u(n,e){t(n,e)&&r.point(n,e)}function i(t,n){m.point(t,n)}function a(){v.point=i,m.lineStart()}function o(){v.point=u,m.lineEnd()}function c(t,n){M.point(t,n),d.push([t,n])}function l(){M.lineStart(),d=[]}function f(){c(d[0][0],d[0][1]),M.lineEnd();var t,n=M.clean(),e=y.buffer(),u=e.length;if(!u)return p=!0,g+=gu(d,-1),d=null,void 0;if(d=null,1&n){t=e[0],h+=gu(t,1);var i,u=t.length-1,a=-1;for(r.lineStart();u>++a;)r.point((i=t[a])[0],i[1]);return r.lineEnd(),void 0}u>1&&2&n&&e.push(e.pop().concat(e.shift())),s.push(e.filter(su))}var s,h,g,p,d,m=n(r),v={point:u,lineStart:a,lineEnd:o,polygonStart:function(){v.point=c,v.lineStart=l,v.lineEnd=f,p=!1,g=h=0,s=[],r.polygonStart()},polygonEnd:function(){v.point=u,v.lineStart=a,v.lineEnd=o,s=Ci.merge(s),s.length?cu(s,e,r):(-qi>h||p&&-qi>g)&&(r.lineStart(),e(null,null,1,r),r.lineEnd()),r.polygonEnd(),s=null},sphere:function(){r.polygonStart(),r.lineStart(),e(null,null,1,r),r.lineEnd(),r.polygonEnd()}},y=hu(),M=n(y);return v}}function cu
 (t,n,e){var r=[],u=[];if(t.forEach(function(t){if(!(1>=(n=t.length))){var n,i=t[0],a=t[n-1];if(Zr(i,a)){e.lineStart();
+for(var o=0;n>o;++o)e.point((i=t[o])[0],i[1]);return e.lineEnd(),void 0}var c={point:i,points:t,other:null,visited:!1,entry:!0,subject:!0},l={point:i,points:[i],other:c,visited:!1,entry:!1,subject:!1};c.other=l,r.push(c),u.push(l),c={point:a,points:[a],other:null,visited:!1,entry:!1,subject:!0},l={point:a,points:[a],other:c,visited:!1,entry:!0,subject:!1},c.other=l,r.push(c),u.push(l)}}),u.sort(fu),lu(r),lu(u),r.length)for(var i,a,o,c=r[0];;){for(i=c;i.visited;)if((i=i.next)===c)return;a=i.points,e.lineStart();do{if(i.visited=i.other.visited=!0,i.entry){if(i.subject)for(var l=0;a.length>l;l++)e.point((o=a[l])[0],o[1]);else n(i.point,i.next.point,1,e);i=i.next}else{if(i.subject){a=i.prev.points;for(var l=a.length;--l>=0;)e.point((o=a[l])[0],o[1])}else n(i.point,i.prev.point,-1,e);i=i.prev}i=i.other,a=i.points}while(!i.visited);e.lineEnd()}}function lu(t){if(n=t.length){for(var n,e,r=0,u=t[0];n>++r;)u.next=e=t[r],e.prev=u,u=e;u.next=e=t[0],e.prev=u}}function fu(t,n){return(0>(t=t.poin
 t)[0]?t[1]-Ti/2-qi:Ti/2-t[1])-(0>(n=n.point)[0]?n[1]-Ti/2-qi:Ti/2-n[1])}function su(t){return t.length>1}function hu(){var t,n=[];return{lineStart:function(){n.push(t=[])},point:function(n,e){t.push([n,e])},lineEnd:Pn,buffer:function(){var e=n;return n=[],t=null,e}}}function gu(t,n){if(!(e=t.length))return 0;for(var e,r,u,i=0,a=0,o=t[0],c=o[0],l=o[1],f=Math.cos(l),s=Math.atan2(n*Math.sin(c)*f,Math.sin(l)),h=1-n*Math.cos(c)*f,g=s;e>++i;)o=t[i],f=Math.cos(l=o[1]),r=Math.atan2(n*Math.sin(c=o[0])*f,Math.sin(l)),u=1-n*Math.cos(c)*f,qi>Math.abs(h-2)&&qi>Math.abs(u-2)||(qi>Math.abs(u)||qi>Math.abs(h)||(qi>Math.abs(Math.abs(r-s)-Ti)?u+h>2&&(a+=4*(r-s)):a+=qi>Math.abs(h-2)?4*(r-g):((3*Ti+r-s)%(2*Ti)-Ti)*(h+u)),g=s,s=r,h=u);return a}function pu(t){var n,e=0/0,r=0/0,u=0/0;return{lineStart:function(){t.lineStart(),n=1},point:function(i,a){var o=i>0?Ti:-Ti,c=Math.abs(i-e);qi>Math.abs(c-Ti)?(t.point(e,r=(r+a)/2>0?Ti/2:-Ti/2),t.point(u,r),t.lineEnd(),t.lineStart(),t.point(o,r),t.point(i,r),n=0):u!
 ==o&&c>=Ti&&(qi>Math.abs(e-u)&&(e-=u*qi),qi>Math.abs(i-o)&&(i-=o*qi),r=du(e,r,i,a),t.point(u,r),t.lineEnd(),t.lineStart(),t.point(o,r),n=0),t.point(e=i,r=a),u=o},lineEnd:function(){t.lineEnd(),e=r=0/0},clean:function(){return 2-n}}}function du(t,n,e,r){var u,i,a=Math.sin(t-e);return Math.abs(a)>qi?Math.atan((Math.sin(n)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(n))*Math.sin(t))/(u*i*a)):(n+r)/2}function mu(t,n,e,r){var u;if(null==t)u=e*Ti/2,r.point(-Ti,u),r.point(0,u),r.point(Ti,u),r.point(Ti,0),r.point(Ti,-u),r.point(0,-u),r.point(-Ti,-u),r.point(-Ti,0),r.point(-Ti,u);else if(Math.abs(t[0]-n[0])>qi){var i=(t[0]<n[0]?1:-1)*Ti;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(n[0],n[1])}function vu(t){function n(t,n){return Math.cos(t)*Math.cos(n)>i}function e(t){var e,u,i,a;return{lineStart:function(){i=u=!1,a=1},point:function(o,c){var l,f=[o,c],s=n(o,c);!e&&(i=u=s)&&t.lineStart(),s!==u&&(l=r(e,f),(Zr(e,l)||Zr(f,l))&&(f[0]+=qi,f[1]+=qi,s=n(f[0],f[1]))),s!==u&&(
 a=0,(u=s)?(t.lineStart(),l=r(f,e),t.point(l[0],l[1])):(l=r(e,f),t.point(l[0],l[1]),t.lineEnd()),e=l),!s||e&&Zr(e,f)||t.point(f[0],f[1]),e=f},lineEnd:function(){u&&t.lineEnd(),e=null},clean:function(){return a|(i&&u)<<1}}}function r(t,n){var e=Xr(t,0),r=Xr(n,0),u=[1,0,0],a=$r(e,r),o=Br(a,a),c=a[0],l=o-c*c;if(!l)return t;var f=i*o/l,s=-i*c/l,h=$r(u,a),g=Gr(u,f),p=Gr(a,s);Jr(g,p);var d=h,m=Br(g,d),v=Br(d,d),y=Math.sqrt(m*m-v*(Br(g,g)-1)),M=Gr(d,(-m-y)/v);return Jr(M,g),Vr(M)}var u=t*zi,i=Math.cos(u),a=iu(u,6*zi);return ou(n,e,a)}function yu(t,n){function e(e,r){return e=t(e,r),n(e[0],e[1])}return t.invert&&n.invert&&(e.invert=function(e,r){return e=n.invert(e,r),e&&t.invert(e[0],e[1])}),e}function Mu(t,n){return[t,n]}function bu(t,n,e){var r=Ci.range(t,n-qi,e).concat(n);return function(t){return r.map(function(n){return[t,n]})}}function xu(t,n,e){var r=Ci.range(t,n-qi,e).concat(n);return function(t){return r.map(function(n){return[n,t]})}}function _u(t){return(t=Math.sin(t/2))*t}functi
 on wu(t,n,e,r){var u=Math.cos(n),i=Math.sin(n),a=Math.cos(r),o=Math.sin(r),c=u*Math.cos(t),l=u*Math.sin(t),f=a*Math.cos(e),s=a*Math.sin(e),h=2*Math.asin(Math.sqrt(_u(r-n)+u*a*_u(e-t))),g=1/Math.sin(h),p=h?function(t){var n=Math.sin(t*=h)*g,e=Math.sin(h-t)*g,r=e*c+n*f,u=e*l+n*s,a=e*i+n*o;return[Math.atan2(u,r)*Di,Math.atan2(a,Math.sqrt(r*r+u*u))*Di]}:function(){return[t*Di,n*Di]};return p.distance=h,p}function Su(t,n){return[t/(2*Ti),Math.max(-.5,Math.min(.5,Math.log(Math.tan(Ti/4+n/2))/(2*Ti)))]}function ku(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function Eu(t){var n=Wr(function(n,e){return t([n*Di,e*Di])});return function(t){return t=n(t),{point:function(n,e){t.point(n*zi,e*zi)},sphere:function(){t.sphere()},lineStart:function(){t.lineStart()},lineEnd:function(){t.lineEnd()},polygonStart:function(){t.polygonStart()},polygonEnd:function(){t.polygonEnd()}}}}function Au(){function t(t,n){a.push("M",t,",",n,i)}function n(t,n){a.push("M",t,",",n),o.
 point=e}function e(t,n){a.push("L",t,",",n)}function r(){o.point=t}function u(){a.push("Z")}var i=ku(4.5),a=[],o={point:t,lineStart:function(){o.point=n},lineEnd:r,polygonStart:function(){o.lineEnd=u},polygonEnd:function(){o.lineEnd=r,o.point=t},pointRadius:function(t){return i=ku(t),o},result:function(){if(a.length){var t=a.join("");return a=[],t}}};return o}function Nu(t){function n(n,e){t.moveTo(n,e),t.arc(n,e,a,0,2*Ti)}function e(n,e){t.moveTo(n,e),o.point=r}function r(n,e){t.lineTo(n,e)}function u(){o.point=n}function i(){t.closePath()}var a=4.5,o={point:n,lineStart:function(){o.point=e},lineEnd:u,polygonStart:function(){o.lineEnd=i},polygonEnd:function(){o.lineEnd=u,o.point=n},pointRadius:function(t){return a=t,o},result:Pn};return o}function Tu(){function t(t,n){xo+=u*t-r*n,r=t,u=n}var n,e,r,u;_o.point=function(i,a){_o.point=t,n=r=i,e=u=a},_o.lineEnd=function(){t(n,e)}}function qu(t,n){fo||(ho+=t,go+=n,++po)}function Cu(){function t(t,r){var u=t-n,i=r-e,a=Math.sqrt(u*u+i*i);h
 o+=a*(n+t)/2,go+=a*(e+r)/2,po+=a,n=t,e=r}var n,e;if(1!==fo){if(!(1>fo))return;fo=1,ho=go=po=0}wo.point=function(r,u){wo.point=t,n=r,e=u}}function zu(){wo.point=qu}function Du(){function t(t,n){var e=u*t-r*n;ho+=e*(r+t),go+=e*(u+n),po+=3*e,r=t,u=n}var n,e,r,u;2>fo&&(fo=2,ho=go=po=0),wo.point=function(i,a){wo.point=t,n=r=i,e=u=a},wo.lineEnd=function(){t(n,e)}}function Lu(){function t(t,n){t*=zi,n=n*zi/2+Ti/4;var e=t-r,a=Math.cos(n),o=Math.sin(n),c=i*o,l=ko,f=Eo,s=u*a+c*Math.cos(e),h=c*Math.sin(e);ko=l*s-f*h,Eo=f*s+l*h,r=t,u=a,i=o}var n,e,r,u,i;Ao.point=function(a,o){Ao.point=t,r=(n=a)*zi,u=Math.cos(o=(e=o)*zi/2+Ti/4),i=Math.sin(o)},Ao.lineEnd=function(){t(n,e)}}function Fu(t){return Hu(function(){return t})()}function Hu(t){function n(t){return t=a(t[0]*zi,t[1]*zi),[t[0]*f+o,c-t[1]*f]}function e(t){return t=a.invert((t[0]-o)/f,(c-t[1])/f),t&&[t[0]*Di,t[1]*Di]}function r(){a=yu(i=Pu(d,m,v),u);var t=u(g,p);return o=s-t[0]*f,c=h+t[1]*f,n}var u,i,a,o,c,l=Wr(function(t,n){return t=u(t,n),[
 t[0]*f+o,c-t[1]*f]}),f=150,s=480,h=250,g=0,p=0,d=0,m=0,v=0,y=vo,M=null;return n.stream=function(t){return ju(i,y(l(t)))},n.clipAngle=function(t){return arguments.length?(y=null==t?(M=t,vo):vu(M=+t),n):M},n.scale=function(t){return arguments.length?(f=+t,r()):f},n.translate=function(t){return arguments.length?(s=+t[0],h=+t[1],r()):[s,h]},n.center=function(t){return arguments.length?(g=t[0]%360*zi,p=t[1]%360*zi,r()):[g*Di,p*Di]},n.rotate=function(t){return arguments.length?(d=t[0]%360*zi,m=t[1]%360*zi,v=t.length>2?t[2]%360*zi:0,r()):[d*Di,m*Di,v*Di]},Ci.rebind(n,l,"precision"),function(){return u=t.apply(this,arguments),n.invert=u.invert&&e,r()}}function ju(t,n){return{point:function(e,r){r=t(e*zi,r*zi),e=r[0],n.point(e>Ti?e-2*Ti:-Ti>e?e+2*Ti:e,r[1])},sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function Pu(t,n,e){return t?n||e?yu(Ou(t),Yu(n,e)):Ou(t):n
 ||e?Yu(n,e):Mu}function Ru(t){return function(n,e){return n+=t,[n>Ti?n-2*Ti:-Ti>n?n+2*Ti:n,e]}}function Ou(t){var n=Ru(t);return n.invert=Ru(-t),n}function Yu(t,n){function e(t,n){var e=Math.cos(n),o=Math.cos(t)*e,c=Math.sin(t)*e,l=Math.sin(n),f=l*r+o*u;return[Math.atan2(c*i-f*a,o*r-l*u),Math.asin(Math.max(-1,Math.min(1,f*i+c*a)))]}var r=Math.cos(t),u=Math.sin(t),i=Math.cos(n),a=Math.sin(n);return e.invert=function(t,n){var e=Math.cos(n),o=Math.cos(t)*e,c=Math.sin(t)*e,l=Math.sin(n),f=l*i-c*a;return[Math.atan2(c*i+l*a,o*r+f*u),Math.asin(Math.max(-1,Math.min(1,f*r-o*u)))]},e}function Uu(t,n){function e(n,e){var r=Math.cos(n),u=Math.cos(e),i=t(r*u);return[i*u*Math.sin(n),i*Math.sin(e)]}return e.invert=function(t,e){var r=Math.sqrt(t*t+e*e),u=n(r),i=Math.sin(u),a=Math.cos(u);return[Math.atan2(t*i,r*a),Math.asin(r&&e*i/r)]},e}function Iu(t,n,e,r){var u,i,a,o,c,l,f;return u=r[t],i=u[0],a=u[1],u=r[n],o=u[0],c=u[1],u=r[e],l=u[0],f=u[1],(f-a)*(o-i)-(c-a)*(l-i)>0}function Vu(t,n,e){return(e[
 0]-n[0])*(t[1]-n[1])<(e[1]-n[1])*(t[0]-n[0])}function Zu(t,n,e,r){var u=t[0],i=e[0],a=n[0]-u,o=r[0]-i,c=t[1],l=e[1],f=n[1]-c,s=r[1]-l,h=(o*(c-l)-s*(u-i))/(s*a-o*f);return[u+h*a,c+h*f]}function Xu(t,n){var e={list:t.map(function(t,n){return{index:n,x:t[0],y:t[1]}}).sort(function(t,n){return t.y<n.y?-1:t.y>n.y?1:t.x<n.x?-1:t.x>n.x?1:0}),bottomSite:null},r={list:[],leftEnd:null,rightEnd:null,init:function(){r.leftEnd=r.createHalfEdge(null,"l"),r.rightEnd=r.createHalfEdge(null,"l"),r.leftEnd.r=r.rightEnd,r.rightEnd.l=r.leftEnd,r.list.unshift(r.leftEnd,r.rightEnd)},createHalfEdge:function(t,n){return{edge:t,side:n,vertex:null,l:null,r:null}},insert:function(t,n){n.l=t,n.r=t.r,t.r.l=n,t.r=n},leftBound:function(t){var n=r.leftEnd;do n=n.r;while(n!=r.rightEnd&&u.rightOf(n,t));return n=n.l},del:function(t){t.l.r=t.r,t.r.l=t.l,t.edge=null},right:function(t){return t.r},left:function(t){return t.l},leftRegion:function(t){return null==t.edge?e.bottomSite:t.edge.region[t.side]},rightRegion:funct
 ion(t){return null==t.edge?e.bottomSite:t.edge.region[To[t.side]]}},u={bisect:function(t,n){var e={region:{l:t,r:n},ep:{l:null,r:null}},r=n.x-t.x,u=n.y-t.y,i=r>0?r:-r,a=u>0?u:-u;return e.c=t.x*r+t.y*u+.5*(r*r+u*u),i>a?(e.a=1,e.b=u/r,e.c/=r):(e.b=1,e.a=r/u,e.c/=u),e},intersect:function(t,n){var e=t.edge,r=n.edge;if(!e||!r||e.region.r==r.region.r)return null;var u=e.a*r.b-e.b*r.a;if(1e-10>Math.abs(u))return null;var i,a,o=(e.c*r.b-r.c*e.b)/u,c=(r.c*e.a-e.c*r.a)/u,l=e.region.r,f=r.region.r;l.y<f.y||l.y==f.y&&l.x<f.x?(i=t,a=e):(i=n,a=r);var s=o>=a.region.r.x;return s&&"l"===i.side||!s&&"r"===i.side?null:{x:o,y:c}},rightOf:function(t,n){var e=t.edge,r=e.region.r,u=n.x>r.x;if(u&&"l"===t.side)return 1;if(!u&&"r"===t.side)return 0;if(1===e.a){var i=n.y-r.y,a=n.x-r.x,o=0,c=0;if(!u&&0>e.b||u&&e.b>=0?c=o=i>=e.b*a:(c=n.x+n.y*e.b>e.c,0>e.b&&(c=!c),c||(o=1)),!o){var l=r.x-e.region.l.x;c=e.b*(a*a-i*i)<l*i*(1+2*a/l+e.b*e.b),0>e.b&&(c=!c)}}else{var f=e.c-e.a*n.x,s=n.y-f,h=n.x-r.x,g=f-r.y;c=s*s>h*h+g
 *g}return"l"===t.side?c:!c},endPoint:function(t,e,r){t.ep[e]=r,t.ep[To[e]]&&n(t)},distance:function(t,n){var e=t.x-n.x,r=t.y-n.y;return Math.sqrt(e*e+r*r)}},i={list:[],insert:function(t,n,e){t.vertex=n,t.ystar=n.y+e;for(var r=0,u=i.list,a=u.length;a>r;r++){var o=u[r];if(!(t.ystar>o.ystar||t.ystar==o.ystar&&n.x>o.vertex.x))break}u.splice(r,0,t)},del:function(t){for(var n=0,e=i.list,r=e.length;r>n&&e[n]!=t;++n);e.splice(n,1)},empty:function(){return 0===i.list.length},nextEvent:function(t){for(var n=0,e=i.list,r=e.length;r>n;++n)if(e[n]==t)return e[n+1];return null},min:function(){var t=i.list[0];return{x:t.vertex.x,y:t.ystar}},extractMin:function(){return i.list.shift()}};r.init(),e.bottomSite=e.list.shift();for(var a,o,c,l,f,s,h,g,p,d,m,v,y,M=e.list.shift();;)if(i.empty()||(a=i.min()),M&&(i.empty()||M.y<a.y||M.y==a.y&&M.x<a.x))o=r.leftBound(M),c=r.right(o),h=r.rightRegion(o),v=u.bisect(h,M),s=r.createHalfEdge(v,"l"),r.insert(o,s),d=u.intersect(o,s),d&&(i.del(o),i.insert(o,d,u.distan
 ce(d,M))),o=s,s=r.createHalfEdge(v,"r"),r.insert(o,s),d=u.intersect(s,c),d&&i.insert(s,d,u.distance(d,M)),M=e.list.shift();else{if(i.empty())break;o=i.extractMin(),l=r.left(o),c=r.right(o),f=r.right(c),h=r.leftRegion(o),g=r.rightRegion(c),m=o.vertex,u.endPoint(o.edge,o.side,m),u.endPoint(c.edge,c.side,m),r.del(o),i.del(c),r.del(c),y="l",h.y>g.y&&(p=h,h=g,g=p,y="r"),v=u.bisect(h,g),s=r.createHalfEdge(v,y),r.insert(l,s),u.endPoint(v,To[y],m),d=u.intersect(l,s),d&&(i.del(l),i.insert(l,d,u.distance(d,h))),d=u.intersect(s,f),d&&i.insert(s,d,u.distance(d,h))}for(o=r.right(r.leftEnd);o!=r.rightEnd;o=r.right(o))n(o.edge)}function Bu(){return{leaf:!0,nodes:[],point:null}}function $u(t,n,e,r,u,i){if(!t(n,e,r,u,i)){var a=.5*(e+u),o=.5*(r+i),c=n.nodes;c[0]&&$u(t,c[0],e,r,a,o),c[1]&&$u(t,c[1],a,r,u,o),c[2]&&$u(t,c[2],e,o,a,i),c[3]&&$u(t,c[3],a,o,u,i)}}function Ju(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Gu(t,n,e,r){for(var u,i,a=0,o=n.length,c=e.
 length;o>a;){if(r>=c)return-1;if(u=n.charCodeAt(a++),37===u){if(i=$o[n.charAt(a++)],!i||0>(r=i(t,e,r)))return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function Ku(t){return RegExp("^(?:"+t.map(Ci.requote).join("|")+")","i")}function Wu(t){for(var n=new i,e=-1,r=t.length;r>++e;)n.set(t[e].toLowerCase(),e);return n}function Qu(t,n,e){t+="";var r=t.length;return e>r?Array(e-r+1).join(n)+t:t}function ti(t,n,e){Yo.lastIndex=0;var r=Yo.exec(n.substring(e));return r?e+=r[0].length:-1}function ni(t,n,e){Oo.lastIndex=0;var r=Oo.exec(n.substring(e));return r?e+=r[0].length:-1}function ei(t,n,e){Vo.lastIndex=0;var r=Vo.exec(n.substring(e));return r?(t.m=Zo.get(r[0].toLowerCase()),e+=r[0].length):-1}function ri(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e));return r?(t.m=Io.get(r[0].toLowerCase()),e+=r[0].length):-1}function ui(t,n,e){return Gu(t,""+Bo.c,n,e)}function ii(t,n,e){return Gu(t,""+Bo.x,n,e)}function ai(t,n,e){return Gu(t,""+Bo.X,n,e)}function oi(t,n,e){Jo.lastIndex=0;va
 r r=Jo.exec(n.substring(e,e+4));return r?(t.y=+r[0],e+=r[0].length):-1}function ci(t,n,e){Jo.lastIndex=0;var r=Jo.exec(n.substring(e,e+2));return r?(t.y=li(+r[0]),e+=r[0].length):-1}function li(t){return t+(t>68?1900:2e3)}function fi(t,n,e){Jo.lastIndex=0;var r=Jo.exec(n.substring(e,e+2));return r?(t.m=r[0]-1,e+=r[0].length):-1}function si(t,n,e){Jo.lastIndex=0;var r=Jo.exec(n.substring(e,e+2));return r?(t.d=+r[0],e+=r[0].length):-1}function hi(t,n,e){Jo.lastIndex=0;var r=Jo.exec(n.substring(e,e+2));return r?(t.H=+r[0],e+=r[0].length):-1}function gi(t,n,e){Jo.lastIndex=0;var r=Jo.exec(n.substring(e,e+2));return r?(t.M=+r[0],e+=r[0].length):-1}function pi(t,n,e){Jo.lastIndex=0;var r=Jo.exec(n.substring(e,e+2));return r?(t.S=+r[0],e+=r[0].length):-1}function di(t,n,e){Jo.lastIndex=0;var r=Jo.exec(n.substring(e,e+3));return r?(t.L=+r[0],e+=r[0].length):-1}function mi(t,n,e){var r=Go.get(n.substring(e,e+=2).toLowerCase());return null==r?-1:(t.p=r,e)}function vi(t){var n=t.getTimezoneOff
 set(),e=n>0?"-":"+",r=~~(Math.abs(n)/60),u=Math.abs(n)%60;return e+Qu(r,"0",2)+Qu(u,"0",2)}function yi(t){return t.toISOString()}function Mi(t,n,e){function r(n){var e=t(n),r=i(e,1);return r-n>n-e?e:r}function u(e){return n(e=t(new qo(e-1)),1),e}function i(t,e){return n(t=new qo(+t),e),t}function a(t,r,i){var a=u(t),o=[];if(i>1)for(;r>a;)e(a)%i||o.push(new Date(+a)),n(a,1);else for(;r>a;)o.push(new Date(+a)),n(a,1);return o}function o(t,n,e){try{qo=Ju;var r=new Ju;return r._=t,a(r,n,e)}finally{qo=Date}}t.floor=t,t.round=r,t.ceil=u,t.offset=i,t.range=a;var c=t.utc=bi(t);return c.floor=c,c.round=bi(r),c.ceil=bi(u),c.offset=bi(i),c.range=o,t}function bi(t){return function(n,e){try{qo=Ju;var r=new Ju;return r._=n,t(r,e)._}finally{qo=Date}}}function xi(t,n,e){function r(n){return t(n)}return r.invert=function(n){return wi(t.invert(n))},r.domain=function(n){return arguments.length?(t.domain(n),r):t.domain().map(wi)},r.nice=function(t){return r.domain(Yn(r.domain(),function(){return t}))},
 r.ticks=function(e,u){var i=_i(r.domain());if("function"!=typeof e){var a=i[1]-i[0],o=a/e,c=Ci.bisect(Wo,o);if(c==Wo.length)return n.year(i,e);if(!c)return t.ticks(e).map(wi);Math.log(o/Wo[c-1])<Math.log(Wo[c]/o)&&--c,e=n[c],u=e[1],e=e[0].range}return e(i[0],new Date(+i[1]+1),u)},r.tickFormat=function(){return e},r.copy=function(){return xi(t.copy(),n,e)},Ci.rebind(r,t,"range","rangeRound","interpolate","clamp")}function _i(t){var n=t[0],e=t[t.length-1];return e>n?[n,e]:[e,n]}function wi(t){return new Date(t)}function Si(t){return function(n){for(var e=t.length-1,r=t[e];!r[1](n);)r=t[--e];return r[0](n)}}function ki(t){var n=new Date(t,0,1);return n.setFullYear(t),n}function Ei(t){var n=t.getFullYear(),e=ki(n),r=ki(n+1);return n+(t-e)/(r-e)}function Ai(t){var n=new Date(Date.UTC(t,0,1));return n.setUTCFullYear(t),n}function Ni(t){var n=t.getUTCFullYear(),e=Ai(n),r=Ai(n+1);return n+(t-e)/(r-e)}var Ti=Math.PI,qi=1e-6,Ci={version:"3.0.8"},zi=Ti/180,Di=180/Ti,Li=document,Fi=window,Hi=".
 ",ji=",",Pi=[3,3];Date.now||(Date.now=function(){return+new Date});try{Li.createElement("div").style.setProperty("opacity",0,"")}catch(Ri){var Oi=Fi.CSSStyleDeclaration.prototype,Yi=Oi.setProperty;Oi.setProperty=function(t,n,e){Yi.call(this,t,n+"",e)}}var Ui=u;try{Ui(Li.documentElement.childNodes)[0].nodeType}catch(Ii){Ui=r}var Vi=[].__proto__?function(t,n){t.__proto__=n}:function(t,n){for(var e in n)t[e]=n[e]};Ci.map=function(t){var n=new i;for(var e in t)n.set(e,t[e]);return n},e(i,{has:function(t){return Zi+t in this},get:function(t){return this[Zi+t]},set:function(t,n){return this[Zi+t]=n},remove:function(t){return t=Zi+t,t in this&&delete this[t]},keys:function(){var t=[];return this.forEach(function(n){t.push(n)}),t},values:function(){var t=[];return this.forEach(function(n,e){t.push(e)}),t},entries:function(){var t=[];return this.forEach(function(n,e){t.push({key:n,value:e})}),t},forEach:function(t){for(var n in this)n.charCodeAt(0)===Xi&&t.call(this,n.substring(1),this[n])}}
 );var Zi="\0",Xi=Zi.charCodeAt(0);Ci.functor=c,Ci.rebind=function(t,n){for(var e,r=1,u=arguments.length;u>++r;)t[e=arguments[r]]=l(t,n,n[e]);return t},Ci.ascending=function(t,n){return n>t?-1:t>n?1:t>=n?0:0/0},Ci.descending=function(t,n){return t>n?-1:n>t?1:n>=t?0:0/0},Ci.mean=function(t,n){var e,r=t.length,u=0,i=-1,a=0;if(1===arguments.length)for(;r>++i;)f(e=t[i])&&(u+=(e-u)/++a);else for(;r>++i;)f(e=n.call(t,t[i],i))&&(u+=(e-u)/++a);return a?u:void 0},Ci.median=function(t,n){return arguments.length>1&&(t=t.map(n)),t=t.filter(f),t.length?Ci.quantile(t.sort(Ci.ascending),.5):void 0},Ci.min=function(t,n){var e,r,u=-1,i=t.length;if(1===arguments.length){for(;i>++u&&(null==(e=t[u])||e!=e);)e=void 0;for(;i>++u;)null!=(r=t[u])&&e>r&&(e=r)}else{for(;i>++u&&(null==(e=n.call(t,t[u],u))||e!=e);)e=void 0;for(;i>++u;)null!=(r=n.call(t,t[u],u))&&e>r&&(e=r)}return e},Ci.max=function(t,n){var e,r,u=-1,i=t.length;if(1===arguments.length){for(;i>++u&&(null==(e=t[u])||e!=e);)e=void 0;for(;i>++u;)nul
 l!=(r=t[u])&&r>e&&(e=r)}else{for(;i>++u&&(null==(e=n.call(t,t[u],u))||e!=e);)e=void 0;for(;i>++u;)null!=(r=n.call(t,t[u],u))&&r>e&&(e=r)}return e},Ci.extent=function(t,n){var e,r,u,i=-1,a=t.length;if(1===arguments.length){for(;a>++i&&(null==(e=u=t[i])||e!=e);)e=u=void 0;for(;a>++i;)null!=(r=t[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;a>++i&&(null==(e=u=n.call(t,t[i],i))||e!=e);)e=void 0;for(;a>++i;)null!=(r=n.call(t,t[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},Ci.random={normal:function(t,n){var e=arguments.length;return 2>e&&(n=1),1>e&&(t=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return t+n*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var t=Ci.random.normal.apply(Ci,arguments);return function(){return Math.exp(t())}},irwinHall:function(t){return function(){for(var n=0,e=0;t>e;e++)n+=Math.random();return n/t}}},Ci.sum=function(t,n){var e,r=0,u=t.length,i=-1;if(1===arguments.length)for(;u>++i;)isNaN(e=+t[i])||(r+=e);else for(;u
 >++i;)isNaN(e=+n.call(t,t[i],i))||(r+=e);return r},Ci.quantile=function(t,n){var e=(t.length-1)*n+1,r=Math.floor(e),u=+t[r-1],i=e-r;return i?u+i*(t[r]-u):u},Ci.shuffle=function(t){for(var n,e,r=t.length;r;)e=0|Math.random()*r--,n=t[r],t[r]=t[e],t[e]=n;return t},Ci.transpose=function(t){return Ci.zip.apply(Ci,t)},Ci.zip=function(){if(!(r=arguments.length))return[];for(var t=-1,n=Ci.min(arguments,s),e=Array(n);n>++t;)for(var r,u=-1,i=e[t]=Array(r);r>++u;)i[u]=arguments[u][t];return e},Ci.bisector=function(t){return{left:function(n,e,r,u){for(3>arguments.length&&(r=0),4>arguments.length&&(u=n.length);u>r;){var i=r+u>>>1;e>t.call(n,n[i],i)?r=i+1:u=i}return r},right:function(n,e,r,u){for(3>arguments.length&&(r=0),4>arguments.length&&(u=n.length);u>r;){var i=r+u>>>1;t.call(n,n[i],i)>e?u=i:r=i+1}return r}}};var Bi=Ci.bisector(function(t){return t});Ci.bisectLeft=Bi.left,Ci.bisect=Ci.bisectRight=Bi.right,Ci.nest=function(){function t(n,o){if(o>=a.length)return r?r.call(u,n):e?n.sort(e):n;fo
 r(var c,l,f,s=-1,h=n.length,g=a[o++],p=new i,d={};h>++s;)(f=p.get(c=g(l=n[s])))?f.push(l):p.set(c,[l]);return p.forEach(function(n,e){d[n]=t(e,o)}),d}function n(t,e){if(e>=a.length)return t;var r,u=[],i=o[e++];for(r in t)u.push({key:r,values:n(t[r],e)});return i&&u.sort(function(t,n){return i(t.key,n.key)}),u}var e,r,u={},a=[],o=[];return u.map=function(n){return t(n,0)},u.entries=function(e){return n(t(e,0),0)},u.key=function(t){return a.push(t),u},u.sortKeys=function(t){return o[a.length-1]=t,u},u.sortValues=function(t){return e=t,u},u.rollup=function(t){return r=t,u},u},Ci.keys=function(t){var n=[];for(var e in t)n.push(e);return n},Ci.values=function(t){var n=[];for(var e in t)n.push(t[e]);return n},Ci.entries=function(t){var n=[];for(var e in t)n.push({key:e,value:t[e]});return n},Ci.permute=function(t,n){for(var e=[],r=-1,u=n.length;u>++r;)e[r]=t[n[r]];return e},Ci.merge=function(t){return Array.prototype.concat.apply([],t)},Ci.range=function(t,n,e){if(3>arguments.length&&(e=1
 ,2>arguments.length&&(n=t,t=0)),1/0===(n-t)/e)throw Error("infinite range");var r,u=[],i=g(Math.abs(e)),a=-1;if(t*=i,n*=i,e*=i,0>e)for(;(r=t+e*++a)>n;)u.push(r/i);else for(;n>(r=t+e*++a);)u.push(r/i);return u},Ci.requote=function(t){return t.replace($i,"\\$&")};var $i=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;Ci.round=function(t,n){return n?Math.round(t*(n=Math.pow(10,n)))/n:Math.round(t)},Ci.xhr=function(t,n,e){function r(){var t=l.status;!t&&l.responseText||t>=200&&300>t||304===t?i.load.call(u,c.call(u,l)):i.error.call(u,l)}var u={},i=Ci.dispatch("progress","load","error"),o={},c=a,l=new(Fi.XDomainRequest&&/^(http(s)?:)?\/\//.test(t)?XDomainRequest:XMLHttpRequest);return"onload"in l?l.onload=l.onerror=r:l.onreadystatechange=function(){l.readyState>3&&r()},l.onprogress=function(t){var n=Ci.event;Ci.event=t;try{i.progress.call(u,l)}finally{Ci.event=n}},u.header=function(t,n){return t=(t+"").toLowerCase(),2>arguments.length?o[t]:(null==n?delete o[t]:o[t]=n+"",u)},u.mimeType=function(t){retur
 n arguments.length?(n=null==t?null:t+"",u):n},u.response=function(t){return c=t,u},["get","post"].forEach(function(t){u[t]=function(){return u.send.apply(u,[t].concat(Ui(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,t,!0),null==n||"accept"in o||(o.accept=n+",*/*"),l.setRequestHeader)for(var a in o)l.setRequestHeader(a,o[a]);return null!=n&&l.overrideMimeType&&l.overrideMimeType(n),null!=i&&u.on("error",i).on("load",function(t){i(null,t)}),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},Ci.rebind(u,i,"on"),2===arguments.length&&"function"==typeof n&&(e=n,n=null),null==e?u:u.get(p(e))},Ci.text=function(){return Ci.xhr.apply(Ci,arguments).response(d)},Ci.json=function(t,n){return Ci.xhr(t,"application/json",n).response(m)},Ci.html=function(t,n){return Ci.xhr(t,"text/html",n).response(v)},Ci.xml=function(){return Ci.xhr.apply(Ci,arguments).response(y)};var Ji={svg:"http://www.w3.org/2000/svg",xhtml:"http://ww
 w.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};Ci.ns={prefix:Ji,qualify:function(t){var n=t.indexOf(":"),e=t;return n>=0&&(e=t.substring(0,n),t=t.substring(n+1)),Ji.hasOwnProperty(e)?{space:Ji[e],local:t}:t}},Ci.dispatch=function(){for(var t=new M,n=-1,e=arguments.length;e>++n;)t[arguments[n]]=b(t);return t},M.prototype.on=function(t,n){var e=t.indexOf("."),r="";return e>0&&(r=t.substring(e+1),t=t.substring(0,e)),2>arguments.length?this[t].on(r):this[t].on(r,n)},Ci.format=function(t){var n=Gi.exec(t),e=n[1]||" ",r=n[2]||">",u=n[3]||"",i=n[4]||"",a=n[5],o=+n[6],c=n[7],l=n[8],f=n[9],s=1,h="",g=!1;switch(l&&(l=+l.substring(1)),(a||"0"===e&&"="===r)&&(a=e="0",r="=",c&&(o-=Math.floor((o-1)/4))),f){case"n":c=!0,f="g";break;case"%":s=100,h="%",f="f";break;case"p":s=100,h="%",f="r";break;case"b":case"o":case"x":case"X":i&&(i="0"+f.toLowerCase());case"c":case"d":g=!0,l=0;break;case"s":s=-1,f="r"}"#"=
 ==i&&(i=""),"r"!=f||l||(f="g"),f=Ki.get(f)||_;var p=a&&c;return function(t){if(g&&t%1)return"";var n=0>t||0===t&&0>1/t?(t=-t,"-"):u;if(0>s){var d=Ci.formatPrefix(t,l);t=d.scale(t),h=d.symbol}else t*=s;t=f(t,l),!a&&c&&(t=Wi(t));var m=i.length+t.length+(p?0:n.length),v=o>m?Array(m=o-m+1).join(e):"";return p&&(t=Wi(v+t)),Hi&&t.replace(".",Hi),n+=i,("<"===r?n+t+v:">"===r?v+n+t:"^"===r?v.substring(0,m>>=1)+n+t+v.substring(m):n+(p?t:v+t))+h}};var Gi=/(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/,Ki=Ci.map({b:function(t){return t.toString(2)},c:function(t){return String.fromCharCode(t)},o:function(t){return t.toString(8)},x:function(t){return t.toString(16)},X:function(t){return t.toString(16).toUpperCase()},g:function(t,n){return t.toPrecision(n)},e:function(t,n){return t.toExponential(n)},f:function(t,n){return t.toFixed(n)},r:function(t,n){return(t=Ci.round(t,x(t,n))).toFixed(Math.max(0,Math.min(20,x(t*(1+1e-15),n))))}}),Wi=a;if(Pi){var Qi=Pi.length;Wi=funct
 ion(t){for(var n=t.lastIndexOf("."),e=n>=0?"."+t.substring(n+1):(n=t.length,""),r=[],u=0,i=Pi[0];n>0&&i>0;)r.push(t.substring(n-=i,n+i)),i=Pi[u=(u+1)%Qi];return r.reverse().join(ji||"")+e}}var ta=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"].map(w);Ci.formatPrefix=function(t,n){var e=0;return t&&(0>t&&(t*=-1),n&&(t=Ci.round(t,x(t,n))),e=1+Math.floor(1e-12+Math.log(t)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),ta[8+e/3]};var na=function(){return a},ea=Ci.map({linear:na,poly:q,quad:function(){return A},cubic:function(){return N},sin:function(){return C},exp:function(){return z},circle:function(){return D},elastic:L,back:F,bounce:function(){return H}}),ra=Ci.map({"in":a,out:k,"in-out":E,"out-in":function(t){return E(k(t))}});Ci.ease=function(t){var n=t.indexOf("-"),e=n>=0?t.substring(0,n):t,r=n>=0?t.substring(n+1):"in";return e=ea.get(e)||na,r=ra.get(r)||a,S(r(e.apply(null,Array.prototype.slice.call(arguments,1))))},Ci.event=null,Ci.
 transform=function(t){var n=Li.createElementNS(Ci.ns.prefix.svg,"g");return(Ci.transform=function(t){n.setAttribute("transform",t);var e=n.transform.baseVal.consolidate();return new O(e?e.matrix:ua)})(t)},O.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var ua={a:1,b:0,c:0,d:1,e:0,f:0};Ci.interpolate=function(t,n){for(var e,r=Ci.interpolators.length;--r>=0&&!(e=Ci.interpolators[r](t,n)););return e},Ci.interpolateNumber=function(t,n){return n-=t,function(e){return t+n*e}},Ci.interpolateRound=function(t,n){return n-=t,function(e){return Math.round(t+n*e)}},Ci.interpolateString=function(t,n){var e,r,u,i,a,o=0,c=0,l=[],f=[];for(ia.lastIndex=0,r=0;e=ia.exec(n);++r)e.index&&l.push(n.substring(o,c=e.index)),f.push({i:l.length,x:e[0]}),l.push(null),o=ia.lastIndex;for(n.length>o&&l.push(n.substring(o)),r=0,i=f.length;(e=ia.exec(t))&&i>r;++r)if(a=f[r],a.x==e[0]){if(a.i)if(null==l[a.i+1])for(l[a.i-1]+=a.x,l.s
 plice(a.i,1),u=r+1;i>u;++u)f[u].i--;else for(l[a.i-1]+=a.x+l[a.i+1],l.splice(a.i,2),u=r+1;i>u;++u)f[u].i-=2;else if(null==l[a.i+1])l[a.i]=a.x;else for(l[a.i]=a.x+l[a.i+1],l.splice(a.i+1,1),u=r+1;i>u;++u)f[u].i--;f.splice(r,1),i--,r--}else a.x=Ci.interpolateNumber(parseFloat(e[0]),parseFloat(a.x));for(;i>r;)a=f.pop(),null==l[a.i+1]?l[a.i]=a.x:(l[a.i]=a.x+l[a.i+1],l.splice(a.i+1,1)),i--;return 1===l.length?null==l[0]?f[0].x:function(){return n}:function(t){for(r=0;i>r;++r)l[(a=f[r]).i]=a.x(t);return l.join("")}},Ci.interpolateTransform=function(t,n){var e,r=[],u=[],i=Ci.transform(t),a=Ci.transform(n),o=i.translate,c=a.translate,l=i.rotate,f=a.rotate,s=i.skew,h=a.skew,g=i.scale,p=a.scale;return o[0]!=c[0]||o[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:Ci.interpolateNumber(o[0],c[0])},{i:3,x:Ci.interpolateNumber(o[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),l!=f?(l-f>180?f+=360:f-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:Ci.inte
 rpolateNumber(l,f)})):f&&r.push(r.pop()+"rotate("+f+")"),s!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:Ci.interpolateNumber(s,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:Ci.interpolateNumber(g[0],p[0])},{i:e-2,x:Ci.interpolateNumber(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(t){for(var n,i=-1;e>++i;)r[(n=u[i]).i]=n.x(t);return r.join("")}},Ci.interpolateRgb=function(t,n){t=Ci.rgb(t),n=Ci.rgb(n);var e=t.r,r=t.g,u=t.b,i=n.r-e,a=n.g-r,o=n.b-u;return function(t){return"#"+G(Math.round(e+i*t))+G(Math.round(r+a*t))+G(Math.round(u+o*t))}},Ci.interpolateHsl=function(t,n){t=Ci.hsl(t),n=Ci.hsl(n);var e=t.h,r=t.s,u=t.l,i=n.h-e,a=n.s-r,o=n.l-u;return i>180?i-=360:-180>i&&(i+=360),function(t){return un(e+i*t,r+a*t,u+o*t)+""}},Ci.interpolateLab=function(t,n){t=Ci.lab(t),n=Ci.lab(n);var e=t.l,r=t.a,u=t.b,i=n.l-e,a=n.a-r,o=n.b-u;return function(t){return sn(e+i*t,r+a*t,u+
 o*t)+""}},Ci.interpolateHcl=function(t,n){t=Ci.hcl(t),n=Ci.hcl(n);var e=t.h,r=t.c,u=t.l,i=n.h-e,a=n.c-r,o=n.l-u;return i>180?i-=360:-180>i&&(i+=360),function(t){return cn(e+i*t,r+a*t,u+o*t)+""}},Ci.interpolateArray=function(t,n){var e,r=[],u=[],i=t.length,a=n.length,o=Math.min(t.length,n.length);for(e=0;o>e;++e)r.push(Ci.interpolate(t[e],n[e]));for(;i>e;++e)u[e]=t[e];for(;a>e;++e)u[e]=n[e];return function(t){for(e=0;o>e;++e)u[e]=r[e](t);return u}},Ci.interpolateObject=function(t,n){var e,r={},u={};for(e in t)e in n?r[e]=V(e)(t[e],n[e]):u[e]=t[e];for(e in n)e in t||(u[e]=n[e]);return function(t){for(e in r)u[e]=r[e](t);return u}};var ia=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;Ci.interpolators=[Ci.interpolateObject,function(t,n){return n instanceof Array&&Ci.interpolateArray(t,n)},function(t,n){return("string"==typeof t||"string"==typeof n)&&Ci.interpolateString(t+"",n+"")},function(t,n){return("string"==typeof n?oa.has(n)||/^(#|rgb\(|hsl\()/.test(n):n instanceof B)&&Ci.interpol
 ateRgb(t,n)},function(t,n){return!isNaN(t=+t)&&!isNaN(n=+n)&&Ci.interpolateNumber(t,n)}],B.prototype.toString=function(){return this.rgb()+""},Ci.rgb=function(t,n,e){return 1===arguments.length?t instanceof J?$(t.r,t.g,t.b):K(""+t,$,un):$(~~t,~~n,~~e)};var aa=J.prototype=new B;aa.brighter=function(t){t=Math.pow(.7,arguments.length?t:1);var n=this.r,e=this.g,r=this.b,u=30;return n||e||r?(n&&u>n&&(n=u),e&&u>e&&(e=u),r&&u>r&&(r=u),$(Math.min(255,Math.floor(n/t)),Math.min(255,Math.floor(e/t)),Math.min(255,Math.floor(r/t)))):$(u,u,u)},aa.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),$(Math.floor(t*this.r),Math.floor(t*this.g),Math.floor(t*this.b))},aa.hsl=function(){return W(this.r,this.g,this.b)},aa.toString=function(){return"#"+G(this.r)+G(this.g)+G(this.b)};var oa=Ci.map({aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2
 be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b00
 82",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6
 ",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"});
+oa.forEach(function(t,n){oa.set(t,K(n,$,un))}),Ci.hsl=function(t,n,e){return 1===arguments.length?t instanceof rn?en(t.h,t.s,t.l):K(""+t,W,en):en(+t,+n,+e)};var ca=rn.prototype=new B;ca.brighter=function(t){return t=Math.pow(.7,arguments.length?t:1),en(this.h,this.s,this.l/t)},ca.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),en(this.h,this.s,t*this.l)},ca.rgb=function(){return un(this.h,this.s,this.l)},Ci.hcl=function(t,n,e){return 1===arguments.length?t instanceof on?an(t.h,t.c,t.l):t instanceof fn?hn(t.l,t.a,t.b):hn((t=Q((t=Ci.rgb(t)).r,t.g,t.b)).l,t.a,t.b):an(+t,+n,+e)};var la=on.prototype=new B;la.brighter=function(t){return an(this.h,this.c,Math.min(100,this.l+fa*(arguments.length?t:1)))},la.darker=function(t){return an(this.h,this.c,Math.max(0,this.l-fa*(arguments.length?t:1)))},la.rgb=function(){return cn(this.h,this.c,this.l).rgb()},Ci.lab=function(t,n,e){return 1===arguments.length?t instanceof fn?ln(t.l,t.a,t.b):t instanceof on?cn(t.l,t.c,t.h):Q((t=Ci.rgb(t
 )).r,t.g,t.b):ln(+t,+n,+e)};var fa=18,sa=.95047,ha=1,ga=1.08883,pa=fn.prototype=new B;pa.brighter=function(t){return ln(Math.min(100,this.l+fa*(arguments.length?t:1)),this.a,this.b)},pa.darker=function(t){return ln(Math.max(0,this.l-fa*(arguments.length?t:1)),this.a,this.b)},pa.rgb=function(){return sn(this.l,this.a,this.b)};var da=function(t,n){return n.querySelector(t)},ma=function(t,n){return n.querySelectorAll(t)},va=Li.documentElement,ya=va.matchesSelector||va.webkitMatchesSelector||va.mozMatchesSelector||va.msMatchesSelector||va.oMatchesSelector,Ma=function(t,n){return ya.call(t,n)};"function"==typeof Sizzle&&(da=function(t,n){return Sizzle(t,n)[0]||null},ma=function(t,n){return Sizzle.uniqueSort(Sizzle(t,n))},Ma=Sizzle.matchesSelector);var ba=[];Ci.selection=function(){return xa},Ci.selection.prototype=ba,ba.select=function(t){var n,e,r,u,i=[];"function"!=typeof t&&(t=vn(t));for(var a=-1,o=this.length;o>++a;){i.push(n=[]),n.parentNode=(r=this[a]).parentNode;for(var c=-1,l=r.l
 ength;l>++c;)(u=r[c])?(n.push(e=t.call(u,u.__data__,c)),e&&"__data__"in u&&(e.__data__=u.__data__)):n.push(null)}return mn(i)},ba.selectAll=function(t){var n,e,r=[];"function"!=typeof t&&(t=yn(t));for(var u=-1,i=this.length;i>++u;)for(var a=this[u],o=-1,c=a.length;c>++o;)(e=a[o])&&(r.push(n=Ui(t.call(e,e.__data__,o))),n.parentNode=e);return mn(r)},ba.attr=function(t,n){if(2>arguments.length){if("string"==typeof t){var e=this.node();return t=Ci.ns.qualify(t),t.local?e.getAttributeNS(t.space,t.local):e.getAttribute(t)}for(n in t)this.each(Mn(n,t[n]));return this}return this.each(Mn(t,n))},ba.classed=function(t,n){if(2>arguments.length){if("string"==typeof t){var e=this.node(),r=(t=t.trim().split(/^|\s+/g)).length,u=-1;if(n=e.classList){for(;r>++u;)if(!n.contains(t[u]))return!1}else for(n=e.className,null!=n.baseVal&&(n=n.baseVal);r>++u;)if(!bn(t[u]).test(n))return!1;return!0}for(n in t)this.each(xn(n,t[n]));return this}return this.each(xn(t,n))},ba.style=function(t,n,e){var r=argument
 s.length;if(3>r){if("string"!=typeof t){2>r&&(n="");for(e in t)this.each(wn(e,t[e],n));return this}if(2>r)return Fi.getComputedStyle(this.node(),null).getPropertyValue(t);e=""}return this.each(wn(t,n,e))},ba.property=function(t,n){if(2>arguments.length){if("string"==typeof t)return this.node()[t];for(n in t)this.each(Sn(n,t[n]));return this}return this.each(Sn(t,n))},ba.text=function(t){return arguments.length?this.each("function"==typeof t?function(){var n=t.apply(this,arguments);this.textContent=null==n?"":n}:null==t?function(){this.textContent=""}:function(){this.textContent=t}):this.node().textContent},ba.html=function(t){return arguments.length?this.each("function"==typeof t?function(){var n=t.apply(this,arguments);this.innerHTML=null==n?"":n}:null==t?function(){this.innerHTML=""}:function(){this.innerHTML=t}):this.node().innerHTML},ba.append=function(t){function n(){return this.appendChild(Li.createElementNS(this.namespaceURI,t))}function e(){return this.appendChild(Li.createE
 lementNS(t.space,t.local))}return t=Ci.ns.qualify(t),this.select(t.local?e:n)},ba.insert=function(t,n){function e(){return this.insertBefore(Li.createElementNS(this.namespaceURI,t),da(n,this))}function r(){return this.insertBefore(Li.createElementNS(t.space,t.local),da(n,this))}return t=Ci.ns.qualify(t),this.select(t.local?r:e)},ba.remove=function(){return this.each(function(){var t=this.parentNode;t&&t.removeChild(this)})},ba.data=function(t,n){function e(t,e){var r,u,a,o=t.length,s=e.length,h=Math.min(o,s),g=Array(s),p=Array(s),d=Array(o);if(n){var m,v=new i,y=new i,M=[];for(r=-1;o>++r;)m=n.call(u=t[r],u.__data__,r),v.has(m)?d[r]=u:v.set(m,u),M.push(m);for(r=-1;s>++r;)m=n.call(e,a=e[r],r),(u=v.get(m))?(g[r]=u,u.__data__=a):y.has(m)||(p[r]=kn(a)),y.set(m,a),v.remove(m);for(r=-1;o>++r;)v.has(M[r])&&(d[r]=t[r])}else{for(r=-1;h>++r;)u=t[r],a=e[r],u?(u.__data__=a,g[r]=u):p[r]=kn(a);for(;s>r;++r)p[r]=kn(e[r]);for(;o>r;++r)d[r]=t[r]}p.update=g,p.parentNode=g.parentNode=d.parentNode=t.par
 entNode,c.push(p),l.push(g),f.push(d)}var r,u,a=-1,o=this.length;if(!arguments.length){for(t=Array(o=(r=this[0]).length);o>++a;)(u=r[a])&&(t[a]=u.__data__);return t}var c=qn([]),l=mn([]),f=mn([]);if("function"==typeof t)for(;o>++a;)e(r=this[a],t.call(r,r.parentNode.__data__,a));else for(;o>++a;)e(r=this[a],t);return l.enter=function(){return c},l.exit=function(){return f},l},ba.datum=function(t){return arguments.length?this.property("__data__",t):this.property("__data__")},ba.filter=function(t){var n,e,r,u=[];"function"!=typeof t&&(t=En(t));for(var i=0,a=this.length;a>i;i++){u.push(n=[]),n.parentNode=(e=this[i]).parentNode;for(var o=0,c=e.length;c>o;o++)(r=e[o])&&t.call(r,r.__data__,o)&&n.push(r)}return mn(u)},ba.order=function(){for(var t=-1,n=this.length;n>++t;)for(var e,r=this[t],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},ba.sort=function(t){t=An.apply(this,arguments);for(var n=-1,e=this.length;e>++n;)this[n].sort
 (t);return this.order()},ba.on=function(t,n,e){var r=arguments.length;if(3>r){if("string"!=typeof t){2>r&&(n=!1);for(e in t)this.each(Nn(e,t[e],n));return this}if(2>r)return(r=this.node()["__on"+t])&&r._;e=!1}return this.each(Nn(t,n,e))},ba.each=function(t){return Tn(this,function(n,e,r){t.call(n,n.__data__,e,r)})},ba.call=function(t){var n=Ui(arguments);return t.apply(n[0]=this,n),this},ba.empty=function(){return!this.node()},ba.node=function(){for(var t=0,n=this.length;n>t;t++)for(var e=this[t],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},ba.transition=function(){var t,n,e=wa||++ka,r=[],u=Object.create(Ea);u.time=Date.now();for(var i=-1,a=this.length;a>++i;){r.push(t=[]);for(var o=this[i],c=-1,l=o.length;l>++c;)(n=o[c])&&zn(n,c,e,u),t.push(n)}return Cn(r,e)};var xa=mn([[Li]]);xa[0].parentNode=va,Ci.select=function(t){return"string"==typeof t?xa.select(t):mn([[t]])},Ci.selectAll=function(t){return"string"==typeof t?xa.selectAll(t):mn([Ui(t)])};var _a=[];Ci.selectio
 n.enter=qn,Ci.selection.enter.prototype=_a,_a.append=ba.append,_a.insert=ba.insert,_a.empty=ba.empty,_a.node=ba.node,_a.select=function(t){for(var n,e,r,u,i,a=[],o=-1,c=this.length;c>++o;){r=(u=this[o]).update,a.push(n=[]),n.parentNode=u.parentNode;for(var l=-1,f=u.length;f>++l;)(i=u[l])?(n.push(r[l]=e=t.call(u.parentNode,i.__data__,l)),e.__data__=i.__data__):n.push(null)}return mn(a)};var wa,Sa=[],ka=0,Ea={ease:T,delay:0,duration:250};Sa.call=ba.call,Sa.empty=ba.empty,Sa.node=ba.node,Ci.transition=function(t){return arguments.length?wa?t.transition():t:xa.transition()},Ci.transition.prototype=Sa,Sa.select=function(t){var n,e,r,u=this.id,i=[];"function"!=typeof t&&(t=vn(t));for(var a=-1,o=this.length;o>++a;){i.push(n=[]);for(var c=this[a],l=-1,f=c.length;f>++l;)(r=c[l])&&(e=t.call(r,r.__data__,l))?("__data__"in r&&(e.__data__=r.__data__),zn(e,l,u,r.__transition__[u]),n.push(e)):n.push(null)}return Cn(i,u)},Sa.selectAll=function(t){var n,e,r,u,i,a=this.id,o=[];"function"!=typeof t&&(
 t=yn(t));for(var c=-1,l=this.length;l>++c;)for(var f=this[c],s=-1,h=f.length;h>++s;)if(r=f[s]){i=r.__transition__[a],e=t.call(r,r.__data__,s),o.push(n=[]);for(var g=-1,p=e.length;p>++g;)zn(u=e[g],g,a,i),n.push(u)}return Cn(o,a)},Sa.filter=function(t){var n,e,r,u=[];"function"!=typeof t&&(t=En(t));for(var i=0,a=this.length;a>i;i++){u.push(n=[]);for(var e=this[i],o=0,c=e.length;c>o;o++)(r=e[o])&&t.call(r,r.__data__,o)&&n.push(r)}return Cn(u,this.id,this.time).ease(this.ease())},Sa.attr=function(t,n){function e(){this.removeAttribute(i)}function r(){this.removeAttributeNS(i.space,i.local)}if(2>arguments.length){for(n in t)this.attr(n,t[n]);return this}var u=V(t),i=Ci.ns.qualify(t);return Ln(this,"attr."+t,n,function(t){function n(){var n,e=this.getAttribute(i);return e!==t&&(n=u(e,t),function(t){this.setAttribute(i,n(t))})}function a(){var n,e=this.getAttributeNS(i.space,i.local);return e!==t&&(n=u(e,t),function(t){this.setAttributeNS(i.space,i.local,n(t))})}return null==t?i.local?r:e:
 (t+="",i.local?a:n)})},Sa.attrTween=function(t,n){function e(t,e){var r=n.call(this,t,e,this.getAttribute(u));return r&&function(t){this.setAttribute(u,r(t))}}function r(t,e){var r=n.call(this,t,e,this.getAttributeNS(u.space,u.local));return r&&function(t){this.setAttributeNS(u.space,u.local,r(t))}}var u=Ci.ns.qualify(t);return this.tween("attr."+t,u.local?r:e)},Sa.style=function(t,n,e){function r(){this.style.removeProperty(t)}var u=arguments.length;if(3>u){if("string"!=typeof t){2>u&&(n="");for(e in t)this.style(e,t[e],n);return this}e=""}var i=V(t);return Ln(this,"style."+t,n,function(n){function u(){var r,u=Fi.getComputedStyle(this,null).getPropertyValue(t);return u!==n&&(r=i(u,n),function(n){this.style.setProperty(t,r(n),e)})}return null==n?r:(n+="",u)})},Sa.styleTween=function(t,n,e){return 3>arguments.length&&(e=""),this.tween("style."+t,function(r,u){var i=n.call(this,r,u,Fi.getComputedStyle(this,null).getPropertyValue(t));return i&&function(n){this.style.setProperty(t,i(n),
 e)}})},Sa.text=function(t){return Ln(this,"text",t,Dn)},Sa.remove=function(){return this.each("end.transition",function(){var t;!this.__transition__&&(t=this.parentNode)&&t.removeChild(this)})},Sa.ease=function(t){var n=this.id;return 1>arguments.length?this.node().__transition__[n].ease:("function"!=typeof t&&(t=Ci.ease.apply(Ci,arguments)),Tn(this,function(e){e.__transition__[n].ease=t}))},Sa.delay=function(t){var n=this.id;return Tn(this,"function"==typeof t?function(e,r,u){e.__transition__[n].delay=0|t.call(e,e.__data__,r,u)}:(t|=0,function(e){e.__transition__[n].delay=t}))},Sa.duration=function(t){var n=this.id;return Tn(this,"function"==typeof t?function(e,r,u){e.__transition__[n].duration=Math.max(1,0|t.call(e,e.__data__,r,u))}:(t=Math.max(1,0|t),function(e){e.__transition__[n].duration=t}))},Sa.each=function(t,n){var e=this.id;if(2>arguments.length){var r=Ea,u=wa;wa=e,Tn(this,function(n,r,u){Ea=n.__transition__[e],t.call(n,n.__data__,r,u)}),Ea=r,wa=u}else Tn(this,function(r)
 {r.__transition__[e].event.on(t,n)});return this},Sa.transition=function(){for(var t,n,e,r,u=this.id,i=++ka,a=[],o=0,c=this.length;c>o;o++){a.push(t=[]);for(var n=this[o],l=0,f=n.length;f>l;l++)(e=n[l])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,zn(e,l,i,r)),t.push(e)}return Cn(a,i)},Sa.tween=function(t,n){var e=this.id;return 2>arguments.length?this.node().__transition__[e].tween.get(t):Tn(this,null==n?function(n){n.__transition__[e].tween.remove(t)}:function(r){r.__transition__[e].tween.set(t,n)})};var Aa,Na,Ta=0,qa={},Ca=null;Ci.timer=function(t,n,e){if(3>arguments.length){if(2>arguments.length)n=0;else if(!isFinite(n))return;e=Date.now()}var r=qa[t.id];r&&r.callback===t?(r.then=e,r.delay=n):qa[t.id=++Ta]=Ca={callback:t,then:e,delay:n,next:Ca},Aa||(Na=clearTimeout(Na),Aa=1,za(Fn))},Ci.timer.flush=function(){for(var t,n=Date.now(),e=Ca;e;)t=n-e.then,e.delay||(e.flush=e.callback(t)),e=e.next;Hn()};var za=Fi.requestAnimationFrame||Fi.webkitRequestAnimationFrame||Fi.m
 ozRequestAnimationFrame||Fi.oRequestAnimationFrame||Fi.msRequestAnimationFrame||function(t){setTimeout(t,17)};Ci.mouse=function(t){return jn(t,P())};var Da=/WebKit/.test(Fi.navigator.userAgent)?-1:0;Ci.touches=function(t,n){return 2>arguments.length&&(n=P().touches),n?Ui(n).map(function(n){var e=jn(t,n);return e.identifier=n.identifier,e}):[]},Ci.scale={},Ci.scale.linear=function(){return In([0,1],[0,1],Ci.interpolate,!1)},Ci.scale.log=function(){return Kn(Ci.scale.linear(),Wn)};var La=Ci.format(".0e");Wn.pow=function(t){return Math.pow(10,t)},Qn.pow=function(t){return-Math.pow(10,-t)},Ci.scale.pow=function(){return te(Ci.scale.linear(),1)},Ci.scale.sqrt=function(){return Ci.scale.pow().exponent(.5)},Ci.scale.ordinal=function(){return ee([],{t:"range",a:[[]]})},Ci.scale.category10=function(){return Ci.scale.ordinal().range(Fa)},Ci.scale.category20=function(){return Ci.scale.ordinal().range(Ha)},Ci.scale.category20b=function(){return Ci.scale.ordinal().range(ja)},Ci.scale.category20c
 =function(){return Ci.scale.ordinal().range(Pa)};var Fa=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],Ha=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],ja=["#393b79","#5254a3","#6b6ecf","#9c9ede","#637939","#8ca252","#b5cf6b","#cedb9c","#8c6d31","#bd9e39","#e7ba52","#e7cb94","#843c39","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd","#de9ed6"],Pa=["#3182bd","#6baed6","#9ecae1","#c6dbef","#e6550d","#fd8d3c","#fdae6b","#fdd0a2","#31a354","#74c476","#a1d99b","#c7e9c0","#756bb1","#9e9ac8","#bcbddc","#dadaeb","#636363","#969696","#bdbdbd","#d9d9d9"];Ci.scale.quantile=function(){return re([],[])},Ci.scale.quantize=function(){return ue(0,1,[0,1])},Ci.scale.threshold=function(){return ie([.5],[0,1])},Ci.scale.identity=function(){return ae([0,1])},Ci.svg={},Ci.svg.arc=funct
 ion(){function t(){var t=n.apply(this,arguments),i=e.apply(this,arguments),a=r.apply(this,arguments)+Ra,o=u.apply(this,arguments)+Ra,c=(a>o&&(c=a,a=o,o=c),o-a),l=Ti>c?"0":"1",f=Math.cos(a),s=Math.sin(a),h=Math.cos(o),g=Math.sin(o);return c>=Oa?t?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+t+"A"+t+","+t+" 0 1,0 0,"+-t+"A"+t+","+t+" 0 1,0 0,"+t+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":t?"M"+i*f+","+i*s+"A"+i+","+i+" 0 "+l+",1 "+i*h+","+i*g+"L"+t*h+","+t*g+"A"+t+","+t+" 0 "+l+",0 "+t*f+","+t*s+"Z":"M"+i*f+","+i*s+"A"+i+","+i+" 0 "+l+",1 "+i*h+","+i*g+"L0,0"+"Z"}var n=oe,e=ce,r=le,u=fe;return t.innerRadius=function(e){return arguments.length?(n=c(e),t):n},t.outerRadius=function(n){return arguments.length?(e=c(n),t):e},t.startAngle=function(n){return arguments.length?(r=c(n),t):r},t.endAngle=function(n){return arguments.length?(u=c(n),t):u},t.centroid=function(){var t=(n.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,ar
 guments)+u.apply(this,arguments))/2+Ra;return[Math.cos(i)*t,Math.sin(i)*t]},t};var Ra=-Ti/2,Oa=2*Ti-1e-6;Ci.svg.line=function(){return se(a)};var Ya=Ci.map({linear:pe,"linear-closed":de,"step-before":me,"step-after":ve,basis:we,"basis-open":Se,"basis-closed":ke,bundle:Ee,cardinal:be,"cardinal-open":ye,"cardinal-closed":Me,monotone:ze});Ya.forEach(function(t,n){n.key=t,n.closed=/-closed$/.test(t)});var Ua=[0,2/3,1/3,0],Ia=[0,1/3,2/3,0],Va=[0,1/6,2/3,1/6];Ci.svg.line.radial=function(){var t=se(De);return t.radius=t.x,delete t.x,t.angle=t.y,delete t.y,t},me.reverse=ve,ve.reverse=me,Ci.svg.area=function(){return Le(a)},Ci.svg.area.radial=function(){var t=Le(De);return t.radius=t.x,delete t.x,t.innerRadius=t.x0,delete t.x0,t.outerRadius=t.x1,delete t.x1,t.angle=t.y,delete t.y,t.startAngle=t.y0,delete t.y0,t.endAngle=t.y1,delete t.y1,t},Ci.svg.chord=function(){function e(t,n){var e=r(this,o,t,n),c=r(this,l,t,n);return"M"+e.p0+i(e.r,e.p1,e.a1-e.a0)+(u(e,c)?a(e.r,e.p1,e.r,e.p0):a(e.r,e.p1,c
 .r,c.p0)+i(c.r,c.p1,c.a1-c.a0)+a(c.r,c.p1,e.r,e.p0))+"Z"}function r(t,n,e,r){var u=n.call(t,e,r),i=f.call(t,u,r),a=s.call(t,u,r)+Ra,o=h.call(t,u,r)+Ra;return{r:i,a0:a,a1:o,p0:[i*Math.cos(a),i*Math.sin(a)],p1:[i*Math.cos(o),i*Math.sin(o)]}}function u(t,n){return t.a0==n.a0&&t.a1==n.a1}function i(t,n,e){return"A"+t+","+t+" 0 "+ +(e>Ti)+",1 "+n}function a(t,n,e,r){return"Q 0,0 "+r}var o=n,l=t,f=Fe,s=le,h=fe;return e.radius=function(t){return arguments.length?(f=c(t),e):f},e.source=function(t){return arguments.length?(o=c(t),e):o},e.target=function(t){return arguments.length?(l=c(t),e):l},e.startAngle=function(t){return arguments.length?(s=c(t),e):s},e.endAngle=function(t){return arguments.length?(h=c(t),e):h},e},Ci.svg.diagonal=function(){function e(t,n){var e=r.call(this,t,n),a=u.call(this,t,n),o=(e.y+a.y)/2,c=[e,{x:e.x,y:o},{x:a.x,y:o},a];return c=c.map(i),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var r=n,u=t,i=He;return e.source=function(t){return arguments.length?(r=c(t),e):r},e.target=f
 unction(t){return arguments.length?(u=c(t),e):u},e.projection=function(t){return arguments.length?(i=t,e):i},e},Ci.svg.diagonal.radial=function(){var t=Ci.svg.diagonal(),n=He,e=t.projection;return t.projection=function(t){return arguments.length?e(je(n=t)):n},t},Ci.svg.symbol=function(){function t(t,r){return(Za.get(n.call(this,t,r))||Oe)(e.call(this,t,r))}var n=Re,e=Pe;return t.type=function(e){return arguments.length?(n=c(e),t):n},t.size=function(n){return arguments.length?(e=c(n),t):e},t};var Za=Ci.map({circle:Oe,cross:function(t){var n=Math.sqrt(t/5)/2;return"M"+-3*n+","+-n+"H"+-n+"V"+-3*n+"H"+n+"V"+-n+"H"+3*n+"V"+n+"H"+n+"V"+3*n+"H"+-n+"V"+n+"H"+-3*n+"Z"},diamond:function(t){var n=Math.sqrt(t/(2*Ba)),e=n*Ba;return"M0,"+-n+"L"+e+",0"+" 0,"+n+" "+-e+",0"+"Z"},square:function(t){var n=Math.sqrt(t)/2;return"M"+-n+","+-n+"L"+n+","+-n+" "+n+","+n+" "+-n+","+n+"Z"},"triangle-down":function(t){var n=Math.sqrt(t/Xa),e=n*Xa/2;return"M0,"+e+"L"+n+","+-e+" "+-n+","+-e+"Z"},"triangle-up":fu
 nction(t){var n=Math.sqrt(t/Xa),e=n*Xa/2;return"M0,"+-e+"L"+n+","+e+" "+-n+","+e+"Z"}});Ci.svg.symbolTypes=Za.keys();var Xa=Math.sqrt(3),Ba=Math.tan(30*zi);Ci.svg.axis=function(){function t(t){t.each(function(){var t,s=Ci.select(this),h=null==l?e.ticks?e.ticks.apply(e,c):e.domain():l,g=null==n?e.tickFormat?e.tickFormat.apply(e,c):String:n,p=Ie(e,h,f),d=s.selectAll(".tick.minor").data(p,String),m=d.enter().insert("line",".tick").attr("class","tick minor").style("opacity",1e-6),v=Ci.transition(d.exit()).style("opacity",1e-6).remove(),y=Ci.transition(d).style("opacity",1),M=s.selectAll(".tick.major").data(h,String),b=M.enter().insert("g","path").attr("class","tick major").style("opacity",1e-6),x=Ci.transition(M.exit()).style("opacity",1e-6).remove(),_=Ci.transition(M).style("opacity",1),w=On(e),S=s.selectAll(".domain").data([0]),k=(S.enter().append("path").attr("class","domain"),Ci.transition(S)),E=e.copy(),A=this.__chart__||E;this.__chart__=E,b.append("line"),b.append("text");var N=b.
 select("line"),T=_.select("line"),q=M.select("text").text(g),C=b.select("text"),z=_.select("text");switch(r){case"bottom":t=Ye,m.attr("y2",i),y.attr("x2",0).attr("y2",i),N.attr("y2",u),C.attr("y",Math.max(u,0)+o),T.attr("x2",0).attr("y2",u),z.attr("x",0).attr("y",Math.max(u,0)+o),q.attr("dy",".71em").style("text-anchor","middle"),k.attr("d","M"+w[0]+","+a+"V0H"+w[1]+"V"+a);break;case"top":t=Ye,m.attr("y2",-i),y.attr("x2",0).attr("y2",-i),N.attr("y2",-u),C.attr("y",-(Math.max(u,0)+o)),T.attr("x2",0).attr("y2",-u),z.attr("x",0).attr("y",-(Math.max(u,0)+o)),q.attr("dy","0em").style("text-anchor","middle"),k.attr("d","M"+w[0]+","+-a+"V0H"+w[1]+"V"+-a);break;case"left":t=Ue,m.attr("x2",-i),y.attr("x2",-i).attr("y2",0),N.attr("x2",-u),C.attr("x",-(Math.max(u,0)+o)),T.attr("x2",-u).attr("y2",0),z.attr("x",-(Math.max(u,0)+o)).attr("y",0),q.attr("dy",".32em").style("text-anchor","end"),k.attr("d","M"+-a+","+w[0]+"H0V"+w[1]+"H"+-a);break;case"right":t=Ue,m.attr("x2",i),y.attr("x2",i).attr("y2
 ",0),N.attr("x2",u),C.attr("x",Math.max(u,0)+o),T.attr("x2",u).attr("y2",0),z.attr("x",Math.max(u,0)+o).attr("y",0),q.attr("dy",".32em").style("text-anchor","start"),k.attr("d","M"+a+","+w[0]+"H0V"+w[1]+"H"+a)}if(e.ticks)b.call(t,A),_.call(t,E),x.call(t,E),m.call(t,A),y.call(t,E),v.call(t,E);else{var D=E.rangeBand()/2,L=function(t){return E(t)+D};b.call(t,L),_.call(t,L)}})}var n,e=Ci.scale.linear(),r=$a,u=6,i=6,a=6,o=3,c=[10],l=null,f=0;return t.scale=function(n){return arguments.length?(e=n,t):e},t.orient=function(n){return arguments.length?(r=n in Ja?n+"":$a,t):r},t.ticks=function(){return arguments.length?(c=arguments,t):c},t.tickValues=function(n){return arguments.length?(l=n,t):l},t.tickFormat=function(e){return arguments.length?(n=e,t):n},t.tickSize=function(n,e){if(!arguments.length)return u;var r=arguments.length-1;return u=+n,i=r>1?+e:u,a=r>0?+arguments[r]:u,t},t.tickPadding=function(n){return arguments.length?(o=+n,t):o},t.tickSubdivide=function(n){return arguments.length?
 (f=+n,t):f},t};var $a="bottom",Ja={top:1,right:1,bottom:1,left:1};Ci.svg.brush=function(){function t(i){i.each(function(){var i,a=Ci.select(this),f=a.selectAll(".background").data([0]),s=a.selectAll(".extent").data([0]),h=a.selectAll(".resize").data(l,String);a.style("pointer-events","all").on("mousedown.brush",u).on("touchstart.brush",u),f.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),s.enter().append("rect").attr("class","extent").style("cursor","move"),h.enter().append("g").attr("class",function(t){return"resize "+t}).style("cursor",function(t){return Ga[t]}).append("rect").attr("x",function(t){return/[ew]$/.test(t)?-3:null}).attr("y",function(t){return/^[ns]/.test(t)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),h.style("display",t.empty()?"none":null),h.exit().remove(),o&&(i=On(o),f.attr("x",i[0]).attr("width",i[1]-i[0]),e(a)),c&&(i=On(c),f.attr("y",i[0]).attr("height",i[1]-i[0]),r(a)),n(a)})
 }function n(t){t.selectAll(".resize").attr("transform",function(t){return"translate("+f[+/e$/.test(t)][0]+","+f[+/^s/.test(t)][1]+")"})}function e(t){t.select(".extent").attr("x",f[0][0]),t.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1][0]-f[0][0])}function r(t){t.select(".extent").attr("y",f[0][1]),t.selectAll(".extent,.e>rect,.w>rect").attr("height",f[1][1]-f[0][1])}function u(){function u(){var t=Ci.event.changedTouches;return t?Ci.touches(v,t)[0]:Ci.mouse(v)}function l(){32==Ci.event.keyCode&&(S||(d=null,k[0]-=f[1][0],k[1]-=f[1][1],S=2),j())}function s(){32==Ci.event.keyCode&&2==S&&(k[0]+=f[1][0],k[1]+=f[1][1],S=0,j())}function h(){var t=u(),i=!1;m&&(t[0]+=m[0],t[1]+=m[1]),S||(Ci.event.altKey?(d||(d=[(f[0][0]+f[1][0])/2,(f[0][1]+f[1][1])/2]),k[0]=f[+(t[0]<d[0])][0],k[1]=f[+(t[1]<d[1])][1]):d=null),_&&g(t,o,0)&&(e(b),i=!0),w&&g(t,c,1)&&(r(b),i=!0),i&&(n(b),M({type:"brush",mode:S?"move":"resize"}))}function g(t,n,e){var r,u,a=On(n),o=a[0],c=a[1],l=k[e],s=f[1][e]-f[0][e];re
 turn S&&(o-=l,c-=s+l),r=Math.max(o,Math.min(c,t[e])),S?u=(r+=l)+s:(d&&(l=Math.max(o,Math.min(c,2*d[e]-r))),r>l?(u=r,r=l):u=l),f[0][e]!==r||f[1][e]!==u?(i=null,f[0][e]=r,f[1][e]=u,!0):void 0}function p(){h(),b.style("pointer-events","all").selectAll(".resize").style("display",t.empty()?"none":null),Ci.select("body").style("cursor",null),E.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),M({type:"brushend"}),j()}var d,m,v=this,y=Ci.select(Ci.event.target),M=a.of(v,arguments),b=Ci.select(v),x=y.datum(),_=!/^(n|s)$/.test(x)&&o,w=!/^(e|w)$/.test(x)&&c,S=y.classed("extent"),k=u(),E=Ci.select(Fi).on("mousemove.brush",h).on("mouseup.brush",p).on("touchmove.brush",h).on("touchend.brush",p).on("keydown.brush",l).on("keyup.brush",s);if(S)k[0]=f[0][0]-k[0],k[1]=f[0][1]-k[1];else if(x){var A=+/w$/.test(x),N=+/^n/.test(x);m=[f[1-A][0]-k[0],f[1-N][1]-k[1]],k[0]=f[A][0],k[1]=f[N][1]}else Ci.event
 .altKey&&(d=k.slice());b.style("pointer-events","none").selectAll(".resize").style("display",null),Ci.select("body").style("cursor",y.style("cursor")),M({type:"brushstart"}),h(),j()}var i,a=R(t,"brushstart","brush","brushend"),o=null,c=null,l=Ka[0],f=[[0,0],[0,0]];return t.x=function(n){return arguments.length?(o=n,l=Ka[!o<<1|!c],t):o},t.y=function(n){return arguments.length?(c=n,l=Ka[!o<<1|!c],t):c},t.extent=function(n){var e,r,u,a,l;return arguments.length?(i=[[0,0],[0,0]],o&&(e=n[0],r=n[1],c&&(e=e[0],r=r[0]),i[0][0]=e,i[1][0]=r,o.invert&&(e=o(e),r=o(r)),e>r&&(l=e,e=r,r=l),f[0][0]=0|e,f[1][0]=0|r),c&&(u=n[0],a=n[1],o&&(u=u[1],a=a[1]),i[0][1]=u,i[1][1]=a,c.invert&&(u=c(u),a=c(a)),u>a&&(l=u,u=a,a=l),f[0][1]=0|u,f[1][1]=0|a),t):(n=i||f,o&&(e=n[0][0],r=n[1][0],i||(e=f[0][0],r=f[1][0],o.invert&&(e=o.invert(e),r=o.invert(r)),e>r&&(l=e,e=r,r=l))),c&&(u=n[0][1],a=n[1][1],i||(u=f[0][1],a=f[1][1],c.invert&&(u=c.invert(u),a=c.invert(a)),u>a&&(l=u,u=a,a=l))),o&&c?[[e,u],[r,a]]:o?[e,r]:c&&[u,a
 ])},t.clear=function(){return i=null,f[0][0]=f[0][1]=f[1][0]=f[1][1]=0,t},t.empty=function(){return o&&f[0][0]===f[1][0]||c&&f[0][1]===f[1][1]},Ci.rebind(t,a,"on")};var Ga={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Ka=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]];Ci.behavior={},Ci.behavior.drag=function(){function t(){this.on("mousedown.drag",n).on("touchstart.drag",n)}function n(){function t(){var t=o.parentNode;return null!=f?Ci.touches(t).filter(function(t){return t.identifier===f})[0]:Ci.mouse(t)}function n(){if(!o.parentNode)return u();var n=t(),e=n[0]-s[0],r=n[1]-s[1];h|=e|r,s=n,j(),c({type:"drag",x:n[0]+a[0],y:n[1]+a[1],dx:e,dy:r})}function u(){c({type:"dragend"}),h&&(j(),Ci.event.target===l&&g.on("click.drag",i,!0)),g.on(null!=f?"touchmove.drag-"+f:"mousemove.drag",null).on(null!=f?"touchend.drag-"+f:"mouseup.drag",null)}function i(){j(),g.on("click.drag",null)}var a,o=this,c=
 e.of(o,arguments),l=Ci.event.target,f=Ci.event.touches?Ci.event.changedTouches[0].identifier:null,s=t(),h=0,g=Ci.select(Fi).on(null!=f?"touchmove.drag-"+f:"mousemove.drag",n).on(null!=f?"touchend.drag-"+f:"mouseup.drag",u,!0);r?(a=r.apply(o,arguments),a=[a.x-s[0],a.y-s[1]]):a=[0,0],null==f&&j(),c({type:"dragstart"})}var e=R(t,"drag","dragstart","dragend"),r=null;return t.origin=function(n){return arguments.length?(r=n,t):r},Ci.rebind(t,e,"on")},Ci.behavior.zoom=function(){function t(){this.on("mousedown.zoom",o).on("mousemove.zoom",l).on(to+".zoom",c).on("dblclick.zoom",f).on("touchstart.zoom",s).on("touchmove.zoom",h).on("touchend.zoom",s)}function n(t){return[(t[0]-b[0])/x,(t[1]-b[1])/x]}function e(t){return[t[0]*x+b[0],t[1]*x+b[1]]}function r(t){x=Math.max(_[0],Math.min(_[1],t))}function u(t,n){n=e(n),b[0]+=t[0]-n[0],b[1]+=t[1]-n[1]}function i(){m&&m.domain(d.range().map(function(t){return(t-b[0])/x}).map(d.invert)),y&&y.domain(v.range().map(function(t){return(t-b[1])/x}).map(v.i
 nvert))}function a(t){i(),Ci.event.preventDefault(),t({type:"zoom",scale:x,translate:b})}function o(){function t(){l=1,u(Ci.mouse(i),s),a(o)}function e(){l&&j(),f.on("mousemove.zoom",null).on("mouseup.zoom",null),l&&Ci.event.target===c&&f.on("click.zoom",r,!0)}function r(){j(),f.on("click.zoom",null)}var i=this,o=w.of(i,arguments),c=Ci.event.target,l=0,f=Ci.select(Fi).on("mousemove.zoom",t).on("mouseup.zoom",e),s=n(Ci.mouse(i));Fi.focus(),j()}function c(){g||(g=n(Ci.mouse(this))),r(Math.pow(2,.002*Wa())*x),u(Ci.mouse(this),g),a(w.of(this,arguments))}function l(){g=null}function f(){var t=Ci.mouse(this),e=n(t),i=Math.log(x)/Math.LN2;r(Math.pow(2,Ci.event.shiftKey?Math.ceil(i)-1:Math.floor(i)+1)),u(t,e),a(w.of(this,arguments))}function s(){var t=Ci.touches(this),e=Date.now();if(p=x,g={},t.forEach(function(t){g[t.identifier]=n(t)}),j(),1===t.length){if(500>e-M){var i=t[0],o=n(t[0]);r(2*x),u(i,o),a(w.of(this,arguments))}M=e}}function h(){var t=Ci.touches(this),n=t[0],e=g[n.identifier];i
 f(i=t[1]){var i,o=g[i.identifier];n=[(n[0]+i[0])/2,(n[1]+i[1])/2],e=[(e[0]+o[0])/2,(e[1]+o[1])/2],r(Ci.event.scale*p)}u(n,e),M=null,a(w.of(this,arguments))}var g,p,d,m,v,y,M,b=[0,0],x=1,_=Qa,w=R(t,"zoom");return t.translate=function(n){return arguments.length?(b=n.map(Number),i(),t):b},t.scale=function(n){return arguments.length?(x=+n,i(),t):x},t.scaleExtent=function(n){return arguments.length?(_=null==n?Qa:n.map(Number),t):_},t.x=function(n){return arguments.length?(m=n,d=n.copy(),b=[0,0],x=1,t):m},t.y=function(n){return arguments.length?(y=n,v=n.copy(),b=[0,0],x=1,t):y},Ci.rebind(t,w,"on")};var Wa,Qa=[0,1/0],to="onwheel"in document?(Wa=function(){return-Ci.event.deltaY*(Ci.event.deltaMode?120:1)},"wheel"):"onmousewheel"in document?(Wa=function(){return Ci.event.wheelDelta},"mousewheel"):(Wa=function(){return-Ci.event.detail},"MozMousePixelScroll");Ci.layout={},Ci.layout.bundle=function(){return function(t){for(var n=[],e=-1,r=t.length;r>++e;)n.push(Ve(t[e]));return n}},Ci.layout.c
 hord=function(){function t(){var t,l,s,h,g,p={},d=[],m=Ci.range(i),v=[];for(e=[],r=[],t=0,h=-1;i>++h;){for(l=0,g=-1;i>++g;)l+=u[h][g];d.push(l),v.push(Ci.range(i)),t+=l}for(a&&m.sort(function(t,n){return a(d[t],d[n])}),o&&v.forEach(function(t,n){t.sort(function(t,e){return o(u[n][t],u[n][e])})}),t=(2*Ti-f*i)/t,l=0,h=-1;i>++h;){for(s=l,g=-1;i>++g;){var y=m[h],M=v[y][g],b=u[y][M],x=l,_=l+=b*t;p[y+"-"+M]={index:y,subindex:M,startAngle:x,endAngle:_,value:b}}r[y]={index:y,startAngle:s,endAngle:l,value:(l-s)/t},l+=f}for(h=-1;i>++h;)for(g=h-1;i>++g;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&n()}function n(){e.sort(function(t,n){return c((t.source.value+t.target.value)/2,(n.source.value+n.target.value)/2)})}var e,r,u,i,a,o,c,l={},f=0;return l.matrix=function(t){return arguments.length?(i=(u=t)&&u.length,e=r=null,l):u},l.padding=function(t){return arguments.length?(f=t,e=r=null,l):f},l.sortGroups=function(t){return a
 rguments.length?(a=t,e=r=null,l):a},l.sortSubgroups=function(t){return arguments.length?(o=t,e=null,l):o},l.sortChords=function(t){return arguments.length?(c=t,e&&n(),l):c},l.chords=function(){return e||t(),e},l.groups=function(){return r||t(),r},l},Ci.layout.force=function(){function t(t){return function(n,e,r,u){if(n.point!==t){var i=n.cx-t.x,a=n.cy-t.y,o=1/Math.sqrt(i*i+a*a);if(m>(u-e)*o){var c=n.charge*o*o;return t.px-=i*c,t.py-=a*c,!0}if(n.point&&isFinite(o)){var c=n.pointCharge*o*o;t.px-=i*c,t.py-=a*c}}return!n.charge}}function n(t){t.px=Ci.event.x,t.py=Ci.event.y,c.resume()}var e,r,u,i,o,c={},l=Ci.dispatch("start","tick","end"),f=[1,1],s=.9,h=no,g=eo,p=-30,d=.1,m=.8,v=[],y=[];return c.tick=function(){if(.005>(r*=.99))return l.end({type:"end",alpha:r=0}),!0;var n,e,a,c,h,g,m,M,b,x=v.length,_=y.length;for(e=0;_>e;++e)a=y[e],c=a.source,h=a.target,M=h.x-c.x,b=h.y-c.y,(g=M*M+b*b)&&(g=r*i[e]*((g=Math.sqrt(g))-u[e])/g,M*=g,b*=g,h.x-=M*(m=c.weight/(h.weight+c.weight)),h.y-=b*m,c.x+=M
 *(m=1-m),c.y+=b*m);if((m=r*d)&&(M=f[0]/2,b=f[1]/2,e=-1,m))for(;x>++e;)a=v[e],a.x+=(M-a.x)*m,a.y+=(b-a.y)*m;if(p)for(Ke(n=Ci.geom.quadtree(v),r,o),e=-1;x>++e;)(a=v[e]).fixed||n.visit(t(a));for(e=-1;x>++e;)a=v[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*s,a.y-=(a.py-(a.py=a.y))*s);l.tick({type:"tick",alpha:r})},c.nodes=function(t){return arguments.length?(v=t,c):v},c.links=function(t){return arguments.length?(y=t,c):y},c.size=function(t){return arguments.length?(f=t,c):f},c.linkDistance=function(t){return arguments.length?(h="function"==typeof t?t:+t,c):h},c.distance=c.linkDistance,c.linkStrength=function(t){return arguments.length?(g="function"==typeof t?t:+t,c):g},c.friction=function(t){return arguments.length?(s=+t,c):s},c.charge=function(t){return arguments.length?(p="function"==typeof t?t:+t,c):p},c.gravity=function(t){return arguments.length?(d=+t,c):d},c.theta=function(t){return arguments.length?(m=+t,c):m},c.alpha=function(t){return arguments.length?(t=+t,r?r=t>0?t:
 0:t>0&&(l.start({type:"start",alpha:r=t}),Ci.timer(c.tick)),c):r},c.start=function(){function t(t,r){for(var u,i=n(e),a=-1,o=i.length;o>++a;)if(!isNaN(u=i[a][t]))return u;
+return Math.random()*r}function n(){if(!a){for(a=[],r=0;s>r;++r)a[r]=[];for(r=0;d>r;++r){var t=y[r];a[t.source.index].push(t.target),a[t.target.index].push(t.source)}}return a[e]}var e,r,a,l,s=v.length,d=y.length,m=f[0],M=f[1];for(e=0;s>e;++e)(l=v[e]).index=e,l.weight=0;for(e=0;d>e;++e)l=y[e],"number"==typeof l.source&&(l.source=v[l.source]),"number"==typeof l.target&&(l.target=v[l.target]),++l.source.weight,++l.target.weight;for(e=0;s>e;++e)l=v[e],isNaN(l.x)&&(l.x=t("x",m)),isNaN(l.y)&&(l.y=t("y",M)),isNaN(l.px)&&(l.px=l.x),isNaN(l.py)&&(l.py=l.y);if(u=[],"function"==typeof h)for(e=0;d>e;++e)u[e]=+h.call(this,y[e],e);else for(e=0;d>e;++e)u[e]=h;if(i=[],"function"==typeof g)for(e=0;d>e;++e)i[e]=+g.call(this,y[e],e);else for(e=0;d>e;++e)i[e]=g;if(o=[],"function"==typeof p)for(e=0;s>e;++e)o[e]=+p.call(this,v[e],e);else for(e=0;s>e;++e)o[e]=p;return c.resume()},c.resume=function(){return c.alpha(.1)},c.stop=function(){return c.alpha(0)},c.drag=function(){return e||(e=Ci.behavior.drag()
 .origin(a).on("dragstart.force",Be).on("drag.force",n).on("dragend.force",$e)),arguments.length?(this.on("mouseover.force",Je).on("mouseout.force",Ge).call(e),void 0):e},Ci.rebind(c,l,"on")};var no=20,eo=1;Ci.layout.partition=function(){function t(n,e,r,u){var i=n.children;if(n.x=e,n.y=n.depth*u,n.dx=r,n.dy=u,i&&(a=i.length)){var a,o,c,l=-1;for(r=n.value?r/n.value:0;a>++l;)t(o=i[l],e,c=o.value*r,u),e+=c}}function n(t){var e=t.children,r=0;if(e&&(u=e.length))for(var u,i=-1;u>++i;)r=Math.max(r,n(e[i]));return 1+r}function e(e,i){var a=r.call(this,e,i);return t(a[0],0,u[0],u[1]/n(a[0])),a}var r=Ci.layout.hierarchy(),u=[1,1];return e.size=function(t){return arguments.length?(u=t,e):u},lr(e,r)},Ci.layout.pie=function(){function t(i){var a=i.map(function(e,r){return+n.call(t,e,r)}),o=+("function"==typeof r?r.apply(this,arguments):r),c=(("function"==typeof u?u.apply(this,arguments):u)-r)/Ci.sum(a),l=Ci.range(i.length);null!=e&&l.sort(e===ro?function(t,n){return a[n]-a[t]}:function(t,n){ret
 urn e(i[t],i[n])});var f=[];return l.forEach(function(t){var n;f[t]={data:i[t],value:n=a[t],startAngle:o,endAngle:o+=n*c}}),f}var n=Number,e=ro,r=0,u=2*Ti;return t.value=function(e){return arguments.length?(n=e,t):n},t.sort=function(n){return arguments.length?(e=n,t):e},t.startAngle=function(n){return arguments.length?(r=n,t):r},t.endAngle=function(n){return arguments.length?(u=n,t):u},t};var ro={};Ci.layout.stack=function(){function t(a,c){var l=a.map(function(e,r){return n.call(t,e,r)}),f=l.map(function(n){return n.map(function(n,e){return[i.call(t,n,e),o.call(t,n,e)]})}),s=e.call(t,f,c);l=Ci.permute(l,s),f=Ci.permute(f,s);var h,g,p,d=r.call(t,f,c),m=l.length,v=l[0].length;for(g=0;v>g;++g)for(u.call(t,l[0][g],p=d[g],f[0][g][1]),h=1;m>h;++h)u.call(t,l[h][g],p+=f[h-1][g][1],f[h][g][1]);return a}var n=a,e=nr,r=er,u=tr,i=We,o=Qe;return t.values=function(e){return arguments.length?(n=e,t):n},t.order=function(n){return arguments.length?(e="function"==typeof n?n:uo.get(n)||nr,t):e},t.off
 set=function(n){return arguments.length?(r="function"==typeof n?n:io.get(n)||er,t):r},t.x=function(n){return arguments.length?(i=n,t):i},t.y=function(n){return arguments.length?(o=n,t):o},t.out=function(n){return arguments.length?(u=n,t):u},t};var uo=Ci.map({"inside-out":function(t){var n,e,r=t.length,u=t.map(rr),i=t.map(ur),a=Ci.range(r).sort(function(t,n){return u[t]-u[n]}),o=0,c=0,l=[],f=[];for(n=0;r>n;++n)e=a[n],c>o?(o+=i[e],l.push(e)):(c+=i[e],f.push(e));return f.reverse().concat(l)},reverse:function(t){return Ci.range(t.length).reverse()},"default":nr}),io=Ci.map({silhouette:function(t){var n,e,r,u=t.length,i=t[0].length,a=[],o=0,c=[];for(e=0;i>e;++e){for(n=0,r=0;u>n;n++)r+=t[n][e][1];r>o&&(o=r),a.push(r)}for(e=0;i>e;++e)c[e]=(o-a[e])/2;return c},wiggle:function(t){var n,e,r,u,i,a,o,c,l,f=t.length,s=t[0],h=s.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(n=0,u=0;f>n;++n)u+=t[n][e][1];for(n=0,i=0,o=s[e][0]-s[e-1][0];f>n;++n){for(r=0,a=(t[n][e][1]-t[n][e-1][1])/(2*o);n>r;++r)a+=(t[
 r][e][1]-t[r][e-1][1])/o;i+=a*t[n][e][1]}g[e]=c-=u?i/u*o:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(t){var n,e,r,u=t.length,i=t[0].length,a=1/u,o=[];for(e=0;i>e;++e){for(n=0,r=0;u>n;n++)r+=t[n][e][1];if(r)for(n=0;u>n;n++)t[n][e][1]/=r;else for(n=0;u>n;n++)t[n][e][1]=a}for(e=0;i>e;++e)o[e]=0;return o},zero:er});Ci.layout.histogram=function(){function t(t,i){for(var a,o,c=[],l=t.map(e,this),f=r.call(this,l,i),s=u.call(this,f,l,i),i=-1,h=l.length,g=s.length-1,p=n?1:1/h;g>++i;)a=c[i]=[],a.dx=s[i+1]-(a.x=s[i]),a.y=0;if(g>0)for(i=-1;h>++i;)o=l[i],o>=f[0]&&f[1]>=o&&(a=c[Ci.bisect(s,o,1,g)-1],a.y+=p,a.push(t[i]));return c}var n=!0,e=Number,r=cr,u=ar;return t.value=function(n){return arguments.length?(e=n,t):e},t.range=function(n){return arguments.length?(r=c(n),t):r},t.bins=function(n){return arguments.length?(u="number"==typeof n?function(t){return or(t,n)}:c(n),t):u},t.frequency=function(e){return arguments.length?(n=!!e,t):n},t},Ci.layout.hierarchy=function(){function
  t(n,a,o){var c=u.call(e,n,a);if(n.depth=a,o.push(n),c&&(l=c.length)){for(var l,f,s=-1,h=n.children=[],g=0,p=a+1;l>++s;)f=t(c[s],p,o),f.parent=n,h.push(f),g+=f.value;r&&h.sort(r),i&&(n.value=g)}else i&&(n.value=+i.call(e,n,a)||0);return n}function n(t,r){var u=t.children,a=0;if(u&&(o=u.length))for(var o,c=-1,l=r+1;o>++c;)a+=n(u[c],l);else i&&(a=+i.call(e,t,r)||0);return i&&(t.value=a),a}function e(n){var e=[];return t(n,0,e),e}var r=hr,u=fr,i=sr;return e.sort=function(t){return arguments.length?(r=t,e):r},e.children=function(t){return arguments.length?(u=t,e):u},e.value=function(t){return arguments.length?(i=t,e):i},e.revalue=function(t){return n(t,0),t},e},Ci.layout.pack=function(){function t(t,u){var i=n.call(this,t,u),a=i[0];a.x=0,a.y=0,Lr(a,function(t){t.r=Math.sqrt(t.value)}),Lr(a,yr);var o=r[0],c=r[1],l=Math.max(2*a.r/o,2*a.r/c);if(e>0){var f=e*l/2;Lr(a,function(t){t.r+=f}),Lr(a,yr),Lr(a,function(t){t.r-=f}),l=Math.max(2*a.r/o,2*a.r/c)}return xr(a,o/2,c/2,1/l),i}var n=Ci.layou
 t.hierarchy().sort(pr),e=0,r=[1,1];return t.size=function(n){return arguments.length?(r=n,t):r},t.padding=function(n){return arguments.length?(e=+n,t):e},lr(t,n)},Ci.layout.cluster=function(){function t(t,u){var i,a=n.call(this,t,u),o=a[0],c=0;Lr(o,function(t){var n=t.children;n&&n.length?(t.x=Sr(n),t.y=wr(n)):(t.x=i?c+=e(t,i):0,t.y=0,i=t)});var l=kr(o),f=Er(o),s=l.x-e(l,f)/2,h=f.x+e(f,l)/2;return Lr(o,function(t){t.x=(t.x-s)/(h-s)*r[0],t.y=(1-(o.y?t.y/o.y:1))*r[1]}),a}var n=Ci.layout.hierarchy().sort(null).value(null),e=Ar,r=[1,1];return t.separation=function(n){return arguments.length?(e=n,t):e},t.size=function(n){return arguments.length?(r=n,t):r},lr(t,n)},Ci.layout.tree=function(){function t(t,u){function i(t,n){var r=t.children,u=t._tree;if(r&&(a=r.length)){for(var a,c,l,f=r[0],s=f,h=-1;a>++h;)l=r[h],i(l,c),s=o(l,c,s),c=l;Fr(t);var g=.5*(f._tree.prelim+l._tree.prelim);n?(u.prelim=n._tree.prelim+e(t,n),u.mod=u.prelim-g):u.prelim=g}else n&&(u.prelim=n._tree.prelim+e(t,n))}functio
 n a(t,n){t.x=t._tree.prelim+n;var e=t.children;if(e&&(r=e.length)){var r,u=-1;for(n+=t._tree.mod;r>++u;)a(e[u],n)}}function o(t,n,r){if(n){for(var u,i=t,a=t,o=n,c=t.parent.children[0],l=i._tree.mod,f=a._tree.mod,s=o._tree.mod,h=c._tree.mod;o=Tr(o),i=Nr(i),o&&i;)c=Nr(c),a=Tr(a),a._tree.ancestor=t,u=o._tree.prelim+s-i._tree.prelim-l+e(o,i),u>0&&(Hr(jr(o,t,r),t,u),l+=u,f+=u),s+=o._tree.mod,l+=i._tree.mod,h+=c._tree.mod,f+=a._tree.mod;o&&!Tr(a)&&(a._tree.thread=o,a._tree.mod+=s-f),i&&!Nr(c)&&(c._tree.thread=i,c._tree.mod+=l-h,r=t)}return r}var c=n.call(this,t,u),l=c[0];Lr(l,function(t,n){t._tree={ancestor:t,prelim:0,mod:0,change:0,shift:0,number:n?n._tree.number+1:0}}),i(l),a(l,-l._tree.prelim);var f=qr(l,zr),s=qr(l,Cr),h=qr(l,Dr),g=f.x-e(f,s)/2,p=s.x+e(s,f)/2,d=h.depth||1;return Lr(l,function(t){t.x=(t.x-g)/(p-g)*r[0],t.y=t.depth/d*r[1],delete t._tree}),c}var n=Ci.layout.hierarchy().sort(null).value(null),e=Ar,r=[1,1];return t.separation=function(n){return arguments.length?(e=n,t):e},t
 .size=function(n){return arguments.length?(r=n,t):r},lr(t,n)},Ci.layout.treemap=function(){function t(t,n){for(var e,r,u=-1,i=t.length;i>++u;)r=(e=t[u]).value*(0>n?0:n),e.area=isNaN(r)||0>=r?0:r}function n(e){var i=e.children;if(i&&i.length){var a,o,c,l=s(e),f=[],h=i.slice(),p=1/0,d="slice"===g?l.dx:"dice"===g?l.dy:"slice-dice"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(t(h,l.dx*l.dy/e.value),f.area=0;(c=h.length)>0;)f.push(a=h[c-1]),f.area+=a.area,"squarify"!==g||p>=(o=r(f,d))?(h.pop(),p=o):(f.area-=f.pop().area,u(f,d,l,!1),d=Math.min(l.dx,l.dy),f.length=f.area=0,p=1/0);f.length&&(u(f,d,l,!0),f.length=f.area=0),i.forEach(n)}}function e(n){var r=n.children;if(r&&r.length){var i,a=s(n),o=r.slice(),c=[];for(t(o,a.dx*a.dy/n.value),c.area=0;i=o.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?a.dx:a.dy,a,!o.length),c.length=c.area=0);r.forEach(e)}}function r(t,n){for(var e,r=t.area,u=0,i=1/0,a=-1,o=t.length;o>++a;)(e=t[a].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,n*=n,r?Math.ma
 x(n*u*p/r,r/(n*i*p)):1/0}function u(t,n,e,r){var u,i=-1,a=t.length,o=e.x,l=e.y,f=n?c(t.area/n):0;if(n==e.dx){for((r||f>e.dy)&&(f=e.dy);a>++i;)u=t[i],u.x=o,u.y=l,u.dy=f,o+=u.dx=Math.min(e.x+e.dx-o,f?c(u.area/f):0);u.z=!0,u.dx+=e.x+e.dx-o,e.y+=f,e.dy-=f}else{for((r||f>e.dx)&&(f=e.dx);a>++i;)u=t[i],u.x=o,u.y=l,u.dx=f,l+=u.dy=Math.min(e.y+e.dy-l,f?c(u.area/f):0);u.z=!1,u.dy+=e.y+e.dy-l,e.x+=f,e.dx-=f}}function i(r){var u=a||o(r),i=u[0];return i.x=0,i.y=0,i.dx=l[0],i.dy=l[1],a&&o.revalue(i),t([i],i.dx*i.dy/i.value),(a?e:n)(i),h&&(a=u),u}var a,o=Ci.layout.hierarchy(),c=Math.round,l=[1,1],f=null,s=Pr,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));return i.size=function(t){return arguments.length?(l=t,i):l},i.padding=function(t){function n(n){var e=t.call(i,n,n.depth);return null==e?Pr(n):Rr(n,"number"==typeof e?[e,e,e,e]:e)}function e(n){return Rr(n,t)}if(!arguments.length)return f;var r;return s=null==(f=t)?Pr:"function"==(r=typeof t)?n:"number"===r?(t=[t,t,t,t],e):e,i},i.round=function(t){retur
 n arguments.length?(c=t?Math.round:Number,i):c!=Number},i.sticky=function(t){return arguments.length?(h=t,a=null,i):h},i.ratio=function(t){return arguments.length?(p=t,i):p},i.mode=function(t){return arguments.length?(g=t+"",i):g},lr(i,o)},Ci.csv=Or(",","text/csv"),Ci.tsv=Or("	","text/tab-separated-values"),Ci.geo={},Ci.geo.stream=function(t,n){ao.hasOwnProperty(t.type)?ao[t.type](t,n):Yr(t,n)};var ao={Feature:function(t,n){Yr(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,u=e.length;u>++r;)Yr(e[r].geometry,n)}},oo={Sphere:function(t,n){n.sphere()},Point:function(t,n){var e=t.coordinates;n.point(e[0],e[1])},MultiPoint:function(t,n){for(var e,r=t.coordinates,u=-1,i=r.length;i>++u;)e=r[u],n.point(e[0],e[1])},LineString:function(t,n){Ur(t.coordinates,n,0)},MultiLineString:function(t,n){for(var e=t.coordinates,r=-1,u=e.length;u>++r;)Ur(e[r],n,0)},Polygon:function(t,n){Ir(t.coordinates,n)},MultiPolygon:function(t,n){for(var e=t.coordinates,r=-1,u=e.length;u>++r;
 )Ir(e[r],n)},GeometryCollection:function(t,n){for(var e=t.geometries,r=-1,u=e.length;u>++r;)Yr(e[r],n)}};Ci.geo.albersUsa=function(){function t(t){return n(t)(t)}function n(t){var n=t[0],a=t[1];return a>50?r:-140>n?u:21>a?i:e}var e=Ci.geo.albers(),r=Ci.geo.albers().rotate([160,0]).center([0,60]).parallels([55,65]),u=Ci.geo.albers().rotate([160,0]).center([0,20]).parallels([8,18]),i=Ci.geo.albers().rotate([60,0]).center([0,10]).parallels([8,18]);return t.scale=function(n){return arguments.length?(e.scale(n),r.scale(.6*n),u.scale(n),i.scale(1.5*n),t.translate(e.translate())):e.scale()},t.translate=function(n){if(!arguments.length)return e.translate();var a=e.scale(),o=n[0],c=n[1];return e.translate(n),r.translate([o-.4*a,c+.17*a]),u.translate([o-.19*a,c+.2*a]),i.translate([o+.58*a,c+.43*a]),t},t.scale(e.scale())},(Ci.geo.albers=function(){var t=29.5*zi,n=45.5*zi,e=Hu(Qr),r=e(t,n);return r.parallels=function(r){return arguments.length?e(t=r[0]*zi,n=r[1]*zi):[t*Di,n*Di]},r.rotate([98,0]
 ).center([0,38]).scale(1e3)}).raw=Qr;var co=Uu(function(t){return Math.sqrt(2/(1+t))},function(t){return 2*Math.asin(t/2)});(Ci.geo.azimuthalEqualArea=function(){return Fu(co)}).raw=co;var lo=Uu(function(t){var n=Math.acos(t);return n&&n/Math.sin(n)},a);(Ci.geo.azimuthalEquidistant=function(){return Fu(lo)}).raw=lo,Ci.geo.bounds=tu(a),Ci.geo.centroid=function(t){fo=so=ho=go=po=0,Ci.geo.stream(t,mo);var n;return so&&Math.abs(n=Math.sqrt(ho*ho+go*go+po*po))>qi?[Math.atan2(go,ho)*Di,Math.asin(Math.max(-1,Math.min(1,po/n)))*Di]:void 0};var fo,so,ho,go,po,mo={sphere:function(){2>fo&&(fo=2,so=ho=go=po=0)},point:nu,lineStart:ru,lineEnd:uu,polygonStart:function(){2>fo&&(fo=2,so=ho=go=po=0),mo.lineStart=eu},polygonEnd:function(){mo.lineStart=ru}};Ci.geo.circle=function(){function t(){var t="function"==typeof r?r.apply(this,arguments):r,n=Pu(-t[0]*zi,-t[1]*zi,0).invert,u=[];return e(null,null,1,{point:function(t,e){u.push(t=n(t,e)),t[0]*=Di,t[1]*=Di}}),{type:"Polygon",coordinates:[u]}}var n,e
 ,r=[0,0],u=6;return t.origin=function(n){return arguments.length?(r=n,t):r},t.angle=function(r){return arguments.length?(e=iu((n=+r)*zi,u*zi),t):n},t.precision=function(r){return arguments.length?(e=iu(n*zi,(u=+r)*zi),t):u},t.angle(90)};var vo=ou(o,pu,mu);(Ci.geo.equirectangular=function(){return Fu(Mu).scale(250/Ti)}).raw=Mu.invert=Mu;var yo=Uu(function(t){return 1/t},Math.atan);(Ci.geo.gnomonic=function(){return Fu(yo)}).raw=yo,Ci.geo.graticule=function(){function t(){return{type:"MultiLineString",coordinates:n()}}function n(){return Ci.range(Math.ceil(r/c)*c,e,c).map(a).concat(Ci.range(Math.ceil(i/l)*l,u,l).map(o))}var e,r,u,i,a,o,c=22.5,l=c,f=2.5;return t.lines=function(){return n().map(function(t){return{type:"LineString",coordinates:t}})},t.outline=function(){return{type:"Polygon",coordinates:[a(r).concat(o(u).slice(1),a(e).reverse().slice(1),o(i).reverse().slice(1))]}},t.extent=function(n){return arguments.length?(r=+n[0][0],e=+n[1][0],i=+n[0][1],u=+n[1][1],r>e&&(n=r,r=e,e=n)
 ,i>u&&(n=i,i=u,u=n),t.precision(f)):[[r,i],[e,u]]},t.step=function(n){return arguments.length?(c=+n[0],l=+n[1],t):[c,l]},t.precision=function(n){return arguments.length?(f=+n,a=bu(i,u,f),o=xu(r,e,f),t):f},t.extent([[-180+qi,-90+qi],[180-qi,90-qi]])},Ci.geo.interpolate=function(t,n){return wu(t[0]*zi,t[1]*zi,n[0]*zi,n[1]*zi)},Ci.geo.greatArc=function(){function e(){for(var t=r||a.apply(this,arguments),n=u||o.apply(this,arguments),e=i||Ci.geo.interpolate(t,n),l=0,f=c/e.distance,s=[t];1>(l+=f);)s.push(e(l));return s.push(n),{type:"LineString",coordinates:s}}var r,u,i,a=n,o=t,c=6*zi;return e.distance=function(){return(i||Ci.geo.interpolate(r||a.apply(this,arguments),u||o.apply(this,arguments))).distance},e.source=function(t){return arguments.length?(a=t,r="function"==typeof t?null:t,i=r&&u?Ci.geo.interpolate(r,u):null,e):a},e.target=function(t){return arguments.length?(o=t,u="function"==typeof t?null:t,i=r&&u?Ci.geo.interpolate(r,u):null,e):o},e.precision=function(t){return arguments.le
 ngth?(c=t*zi,e):c/zi},e},Su.invert=function(t,n){return[2*Ti*t,2*Math.atan(Math.exp(2*Ti*n))-Ti/2]},(Ci.geo.mercator=function(){return Fu(Su).scale(500)}).raw=Su;var Mo=Uu(function(){return 1},Math.asin);(Ci.geo.orthographic=function(){return Fu(Mo)}).raw=Mo,Ci.geo.path=function(){function t(t){return t&&Ci.geo.stream(t,r(u.pointRadius("function"==typeof i?+i.apply(this,arguments):i))),u.result()}var n,e,r,u,i=4.5;return t.area=function(t){return bo=0,Ci.geo.stream(t,r(_o)),bo},t.centroid=function(t){return fo=ho=go=po=0,Ci.geo.stream(t,r(wo)),po?[ho/po,go/po]:void 0},t.bounds=function(t){return tu(r)(t)},t.projection=function(e){return arguments.length?(r=(n=e)?e.stream||Eu(e):a,t):n},t.context=function(n){return arguments.length?(u=null==(e=n)?new Au:new Nu(n),t):e},t.pointRadius=function(n){return arguments.length?(i="function"==typeof n?n:+n,t):i},t.projection(Ci.geo.albersUsa()).context(null)};var bo,xo,_o={point:Pn,lineStart:Pn,lineEnd:Pn,polygonStart:function(){xo=0,_o.lineSt
 art=Tu},polygonEnd:function(){_o.lineStart=_o.lineEnd=_o.point=Pn,bo+=Math.abs(xo/2)}},wo={point:qu,lineStart:Cu,lineEnd:zu,polygonStart:function(){wo.lineStart=Du},polygonEnd:function(){wo.point=qu,wo.lineStart=Cu,wo.lineEnd=zu}};Ci.geo.area=function(t){return So=0,Ci.geo.stream(t,Ao),So};var So,ko,Eo,Ao={sphere:function(){So+=4*Ti},point:Pn,lineStart:Pn,lineEnd:Pn,polygonStart:function(){ko=1,Eo=0,Ao.lineStart=Lu},polygonEnd:function(){var t=2*Math.atan2(Eo,ko);So+=0>t?4*Ti+t:t,Ao.lineStart=Ao.lineEnd=Ao.point=Pn}};Ci.geo.projection=Fu,Ci.geo.projectionMutator=Hu;var No=Uu(function(t){return 1/(1+t)},function(t){return 2*Math.atan(t)});(Ci.geo.stereographic=function(){return Fu(No)}).raw=No,Ci.geom={},Ci.geom.hull=function(t){if(3>t.length)return[];var n,e,r,u,i,a,o,c,l,f,s=t.length,h=s-1,g=[],p=[],d=0;for(n=1;s>n;++n)t[n][1]<t[d][1]?d=n:t[n][1]==t[d][1]&&(d=t[n][0]<t[d][0]?n:d);for(n=0;s>n;++n)n!==d&&(u=t[n][1]-t[d][1],r=t[n][0]-t[d][0],g.push({angle:Math.atan2(u,r),index:n}));fo
 r(g.sort(function(t,n){return t.angle-n.angle}),l=g[0].angle,c=g[0].index,o=0,n=1;h>n;++n)e=g[n].index,l==g[n].angle?(r=t[c][0]-t[d][0],u=t[c][1]-t[d][1],i=t[e][0]-t[d][0],a=t[e][1]-t[d][1],r*r+u*u>=i*i+a*a?g[n].index=-1:(g[o].index=-1,l=g[n].angle,o=n,c=e)):(l=g[n].angle,o=n,c=e);for(p.push(d),n=0,e=0;2>n;++e)-1!==g[e].index&&(p.push(g[e].index),n++);for(f=p.length;h>e;++e)if(-1!==g[e].index){for(;!Iu(p[f-2],p[f-1],g[e].index,t);)--f;p[f++]=g[e].index}var m=[];for(n=0;f>n;++n)m.push(t[p[n]]);return m},Ci.geom.polygon=function(t){return t.area=function(){for(var n=0,e=t.length,r=t[e-1][1]*t[0][0]-t[e-1][0]*t[0][1];e>++n;)r+=t[n-1][1]*t[n][0]-t[n-1][0]*t[n][1];return.5*r},t.centroid=function(n){var e,r,u=-1,i=t.length,a=0,o=0,c=t[i-1];for(arguments.length||(n=-1/(6*t.area()));i>++u;)e=c,c=t[u],r=e[0]*c[1]-c[0]*e[1],a+=(e[0]+c[0])*r,o+=(e[1]+c[1])*r;return[a*n,o*n]},t.clip=function(n){for(var e,r,u,i,a,o,c=-1,l=t.length,f=t[l-1];l>++c;){for(e=n.slice(),n.length=0,i=t[c],a=e[(u=e.lengt
 h)-1],r=-1;u>++r;)o=e[r],Vu(o,f,i)?(Vu(a,f,i)||n.push(Zu(a,o,f,i)),n.push(o)):Vu(a,f,i)&&n.push(Zu(a,o,f,i)),a=o;f=i}return n},t},Ci.geom.voronoi=function(t){var n=t.map(function(){return[]}),e=1e6;return Xu(t,function(t){var r,u,i,a,o,c;1===t.a&&t.b>=0?(r=t.ep.r,u=t.ep.l):(r=t.ep.l,u=t.ep.r),1===t.a?(o=r?r.y:-e,i=t.c-t.b*o,c=u?u.y:e,a=t.c-t.b*c):(i=r?r.x:-e,o=t.c-t.a*i,a=u?u.x:e,c=t.c-t.a*a);var l=[i,o],f=[a,c];n[t.region.l.index].push(l,f),n[t.region.r.index].push(l,f)}),n=n.map(function(n,e){var r=t[e][0],u=t[e][1],i=n.map(function(t){return Math.atan2(t[0]-r,t[1]-u)}),a=Ci.range(n.length).sort(function(t,n){return i[t]-i[n]});return a.filter(function(t,n){return!n||i[t]-i[a[n-1]]>qi}).map(function(t){return n[t]})}),n.forEach(function(n,r){var u=n.length;if(!u)return n.push([-e,-e],[-e,e],[e,e],[e,-e]);if(!(u>2)){var i=t[r],a=n[0],o=n[1],c=i[0],l=i[1],f=a[0],s=a[1],h=o[0],g=o[1],p=Math.abs(h-f),d=g-s;if(qi>Math.abs(d)){var m=s>l?-e:e;n.push([-e,m],[e,m])}else if(qi>p){var v=f>c?
 -e:e;n.push([v,-e],[v,e])}else{var m=(f-c)*(g-s)>(h-f)*(s-l)?e:-e,y=Math.abs(d)-p;qi>Math.abs(y)?n.push([0>d?m:-m,m]):(y>0&&(m*=-1),n.push([-e,m],[e,m]))}}}),n};var To={l:"r",r:"l"};Ci.geom.delaunay=function(t){var n=t.map(function(){return[]}),e=[];return Xu(t,function(e){n[e.region.l.index].push(t[e.region.r.index])}),n.forEach(function(n,r){var u=t[r],i=u[0],a=u[1];n.forEach(function(t){t.angle=Math.atan2(t[0]-i,t[1]-a)}),n.sort(function(t,n){return t.angle-n.angle});for(var o=0,c=n.length-1;c>o;o++)e.push([u,n[o],n[o+1]])}),e},Ci.geom.quadtree=function(t,n,e,r,u){function i(t,n,e,r,u,i){if(!isNaN(n.x)&&!isNaN(n.y))if(t.leaf){var o=t.point;o?.01>Math.abs(o.x-n.x)+Math.abs(o.y-n.y)?a(t,n,e,r,u,i):(t.point=null,a(t,o,e,r,u,i),a(t,n,e,r,u,i)):t.point=n}else a(t,n,e,r,u,i)}function a(t,n,e,r,u,a){var o=.5*(e+u),c=.5*(r+a),l=n.x>=o,f=n.y>=c,s=(f<<1)+l;t.leaf=!1,t=t.nodes[s]||(t.nodes[s]=Bu()),l?e=o:u=o,f?r=c:a=c,i(t,n,e,r,u,a)}var o,c=-1,l=t.length;if(5>arguments.length)if(3===argumen
 ts.length)u=e,r=n,e=n=0;else for(n=e=1/0,r=u=-1/0;l>++c;)o=t[c],n>o.x&&(n=o.x),e>o.y&&(e=o.y),o.x>r&&(r=o.x),o.y>u&&(u=o.y);var f=r-n,s=u-e;f>s?u=e+f:r=n+s;var h=Bu();return h.add=function(t){i(h,t,n,e,r,u)},h.visit=function(t){$u(t,h,n,e,r,u)},t.forEach(h.add),h},Ci.time={};var qo=Date,Co=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];Ju.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){zo.setUTCDate.apply(this._,arguments)},setDay:function(){zo
 .setUTCDay.apply(this._,arguments)},setFullYear:function(){zo.setUTCFullYear.apply(this._,arguments)},setHours:function(){zo.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){zo.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){zo.setUTCMinutes.apply(this._,arguments)},setMonth:function(){zo.setUTCMonth.apply(this._,arguments)},setSeconds:function(){zo.setUTCSeconds.apply(this._,arguments)},setTime:function(){zo.setTime.apply(this._,arguments)}};var zo=Date.prototype,Do="%a %b %e %X %Y",Lo="%m/%d/%Y",Fo="%H:%M:%S",Ho=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],jo=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Po=["January","February","March","April","May","June","July","August","September","October","November","December"],Ro=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];Ci.time.format=function(t){function n(n){for(var r,u,i,a=[],o=-1,c=0;e>++o;)37===t.charCodeAt(o)&&(a.push(t.substring(c,o)),null!=(u
 =Xo[r=t.charAt(++o)])&&(r=t.charAt(++o)),(i=Bo[r])&&(r=i(n,null==u?"e"===r?" ":"0":u)),a.push(r),c=o+1);return a.push(t.substring(c,o)),a.join("")}var e=t.length;return n.parse=function(n){var e={y:1900,m:0,d:1,H:0,M:0,S:0,L:0},r=Gu(e,t,n,0);if(r!=n.length)return null;"p"in e&&(e.H=e.H%12+12*e.p);var u=new qo;return u.setFullYear(e.y,e.m,e.d),u.setHours(e.H,e.M,e.S,e.L),u},n.toString=function(){return t},n};var Oo=Ku(Ho),Yo=Ku(jo),Uo=Ku(Po),Io=Wu(Po),Vo=Ku(Ro),Zo=Wu(Ro),Xo={"-":"",_:" ",0:"0"},Bo={a:function(t){return jo[t.getDay()]},A:function(t){return Ho[t.getDay()]},b:function(t){return Ro[t.getMonth()]},B:function(t){return Po[t.getMonth()]},c:Ci.time.format(Do),d:function(t,n){return Qu(t.getDate(),n,2)},e:function(t,n){return Qu(t.getDate(),n,2)},H:function(t,n){return Qu(t.getHours(),n,2)},I:function(t,n){return Qu(t.getHours()%12||12,n,2)},j:function(t,n){return Qu(1+Ci.time.dayOfYear(t),n,3)},L:function(t,n){return Qu(t.getMilliseconds(),n,3)},m:function(t,n){return Qu(t.g
 etMonth()+1,n,2)},M:function(t,n){return Qu(t.getMinutes(),n,2)},p:function(t){return t.getHours()>=12?"PM":"AM"},S:function(t,n){return Qu(t.getSeconds(),n,2)},U:function(t,n){return Qu(Ci.time.sundayOfYear(t),n,2)},w:function(t){return t.getDay()},W:function(t,n){return Qu(Ci.time.mondayOfYear(t),n,2)},x:Ci.time.format(Lo),X:Ci.time.format(Fo),y:function(t,n){return Qu(t.getFullYear()%100,n,2)},Y:function(t,n){return Qu(t.getFullYear()%1e4,n,4)},Z:vi,"%":function(){return"%"}},$o={a:ti,A:ni,b:ei,B:ri,c:ui,d:si,e:si,H:hi,I:hi,L:di,m:fi,M:gi,p:mi,S:pi,x:ii,X:ai,y:ci,Y:oi},Jo=/^\s*\d+/,Go=Ci.map({am:0,pm:1});Ci.time.format.utc=function(t){function n(t){try{qo=Ju;var n=new qo;return n._=t,e(n)}finally{qo=Date}}var e=Ci.time.format(t);return n.parse=function(t){try{qo=Ju;var n=e.parse(t);return n&&n._}finally{qo=Date}},n.toString=e.toString,n};var Ko=Ci.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");Ci.time.format.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?yi:Ko,yi
 .parse=function(t){var n=new Date(t);return isNaN(n)?null:n},yi.toString=Ko.toString,Ci.time.second=Mi(function(t){return new qo(1e3*Math.floor(t/1e3))},function(t,n){t.setTime(t.getTime()+1e3*Math.floor(n))},function(t){return t.getSeconds()}),Ci.time.seconds=Ci.time.second.range,Ci.time.seconds.utc=Ci.time.second.utc.range,Ci.time.minute=Mi(function(t){return new qo(6e4*Math.floor(t/6e4))},function(t,n){t.setTime(t.getTime()+6e4*Math.floor(n))},function(t){return t.getMinutes()}),Ci.time.minutes=Ci.time.minute.range,Ci.time.minutes.utc=Ci.time.minute.utc.range,Ci.time.hour=Mi(function(t){var n=t.getTimezoneOffset()/60;return new qo(36e5*(Math.floor(t/36e5-n)+n))},function(t,n){t.setTime(t.getTime()+36e5*Math.floor(n))},function(t){return t.getHours()}),Ci.time.hours=Ci.time.hour.range,Ci.time.hours.utc=Ci.time.hour.utc.range,Ci.time.day=Mi(function(t){var n=new qo(1970,0);return n.setFullYear(t.getFullYear(),t.getMonth(),t.getDate()),n},function(t,n){t.setDate(t.getDate()+n)},func
 tion(t){return t.getDate()-1}),Ci.time.days=Ci.time.day.range,Ci.time.days.utc=Ci.time.day.utc.range,Ci.time.dayOfYear=function(t){var n=Ci.time.year(t);return Math.floor((t-n-6e4*(t.getTimezoneOffset()-n.getTimezoneOffset()))/864e5)},Co.forEach(function(t,n){t=t.toLowerCase(),n=7-n;var e=Ci.time[t]=Mi(function(t){return(t=Ci.time.day(t)).setDate(t.getDate()-(t.getDay()+n)%7),t},function(t,n){t.setDate(t.getDate()+7*Math.floor(n))},function(t){var e=Ci.time.year(t).getDay();return Math.floor((Ci.time.dayOfYear(t)+(e+n)%7)/7)-(e!==n)});Ci.time[t+"s"]=e.range,Ci.time[t+"s"].utc=e.utc.range,Ci.time[t+"OfYear"]=function(t){var e=Ci.time.year(t).getDay();return Math.floor((Ci.time.dayOfYear(t)+(e+n)%7)/7)}}),Ci.time.week=Ci.time.sunday,Ci.time.weeks=Ci.time.sunday.range,Ci.time.weeks.utc=Ci.time.sunday.utc.range,Ci.time.weekOfYear=Ci.time.sundayOfYear,Ci.time.month=Mi(function(t){return t=Ci.time.day(t),t.setDate(1),t},function(t,n){t.setMonth(t.getMonth()+n)},function(t){return t.getMon
 th()}),Ci.time.months=Ci.time.month.range,Ci.time.months.utc=Ci.time.month.utc.range,Ci.time.year=Mi(function(t){return t=Ci.time.day(t),t.setMonth(0,1),t},function(t,n){t.setFullYear(t.getFullYear()+n)},function(t){return t.getFullYear()}),Ci.time.years=Ci.time.year.range,Ci.time.years.utc=Ci.time.year.utc.range;var Wo=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Qo=[[Ci.time.second,1],[Ci.time.second,5],[Ci.time.second,15],[Ci.time.second,30],[Ci.time.minute,1],[Ci.time.minute,5],[Ci.time.minute,15],[Ci.time.minute,30],[Ci.time.hour,1],[Ci.time.hour,3],[Ci.time.hour,6],[Ci.time.hour,12],[Ci.time.day,1],[Ci.time.day,2],[Ci.time.week,1],[Ci.time.month,1],[Ci.time.month,3],[Ci.time.year,1]],tc=[[Ci.time.format("%Y"),o],[Ci.time.format("%B"),function(t){return t.getMonth()}],[Ci.time.format("%b %d"),function(t){return 1!=t.getDate()}],[Ci.time.format("%a %d"),function(t){return t.getDay()&&1!=t.getDate()}],[Ci.time.format("%I %p"
 ),function(t){return t.getHours()}],[Ci.time.format("%I:%M"),function(t){return t.getMinutes()}],[Ci.time.format(":%S"),function(t){return t.getSeconds()}],[Ci.time.format(".%L"),function(t){return t.getMilliseconds()}]],nc=Ci.scale.linear(),ec=Si(tc);Qo.year=function(t,n){return nc.domain(t.map(Ei)).ticks(n).map(ki)},Ci.time.scale=function(){return xi(Ci.scale.linear(),Qo,ec)};var rc=Qo.map(function(t){return[t[0].utc,t[1]]}),uc=[[Ci.time.format.utc("%Y"),o],[Ci.time.format.utc("%B"),function(t){return t.getUTCMonth()}],[Ci.time.format.utc("%b %d"),function(t){return 1!=t.getUTCDate()}],[Ci.time.format.utc("%a %d"),function(t){return t.getUTCDay()&&1!=t.getUTCDate()}],[Ci.time.format.utc("%I %p"),function(t){return t.getUTCHours()}],[Ci.time.format.utc("%I:%M"),function(t){return t.getUTCMinutes()}],[Ci.time.format.utc(":%S"),function(t){return t.getUTCSeconds()}],[Ci.time.format.utc(".%L"),function(t){return t.getUTCMilliseconds()}]],ic=Si(uc);return rc.year=function(t,n){return n
 c.domain(t.map(Ni)).ticks(n).map(Ai)},Ci.time.scale.utc=function(){return xi(Ci.scale.linear(),rc,ic)},Ci}();
\ No newline at end of file
diff --git a/src/main/resources/web/js/rs/libs/d3js/topojson.v1.min.js b/src/main/resources/web/js/rs/libs/d3js/topojson.v1.min.js
new file mode 100644
index 0000000..6ebef9a
--- /dev/null
+++ b/src/main/resources/web/js/rs/libs/d3js/topojson.v1.min.js
@@ -0,0 +1,2 @@
+// https://github.com/topojson/topojson-client Version 1.8.0. Copyright 2016 Mike Bostock.
+!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(n.topojson=n.topojson||{})}(this,function(n){"use strict";function t(n){if(!n)return h;var t,r,e=n.scale[0],o=n.scale[1],i=n.translate[0],u=n.translate[1];return function(n,f){f||(t=r=0),n[0]=(t+=n[0])*e+i,n[1]=(r+=n[1])*o+u}}function r(n){if(!n)return h;var t,r,e=n.scale[0],o=n.scale[1],i=n.translate[0],u=n.translate[1];return function(n,f){f||(t=r=0);var c=Math.round((n[0]-i)/e),a=Math.round((n[1]-u)/o);n[0]=c-t,n[1]=a-r,t=c,r=a}}function e(n,t){for(var r,e=n.length,o=e-t;o<--e;)r=n[o],n[o++]=n[e],n[e]=r}function o(n,t){for(var r=0,e=n.length;r<e;){var o=r+e>>>1;n[o]<t?r=o+1:e=o}return r}function i(n,t){var r={type:"Feature",id:t.id,properties:t.properties||{},geometry:u(n,t)};return null==t.id&&delete r.id,r}function u(n,r){function o(n,t){t.length&&t.pop();for(var r,o=l[n<0?~n:n],i=0,u=o.length;i<u;++i)t.push(r=o[i].slice()),s(r,i);n<0&&e(t
 ,u)}function i(n){return n=n.slice(),s(n,0),n}function u(n){for(var t=[],r=0,e=n.length;r<e;++r)o(n[r],t);return t.length<2&&t.push(t[0].slice()),t}function f(n){for(var t=u(n);t.length<4;)t.push(t[0].slice());return t}function c(n){return n.map(f)}function a(n){var t=n.type;return"GeometryCollection"===t?{type:t,geometries:n.geometries.map(a)}:t in h?{type:t,coordinates:h[t](n)}:null}var s=t(n.transform),l=n.arcs,h={Point:function(n){return i(n.coordinates)},MultiPoint:function(n){return n.coordinates.map(i)},LineString:function(n){return u(n.arcs)},MultiLineString:function(n){return n.arcs.map(u)},Polygon:function(n){return c(n.arcs)},MultiPolygon:function(n){return n.arcs.map(c)}};return a(r)}function f(n,t,r){function e(n){var t=n<0?~n:n;(a[t]||(a[t]=[])).push({i:n,g:c})}function o(n){n.forEach(e)}function i(n){n.forEach(o)}function u(n){"GeometryCollection"===n.type?n.geometries.forEach(u):n.type in s&&(c=n,s[n.type](n.arcs))}var f=[];if(arguments.length>1){var c,a=[],s={LineSt
 ring:o,MultiLineString:i,Polygon:i,MultiPolygon:function(n){n.forEach(i)}};u(t),a.forEach(arguments.length<3?function(n){f.push(n[0].i)}:function(n){r(n[0].g,n[n.length-1].g)&&f.push(n[0].i)})}else for(var l=0,h=n.arcs.length;l<h;++l)f.push(l);return{type:"MultiLineString",arcs:v(n,f)}}function c(n){var t=n[0],r=n[1],e=n[2];return Math.abs((t[0]-e[0])*(r[1]-t[1])-(t[0]-r[0])*(e[1]-t[1]))}function a(n){for(var t,r=-1,e=n.length,o=n[e-1],i=0;++r<e;)t=o,o=n[r],i+=t[0]*o[1]-t[1]*o[0];return i/2}function s(n,t){function r(n){n.forEach(function(t){t.forEach(function(t){(o[t=t<0?~t:t]||(o[t]=[])).push(n)})}),i.push(n)}function e(t){return Math.abs(a(u(n,{type:"Polygon",arcs:[t]}).coordinates[0]))}var o={},i=[],f=[];return t.forEach(function(n){"Polygon"===n.type?r(n.arcs):"MultiPolygon"===n.type&&n.arcs.forEach(r)}),i.forEach(function(n){if(!n._){var t=[],r=[n];for(n._=1,f.push(t);n=r.pop();)t.push(n),n.forEach(function(n){n.forEach(function(n){o[n<0?~n:n].forEach(function(n){n._||(n._=1,r
 .push(n))})})})}}),i.forEach(function(n){delete n._}),{type:"MultiPolygon",arcs:f.map(function(t){var r,i=[];if(t.forEach(function(n){n.forEach(function(n){n.forEach(function(n){o[n<0?~n:n].length<2&&i.push(n)})})}),i=v(n,i),(r=i.length)>1)for(var u,f,c=1,a=e(i[0]);c<r;++c)(u=e(i[c]))>a&&(f=i[0],i[0]=i[c],i[c]=f,a=u);return i})}}function l(n,t){return n[1][2]-t[1][2]}var h=function(){},p=function(n,t){return"GeometryCollection"===t.type?{type:"FeatureCollection",features:t.geometries.map(function(t){return i(n,t)})}:i(n,t)},v=function(n,t){function r(t){var r,e=n.arcs[t<0?~t:t],o=e[0];return n.transform?(r=[0,0],e.forEach(function(n){r[0]+=n[0],r[1]+=n[1]})):r=e[e.length-1],t<0?[r,o]:[o,r]}function e(n,t){for(var r in n){var e=n[r];delete t[e.start],delete e.start,delete e.end,e.forEach(function(n){o[n<0?~n:n]=1}),f.push(e)}}var o={},i={},u={},f=[],c=-1;return t.forEach(function(r,e){var o,i=n.arcs[r<0?~r:r];i.length<3&&!i[1][0]&&!i[1][1]&&(o=t[++c],t[c]=r,t[e]=o)}),t.forEach(functi
 on(n){var t,e,o=r(n),f=o[0],c=o[1];if(t=u[f])if(delete u[t.end],t.push(n),t.end=c,e=i[c]){delete i[e.start];var a=e===t?t:t.concat(e);i[a.start=t.start]=u[a.end=e.end]=a}else i[t.start]=u[t.end]=t;else if(t=i[c])if(delete i[t.start],t.unshift(n),t.start=f,e=u[f]){delete u[e.end];var s=e===t?t:e.concat(t);i[s.start=e.start]=u[s.end=t.end]=s}else i[t.start]=u[t.end]=t;else t=[n],i[t.start=f]=u[t.end=c]=t}),e(u,i),e(i,u),t.forEach(function(n){o[n<0?~n:n]||f.push([n])}),f},g=function(n){return u(n,f.apply(this,arguments))},d=function(n){return u(n,s.apply(this,arguments))},y=function(n){function t(n,t){n.forEach(function(n){n<0&&(n=~n);var r=i[n];r?r.push(t):i[n]=[t]})}function r(n,r){n.forEach(function(n){t(n,r)})}function e(n,t){"GeometryCollection"===n.type?n.geometries.forEach(function(n){e(n,t)}):n.type in f&&f[n.type](n.arcs,t)}var i={},u=n.map(function(){return[]}),f={LineString:t,MultiLineString:r,Polygon:r,MultiPolygon:function(n,t){n.forEach(function(n){r(n,t)})}};n.forEach(e)
 ;for(var c in i)for(var a=i[c],s=a.length,l=0;l<s;++l)for(var h=l+1;h<s;++h){var p,v=a[l],g=a[h];(p=u[v])[c=o(p,g)]!==g&&p.splice(c,0,g),(p=u[g])[c=o(p,v)]!==v&&p.splice(c,0,v)}return u},m=function(){function n(n,t){for(;t>0;){var r=(t+1>>1)-1,o=e[r];if(l(n,o)>=0)break;e[o._=t]=o,e[n._=t=r]=n}}function t(n,t){for(;;){var r=t+1<<1,i=r-1,u=t,f=e[u];if(i<o&&l(e[i],f)<0&&(f=e[u=i]),r<o&&l(e[r],f)<0&&(f=e[u=r]),u===t)break;e[f._=t]=f,e[n._=t=u]=n}}var r={},e=[],o=0;return r.push=function(t){return n(e[t._=o]=t,o++),o},r.pop=function(){if(!(o<=0)){var n,r=e[0];return--o>0&&(n=e[o],t(e[n._=0]=n,0)),r}},r.remove=function(r){var i,u=r._;if(e[u]===r)return u!==--o&&(i=e[o],(l(i,r)<0?n:t)(e[i._=u]=i,u)),u},r},E=function(n,e){function o(n){f.remove(n),n[1][2]=e(n),f.push(n)}var i=t(n.transform),u=r(n.transform),f=m();return null==e&&(e=c),n.arcs.forEach(function(n){var t,r,c,a,s=[],l=0;for(r=0,c=n.length;r<c;++r)a=n[r],i(n[r]=[a[0],a[1],1/0],r);for(r=1,c=n.length-1;r<c;++r)t=n.slice(r-1,r+2),t[
 1][2]=e(t),s.push(t),f.push(t);for(r=0,c=s.length;r<c;++r)t=s[r],t.previous=s[r-1],t.next=s[r+1];for(;t=f.pop();){var h=t.previous,p=t.next;t[1][2]<l?t[1][2]=l:l=t[1][2],h&&(h.next=p,h[2]=t[2],o(h)),p&&(p.previous=h,p[0]=t[0],o(p))}n.forEach(u)}),n};n.mesh=g,n.meshArcs=f,n.merge=d,n.mergeArcs=s,n.feature=p,n.neighbors=y,n.presimplify=E,Object.defineProperty(n,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/src/main/resources/web/js/rs/libs/datatables/dataTables.Sorting.js b/src/main/resources/web/js/rs/libs/datatables/dataTables.Sorting.js
new file mode 100644
index 0000000..eeea7a0
--- /dev/null
+++ b/src/main/resources/web/js/rs/libs/datatables/dataTables.Sorting.js
@@ -0,0 +1,162 @@
+var loadSortingExtensions = function(){
+    /**
+     * Atlas renders speed as MiB/s, KiB/sec, etc - which as a string does
+     * not sort nicely at all. This sorting plugin fixes that by converting
+     * the speeds back into a raw Bytes value, and then sorting. It is based
+     * on two different versions of the datatabes file-size sorting plugin -
+     * https://datatables.net/plug-ins/sorting/file-size - the latest edition
+     * that has superior matching, and a very old version from 2011 that works
+     * with the version of datatables that Atlas runs on.
+     *  @name File size
+     *  @author mhenderson
+     */
+
+    var getBytesFromString = function(xstring,ystring){
+        var xmatches = xstring.match( /(\d+(?:\.\d+)?)\s*([a-z]+)/i );
+        var ymatches = ystring.match( /(\d+(?:\.\d+)?)\s*([a-z]+)/i );
+        var multipliers = {
+            b:  1,
+            bytes: 1,
+            kb: 1000,
+            kib: 1024,
+            mb: 1000000,
+            mib: 1048576,
+            gb: 1000000000,
+            gib: 1073741824,
+            tb: 1000000000000,
+            tib: 1099511627776,
+            pb: 1000000000000000,
+            pib: 1125899906842624
+        };
+    
+        var x = xmatches[1];
+        if (xmatches){
+            x = x * multipliers[xmatches[2].toLowerCase()];
+        }
+        var y = ymatches[1]; 
+        if (ymatches) {
+            y = y * multipliers[ymatches[2].toLowerCase()];
+        }
+
+        return [x,y]
+    }
+
+    jQuery.extend( jQuery.fn.dataTableExt.oSort, {
+        "file-size-asc": function ( a, b ) {
+            var raw = getBytesFromString(a,b)
+            var x = raw[0]
+            var y = raw[1]
+            return ((x < y) ? -1 : ((x > y) ?  1 : 0));
+        },
+
+        "file-size-desc": function ( a, b ) {
+            var raw = getBytesFromString(a,b)
+            var x = raw[0]
+            var y = raw[1]          
+            return ((x < y) ?  1 : ((x > y) ? -1 : 0));
+        }
+    } );
+    /**
+     * Sorts a column containing IP addresses (IPv4 and IPv6) in typical dot
+     * notation / colon. This can be most useful when using DataTables for a
+     * networking application, and reporting information containing IP address.
+     *
+     *  @name IP addresses
+     *  @summary Sort IP addresses numerically
+     *  @author Dominique Fournier
+     *  @author Brad Wasson
+     *
+     *  @example
+     *    $('#example').dataTable( {
+     *       columnDefs: [
+     *         { type: 'ip-address', targets: 0 }
+     *       ]
+     *    } );
+     */
+
+    jQuery.extend( jQuery.fn.dataTableExt.oSort, {
+        "ip-address-pre": function ( a ) {
+            var i, item;
+            var m = a.split("."),
+                n = a.split(":"),
+                x = "",
+                xa = "";
+
+            if (m.length == 4) {
+                // IPV4
+                for(i = 0; i < m.length; i++) {
+                    item = m[i];
+
+                    if(item.length == 1) {
+                        x += "00" + item;
+                    }
+                    else if(item.length == 2) {
+                        x += "0" + item;
+                    }
+                    else {
+                        x += item;
+                    }
+                }
+            }
+            else if (n.length > 0) {
+                // IPV6
+                var count = 0;
+                for(i = 0; i < n.length; i++) {
+                    item = n[i];
+
+                    if (i > 0) {
+                        xa += ":";
+                    }
+
+                    if(item.length === 0) {
+                        count += 0;
+                    }
+                    else if(item.length == 1) {
+                        xa += "000" + item;
+                        count += 4;
+                    }
+                    else if(item.length == 2) {
+                        xa += "00" + item;
+                        count += 4;
+                    }
+                    else if(item.length == 3) {
+                        xa += "0" + item;
+                        count += 4;
+                    }
+                    else {
+                        xa += item;
+                        count += 4;
+                    }
+                }
+
+                // Padding the ::
+                n = xa.split(":");
+                var paddDone = 0;
+
+                for (i = 0; i < n.length; i++) {
+                    item = n[i];
+
+                    if (item.length === 0 && paddDone === 0) {
+                        for (var padding = 0 ; padding < (32-count) ; padding++) {
+                            x += "0";
+                            paddDone = 1;
+                        }
+                    }
+                    else {
+                        x += item;
+                    }
+                }
+            }
+
+            return x;
+        },
+
+        "ip-address-asc": function ( a, b ) {
+            return ((a < b) ? -1 : ((a > b) ? 1 : 0));
+        },
+
+        "ip-address-desc": function ( a, b ) {
+            return ((a < b) ? 1 : ((a > b) ? -1 : 0));
+        }
+    } );
+}
\ No newline at end of file
diff --git a/src/main/resources/web/js/rs/libs/datatables/dataTables.TorStatus.js b/src/main/resources/web/js/rs/libs/datatables/dataTables.TorStatus.js
new file mode 100644
index 0000000..b5319ed
--- /dev/null
+++ b/src/main/resources/web/js/rs/libs/datatables/dataTables.TorStatus.js
@@ -0,0 +1,53 @@
+//	There may be occasions when you wish to filter data presented to
+//	the end user in your own manner, common examples are number range
+//	filtering (in between two numbers) and date range filtering.
+//	DataTables provide an API method to add your own filtering functions,
+//	$.fn.dataTableExt.afnFiltering. This is an array of functions
+//	(push your own onto it) which will will be run at table draw time
+//	to see if a particular row should be included or not.
+
+
+/* Custom filtering function which will filter data in column four between two values */
+
+$.fn.dataTableExt.afnFiltering.push(
+	function( oSettings, aData, iDataIndex ) {
+		var iMin = document.getElementById('bw_from').value * 1;
+		var iMax = document.getElementById('bw_from').value * 1;
+		var iVersion = aData[3] == "-" ? 0 : aData[3]*1;
+
+		if ( iMin == "" && iMax == "" )
+		{
+			return true;
+		}
+        else if ( iMin == "" && iVersion < iMax)
+        {
+            return true;
+        }
+        else if ( iMin < iVersion && "" == iMax )
+        {
+            return true;
+        }
+        else if ( iMin < iVersion && iVersion < iMax )
+        {
+            return true;
+        }
+        return false;
+    }
+);
+
+/*
+$(document).ready(function() {
+    var oTable = $('#example').dataTable();
+
+    $('#min').keyup( function() { oTable.fnDraw(); } );
+    $('#max').keyup( function() { oTable.fnDraw(); } );
+} );
+*/
+
+$.extend( $.fn.dataTableExt.oStdClasses, {
+    "sSortAsc": "header headerSortDown",
+    "sSortDesc": "header headerSortUp",
+    "sSortable": "header"
+} );
+
+
diff --git a/src/main/resources/web/js/rs/libs/datatables/dataTables.bootstrap.js b/src/main/resources/web/js/rs/libs/datatables/dataTables.bootstrap.js
new file mode 100644
index 0000000..76b2a92
--- /dev/null
+++ b/src/main/resources/web/js/rs/libs/datatables/dataTables.bootstrap.js
@@ -0,0 +1,182 @@
+/*! DataTables Bootstrap 3 integration
+ * ©2011-2015 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and
+ * DataTables 1.10 or newer.
+ *
+ * This file sets the defaults and adds options to DataTables to style its
+ * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
+ * for further information.
+ */
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				// Require DataTables, which attaches to jQuery, including
+				// jQuery if needed and have a $ property so we can access the
+				// jQuery object that is used
+				$ = require('datatables')(root, $).$;
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+/* Set the defaults for DataTables initialisation */
+$.extend( true, DataTable.defaults, {
+	dom:
+		"<'row'<'col-sm-6'l><'col-sm-6'f>>" +
+		"<'row'<'col-sm-12'tr>>" +
+		"<'row'<'col-sm-5'i><'col-sm-7'p>>",
+	renderer: 'bootstrap'
+} );
+
+
+/* Default class modification */
+$.extend( DataTable.ext.classes, {
+	sWrapper:      "dataTables_wrapper form-inline dt-bootstrap",
+	sFilterInput:  "form-control input-sm",
+	sLengthSelect: "form-control input-sm",
+	sProcessing:   "dataTables_processing panel panel-default"
+} );
+
+
+/* Bootstrap paging button renderer */
+DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) {
+	var api     = new DataTable.Api( settings );
+	var classes = settings.oClasses;
+	var lang    = settings.oLanguage.oPaginate;
+	var aria = settings.oLanguage.oAria.paginate || {};
+	var btnDisplay, btnClass, counter=0;
+
+	var attach = function( container, buttons ) {
+		var i, ien, node, button;
+		var clickHandler = function ( e ) {
+			e.preventDefault();
+			if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {
+				api.page( e.data.action ).draw( 'page' );
+			}
+		};
+
+		for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
+			button = buttons[i];
+
+			if ( $.isArray( button ) ) {
+				attach( container, button );
+			}
+			else {
+				btnDisplay = '';
+				btnClass = '';
+
+				switch ( button ) {
+					case 'ellipsis':
+						btnDisplay = '&#x2026;';
+						btnClass = 'disabled';
+						break;
+
+					case 'first':
+						btnDisplay = lang.sFirst;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'previous':
+						btnDisplay = lang.sPrevious;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'next':
+						btnDisplay = lang.sNext;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					case 'last':
+						btnDisplay = lang.sLast;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					default:
+						btnDisplay = button + 1;
+						btnClass = page === button ?
+							'active' : '';
+						break;
+				}
+
+				if ( btnDisplay ) {
+					node = $('<li>', {
+							'class': classes.sPageButton+' '+btnClass,
+							'id': idx === 0 && typeof button === 'string' ?
+								settings.sTableId +'_'+ button :
+								null
+						} )
+						.append( $('<a>', {
+								'href': '#',
+								'aria-controls': settings.sTableId,
+								'aria-label': aria[ button ],
+								'data-dt-idx': counter,
+								'tabindex': settings.iTabIndex
+							} )
+							.html( btnDisplay )
+						)
+						.appendTo( container );
+
+					settings.oApi._fnBindAction(
+						node, {action: button}, clickHandler
+					);
+
+					counter++;
+				}
+			}
+		}
+	};
+
+	// IE9 throws an 'unknown error' if document.activeElement is used
+	// inside an iframe or frame. 
+	var activeEl;
+
+	try {
+		// Because this approach is destroying and recreating the paging
+		// elements, focus is lost on the select button which is bad for
+		// accessibility. So we want to restore focus once the draw has
+		// completed
+		activeEl = $(host).find(document.activeElement).data('dt-idx');
+	}
+	catch (e) {}
+
+	attach(
+		$(host).empty().html('<ul class="pagination"/>').children('ul'),
+		buttons
+	);
+
+	if ( activeEl !== undefined ) {
+		$(host).find( '[data-dt-idx='+activeEl+']' ).focus();
+	}
+};
+
+
+return DataTable;
+}));
diff --git a/src/main/resources/web/js/rs/libs/datatables/jquery.dataTables.min.js b/src/main/resources/web/js/rs/libs/datatables/jquery.dataTables.min.js
new file mode 100644
index 0000000..162da34
--- /dev/null
+++ b/src/main/resources/web/js/rs/libs/datatables/jquery.dataTables.min.js
@@ -0,0 +1,164 @@
+/*!
+ DataTables 1.10.16
+ ©2008-2017 SpryMedia Ltd - datatables.net/license
+*/
+(function(h){"function"===typeof define&&define.amd?define(["jquery"],function(E){return h(E,window,document)}):"object"===typeof exports?module.exports=function(E,G){E||(E=window);G||(G="undefined"!==typeof window?require("jquery"):require("jquery")(E));return h(G,E,E.document)}:h(jQuery,window,document)})(function(h,E,G,k){function X(a){var b,c,d={};h.each(a,function(e){if((b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=e.replace(b[0],b[2].toLowerCase()),
+d[c]=e,"o"===b[1]&&X(a[e])});a._hungarianMap=d}function I(a,b,c){a._hungarianMap||X(a);var d;h.each(b,function(e){d=a._hungarianMap[e];if(d!==k&&(c||b[d]===k))"o"===d.charAt(0)?(b[d]||(b[d]={}),h.extend(!0,b[d],b[e]),I(a[d],b[d],c)):b[d]=b[e]})}function Ca(a){var b=m.defaults.oLanguage,c=a.sZeroRecords;!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&F(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&F(a,a,"sZeroRecords","sLoadingRecords");
+a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&cb(a)}function db(a){A(a,"ordering","bSort");A(a,"orderMulti","bSortMulti");A(a,"orderClasses","bSortClasses");A(a,"orderCellsTop","bSortCellsTop");A(a,"order","aaSorting");A(a,"orderFixed","aaSortingFixed");A(a,"paging","bPaginate");A(a,"pagingType","sPaginationType");A(a,"pageLength","iDisplayLength");A(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%":"");"boolean"===typeof a.scrollX&&(a.scrollX=
+a.scrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&I(m.models.oSearch,a[b])}function eb(a){A(a,"orderable","bSortable");A(a,"orderData","aDataSort");A(a,"orderSequence","asSorting");A(a,"orderDataType","sortDataType");var b=a.aDataSort;"number"===typeof b&&!h.isArray(b)&&(a.aDataSort=[b])}function fb(a){if(!m.__browser){var b={};m.__browser=b;var c=h("<div/>").css({position:"fixed",top:0,left:-1*h(E).scrollLeft(),height:1,width:1,overflow:"hidden"}).append(h("<div/>").css({position:"absolute",
+top:1,left:1,width:100,overflow:"scroll"}).append(h("<div/>").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}h.extend(a.oBrowser,m.__browser);a.oScroll.iBarWidth=m.__browser.barWidth}function gb(a,b,c,d,e,f){var g,j=!1;c!==k&&(g=c,j=!0);for(;d!==
+e;)a.hasOwnProperty(d)&&(g=j?b(g,a[d],d,a):a[d],j=!0,d+=f);return g}function Da(a,b){var c=m.defaults.column,d=a.aoColumns.length,c=h.extend({},m.models.oColumn,c,{nTh:b?b:G.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=h.extend({},m.models.oSearch,c[d]);ja(a,d,h(b).data())}function ja(a,b,c){var b=a.aoColumns[b],d=a.oClasses,e=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=
+e.attr("width")||null;var f=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(eb(c),I(m.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),c.sClass&&e.addClass(c.sClass),h.extend(b,c),F(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),F(b,c,"aDataSort"));var g=b.mData,j=Q(g),i=b.mRender?Q(b.mRender):null,c=function(a){return"string"===
+typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=h.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b._setter=null;b.fnGetData=function(a,b,c){var d=j(a,b,k,c);return i&&b?i(d,b,a,c):d};b.fnSetData=function(a,b,c){return R(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=
+d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI)}function Y(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ea(a);for(var c=0,d=b.length;c<d;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;(""!==b.sY||""!==b.sX)&&ka(a);r(a,null,"column-sizing",[a])}function Z(a,b){var c=la(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function $(a,b){var c=
+la(a,"bVisible"),c=h.inArray(b,c);return-1!==c?c:null}function aa(a){var b=0;h.each(a.aoColumns,function(a,d){d.bVisible&&"none"!==h(d.nTh).css("display")&&b++});return b}function la(a,b){var c=[];h.map(a.aoColumns,function(a,e){a[b]&&c.push(e)});return c}function Fa(a){var b=a.aoColumns,c=a.aoData,d=m.ext.type.detect,e,f,g,j,i,h,l,q,t;e=0;for(f=b.length;e<f;e++)if(l=b[e],t=[],!l.sType&&l._sManualType)l.sType=l._sManualType;else if(!l.sType){g=0;for(j=d.length;g<j;g++){i=0;for(h=c.length;i<h;i++){t[i]===
+k&&(t[i]=B(a,i,e,"type"));q=d[g](t[i],a);if(!q&&g!==d.length-1)break;if("html"===q)break}if(q){l.sType=q;break}}l.sType||(l.sType="string")}}function hb(a,b,c,d){var e,f,g,j,i,n,l=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){n=b[e];var q=n.targets!==k?n.targets:n.aTargets;h.isArray(q)||(q=[q]);f=0;for(g=q.length;f<g;f++)if("number"===typeof q[f]&&0<=q[f]){for(;l.length<=q[f];)Da(a);d(q[f],n)}else if("number"===typeof q[f]&&0>q[f])d(l.length+q[f],n);else if("string"===typeof q[f]){j=0;for(i=l.length;j<
+i;j++)("_all"==q[f]||h(l[j].nTh).hasClass(q[f]))&&d(j,n)}}if(c){e=0;for(a=c.length;e<a;e++)d(e,c[e])}}function M(a,b,c,d){var e=a.aoData.length,f=h.extend(!0,{},m.models.oRow,{src:c?"dom":"data",idx:e});f._aData=b;a.aoData.push(f);for(var g=a.aoColumns,j=0,i=g.length;j<i;j++)g[j].sType=null;a.aiDisplayMaster.push(e);b=a.rowIdFn(b);b!==k&&(a.aIds[b]=f);(c||!a.oFeatures.bDeferRender)&&Ga(a,e,c,d);return e}function ma(a,b){var c;b instanceof h||(b=h(b));return b.map(function(b,e){c=Ha(a,e);return M(a,
+c.data,e,c.cells)})}function B(a,b,c,d){var e=a.iDraw,f=a.aoColumns[c],g=a.aoData[b]._aData,j=f.sDefaultContent,i=f.fnGetData(g,d,{settings:a,row:b,col:c});if(i===k)return a.iDrawError!=e&&null===j&&(J(a,0,"Requested unknown parameter "+("function"==typeof f.mData?"{function}":"'"+f.mData+"'")+" for row "+b+", column "+c,4),a.iDrawError=e),j;if((i===g||null===i)&&null!==j&&d!==k)i=j;else if("function"===typeof i)return i.call(g);return null===i&&"display"==d?"":i}function ib(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,
+d,{settings:a,row:b,col:c})}function Ia(a){return h.map(a.match(/(\\.|[^\.])+/g)||[""],function(a){return a.replace(/\\\./g,".")})}function Q(a){if(h.isPlainObject(a)){var b={};h.each(a,function(a,c){c&&(b[a]=Q(c))});return function(a,c,f,g){var j=b[c]||b._;return j!==k?j(a,c,f,g):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,c,f,g){return a(b,c,f,g)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var c=function(a,
+b,f){var g,j;if(""!==f){j=Ia(f);for(var i=0,n=j.length;i<n;i++){f=j[i].match(ba);g=j[i].match(U);if(f){j[i]=j[i].replace(ba,"");""!==j[i]&&(a=a[j[i]]);g=[];j.splice(0,i+1);j=j.join(".");if(h.isArray(a)){i=0;for(n=a.length;i<n;i++)g.push(c(a[i],b,j))}a=f[0].substring(1,f[0].length-1);a=""===a?g:g.join(a);break}else if(g){j[i]=j[i].replace(U,"");a=a[j[i]]();continue}if(null===a||a[j[i]]===k)return k;a=a[j[i]]}}return a};return function(b,e){return c(b,e,a)}}return function(b){return b[a]}}function R(a){if(h.isPlainObject(a))return R(a._);
+if(null===a)return function(){};if("function"===typeof a)return function(b,d,e){a(b,"set",d,e)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var b=function(a,d,e){var e=Ia(e),f;f=e[e.length-1];for(var g,j,i=0,n=e.length-1;i<n;i++){g=e[i].match(ba);j=e[i].match(U);if(g){e[i]=e[i].replace(ba,"");a[e[i]]=[];f=e.slice();f.splice(0,i+1);g=f.join(".");if(h.isArray(d)){j=0;for(n=d.length;j<n;j++)f={},b(f,d[j],g),a[e[i]].push(f)}else a[e[i]]=d;return}j&&(e[i]=e[i].replace(U,
+""),a=a[e[i]](d));if(null===a[e[i]]||a[e[i]]===k)a[e[i]]={};a=a[e[i]]}if(f.match(U))a[f.replace(U,"")](d);else a[f.replace(ba,"")]=d};return function(c,d){return b(c,d,a)}}return function(b,d){b[a]=d}}function Ja(a){return D(a.aoData,"_aData")}function na(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0;a.aIds={}}function oa(a,b,c){for(var d=-1,e=0,f=a.length;e<f;e++)a[e]==b?d=e:a[e]>b&&a[e]--; -1!=d&&c===k&&a.splice(d,1)}function ca(a,b,c,d){var e=a.aoData[b],f,g=function(c,d){for(;c.childNodes.length;)c.removeChild(c.firstChild);
+c.innerHTML=B(a,b,d,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===e.src)e._aData=Ha(a,e,d,d===k?k:e._aData).data;else{var j=e.anCells;if(j)if(d!==k)g(j[d],d);else{c=0;for(f=j.length;c<f;c++)g(j[c],c)}}e._aSortData=null;e._aFilterData=null;g=a.aoColumns;if(d!==k)g[d].sType=null;else{c=0;for(f=g.length;c<f;c++)g[c].sType=null;Ka(a,e)}}function Ha(a,b,c,d){var e=[],f=b.firstChild,g,j,i=0,n,l=a.aoColumns,q=a._rowReadObject,d=d!==k?d:q?{}:[],t=function(a,b){if("string"===typeof a){var c=a.indexOf("@");
+-1!==c&&(c=a.substring(c+1),R(a)(d,b.getAttribute(c)))}},m=function(a){if(c===k||c===i)j=l[i],n=h.trim(a.innerHTML),j&&j._bAttrSrc?(R(j.mData._)(d,n),t(j.mData.sort,a),t(j.mData.type,a),t(j.mData.filter,a)):q?(j._setter||(j._setter=R(j.mData)),j._setter(d,n)):d[i]=n;i++};if(f)for(;f;){g=f.nodeName.toUpperCase();if("TD"==g||"TH"==g)m(f),e.push(f);f=f.nextSibling}else{e=b.anCells;f=0;for(g=e.length;f<g;f++)m(e[f])}if(b=b.firstChild?b:b.nTr)(b=b.getAttribute("id"))&&R(a.rowId)(d,b);return{data:d,cells:e}}
+function Ga(a,b,c,d){var e=a.aoData[b],f=e._aData,g=[],j,i,n,l,q;if(null===e.nTr){j=c||G.createElement("tr");e.nTr=j;e.anCells=g;j._DT_RowIndex=b;Ka(a,e);l=0;for(q=a.aoColumns.length;l<q;l++){n=a.aoColumns[l];i=c?d[l]:G.createElement(n.sCellType);i._DT_CellIndex={row:b,column:l};g.push(i);if((!c||n.mRender||n.mData!==l)&&(!h.isPlainObject(n.mData)||n.mData._!==l+".display"))i.innerHTML=B(a,b,l,"display");n.sClass&&(i.className+=" "+n.sClass);n.bVisible&&!c?j.appendChild(i):!n.bVisible&&c&&i.parentNode.removeChild(i);
+n.fnCreatedCell&&n.fnCreatedCell.call(a.oInstance,i,B(a,b,l),f,b,l)}r(a,"aoRowCreatedCallback",null,[j,f,b])}e.nTr.setAttribute("role","row")}function Ka(a,b){var c=b.nTr,d=b._aData;if(c){var e=a.rowIdFn(d);e&&(c.id=e);d.DT_RowClass&&(e=d.DT_RowClass.split(" "),b.__rowc=b.__rowc?qa(b.__rowc.concat(e)):e,h(c).removeClass(b.__rowc.join(" ")).addClass(d.DT_RowClass));d.DT_RowAttr&&h(c).attr(d.DT_RowAttr);d.DT_RowData&&h(c).data(d.DT_RowData)}}function jb(a){var b,c,d,e,f,g=a.nTHead,j=a.nTFoot,i=0===
+h("th, td",g).length,n=a.oClasses,l=a.aoColumns;i&&(e=h("<tr/>").appendTo(g));b=0;for(c=l.length;b<c;b++)f=l[b],d=h(f.nTh).addClass(f.sClass),i&&d.appendTo(e),a.oFeatures.bSort&&(d.addClass(f.sSortingClass),!1!==f.bSortable&&(d.attr("tabindex",a.iTabIndex).attr("aria-controls",a.sTableId),La(a,f.nTh,b))),f.sTitle!=d[0].innerHTML&&d.html(f.sTitle),Ma(a,"header")(a,d,f,n);i&&da(a.aoHeader,g);h(g).find(">tr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(n.sHeaderTH);h(j).find(">tr>th, >tr>td").addClass(n.sFooterTH);
+if(null!==j){a=a.aoFooter[0];b=0;for(c=a.length;b<c;b++)f=l[b],f.nTf=a[b].cell,f.sClass&&h(f.nTf).addClass(f.sClass)}}function ea(a,b,c){var d,e,f,g=[],j=[],i=a.aoColumns.length,n;if(b){c===k&&(c=!1);d=0;for(e=b.length;d<e;d++){g[d]=b[d].slice();g[d].nTr=b[d].nTr;for(f=i-1;0<=f;f--)!a.aoColumns[f].bVisible&&!c&&g[d].splice(f,1);j.push([])}d=0;for(e=g.length;d<e;d++){if(a=g[d].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=g[d].length;f<b;f++)if(n=i=1,j[d][f]===k){a.appendChild(g[d][f].cell);
+for(j[d][f]=1;g[d+i]!==k&&g[d][f].cell==g[d+i][f].cell;)j[d+i][f]=1,i++;for(;g[d][f+n]!==k&&g[d][f].cell==g[d][f+n].cell;){for(c=0;c<i;c++)j[d+c][f+n]=1;n++}h(g[d][f].cell).attr("rowspan",i).attr("colspan",n)}}}}function N(a){var b=r(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==h.inArray(!1,b))C(a,!1);else{var b=[],c=0,d=a.asStripeClasses,e=d.length,f=a.oLanguage,g=a.iInitDisplayStart,j="ssp"==y(a),i=a.aiDisplay;a.bDrawing=!0;g!==k&&-1!==g&&(a._iDisplayStart=j?g:g>=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=
+-1);var g=a._iDisplayStart,n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(j){if(!a.bDestroying&&!kb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:n;for(j=j?0:g;j<f;j++){var l=i[j],q=a.aoData[l];null===q.nTr&&Ga(a,l);l=q.nTr;if(0!==e){var t=d[c%e];q._sRowStripe!=t&&(h(l).removeClass(q._sRowStripe).addClass(t),q._sRowStripe=t)}r(a,"aoRowCallback",null,[l,q._aData,c,j]);b.push(l);c++}}else c=f.sZeroRecords,1==a.iDraw&&"ajax"==y(a)?c=f.sLoadingRecords:
+f.sEmptyTable&&0===a.fnRecordsTotal()&&(c=f.sEmptyTable),b[0]=h("<tr/>",{"class":e?d[0]:""}).append(h("<td />",{valign:"top",colSpan:aa(a),"class":a.oClasses.sRowEmpty}).html(c))[0];r(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],Ja(a),g,n,i]);r(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],Ja(a),g,n,i]);d=h(a.nTBody);d.children().detach();d.append(h(b));r(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function S(a,b){var c=a.oFeatures,d=c.bFilter;
+c.bSort&&lb(a);d?fa(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;N(a);a._drawHold=!1}function mb(a){var b=a.oClasses,c=h(a.nTable),c=h("<div/>").insertBefore(c),d=a.oFeatures,e=h("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,j,i,n,l,q,k=0;k<f.length;k++){g=null;j=f[k];if("<"==j){i=h("<div/>")[0];
+n=f[k+1];if("'"==n||'"'==n){l="";for(q=2;f[k+q]!=n;)l+=f[k+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(n=l.split("."),i.id=n[0].substr(1,n[0].length-1),i.className=n[1]):"#"==l.charAt(0)?i.id=l.substr(1,l.length-1):i.className=l;k+=q}e.append(i);e=h(i)}else if(">"==j)e=e.parent();else if("l"==j&&d.bPaginate&&d.bLengthChange)g=nb(a);else if("f"==j&&d.bFilter)g=ob(a);else if("r"==j&&d.bProcessing)g=pb(a);else if("t"==j)g=qb(a);else if("i"==j&&d.bInfo)g=rb(a);else if("p"==
+j&&d.bPaginate)g=sb(a);else if(0!==m.ext.feature.length){i=m.ext.feature;q=0;for(n=i.length;q<n;q++)if(j==i[q].cFeature){g=i[q].fnInit(a);break}}g&&(i=a.aanFeatures,i[j]||(i[j]=[]),i[j].push(g),e.append(g))}c.replaceWith(e);a.nHolding=null}function da(a,b){var c=h(b).children("tr"),d,e,f,g,j,i,n,l,q,k;a.splice(0,a.length);f=0;for(i=c.length;f<i;f++)a.push([]);f=0;for(i=c.length;f<i;f++){d=c[f];for(e=d.firstChild;e;){if("TD"==e.nodeName.toUpperCase()||"TH"==e.nodeName.toUpperCase()){l=1*e.getAttribute("colspan");
+q=1*e.getAttribute("rowspan");l=!l||0===l||1===l?1:l;q=!q||0===q||1===q?1:q;g=0;for(j=a[f];j[g];)g++;n=g;k=1===l?!0:!1;for(j=0;j<l;j++)for(g=0;g<q;g++)a[f+g][n+j]={cell:e,unique:k},a[f+g].nTr=d}e=e.nextSibling}}}function ra(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],da(c,b)));for(var b=0,e=c.length;b<e;b++)for(var f=0,g=c[b].length;f<g;f++)if(c[b][f].unique&&(!d[f]||!a.bSortCellsTop))d[f]=c[b][f].cell;return d}function sa(a,b,c){r(a,"aoServerParams","serverParams",[b]);if(b&&h.isArray(b)){var d={},
+e=/(.*?)\[\]$/;h.each(b,function(a,b){var c=b.name.match(e);c?(c=c[0],d[c]||(d[c]=[]),d[c].push(b.value)):d[b.name]=b.value});b=d}var f,g=a.ajax,j=a.oInstance,i=function(b){r(a,null,"xhr",[a,b,a.jqXHR]);c(b)};if(h.isPlainObject(g)&&g.data){f=g.data;var n=h.isFunction(f)?f(b,a):f,b=h.isFunction(f)&&n?n:h.extend(!0,b,n);delete g.data}n={data:b,success:function(b){var c=b.error||b.sError;c&&J(a,0,c);a.json=b;i(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,c){var d=r(a,null,"xhr",
+[a,null,a.jqXHR]);-1===h.inArray(!0,d)&&("parsererror"==c?J(a,0,"Invalid JSON response",1):4===b.readyState&&J(a,0,"Ajax error",7));C(a,!1)}};a.oAjaxData=b;r(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(j,a.sAjaxSource,h.map(b,function(a,b){return{name:b,value:a}}),i,a):a.sAjaxSource||"string"===typeof g?a.jqXHR=h.ajax(h.extend(n,{url:g||a.sAjaxSource})):h.isFunction(g)?a.jqXHR=g.call(j,b,i,a):(a.jqXHR=h.ajax(h.extend(n,g)),g.data=f)}function kb(a){return a.bAjaxDataGet?(a.iDraw++,C(a,
+!0),sa(a,tb(a),function(b){ub(a,b)}),!1):!0}function tb(a){var b=a.aoColumns,c=b.length,d=a.oFeatures,e=a.oPreviousSearch,f=a.aoPreSearchCols,g,j=[],i,n,l,k=V(a);g=a._iDisplayStart;i=!1!==d.bPaginate?a._iDisplayLength:-1;var t=function(a,b){j.push({name:a,value:b})};t("sEcho",a.iDraw);t("iColumns",c);t("sColumns",D(b,"sName").join(","));t("iDisplayStart",g);t("iDisplayLength",i);var pa={draw:a.iDraw,columns:[],order:[],start:g,length:i,search:{value:e.sSearch,regex:e.bRegex}};for(g=0;g<c;g++)n=b[g],
+l=f[g],i="function"==typeof n.mData?"function":n.mData,pa.columns.push({data:i,name:n.sName,searchable:n.bSearchable,orderable:n.bSortable,search:{value:l.sSearch,regex:l.bRegex}}),t("mDataProp_"+g,i),d.bFilter&&(t("sSearch_"+g,l.sSearch),t("bRegex_"+g,l.bRegex),t("bSearchable_"+g,n.bSearchable)),d.bSort&&t("bSortable_"+g,n.bSortable);d.bFilter&&(t("sSearch",e.sSearch),t("bRegex",e.bRegex));d.bSort&&(h.each(k,function(a,b){pa.order.push({column:b.col,dir:b.dir});t("iSortCol_"+a,b.col);t("sSortDir_"+
+a,b.dir)}),t("iSortingCols",k.length));b=m.ext.legacy.ajax;return null===b?a.sAjaxSource?j:pa:b?j:pa}function ub(a,b){var c=ta(a,b),d=b.sEcho!==k?b.sEcho:b.draw,e=b.iTotalRecords!==k?b.iTotalRecords:b.recordsTotal,f=b.iTotalDisplayRecords!==k?b.iTotalDisplayRecords:b.recordsFiltered;if(d){if(1*d<a.iDraw)return;a.iDraw=1*d}na(a);a._iRecordsTotal=parseInt(e,10);a._iRecordsDisplay=parseInt(f,10);d=0;for(e=c.length;d<e;d++)M(a,c[d]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;N(a);a._bInitComplete||
+ua(a,b);a.bAjaxDataGet=!0;C(a,!1)}function ta(a,b){var c=h.isPlainObject(a.ajax)&&a.ajax.dataSrc!==k?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===c?b.aaData||b[c]:""!==c?Q(c)(b):b}function ob(a){var b=a.oClasses,c=a.sTableId,d=a.oLanguage,e=a.oPreviousSearch,f=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',j=d.sSearch,j=j.match(/_INPUT_/)?j.replace("_INPUT_",g):j+g,b=h("<div/>",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("<label/>").append(j)),f=function(){var b=!this.value?
+"":this.value;b!=e.sSearch&&(fa(a,{sSearch:b,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive}),a._iDisplayStart=0,N(a))},g=null!==a.searchDelay?a.searchDelay:"ssp"===y(a)?400:0,i=h("input",b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).on("keyup.DT search.DT input.DT paste.DT cut.DT",g?Na(f,g):f).on("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);h(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{i[0]!==G.activeElement&&i.val(e.sSearch)}catch(d){}});
+return b[0]}function fa(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,f=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex;d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive};Fa(a);if("ssp"!=y(a)){vb(a,b.sSearch,c,b.bEscapeRegex!==k?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<e.length;b++)wb(a,e[b].sSearch,b,e[b].bEscapeRegex!==k?!e[b].bEscapeRegex:e[b].bRegex,e[b].bSmart,e[b].bCaseInsensitive);xb(a)}else f(b);a.bFiltered=!0;r(a,null,"search",[a])}function xb(a){for(var b=
+m.ext.search,c=a.aiDisplay,d,e,f=0,g=b.length;f<g;f++){for(var j=[],i=0,n=c.length;i<n;i++)e=c[i],d=a.aoData[e],b[f](a,d._aFilterData,e,d._aData,i)&&j.push(e);c.length=0;h.merge(c,j)}}function wb(a,b,c,d,e,f){if(""!==b){for(var g=[],j=a.aiDisplay,d=Oa(b,d,e,f),e=0;e<j.length;e++)b=a.aoData[j[e]]._aFilterData[c],d.test(b)&&g.push(j[e]);a.aiDisplay=g}}function vb(a,b,c,d,e,f){var d=Oa(b,d,e,f),f=a.oPreviousSearch.sSearch,g=a.aiDisplayMaster,j,e=[];0!==m.ext.search.length&&(c=!0);j=yb(a);if(0>=b.length)a.aiDisplay=
+g.slice();else{if(j||c||f.length>b.length||0!==b.indexOf(f)||a.bSorted)a.aiDisplay=g.slice();b=a.aiDisplay;for(c=0;c<b.length;c++)d.test(a.aoData[b[c]]._sFilterRow)&&e.push(b[c]);a.aiDisplay=e}}function Oa(a,b,c,d){a=b?a:Pa(a);c&&(a="^(?=.*?"+h.map(a.match(/"[^"]+"|[^ ]+/g)||[""],function(a){if('"'===a.charAt(0))var b=a.match(/^"(.*)"$/),a=b?b[1]:a;return a.replace('"',"")}).join(")(?=.*?")+").*$");return RegExp(a,d?"i":"")}function yb(a){var b=a.aoColumns,c,d,e,f,g,j,i,h,l=m.ext.type.search;c=!1;
+d=0;for(f=a.aoData.length;d<f;d++)if(h=a.aoData[d],!h._aFilterData){j=[];e=0;for(g=b.length;e<g;e++)c=b[e],c.bSearchable?(i=B(a,d,e,"filter"),l[c.sType]&&(i=l[c.sType](i)),null===i&&(i=""),"string"!==typeof i&&i.toString&&(i=i.toString())):i="",i.indexOf&&-1!==i.indexOf("&")&&(va.innerHTML=i,i=Wb?va.textContent:va.innerText),i.replace&&(i=i.replace(/[\r\n]/g,"")),j.push(i);h._aFilterData=j;h._sFilterRow=j.join("  ");c=!0}return c}function zb(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,
+caseInsensitive:a.bCaseInsensitive}}function Ab(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,bCaseInsensitive:a.caseInsensitive}}function rb(a){var b=a.sTableId,c=a.aanFeatures.i,d=h("<div/>",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:Bb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),h(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Bb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,d=a._iDisplayStart+
+1,e=a.fnDisplayEnd(),f=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),j=g?c.sInfo:c.sInfoEmpty;g!==f&&(j+=" "+c.sInfoFiltered);j+=c.sInfoPostFix;j=Cb(a,j);c=c.fnInfoCallback;null!==c&&(j=c.call(a.oInstance,a,d,e,f,g,j));h(b).html(j)}}function Cb(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,f=a.fnRecordsDisplay(),g=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,
+f)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(d/e))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(f/e)))}function ga(a){var b,c,d=a.iInitDisplayStart,e=a.aoColumns,f;c=a.oFeatures;var g=a.bDeferLoading;if(a.bInitialised){mb(a);jb(a);ea(a,a.aoHeader);ea(a,a.aoFooter);C(a,!0);c.bAutoWidth&&Ea(a);b=0;for(c=e.length;b<c;b++)f=e[b],f.sWidth&&(f.nTh.style.width=v(f.sWidth));r(a,null,"preInit",[a]);S(a);e=y(a);if("ssp"!=e||g)"ajax"==e?sa(a,[],function(c){var f=ta(a,c);for(b=0;b<f.length;b++)M(a,f[b]);a.iInitDisplayStart=
+d;S(a);C(a,!1);ua(a,c)},a):(C(a,!1),ua(a))}else setTimeout(function(){ga(a)},200)}function ua(a,b){a._bInitComplete=!0;(b||a.oInit.aaData)&&Y(a);r(a,null,"plugin-init",[a,b]);r(a,"aoInitComplete","init",[a,b])}function Qa(a,b){var c=parseInt(b,10);a._iDisplayLength=c;Ra(a);r(a,null,"length",[a,c])}function nb(a){for(var b=a.oClasses,c=a.sTableId,d=a.aLengthMenu,e=h.isArray(d[0]),f=e?d[0]:d,d=e?d[1]:d,e=h("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect}),g=0,j=f.length;g<j;g++)e[0][g]=
+new Option("number"===typeof d[g]?a.fnFormatNumber(d[g]):d[g],f[g]);var i=h("<div><label/></div>").addClass(b.sLength);a.aanFeatures.l||(i[0].id=c+"_length");i.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));h("select",i).val(a._iDisplayLength).on("change.DT",function(){Qa(a,h(this).val());N(a)});h(a.nTable).on("length.dt.DT",function(b,c,d){a===c&&h("select",i).val(d)});return i[0]}function sb(a){var b=a.sPaginationType,c=m.ext.pager[b],d="function"===typeof c,e=function(a){N(a)},
+b=h("<div/>").addClass(a.oClasses.sPaging+b)[0],f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,i=a._iDisplayLength,h=a.fnRecordsDisplay(),l=-1===i,b=l?0:Math.ceil(b/i),i=l?1:Math.ceil(h/i),h=c(b,i),k,l=0;for(k=f.p.length;l<k;l++)Ma(a,"pageButton")(a,f.p[l],l,h,b,i)}else c.fnUpdate(a,e)},sName:"pagination"}));return b}function Sa(a,b,c){var d=a._iDisplayStart,e=a._iDisplayLength,f=a.fnRecordsDisplay();0===f||-1===
+e?d=0:"number"===typeof b?(d=b*e,d>f&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e<f&&(d+=e):"last"==b?d=Math.floor((f-1)/e)*e:J(a,0,"Unknown paging action: "+b,5);b=a._iDisplayStart!==d;a._iDisplayStart=d;b&&(r(a,null,"page",[a]),c&&N(a));return b}function pb(a){return h("<div/>",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",
+b?"block":"none");r(a,null,"processing",[a,b])}function qb(a){var b=h(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,g=b.children("caption"),j=g.length?g[0]._captionSide:null,i=h(b[0].cloneNode(!1)),n=h(b[0].cloneNode(!1)),l=b.children("tfoot");l.length||(l=null);i=h("<div/>",{"class":f.sScrollWrapper}).append(h("<div/>",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?!d?null:v(d):"100%"}).append(h("<div/>",
+{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(i.removeAttr("id").css("margin-left",0).append("top"===j?g:null).append(b.children("thead"))))).append(h("<div/>",{"class":f.sScrollBody}).css({position:"relative",overflow:"auto",width:!d?null:v(d)}).append(b));l&&i.append(h("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?!d?null:v(d):"100%"}).append(h("<div/>",{"class":f.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",
+0).append("bottom"===j?g:null).append(b.children("tfoot")))));var b=i.children(),k=b[0],f=b[1],t=l?b[2]:null;if(d)h(f).on("scroll.DT",function(){var a=this.scrollLeft;k.scrollLeft=a;l&&(t.scrollLeft=a)});h(f).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=k;a.nScrollBody=f;a.nScrollFoot=t;a.aoDrawCallback.push({fn:ka,sName:"scrolling"});return i[0]}function ka(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY,b=b.iBarWidth,f=h(a.nScrollHead),g=f[0].style,j=f.children("div"),i=j[0].style,n=j.children("table"),
+j=a.nScrollBody,l=h(j),q=j.style,t=h(a.nScrollFoot).children("div"),m=t.children("table"),o=h(a.nTHead),p=h(a.nTable),s=p[0],r=s.style,u=a.nTFoot?h(a.nTFoot):null,x=a.oBrowser,T=x.bScrollOversize,Xb=D(a.aoColumns,"nTh"),O,K,P,w,Ta=[],y=[],z=[],A=[],B,C=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};K=j.scrollHeight>j.clientHeight;if(a.scrollBarVis!==K&&a.scrollBarVis!==k)a.scrollBarVis=K,Y(a);else{a.scrollBarVis=K;p.children("thead, tfoot").remove();
+u&&(P=u.clone().prependTo(p),O=u.find("tr"),P=P.find("tr"));w=o.clone().prependTo(p);o=o.find("tr");K=w.find("tr");w.find("th, td").removeAttr("tabindex");c||(q.width="100%",f[0].style.width="100%");h.each(ra(a,w),function(b,c){B=Z(a,b);c.style.width=a.aoColumns[B].sWidth});u&&H(function(a){a.style.width=""},P);f=p.outerWidth();if(""===c){r.width="100%";if(T&&(p.find("tbody").height()>j.offsetHeight||"scroll"==l.css("overflow-y")))r.width=v(p.outerWidth()-b);f=p.outerWidth()}else""!==d&&(r.width=
+v(d),f=p.outerWidth());H(C,K);H(function(a){z.push(a.innerHTML);Ta.push(v(h(a).css("width")))},K);H(function(a,b){if(h.inArray(a,Xb)!==-1)a.style.width=Ta[b]},o);h(K).height(0);u&&(H(C,P),H(function(a){A.push(a.innerHTML);y.push(v(h(a).css("width")))},P),H(function(a,b){a.style.width=y[b]},O),h(P).height(0));H(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+z[b]+"</div>";a.style.width=Ta[b]},K);u&&H(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+
+A[b]+"</div>";a.style.width=y[b]},P);if(p.outerWidth()<f){O=j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")?f+b:f;if(T&&(j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")))r.width=v(O-b);(""===c||""!==d)&&J(a,1,"Possible column misalignment",6)}else O="100%";q.width=v(O);g.width=v(O);u&&(a.nScrollFoot.style.width=v(O));!e&&T&&(q.height=v(s.offsetHeight+b));c=p.outerWidth();n[0].style.width=v(c);i.width=v(c);d=p.height()>j.clientHeight||"scroll"==l.css("overflow-y");e="padding"+
+(x.bScrollbarLeft?"Left":"Right");i[e]=d?b+"px":"0px";u&&(m[0].style.width=v(c),t[0].style.width=v(c),t[0].style[e]=d?b+"px":"0px");p.children("colgroup").insertBefore(p.children("thead"));l.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)j.scrollTop=0}}function H(a,b,c){for(var d=0,e=0,f=b.length,g,j;e<f;){g=b[e].firstChild;for(j=c?c[e].firstChild:null;g;)1===g.nodeType&&(c?a(g,j,d):a(g,d),d++),g=g.nextSibling,j=c?j.nextSibling:null;e++}}function Ea(a){var b=a.nTable,c=a.aoColumns,d=a.oScroll,
+e=d.sY,f=d.sX,g=d.sXInner,j=c.length,i=la(a,"bVisible"),n=h("th",a.nTHead),l=b.getAttribute("width"),k=b.parentNode,t=!1,m,o,p=a.oBrowser,d=p.bScrollOversize;(m=b.style.width)&&-1!==m.indexOf("%")&&(l=m);for(m=0;m<i.length;m++)o=c[i[m]],null!==o.sWidth&&(o.sWidth=Db(o.sWidthOrig,k),t=!0);if(d||!t&&!f&&!e&&j==aa(a)&&j==n.length)for(m=0;m<j;m++)i=Z(a,m),null!==i&&(c[i].sWidth=v(n.eq(m).width()));else{j=h(b).clone().css("visibility","hidden").removeAttr("id");j.find("tbody tr").remove();var s=h("<tr/>").appendTo(j.find("tbody"));
+j.find("thead, tfoot").remove();j.append(h(a.nTHead).clone()).append(h(a.nTFoot).clone());j.find("tfoot th, tfoot td").css("width","");n=ra(a,j.find("thead")[0]);for(m=0;m<i.length;m++)o=c[i[m]],n[m].style.width=null!==o.sWidthOrig&&""!==o.sWidthOrig?v(o.sWidthOrig):"",o.sWidthOrig&&f&&h(n[m]).append(h("<div/>").css({width:o.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(m=0;m<i.length;m++)t=i[m],o=c[t],h(Eb(a,t)).clone(!1).append(o.sContentPadding).appendTo(s);h("[name]",
+j).removeAttr("name");o=h("<div/>").css(f||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(j).appendTo(k);f&&g?j.width(g):f?(j.css("width","auto"),j.removeAttr("width"),j.width()<k.clientWidth&&l&&j.width(k.clientWidth)):e?j.width(k.clientWidth):l&&j.width(l);for(m=e=0;m<i.length;m++)k=h(n[m]),g=k.outerWidth()-k.width(),k=p.bBounding?Math.ceil(n[m].getBoundingClientRect().width):k.outerWidth(),e+=k,c[i[m]].sWidth=v(k-g);b.style.width=v(e);o.remove()}l&&(b.style.width=
+v(l));if((l||f)&&!a._reszEvt)b=function(){h(E).on("resize.DT-"+a.sInstance,Na(function(){Y(a)}))},d?setTimeout(b,1E3):b(),a._reszEvt=!0}function Db(a,b){if(!a)return 0;var c=h("<div/>").css("width",v(a)).appendTo(b||G.body),d=c[0].offsetWidth;c.remove();return d}function Eb(a,b){var c=Fb(a,b);if(0>c)return null;var d=a.aoData[c];return!d.nTr?h("<td/>").html(B(a,c,b,"display"))[0]:d.anCells[b]}function Fb(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;f<g;f++)c=B(a,f,b,"display")+"",c=c.replace(Yb,
+""),c=c.replace(/ /g," "),c.length>d&&(d=c.length,e=f);return e}function v(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function V(a){var b,c,d=[],e=a.aoColumns,f,g,j,i;b=a.aaSortingFixed;c=h.isPlainObject(b);var n=[];f=function(a){a.length&&!h.isArray(a[0])?n.push(a):h.merge(n,a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;a<n.length;a++){i=n[a][0];f=e[i].aDataSort;b=0;for(c=f.length;b<c;b++)g=f[b],j=e[g].sType||
+"string",n[a]._idx===k&&(n[a]._idx=h.inArray(n[a][1],e[g].asSorting)),d.push({src:i,col:g,dir:n[a][1],index:n[a]._idx,type:j,formatter:m.ext.type.order[j+"-pre"]})}return d}function lb(a){var b,c,d=[],e=m.ext.type.order,f=a.aoData,g=0,j,i=a.aiDisplayMaster,h;Fa(a);h=V(a);b=0;for(c=h.length;b<c;b++)j=h[b],j.formatter&&g++,Gb(a,j.col);if("ssp"!=y(a)&&0!==h.length){b=0;for(c=i.length;b<c;b++)d[i[b]]=b;g===h.length?i.sort(function(a,b){var c,e,g,j,i=h.length,k=f[a]._aSortData,m=f[b]._aSortData;for(g=
+0;g<i;g++)if(j=h[g],c=k[j.col],e=m[j.col],c=c<e?-1:c>e?1:0,0!==c)return"asc"===j.dir?c:-c;c=d[a];e=d[b];return c<e?-1:c>e?1:0}):i.sort(function(a,b){var c,g,j,i,k=h.length,m=f[a]._aSortData,o=f[b]._aSortData;for(j=0;j<k;j++)if(i=h[j],c=m[i.col],g=o[i.col],i=e[i.type+"-"+i.dir]||e["string-"+i.dir],c=i(c,g),0!==c)return c;c=d[a];g=d[b];return c<g?-1:c>g?1:0})}a.bSorted=!0}function Hb(a){for(var b,c,d=a.aoColumns,e=V(a),a=a.oLanguage.oAria,f=0,g=d.length;f<g;f++){c=d[f];var j=c.asSorting;b=c.sTitle.replace(/<.*?>/g,
+"");var i=c.nTh;i.removeAttribute("aria-sort");c.bSortable&&(0<e.length&&e[0].col==f?(i.setAttribute("aria-sort","asc"==e[0].dir?"ascending":"descending"),c=j[e[0].index+1]||j[0]):c=j[0],b+="asc"===c?a.sSortAscending:a.sSortDescending);i.setAttribute("aria-label",b)}}function Ua(a,b,c,d){var e=a.aaSorting,f=a.aoColumns[b].asSorting,g=function(a,b){var c=a._idx;c===k&&(c=h.inArray(a[1],f));return c+1<f.length?c+1:b?null:0};"number"===typeof e[0]&&(e=a.aaSorting=[e]);c&&a.oFeatures.bSortMulti?(c=h.inArray(b,
+D(e,"0")),-1!==c?(b=g(e[c],!0),null===b&&1===e.length&&(b=0),null===b?e.splice(c,1):(e[c][1]=f[b],e[c]._idx=b)):(e.push([b,f[0],0]),e[e.length-1]._idx=0)):e.length&&e[0][0]==b?(b=g(e[0]),e.length=1,e[0][1]=f[b],e[0]._idx=b):(e.length=0,e.push([b,f[0]]),e[0]._idx=0);S(a);"function"==typeof d&&d(a)}function La(a,b,c,d){var e=a.aoColumns[c];Va(b,{},function(b){!1!==e.bSortable&&(a.oFeatures.bProcessing?(C(a,!0),setTimeout(function(){Ua(a,c,b.shiftKey,d);"ssp"!==y(a)&&C(a,!1)},0)):Ua(a,c,b.shiftKey,d))})}
+function wa(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,d=V(a),e=a.oFeatures,f,g;if(e.bSort&&e.bSortClasses){e=0;for(f=b.length;e<f;e++)g=b[e].src,h(D(a.aoData,"anCells",g)).removeClass(c+(2>e?e+1:3));e=0;for(f=d.length;e<f;e++)g=d[e].src,h(D(a.aoData,"anCells",g)).addClass(c+(2>e?e+1:3))}a.aLastSort=d}function Gb(a,b){var c=a.aoColumns[b],d=m.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,$(a,b)));for(var f,g=m.ext.type.order[c.sType+"-pre"],j=0,i=a.aoData.length;j<i;j++)if(c=a.aoData[j],
+c._aSortData||(c._aSortData=[]),!c._aSortData[b]||d)f=d?e[j]:B(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function xa(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting),search:zb(a.oPreviousSearch),columns:h.map(a.aoColumns,function(b,d){return{visible:b.bVisible,search:zb(a.aoPreSearchCols[d])}})};r(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,
+b)}}function Ib(a,b,c){var d,e,f=a.aoColumns,b=function(b){if(b&&b.time){var g=r(a,"aoStateLoadParams","stateLoadParams",[a,b]);if(-1===h.inArray(!1,g)&&(g=a.iStateDuration,!(0<g&&b.time<+new Date-1E3*g)&&!(b.columns&&f.length!==b.columns.length))){a.oLoadedState=h.extend(!0,{},b);b.start!==k&&(a._iDisplayStart=b.start,a.iInitDisplayStart=b.start);b.length!==k&&(a._iDisplayLength=b.length);b.order!==k&&(a.aaSorting=[],h.each(b.order,function(b,c){a.aaSorting.push(c[0]>=f.length?[0,c[1]]:c)}));b.search!==
+k&&h.extend(a.oPreviousSearch,Ab(b.search));if(b.columns){d=0;for(e=b.columns.length;d<e;d++)g=b.columns[d],g.visible!==k&&(f[d].bVisible=g.visible),g.search!==k&&h.extend(a.aoPreSearchCols[d],Ab(g.search))}r(a,"aoStateLoaded","stateLoaded",[a,b])}}c()};if(a.oFeatures.bStateSave){var g=a.fnStateLoadCallback.call(a.oInstance,a,b);g!==k&&b(g)}else c()}function ya(a){var b=m.settings,a=h.inArray(a,D(b,"nTable"));return-1!==a?b[a]:null}function J(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+
+" - ":"")+c;d&&(c+=". For more information about this error, please see http://datatables.net/tn/"+d);if(b)E.console&&console.log&&console.log(c);else if(b=m.ext,b=b.sErrMode||b.errMode,a&&r(a,null,"error",[a,d,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function F(a,b,c,d){h.isArray(c)?h.each(c,function(c,d){h.isArray(d)?F(a,b,d[0],d[1]):F(a,b,d)}):(d===k&&(d=c),b[c]!==k&&(a[d]=b[c]))}function Jb(a,b,c){var d,e;for(e in b)b.hasOwnProperty(e)&&(d=b[e],
+h.isPlainObject(d)?(h.isPlainObject(a[e])||(a[e]={}),h.extend(!0,a[e],d)):a[e]=c&&"data"!==e&&"aaData"!==e&&h.isArray(d)?d.slice():d);return a}function Va(a,b,c){h(a).on("click.DT",b,function(b){a.blur();c(b)}).on("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).on("selectstart.DT",function(){return!1})}function z(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function r(a,b,c,d){var e=[];b&&(e=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,d)}));null!==c&&(b=h.Event(c+
+".dt"),h(a.nTable).trigger(b,d),e.push(b.result));return e}function Ra(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Ma(a,b){var c=a.renderer,d=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"===typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function ha(a,b){var c=[],c=Kb.numbers_length,d=Math.floor(c/2);b<=c?c=W(0,b):a<=d?(c=W(0,
+c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=W(b-(c-2),b):(c=W(a-d+2,a+d-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function cb(a){h.each({num:function(b){return za(b,a)},"num-fmt":function(b){return za(b,a,Wa)},"html-num":function(b){return za(b,a,Aa)},"html-num-fmt":function(b){return za(b,a,Aa,Wa)}},function(b,c){x.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(x.type.search[b+a]=x.type.search.html)})}function Lb(a){return function(){var b=
+[ya(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return m.ext.internal[a].apply(this,b)}}var m=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new s(ya(this[x.iApiIndex])):new s(this)};this.fnAddData=function(a,b){var c=this.api(!0),d=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===k||b)&&c.draw();return d.flatten().toArray()};this.fnAdjustColumnSizing=
+function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===k||a?b.draw(!1):(""!==d.sX||""!==d.sY)&&ka(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0),a=d.rows(a),e=a.settings()[0],h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===k||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};
+this.fnFilter=function(a,b,c,d,e,h){e=this.api(!0);null===b||b===k?e.search(a,c,d,h):e.column(b).search(a,c,d,h);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();
+return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===k||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===k||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return ya(this[x.iApiIndex])};
+this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===k||e)&&h.columns.adjust();(d===k||d)&&h.draw();return 0};this.fnVersionCheck=x.fnVersionCheck;var b=this,c=a===k,d=this.length;c&&(a={});this.oApi=this.internal=x.internal;for(var e in m.ext.internal)e&&(this[e]=Lb(e));this.each(function(){var e={},g=1<d?Jb(e,a,!0):
+a,j=0,i,e=this.getAttribute("id"),n=!1,l=m.defaults,q=h(this);if("table"!=this.nodeName.toLowerCase())J(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{db(l);eb(l.column);I(l,l,!0);I(l.column,l.column,!0);I(l,h.extend(g,q.data()));var t=m.settings,j=0;for(i=t.length;j<i;j++){var o=t[j];if(o.nTable==this||o.nTHead.parentNode==this||o.nTFoot&&o.nTFoot.parentNode==this){var s=g.bRetrieve!==k?g.bRetrieve:l.bRetrieve;if(c||s)return o.oInstance;if(g.bDestroy!==k?g.bDestroy:l.bDestroy){o.oInstance.fnDestroy();
+break}else{J(o,0,"Cannot reinitialise DataTable",3);return}}if(o.sTableId==this.id){t.splice(j,1);break}}if(null===e||""===e)this.id=e="DataTables_Table_"+m.ext._unique++;var p=h.extend(!0,{},m.models.oSettings,{sDestroyWidth:q[0].style.width,sInstance:e,sTableId:e});p.nTable=this;p.oApi=b.internal;p.oInit=g;t.push(p);p.oInstance=1===b.length?b:q.dataTable();db(g);g.oLanguage&&Ca(g.oLanguage);g.aLengthMenu&&!g.iDisplayLength&&(g.iDisplayLength=h.isArray(g.aLengthMenu[0])?g.aLengthMenu[0][0]:g.aLengthMenu[0]);
+g=Jb(h.extend(!0,{},l),g);F(p.oFeatures,g,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));F(p,g,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],
+["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"]]);F(p.oScroll,g,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);F(p.oLanguage,g,"fnInfoCallback");z(p,"aoDrawCallback",g.fnDrawCallback,"user");z(p,"aoServerParams",g.fnServerParams,"user");z(p,"aoStateSaveParams",g.fnStateSaveParams,"user");z(p,"aoStateLoadParams",g.fnStateLoadParams,"user");z(p,"aoStateLoaded",g.fnStateLoaded,"user");z(p,"aoRowCallback",
+g.fnRowCallback,"user");z(p,"aoRowCreatedCallback",g.fnCreatedRow,"user");z(p,"aoHeaderCallback",g.fnHeaderCallback,"user");z(p,"aoFooterCallback",g.fnFooterCallback,"user");z(p,"aoInitComplete",g.fnInitComplete,"user");z(p,"aoPreDrawCallback",g.fnPreDrawCallback,"user");p.rowIdFn=Q(g.rowId);fb(p);var u=p.oClasses;h.extend(u,m.ext.classes,g.oClasses);q.addClass(u.sTable);p.iInitDisplayStart===k&&(p.iInitDisplayStart=g.iDisplayStart,p._iDisplayStart=g.iDisplayStart);null!==g.iDeferLoading&&(p.bDeferLoading=
+!0,e=h.isArray(g.iDeferLoading),p._iRecordsDisplay=e?g.iDeferLoading[0]:g.iDeferLoading,p._iRecordsTotal=e?g.iDeferLoading[1]:g.iDeferLoading);var v=p.oLanguage;h.extend(!0,v,g.oLanguage);v.sUrl&&(h.ajax({dataType:"json",url:v.sUrl,success:function(a){Ca(a);I(l.oLanguage,a);h.extend(true,v,a);ga(p)},error:function(){ga(p)}}),n=!0);null===g.asStripeClasses&&(p.asStripeClasses=[u.sStripeOdd,u.sStripeEven]);var e=p.asStripeClasses,x=q.children("tbody").find("tr").eq(0);-1!==h.inArray(!0,h.map(e,function(a){return x.hasClass(a)}))&&
+(h("tbody tr",this).removeClass(e.join(" ")),p.asDestroyStripes=e.slice());e=[];t=this.getElementsByTagName("thead");0!==t.length&&(da(p.aoHeader,t[0]),e=ra(p));if(null===g.aoColumns){t=[];j=0;for(i=e.length;j<i;j++)t.push(null)}else t=g.aoColumns;j=0;for(i=t.length;j<i;j++)Da(p,e?e[j]:null);hb(p,g.aoColumnDefs,t,function(a,b){ja(p,a,b)});if(x.length){var w=function(a,b){return a.getAttribute("data-"+b)!==null?b:null};h(x[0]).children("th, td").each(function(a,b){var c=p.aoColumns[a];if(c.mData===
+a){var d=w(b,"sort")||w(b,"order"),e=w(b,"filter")||w(b,"search");if(d!==null||e!==null){c.mData={_:a+".display",sort:d!==null?a+". at data-"+d:k,type:d!==null?a+". at data-"+d:k,filter:e!==null?a+". at data-"+e:k};ja(p,a)}}})}var T=p.oFeatures,e=function(){if(g.aaSorting===k){var a=p.aaSorting;j=0;for(i=a.length;j<i;j++)a[j][1]=p.aoColumns[j].asSorting[0]}wa(p);T.bSort&&z(p,"aoDrawCallback",function(){if(p.bSorted){var a=V(p),b={};h.each(a,function(a,c){b[c.src]=c.dir});r(p,null,"order",[p,a,b]);Hb(p)}});
+z(p,"aoDrawCallback",function(){(p.bSorted||y(p)==="ssp"||T.bDeferRender)&&wa(p)},"sc");var a=q.children("caption").each(function(){this._captionSide=h(this).css("caption-side")}),b=q.children("thead");b.length===0&&(b=h("<thead/>").appendTo(q));p.nTHead=b[0];b=q.children("tbody");b.length===0&&(b=h("<tbody/>").appendTo(q));p.nTBody=b[0];b=q.children("tfoot");if(b.length===0&&a.length>0&&(p.oScroll.sX!==""||p.oScroll.sY!==""))b=h("<tfoot/>").appendTo(q);if(b.length===0||b.children().length===0)q.addClass(u.sNoFooter);
+else if(b.length>0){p.nTFoot=b[0];da(p.aoFooter,p.nTFoot)}if(g.aaData)for(j=0;j<g.aaData.length;j++)M(p,g.aaData[j]);else(p.bDeferLoading||y(p)=="dom")&&ma(p,h(p.nTBody).children("tr"));p.aiDisplay=p.aiDisplayMaster.slice();p.bInitialised=true;n===false&&ga(p)};g.bStateSave?(T.bStateSave=!0,z(p,"aoDrawCallback",xa,"state_save"),Ib(p,g,e)):e()}});b=null;return this},x,s,o,u,Xa={},Mb=/[\r\n]/g,Aa=/<.*?>/g,Zb=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,$b=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)",
+"g"),Wa=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi,L=function(a){return!a||!0===a||"-"===a?!0:!1},Nb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Ob=function(a,b){Xa[b]||(Xa[b]=RegExp(Pa(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(Xa[b],"."):a},Ya=function(a,b,c){var d="string"===typeof a;if(L(a))return!0;b&&d&&(a=Ob(a,b));c&&d&&(a=a.replace(Wa,""));return!isNaN(parseFloat(a))&&isFinite(a)},Pb=function(a,b,c){return L(a)?!0:!(L(a)||"string"===
+typeof a)?null:Ya(a.replace(Aa,""),b,c)?!0:null},D=function(a,b,c){var d=[],e=0,f=a.length;if(c!==k)for(;e<f;e++)a[e]&&a[e][b]&&d.push(a[e][b][c]);else for(;e<f;e++)a[e]&&d.push(a[e][b]);return d},ia=function(a,b,c,d){var e=[],f=0,g=b.length;if(d!==k)for(;f<g;f++)a[b[f]][c]&&e.push(a[b[f]][c][d]);else for(;f<g;f++)e.push(a[b[f]][c]);return e},W=function(a,b){var c=[],d;b===k?(b=0,d=a):(d=b,b=a);for(var e=b;e<d;e++)c.push(e);return c},Qb=function(a){for(var b=[],c=0,d=a.length;c<d;c++)a[c]&&b.push(a[c]);
+return b},qa=function(a){var b;a:{if(!(2>a.length)){b=a.slice().sort();for(var c=b[0],d=1,e=b.length;d<e;d++){if(b[d]===c){b=!1;break a}c=b[d]}}b=!0}if(b)return a.slice();b=[];var e=a.length,f,g=0,d=0;a:for(;d<e;d++){c=a[d];for(f=0;f<g;f++)if(b[f]===c)continue a;b.push(c);g++}return b};m.util={throttle:function(a,b){var c=b!==k?b:200,d,e;return function(){var b=this,g=+new Date,j=arguments;d&&g<d+c?(clearTimeout(e),e=setTimeout(function(){d=k;a.apply(b,j)},c)):(d=g,a.apply(b,j))}},escapeRegex:function(a){return a.replace($b,
+"\\$1")}};var A=function(a,b,c){a[b]!==k&&(a[c]=a[b])},ba=/\[.*?\]$/,U=/\(\)$/,Pa=m.util.escapeRegex,va=h("<div>")[0],Wb=va.textContent!==k,Yb=/<.*?>/g,Na=m.util.throttle,Rb=[],w=Array.prototype,ac=function(a){var b,c,d=m.settings,e=h.map(d,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=h.inArray(a,e),-1!==b?[d[b]]:null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?c=h(a):a instanceof
+h&&(c=a)}else return[];if(c)return c.map(function(){b=h.inArray(this,e);return-1!==b?d[b]:null}).toArray()};s=function(a,b){if(!(this instanceof s))return new s(a,b);var c=[],d=function(a){(a=ac(a))&&(c=c.concat(a))};if(h.isArray(a))for(var e=0,f=a.length;e<f;e++)d(a[e]);else d(a);this.context=qa(c);b&&h.merge(this,b);this.selector={rows:null,cols:null,opts:null};s.extend(this,this,Rb)};m.Api=s;h.extend(s.prototype,{any:function(){return 0!==this.count()},concat:w.concat,context:[],count:function(){return this.flatten().length},
+each:function(a){for(var b=0,c=this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=this.context;return b.length>a?new s(b[a],this[a]):null},filter:function(a){var b=[];if(w.filter)b=w.filter.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new s(this.context,b)},flatten:function(){var a=[];return new s(this.context,a.concat.apply(a,this.toArray()))},join:w.join,indexOf:w.indexOf||function(a,b){for(var c=b||0,
+d=this.length;c<d;c++)if(this[c]===a)return c;return-1},iterator:function(a,b,c,d){var e=[],f,g,j,h,n,l=this.context,m,o,u=this.selector;"string"===typeof a&&(d=c,c=b,b=a,a=!1);g=0;for(j=l.length;g<j;g++){var r=new s(l[g]);if("table"===b)f=c.call(r,l[g],g),f!==k&&e.push(f);else if("columns"===b||"rows"===b)f=c.call(r,l[g],this[g],g),f!==k&&e.push(f);else if("column"===b||"column-rows"===b||"row"===b||"cell"===b){o=this[g];"column-rows"===b&&(m=Ba(l[g],u.opts));h=0;for(n=o.length;h<n;h++)f=o[h],f=
+"cell"===b?c.call(r,l[g],f.row,f.column,g,h):c.call(r,l[g],f,g,h,m),f!==k&&e.push(f)}}return e.length||d?(a=new s(l,a?e.concat.apply([],e):e),b=a.selector,b.rows=u.rows,b.cols=u.cols,b.opts=u.opts,a):this},lastIndexOf:w.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(w.map)b=w.map.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)b.push(a.call(this,this[c],c));return new s(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})},
+pop:w.pop,push:w.push,reduce:w.reduce||function(a,b){return gb(this,a,b,0,this.length,1)},reduceRight:w.reduceRight||function(a,b){return gb(this,a,b,this.length-1,-1,-1)},reverse:w.reverse,selector:null,shift:w.shift,slice:function(){return new s(this.context,this)},sort:w.sort,splice:w.splice,toArray:function(){return w.slice.call(this)},to$:function(){return h(this)},toJQuery:function(){return h(this)},unique:function(){return new s(this.context,qa(this))},unshift:w.unshift});s.extend=function(a,
+b,c){if(c.length&&b&&(b instanceof s||b.__dt_wrapper)){var d,e,f,g=function(a,b,c){return function(){var d=b.apply(a,arguments);s.extend(d,d,c.methodExt);return d}};d=0;for(e=c.length;d<e;d++)f=c[d],b[f.name]="function"===typeof f.val?g(a,f.val,f):h.isPlainObject(f.val)?{}:f.val,b[f.name].__dt_wrapper=!0,s.extend(a,b[f.name],f.propExt)}};s.register=o=function(a,b){if(h.isArray(a))for(var c=0,d=a.length;c<d;c++)s.register(a[c],b);else for(var e=a.split("."),f=Rb,g,j,c=0,d=e.length;c<d;c++){g=(j=-1!==
+e[c].indexOf("()"))?e[c].replace("()",""):e[c];var i;a:{i=0;for(var n=f.length;i<n;i++)if(f[i].name===g){i=f[i];break a}i=null}i||(i={name:g,val:{},methodExt:[],propExt:[]},f.push(i));c===d-1?i.val=b:f=j?i.methodExt:i.propExt}};s.registerPlural=u=function(a,b,c){s.register(a,c);s.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof s?a.length?h.isArray(a[0])?new s(a.context,a[0]):a[0]:k:a})};o("tables()",function(a){var b;if(a){b=s;var c=this.context;if("number"===
+typeof a)a=[c[a]];else var d=h.map(c,function(a){return a.nTable}),a=h(d).filter(a).map(function(){var a=h.inArray(this,d);return c[a]}).toArray();b=new b(a)}else b=this;return b});o("table()",function(a){var a=this.tables(a),b=a.context;return b.length?new s(b[0]):a});u("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});u("tables().body()","table().body()",function(){return this.iterator("table",function(a){return a.nTBody},1)});u("tables().header()",
+"table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});u("tables().footer()","table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});u("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});o("draw()",function(a){return this.iterator("table",function(b){"page"===a?N(b):("string"===typeof a&&(a="full-hold"===a?!1:!0),S(b,!1===a))})});o("page()",function(a){return a===
+k?this.page.info().page:this.iterator("table",function(b){Sa(b,a)})});o("page.info()",function(){if(0===this.context.length)return k;var a=this.context[0],b=a._iDisplayStart,c=a.oFeatures.bPaginate?a._iDisplayLength:-1,d=a.fnRecordsDisplay(),e=-1===c;return{page:e?0:Math.floor(b/c),pages:e?1:Math.ceil(d/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsDisplay:d,serverSide:"ssp"===y(a)}});o("page.len()",function(a){return a===k?0!==this.context.length?this.context[0]._iDisplayLength:
+k:this.iterator("table",function(b){Qa(b,a)})});var Sb=function(a,b,c){if(c){var d=new s(a);d.one("draw",function(){c(d.ajax.json())})}if("ssp"==y(a))S(a,b);else{C(a,!0);var e=a.jqXHR;e&&4!==e.readyState&&e.abort();sa(a,[],function(c){na(a);for(var c=ta(a,c),d=0,e=c.length;d<e;d++)M(a,c[d]);S(a,b);C(a,!1)})}};o("ajax.json()",function(){var a=this.context;if(0<a.length)return a[0].json});o("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});o("ajax.reload()",function(a,
+b){return this.iterator("table",function(c){Sb(c,!1===b,a)})});o("ajax.url()",function(a){var b=this.context;if(a===k){if(0===b.length)return k;b=b[0];return b.ajax?h.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){h.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});o("ajax.url().load()",function(a,b){return this.iterator("table",function(c){Sb(c,!1===b,a)})});var Za=function(a,b,c,d,e){var f=[],g,j,i,n,l,m;i=typeof b;if(!b||"string"===i||"function"===
+i||b.length===k)b=[b];i=0;for(n=b.length;i<n;i++){j=b[i]&&b[i].split&&!b[i].match(/[\[\(:]/)?b[i].split(","):[b[i]];l=0;for(m=j.length;l<m;l++)(g=c("string"===typeof j[l]?h.trim(j[l]):j[l]))&&g.length&&(f=f.concat(g))}a=x.selector[a];if(a.length){i=0;for(n=a.length;i<n;i++)f=a[i](d,e,f)}return qa(f)},$a=function(a){a||(a={});a.filter&&a.search===k&&(a.search=a.filter);return h.extend({search:"none",order:"current",page:"all"},a)},ab=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=
+a[b],a[0].length=1,a.length=1,a.context=[a.context[b]],a;a.length=0;return a},Ba=function(a,b){var c,d,e,f=[],g=a.aiDisplay;c=a.aiDisplayMaster;var j=b.search;d=b.order;e=b.page;if("ssp"==y(a))return"removed"===j?[]:W(0,c.length);if("current"==e){c=a._iDisplayStart;for(d=a.fnDisplayEnd();c<d;c++)f.push(g[c])}else if("current"==d||"applied"==d)f="none"==j?c.slice():"applied"==j?g.slice():h.map(c,function(a){return-1===h.inArray(a,g)?a:null});else if("index"==d||"original"==d){c=0;for(d=a.aoData.length;c<
+d;c++)"none"==j?f.push(c):(e=h.inArray(c,g),(-1===e&&"removed"==j||0<=e&&"applied"==j)&&f.push(c))}return f};o("rows()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=$a(b),c=this.iterator("table",function(c){var e=b,f;return Za("row",a,function(a){var b=Nb(a);if(b!==null&&!e)return[b];f||(f=Ba(c,e));if(b!==null&&h.inArray(b,f)!==-1)return[b];if(a===null||a===k||a==="")return f;if(typeof a==="function")return h.map(f,function(b){var e=c.aoData[b];return a(b,e._aData,e.nTr)?b:null});
+b=Qb(ia(c.aoData,f,"nTr"));if(a.nodeName){if(a._DT_RowIndex!==k)return[a._DT_RowIndex];if(a._DT_CellIndex)return[a._DT_CellIndex.row];b=h(a).closest("*[data-dt-row]");return b.length?[b.data("dt-row")]:[]}if(typeof a==="string"&&a.charAt(0)==="#"){var i=c.aIds[a.replace(/^#/,"")];if(i!==k)return[i.idx]}return h(b).filter(a).map(function(){return this._DT_RowIndex}).toArray()},c,e)},1);c.selector.rows=a;c.selector.opts=b;return c});o("rows().nodes()",function(){return this.iterator("row",function(a,
+b){return a.aoData[b].nTr||k},1)});o("rows().data()",function(){return this.iterator(!0,"rows",function(a,b){return ia(a.aoData,b,"_aData")},1)});u("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){var d=b.aoData[c];return"search"===a?d._aFilterData:d._aSortData},1)});u("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,c){ca(b,c,a)})});u("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,
+b){return b},1)});u("rows().ids()","row().id()",function(a){for(var b=[],c=this.context,d=0,e=c.length;d<e;d++)for(var f=0,g=this[d].length;f<g;f++){var h=c[d].rowIdFn(c[d].aoData[this[d][f]]._aData);b.push((!0===a?"#":"")+h)}return new s(c,b)});u("rows().remove()","row().remove()",function(){var a=this;this.iterator("row",function(b,c,d){var e=b.aoData,f=e[c],g,h,i,n,l;e.splice(c,1);g=0;for(h=e.length;g<h;g++)if(i=e[g],l=i.anCells,null!==i.nTr&&(i.nTr._DT_RowIndex=g),null!==l){i=0;for(n=l.length;i<
+n;i++)l[i]._DT_CellIndex.row=g}oa(b.aiDisplayMaster,c);oa(b.aiDisplay,c);oa(a[d],c,!1);0<b._iRecordsDisplay&&b._iRecordsDisplay--;Ra(b);c=b.rowIdFn(f._aData);c!==k&&delete b.aIds[c]});this.iterator("table",function(a){for(var c=0,d=a.aoData.length;c<d;c++)a.aoData[c].idx=c});return this});o("rows.add()",function(a){var b=this.iterator("table",function(b){var c,f,g,h=[];f=0;for(g=a.length;f<g;f++)c=a[f],c.nodeName&&"TR"===c.nodeName.toUpperCase()?h.push(ma(b,c)[0]):h.push(M(b,c));return h},1),c=this.rows(-1);
+c.pop();h.merge(c,b);return c});o("row()",function(a,b){return ab(this.rows(a,b))});o("row().data()",function(a){var b=this.context;if(a===k)return b.length&&this.length?b[0].aoData[this[0]]._aData:k;b[0].aoData[this[0]]._aData=a;ca(b[0],this[0],"data");return this});o("row().node()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]].nTr||null:null});o("row.add()",function(a){a instanceof h&&a.length&&(a=a[0]);var b=this.iterator("table",function(b){return a.nodeName&&
+"TR"===a.nodeName.toUpperCase()?ma(b,a)[0]:M(b,a)});return this.row(b[0])});var bb=function(a,b){var c=a.context;if(c.length&&(c=c[0].aoData[b!==k?b:a[0]])&&c._details)c._details.remove(),c._detailsShow=k,c._details=k},Tb=function(a,b){var c=a.context;if(c.length&&a.length){var d=c[0].aoData[a[0]];if(d._details){(d._detailsShow=b)?d._details.insertAfter(d.nTr):d._details.detach();var e=c[0],f=new s(e),g=e.aoData;f.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<D(g,
+"_details").length&&(f.on("draw.dt.DT_details",function(a,b){e===b&&f.rows({page:"current"}).eq(0).each(function(a){a=g[a];a._detailsShow&&a._details.insertAfter(a.nTr)})}),f.on("column-visibility.dt.DT_details",function(a,b){if(e===b)for(var c,d=aa(b),f=0,h=g.length;f<h;f++)c=g[f],c._details&&c._details.children("td[colspan]").attr("colspan",d)}),f.on("destroy.dt.DT_details",function(a,b){if(e===b)for(var c=0,d=g.length;c<d;c++)g[c]._details&&bb(f,c)}))}}};o("row().child()",function(a,b){var c=this.context;
+if(a===k)return c.length&&this.length?c[0].aoData[this[0]]._details:k;if(!0===a)this.child.show();else if(!1===a)bb(this);else if(c.length&&this.length){var d=c[0],c=c[0].aoData[this[0]],e=[],f=function(a,b){if(h.isArray(a)||a instanceof h)for(var c=0,k=a.length;c<k;c++)f(a[c],b);else a.nodeName&&"tr"===a.nodeName.toLowerCase()?e.push(a):(c=h("<tr><td/></tr>").addClass(b),h("td",c).addClass(b).html(a)[0].colSpan=aa(d),e.push(c[0]))};f(a,b);c._details&&c._details.detach();c._details=h(e);c._detailsShow&&
+c._details.insertAfter(c.nTr)}return this});o(["row().child.show()","row().child().show()"],function(){Tb(this,!0);return this});o(["row().child.hide()","row().child().hide()"],function(){Tb(this,!1);return this});o(["row().child.remove()","row().child().remove()"],function(){bb(this);return this});o("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var bc=/^([^:]+):(name|visIdx|visible)$/,Ub=function(a,b,c,d,e){for(var c=
+[],d=0,f=e.length;d<f;d++)c.push(B(a,e[d],b));return c};o("columns()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=$a(b),c=this.iterator("table",function(c){var e=a,f=b,g=c.aoColumns,j=D(g,"sName"),i=D(g,"nTh");return Za("column",e,function(a){var b=Nb(a);if(a==="")return W(g.length);if(b!==null)return[b>=0?b:g.length+b];if(typeof a==="function"){var e=Ba(c,f);return h.map(g,function(b,f){return a(f,Ub(c,f,0,0,e),i[f])?f:null})}var k=typeof a==="string"?a.match(bc):"";if(k)switch(k[2]){case "visIdx":case "visible":b=
+parseInt(k[1],10);if(b<0){var m=h.map(g,function(a,b){return a.bVisible?b:null});return[m[m.length+b]]}return[Z(c,b)];case "name":return h.map(j,function(a,b){return a===k[1]?b:null});default:return[]}if(a.nodeName&&a._DT_CellIndex)return[a._DT_CellIndex.column];b=h(i).filter(a).map(function(){return h.inArray(this,i)}).toArray();if(b.length||!a.nodeName)return b;b=h(a).closest("*[data-dt-column]");return b.length?[b.data("dt-column")]:[]},c,f)},1);c.selector.cols=a;c.selector.opts=b;return c});u("columns().header()",
+"column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});u("columns().footer()","column().footer()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});u("columns().data()","column().data()",function(){return this.iterator("column-rows",Ub,1)});u("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});u("columns().cache()","column().cache()",
+function(a){return this.iterator("column-rows",function(b,c,d,e,f){return ia(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});u("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return ia(a.aoData,e,"anCells",b)},1)});u("columns().visible()","column().visible()",function(a,b){var c=this.iterator("column",function(b,c){if(a===k)return b.aoColumns[c].bVisible;var f=b.aoColumns,g=f[c],j=b.aoData,i,n,l;if(a!==k&&g.bVisible!==a){if(a){var m=
+h.inArray(!0,D(f,"bVisible"),c+1);i=0;for(n=j.length;i<n;i++)l=j[i].nTr,f=j[i].anCells,l&&l.insertBefore(f[c],f[m]||null)}else h(D(b.aoData,"anCells",c)).detach();g.bVisible=a;ea(b,b.aoHeader);ea(b,b.aoFooter);xa(b)}});a!==k&&(this.iterator("column",function(c,e){r(c,null,"column-visibility",[c,e,a,b])}),(b===k||b)&&this.columns.adjust());return c});u("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?$(b,c):c},1)});o("columns.adjust()",
+function(){return this.iterator("table",function(a){Y(a)},1)});o("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===a||"toData"===a)return Z(c,b);if("fromData"===a||"toVisible"===a)return $(c,b)}});o("column()",function(a,b){return ab(this.columns(a,b))});o("cells()",function(a,b,c){h.isPlainObject(a)&&(a.row===k?(c=a,a=null):(c=b,b=null));h.isPlainObject(b)&&(c=b,b=null);if(null===b||b===k)return this.iterator("table",function(b){var d=a,e=$a(c),f=
+b.aoData,g=Ba(b,e),j=Qb(ia(f,g,"anCells")),i=h([].concat.apply([],j)),l,n=b.aoColumns.length,m,o,u,s,r,v;return Za("cell",d,function(a){var c=typeof a==="function";if(a===null||a===k||c){m=[];o=0;for(u=g.length;o<u;o++){l=g[o];for(s=0;s<n;s++){r={row:l,column:s};if(c){v=f[l];a(r,B(b,l,s),v.anCells?v.anCells[s]:null)&&m.push(r)}else m.push(r)}}return m}if(h.isPlainObject(a))return[a];c=i.filter(a).map(function(a,b){return{row:b._DT_CellIndex.row,column:b._DT_CellIndex.column}}).toArray();if(c.length||
+!a.nodeName)return c;v=h(a).closest("*[data-dt-row]");return v.length?[{row:v.data("dt-row"),column:v.data("dt-column")}]:[]},b,e)});var d=this.columns(b,c),e=this.rows(a,c),f,g,j,i,n,l=this.iterator("table",function(a,b){f=[];g=0;for(j=e[b].length;g<j;g++){i=0;for(n=d[b].length;i<n;i++)f.push({row:e[b][g],column:d[b][i]})}return f},1);h.extend(l.selector,{cols:b,rows:a,opts:c});return l});u("cells().nodes()","cell().node()",function(){return this.iterator("cell",function(a,b,c){return(a=a.aoData[b])&&
+a.anCells?a.anCells[c]:k},1)});o("cells().data()",function(){return this.iterator("cell",function(a,b,c){return B(a,b,c)},1)});u("cells().cache()","cell().cache()",function(a){a="search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,d){return b.aoData[c][a][d]},1)});u("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,d){return B(b,c,d,a)},1)});u("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(a,
+b,c){return{row:b,column:c,columnVisible:$(a,c)}},1)});u("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,c,d){ca(b,c,a,d)})});o("cell()",function(a,b,c){return ab(this.cells(a,b,c))});o("cell().data()",function(a){var b=this.context,c=this[0];if(a===k)return b.length&&c.length?B(b[0],c[0].row,c[0].column):k;ib(b[0],c[0].row,c[0].column,a);ca(b[0],c[0].row,"data",c[0].column);return this});o("order()",function(a,b){var c=this.context;if(a===k)return 0!==
+c.length?c[0].aaSorting:k;"number"===typeof a?a=[[a,b]]:a.length&&!h.isArray(a[0])&&(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=a.slice()})});o("order.listener()",function(a,b,c){return this.iterator("table",function(d){La(d,a,b,c)})});o("order.fixed()",function(a){if(!a){var b=this.context,b=b.length?b[0].aaSortingFixed:k;return h.isArray(b)?{pre:b}:b}return this.iterator("table",function(b){b.aaSortingFixed=h.extend(!0,{},a)})});o(["columns().order()",
+"column().order()"],function(a){var b=this;return this.iterator("table",function(c,d){var e=[];h.each(b[d],function(b,c){e.push([c,a])});c.aaSorting=e})});o("search()",function(a,b,c,d){var e=this.context;return a===k?0!==e.length?e[0].oPreviousSearch.sSearch:k:this.iterator("table",function(e){e.oFeatures.bFilter&&fa(e,h.extend({},e.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),1)})});u("columns().search()","column().search()",function(a,
+b,c,d){return this.iterator("column",function(e,f){var g=e.aoPreSearchCols;if(a===k)return g[f].sSearch;e.oFeatures.bFilter&&(h.extend(g[f],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),fa(e,e.oPreviousSearch,1))})});o("state()",function(){return this.context.length?this.context[0].oSavedState:null});o("state.clear()",function(){return this.iterator("table",function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});o("state.loaded()",function(){return this.context.length?
+this.context[0].oLoadedState:null});o("state.save()",function(){return this.iterator("table",function(a){xa(a)})});m.versionCheck=m.fnVersionCheck=function(a){for(var b=m.version.split("."),a=a.split("."),c,d,e=0,f=a.length;e<f;e++)if(c=parseInt(b[e],10)||0,d=parseInt(a[e],10)||0,c!==d)return c>d;return!0};m.isDataTable=m.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;if(a instanceof m.Api)return!0;h.each(m.settings,function(a,e){var f=e.nScrollHead?h("table",e.nScrollHead)[0]:null,g=e.nScrollFoot?
+h("table",e.nScrollFoot)[0]:null;if(e.nTable===b||f===b||g===b)c=!0});return c};m.tables=m.fnTables=function(a){var b=!1;h.isPlainObject(a)&&(b=a.api,a=a.visible);var c=h.map(m.settings,function(b){if(!a||a&&h(b.nTable).is(":visible"))return b.nTable});return b?new s(c):c};m.camelToHungarian=I;o("$()",function(a,b){var c=this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a,b){o(b+"()",function(){var a=Array.prototype.slice.call(arguments);
+a[0]=h.map(a[0].split(/\s/),function(a){return!a.match(/\.dt\b/)?a+".dt":a}).join(" ");var d=h(this.tables().nodes());d[b].apply(d,a);return this})});o("clear()",function(){return this.iterator("table",function(a){na(a)})});o("settings()",function(){return new s(this.context,this.context)});o("init()",function(){var a=this.context;return a.length?a[0].oInit:null});o("data()",function(){return this.iterator("table",function(a){return D(a.aoData,"_aData")}).flatten()});o("destroy()",function(a){a=a||
+!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead,j=b.nTFoot,i=h(e),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),o;b.bDestroying=!0;r(b,"aoDestroyCallback","destroy",[b]);a||(new s(b)).columns().visible(!0);k.off(".DT").find(":not(tbody *)").off(".DT");h(E).off(".DT-"+b.sInstance);e!=g.parentNode&&(i.children("thead").detach(),i.append(g));j&&e!=j.parentNode&&(i.children("tfoot").detach(),i.append(j));
+b.aaSorting=[];b.aaSortingFixed=[];wa(b);h(l).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);f.children().detach();f.append(l);g=a?"remove":"detach";i[g]();k[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),i.css("width",b.sDestroyWidth).removeClass(d.sTable),(o=b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%o])}));c=h.inArray(b,m.settings);-1!==c&&m.settings.splice(c,
+1)})});h.each(["column","row","cell"],function(a,b){o(b+"s().every()",function(a){var d=this.selector.opts,e=this;return this.iterator(b,function(f,g,h,i,n){a.call(e[b](g,"cell"===b?h:d,"cell"===b?d:k),g,h,i,n)})})});o("i18n()",function(a,b,c){var d=this.context[0],a=Q(a)(d.oLanguage);a===k&&(a=b);c!==k&&h.isPlainObject(a)&&(a=a[c]!==k?a[c]:a._);return a.replace("%d",c)});m.version="1.10.16";m.settings=[];m.models={};m.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};m.models.oRow=
+{nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};m.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,
+sWidthOrig:null};m.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,
+this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+
+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",
+sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},m.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};
+X(m.defaults);m.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};X(m.defaults.column);m.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,
+bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],
+aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:k,oAjaxData:k,fnServerData:null,
+aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==y(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==y(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,
+b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};m.ext=x={buttons:{},classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},
+order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:m.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:m.version};h.extend(x,{afnFiltering:x.search,aTypes:x.type.detect,ofnSearch:x.type.search,oSort:x.type.order,afnSortData:x.order,aoFeatures:x.feature,oApi:x.internal,oStdClasses:x.classes,oPagination:x.pager});h.extend(m.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",
+sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",
+sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var Kb=m.ext.pager;h.extend(Kb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(a,b){return[ha(a,
+b)]},simple_numbers:function(a,b){return["previous",ha(a,b),"next"]},full_numbers:function(a,b){return["first","previous",ha(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",ha(a,b),"last"]},_numbers:ha,numbers_length:7});h.extend(!0,m.ext.renderer,{pageButton:{_:function(a,b,c,d,e,f){var g=a.oClasses,j=a.oLanguage.oPaginate,i=a.oLanguage.oAria.paginate||{},n,l,m=0,o=function(b,d){var k,s,u,r,v=function(b){Sa(a,b.data.action,true)};k=0;for(s=d.length;k<s;k++){r=d[k];if(h.isArray(r)){u=
+h("<"+(r.DT_el||"div")+"/>").appendTo(b);o(u,r)}else{n=null;l="";switch(r){case "ellipsis":b.append('<span class="ellipsis">&#x2026;</span>');break;case "first":n=j.sFirst;l=r+(e>0?"":" "+g.sPageButtonDisabled);break;case "previous":n=j.sPrevious;l=r+(e>0?"":" "+g.sPageButtonDisabled);break;case "next":n=j.sNext;l=r+(e<f-1?"":" "+g.sPageButtonDisabled);break;case "last":n=j.sLast;l=r+(e<f-1?"":" "+g.sPageButtonDisabled);break;default:n=r+1;l=e===r?g.sPageButtonActive:""}if(n!==null){u=h("<a>",{"class":g.sPageButton+
+" "+l,"aria-controls":a.sTableId,"aria-label":i[r],"data-dt-idx":m,tabindex:a.iTabIndex,id:c===0&&typeof r==="string"?a.sTableId+"_"+r:null}).html(n).appendTo(b);Va(u,{action:r},v);m++}}}},s;try{s=h(b).find(G.activeElement).data("dt-idx")}catch(u){}o(h(b).empty(),d);s!==k&&h(b).find("[data-dt-idx="+s+"]").focus()}}});h.extend(m.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;return Ya(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&!Zb.test(a))return null;var b=Date.parse(a);
+return null!==b&&!isNaN(b)||L(a)?"date":null},function(a,b){var c=b.oLanguage.sDecimal;return Ya(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Pb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Pb(a,c,!0)?"html-num-fmt"+c:null},function(a){return L(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);h.extend(m.ext.type.search,{html:function(a){return L(a)?a:"string"===typeof a?a.replace(Mb," ").replace(Aa,""):""},string:function(a){return L(a)?
+a:"string"===typeof a?a.replace(Mb," "):a}});var za=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Ob(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};h.extend(x.type.order,{"date-pre":function(a){return Date.parse(a)||-Infinity},"html-pre":function(a){return L(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return L(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return a<
+b?-1:a>b?1:0},"string-desc":function(a,b){return a<b?1:a>b?-1:0}});cb("");h.extend(!0,m.ext.renderer,{header:{_:function(a,b,c,d){h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass)}})},jqueryui:function(a,b,c,d){h("<div/>").addClass(d.sSortJUIWrapper).append(b.contents()).append(h("<span/>").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);
+h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass);b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass(h[e]=="asc"?d.sSortJUIAsc:h[e]=="desc"?d.sSortJUIDesc:c.sSortingClassJUI)}})}}});var Vb=function(a){return"string"===typeof a?a.replace(/</g,"<").replace(/>/g,">").replace(/"/g,
+"""):a};m.render={number:function(a,b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return Vb(f);h=h.toFixed(c);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+f+(e||"")}}},text:function(){return{display:Vb}}};h.extend(m.ext.internal,{_fnExternApiFunc:Lb,_fnBuildAjax:sa,_fnAjaxUpdate:kb,_fnAjaxParameters:tb,_fnAjaxUpdateDraw:ub,
+_fnAjaxDataSrc:ta,_fnAddColumn:Da,_fnColumnOptions:ja,_fnAdjustColumnSizing:Y,_fnVisibleToColumnIndex:Z,_fnColumnIndexToVisible:$,_fnVisbleColumns:aa,_fnGetColumns:la,_fnColumnTypes:Fa,_fnApplyColumnDefs:hb,_fnHungarianMap:X,_fnCamelToHungarian:I,_fnLanguageCompat:Ca,_fnBrowserDetect:fb,_fnAddData:M,_fnAddTr:ma,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==k?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:B,_fnSetCellData:ib,
+_fnSplitObjNotation:Ia,_fnGetObjectDataFn:Q,_fnSetObjectDataFn:R,_fnGetDataMaster:Ja,_fnClearTable:na,_fnDeleteIndex:oa,_fnInvalidate:ca,_fnGetRowElements:Ha,_fnCreateTr:Ga,_fnBuildHead:jb,_fnDrawHead:ea,_fnDraw:N,_fnReDraw:S,_fnAddOptionsHtml:mb,_fnDetectHeader:da,_fnGetUniqueThs:ra,_fnFeatureHtmlFilter:ob,_fnFilterComplete:fa,_fnFilterCustom:xb,_fnFilterColumn:wb,_fnFilter:vb,_fnFilterCreateSearch:Oa,_fnEscapeRegex:Pa,_fnFilterData:yb,_fnFeatureHtmlInfo:rb,_fnUpdateInfo:Bb,_fnInfoMacros:Cb,_fnInitialise:ga,
+_fnInitComplete:ua,_fnLengthChange:Qa,_fnFeatureHtmlLength:nb,_fnFeatureHtmlPaginate:sb,_fnPageChange:Sa,_fnFeatureHtmlProcessing:pb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:qb,_fnScrollDraw:ka,_fnApplyToChildren:H,_fnCalculateColumnWidths:Ea,_fnThrottle:Na,_fnConvertToWidth:Db,_fnGetWidestNode:Eb,_fnGetMaxLenString:Fb,_fnStringToCss:v,_fnSortFlatten:V,_fnSort:lb,_fnSortAria:Hb,_fnSortListener:Ua,_fnSortAttachListener:La,_fnSortingClasses:wa,_fnSortData:Gb,_fnSaveState:xa,_fnLoadState:Ib,_fnSettingsFromNode:ya,
+_fnLog:J,_fnMap:F,_fnBindAction:Va,_fnCallbackReg:z,_fnCallbackFire:r,_fnLengthOverflow:Ra,_fnRenderer:Ma,_fnDataSource:y,_fnRowAttributes:Ka,_fnCalculateEnd:function(){}});h.fn.dataTable=m;m.$=h;h.fn.dataTableSettings=m.settings;h.fn.dataTableExt=m.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};h.each(m,function(a,b){h.fn.DataTable[a]=b});return h.fn.dataTable});
diff --git a/src/main/resources/web/js/rs/libs/jssha/sha1.js b/src/main/resources/web/js/rs/libs/jssha/sha1.js
new file mode 100644
index 0000000..152f638
--- /dev/null
+++ b/src/main/resources/web/js/rs/libs/jssha/sha1.js
@@ -0,0 +1,21 @@
+/*
+ A JavaScript implementation of the SHA family of hashes, as
+ defined in FIPS PUB 180-2 as well as the corresponding HMAC implementation
+ as defined in FIPS PUB 198a
+
+ Copyright Brian Turek 2008-2013
+ Distributed under the BSD License
+ See http://caligatio.github.com/jsSHA/ for more information
+
+ Several functions taken from Paul Johnston
+*/
+(function(A){function q(a,d,b){var f=0,e=[0],c="",g=null,c=b||"UTF8";if("UTF8"!==c&&"UTF16"!==c)throw"encoding must be UTF8 or UTF16";if("HEX"===d){if(0!==a.length%2)throw"srcString of HEX type must be in byte increments";g=t(a);f=g.binLen;e=g.value}else if("ASCII"===d||"TEXT"===d)g=v(a,c),f=g.binLen,e=g.value;else if("B64"===d)g=w(a),f=g.binLen,e=g.value;else throw"inputFormat must be HEX, TEXT, ASCII, or B64";this.getHash=function(a,b,c,d){var g=null,h=e.slice(),k=f,m;3===arguments.length?"number"!==
+typeof c&&(d=c,c=1):2===arguments.length&&(c=1);if(c!==parseInt(c,10)||1>c)throw"numRounds must a integer >= 1";switch(b){case "HEX":g=x;break;case "B64":g=y;break;default:throw"format must be HEX or B64";}if("SHA-1"===a)for(m=0;m<c;m++)h=s(h,k),k=160;else throw"Chosen SHA variant is not supported";return g(h,z(d))};this.getHMAC=function(a,b,d,g,q){var h,k,m,l,r=[],u=[];h=null;switch(g){case "HEX":g=x;break;case "B64":g=y;break;default:throw"outputFormat must be HEX or B64";}if("SHA-1"===d)k=64,l=
+160;else throw"Chosen SHA variant is not supported";if("HEX"===b)h=t(a),m=h.binLen,h=h.value;else if("ASCII"===b||"TEXT"===b)h=v(a,c),m=h.binLen,h=h.value;else if("B64"===b)h=w(a),m=h.binLen,h=h.value;else throw"inputFormat must be HEX, TEXT, ASCII, or B64";a=8*k;b=k/4-1;if(k<m/8){if("SHA-1"===d)h=s(h,m);else throw"Unexpected error in HMAC implementation";h[b]&=4294967040}else k>m/8&&(h[b]&=4294967040);for(k=0;k<=b;k+=1)r[k]=h[k]^909522486,u[k]=h[k]^1549556828;if("SHA-1"===d)d=s(u.concat(s(r.concat(e),
+a+f)),a+l);else throw"Unexpected error in HMAC implementation";return g(d,z(q))}}function v(a,d){var b=[],f,e=[],c=0,g;if("UTF8"===d)for(g=0;g<a.length;g+=1)for(f=a.charCodeAt(g),e=[],2048<f?(e[0]=224|(f&61440)>>>12,e[1]=128|(f&4032)>>>6,e[2]=128|f&63):128<f?(e[0]=192|(f&1984)>>>6,e[1]=128|f&63):e[0]=f,f=0;f<e.length;f+=1)b[c>>>2]|=e[f]<<24-c%4*8,c+=1;else if("UTF16"===d)for(g=0;g<a.length;g+=1)b[c>>>2]|=a.charCodeAt(g)<<16-c%4*8,c+=2;return{value:b,binLen:8*c}}function t(a){var d=[],b=a.length,f,
+e;if(0!==b%2)throw"String of HEX type must be in byte increments";for(f=0;f<b;f+=2){e=parseInt(a.substr(f,2),16);if(isNaN(e))throw"String of HEX type contains invalid characters";d[f>>>3]|=e<<24-f%8*4}return{value:d,binLen:4*b}}function w(a){var d=[],b=0,f,e,c,g,p;if(-1===a.search(/^[a-zA-Z0-9=+\/]+$/))throw"Invalid character in base-64 string";f=a.indexOf("=");a=a.replace(/\=/g,"");if(-1!==f&&f<a.length)throw"Invalid '=' found in base-64 string";for(e=0;e<a.length;e+=4){p=a.substr(e,4);for(c=g=0;c<
+p.length;c+=1)f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(p[c]),g|=f<<18-6*c;for(c=0;c<p.length-1;c+=1)d[b>>2]|=(g>>>16-8*c&255)<<24-b%4*8,b+=1}return{value:d,binLen:8*b}}function x(a,d){var b="",f=4*a.length,e,c;for(e=0;e<f;e+=1)c=a[e>>>2]>>>8*(3-e%4),b+="0123456789abcdef".charAt(c>>>4&15)+"0123456789abcdef".charAt(c&15);return d.outputUpper?b.toUpperCase():b}function y(a,d){var b="",f=4*a.length,e,c,g;for(e=0;e<f;e+=3)for(g=(a[e>>>2]>>>8*(3-e%4)&255)<<16|(a[e+1>>>
+2]>>>8*(3-(e+1)%4)&255)<<8|a[e+2>>>2]>>>8*(3-(e+2)%4)&255,c=0;4>c;c+=1)b=8*e+6*c<=32*a.length?b+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>>6*(3-c)&63):b+d.b64Pad;return b}function z(a){var d={outputUpper:!1,b64Pad:"="};try{a.hasOwnProperty("outputUpper")&&(d.outputUpper=a.outputUpper),a.hasOwnProperty("b64Pad")&&(d.b64Pad=a.b64Pad)}catch(b){}if("boolean"!==typeof d.outputUpper)throw"Invalid outputUpper formatting option";if("string"!==typeof d.b64Pad)throw"Invalid b64Pad formatting option";
+return d}function B(a,d){return a<<d|a>>>32-d}function C(a,d,b){return a^d^b}function D(a,d,b){return a&d^~a&b}function E(a,d,b){return a&d^a&b^d&b}function F(a,d){var b=(a&65535)+(d&65535);return((a>>>16)+(d>>>16)+(b>>>16)&65535)<<16|b&65535}function G(a,d,b,f,e){var c=(a&65535)+(d&65535)+(b&65535)+(f&65535)+(e&65535);return((a>>>16)+(d>>>16)+(b>>>16)+(f>>>16)+(e>>>16)+(c>>>16)&65535)<<16|c&65535}function s(a,d){var b=[],f,e,c,g,p,q,s=D,t=C,v=E,h=B,k=F,m,l,r=G,u,n=[1732584193,4023233417,2562383102,
+271733878,3285377520];a[d>>>5]|=128<<24-d%32;a[(d+65>>>9<<4)+15]=d;u=a.length;for(m=0;m<u;m+=16){f=n[0];e=n[1];c=n[2];g=n[3];p=n[4];for(l=0;80>l;l+=1)b[l]=16>l?a[l+m]:h(b[l-3]^b[l-8]^b[l-14]^b[l-16],1),q=20>l?r(h(f,5),s(e,c,g),p,1518500249,b[l]):40>l?r(h(f,5),t(e,c,g),p,1859775393,b[l]):60>l?r(h(f,5),v(e,c,g),p,2400959708,b[l]):r(h(f,5),t(e,c,g),p,3395469782,b[l]),p=g,g=c,c=h(e,30),e=f,f=q;n[0]=k(f,n[0]);n[1]=k(e,n[1]);n[2]=k(c,n[2]);n[3]=k(g,n[3]);n[4]=k(p,n[4])}return n}"function"===typeof define&&
+typeof define.amd?define(function(){return q}):"undefined"!==typeof exports?"undefined"!==typeof module&&module.exports?module.exports=exports=q:exports=q:A.jsSHA=q})(this);
diff --git a/src/main/resources/web/js/rs/libs/require/require.js b/src/main/resources/web/js/rs/libs/require/require.js
new file mode 100644
index 0000000..a3ca583
--- /dev/null
+++ b/src/main/resources/web/js/rs/libs/require/require.js
@@ -0,0 +1,5 @@
+/** vim: et:ts=4:sw=4:sts=4
+ * @license RequireJS 2.3.5 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, https://github.com/requirejs/requirejs/blob/master/LICENSE
+ */
+var requirejs,require,define;!function(global,setTimeout){function commentReplace(e,t){return t||""}function isFunction(e){return"[object Function]"===ostring.call(e)}function isArray(e){return"[object Array]"===ostring.call(e)}function each(e,t){if(e){var i;for(i=0;i<e.length&&(!e[i]||!t(e[i],i,e));i+=1);}}function eachReverse(e,t){if(e){var i;for(i=e.length-1;i>-1&&(!e[i]||!t(e[i],i,e));i-=1);}}function hasProp(e,t){return hasOwn.call(e,t)}function getOwn(e,t){return hasProp(e,t)&&e[t]}function eachProp(e,t){var i;for(i in e)if(hasProp(e,i)&&t(e[i],i))break}function mixin(e,t,i,r){return t&&eachProp(t,function(t,n){!i&&hasProp(e,n)||(!r||"object"!=typeof t||!t||isArray(t)||isFunction(t)||t instanceof RegExp?e[n]=t:(e[n]||(e[n]={}),mixin(e[n],t,i,r)))}),e}function bind(e,t){return function(){return t.apply(e,arguments)}}function scripts(){return document.getElementsByTagName("script")}function defaultOnError(e){throw e}function getGlobal(e){if(!e)return e;var t=global;return each(e
 .split("."),function(e){t=t[e]}),t}function makeError(e,t,i,r){var n=new Error(t+"\nhttp://requirejs.org/docs/errors.html#"+e);return n.requireType=e,n.requireModules=r,i&&(n.originalError=i),n}function newContext(e){function t(e){var t,i;for(t=0;t<e.length;t++)if("."===(i=e[t]))e.splice(t,1),t-=1;else if(".."===i){if(0===t||1===t&&".."===e[2]||".."===e[t-1])continue;t>0&&(e.splice(t-1,2),t-=2)}}function i(e,i,r){var n,o,a,s,u,c,d,p,f,l,h=i&&i.split("/"),m=y.map,g=m&&m["*"];if(e&&(c=(e=e.split("/")).length-1,y.nodeIdCompat&&jsSuffixRegExp.test(e[c])&&(e[c]=e[c].replace(jsSuffixRegExp,"")),"."===e[0].charAt(0)&&h&&(e=h.slice(0,h.length-1).concat(e)),t(e),e=e.join("/")),r&&m&&(h||g)){e:for(a=(o=e.split("/")).length;a>0;a-=1){if(u=o.slice(0,a).join("/"),h)for(s=h.length;s>0;s-=1)if((n=getOwn(m,h.slice(0,s).join("/")))&&(n=getOwn(n,u))){d=n,p=a;break e}!f&&g&&getOwn(g,u)&&(f=getOwn(g,u),l=a)}!d&&f&&(d=f,p=l),d&&(o.splice(0,p,d),e=o.join("/"))}return getOwn(y.pkgs,e)||e}function r(e){isB
 rowser&&each(scripts(),function(t){if(t.getAttribute("data-requiremodule")===e&&t.getAttribute("data-requirecontext")===q.contextName)return t.parentNode.removeChild(t),!0})}function n(e){var t=getOwn(y.paths,e);if(t&&isArray(t)&&t.length>1)return t.shift(),q.require.undef(e),q.makeRequire(null,{skipMap:!0})([e]),!0}function o(e){var t,i=e?e.indexOf("!"):-1;return i>-1&&(t=e.substring(0,i),e=e.substring(i+1,e.length)),[t,e]}function a(e,t,r,n){var a,s,u,c,d=null,p=t?t.name:null,f=e,l=!0,h="";return e||(l=!1,e="_ at r"+(T+=1)),c=o(e),d=c[0],e=c[1],d&&(d=i(d,p,n),s=getOwn(j,d)),e&&(d?h=r?e:s&&s.normalize?s.normalize(e,function(e){return i(e,p,n)}):-1===e.indexOf("!")?i(e,p,n):e:(d=(c=o(h=i(e,p,n)))[0],h=c[1],r=!0,a=q.nameToUrl(h))),u=!d||s||r?"":"_unnormalized"+(A+=1),{prefix:d,name:h,parentMap:t,unnormalized:!!u,url:a,originalName:f,isDefine:l,id:(d?d+"!"+h:h)+u}}function s(e){var t=e.id,i=getOwn(S,t);return i||(i=S[t]=new q.Module(e)),i}function u(e,t,i){var r=e.id,n=getOwn(S,r);!hasPr
 op(j,r)||n&&!n.defineEmitComplete?(n=s(e)).error&&"error"===t?i(n.error):n.on(t,i):"defined"===t&&i(j[r])}function c(e,t){var i=e.requireModules,r=!1;t?t(e):(each(i,function(t){var i=getOwn(S,t);i&&(i.error=e,i.events.error&&(r=!0,i.emit("error",e)))}),r||req.onError(e))}function d(){globalDefQueue.length&&(each(globalDefQueue,function(e){var t=e[0];"string"==typeof t&&(q.defQueueMap[t]=!0),O.push(e)}),globalDefQueue=[])}function p(e){delete S[e],delete k[e]}function f(e,t,i){var r=e.map.id;e.error?e.emit("error",e.error):(t[r]=!0,each(e.depMaps,function(r,n){var o=r.id,a=getOwn(S,o);!a||e.depMatched[n]||i[o]||(getOwn(t,o)?(e.defineDep(n,j[o]),e.check()):f(a,t,i))}),i[r]=!0)}function l(){var e,t,i=1e3*y.waitSeconds,o=i&&q.startTime+i<(new Date).getTime(),a=[],s=[],u=!1,d=!0;if(!x){if(x=!0,eachProp(k,function(e){var i=e.map,c=i.id;if(e.enabled&&(i.isDefine||s.push(e),!e.error))if(!e.inited&&o)n(c)?(t=!0,u=!0):(a.push(c),r(c));else if(!e.inited&&e.fetched&&i.isDefine&&(u=!0,!i.prefix)
 )return d=!1}),o&&a.length)return e=makeError("timeout","Load timeout for modules: "+a,null,a),e.contextName=q.contextName,c(e);d&&each(s,function(e){f(e,{},{})}),o&&!t||!u||!isBrowser&&!isWebWorker||w||(w=setTimeout(function(){w=0,l()},50)),x=!1}}function h(e){hasProp(j,e[0])||s(a(e[0],null,!0)).init(e[1],e[2])}function m(e,t,i,r){e.detachEvent&&!isOpera?r&&e.detachEvent(r,t):e.removeEventListener(i,t,!1)}function g(e){var t=e.currentTarget||e.srcElement;return m(t,q.onScriptLoad,"load","onreadystatechange"),m(t,q.onScriptError,"error"),{node:t,id:t&&t.getAttribute("data-requiremodule")}}function v(){var e;for(d();O.length;){if(null===(e=O.shift())[0])return c(makeError("mismatch","Mismatched anonymous define() module: "+e[e.length-1]));h(e)}q.defQueueMap={}}var x,b,q,E,w,y={waitSeconds:7,baseUrl:"./",paths:{},bundles:{},pkgs:{},shim:{},config:{}},S={},k={},M={},O=[],j={},P={},R={},T=1,A=1;return E={require:function(e){return e.require?e.require:e.require=q.makeRequire(e.map)},expo
 rts:function(e){if(e.usingExports=!0,e.map.isDefine)return e.exports?j[e.map.id]=e.exports:e.exports=j[e.map.id]={}},module:function(e){return e.module?e.module:e.module={id:e.map.id,uri:e.map.url,config:function(){return getOwn(y.config,e.map.id)||{}},exports:e.exports||(e.exports={})}}},b=function(e){this.events=getOwn(M,e.id)||{},this.map=e,this.shim=getOwn(y.shim,e.id),this.depExports=[],this.depMaps=[],this.depMatched=[],this.pluginMaps={},this.depCount=0},b.prototype={init:function(e,t,i,r){r=r||{},this.inited||(this.factory=t,i?this.on("error",i):this.events.error&&(i=bind(this,function(e){this.emit("error",e)})),this.depMaps=e&&e.slice(0),this.errback=i,this.inited=!0,this.ignore=r.ignore,r.enabled||this.enabled?this.enable():this.check())},defineDep:function(e,t){this.depMatched[e]||(this.depMatched[e]=!0,this.depCount-=1,this.depExports[e]=t)},fetch:function(){if(!this.fetched){this.fetched=!0,q.startTime=(new Date).getTime();var e=this.map;if(!this.shim)return e.prefix?th
 is.callPlugin():this.load();q.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],bind(this,function(){return e.prefix?this.callPlugin():this.load()}))}},load:function(){var e=this.map.url;P[e]||(P[e]=!0,q.load(this.map.id,e))},check:function(){if(this.enabled&&!this.enabling){var e,t,i=this.map.id,r=this.depExports,n=this.exports,o=this.factory;if(this.inited){if(this.error)this.emit("error",this.error);else if(!this.defining){if(this.defining=!0,this.depCount<1&&!this.defined){if(isFunction(o)){if(this.events.error&&this.map.isDefine||req.onError!==defaultOnError)try{n=q.execCb(i,o,r,n)}catch(t){e=t}else n=q.execCb(i,o,r,n);if(this.map.isDefine&&void 0===n&&((t=this.module)?n=t.exports:this.usingExports&&(n=this.exports)),e)return e.requireMap=this.map,e.requireModules=this.map.isDefine?[this.map.id]:null,e.requireType=this.map.isDefine?"define":"require",c(this.error=e)}else n=o;if(this.exports=n,this.map.isDefine&&!this.ignore&&(j[i]=n,req.onResourceLoad)){var a=[]
 ;each(this.depMaps,function(e){a.push(e.normalizedMap||e)}),req.onResourceLoad(q,this.map,a)}p(i),this.defined=!0}this.defining=!1,this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else hasProp(q.defQueueMap,i)||this.fetch()}},callPlugin:function(){var e=this.map,t=e.id,r=a(e.prefix);this.depMaps.push(r),u(r,"defined",bind(this,function(r){var n,o,d,f=getOwn(R,this.map.id),l=this.map.name,h=this.map.parentMap?this.map.parentMap.name:null,m=q.makeRequire(e.parentMap,{enableBuildCallback:!0});return this.map.unnormalized?(r.normalize&&(l=r.normalize(l,function(e){return i(e,h,!0)})||""),o=a(e.prefix+"!"+l,this.map.parentMap,!0),u(o,"defined",bind(this,function(e){this.map.normalizedMap=o,this.init([],function(){return e},null,{enabled:!0,ignore:!0})})),void((d=getOwn(S,o.id))&&(this.depMaps.push(o),this.events.error&&d.on("error",bind(this,function(e){this.emit("error",e)})),d.enable()))):f?(this.map.url=q.nameToUr
 l(f),void this.load()):((n=bind(this,function(e){this.init([],function(){return e},null,{enabled:!0})})).error=bind(this,function(e){this.inited=!0,this.error=e,e.requireModules=[t],eachProp(S,function(e){0===e.map.id.indexOf(t+"_unnormalized")&&p(e.map.id)}),c(e)}),n.fromText=bind(this,function(i,r){var o=e.name,u=a(o),d=useInteractive;r&&(i=r),d&&(useInteractive=!1),s(u),hasProp(y.config,t)&&(y.config[o]=y.config[t]);try{req.exec(i)}catch(e){return c(makeError("fromtexteval","fromText eval for "+t+" failed: "+e,e,[t]))}d&&(useInteractive=!0),this.depMaps.push(u),q.completeLoad(o),m([o],n)}),void r.load(e.name,m,n,y))})),q.enable(r,this),this.pluginMaps[r.id]=r},enable:function(){k[this.map.id]=this,this.enabled=!0,this.enabling=!0,each(this.depMaps,bind(this,function(e,t){var i,r,n;if("string"==typeof e){if(e=a(e,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap),this.depMaps[t]=e,n=getOwn(E,e.id))return void(this.depExports[t]=n(this));this.depCount+=1,u(e,"defined",
 bind(this,function(e){this.undefed||(this.defineDep(t,e),this.check())})),this.errback?u(e,"error",bind(this,this.errback)):this.events.error&&u(e,"error",bind(this,function(e){this.emit("error",e)}))}i=e.id,r=S[i],hasProp(E,i)||!r||r.enabled||q.enable(e,this)})),eachProp(this.pluginMaps,bind(this,function(e){var t=getOwn(S,e.id);t&&!t.enabled&&q.enable(e,this)})),this.enabling=!1,this.check()},on:function(e,t){var i=this.events[e];i||(i=this.events[e]=[]),i.push(t)},emit:function(e,t){each(this.events[e],function(e){e(t)}),"error"===e&&delete this.events[e]}},q={config:y,contextName:e,registry:S,defined:j,urlFetched:P,defQueue:O,defQueueMap:{},Module:b,makeModuleMap:a,nextTick:req.nextTick,onError:c,configure:function(e){if(e.baseUrl&&"/"!==e.baseUrl.charAt(e.baseUrl.length-1)&&(e.baseUrl+="/"),"string"==typeof e.urlArgs){var t=e.urlArgs;e.urlArgs=function(e,i){return(-1===i.indexOf("?")?"?":"&")+t}}var i=y.shim,r={paths:!0,bundles:!0,config:!0,map:!0};eachProp(e,function(e,t){r[t]
 ?(y[t]||(y[t]={}),mixin(y[t],e,!0,!0)):y[t]=e}),e.bundles&&eachProp(e.bundles,function(e,t){each(e,function(e){e!==t&&(R[e]=t)})}),e.shim&&(eachProp(e.shim,function(e,t){isArray(e)&&(e={deps:e}),!e.exports&&!e.init||e.exportsFn||(e.exportsFn=q.makeShimExports(e)),i[t]=e}),y.shim=i),e.packages&&each(e.packages,function(e){var t;t=(e="string"==typeof e?{name:e}:e).name,e.location&&(y.paths[t]=e.location),y.pkgs[t]=e.name+"/"+(e.main||"main").replace(currDirRegExp,"").replace(jsSuffixRegExp,"")}),eachProp(S,function(e,t){e.inited||e.map.unnormalized||(e.map=a(t,null,!0))}),(e.deps||e.callback)&&q.require(e.deps||[],e.callback)},makeShimExports:function(e){return function(){var t;return e.init&&(t=e.init.apply(global,arguments)),t||e.exports&&getGlobal(e.exports)}},makeRequire:function(t,n){function o(i,r,u){var d,p,f;return n.enableBuildCallback&&r&&isFunction(r)&&(r.__requireJsBuild=!0),"string"==typeof i?isFunction(r)?c(makeError("requireargs","Invalid require call"),u):t&&hasProp(E,
 i)?E[i](S[t.id]):req.get?req.get(q,i,t,o):(p=a(i,t,!1,!0),d=p.id,hasProp(j,d)?j[d]:c(makeError("notloaded",'Module name "'+d+'" has not been loaded yet for context: '+e+(t?"":". Use require([])")))):(v(),q.nextTick(function(){v(),(f=s(a(null,t))).skipMap=n.skipMap,f.init(i,r,u,{enabled:!0}),l()}),o)}return n=n||{},mixin(o,{isBrowser:isBrowser,toUrl:function(e){var r,n=e.lastIndexOf("."),o=e.split("/")[0],a="."===o||".."===o;return-1!==n&&(!a||n>1)&&(r=e.substring(n,e.length),e=e.substring(0,n)),q.nameToUrl(i(e,t&&t.id,!0),r,!0)},defined:function(e){return hasProp(j,a(e,t,!1,!0).id)},specified:function(e){return e=a(e,t,!1,!0).id,hasProp(j,e)||hasProp(S,e)}}),t||(o.undef=function(e){d();var i=a(e,t,!0),n=getOwn(S,e);n.undefed=!0,r(e),delete j[e],delete P[i.url],delete M[e],eachReverse(O,function(t,i){t[0]===e&&O.splice(i,1)}),delete q.defQueueMap[e],n&&(n.events.defined&&(M[e]=n.events),p(e))}),o},enable:function(e){getOwn(S,e.id)&&s(e).enable()},completeLoad:function(e){var t,i,r,o=
 getOwn(y.shim,e)||{},a=o.exports;for(d();O.length;){if(null===(i=O.shift())[0]){if(i[0]=e,t)break;t=!0}else i[0]===e&&(t=!0);h(i)}if(q.defQueueMap={},r=getOwn(S,e),!t&&!hasProp(j,e)&&r&&!r.inited){if(!(!y.enforceDefine||a&&getGlobal(a)))return n(e)?void 0:c(makeError("nodefine","No define call for "+e,null,[e]));h([e,o.deps||[],o.exportsFn])}l()},nameToUrl:function(e,t,i){var r,n,o,a,s,u,c,d=getOwn(y.pkgs,e);if(d&&(e=d),c=getOwn(R,e))return q.nameToUrl(c,t,i);if(req.jsExtRegExp.test(e))s=e+(t||"");else{for(r=y.paths,o=(n=e.split("/")).length;o>0;o-=1)if(a=n.slice(0,o).join("/"),u=getOwn(r,a)){isArray(u)&&(u=u[0]),n.splice(0,o,u);break}s=n.join("/"),s=("/"===(s+=t||(/^data\:|^blob\:|\?/.test(s)||i?"":".js")).charAt(0)||s.match(/^[\w\+\.\-]+:/)?"":y.baseUrl)+s}return y.urlArgs&&!/^blob\:/.test(s)?s+y.urlArgs(e,s):s},load:function(e,t){req.load(q,e,t)},execCb:function(e,t,i,r){return t.apply(r,i)},onScriptLoad:function(e){if("load"===e.type||readyRegExp.test((e.currentTarget||e.srcElem
 ent).readyState)){interactiveScript=null;var t=g(e);q.completeLoad(t.id)}},onScriptError:function(e){var t=g(e);if(!n(t.id)){var i=[];return eachProp(S,function(e,r){0!==r.indexOf("_ at r")&&each(e.depMaps,function(e){if(e.id===t.id)return i.push(r),!0})}),c(makeError("scripterror",'Script error for "'+t.id+(i.length?'", needed by: '+i.join(", "):'"'),e,[t.id]))}}},q.require=q.makeRequire(),q}function getInteractiveScript(){return interactiveScript&&"interactive"===interactiveScript.readyState?interactiveScript:(eachReverse(scripts(),function(e){if("interactive"===e.readyState)return interactiveScript=e}),interactiveScript)}var req,s,head,baseElement,dataMain,src,interactiveScript,currentlyAddingScript,mainScript,subPath,version="2.3.5",commentRegExp=/\/\*[\s\S]*?\*\/|([^:"'=]|^)\/\/.*$/gm,cjsRequireRegExp=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,jsSuffixRegExp=/\.js$/,currDirRegExp=/^\.\//,op=Object.prototype,ostring=op.toString,hasOwn=op.hasOwnProperty,isBrowser=!("undefined"
 ==typeof window||"undefined"==typeof navigator||!window.document),isWebWorker=!isBrowser&&"undefined"!=typeof importScripts,readyRegExp=isBrowser&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,defContextName="_",isOpera="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),contexts={},cfg={},globalDefQueue=[],useInteractive=!1;if(void 0===define){if(void 0!==requirejs){if(isFunction(requirejs))return;cfg=requirejs,requirejs=void 0}void 0===require||isFunction(require)||(cfg=require,require=void 0),req=requirejs=function(e,t,i,r){var n,o,a=defContextName;return isArray(e)||"string"==typeof e||(o=e,isArray(t)?(e=t,t=i,i=r):e=[]),o&&o.context&&(a=o.context),(n=getOwn(contexts,a))||(n=contexts[a]=req.s.newContext(a)),o&&n.configure(o),n.require(e,t,i)},req.config=function(e){return req(e)},req.nextTick=void 0!==setTimeout?function(e){setTimeout(e,4)}:function(e){e()},require||(require=req),req.version=version,req.jsExtRegExp=/^\/|:|\?|\.js$/,req.isBrow
 ser=isBrowser,s=req.s={contexts:contexts,newContext:newContext},req({}),each(["toUrl","undef","defined","specified"],function(e){req[e]=function(){var t=contexts[defContextName];return t.require[e].apply(t,arguments)}}),isBrowser&&(head=s.head=document.getElementsByTagName("head")[0],(baseElement=document.getElementsByTagName("base")[0])&&(head=s.head=baseElement.parentNode)),req.onError=defaultOnError,req.createNode=function(e,t,i){var r=e.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script");return r.type=e.scriptType||"text/javascript",r.charset="utf-8",r.async=!0,r},req.load=function(e,t,i){var r,n=e&&e.config||{};if(isBrowser)return(r=req.createNode(n,t,i)).setAttribute("data-requirecontext",e.contextName),r.setAttribute("data-requiremodule",t),!r.attachEvent||r.attachEvent.toString&&r.attachEvent.toString().indexOf("[native code")<0||isOpera?(r.addEventListener("load",e.onScriptLoad,!1),r.addEventListener("error",e.onScri
 ptError,!1)):(useInteractive=!0,r.attachEvent("onreadystatechange",e.onScriptLoad)),r.src=i,n.onNodeCreated&&n.onNodeCreated(r,n,t,i),currentlyAddingScript=r,baseElement?head.insertBefore(r,baseElement):head.appendChild(r),currentlyAddingScript=null,r;if(isWebWorker)try{setTimeout(function(){},0),importScripts(i),e.completeLoad(t)}catch(r){e.onError(makeError("importscripts","importScripts failed for "+t+" at "+i,r,[t]))}},isBrowser&&!cfg.skipDataMain&&eachReverse(scripts(),function(e){if(head||(head=e.parentNode),dataMain=e.getAttribute("data-main"))return mainScript=dataMain,cfg.baseUrl||-1!==mainScript.indexOf("!")||(src=mainScript.split("/"),mainScript=src.pop(),subPath=src.length?src.join("/")+"/":"./",cfg.baseUrl=subPath),mainScript=mainScript.replace(jsSuffixRegExp,""),req.jsExtRegExp.test(mainScript)&&(mainScript=dataMain),cfg.deps=cfg.deps?cfg.deps.concat(mainScript):[mainScript],!0}),define=function(e,t,i){var r,n;"string"!=typeof e&&(i=t,t=e,e=null),isArray(t)||(i=t,t=nul
 l),!t&&isFunction(i)&&(t=[],i.length&&(i.toString().replace(commentRegExp,commentReplace).replace(cjsRequireRegExp,function(e,i){t.push(i)}),t=(1===i.length?["require"]:["require","exports","module"]).concat(t))),useInteractive&&(r=currentlyAddingScript||getInteractiveScript())&&(e||(e=r.getAttribute("data-requiremodule")),n=contexts[r.getAttribute("data-requirecontext")]),n?(n.defQueue.push([e,t,i]),n.defQueueMap[e]=!0):globalDefQueue.push([e,t,i])},define.amd={jQuery:!0},req.exec=function(text){return eval(text)},req(cfg)}}(this,"undefined"==typeof setTimeout?void 0:setTimeout);
\ No newline at end of file
diff --git a/src/main/resources/web/js/rs/libs/require/text.js b/src/main/resources/web/js/rs/libs/require/text.js
new file mode 100644
index 0000000..b8370d6
--- /dev/null
+++ b/src/main/resources/web/js/rs/libs/require/text.js
@@ -0,0 +1,408 @@
+/**
+ * @license text 2.0.15 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, http://github.com/requirejs/text/LICENSE
+ */
+/*jslint regexp: true */
+/*global require, XMLHttpRequest, ActiveXObject,
+  define, window, process, Packages,
+  java, location, Components, FileUtils */
+
+define(['module'], function (module) {
+    'use strict';
+
+    var text, fs, Cc, Ci, xpcIsWindows,
+        progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'],
+        xmlRegExp = /^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,
+        bodyRegExp = /<body[^>]*>\s*([\s\S]+)\s*<\/body>/im,
+        hasLocation = typeof location !== 'undefined' && location.href,
+        defaultProtocol = hasLocation && location.protocol && location.protocol.replace(/\:/, ''),
+        defaultHostName = hasLocation && location.hostname,
+        defaultPort = hasLocation && (location.port || undefined),
+        buildMap = {},
+        masterConfig = (module.config && module.config()) || {};
+
+    function useDefault(value, defaultValue) {
+        return value === undefined || value === '' ? defaultValue : value;
+    }
+
+    //Allow for default ports for http and https.
+    function isSamePort(protocol1, port1, protocol2, port2) {
+        if (port1 === port2) {
+            return true;
+        } else if (protocol1 === protocol2) {
+            if (protocol1 === 'http') {
+                return useDefault(port1, '80') === useDefault(port2, '80');
+            } else if (protocol1 === 'https') {
+                return useDefault(port1, '443') === useDefault(port2, '443');
+            }
+        }
+        return false;
+    }
+
+    text = {
+        version: '2.0.15',
+
+        strip: function (content) {
+            //Strips <?xml ...?> declarations so that external SVG and XML
+            //documents can be added to a document without worry. Also, if the string
+            //is an HTML document, only the part inside the body tag is returned.
+            if (content) {
+                content = content.replace(xmlRegExp, "");
+                var matches = content.match(bodyRegExp);
+                if (matches) {
+                    content = matches[1];
+                }
+            } else {
+                content = "";
+            }
+            return content;
+        },
+
+        jsEscape: function (content) {
+            return content.replace(/(['\\])/g, '\\$1')
+                .replace(/[\f]/g, "\\f")
+                .replace(/[\b]/g, "\\b")
+                .replace(/[\n]/g, "\\n")
+                .replace(/[\t]/g, "\\t")
+                .replace(/[\r]/g, "\\r")
+                .replace(/[\u2028]/g, "\\u2028")
+                .replace(/[\u2029]/g, "\\u2029");
+        },
+
+        createXhr: masterConfig.createXhr || function () {
+            //Would love to dump the ActiveX crap in here. Need IE 6 to die first.
+            var xhr, i, progId;
+            if (typeof XMLHttpRequest !== "undefined") {
+                return new XMLHttpRequest();
+            } else if (typeof ActiveXObject !== "undefined") {
+                for (i = 0; i < 3; i += 1) {
+                    progId = progIds[i];
+                    try {
+                        xhr = new ActiveXObject(progId);
+                    } catch (e) {}
+
+                    if (xhr) {
+                        progIds = [progId];  // so faster next time
+                        break;
+                    }
+                }
+            }
+
+            return xhr;
+        },
+
+        /**
+         * Parses a resource name into its component parts. Resource names
+         * look like: module/name.ext!strip, where the !strip part is
+         * optional.
+         * @param {String} name the resource name
+         * @returns {Object} with properties "moduleName", "ext" and "strip"
+         * where strip is a boolean.
+         */
+        parseName: function (name) {
+            var modName, ext, temp,
+                strip = false,
+                index = name.lastIndexOf("."),
+                isRelative = name.indexOf('./') === 0 ||
+                             name.indexOf('../') === 0;
+
+            if (index !== -1 && (!isRelative || index > 1)) {
+                modName = name.substring(0, index);
+                ext = name.substring(index + 1);
+            } else {
+                modName = name;
+            }
+
+            temp = ext || modName;
+            index = temp.indexOf("!");
+            if (index !== -1) {
+                //Pull off the strip arg.
+                strip = temp.substring(index + 1) === "strip";
+                temp = temp.substring(0, index);
+                if (ext) {
+                    ext = temp;
+                } else {
+                    modName = temp;
+                }
+            }
+
+            return {
+                moduleName: modName,
+                ext: ext,
+                strip: strip
+            };
+        },
+
+        xdRegExp: /^((\w+)\:)?\/\/([^\/\\]+)/,
+
+        /**
+         * Is an URL on another domain. Only works for browser use, returns
+         * false in non-browser environments. Only used to know if an
+         * optimized .js version of a text resource should be loaded
+         * instead.
+         * @param {String} url
+         * @returns Boolean
+         */
+        useXhr: function (url, protocol, hostname, port) {
+            var uProtocol, uHostName, uPort,
+                match = text.xdRegExp.exec(url);
+            if (!match) {
+                return true;
+            }
+            uProtocol = match[2];
+            uHostName = match[3];
+
+            uHostName = uHostName.split(':');
+            uPort = uHostName[1];
+            uHostName = uHostName[0];
+
+            return (!uProtocol || uProtocol === protocol) &&
+                   (!uHostName || uHostName.toLowerCase() === hostname.toLowerCase()) &&
+                   ((!uPort && !uHostName) || isSamePort(uProtocol, uPort, protocol, port));
+        },
+
+        finishLoad: function (name, strip, content, onLoad) {
+            content = strip ? text.strip(content) : content;
+            if (masterConfig.isBuild) {
+                buildMap[name] = content;
+            }
+            onLoad(content);
+        },
+
+        load: function (name, req, onLoad, config) {
+            //Name has format: some.module.filext!strip
+            //The strip part is optional.
+            //if strip is present, then that means only get the string contents
+            //inside a body tag in an HTML string. For XML/SVG content it means
+            //removing the <?xml ...?> declarations so the content can be inserted
+            //into the current doc without problems.
+
+            // Do not bother with the work if a build and text will
+            // not be inlined.
+            if (config && config.isBuild && !config.inlineText) {
+                onLoad();
+                return;
+            }
+
+            masterConfig.isBuild = config && config.isBuild;
+
+            var parsed = text.parseName(name),
+                nonStripName = parsed.moduleName +
+                    (parsed.ext ? '.' + parsed.ext : ''),
+                url = req.toUrl(nonStripName),
+                useXhr = (masterConfig.useXhr) ||
+                         text.useXhr;
+
+            // Do not load if it is an empty: url
+            if (url.indexOf('empty:') === 0) {
+                onLoad();
+                return;
+            }
+
+            //Load the text. Use XHR if possible and in a browser.
+            if (!hasLocation || useXhr(url, defaultProtocol, defaultHostName, defaultPort)) {
+                text.get(url, function (content) {
+                    text.finishLoad(name, parsed.strip, content, onLoad);
+                }, function (err) {
+                    if (onLoad.error) {
+                        onLoad.error(err);
+                    }
+                });
+            } else {
+                //Need to fetch the resource across domains. Assume
+                //the resource has been optimized into a JS module. Fetch
+                //by the module name + extension, but do not include the
+                //!strip part to avoid file system issues.
+                req([nonStripName], function (content) {
+                    text.finishLoad(parsed.moduleName + '.' + parsed.ext,
+                                    parsed.strip, content, onLoad);
+                });
+            }
+        },
+
+        write: function (pluginName, moduleName, write, config) {
+            if (buildMap.hasOwnProperty(moduleName)) {
+                var content = text.jsEscape(buildMap[moduleName]);
+                write.asModule(pluginName + "!" + moduleName,
+                               "define(function () { return '" +
+                                   content +
+                               "';});\n");
+            }
+        },
+
+        writeFile: function (pluginName, moduleName, req, write, config) {
+            var parsed = text.parseName(moduleName),
+                extPart = parsed.ext ? '.' + parsed.ext : '',
+                nonStripName = parsed.moduleName + extPart,
+                //Use a '.js' file name so that it indicates it is a
+                //script that can be loaded across domains.
+                fileName = req.toUrl(parsed.moduleName + extPart) + '.js';
+
+            //Leverage own load() method to load plugin value, but only
+            //write out values that do not have the strip argument,
+            //to avoid any potential issues with ! in file names.
+            text.load(nonStripName, req, function (value) {
+                //Use own write() method to construct full module value.
+                //But need to create shell that translates writeFile's
+                //write() to the right interface.
+                var textWrite = function (contents) {
+                    return write(fileName, contents);
+                };
+                textWrite.asModule = function (moduleName, contents) {
+                    return write.asModule(moduleName, fileName, contents);
+                };
+
+                text.write(pluginName, nonStripName, textWrite, config);
+            }, config);
+        }
+    };
+
+    if (masterConfig.env === 'node' || (!masterConfig.env &&
+            typeof process !== "undefined" &&
+            process.versions &&
+            !!process.versions.node &&
+            !process.versions['node-webkit'] &&
+            !process.versions['atom-shell'])) {
+        //Using special require.nodeRequire, something added by r.js.
+        fs = require.nodeRequire('fs');
+
+        text.get = function (url, callback, errback) {
+            try {
+                var file = fs.readFileSync(url, 'utf8');
+                //Remove BOM (Byte Mark Order) from utf8 files if it is there.
+                if (file[0] === '\uFEFF') {
+                    file = file.substring(1);
+                }
+                callback(file);
+            } catch (e) {
+                if (errback) {
+                    errback(e);
+                }
+            }
+        };
+    } else if (masterConfig.env === 'xhr' || (!masterConfig.env &&
+            text.createXhr())) {
+        text.get = function (url, callback, errback, headers) {
+            var xhr = text.createXhr(), header;
+            xhr.open('GET', url, true);
+
+            //Allow plugins direct access to xhr headers
+            if (headers) {
+                for (header in headers) {
+                    if (headers.hasOwnProperty(header)) {
+                        xhr.setRequestHeader(header.toLowerCase(), headers[header]);
+                    }
+                }
+            }
+
+            //Allow overrides specified in config
+            if (masterConfig.onXhr) {
+                masterConfig.onXhr(xhr, url);
+            }
+
+            xhr.onreadystatechange = function (evt) {
+                var status, err;
+                //Do not explicitly handle errors, those should be
+                //visible via console output in the browser.
+                if (xhr.readyState === 4) {
+                    status = xhr.status || 0;
+                    if (status > 399 && status < 600) {
+                        //An http 4xx or 5xx error. Signal an error.
+                        err = new Error(url + ' HTTP status: ' + status);
+                        err.xhr = xhr;
+                        if (errback) {
+                            errback(err);
+                        }
+                    } else {
+                        callback(xhr.responseText);
+                    }
+
+                    if (masterConfig.onXhrComplete) {
+                        masterConfig.onXhrComplete(xhr, url);
+                    }
+                }
+            };
+            xhr.send(null);
+        };
+    } else if (masterConfig.env === 'rhino' || (!masterConfig.env &&
+            typeof Packages !== 'undefined' && typeof java !== 'undefined')) {
+        //Why Java, why is this so awkward?
+        text.get = function (url, callback) {
+            var stringBuffer, line,
+                encoding = "utf-8",
+                file = new java.io.File(url),
+                lineSeparator = java.lang.System.getProperty("line.separator"),
+                input = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(file), encoding)),
+                content = '';
+            try {
+                stringBuffer = new java.lang.StringBuffer();
+                line = input.readLine();
+
+                // Byte Order Mark (BOM) - The Unicode Standard, version 3.0, page 324
+                // http://www.unicode.org/faq/utf_bom.html
+
+                // Note that when we use utf-8, the BOM should appear as "EF BB BF", but it doesn't due to this bug in the JDK:
+                // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058
+                if (line && line.length() && line.charAt(0) === 0xfeff) {
+                    // Eat the BOM, since we've already found the encoding on this file,
+                    // and we plan to concatenating this buffer with others; the BOM should
+                    // only appear at the top of a file.
+                    line = line.substring(1);
+                }
+
+                if (line !== null) {
+                    stringBuffer.append(line);
+                }
+
+                while ((line = input.readLine()) !== null) {
+                    stringBuffer.append(lineSeparator);
+                    stringBuffer.append(line);
+                }
+                //Make sure we return a JavaScript string and not a Java string.
+                content = String(stringBuffer.toString()); //String
+            } finally {
+                input.close();
+            }
+            callback(content);
+        };
+    } else if (masterConfig.env === 'xpconnect' || (!masterConfig.env &&
+            typeof Components !== 'undefined' && Components.classes &&
+            Components.interfaces)) {
+        //Avert your gaze!
+        Cc = Components.classes;
+        Ci = Components.interfaces;
+        Components.utils['import']('resource://gre/modules/FileUtils.jsm');
+        xpcIsWindows = ('@mozilla.org/windows-registry-key;1' in Cc);
+
+        text.get = function (url, callback) {
+            var inStream, convertStream, fileObj,
+                readData = {};
+
+            if (xpcIsWindows) {
+                url = url.replace(/\//g, '\\');
+            }
+
+            fileObj = new FileUtils.File(url);
+
+            //XPCOM, you so crazy
+            try {
+                inStream = Cc['@mozilla.org/network/file-input-stream;1']
+                           .createInstance(Ci.nsIFileInputStream);
+                inStream.init(fileObj, 1, 0, false);
+
+                convertStream = Cc['@mozilla.org/intl/converter-input-stream;1']
+                                .createInstance(Ci.nsIConverterInputStream);
+                convertStream.init(inStream, "utf-8", inStream.available(),
+                Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);
+
+                convertStream.readString(inStream.available(), readData);
+                convertStream.close();
+                inStream.close();
+                callback(readData.value);
+            } catch (e) {
+                throw new Error((fileObj && fileObj.path || '') + ': ' + e);
+            }
+        };
+    }
+    return text;
+});
diff --git a/src/main/resources/web/js/rs/libs/underscore/underscore-min.js b/src/main/resources/web/js/rs/libs/underscore/underscore-min.js
new file mode 100644
index 0000000..b29332f
--- /dev/null
+++ b/src/main/resources/web/js/rs/libs/underscore/underscore-min.js
@@ -0,0 +1,1548 @@
+//     Underscore.js 1.8.3
+//     http://underscorejs.org
+//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+//     Underscore may be freely distributed under the MIT license.
+
+(function() {
+
+  // Baseline setup
+  // --------------
+
+  // Establish the root object, `window` in the browser, or `exports` on the server.
+  var root = this;
+
+  // Save the previous value of the `_` variable.
+  var previousUnderscore = root._;
+
+  // Save bytes in the minified (but not gzipped) version:
+  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
+
+  // Create quick reference variables for speed access to core prototypes.
+  var
+    push             = ArrayProto.push,
+    slice            = ArrayProto.slice,
+    toString         = ObjProto.toString,
+    hasOwnProperty   = ObjProto.hasOwnProperty;
+
+  // All **ECMAScript 5** native function implementations that we hope to use
+  // are declared here.
+  var
+    nativeIsArray      = Array.isArray,
+    nativeKeys         = Object.keys,
+    nativeBind         = FuncProto.bind,
+    nativeCreate       = Object.create;
+
+  // Naked function reference for surrogate-prototype-swapping.
+  var Ctor = function(){};
+
+  // Create a safe reference to the Underscore object for use below.
+  var _ = function(obj) {
+    if (obj instanceof _) return obj;
+    if (!(this instanceof _)) return new _(obj);
+    this._wrapped = obj;
+  };
+
+  // Export the Underscore object for **Node.js**, with
+  // backwards-compatibility for the old `require()` API. If we're in
+  // the browser, add `_` as a global object.
+  if (typeof exports !== 'undefined') {
+    if (typeof module !== 'undefined' && module.exports) {
+      exports = module.exports = _;
+    }
+    exports._ = _;
+  } else {
+    root._ = _;
+  }
+
+  // Current version.
+  _.VERSION = '1.8.3';
+
+  // Internal function that returns an efficient (for current engines) version
+  // of the passed-in callback, to be repeatedly applied in other Underscore
+  // functions.
+  var optimizeCb = function(func, context, argCount) {
+    if (context === void 0) return func;
+    switch (argCount == null ? 3 : argCount) {
+      case 1: return function(value) {
+        return func.call(context, value);
+      };
+      case 2: return function(value, other) {
+        return func.call(context, value, other);
+      };
+      case 3: return function(value, index, collection) {
+        return func.call(context, value, index, collection);
+      };
+      case 4: return function(accumulator, value, index, collection) {
+        return func.call(context, accumulator, value, index, collection);
+      };
+    }
+    return function() {
+      return func.apply(context, arguments);
+    };
+  };
+
+  // A mostly-internal function to generate callbacks that can be applied
+  // to each element in a collection, returning the desired result — either
+  // identity, an arbitrary callback, a property matcher, or a property accessor.
+  var cb = function(value, context, argCount) {
+    if (value == null) return _.identity;
+    if (_.isFunction(value)) return optimizeCb(value, context, argCount);
+    if (_.isObject(value)) return _.matcher(value);
+    return _.property(value);
+  };
+  _.iteratee = function(value, context) {
+    return cb(value, context, Infinity);
+  };
+
+  // An internal function for creating assigner functions.
+  var createAssigner = function(keysFunc, undefinedOnly) {
+    return function(obj) {
+      var length = arguments.length;
+      if (length < 2 || obj == null) return obj;
+      for (var index = 1; index < length; index++) {
+        var source = arguments[index],
+            keys = keysFunc(source),
+            l = keys.length;
+        for (var i = 0; i < l; i++) {
+          var key = keys[i];
+          if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
+        }
+      }
+      return obj;
+    };
+  };
+
+  // An internal function for creating a new object that inherits from another.
+  var baseCreate = function(prototype) {
+    if (!_.isObject(prototype)) return {};
+    if (nativeCreate) return nativeCreate(prototype);
+    Ctor.prototype = prototype;
+    var result = new Ctor;
+    Ctor.prototype = null;
+    return result;
+  };
+
+  var property = function(key) {
+    return function(obj) {
+      return obj == null ? void 0 : obj[key];
+    };
+  };
+
+  // Helper for collection methods to determine whether a collection
+  // should be iterated as an array or as an object
+  // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
+  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
+  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
+  var getLength = property('length');
+  var isArrayLike = function(collection) {
+    var length = getLength(collection);
+    return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
+  };
+
+  // Collection Functions
+  // --------------------
+
+  // The cornerstone, an `each` implementation, aka `forEach`.
+  // Handles raw objects in addition to array-likes. Treats all
+  // sparse array-likes as if they were dense.
+  _.each = _.forEach = function(obj, iteratee, context) {
+    iteratee = optimizeCb(iteratee, context);
+    var i, length;
+    if (isArrayLike(obj)) {
+      for (i = 0, length = obj.length; i < length; i++) {
+        iteratee(obj[i], i, obj);
+      }
+    } else {
+      var keys = _.keys(obj);
+      for (i = 0, length = keys.length; i < length; i++) {
+        iteratee(obj[keys[i]], keys[i], obj);
+      }
+    }
+    return obj;
+  };
+
+  // Return the results of applying the iteratee to each element.
+  _.map = _.collect = function(obj, iteratee, context) {
+    iteratee = cb(iteratee, context);
+    var keys = !isArrayLike(obj) && _.keys(obj),
+        length = (keys || obj).length,
+        results = Array(length);
+    for (var index = 0; index < length; index++) {
+      var currentKey = keys ? keys[index] : index;
+      results[index] = iteratee(obj[currentKey], currentKey, obj);
+    }
+    return results;
+  };
+
+  // Create a reducing function iterating left or right.
+  function createReduce(dir) {
+    // Optimized iterator function as using arguments.length
+    // in the main function will deoptimize the, see #1991.
+    function iterator(obj, iteratee, memo, keys, index, length) {
+      for (; index >= 0 && index < length; index += dir) {
+        var currentKey = keys ? keys[index] : index;
+        memo = iteratee(memo, obj[currentKey], currentKey, obj);
+      }
+      return memo;
+    }
+
+    return function(obj, iteratee, memo, context) {
+      iteratee = optimizeCb(iteratee, context, 4);
+      var keys = !isArrayLike(obj) && _.keys(obj),
+          length = (keys || obj).length,
+          index = dir > 0 ? 0 : length - 1;
+      // Determine the initial value if none is provided.
+      if (arguments.length < 3) {
+        memo = obj[keys ? keys[index] : index];
+        index += dir;
+      }
+      return iterator(obj, iteratee, memo, keys, index, length);
+    };
+  }
+
+  // **Reduce** builds up a single result from a list of values, aka `inject`,
+  // or `foldl`.
+  _.reduce = _.foldl = _.inject = createReduce(1);
+
+  // The right-associative version of reduce, also known as `foldr`.
+  _.reduceRight = _.foldr = createReduce(-1);
+
+  // Return the first value which passes a truth test. Aliased as `detect`.
+  _.find = _.detect = function(obj, predicate, context) {
+    var key;
+    if (isArrayLike(obj)) {
+      key = _.findIndex(obj, predicate, context);
+    } else {
+      key = _.findKey(obj, predicate, context);
+    }
+    if (key !== void 0 && key !== -1) return obj[key];
+  };
+
+  // Return all the elements that pass a truth test.
+  // Aliased as `select`.
+  _.filter = _.select = function(obj, predicate, context) {
+    var results = [];
+    predicate = cb(predicate, context);
+    _.each(obj, function(value, index, list) {
+      if (predicate(value, index, list)) results.push(value);
+    });
+    return results;
+  };
+
+  // Return all the elements for which a truth test fails.
+  _.reject = function(obj, predicate, context) {
+    return _.filter(obj, _.negate(cb(predicate)), context);
+  };
+
+  // Determine whether all of the elements match a truth test.
+  // Aliased as `all`.
+  _.every = _.all = function(obj, predicate, context) {
+    predicate = cb(predicate, context);
+    var keys = !isArrayLike(obj) && _.keys(obj),
+        length = (keys || obj).length;
+    for (var index = 0; index < length; index++) {
+      var currentKey = keys ? keys[index] : index;
+      if (!predicate(obj[currentKey], currentKey, obj)) return false;
+    }
+    return true;
+  };
+
+  // Determine if at least one element in the object matches a truth test.
+  // Aliased as `any`.
+  _.some = _.any = function(obj, predicate, context) {
+    predicate = cb(predicate, context);
+    var keys = !isArrayLike(obj) && _.keys(obj),
+        length = (keys || obj).length;
+    for (var index = 0; index < length; index++) {
+      var currentKey = keys ? keys[index] : index;
+      if (predicate(obj[currentKey], currentKey, obj)) return true;
+    }
+    return false;
+  };
+
+  // Determine if the array or object contains a given item (using `===`).
+  // Aliased as `includes` and `include`.
+  _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
+    if (!isArrayLike(obj)) obj = _.values(obj);
+    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
+    return _.indexOf(obj, item, fromIndex) >= 0;
+  };
+
+  // Invoke a method (with arguments) on every item in a collection.
+  _.invoke = function(obj, method) {
+    var args = slice.call(arguments, 2);
+    var isFunc = _.isFunction(method);
+    return _.map(obj, function(value) {
+      var func = isFunc ? method : value[method];
+      return func == null ? func : func.apply(value, args);
+    });
+  };
+
+  // Convenience version of a common use case of `map`: fetching a property.
+  _.pluck = function(obj, key) {
+    return _.map(obj, _.property(key));
+  };
+
+  // Convenience version of a common use case of `filter`: selecting only objects
+  // containing specific `key:value` pairs.
+  _.where = function(obj, attrs) {
+    return _.filter(obj, _.matcher(attrs));
+  };
+
+  // Convenience version of a common use case of `find`: getting the first object
+  // containing specific `key:value` pairs.
+  _.findWhere = function(obj, attrs) {
+    return _.find(obj, _.matcher(attrs));
+  };
+
+  // Return the maximum element (or element-based computation).
+  _.max = function(obj, iteratee, context) {
+    var result = -Infinity, lastComputed = -Infinity,
+        value, computed;
+    if (iteratee == null && obj != null) {
+      obj = isArrayLike(obj) ? obj : _.values(obj);
+      for (var i = 0, length = obj.length; i < length; i++) {
+        value = obj[i];
+        if (value > result) {
+          result = value;
+        }
+      }
+    } else {
+      iteratee = cb(iteratee, context);
+      _.each(obj, function(value, index, list) {
+        computed = iteratee(value, index, list);
+        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
+          result = value;
+          lastComputed = computed;
+        }
+      });
+    }
+    return result;
+  };
+
+  // Return the minimum element (or element-based computation).
+  _.min = function(obj, iteratee, context) {
+    var result = Infinity, lastComputed = Infinity,
+        value, computed;
+    if (iteratee == null && obj != null) {
+      obj = isArrayLike(obj) ? obj : _.values(obj);
+      for (var i = 0, length = obj.length; i < length; i++) {
+        value = obj[i];
+        if (value < result) {
+          result = value;
+        }
+      }
+    } else {
+      iteratee = cb(iteratee, context);
+      _.each(obj, function(value, index, list) {
+        computed = iteratee(value, index, list);
+        if (computed < lastComputed || computed === Infinity && result === Infinity) {
+          result = value;
+          lastComputed = computed;
+        }
+      });
+    }
+    return result;
+  };
+
+  // Shuffle a collection, using the modern version of the
+  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
+  _.shuffle = function(obj) {
+    var set = isArrayLike(obj) ? obj : _.values(obj);
+    var length = set.length;
+    var shuffled = Array(length);
+    for (var index = 0, rand; index < length; index++) {
+      rand = _.random(0, index);
+      if (rand !== index) shuffled[index] = shuffled[rand];
+      shuffled[rand] = set[index];
+    }
+    return shuffled;
+  };
+
+  // Sample **n** random values from a collection.
+  // If **n** is not specified, returns a single random element.
+  // The internal `guard` argument allows it to work with `map`.
+  _.sample = function(obj, n, guard) {
+    if (n == null || guard) {
+      if (!isArrayLike(obj)) obj = _.values(obj);
+      return obj[_.random(obj.length - 1)];
+    }
+    return _.shuffle(obj).slice(0, Math.max(0, n));
+  };
+
+  // Sort the object's values by a criterion produced by an iteratee.
+  _.sortBy = function(obj, iteratee, context) {
+    iteratee = cb(iteratee, context);
+    return _.pluck(_.map(obj, function(value, index, list) {
+      return {
+        value: value,
+        index: index,
+        criteria: iteratee(value, index, list)
+      };
+    }).sort(function(left, right) {
+      var a = left.criteria;
+      var b = right.criteria;
+      if (a !== b) {
+        if (a > b || a === void 0) return 1;
+        if (a < b || b === void 0) return -1;
+      }
+      return left.index - right.index;
+    }), 'value');
+  };
+
+  // An internal function used for aggregate "group by" operations.
+  var group = function(behavior) {
+    return function(obj, iteratee, context) {
+      var result = {};
+      iteratee = cb(iteratee, context);
+      _.each(obj, function(value, index) {
+        var key = iteratee(value, index, obj);
+        behavior(result, value, key);
+      });
+      return result;
+    };
+  };
+
+  // Groups the object's values by a criterion. Pass either a string attribute
+  // to group by, or a function that returns the criterion.
+  _.groupBy = group(function(result, value, key) {
+    if (_.has(result, key)) result[key].push(value); else result[key] = [value];
+  });
+
+  // Indexes the object's values by a criterion, similar to `groupBy`, but for
+  // when you know that your index values will be unique.
+  _.indexBy = group(function(result, value, key) {
+    result[key] = value;
+  });
+
+  // Counts instances of an object that group by a certain criterion. Pass
+  // either a string attribute to count by, or a function that returns the
+  // criterion.
+  _.countBy = group(function(result, value, key) {
+    if (_.has(result, key)) result[key]++; else result[key] = 1;
+  });
+
+  // Safely create a real, live array from anything iterable.
+  _.toArray = function(obj) {
+    if (!obj) return [];
+    if (_.isArray(obj)) return slice.call(obj);
+    if (isArrayLike(obj)) return _.map(obj, _.identity);
+    return _.values(obj);
+  };
+
+  // Return the number of elements in an object.
+  _.size = function(obj) {
+    if (obj == null) return 0;
+    return isArrayLike(obj) ? obj.length : _.keys(obj).length;
+  };
+
+  // Split a collection into two arrays: one whose elements all satisfy the given
+  // predicate, and one whose elements all do not satisfy the predicate.
+  _.partition = function(obj, predicate, context) {
+    predicate = cb(predicate, context);
+    var pass = [], fail = [];
+    _.each(obj, function(value, key, obj) {
+      (predicate(value, key, obj) ? pass : fail).push(value);
+    });
+    return [pass, fail];
+  };
+
+  // Array Functions
+  // ---------------
+
+  // Get the first element of an array. Passing **n** will return the first N
+  // values in the array. Aliased as `head` and `take`. The **guard** check
+  // allows it to work with `_.map`.
+  _.first = _.head = _.take = function(array, n, guard) {
+    if (array == null) return void 0;
+    if (n == null || guard) return array[0];
+    return _.initial(array, array.length - n);
+  };
+
+  // Returns everything but the last entry of the array. Especially useful on
+  // the arguments object. Passing **n** will return all the values in
+  // the array, excluding the last N.
+  _.initial = function(array, n, guard) {
+    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
+  };
+
+  // Get the last element of an array. Passing **n** will return the last N
+  // values in the array.
+  _.last = function(array, n, guard) {
+    if (array == null) return void 0;
+    if (n == null || guard) return array[array.length - 1];
+    return _.rest(array, Math.max(0, array.length - n));
+  };
+
+  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
+  // Especially useful on the arguments object. Passing an **n** will return
+  // the rest N values in the array.
+  _.rest = _.tail = _.drop = function(array, n, guard) {
+    return slice.call(array, n == null || guard ? 1 : n);
+  };
+
+  // Trim out all falsy values from an array.
+  _.compact = function(array) {
+    return _.filter(array, _.identity);
+  };
+
+  // Internal implementation of a recursive `flatten` function.
+  var flatten = function(input, shallow, strict, startIndex) {
+    var output = [], idx = 0;
+    for (var i = startIndex || 0, length = getLength(input); i < length; i++) {
+      var value = input[i];
+      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
+        //flatten current level of array or arguments object
+        if (!shallow) value = flatten(value, shallow, strict);
+        var j = 0, len = value.length;
+        output.length += len;
+        while (j < len) {
+          output[idx++] = value[j++];
+        }
+      } else if (!strict) {
+        output[idx++] = value;
+      }
+    }
+    return output;
+  };
+
+  // Flatten out an array, either recursively (by default), or just one level.
+  _.flatten = function(array, shallow) {
+    return flatten(array, shallow, false);
+  };
+
+  // Return a version of the array that does not contain the specified value(s).
+  _.without = function(array) {
+    return _.difference(array, slice.call(arguments, 1));
+  };
+
+  // Produce a duplicate-free version of the array. If the array has already
+  // been sorted, you have the option of using a faster algorithm.
+  // Aliased as `unique`.
+  _.uniq = _.unique = function(array, isSorted, iteratee, context) {
+    if (!_.isBoolean(isSorted)) {
+      context = iteratee;
+      iteratee = isSorted;
+      isSorted = false;
+    }
+    if (iteratee != null) iteratee = cb(iteratee, context);
+    var result = [];
+    var seen = [];
+    for (var i = 0, length = getLength(array); i < length; i++) {
+      var value = array[i],
+          computed = iteratee ? iteratee(value, i, array) : value;
+      if (isSorted) {
+        if (!i || seen !== computed) result.push(value);
+        seen = computed;
+      } else if (iteratee) {
+        if (!_.contains(seen, computed)) {
+          seen.push(computed);
+          result.push(value);
+        }
+      } else if (!_.contains(result, value)) {
+        result.push(value);
+      }
+    }
+    return result;
+  };
+
+  // Produce an array that contains the union: each distinct element from all of
+  // the passed-in arrays.
+  _.union = function() {
+    return _.uniq(flatten(arguments, true, true));
+  };
+
+  // Produce an array that contains every item shared between all the
+  // passed-in arrays.
+  _.intersection = function(array) {
+    var result = [];
+    var argsLength = arguments.length;
+    for (var i = 0, length = getLength(array); i < length; i++) {
+      var item = array[i];
+      if (_.contains(result, item)) continue;
+      for (var j = 1; j < argsLength; j++) {
+        if (!_.contains(arguments[j], item)) break;
+      }
+      if (j === argsLength) result.push(item);
+    }
+    return result;
+  };
+
+  // Take the difference between one array and a number of other arrays.
+  // Only the elements present in just the first array will remain.
+  _.difference = function(array) {
+    var rest = flatten(arguments, true, true, 1);
+    return _.filter(array, function(value){
+      return !_.contains(rest, value);
+    });
+  };
+
+  // Zip together multiple lists into a single array -- elements that share
+  // an index go together.
+  _.zip = function() {
+    return _.unzip(arguments);
+  };
+
+  // Complement of _.zip. Unzip accepts an array of arrays and groups
+  // each array's elements on shared indices
+  _.unzip = function(array) {
+    var length = array && _.max(array, getLength).length || 0;
+    var result = Array(length);
+
+    for (var index = 0; index < length; index++) {
+      result[index] = _.pluck(array, index);
+    }
+    return result;
+  };
+
+  // Converts lists into objects. Pass either a single array of `[key, value]`
+  // pairs, or two parallel arrays of the same length -- one of keys, and one of
+  // the corresponding values.
+  _.object = function(list, values) {
+    var result = {};
+    for (var i = 0, length = getLength(list); i < length; i++) {
+      if (values) {
+        result[list[i]] = values[i];
+      } else {
+        result[list[i][0]] = list[i][1];
+      }
+    }
+    return result;
+  };
+
+  // Generator function to create the findIndex and findLastIndex functions
+  function createPredicateIndexFinder(dir) {
+    return function(array, predicate, context) {
+      predicate = cb(predicate, context);
+      var length = getLength(array);
+      var index = dir > 0 ? 0 : length - 1;
+      for (; index >= 0 && index < length; index += dir) {
+        if (predicate(array[index], index, array)) return index;
+      }
+      return -1;
+    };
+  }
+
+  // Returns the first index on an array-like that passes a predicate test
+  _.findIndex = createPredicateIndexFinder(1);
+  _.findLastIndex = createPredicateIndexFinder(-1);
+
+  // Use a comparator function to figure out the smallest index at which
+  // an object should be inserted so as to maintain order. Uses binary search.
+  _.sortedIndex = function(array, obj, iteratee, context) {
+    iteratee = cb(iteratee, context, 1);
+    var value = iteratee(obj);
+    var low = 0, high = getLength(array);
+    while (low < high) {
+      var mid = Math.floor((low + high) / 2);
+      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
+    }
+    return low;
+  };
+
+  // Generator function to create the indexOf and lastIndexOf functions
+  function createIndexFinder(dir, predicateFind, sortedIndex) {
+    return function(array, item, idx) {
+      var i = 0, length = getLength(array);
+      if (typeof idx == 'number') {
+        if (dir > 0) {
+            i = idx >= 0 ? idx : Math.max(idx + length, i);
+        } else {
+            length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
+        }
+      } else if (sortedIndex && idx && length) {
+        idx = sortedIndex(array, item);
+        return array[idx] === item ? idx : -1;
+      }
+      if (item !== item) {
+        idx = predicateFind(slice.call(array, i, length), _.isNaN);
+        return idx >= 0 ? idx + i : -1;
+      }
+      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
+        if (array[idx] === item) return idx;
+      }
+      return -1;
+    };
+  }
+
+  // Return the position of the first occurrence of an item in an array,
+  // or -1 if the item is not included in the array.
+  // If the array is large and already in sort order, pass `true`
+  // for **isSorted** to use binary search.
+  _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
+  _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);
+
+  // Generate an integer Array containing an arithmetic progression. A port of
+  // the native Python `range()` function. See
+  // [the Python documentation](http://docs.python.org/library/functions.html#range).
+  _.range = function(start, stop, step) {
+    if (stop == null) {
+      stop = start || 0;
+      start = 0;
+    }
+    step = step || 1;
+
+    var length = Math.max(Math.ceil((stop - start) / step), 0);
+    var range = Array(length);
+
+    for (var idx = 0; idx < length; idx++, start += step) {
+      range[idx] = start;
+    }
+
+    return range;
+  };
+
+  // Function (ahem) Functions
+  // ------------------
+
+  // Determines whether to execute a function as a constructor
+  // or a normal function with the provided arguments
+  var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
+    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
+    var self = baseCreate(sourceFunc.prototype);
+    var result = sourceFunc.apply(self, args);
+    if (_.isObject(result)) return result;
+    return self;
+  };
+
+  // Create a function bound to a given object (assigning `this`, and arguments,
+  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
+  // available.
+  _.bind = function(func, context) {
+    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
+    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
+    var args = slice.call(arguments, 2);
+    var bound = function() {
+      return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
+    };
+    return bound;
+  };
+
+  // Partially apply a function by creating a version that has had some of its
+  // arguments pre-filled, without changing its dynamic `this` context. _ acts
+  // as a placeholder, allowing any combination of arguments to be pre-filled.
+  _.partial = function(func) {
+    var boundArgs = slice.call(arguments, 1);
+    var bound = function() {
+      var position = 0, length = boundArgs.length;
+      var args = Array(length);
+      for (var i = 0; i < length; i++) {
+        args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];
+      }
+      while (position < arguments.length) args.push(arguments[position++]);
+      return executeBound(func, bound, this, this, args);
+    };
+    return bound;
+  };
+
+  // Bind a number of an object's methods to that object. Remaining arguments
+  // are the method names to be bound. Useful for ensuring that all callbacks
+  // defined on an object belong to it.
+  _.bindAll = function(obj) {
+    var i, length = arguments.length, key;
+    if (length <= 1) throw new Error('bindAll must be passed function names');
+    for (i = 1; i < length; i++) {
+      key = arguments[i];
+      obj[key] = _.bind(obj[key], obj);
+    }
+    return obj;
+  };
+
+  // Memoize an expensive function by storing its results.
+  _.memoize = function(func, hasher) {
+    var memoize = function(key) {
+      var cache = memoize.cache;
+      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
+      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
+      return cache[address];
+    };
+    memoize.cache = {};
+    return memoize;
+  };
+
+  // Delays a function for the given number of milliseconds, and then calls
+  // it with the arguments supplied.
+  _.delay = function(func, wait) {
+    var args = slice.call(arguments, 2);
+    return setTimeout(function(){
+      return func.apply(null, args);
+    }, wait);
+  };
+
+  // Defers a function, scheduling it to run after the current call stack has
+  // cleared.
+  _.defer = _.partial(_.delay, _, 1);
+
+  // Returns a function, that, when invoked, will only be triggered at most once
+  // during a given window of time. Normally, the throttled function will run
+  // as much as it can, without ever going more than once per `wait` duration;
+  // but if you'd like to disable the execution on the leading edge, pass
+  // `{leading: false}`. To disable execution on the trailing edge, ditto.
+  _.throttle = function(func, wait, options) {
+    var context, args, result;
+    var timeout = null;
+    var previous = 0;
+    if (!options) options = {};
+    var later = function() {
+      previous = options.leading === false ? 0 : _.now();
+      timeout = null;
+      result = func.apply(context, args);
+      if (!timeout) context = args = null;
+    };
+    return function() {
+      var now = _.now();
+      if (!previous && options.leading === false) previous = now;
+      var remaining = wait - (now - previous);
+      context = this;
+      args = arguments;
+      if (remaining <= 0 || remaining > wait) {
+        if (timeout) {
+          clearTimeout(timeout);
+          timeout = null;
+        }
+        previous = now;
+        result = func.apply(context, args);
+        if (!timeout) context = args = null;
+      } else if (!timeout && options.trailing !== false) {
+        timeout = setTimeout(later, remaining);
+      }
+      return result;
+    };
+  };
+
+  // Returns a function, that, as long as it continues to be invoked, will not
+  // be triggered. The function will be called after it stops being called for
+  // N milliseconds. If `immediate` is passed, trigger the function on the
+  // leading edge, instead of the trailing.
+  _.debounce = function(func, wait, immediate) {
+    var timeout, args, context, timestamp, result;
+
+    var later = function() {
+      var last = _.now() - timestamp;
+
+      if (last < wait && last >= 0) {
+        timeout = setTimeout(later, wait - last);
+      } else {
+        timeout = null;
+        if (!immediate) {
+          result = func.apply(context, args);
+          if (!timeout) context = args = null;
+        }
+      }
+    };
+
+    return function() {
+      context = this;
+      args = arguments;
+      timestamp = _.now();
+      var callNow = immediate && !timeout;
+      if (!timeout) timeout = setTimeout(later, wait);
+      if (callNow) {
+        result = func.apply(context, args);
+        context = args = null;
+      }
+
+      return result;
+    };
+  };
+
+  // Returns the first function passed as an argument to the second,
+  // allowing you to adjust arguments, run code before and after, and
+  // conditionally execute the original function.
+  _.wrap = function(func, wrapper) {
+    return _.partial(wrapper, func);
+  };
+
+  // Returns a negated version of the passed-in predicate.
+  _.negate = function(predicate) {
+    return function() {
+      return !predicate.apply(this, arguments);
+    };
+  };
+
+  // Returns a function that is the composition of a list of functions, each
+  // consuming the return value of the function that follows.
+  _.compose = function() {
+    var args = arguments;
+    var start = args.length - 1;
+    return function() {
+      var i = start;
+      var result = args[start].apply(this, arguments);
+      while (i--) result = args[i].call(this, result);
+      return result;
+    };
+  };
+
+  // Returns a function that will only be executed on and after the Nth call.
+  _.after = function(times, func) {
+    return function() {
+      if (--times < 1) {
+        return func.apply(this, arguments);
+      }
+    };
+  };
+
+  // Returns a function that will only be executed up to (but not including) the Nth call.
+  _.before = function(times, func) {
+    var memo;
+    return function() {
+      if (--times > 0) {
+        memo = func.apply(this, arguments);
+      }
+      if (times <= 1) func = null;
+      return memo;
+    };
+  };
+
+  // Returns a function that will be executed at most one time, no matter how
+  // often you call it. Useful for lazy initialization.
+  _.once = _.partial(_.before, 2);
+
+  // Object Functions
+  // ----------------
+
+  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
+  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
+  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
+                      'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
+
+  function collectNonEnumProps(obj, keys) {
+    var nonEnumIdx = nonEnumerableProps.length;
+    var constructor = obj.constructor;
+    var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;
+
+    // Constructor is a special case.
+    var prop = 'constructor';
+    if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);
+
+    while (nonEnumIdx--) {
+      prop = nonEnumerableProps[nonEnumIdx];
+      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
+        keys.push(prop);
+      }
+    }
+  }
+
+  // Retrieve the names of an object's own properties.
+  // Delegates to **ECMAScript 5**'s native `Object.keys`
+  _.keys = function(obj) {
+    if (!_.isObject(obj)) return [];
+    if (nativeKeys) return nativeKeys(obj);
+    var keys = [];
+    for (var key in obj) if (_.has(obj, key)) keys.push(key);
+    // Ahem, IE < 9.
+    if (hasEnumBug) collectNonEnumProps(obj, keys);
+    return keys;
+  };
+
+  // Retrieve all the property names of an object.
+  _.allKeys = function(obj) {
+    if (!_.isObject(obj)) return [];
+    var keys = [];
+    for (var key in obj) keys.push(key);
+    // Ahem, IE < 9.
+    if (hasEnumBug) collectNonEnumProps(obj, keys);
+    return keys;
+  };
+
+  // Retrieve the values of an object's properties.
+  _.values = function(obj) {
+    var keys = _.keys(obj);
+    var length = keys.length;
+    var values = Array(length);
+    for (var i = 0; i < length; i++) {
+      values[i] = obj[keys[i]];
+    }
+    return values;
+  };
+
+  // Returns the results of applying the iteratee to each element of the object
+  // In contrast to _.map it returns an object
+  _.mapObject = function(obj, iteratee, context) {
+    iteratee = cb(iteratee, context);
+    var keys =  _.keys(obj),
+          length = keys.length,
+          results = {},
+          currentKey;
+      for (var index = 0; index < length; index++) {
+        currentKey = keys[index];
+        results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
+      }
+      return results;
+  };
+
+  // Convert an object into a list of `[key, value]` pairs.
+  _.pairs = function(obj) {
+    var keys = _.keys(obj);
+    var length = keys.length;
+    var pairs = Array(length);
+    for (var i = 0; i < length; i++) {
+      pairs[i] = [keys[i], obj[keys[i]]];
+    }
+    return pairs;
+  };
+
+  // Invert the keys and values of an object. The values must be serializable.
+  _.invert = function(obj) {
+    var result = {};
+    var keys = _.keys(obj);
+    for (var i = 0, length = keys.length; i < length; i++) {
+      result[obj[keys[i]]] = keys[i];
+    }
+    return result;
+  };
+
+  // Return a sorted list of the function names available on the object.
+  // Aliased as `methods`
+  _.functions = _.methods = function(obj) {
+    var names = [];
+    for (var key in obj) {
+      if (_.isFunction(obj[key])) names.push(key);
+    }
+    return names.sort();
+  };
+
+  // Extend a given object with all the properties in passed-in object(s).
+  _.extend = createAssigner(_.allKeys);
+
+  // Assigns a given object with all the own properties in the passed-in object(s)
+  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+  _.extendOwn = _.assign = createAssigner(_.keys);
+
+  // Returns the first key on an object that passes a predicate test
+  _.findKey = function(obj, predicate, context) {
+    predicate = cb(predicate, context);
+    var keys = _.keys(obj), key;
+    for (var i = 0, length = keys.length; i < length; i++) {
+      key = keys[i];
+      if (predicate(obj[key], key, obj)) return key;
+    }
+  };
+
+  // Return a copy of the object only containing the whitelisted properties.
+  _.pick = function(object, oiteratee, context) {
+    var result = {}, obj = object, iteratee, keys;
+    if (obj == null) return result;
+    if (_.isFunction(oiteratee)) {
+      keys = _.allKeys(obj);
+      iteratee = optimizeCb(oiteratee, context);
+    } else {
+      keys = flatten(arguments, false, false, 1);
+      iteratee = function(value, key, obj) { return key in obj; };
+      obj = Object(obj);
+    }
+    for (var i = 0, length = keys.length; i < length; i++) {
+      var key = keys[i];
+      var value = obj[key];
+      if (iteratee(value, key, obj)) result[key] = value;
+    }
+    return result;
+  };
+
+   // Return a copy of the object without the blacklisted properties.
+  _.omit = function(obj, iteratee, context) {
+    if (_.isFunction(iteratee)) {
+      iteratee = _.negate(iteratee);
+    } else {
+      var keys = _.map(flatten(arguments, false, false, 1), String);
+      iteratee = function(value, key) {
+        return !_.contains(keys, key);
+      };
+    }
+    return _.pick(obj, iteratee, context);
+  };
+
+  // Fill in a given object with default properties.
+  _.defaults = createAssigner(_.allKeys, true);
+
+  // Creates an object that inherits from the given prototype object.
+  // If additional properties are provided then they will be added to the
+  // created object.
+  _.create = function(prototype, props) {
+    var result = baseCreate(prototype);
+    if (props) _.extendOwn(result, props);
+    return result;
+  };
+
+  // Create a (shallow-cloned) duplicate of an object.
+  _.clone = function(obj) {
+    if (!_.isObject(obj)) return obj;
+    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
+  };
+
+  // Invokes interceptor with the obj, and then returns obj.
+  // The primary purpose of this method is to "tap into" a method chain, in
+  // order to perform operations on intermediate results within the chain.
+  _.tap = function(obj, interceptor) {
+    interceptor(obj);
+    return obj;
+  };
+
+  // Returns whether an object has a given set of `key:value` pairs.
+  _.isMatch = function(object, attrs) {
+    var keys = _.keys(attrs), length = keys.length;
+    if (object == null) return !length;
+    var obj = Object(object);
+    for (var i = 0; i < length; i++) {
+      var key = keys[i];
+      if (attrs[key] !== obj[key] || !(key in obj)) return false;
+    }
+    return true;
+  };
+
+
+  // Internal recursive comparison function for `isEqual`.
+  var eq = function(a, b, aStack, bStack) {
+    // Identical objects are equal. `0 === -0`, but they aren't identical.
+    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
+    if (a === b) return a !== 0 || 1 / a === 1 / b;
+    // A strict comparison is necessary because `null == undefined`.
+    if (a == null || b == null) return a === b;
+    // Unwrap any wrapped objects.
+    if (a instanceof _) a = a._wrapped;
+    if (b instanceof _) b = b._wrapped;
+    // Compare `[[Class]]` names.
+    var className = toString.call(a);
+    if (className !== toString.call(b)) return false;
+    switch (className) {
+      // Strings, numbers, regular expressions, dates, and booleans are compared by value.
+      case '[object RegExp]':
+      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
+      case '[object String]':
+        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+        // equivalent to `new String("5")`.
+        return '' + a === '' + b;
+      case '[object Number]':
+        // `NaN`s are equivalent, but non-reflexive.
+        // Object(NaN) is equivalent to NaN
+        if (+a !== +a) return +b !== +b;
+        // An `egal` comparison is performed for other numeric values.
+        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
+      case '[object Date]':
+      case '[object Boolean]':
+        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+        // millisecond representations. Note that invalid dates with millisecond representations
+        // of `NaN` are not equivalent.
+        return +a === +b;
+    }
+
+    var areArrays = className === '[object Array]';
+    if (!areArrays) {
+      if (typeof a != 'object' || typeof b != 'object') return false;
+
+      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
+      // from different frames are.
+      var aCtor = a.constructor, bCtor = b.constructor;
+      if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
+                               _.isFunction(bCtor) && bCtor instanceof bCtor)
+                          && ('constructor' in a && 'constructor' in b)) {
+        return false;
+      }
+    }
+    // Assume equality for cyclic structures. The algorithm for detecting cyclic
+    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+
+    // Initializing stack of traversed objects.
+    // It's done here since we only need them for objects and arrays comparison.
+    aStack = aStack || [];
+    bStack = bStack || [];
+    var length = aStack.length;
+    while (length--) {
+      // Linear search. Performance is inversely proportional to the number of
+      // unique nested structures.
+      if (aStack[length] === a) return bStack[length] === b;
+    }
+
+    // Add the first object to the stack of traversed objects.
+    aStack.push(a);
+    bStack.push(b);
+
+    // Recursively compare objects and arrays.
+    if (areArrays) {
+      // Compare array lengths to determine if a deep comparison is necessary.
+      length = a.length;
+      if (length !== b.length) return false;
+      // Deep compare the contents, ignoring non-numeric properties.
+      while (length--) {
+        if (!eq(a[length], b[length], aStack, bStack)) return false;
+      }
+    } else {
+      // Deep compare objects.
+      var keys = _.keys(a), key;
+      length = keys.length;
+      // Ensure that both objects contain the same number of properties before comparing deep equality.
+      if (_.keys(b).length !== length) return false;
+      while (length--) {
+        // Deep compare each member
+        key = keys[length];
+        if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
+      }
+    }
+    // Remove the first object from the stack of traversed objects.
+    aStack.pop();
+    bStack.pop();
+    return true;
+  };
+
+  // Perform a deep comparison to check if two objects are equal.
+  _.isEqual = function(a, b) {
+    return eq(a, b);
+  };
+
+  // Is a given array, string, or object empty?
+  // An "empty" object has no enumerable own-properties.
+  _.isEmpty = function(obj) {
+    if (obj == null) return true;
+    if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
+    return _.keys(obj).length === 0;
+  };
+
+  // Is a given value a DOM element?
+  _.isElement = function(obj) {
+    return !!(obj && obj.nodeType === 1);
+  };
+
+  // Is a given value an array?
+  // Delegates to ECMA5's native Array.isArray
+  _.isArray = nativeIsArray || function(obj) {
+    return toString.call(obj) === '[object Array]';
+  };
+
+  // Is a given variable an object?
+  _.isObject = function(obj) {
+    var type = typeof obj;
+    return type === 'function' || type === 'object' && !!obj;
+  };
+
+  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
+  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
+    _['is' + name] = function(obj) {
+      return toString.call(obj) === '[object ' + name + ']';
+    };
+  });
+
+  // Define a fallback version of the method in browsers (ahem, IE < 9), where
+  // there isn't any inspectable "Arguments" type.
+  if (!_.isArguments(arguments)) {
+    _.isArguments = function(obj) {
+      return _.has(obj, 'callee');
+    };
+  }
+
+  // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
+  // IE 11 (#1621), and in Safari 8 (#1929).
+  if (typeof /./ != 'function' && typeof Int8Array != 'object') {
+    _.isFunction = function(obj) {
+      return typeof obj == 'function' || false;
+    };
+  }
+
+  // Is a given object a finite number?
+  _.isFinite = function(obj) {
+    return isFinite(obj) && !isNaN(parseFloat(obj));
+  };
+
+  // Is the given value `NaN`? (NaN is the only number which does not equal itself).
+  _.isNaN = function(obj) {
+    return _.isNumber(obj) && obj !== +obj;
+  };
+
+  // Is a given value a boolean?
+  _.isBoolean = function(obj) {
+    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
+  };
+
+  // Is a given value equal to null?
+  _.isNull = function(obj) {
+    return obj === null;
+  };
+
+  // Is a given variable undefined?
+  _.isUndefined = function(obj) {
+    return obj === void 0;
+  };
+
+  // Shortcut function for checking if an object has a given property directly
+  // on itself (in other words, not on a prototype).
+  _.has = function(obj, key) {
+    return obj != null && hasOwnProperty.call(obj, key);
+  };
+
+  // Utility Functions
+  // -----------------
+
+  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
+  // previous owner. Returns a reference to the Underscore object.
+  _.noConflict = function() {
+    root._ = previousUnderscore;
+    return this;
+  };
+
+  // Keep the identity function around for default iteratees.
+  _.identity = function(value) {
+    return value;
+  };
+
+  // Predicate-generating functions. Often useful outside of Underscore.
+  _.constant = function(value) {
+    return function() {
+      return value;
+    };
+  };
+
+  _.noop = function(){};
+
+  _.property = property;
+
+  // Generates a function for a given object that returns a given property.
+  _.propertyOf = function(obj) {
+    return obj == null ? function(){} : function(key) {
+      return obj[key];
+    };
+  };
+
+  // Returns a predicate for checking whether an object has a given set of
+  // `key:value` pairs.
+  _.matcher = _.matches = function(attrs) {
+    attrs = _.extendOwn({}, attrs);
+    return function(obj) {
+      return _.isMatch(obj, attrs);
+    };
+  };
+
+  // Run a function **n** times.
+  _.times = function(n, iteratee, context) {
+    var accum = Array(Math.max(0, n));
+    iteratee = optimizeCb(iteratee, context, 1);
+    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
+    return accum;
+  };
+
+  // Return a random integer between min and max (inclusive).
+  _.random = function(min, max) {
+    if (max == null) {
+      max = min;
+      min = 0;
+    }
+    return min + Math.floor(Math.random() * (max - min + 1));
+  };
+
+  // A (possibly faster) way to get the current timestamp as an integer.
+  _.now = Date.now || function() {
+    return new Date().getTime();
+  };
+
+   // List of HTML entities for escaping.
+  var escapeMap = {
+    '&': '&',
+    '<': '<',
+    '>': '>',
+    '"': '"',
+    "'": '&#x27;',
+    '`': '&#x60;'
+  };
+  var unescapeMap = _.invert(escapeMap);
+
+  // Functions for escaping and unescaping strings to/from HTML interpolation.
+  var createEscaper = function(map) {
+    var escaper = function(match) {
+      return map[match];
+    };
+    // Regexes for identifying a key that needs to be escaped
+    var source = '(?:' + _.keys(map).join('|') + ')';
+    var testRegexp = RegExp(source);
+    var replaceRegexp = RegExp(source, 'g');
+    return function(string) {
+      string = string == null ? '' : '' + string;
+      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
+    };
+  };
+  _.escape = createEscaper(escapeMap);
+  _.unescape = createEscaper(unescapeMap);
+
+  // If the value of the named `property` is a function then invoke it with the
+  // `object` as context; otherwise, return it.
+  _.result = function(object, property, fallback) {
+    var value = object == null ? void 0 : object[property];
+    if (value === void 0) {
+      value = fallback;
+    }
+    return _.isFunction(value) ? value.call(object) : value;
+  };
+
+  // Generate a unique integer id (unique within the entire client session).
+  // Useful for temporary DOM ids.
+  var idCounter = 0;
+  _.uniqueId = function(prefix) {
+    var id = ++idCounter + '';
+    return prefix ? prefix + id : id;
+  };
+
+  // By default, Underscore uses ERB-style template delimiters, change the
+  // following template settings to use alternative delimiters.
+  _.templateSettings = {
+    evaluate    : /<%([\s\S]+?)%>/g,
+    interpolate : /<%=([\s\S]+?)%>/g,
+    escape      : /<%-([\s\S]+?)%>/g
+  };
+
+  // When customizing `templateSettings`, if you don't want to define an
+  // interpolation, evaluation or escaping regex, we need one that is
+  // guaranteed not to match.
+  var noMatch = /(.)^/;
+
+  // Certain characters need to be escaped so that they can be put into a
+  // string literal.
+  var escapes = {
+    "'":      "'",
+    '\\':     '\\',
+    '\r':     'r',
+    '\n':     'n',
+    '\u2028': 'u2028',
+    '\u2029': 'u2029'
+  };
+
+  var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
+
+  var escapeChar = function(match) {
+    return '\\' + escapes[match];
+  };
+
+  // JavaScript micro-templating, similar to John Resig's implementation.
+  // Underscore templating handles arbitrary delimiters, preserves whitespace,
+  // and correctly escapes quotes within interpolated code.
+  // NB: `oldSettings` only exists for backwards compatibility.
+  _.template = function(text, settings, oldSettings) {
+    if (!settings && oldSettings) settings = oldSettings;
+    settings = _.defaults({}, settings, _.templateSettings);
+
+    // Combine delimiters into one regular expression via alternation.
+    var matcher = RegExp([
+      (settings.escape || noMatch).source,
+      (settings.interpolate || noMatch).source,
+      (settings.evaluate || noMatch).source
+    ].join('|') + '|$', 'g');
+
+    // Compile the template source, escaping string literals appropriately.
+    var index = 0;
+    var source = "__p+='";
+    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+      source += text.slice(index, offset).replace(escaper, escapeChar);
+      index = offset + match.length;
+
+      if (escape) {
+        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+      } else if (interpolate) {
+        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+      } else if (evaluate) {
+        source += "';\n" + evaluate + "\n__p+='";
+      }
+
+      // Adobe VMs need the match returned to produce the correct offest.
+      return match;
+    });
+    source += "';\n";
+
+    // If a variable is not specified, place data values in local scope.
+    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
+
+    source = "var __t,__p='',__j=Array.prototype.join," +
+      "print=function(){__p+=__j.call(arguments,'');};\n" +
+      source + 'return __p;\n';
+
+    try {
+      var render = new Function(settings.variable || 'obj', '_', source);
+    } catch (e) {
+      e.source = source;
+      throw e;
+    }
+
+    var template = function(data) {
+      return render.call(this, data, _);
+    };
+
+    // Provide the compiled source as a convenience for precompilation.
+    var argument = settings.variable || 'obj';
+    template.source = 'function(' + argument + '){\n' + source + '}';
+
+    return template;
+  };
+
+  // Add a "chain" function. Start chaining a wrapped Underscore object.
+  _.chain = function(obj) {
+    var instance = _(obj);
+    instance._chain = true;
+    return instance;
+  };
+
+  // OOP
+  // ---------------
+  // If Underscore is called as a function, it returns a wrapped object that
+  // can be used OO-style. This wrapper holds altered versions of all the
+  // underscore functions. Wrapped objects may be chained.
+
+  // Helper function to continue chaining intermediate results.
+  var result = function(instance, obj) {
+    return instance._chain ? _(obj).chain() : obj;
+  };
+
+  // Add your own custom functions to the Underscore object.
+  _.mixin = function(obj) {
+    _.each(_.functions(obj), function(name) {
+      var func = _[name] = obj[name];
+      _.prototype[name] = function() {
+        var args = [this._wrapped];
+        push.apply(args, arguments);
+        return result(this, func.apply(_, args));
+      };
+    });
+  };
+
+  // Add all of the Underscore functions to the wrapper object.
+  _.mixin(_);
+
+  // Add all mutator Array functions to the wrapper.
+  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+    var method = ArrayProto[name];
+    _.prototype[name] = function() {
+      var obj = this._wrapped;
+      method.apply(obj, arguments);
+      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
+      return result(this, obj);
+    };
+  });
+
+  // Add all accessor Array functions to the wrapper.
+  _.each(['concat', 'join', 'slice'], function(name) {
+    var method = ArrayProto[name];
+    _.prototype[name] = function() {
+      return result(this, method.apply(this._wrapped, arguments));
+    };
+  });
+
+  // Extracts the result from a wrapped and chained object.
+  _.prototype.value = function() {
+    return this._wrapped;
+  };
+
+  // Provide unwrapping proxy for some methods used in engine operations
+  // such as arithmetic and JSON stringification.
+  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
+
+  _.prototype.toString = function() {
+    return '' + this._wrapped;
+  };
+
+  // AMD registration happens at the end for compatibility with AMD loaders
+  // that may not enforce next-turn semantics on modules. Even though general
+  // practice for AMD registration is to be anonymous, underscore registers
+  // as a named module because, like jQuery, it is a base library that is
+  // popular enough to be bundled in a third party lib, but not be part of
+  // an AMD load request. Those cases could generate an error when an
+  // anonymous define() is called outside of a loader request.
+  if (typeof define === 'function' && define.amd) {
+    define('underscore', [], function() {
+      return _;
+    });
+  }
+}.call(this));
diff --git a/src/main/resources/web/js/rs/main.js b/src/main/resources/web/js/rs/main.js
new file mode 100644
index 0000000..c96d7cd
--- /dev/null
+++ b/src/main/resources/web/js/rs/main.js
@@ -0,0 +1,42 @@
+// ~ main.js ~
+// Main GLClient starter
+// based on work done by @jrburke
+// Configure require.js shortcut aliases
+require.config({
+  shim : {
+    "bootstrap" : { "deps" :['jquery'] }
+  },
+  paths: {
+    jquery: '/js/jquery-3.2.1.min',
+    underscore: '/js/rs/libs/underscore/underscore-min',
+    backbone: '/js/rs/libs/backbone/backbone.min',
+    text: '/js/rs/libs/require/text',
+    datatables: '/js/rs/libs/datatables/jquery.dataTables.min',
+    datatablest: '/js/rs/libs/datatables/dataTables.TorStatus',
+    datatablessort: '/js/rs/libs/datatables/dataTables.Sorting',
+    bootstrap: '/js/rs/libs/bootstrap/bootstrap.min',
+    datatablesbs: '/js/rs/libs/datatables/dataTables.bootstrap',
+    d3js: '/js/rs/libs/d3js/d3.v3.min',
+    "d3-geo-projection": '/js/rs/libs/d3js/d3-geo-projection.v2.min',
+    "d3-geo": '/js/rs/libs/d3js/d3-geo.v1.min',
+    "d3-array": '/js/rs/libs/d3js/d3-array.v1.min',
+    topojson: '/js/rs/libs/d3js/topojson.v1.min',
+    jssha: '/js/rs/libs/jssha/sha1',
+    templates: '/templates/rs',
+    fallbackdir: '/js/rs/fallback_dir'
+  }
+
+});
+
+require([
+
+  // Load our app module and pass it to our definition function
+  'app'
+
+  // Some plugins have to be loaded in order due to their non AMD compliance
+  // Because these scripts are not "modules" they do not pass any values to the definition function below
+], function(App){
+  // The "app" dependency is passed in as "App"
+  // Again, the other dependencies passed in are not "AMD" therefore don't pass a parameter to this function
+  App.initialize();
+});
diff --git a/src/main/resources/web/js/rs/models/aggregate.js b/src/main/resources/web/js/rs/models/aggregate.js
new file mode 100644
index 0000000..6c2a059
--- /dev/null
+++ b/src/main/resources/web/js/rs/models/aggregate.js
@@ -0,0 +1,26 @@
+// ~ models/aggregateModel ~
+define([
+  'jquery',
+  'underscore',
+  'backbone',
+  'helpers'
+], function($, _, Backbone){
+	var aggregateModel = Backbone.Model.extend({
+          country: null,
+          as: null,
+          as_name: null,
+          guard_probability: 0,
+          middle_probability: 0,
+          exit_probability: 0,
+          advertised_bandwidth: 0,
+          consensus_weight: 0,
+          consensus_weight_fraction: 0,
+          consensus_weight_to_bandwidth: 0,
+          consensus_weight_to_bandwidth_count: 0,
+          relays: 0,
+          guards: 0,
+          exits: 0,
+          version: null
+	});
+	return aggregateModel;
+});
diff --git a/src/main/resources/web/js/rs/models/graph.js b/src/main/resources/web/js/rs/models/graph.js
new file mode 100644
index 0000000..668fc6d
--- /dev/null
+++ b/src/main/resources/web/js/rs/models/graph.js
@@ -0,0 +1,211 @@
+// This is the boilerplate file
+// it should be used as a base for every module
+define([
+  'jquery',
+  'underscore',
+  'backbone'
+], function($, _, Backbone){
+
+    function parseHistory(history, model, relay, name) {
+        var newar;
+        _.each(_.keys(history), function(period, i) {
+            var first = history[period].first.split(' ');
+            var date = first[0].split('-');
+            var time = first[1].split(':');
+            first = new Date(date[0], date[1]-1, date[2],
+                            time[0], time[1], time[2]);
+            var y = first.getTime();
+
+            _.each(history[period].values, function(value, i) {
+                var x = null
+                if (value != null) {
+                    x = value*history[period].factor;
+                }
+
+                // This is quite a hack to conform to backbone.js
+                // funky way of setting and getting attributes in
+                // models.
+                // XXX probably want to refactor.
+                var mperiod = "bw_" + period.split("_")[1]
+                var newar = model.get(mperiod)[name];
+                newar.push([y,x]);
+                y += history[period].interval*1000;
+            });
+        });
+        return newar;
+    };
+
+    function parseWeightHistory(history, model, name) {
+        var newar;
+        _.each(_.keys(history), function(period, i) {
+            var first = history[period].first.split(' ');
+            var date = first[0].split('-');
+            var time = first[1].split(':');
+            first = new Date(date[0], date[1]-1, date[2],
+                            time[0], time[1], time[2]);
+            var y = first.getTime();
+            _.each(history[period].values, function(value, i) {
+                var x = null
+                if (value != null) {
+                    x = value*history[period].factor;
+                }
+                var mperiod = "weights_" + period.split("_")[1]
+                newar = model.get(mperiod)[name];
+                newar.push([y,x]);
+                y += history[period].interval*1000;
+            });
+        });
+        return newar;
+    };
+
+    function parseClients(history, model, name) {
+        var newar;
+        _.each(_.keys(history), function(period, i) {
+            var first = history[period].first.split(' ');
+            var date = first[0].split('-');
+            var time = first[1].split(':');
+            first = new Date(date[0], date[1]-1, date[2],
+                            time[0], time[1], time[2]);
+            var y = first.getTime();
+            _.each(history[period].values, function(value, i) {
+                var x = null
+                if (value != null) {
+                    x = value*history[period].factor;
+                }
+                var mperiod = "clients_" + period.split("_")[1]
+                newar = model.get(mperiod)[name];
+                newar.push([y,x]);
+                y += history[period].interval*1000;
+            });
+        });
+        return newar;
+    };
+
+    var graphModel = Backbone.Model.extend({
+        baseurl: 'https://onionoo.torproject.org',
+        initialize: function() {
+        this.set({
+            bw_month: {write: [], read: []},
+            bw_months: {write: [], read: []},
+            bw_year: {write: [], read: []},
+            bw_years: {write: [], read: []},
+            clients_week: {average: []},
+            clients_month: {average: []},
+            clients_months: {average: []},
+            clients_year: {average: []},
+            clients_years: {average: []},
+            weights_week: {cw: [], guard: [], middle: [], exit: []},
+            weights_month: {cw: [], guard: [], middle: [], exit: []},
+            weights_months: {cw: [], guard: [], middle: [], exit: []},
+            weights_year: {cw: [], guard: [], middle: [], exit: []},
+            weights_years: {cw: [], guard: [], middle: [], exit: []}
+            });
+        },
+        lookup_bw: function(fingerprint, options) {
+            var model = this;
+            var success = options.success;
+            // Clear the model
+            this.set({
+                bw_month: {write: [], read: []},
+                bw_months: {write: [], read: []},
+                bw_year: {write: [], read: []},
+                bw_years: {write: [], read: []}
+            });
+
+            var xhr = $.getJSON(this.baseurl+'/bandwidth?lookup='+fingerprint, function(data) {
+                checkIfDataIsUpToDate(xhr.getResponseHeader("Last-Modified"));
+                model.data = data;
+                success(model, data);
+            });
+        },
+        parse_bw_data: function(data) {
+            var model = this;
+            var relay = data.relays[0];
+            if (!relay)
+                relay = data.bridges[0];
+            this.fingerprint = relay.fingerprint;
+            // Parse the read and write history of the relay
+            var write_history = parseHistory(relay.write_history, model, relay, 'write');
+            var read_history = parseHistory(relay.read_history, model, relay, 'read');
+            var toset = {mperiod: {read: read_history, write: write_history}};
+            model.set(toset);
+        },
+        lookup_weights: function(fingerprint, options) {
+            var model = this;
+            var success = options.success;
+            // Clear the model
+            this.set({
+                weights_week: {cw: [], guard: [], middle: [], exit: []},
+                weights_month: {cw: [], guard: [], middle: [], exit: []},
+                weights_months: {cw: [], guard: [], middle: [], exit: []},
+                weights_year: {cw: [], guard: [], middle: [], exit: []},
+                weights_years: {cw: [], guard: [], middle: [], exit: []}
+            });
+
+            var xhr = $.getJSON(this.baseurl+'/weights?lookup='+fingerprint, function(data) {
+                checkIfDataIsUpToDate(xhr.getResponseHeader("Last-Modified"));
+                model.data = data;
+                success(model, data);
+            });
+        },
+        parse_weights_data: function(data) {
+            var model = this;
+            var relay = data.relays[0];
+            if (!relay)
+                relay = data.bridges[0];
+            this.fingerprint = relay.fingerprint;
+
+            if ("consensus_weight_fraction" in relay) {
+                var cw = parseWeightHistory(relay.consensus_weight_fraction, model, 'cw');
+                model.set({mperiod: {cw: cw}});
+            }
+
+            if ("guard_probability" in relay) {
+                var guard = parseWeightHistory(relay.guard_probability, model, 'guard');
+                model.set({mperiod: {guard: guard}});
+            }
+
+            if ("middle_probability" in relay) {
+                var middle = parseWeightHistory(relay.middle_probability, model, 'middle');
+                model.set({mperiod: {middle: middle}});
+            }
+
+            if ("exit_probability" in relay) {
+                var exit = parseWeightHistory(relay.exit_probability, model, 'exit');
+                model.set({mperiod: {exit: exit}});
+            }
+        },
+        lookup_clients: function(fingerprint, options) {
+            var model = this;
+            var success = options.success;
+            // Clear the model
+            this.set({
+                clients_week: {average: []},
+                clients_month: {average: []},
+                clients_months: {average: []},
+                clients_year: {average: []},
+                clients_years: {average: []}
+            });
+
+            var xhr = $.getJSON(this.baseurl+'/clients?lookup='+fingerprint, function(data) {
+                checkIfDataIsUpToDate(xhr.getResponseHeader("Last-Modified"));
+                model.data = data;
+                success(model, data);
+            });
+        },
+        parse_clients_data: function(data) {
+            var model = this;
+            var relay = data.relays[0];
+            if (!relay)
+                relay = data.bridges[0];
+            this.fingerprint = relay.fingerprint;
+
+            if ("average_clients" in relay) {
+                var average = parseClients(relay.average_clients, model, 'average');
+                model.set({mperiod: {average: average}});
+            }
+        }
+    })
+    return graphModel;
+});
+
diff --git a/src/main/resources/web/js/rs/models/relay.js b/src/main/resources/web/js/rs/models/relay.js
new file mode 100644
index 0000000..cfb6dec
--- /dev/null
+++ b/src/main/resources/web/js/rs/models/relay.js
@@ -0,0 +1,291 @@
+// ~ models/relay ~
+define([
+  'jquery',
+  'underscore',
+  'backbone',
+  'helpers',
+  'fallbackdir'
+], function($, _, Backbone){
+
+	var relayModel = Backbone.Model.extend({
+        baseurl: 'https://onionoo.torproject.org',
+        fingerprint: '',
+        parseflags: function(flags, is_bridge) {
+            var output = [];
+            var model = this;
+            _.each(flags, function(flag) {
+                if (flag == "Authority") {
+                    output.push([flag, "authority", "This relay is a directory authority."]);
+                }
+                if (flag == "BadExit") {
+                    model.set({badexit: true});
+                    output.push([flag, "badexit", "This relay is believed to be useless as an exit node (because its ISP censors it, because it is behind a restrictive proxy, or for some similar reason)."]);
+                }
+                if (flag == "Fast") {
+                    output.push([flag, "fast", "This relay is suitable for high-bandwidth circuits."]);
+                }
+                if (flag == "Guard") {
+                    if (!is_bridge) {
+                        output.push([flag, "guard", "This relay is suitable for use as an entry guard."]);
+                    }
+                }
+                if (flag == "HSDir") {
+                    if (!is_bridge) {
+                        output.push([flag, "hsdir", "This relay is considered a v2 hidden service directory."]);
+                    }
+                }
+                if (flag == "NoEdConsensus") {
+                    output.push([flag, "noedconensus", "An Ed25519 key in the relay's descriptor or microdesriptor does not reflect authority consensus."]);
+                }
+                if (flag == "Running") {
+                    output.push([flag, "running", "This relay is currently usable."]);
+                }
+                if (flag == "Stable") {
+                    output.push([flag, "stable", "This relay is suitable for long-lived circuits."]);
+                }
+                if (flag == "V2Dir") {
+                    output.push([flag, "v2dir", "This relay implements the v2 directory protocol or higher."]);
+                }
+                if (flag == "Valid") {
+                    output.push([flag, "valid", "This relay has been 'validated'."]);
+                }
+                if (flag == "Exit") {
+                    output.push([flag, "exit", "This relay is more useful for building general-purpose exit circuits than for relay circuits."]);
+                }
+            });
+            return output;
+        },
+        parseadditionalflags: function(flags) {
+            var output = [];
+            var model = this;
+            _.each(flags, function(flag) {
+                if (flag == "Not Recommended") {
+                    output.push([flag,"notrecommended", "This relay is running a Tor version that is not recommended by the directory authorities and may contain known issues."]);
+                }
+                if (flag == "Unmeasured") {
+                    output.push([flag,"unmeasured", "This relay has not been measured by at least 3 bandwidth authorities and so its consensus weight is currently capped. This is expected for new relays."]);
+                }
+                if (flag == "FallbackDir") {
+                    output.push([flag,"fallbackdir", "Tor clients contact fallback directory mirrors during bootstrap, and download the consensus and authority certificates from them. We include a default list of mirrors in the Tor source code. These default mirrors need to be long-term stable, and on the same IPv4 and IPv6 addresses and ports."]);
+                }
+                if (flag == "ReachableIPv6") {
+                    output.push([flag,"reachableipv6", "This relay claims to accept OR connections using IPv6 and the directory authorities have confirmed it is reachable."]);
+                }
+                if (flag == "UnreachableIPv6") {
+                    output.push([flag,"unreachableipv6", "This relay claims to accept OR connections using IPv6 but the directory authorities failed to confirm it was reachable."]);
+                }
+                if (flag == "UnreachableIPv4") {
+                    output.push([flag,"unreachableipv4", "This relay claims to accept OR connections using IPv4 but the directory authorities failed to confirm it was reachable."]);
+                }
+                if (flag == "IPv6 Exit") {
+                    output.push([flag, "ipv6exit", "This relay allows exit connections using IPv6."]);
+                }
+                if (flag == "Hibernating") {
+                    output.push([flag, "hibernating", "This relay indicated that it is hibernating in its last known server descriptor."]);
+                }
+            });
+            return output;
+        },
+        parsedate: function(utctime) {
+            var hr_magic = [10];
+            var t = utctime.split(" ");
+            var utcd = t[0].split("-");
+            var utct = t[1].split(":");
+            var d = new Date(utcd[0], utcd[1]-1, utcd[2], utct[0], utct[1], utct[2]);
+            var now = new Date();
+            now = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(),  now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds());
+            var diff = now-d;
+            var secs = Math.round(diff/1000);
+            var mins = Math.floor(secs/60);
+            var hours = Math.floor(mins/60);
+            var days = Math.floor(hours/24);
+            var years = Math.floor(days/365);
+            // XXX check if this formula is correct.
+            secs = secs % 60;
+            mins = mins % 60;
+            hours = hours % 24;
+            days = days % 365;
+
+            var hr_date = "";
+            var hr_date_full = "";
+            var hr = 0;
+
+            if (years > 0) {
+                hr_date += years + "y ";
+                hr += 1;
+                if (years > 1) {
+                    hr_date_full += years + " years ";
+                } else {
+                    hr_date_full += years + " year ";
+                }
+            }
+
+            if (days > 0) {
+                hr_date += days + "d ";
+                hr += 1;
+                if (days > 1) {
+                    hr_date_full += days + " days ";
+                } else {
+                    hr_date_full += days + " day ";
+                }
+            }
+
+            if (hours > 0) {
+                hr_date += hours + "h ";
+                hr += 1;
+                if (hours > 1) {
+                    hr_date_full += hours + " hours ";
+                } else {
+                    hr_date_full += hours + " hour ";
+                }
+            }
+
+
+            if (mins > 0) {
+                if (hr < 2) {
+                    hr_date += mins + "m ";
+                    hr += 1;
+                }
+                if (hours > 1) {
+                    hr_date_full += mins + " minutes ";
+                } else {
+                    hr_date_full += mins + " minute ";
+                }
+            }
+
+            if (hr < 2) {
+                hr_date += secs + "s ";
+                hr += 1;
+            }
+            if (hr > 1) {
+                hr_date_full += "and ";
+            }
+            if (secs > 1) {
+                hr_date_full += secs + " seconds";
+            } else {
+                hr_date_full += secs + " second";
+            }
+            var output = {hrfull: hr_date_full, hr: hr_date, millisecs: diff};
+            return output
+
+        },
+        is_new: function(utctime) {
+            var hr_magic = [10];
+            var t = utctime.split(" ");
+            var utcd = t[0].split("-");
+            var utct = t[1].split(":");
+            var d = new Date(utcd[0], utcd[1]-1, utcd[2], utct[0], utct[1], utct[2]);
+            var now = new Date();
+            now = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(),  now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds());
+            var diff = now-d;
+            var secs = Math.round(diff/1000);
+            var mins = Math.floor(secs/60);
+            var hours = Math.floor(mins/60);
+            var days = Math.floor(hours/24);
+            return days < 15;
+        },
+        processRelay: function(options, model, relay) {
+                    relay.contact = relay.contact ? relay.contact : 'undefined';
+                    relay.platform = relay.platform ? relay.platform : null;
+                    relay.dir_address = relay.dir_address ? relay.dir_address : null;
+                    relay.exit_policy = relay.exit_policy ? relay.exit_policy : null;
+                    relay.exit_policy_summary = relay.exit_policy_summary ?  relay.exit_policy_summary : null;
+                    relay.exit_policy_v6_summary = relay.exit_policy_v6_summary ?  relay.exit_policy_v6_summary : null;
+                    relay.bandwidthr = (typeof relay.bandwidth_rate !== 'undefined') ? hrBandwidth(relay.bandwidth_rate) : null;
+                    relay.bandwidthb = (typeof relay.bandwidth_burst !== 'undefined') ? hrBandwidth(relay.bandwidth_burst) : null;
+                    relay.obandwidth = (typeof relay.observed_bandwidth !== 'undefined') ? hrBandwidth(relay.observed_bandwidth) : null;
+                    relay.bandwidth = (typeof relay.advertised_bandwidth !== 'undefined') ? relay.advertised_bandwidth : null;
+                    relay.bandwidth_hr = (typeof relay.advertised_bandwidth !== 'undefined') ? hrBandwidth(relay.advertised_bandwidth) : null;
+                    // the filter here is a temporary fix, and can be removed again later if you notice that #25241 is fixed
+                    relay.effective_family = relay.effective_family ? relay.effective_family.filter(function(x){return x !== relay.fingerprint}) : null;
+                    relay.alleged_family = relay.alleged_family ? relay.alleged_family : null;
+                    if (relay.is_bridge) {
+                        var new_addresses = [];
+                        _.each(relay.or_addresses, function(or_addr) {
+                            var addr = or_addr[0] == '[' ? "IPv6" : "IPv4";
+                            new_addresses.push(addr);
+                        });
+                        relay.or_addresses = new_addresses;
+                    }
+                    relay.or_address = relay.or_addresses ? relay.or_addresses[0].split(":")[0] : null;
+                    relay.unreachable_or_addresses = relay.unreachable_or_addresses ? relay.unreachable_or_addresses : [];
+                    relay.or_v6_addresses = $.grep(relay.or_addresses, function(n, i) { return n.indexOf("[") == 0; });
+                    relay.or_v6_address = (relay.or_v6_addresses.length > 0) ? relay.or_v6_addresses[0].split("]")[0].replace(/\[/, "") : null;
+                    relay.unreachable_or_v4_addresses = $.grep(relay.unreachable_or_addresses, function(n, i) { return n.indexOf(".") != -1; });
+                    relay.unreachable_or_v6_addresses = $.grep(relay.unreachable_or_addresses, function(n, i) { return n.indexOf("[") == 0; });
+                    relay.or_port = relay.or_addresses ? relay.or_addresses[0].split(":")[1] : 0;
+                    relay.dir_port = relay.dir_address ? relay.dir_address.split(":")[1] : 0;
+                    relay.exit_addresses = relay.exit_addresses ? relay.exit_addresses : null;
+                    relay.host_name = relay.host_name ? relay.host_name : null;
+                    relay.country = relay.country ? relay.country.toLowerCase() : null;
+                    relay.countryname = relay.country ? CountryCodes[relay.country] : null;
+                    relay.age = relay.first_seen ? model.parsedate(relay.first_seen).hrfull : null;
+                    relay.new_relay = relay.first_seen ? model.is_new(relay.first_seen) : null;
+                    relay.uptime = relay.last_restarted ? model.parsedate(relay.last_restarted) : null;
+                    relay.uptime_hr = relay.last_restarted ? relay.uptime.hr : null;
+                    relay.uptime_hrfull = relay.last_restarted ? relay.uptime.hrfull : null;
+                    relay.uptime = relay.last_restarted ? relay.uptime.millisecs : null;
+                    relay.last_restarted = relay.last_restarted ? relay.last_restarted : null;
+                    relay.downtime = relay.last_seen ? model.parsedate(relay.last_seen).hrfull : null;
+                    relay.as_number = relay.as_number ? relay.as_number : null;
+                    relay.as_name = relay.as_name ? relay.as_name : null;
+                    relay.transports = relay.transports ? relay.transports : null;
+                    relay.fingerprint = relay.hashed_fingerprint ? relay.hashed_fingerprint : relay.fingerprint;
+                    model.set({badexit: false});
+                    relay.flags = model.parseflags(relay.flags, relay.is_bridge);
+
+                    relay.version_consistent = relay.version == relay.platform.split(" ")[1];
+
+                    /* Synthetic Additional Flags */
+                    var additional_flags = []
+                    if (!((typeof relay.recommended_version !== 'undefined') ? relay.recommended_version : false) && relay.version_consistent) additional_flags.push("Not Recommended");
+                    if (!((typeof relay.measured !== 'undefined') ? relay.measured : true)) additional_flags.push("Unmeasured");
+                    if (((typeof relay.hibernating !== 'undefined') ? relay.hibernating : false)) additional_flags.push("Hibernating");
+                    if (IsFallbackDir(relay.fingerprint)) additional_flags.push("FallbackDir");
+                    if (relay.or_v6_addresses.length > 0) additional_flags.push("ReachableIPv6");
+                    if (relay.unreachable_or_v4_addresses.length > 0) additional_flags.push("UnreachableIPv4");
+                    if (relay.unreachable_or_v6_addresses.length > 0) additional_flags.push("UnreachableIPv6");
+                    if (relay.exit_policy_v6_summary !== null) additional_flags.push("IPv6 Exit");
+
+                    relay.additional_flags = model.parseadditionalflags(additional_flags);
+
+                    model.set(relay, options);
+
+        },
+        lookup: function(options) {
+            var success = options.success;
+            var error = options.error;
+            var model = this;
+            if (model.relay) {
+                var relay = model.relay;
+                model.processRelay(options, model, relay);
+                success(model, relay);
+            } else {
+                var xhr = $.getJSON(this.baseurl+'/details?lookup='+this.fingerprint, function(data) {
+                    checkIfDataIsUpToDate(xhr.getResponseHeader("Last-Modified"));
+                    var relay = null;
+                    if (data.relays.length >= 1) {
+                        relay = data.relays[0];
+                        relay.is_bridge = false;
+                    } else if (data.bridges.length >= 1) {
+                        relay = data.bridges[0];
+                        relay.is_bridge = true;
+                    }
+                    if (relay) {
+                        relay.bridgesPublished = data.bridges_published;
+                        relay.relaysPublished = data.relays_published;
+                        model.processRelay(options, model, relay);
+                        success(model, relay);
+                    } else {
+                        error(model)
+                    }
+                }).fail(function() {
+                    error();
+                });
+            }
+        }
+
+	});
+
+	return relayModel;
+});
diff --git a/src/main/resources/web/js/rs/router.js b/src/main/resources/web/js/rs/router.js
new file mode 100644
index 0000000..1f65c9f
--- /dev/null
+++ b/src/main/resources/web/js/rs/router.js
@@ -0,0 +1,299 @@
+// ~ router.js ~
+define([
+  'jquery',
+  'underscore',
+  'backbone',
+  'views/details/main',
+  'views/search/main',
+  'views/search/do',
+  'views/aggregate/search',
+  'views/aggregate/map',
+  'jssha'
+], function($, _, Backbone, mainDetailsView, mainSearchView, doSearchView, aggregateSearchView, aggregateMapView, jsSHA){
+  var AppRouter = Backbone.Router.extend({
+    routes: {
+       // Define the routes for the actions in Atlas
+        'details/': 'mainDetails',
+    	'details/:fingerprint': 'mainDetails',
+    	'search/:query': 'doSearch',
+    	'search/': 'doSearch',
+        'top10': 'showTopRelays',
+        'toprelays': 'showTopRelays',
+        'aggregate/:aType(/:query)': 'aggregateSearch',
+        'aggregate(/:aType)/': 'emptyAggregateSearch',
+        'map(_:property)(/:query)': 'aggregateMap',
+    	// Default
+    	'*actions': 'defaultAction'
+    },
+
+    hashFingerprint: function(fp){
+        if (fp.match(/^[a-f0-9]{40}$/i) != null)
+            return new jsSHA(fp, "HEX").getHash("SHA-1", "HEX").toUpperCase();
+        else
+            return fp
+    },
+
+    // Show the details page of a node
+    mainDetails: function(fingerprint){
+
+        $("#content").hide();
+        $(".progress").show();
+
+        fingerprint = ( fingerprint == null ) ? "" : fingerprint;
+
+        mainDetailsView.model.fingerprint = this.hashFingerprint(fingerprint);
+        mainDetailsView.model.lookup({
+            success: function(relay) {
+                mainDetailsView.render();
+                $(".progress").hide();
+                $("#content").show();
+                $(".breadcrumb").html("<li><a href=\"/\">Home</a></li><li><a href=\"/services.html\">Services</a></li><li><a href=\"#\">Relay Search</a></li><li class=\"active\">Details for " + relay.get('nickname') + "</li>");
+                $("#secondary-search").show();
+
+            },
+            error: function() {
+                mainDetailsView.error();
+                $(".progress").hide();
+                $("#content").show();
+                $(".breadcrumb").html("<li><a href=\"/\">Home</a></li><li><a href=\"/services.html\">Services</a></li><li><a href=\"#\">Relay Search</a></li><li class=\"active\">Error</li>");
+                $("#secondary-search").show();
+            }
+        });
+    },
+    // Empty aggregation query
+    emptyAggregateSearch: function() {
+        $(".breadcrumb").html("<li><a href=\"/\">Home</a></li><li><a href=\"/services.html\">Services</a></li><li><a href=\"#\">Relay Search</a></li><li class=\"active\">Error</li>");
+        $("#secondary-search-query").val("");
+
+        $("#secondary-search").hide();
+        $("#content").hide();
+        $(".progress").show();
+        aggregateSearchView.error = 5;
+        aggregateSearchView.renderError();
+        $(".progress").hide();
+        $("#secondary-search").show();
+        $("#content").show();
+
+    },
+    // Perform an aggregate search
+    aggregateSearch: function(aType, query){
+        $(".breadcrumb").html("<li><a href=\"/\">Home</a></li><li><a href=\"/services.html\">Services</a></li><li><a href=\"#\">Relay Search</a></li><li class=\"active\">Aggregated search" + ((query) ? " for " + query : "") + "</li>");
+
+        $("#content").hide();
+        $("#secondary-search").hide();
+        $(".progress").show();
+
+        aggregateSearchView.collection.aType = (aType) ? aType : "all";
+
+        if (query) {
+          query = query.trim();
+          $("#secondary-search-query").val(query);
+          aggregateSearchView.collection.url =
+            aggregateSearchView.collection.baseurl + "&search=" + this.hashFingerprint(query);
+        } else {
+          aggregateSearchView.collection.url =
+            aggregateSearchView.collection.baseurl;
+          query = "";
+        }
+        aggregateSearchView.collection.lookup({
+          success: function(err, relaysPublished, bridgesPublished){
+          aggregateSearchView.error = err;
+          aggregateSearchView.relaysPublished = relaysPublished;
+          aggregateSearchView.bridgesPublished = bridgesPublished;
+          aggregateSearchView.render(query);
+          $("#search-title").text("Aggregated results" + ((query) ? " for " + query : ""));
+          $(".progress").hide();
+          $("#secondary-search").show();
+          $("#content").show();
+        },
+        error: function(err){
+          aggregateSearchView.error = err;
+          aggregateSearchView.renderError();
+          $(".progress").hide();
+          $("#secondary-search").show();
+          $("#content").show();
+        }
+      });
+    },
+    // Perform an aggregate search
+    aggregateMap: function(property, query){
+        $(".breadcrumb").html("<li><a href=\"/\">Home</a></li><li><a href=\"/services.html\">Services</a></li><li><a href=\"#\">Relay Search</a></li><li class=\"active\">Map view" + ((query) ? " for " + query : "") + "</li>");
+
+        $("#content").hide();
+        $("#secondary-search").hide();
+        $(".progress").show();
+
+        aggregateMapView.collection.aType = "cc";
+        aggregateMapView.mapProperty = (property) ? property : "consensus_weight_fraction";
+
+        if (query) {
+          query = query.trim();
+          $("#secondary-search-query").val(query);
+          aggregateMapView.collection.url =
+            aggregateMapView.collection.baseurl + "&search=" + this.hashFingerprint(query);
+        } else {
+          aggregateMapView.collection.url =
+            aggregateMapView.collection.baseurl;
+          query = "";
+        }
+        aggregateMapView.collection.lookup({
+          success: function(err, relaysPublished, bridgesPublished){
+          aggregateMapView.error = err;
+          aggregateMapView.relaysPublished = relaysPublished;
+          aggregateMapView.bridgesPublished = bridgesPublished;
+          aggregateMapView.render(query);
+          $("#search-title").text("Map view" + ((query) ? " for " + query : ""));
+          $(".progress").hide();
+          $("#secondary-search").show();
+          $("#content").show();
+        },
+        error: function(err){
+          aggregateMapView.error = err;
+          aggregateMapView.renderError();
+          $(".progress").hide();
+          $("#secondary-search").show();
+          $("#content").show();
+        }
+      });
+    },
+    // Perform a search on Atlas
+    doSearch: function(query){
+        $(".breadcrumb").html("<li><a href=\"/\">Home</a></li><li><a href=\"/services.html\">Services</a></li><li><a href=\"#\">Relay Search</a></li><li class=\"active\">Search for " + query + "</li>");
+
+        $("#secondary-search").hide();
+        $("#content").hide();
+        $(".progress").show();
+
+        if (query == null) {
+	    doSearchView.error = 5;
+            doSearchView.renderError();
+            $(".progress").hide();
+            $("#content").show();
+            $("#secondary-search").show();
+        } else {
+          query = query.trim();
+          $("#secondary-search-query").val(query);
+          doSearchView.collection.url =
+              doSearchView.collection.baseurl + this.hashFingerprint(query);
+          doSearchView.collection.lookup({
+              success: function(err, relaysPublished, bridgesPublished){
+                  doSearchView.relays = doSearchView.collection.models;
+                  // Redirect to the details page when there is exactly one
+                  // search result.
+                  if (doSearchView.relays.length == 1) {
+                      document.location.replace("#details/" +
+                          doSearchView.relays[0].fingerprint);
+                      return;
+                  }
+		    doSearchView.error = err;
+                  doSearchView.relaysPublished = relaysPublished;
+                  doSearchView.bridgesPublished = bridgesPublished;
+                  doSearchView.render(query);
+		  $("#search-title").text(query);
+                  $("#secondary-search").show();
+                  $(".progress").hide();
+                  $("#content").show();
+              },
+
+              error: function(err){
+		    doSearchView.error = err;
+		    doSearchView.renderError();
+                  $(".progress").hide();
+                  $("#content").show();
+                  $("#secondary-search").show();
+              }
+          });
+        }
+    },
+    showTopRelays: function(){
+        $(".breadcrumb").html("<li><a href=\"/\">Home</a></li><li><a href=\"/services.html\">Services</a></li><li><a href=\"#\">Relay Search</a></li><li class=\"active\">Top Relays</li>");
+
+        $("#secondary-search-query").val("");
+
+        $("#secondary-search").hide();
+        $("#content").hide();
+        $(".progress").show();
+
+        doSearchView.collection.url = "https://onionoo.torproject.org/details?type=relay&order=-consensus_weight&limit=250&running=true";
+            doSearchView.collection.lookup({
+                success: function(err){
+                    doSearchView.relays = doSearchView.collection.models;
+                    doSearchView.error = err;
+                    doSearchView.render("");
+		    $("#search-title").text("Top Relays by Consensus Weight");
+                    $(".progress").hide();
+                    $("#content").show();
+                    $("#secondary-search").show();
+                },
+
+                error: function(erno){
+                    doSearchView.error = erno;
+                    doSearchView.renderError();
+                    $(".progress").hide();
+                    $("#content").show();
+                    $("#secondary-search").show();
+                }
+            });
+    },
+
+    // No matched rules go to the default home page
+    defaultAction: function(actions){
+        $(".breadcrumb").html("<li><a href=\"/\">Home</a></li><li><a href=\"/services.html\">Services</a></li><li class=\"active\">Relay Search</li>");
+        $("#secondary-search").hide();
+        $("#secondary-search-query").val("");
+
+        mainSearchView.render();
+
+        if (actions == "aggregate") {
+          $('.search').hide();
+          $('#aggregated-search-tab-content').fadeIn();
+          $('.search-tabs').removeClass('active');
+          $('#aggregated-search-tab').addClass('active');
+        } else if (actions == "advanced") {
+          $('.search').hide();
+          $('#advanced-search-tab-content').fadeIn();
+          $('.search-tabs').removeClass('active');
+          $('#advanced-search-tab').addClass('active');
+          $('.well').hide();
+        } else {
+          $('.search').hide();
+          $('#main-search-tab-content').fadeIn();
+          $('.search-tabs').removeClass('active');
+          $('#main-search-tab').addClass('active');
+        }
+
+        $(".progress").hide();
+        $("#content").show();
+    }
+
+  });
+
+  var initialize = function(){
+    var app_router = new AppRouter;
+    Backbone.history.start();
+
+    $("#secondary-search-submit").bind('click', function(){
+      document.location = "#search/"+encodeURI($('#secondary-search-query').val());
+      return false;
+    });
+
+    $("#secondary-search-aggregate").bind('click', function(){
+      document.location = "#aggregate/all/"+encodeURI($('#secondary-search-query').val());
+      return false;
+    });
+
+    $("#secondary-search-clear").bind('click', function(){
+      $("#secondary-search-query").val("");
+      return false;
+    });
+
+    $("#secondary-search").bind('submit', function(){
+      document.location = "#search/"+encodeURI($('#secondary-search-query').val());
+      return false;
+    });
+
+  };
+  return {
+    initialize: initialize
+  };
+});
diff --git a/src/main/resources/web/js/rs/views/aggregate/map.js b/src/main/resources/web/js/rs/views/aggregate/map.js
new file mode 100644
index 0000000..c77ec10
--- /dev/null
+++ b/src/main/resources/web/js/rs/views/aggregate/map.js
@@ -0,0 +1,277 @@
+// ~ views/search/do ~
+define([
+  'jquery',
+  'underscore',
+  'backbone',
+  'topojson',
+  'd3-array',
+  'd3-geo',
+  'd3-geo-projection',
+  'collections/aggregates',
+  'text!templates/aggregate/map.html',
+  'datatables',
+  'datatablessort',
+  'helpers',
+  'bootstrap',
+  'datatablesbs'
+], function($, _, Backbone, topojson, d3array, d3geo, d3geoproj, aggregatesCollection, aggregateMapTemplate){
+  var aggregateSearchView = Backbone.View.extend({
+    el: "#content",
+    explanations: {
+        "relays": "The map shows the total number of relays running in each country.",
+        "consensus_weight_fraction": "This map shows the total <a href=\"/glossary.html#consensus-weight\" target=\"_blank\">consensus weight</a> of each country's relays as a percentage of all consensus weights in the network.  This percentage is a very rough approximation of the probability of a relay in each country to be selected by clients.",
+        "guard_probability": "This map shows the total guard probability of each country's relays as a percentage of the guard probabilities of all relays in the network. This probability is calculated based on consensus weights, relay flags, and bandwidth weights in the consensus. Path selection depends on more factors, so that this probability can only be an approximation.",
+        "middle_probability": "This map shows the total middle probability of each country's relays as a percentage of the middle probabilities of all relays in the network. This probability is calculated based on consensus weights, relay flags, and bandwidth weights in the consensus. Path selection depends on more factors, so that this probability can only be an approximation.",
+        "exit_probability": "This map shows the total exit probability of each country's relays as a percentage of the exit probabilities of all relays in the network. This probability is calculated based on consensus weights, relay flags, and bandwidth weights in the consensus. Path selection depends on more factors, so that this probability can only be an approximation.",
+        "advertised_bandwidth": "This map shows the total <a href=\"/glossary.html#advertised-bandwidth\" target=\"_blank\">advertised bandwidth</a> of each country's relays.",
+        "consensus_weight_to_bandwidth": "This map shows the average ratio of consensus weight to advertised bandwidth for relays in each country. Countries shown in purple have greater consensus weight than advertised bandwidth, indicating that they are overweighted. Countries shown in green have greater advertised bandwidth than consensus weight and so are underweighted. Relays that did not have an advertised bandwidth or advertise a bandwidth of zero are not included in this analysis. Relays that have not yet been measured by at least three bandwidth authorities are also not included in this map as their consensus weight is not based on bandwidth measurement yet."
+    },
+    initialize: function() {
+      this.collection = new aggregatesCollection;
+    },
+    plot: function() {
+      $('input[name="aggregate-property"]').prop('disabled', true);
+      var aggregate_property = $('input[name="aggregate-property"]:checked').val();
+      var aggregates = this.collection.models;
+      var explanations = this.explanations;
+
+      var m_width = $("#container").width();
+      var width = 938;
+      var height = 500;
+
+      var projection = d3geoproj.geoCylindricalEqualArea()
+                       .scale(175);
+
+      var path = d3.geo.path()
+        .projection(projection);
+
+      var svg = d3.select("body").append("svg")
+        .remove()
+        .attr("preserveAspectRatio", "xMidYMid")
+        .attr("viewBox", "0 0 " + width + " " + height)
+
+      svg.append("rect")
+        .attr("class", "background")
+        .attr("style", "fill: #484848;")
+        .style("opacity", "0.444444444")
+        .attr("width", width)
+        .attr("height", height);
+
+      var g = svg.append("g");
+
+      var maximum_value = Number.NEGATIVE_INFINITY;
+      var minimum_value = Number.POSITIVE_INFINITY;
+
+      _.each(aggregates, function(aggregate) {
+        current_val = aggregate[aggregate_property];
+        if (current_val > maximum_value) maximum_value = current_val;
+        if (current_val !== 0 && current_val < minimum_value) minimum_value = current_val;
+      });
+
+      var getCountryAggregate = function(code, aggregate_property) {
+        var found = 0;
+        _.each(aggregates, function(aggregate) {
+          if (aggregate.country.toUpperCase() == code) found = aggregate[aggregate_property];
+        });
+        return found;
+      }
+
+      var getCountryFillOpacity = function(code, aggregate_property) {
+        found = getCountryAggregate(code, aggregate_property);
+        if (aggregate_property == "consensus_weight_to_bandwidth") {
+          if (found == 0) {
+            return 0;
+          } else {
+            return (found < 1) ? -(1/found)/(1/minimum_value) : found/maximum_value;
+          }
+        } else {
+          return found/maximum_value;
+        }
+      }
+
+      var formatValue = function(value, aggregate_property) {
+        switch (aggregate_property) {
+          case "relays":
+            text = value.toFixed(0) + " relays";
+            break;
+          case "consensus_weight_fraction":
+          case "guard_probability":
+          case "middle_probability":
+          case "exit_probability":
+            text = (value*100).toFixed(3) + "%";
+            break;
+          case "advertised_bandwidth":
+            text = hrBandwidth(value);
+            break;
+          case "consensus_weight_to_bandwidth":
+            if (value == 0) {
+              text = "No relays";
+            } else {
+              text = (value<1) ? "1:" + (1/value).toFixed(1) :
+                                  value.toFixed(1) + ":1";
+            }
+        }
+        return text;
+      }
+
+      var getCountryTooltip = function(code, aggregate_property) {
+        found = getCountryAggregate(code, aggregate_property);
+        text = CountryCodes[code.toLowerCase()] + " (" + code + ") - ";
+        text += formatValue(found, aggregate_property);
+        return text;
+      }
+
+      d3.json("/rs/json/countries.topo.json", function(error, us) {
+      g.append("g")
+        .attr("id", "countries")
+        .style("fill","#fff")
+        .style("stroke", "#484848")
+        .style("stroke-linejoin", "round")
+        .style("stroke-linecap", "round")
+        .selectAll("path")
+        .data(topojson.feature(us, us.objects.countries).features)
+        .enter()
+        .append("path")
+        .attr("d", path);
+
+      g.append("g")
+        .attr("id", "countries")
+        .style("fill", "#7d4698")
+        .style("stroke", "#484848")
+        .style("stroke-linejoin", "round")
+        .style("stroke-linecap", "round")
+        .selectAll("path")
+        .data(topojson.feature(us, us.objects.countries).features)
+        .enter()
+          .append("path")
+            .attr("id", function(d) { return d.id; })
+            .style("fill", function(d) { return (getCountryFillOpacity(d.id, aggregate_property) > 0) ? "#7d4698" : "#68b030"; })
+            .style("fill-opacity", function(d) { return Math.abs(getCountryFillOpacity(d.id, aggregate_property)); })
+            .attr("d", path)
+            .on("click", function(d) { window.location = "#aggregate/cc/country:" + d.id.toLowerCase(); })
+          .append("svg:title")
+            .text( function(d) { return getCountryTooltip(d.id, aggregate_property); });
+
+
+    function append_legend() {
+      for (var i = 0; i <= 1; i += 0.2) {
+        svg.append("rect")
+          .attr("x", 10)
+          .attr("y", height-(i*5+1)*20 )
+          .attr("height", "10")
+          .attr("width", "15")
+          .style("fill", "#fff");
+
+        svg.append("rect")
+          .attr("x", 10)
+          .attr("y", height-(i*5+1)*20 )
+          .attr("height", "10")
+          .attr("width", "15")
+          .style("fill", "#7d4698")
+          .style("fill-opacity", function() {return i;})
+          .style("stroke", "#484848");
+
+        svg.append("text")
+          .attr("x", 30)
+          .attr("y", height-(i*5+0.5)*20 )
+          .style("font-size", "12px")
+          .style("fill", "#484848")
+          .text( function() {
+            return formatValue(i*maximum_value, aggregate_property);
+          });
+       }
+    }
+
+  if (aggregate_property == "consensus_weight_to_bandwidth") {
+      legend = (maximum_value > 1) ? 0 : 1;
+      current_box = 0;
+      for (var i = legend; i <= 2 ; i += 0.2) {
+        j = Math.abs(i-1);
+        current_value = (i<1) ? (j*maximum_value) :
+                                (j*(1/minimum_value));
+        if (current_value < 1)
+          continue;
+        svg.append("rect")
+          .attr("x", 10)
+          .attr("y", height-(current_box*5+1)*20)
+          .attr("height", "10")
+          .attr("width", "15")
+          .style("fill", "#fff");
+
+        svg.append("rect")
+          .attr("x", 10)
+          .attr("y", height-(current_box*5+1)*20)
+          .attr("height", "10")
+          .attr("width", "15")
+          .style("fill", function() { return (i<1) ? "#7d4698" : "#68b030"; })
+          .style("fill-opacity", function() { return j; })
+          .style("stroke", "#484848");
+
+        svg.append("text")
+          .attr("x", 30)
+          .attr("y", height-(current_box*5+0.5)*20)
+          .style("font-size", "12px")
+          .style("fill", "#484848")
+          .text(function(){
+           if (j==0) return "1:1";
+           return (i<1) ? "" + current_value.toFixed(1) + ":1" :
+                          "1:" + current_value.toFixed(1);
+
+         });
+         current_box += 0.2;
+       }
+     } else {
+       append_legend();
+     }
+
+      $("#aggregate-map").html("");
+      document.getElementById("aggregate-map").appendChild(svg.node());
+
+      $('input[name="aggregate-property"]').prop('disabled', false);
+      $('#map-explain').html(explanations[aggregate_property]);
+     });
+    },
+    save: function() {
+      /* Encode SVG image for download link. */
+      html = d3.select("#aggregate-map")
+        .node()
+        .innerHTML;
+      window.open("data:data/xml;base64," + btoa(html), "SaveSVG");
+    },
+    render: function(query){
+      document.title = "Relay Search";
+      var compiledTemplate = _.template(aggregateMapTemplate)
+      this.$el.html(compiledTemplate({query: query,
+                                     mapProperty: this.mapProperty,
+                                     aggregates: this.collection.models,
+                                     countries: CountryCodes,
+                                     error: this.error,
+                                     relaysPublished: this.relaysPublished,
+                                     bridgesPublished: this.bridgesPublished}));
+
+      canSvg = !!(document.createElementNS && document.createElementNS('http://www.w3.org/2000/svg','svg').createSVGRect);
+      if (canSvg) {
+        this.plot();
+        var thisView = this;
+        $('input[name="aggregate-property"]').bind('change', function(){
+          thisView.plot();
+        });
+        $('#save_svg').bind('click', function(){
+          thisView.save();
+        });
+        $('#permalink').bind('click', function(){
+          aggregate_property = $('input[name="aggregate-property"]:checked').val();
+          window.location.hash = "#map_" + aggregate_property + ((query) ? "/" + query : "");
+        });
+      } else {
+        $('#no-svg').show();
+      }
+    },
+    renderError: function(){
+      var compiledTemplate = _.template(aggregateSearchTemplate);
+      this.$el.html(compiledTemplate({aggregates: null, error: this.error, countries: null}));
+    }
+  });
+  return new aggregateSearchView;
+});
+
diff --git a/src/main/resources/web/js/rs/views/aggregate/search.js b/src/main/resources/web/js/rs/views/aggregate/search.js
new file mode 100644
index 0000000..5cb8c82
--- /dev/null
+++ b/src/main/resources/web/js/rs/views/aggregate/search.js
@@ -0,0 +1,47 @@
+// ~ views/search/do ~
+define([
+  'jquery',
+  'underscore',
+  'backbone',
+  'collections/aggregates',
+  'text!templates/aggregate/search.html',
+  'datatables',
+  'datatablessort',
+  'helpers',
+  'bootstrap',
+  'datatablesbs'
+], function($, _, Backbone, aggregatesCollection, aggregateSearchTemplate){
+  var aggregateSearchView = Backbone.View.extend({
+    el: "#content",
+    initialize: function() {
+      this.collection = new aggregatesCollection;
+    },
+    render: function(query){
+      document.title = "Relay Search";
+      var compiledTemplate = _.template(aggregateSearchTemplate)
+      this.$el.html(compiledTemplate({query: query,
+                                     aggregates: this.collection.models,
+                                     aType: this.collection.aType,
+                                     countries: CountryCodes,
+                                     error: this.error,
+                                     relaysPublished: this.relaysPublished,
+                                     bridgesPublished: this.bridgesPublished}));
+
+      // This creates the table using DataTables
+      var oTable = $('#torstatus_results').dataTable({
+        "sDom": "<\"top\"l>rt<\"bottom\"ip><\"clear\">",
+        "bStateSave": false,
+        "aaSorting": [[(this.collection.aType == "version") ? 3 : 2, "desc"]],
+        "fnDrawCallback": function( oSettings ) {
+          $(".tip").tooltip({'html': true});
+        }
+      });
+    },
+    renderError: function(){
+      var compiledTemplate = _.template(aggregateSearchTemplate);
+      this.$el.html(compiledTemplate({aggregates: null, error: this.error, countries: null}));
+    }
+  });
+  return new aggregateSearchView;
+});
+
diff --git a/src/main/resources/web/js/rs/views/details/main.js b/src/main/resources/web/js/rs/views/details/main.js
new file mode 100644
index 0000000..221b9c0
--- /dev/null
+++ b/src/main/resources/web/js/rs/views/details/main.js
@@ -0,0 +1,249 @@
+// This is the boilerplate file
+// it should be used as a base for every module
+define([
+  'jquery',
+  'underscore',
+  'backbone',
+  'models/relay',
+  'models/graph',
+  'text!templates/details/router.html',
+  'text!templates/details/bridge.html',
+  'text!templates/details/error.html',
+  'd3js',
+  'helpers'
+], function($, _, Backbone, relayModel, graphModel,
+        routerDetailsTemplate, bridgeDetailsTemplate, errorDetailsTemplate){
+    var mainDetailsView = Backbone.View.extend({
+        el: "#content",
+        initialize: function() {
+           this.model = new relayModel;
+           this.graph = new graphModel;
+        },
+        plot: function(g, data, labels, legendPos, colors, tickFormat,
+                       tooltipFormat) {
+
+            /* do not plot graph if there is no data */
+            if (data[0].length==0) return;
+
+            /* Initialize graph. */
+            var margin = {top: 30, right: 10, bottom: 20, left: 60},
+                width = 550 - margin.left - margin.right,
+                height = 342 - margin.top - margin.bottom;
+            var svg = d3.select("#" + g).append("svg:svg")
+                .attr("version", 1.1)
+                .attr("xmlns", "http://www.w3.org/2000/svg")
+                .attr("viewBox", "0 0 550 342")
+                .append("g")
+                .attr("transform",
+                    "translate(" + margin.left + "," + margin.top + ")");
+
+            /* Define scales to convert domain values to pixels. */
+            var xExtents = d3.extent(d3.merge(data), function(d) {
+                return d[0]; });
+            var yExtents = d3.extent(d3.merge(data), function(d) {
+                return d[1]; });
+            var xScale = d3.time.scale()
+                .domain(xExtents)
+                .range([0, width]);
+            var yScale = d3.scale.linear()
+                .domain([0, yExtents[1]])
+                .range([height, 0]);
+
+            /* Add the x axis. */
+            var xAxis = d3.svg.axis()
+                .scale(xScale)
+                .ticks(4)
+                .tickFormat(d3.time.format("%d %b %Y"))
+                .orient("bottom");
+            var xAxisContainer = svg.append("g")
+                .attr("class", "x axis")
+                .attr("transform", "translate(0, " + height + ")")
+                .call(xAxis);
+            xAxisContainer.selectAll("line")
+                .style("stroke", "lightgrey");
+            xAxisContainer.selectAll("path")
+                .style("display", "none");
+            xAxisContainer.selectAll("minor")
+                .style("stroke-opacity", .5);
+            xAxisContainer.selectAll("text")
+                .style("font-size", "12px");
+
+            /* Add the y axis. */
+            var yAxis = d3.svg.axis()
+                .scale(yScale)
+                .orient("left")
+                .ticks(4)
+                .tickSize(-width - 4)
+                .tickFormat(d3.format(tickFormat));
+            var yAxisContainer = svg.append("g")
+                .attr("class", "y axis")
+                .call(yAxis);
+            yAxisContainer.selectAll("line")
+                .style("stroke", "lightgrey");
+            yAxisContainer.selectAll("path")
+                .style("display", "none");
+            yAxisContainer.selectAll("minor")
+                .style("stroke-opacity", .5);
+            yAxisContainer.selectAll("text")
+                .style("font-size", "12px");
+
+            /* Add one group per data line. */
+            var lineContainers = svg.selectAll("g.line")
+                .data(data)
+                .enter().append("svg:g")
+                .attr("class", "line")
+                .style("stroke-width", 2)
+                .style("stroke", function(d) {
+                    return colors[data.indexOf(d)]; });
+
+            /* Add path between all line values. */
+            var line = d3.svg.line()
+                .defined(function(d) { return d[1] != null; })
+                .x(function (d) { return xScale(d[0]); })
+                .y(function (d) { return yScale(d[1]); });
+            lineContainers.append("svg:path")
+                .attr("d", line)
+                .style("fill", "none");
+
+
+            /* Add dots for all line values, and add tooltips. */
+            lineContainers.selectAll("circle")
+                .data(function(d) { return d; })
+                .enter()
+                .append("svg:circle")
+                .attr("class", "dot")
+                .attr("cx", function(d) { return xScale(d[0]); })
+                .attr("cy", function(d) { return yScale(d[1]); })
+                .attr("r", 3)
+                .style("fill", "white");
+
+            $("#" + g + ">svg circle").tooltip({
+              title: function() {
+                var d = this.__data__;
+                var datetimeFormat = function(seconds) {
+                  var date = new Date(seconds);
+                  return d3.time.format("%Y-%m-%d %H:%M")(date);
+                }
+                var tooltipFormatter = d3.format(tooltipFormat);
+                return datetimeFormat(d[0]) + ": " + tooltipFormatter(d[1]);
+              },
+              container: 'body'
+            });
+
+            /* Add a legend. */
+            var legend = svg.append("g")
+                .attr("class", "legend");
+            legend.selectAll("g").data(data)
+                .enter().append("g")
+                .each(function(d, i) {
+                    var g = d3.select(this);
+                    g.append("svg:circle")
+                        .attr("cx", legendPos[i][0] - margin.left + 5)
+                        .attr("cy", legendPos[i][1] - margin.top + 10)
+                        .attr("r", 3)
+                        .style("stroke-width", 2)
+                        .style("stroke", colors[i])
+                        .style("fill", "white");
+                    g.append("svg:text")
+                        .attr("x", legendPos[i][0] - margin.left + 15)
+                        .attr("y", legendPos[i][1] - margin.top + 14)
+                        .style("fill", colors[i])
+                        .style("font-size", "12px")
+                        .text(labels[i]);
+                });
+
+            /* Remove placeholder image. */
+            d3.select("#" + g).selectAll("img").remove();
+
+            /* Encode SVG image for download link. */
+            html = d3.select("#" + g)
+                .node()
+                .innerHTML;
+            d3.select("#save_" + g)
+                .attr("href", "data:data/xml;base64," + btoa(html));
+        },
+        render: function() {
+            var data = {relay: this.model};
+            var compiledTemplate;
+            if (!this.model)
+                compiledTemplate = _.template(errorDetailsTemplate);
+            else if (this.model.get('is_bridge'))
+                compiledTemplate = _.template(bridgeDetailsTemplate);
+            else
+                compiledTemplate = _.template(routerDetailsTemplate);
+            document.title = "Relay Search: " + this.model.get('nickname');
+            this.$el.html(compiledTemplate(data));
+
+            canSvg = !!(document.createElementNS && document.createElementNS('http://www.w3.org/2000/svg','svg').createSVGRect);
+            if (canSvg) {
+              var graph = this.graph;
+              var plot = this.plot;
+              this.graph.lookup_bw(this.model.fingerprint, {
+                  success: function() {
+                      graph.parse_bw_data(graph.data);
+                      graphs = ['bw_month',
+                              'bw_months', 'bw_year', 'bw_years'];
+                      _.each(graphs, function(g) {
+                          var data = [graph.get(g).write, graph.get(g).read];
+                          var labels = ["written bytes per second", "read bytes per second"];
+                          var legendPos = [[140, 0], [310, 0]];
+                          var colors = ["#edc240", "#afd8f8"];
+                          plot(g, data, labels, legendPos, colors, "s", ".4s");
+                      });
+                  }
+              });
+
+              if (!this.model.get('is_bridge')) {
+                  this.graph.lookup_weights(this.model.fingerprint, {
+                      success: function() {
+                          graph.parse_weights_data(graph.data);
+                          graphs = ['weights_month',
+                                  'weights_months', 'weights_year', 'weights_years'];
+                          _.each(graphs, function(g) {
+                              var data = [graph.get(g).cw, graph.get(g).middle,
+                                          graph.get(g).guard, graph.get(g).exit];
+                              var labels = ["consensus weight fraction",
+                                            "middle probability",
+                                            "guard probability",
+                                            "exit probability"];
+                              var legendPos = [[28, 0], [309, 0], [194, 0], [429, 0]];
+                              var colors = ["#afd8f8", "#edc240",
+                                            "#cb4b4b", "#4da74d"];
+                              plot(g, data, labels, legendPos, colors, ".4%", ".6%");
+                          });
+                      }
+                  });
+              } else {
+                  this.graph.lookup_clients(this.model.fingerprint, {
+                      success: function() {
+                          graph.parse_clients_data(graph.data);
+                          graphs = ['clients_month',
+                                  'clients_months', 'clients_year', 'clients_years'];
+                          _.each(graphs, function(g) {
+                              var data = [graph.get(g).average];
+                              var labels = ["average number of connected clients"];
+                              var legendPos = [[3, 0]];
+                              var colors = ["#edc240"];
+                              plot(g, data, labels, legendPos, colors, "g", ".2g");
+                          });
+                      }
+                  });
+              }
+            } else {
+              $(".history-tabs").hide();
+              $("#history-tab-content").html("Graphs cannot be shown as your browser does not support Scalable Vector Graphics (SVG). This is the case when Tor Browser is in High Security mode.");
+            }
+
+            $(".tip").tooltip({
+              placement: 'right',
+              html: true
+            });
+        },
+        error: function() {
+            var compiledTemplate = _.template(errorDetailsTemplate);
+            this.$el.html(compiledTemplate({'relay': null}));
+        }
+    });
+    return new mainDetailsView;
+});
+
diff --git a/src/main/resources/web/js/rs/views/search/do.js b/src/main/resources/web/js/rs/views/search/do.js
new file mode 100644
index 0000000..18b1f05
--- /dev/null
+++ b/src/main/resources/web/js/rs/views/search/do.js
@@ -0,0 +1,62 @@
+// ~ views/search/do ~
+define([
+  'jquery',
+  'underscore',
+  'backbone',
+  'collections/results',
+  'text!templates/search/do.html',
+  'datatables',
+  'datatablessort',
+  'helpers',
+  'bootstrap',
+  'datatablesbs'
+], function($, _, Backbone, resultsCollection, doSearchTemplate){
+  var doSearchView = Backbone.View.extend({
+    el: "#content",
+    initialize: function() {
+      this.collection = new resultsCollection;
+    },
+    render: function(query){
+      document.title = "Relay Search";
+      var compiledTemplate = _.template(doSearchTemplate)
+      this.$el.html(compiledTemplate({query: query,
+                                     relays: this.relays,
+                                     countries: CountryCodes,
+                                     error: this.error,
+                                     relaysPublished: this.relaysPublished,
+                                     bridgesPublished: this.bridgesPublished}));
+
+      // This creates the table using DataTables
+      loadSortingExtensions();
+      var oTable = $('#torstatus_results').dataTable({
+        //Define column specific options
+        "aoColumns": [
+                      null,   //Status
+                      null,   //Nickname
+                      { "sType":  "file-size" },  //Bandwidth
+                      null,   //Uptime
+                      null,   //Country
+                      { "sType":  "ip-address" },  //IP Address
+                      { "sType":  "ip-address" },   //IPv6 Address
+                      null,   //Flags
+                      null,   //Additional Flags
+                      null,   //ORPort
+                      null,   //DirPort
+                      null    //Type
+                  ],
+        "sDom": "<\"top\"l>rt<\"bottom\"ip><\"clear\">",
+        "bStateSave": false,
+        "aaSorting": [[2, "desc"]],
+        "fnDrawCallback": function( oSettings ) {
+          $(".tip").tooltip({'html':true});
+        }
+      });
+    },
+    renderError: function(){
+      var compiledTemplate = _.template(doSearchTemplate);
+      this.$el.html(compiledTemplate({relays: null, error: this.error, countries: null}));
+    }
+  });
+  return new doSearchView;
+});
+
diff --git a/src/main/resources/web/js/rs/views/search/main.js b/src/main/resources/web/js/rs/views/search/main.js
new file mode 100644
index 0000000..23b0240
--- /dev/null
+++ b/src/main/resources/web/js/rs/views/search/main.js
@@ -0,0 +1,113 @@
+// ~ views/search/main ~
+define([
+  'jquery',
+  'underscore',
+  'backbone',
+  'text!templates/search/main.html',
+  'helpers',
+], function($, _, Backbone, mainSearchTemplate){
+  var mainSearchView = Backbone.View.extend({
+	    el: "#content",
+
+	    render: function(query){
+			document.title = "Relay Search";
+			var data = {countries: CountryCodes};
+			var compiledTemplate = _.template(mainSearchTemplate);
+			this.$el.html(compiledTemplate(data));
+
+            $("#do-top-relays").bind('click', function(){
+                document.location = "#toprelays";
+                return false;
+            });
+
+            $("#do-search").bind('click', function(){
+                document.location = "#search/"+encodeURI($('#query').val());
+                return false;
+            });
+
+            $("#home-search").bind('submit', function(){
+                document.location = "#search/"+encodeURI($('#query').val());
+                return false;
+            });
+
+            $("#do-aggregate").bind('click', function(){
+                document.location = "#aggregate/all/"+encodeURI($('#aggregated-query').val());
+                return false;
+            });
+
+            $("#do-full-aggregation").bind('click', function(){
+                document.location = "#aggregate/all";
+                return false;
+            });
+
+            $("#home-aggregate-search").bind('submit', function(){
+                document.location = "#aggregate/all/"+encodeURI($('#aggregated-query').val());
+                return false;
+            });
+
+            var buildAdvancedQuery = function(){
+              var query = "";
+              if($('#advanced-search-nickname').val().trim() != "") query += $('#advanced-search-nickname').val().trim() + " ";
+              if($('#advanced-search-family')[0].checked) {
+                if($('#advanced-search-fingerprint').val().trim() != "") query += "family:" + $('#advanced-search-fingerprint').val().trim().split(" ")[0] + " ";
+              } else {
+                if($('#advanced-search-fingerprint').val().trim() != "") query += "fingerprint:" + $('#advanced-search-fingerprint').val().trim().split(" ")[0] + " ";
+              }
+              if($('#advanced-search-flag').val() !== "") query += "flag:" + $('#advanced-search-flag').val() + " ";
+              if($('#advanced-search-country').val() !== "") query += "country:" + $('#advanced-search-country').val() + " ";
+              if($('#advanced-search-as').val().trim() !== "") query += "as:" + $('#advanced-search-as').val().trim() + " ";
+              if($('#advanced-search-contact').val().trim() != "") query += "contact:" + $('#advanced-search-contact').val().trim().split(" ")[0] + " ";
+              if($('#advanced-search-hostname').val().trim() != "") query += "host_name:" + $('#advanced-search-hostname').val().trim().split(" ")[0] + " ";
+              if($('#advanced-search-type').val() !== "") query += "type:" + $('#advanced-search-type').val() + " ";
+              if($('#advanced-search-running').val() !== "") query += "running:" + $('#advanced-search-running').val() + " ";
+              if($('#advanced-search-first-seen-from').val() !== "0" || $('#advanced-search-first-seen-to').val() !== "0") query += "first_seen_days:" + $('#advanced-search-first-seen-from').val() + "-" + $('#advanced-search-first-seen-to').val() + " ";
+              if($('#advanced-search-last-seen-from').val() !== "0" || $('#advanced-search-last-seen-to').val() !== "0") query += "last_seen_days:" + $('#advanced-search-last-seen-from').val() + "-" + $('#advanced-search-last-seen-to').val() + " ";
+              if($('#advanced-search-version').val().trim() != "") query += "version:" + $('#advanced-search-version').val().trim().split(" ")[0] + " ";
+              return query;
+            }
+
+            $("#do-advanced").bind('click', function(){
+                var query = buildAdvancedQuery();
+                document.location = "#search/"+encodeURI(query);
+                return false;
+            });
+
+            var goAggregate = function(type) {
+                var query = buildAdvancedQuery();
+                document.location = "#aggregate/" + type + ((query) ? "/" + encodeURI(query) : "");
+                return false;
+            }
+
+            $("#do-advanced-aggregation").bind('click', function(){
+                return goAggregate("all")
+            });
+
+            $("#do-advanced-aggregation-cc").bind('click', function(){
+                return goAggregate("cc")
+            });
+
+            $("#do-advanced-aggregation-as").bind('click', function(){
+                return goAggregate("as")
+            });
+
+            $("#do-advanced-aggregation-ascc").bind('click', function(){
+                return goAggregate("ascc")
+            });
+
+            $("#do-advanced-aggregation-version").bind('click', function(){
+                return goAggregate("version")
+            });
+
+            $("#home-advanced-search").bind('submit', function(){
+                var query = buildAdvancedQuery();
+                document.location = "#search/"+encodeURI(query);
+                return false;
+            });
+
+            $(".tip").tooltip();
+
+	    }
+  });
+  return new mainSearchView;
+});
+
diff --git a/src/main/resources/web/json/countries.topo.json b/src/main/resources/web/json/countries.topo.json
new file mode 100644
index 0000000..172970a
--- /dev/null
+++ b/src/main/resources/web/json/countries.topo.json
@@ -0,0 +1 @@
+{"objects": {"countries": {"type": "GeometryCollection", "geometries": [{"properties": {"name": "Afghanistan"}, "type": "Polygon", "id": "AF", "arcs": [[0, 1, 2, 3, 4, 5]]}, {"properties": {"name": "Angola"}, "type": "MultiPolygon", "id": "AO", "arcs": [[[6, 7, 8, 9]], [[10, 11, 12]]]}, {"properties": {"name": "Albania"}, "type": "Polygon", "id": "AL", "arcs": [[13, 14, 15, 16, 17, 18, 19, 20]]}, {"properties": {"name": "Aland"}, "type": "Polygon", "id": "ALD", "arcs": [[21]]}, {"properties": {"name": "Andorra"}, "type": "Polygon", "id": "AD", "arcs": [[22, 23]]}, {"properties": {"name": "United Arab Emirates"}, "type": "Polygon", "id": "AE", "arcs": [[24, 25, 26, 27, 28]]}, {"properties": {"name": "Argentina"}, "type": "MultiPolygon", "id": "AR", "arcs": [[[29, 30]], [[31, 32, 33, 34, 35, 36]]]}, {"properties": {"name": "Armenia"}, "type": "Polygon", "id": "AM", "arcs": [[37, 38, 39, 40, 41]]}, {"properties": {"name": "Fr. S. Antarctic Lands"}, "type": "Polygon", "id": "TF", "arcs"
 : [[42]]}, {"properties": {"name": "Australia"}, "type": "MultiPolygon", "id": "AU", "arcs": [[[43]], [[44]], [[45]], [[46]], [[47]], [[48]], [[49]], [[50]], [[51]], [[52]], [[53]], [[54]]]}, {"properties": {"name": "Austria"}, "type": "Polygon", "id": "AT", "arcs": [[55, 56, 57, 58, 59, 60, 61, 62]]}, {"properties": {"name": "Azerbaijan"}, "type": "MultiPolygon", "id": "AZ", "arcs": [[[63, 64, -40]], [[65, 66, 67, -38, 68]]]}, {"properties": {"name": "Burundi"}, "type": "Polygon", "id": "BI", "arcs": [[69, 70, 71, 72]]}, {"properties": {"name": "Belgium"}, "type": "Polygon", "id": "BE", "arcs": [[73, 74, 75, 76, 77, 78, 79]]}, {"properties": {"name": "Benin"}, "type": "Polygon", "id": "BJ", "arcs": [[80, 81, 82, 83, 84]]}, {"properties": {"name": "Burkina Faso"}, "type": "Polygon", "id": "BF", "arcs": [[85, -84, 86, 87, 88, 89]]}, {"properties": {"name": "Bangladesh"}, "type": "MultiPolygon", "id": "BD", "arcs": [[[90]], [[91, 92, 93]]]}, {"properties": {"name": "Bulgaria"}, "type"
 : "Polygon", "id": "BG", "arcs": [[94, 95, 96, 97, 98, 99]]}, {"properties": {"name": "Bahamas"}, "type": "MultiPolygon", "id": "BS", "arcs": [[[100]], [[101]], [[102]], [[103]]]}, {"properties": {"name": "Bosnia and Herz."}, "type": "Polygon", "id": "BA", "arcs": [[104, 105, 106, 107]]}, {"properties": {"name": "Belarus"}, "type": "Polygon", "id": "BY", "arcs": [[108, 109, 110, 111, 112]]}, {"properties": {"name": "Belize"}, "type": "Polygon", "id": "BZ", "arcs": [[113, 114, 115]]}, {"properties": {"name": "Bolivia"}, "type": "Polygon", "id": "BO", "arcs": [[116, -37, 117, 118, 119, 120, 121]]}, {"properties": {"name": "Brazil"}, "type": "MultiPolygon", "id": "BR", "arcs": [[[122]], [[123]], [[124]], [[125]], [[126]], [[127]], [[128]], [[129]], [[130, 131, 132, 133, 134, 135, -33, 136, 137, 138, -122, 139, 140, 141, 142]]]}, {"properties": {"name": "Brunei"}, "type": "MultiPolygon", "id": "BN", "arcs": [[[143, 144]], [[145, 146]]]}, {"properties": {"name": "Bhutan"}, "type": "Polyg
 on", "id": "BT", "arcs": [[147, 148]]}, {"properties": {"name": "Botswana"}, "type": "Polygon", "id": "BW", "arcs": [[149, 150, 151]]}, {"properties": {"name": "Central African Rep."}, "type": "Polygon", "id": "CF", "arcs": [[152, 153, 154, 155, 156, 157]]}, {"properties": {"name": "Canada"}, "type": "MultiPolygon", "id": "CA", "arcs": [[[158]], [[159]], [[160]], [[161, 162, 163, 164]], [[165]], [[166]], [[167]], [[168]], [[169]], [[170]], [[171]], [[172]], [[173]], [[174]], [[175]], [[176]], [[177]], [[178]], [[179]], [[180]], [[181]], [[182]], [[183]], [[184]], [[185]], [[186]], [[187]], [[188]], [[189]], [[190]], [[191]], [[192]], [[193]], [[194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205]], [[206]], [[207]], [[208]], [[209]], [[210]], [[211]], [[212]], [[213]], [[214]], [[215]], [[216]], [[217]], [[218]], [[219]], [[220]], [[221]], [[222]], [[223]], [[224]], [[225]], [[226]], [[227]], [[228]], [[229]], [[230]], [[231]], [[232]], [[233]], [[234]], [[235]], [[236]]]}, {
 "properties": {"name": "Switzerland"}, "type": "Polygon", "id": "CH", "arcs": [[237, -60, 238, 239, 240, 241, 242]]}, {"properties": {"name": "Chile"}, "type": "MultiPolygon", "id": "CL", "arcs": [[[243]], [[244]], [[245]], [[246]], [[247]], [[248]], [[249]], [[-30, 250]], [[251]], [[252]], [[253]], [[254]], [[255]], [[256]], [[257]], [[258]], [[259]], [[260]], [[261]], [[262]], [[263]], [[264]], [[265]], [[266]], [[267]], [[-36, 268, 269, -118]]]}, {"properties": {"name": "China"}, "type": "MultiPolygon", "id": "CN", "arcs": [[[270]], [[271]], [[272, 273, 274, 275, 276, 277, 278, 279, 280, 281, -149, 282, 283, 284, 285, 286, -1, 287, 288, 289, 290, 291, 292, 293, 294]]]}, {"properties": {"name": "C\u00f4te d'Ivoire"}, "type": "Polygon", "id": "CI", "arcs": [[-89, 295, 296, 297, 298, 299]]}, {"properties": {"name": "Cameroon"}, "type": "Polygon", "id": "CM", "arcs": [[300, -157, 301, 302, 303, 304, 305, 306, 307]]}, {"properties": {"name": "Cyprus U.N. Buffer Zone"}, "type": "MultiP
 olygon", "id": "CNM", "arcs": [[[308, 309]], [[310, 311, 312, 313]]]}, {"properties": {"name": "Dem. Rep. Congo"}, "type": "Polygon", "id": "CD", "arcs": [[314, 315, 316, 317, 318, 319, 320, 321, 322, -72, 323, 324, 325, 326, -10, 327, -11, 328, -155]]}, {"properties": {"name": "Congo"}, "type": "Polygon", "id": "CG", "arcs": [[-329, -13, 329, 330, -302, -156]]}, {"properties": {"name": "Colombia"}, "type": "Polygon", "id": "CO", "arcs": [[331, -141, 332, 333, 334, 335, 336]]}, {"properties": {"name": "Comoros"}, "type": "Polygon", "id": "KM", "arcs": [[337]]}, {"properties": {"name": "Cape Verde"}, "type": "MultiPolygon", "id": "CV", "arcs": [[[338]], [[339]], [[340]]]}, {"properties": {"name": "Costa Rica"}, "type": "Polygon", "id": "CR", "arcs": [[341, 342, 343, 344]]}, {"properties": {"name": "Cuba"}, "type": "MultiPolygon", "id": "CU", "arcs": [[[345]], [[346]]]}, {"properties": {"name": "N. Cyprus"}, "type": "Polygon", "id": "CYN", "arcs": [[347, 348, -314, 349]]}, {"propertie
 s": {"name": "Cyprus"}, "type": "MultiPolygon", "id": "CY", "arcs": [[[350, 351, -348]], [[352, 353, -310, 354, -312]]]}, {"properties": {"name": "Czech Rep."}, "type": "Polygon", "id": "CZ", "arcs": [[355, 356, -63, 357]]}, {"properties": {"name": "Germany"}, "type": "MultiPolygon", "id": "DE", "arcs": [[[358]], [[359, 360, -358, -62, 361, -243, 362, 363, -74, 364, 365, 366]]]}, {"properties": {"name": "Djibouti"}, "type": "Polygon", "id": "DJ", "arcs": [[367, 368, 369, 370]]}, {"properties": {"name": "Dominica"}, "type": "Polygon", "id": "DM", "arcs": [[371]]}, {"properties": {"name": "Denmark"}, "type": "MultiPolygon", "id": "DK", "arcs": [[[372]], [[373]], [[374]], [[375]], [[-367, 376]]]}, {"properties": {"name": "Dominican Rep."}, "type": "Polygon", "id": "DO", "arcs": [[377, 378, 379, 380]]}, {"properties": {"name": "Algeria"}, "type": "Polygon", "id": "DZ", "arcs": [[381, 382, 383, 384, 385, 386, 387, 388]]}, {"properties": {"name": "Ecuador"}, "type": "MultiPolygon", "id": 
 "EC", "arcs": [[[389]], [[390]], [[391]], [[392]], [[393]], [[394, 395, -334]]]}, {"properties": {"name": "Egypt"}, "type": "Polygon", "id": "EG", "arcs": [[396, 397, 398, 399, 400, 401]]}, {"properties": {"name": "Eritrea"}, "type": "Polygon", "id": "ER", "arcs": [[-370, 402, 403, 404]]}, {"properties": {"name": "Dhekelia"}, "type": "Polygon", "id": "ESB", "arcs": [[-352, 405, -353, -311, -349]]}, {"properties": {"name": "Spain"}, "type": "MultiPolygon", "id": "ES", "arcs": [[[406]], [[407]], [[408]], [[409]], [[410]], [[411, -23, 412, 413, 414, 415]]]}, {"properties": {"name": "Estonia"}, "type": "MultiPolygon", "id": "EE", "arcs": [[[416]], [[417, 418, 419, 420, 421, 422, 423]]]}, {"properties": {"name": "Ethiopia"}, "type": "Polygon", "id": "ET", "arcs": [[-369, 424, 425, 426, 427, 428, -403]]}, {"properties": {"name": "Finland"}, "type": "Polygon", "id": "FI", "arcs": [[429, 430, 431, 432]]}, {"properties": {"name": "Fiji"}, "type": "MultiPolygon", "id": "FJ", "arcs": [[[433]],
  [[434]]]}, {"properties": {"name": "Falkland Is."}, "type": "MultiPolygon", "id": "FK", "arcs": [[[435]], [[436]]]}, {"properties": {"name": "France"}, "type": "MultiPolygon", "id": "FR", "arcs": [[[437]], [[-132, 438, 439]], [[440]], [[441]], [[442]], [[443, -363, -242, 444, -240, 445, 446, -413, -24, -412, 447, -76]]]}, {"properties": {"name": "Gabon"}, "type": "Polygon", "id": "GA", "arcs": [[-331, 448, 449, -303]]}, {"properties": {"name": "United Kingdom"}, "type": "MultiPolygon", "id": "GB", "arcs": [[[450, 451]], [[452]], [[453]], [[454]], [[455]], [[456]]]}, {"properties": {"name": "Georgia"}, "type": "Polygon", "id": "GE", "arcs": [[-69, -42, 457, 458, 459]]}, {"properties": {"name": "Ghana"}, "type": "Polygon", "id": "GH", "arcs": [[460, 461, -296, -88]]}, {"properties": {"name": "Guinea"}, "type": "Polygon", "id": "GN", "arcs": [[462, -299, 463, 464, 465, 466, 467]]}, {"properties": {"name": "Gambia"}, "type": "Polygon", "id": "GM", "arcs": [[468, 469]]}, {"properties": 
 {"name": "Guinea-Bissau"}, "type": "Polygon", "id": "GW", "arcs": [[470, 471, -467]]}, {"properties": {"name": "Eq. Guinea"}, "type": "MultiPolygon", "id": "GQ", "arcs": [[[-450, 472, -304]], [[473]]]}, {"properties": {"name": "Greece"}, "type": "MultiPolygon", "id": "GR", "arcs": [[[474]], [[475]], [[476]], [[477]], [[478]], [[479]], [[480]], [[481, -97, 482, 483, -17, 484]]]}, {"properties": {"name": "Greenland"}, "type": "MultiPolygon", "id": "GL", "arcs": [[[485]], [[486]], [[487]], [[488]], [[489]], [[490]], [[491]], [[492]], [[493]], [[494]], [[495]], [[496]]]}, {"properties": {"name": "Guatemala"}, "type": "Polygon", "id": "GT", "arcs": [[-115, 497, 498, 499, 500, 501]]}, {"properties": {"name": "Guyana"}, "type": "Polygon", "id": "GY", "arcs": [[502, -143, 503, 504]]}, {"properties": {"name": "Hong Kong"}, "type": "Polygon", "id": "HK", "arcs": [[505, -277]]}, {"properties": {"name": "Honduras"}, "type": "Polygon", "id": "HN", "arcs": [[506, 507, 508, -499, 509]]}, {"propert
 ies": {"name": "Croatia"}, "type": "MultiPolygon", "id": "HR", "arcs": [[[-106, 510, 511, 512]], [[513, 514, 515, -108, 516, 517]]]}, {"properties": {"name": "Haiti"}, "type": "MultiPolygon", "id": "HT", "arcs": [[[518]], [[-380, 519, -378, 520]]]}, {"properties": {"name": "Hungary"}, "type": "Polygon", "id": "HU", "arcs": [[521, 522, 523, -514, 524, -57, 525]]}, {"properties": {"name": "Indonesia"}, "type": "MultiPolygon", "id": "ID", "arcs": [[[526]], [[527]], [[528, 529, 530, 531]], [[532]], [[533]], [[534]], [[535]], [[536]], [[537]], [[538]], [[539]], [[540]], [[541]], [[542]], [[543]], [[544]], [[545]], [[546]], [[547]], [[548]], [[549]], [[550]], [[551]], [[552]], [[553]], [[554]], [[555]], [[556]], [[557]], [[558]], [[559]], [[560]], [[561]], [[562]], [[563]], [[564]], [[565]], [[566]], [[567]], [[568, 569]], [[570]], [[571]], [[572]], [[573]], [[574]], [[575]], [[576]], [[577]], [[578]], [[579]], [[580]], [[581]], [[582]], [[583]], [[584]], [[585, 586]], [[587]], [[588]]]},
  {"properties": {"name": "Isle of Man"}, "type": "Polygon", "id": "IM", "arcs": [[589]]}, {"properties": {"name": "India"}, "type": "MultiPolygon", "id": "IN", "arcs": [[[590]], [[591]], [[592]], [[593, -283, -148, -282, 594, -94, 595, 596, 597, -285]]]}, {"properties": {"name": "Ireland"}, "type": "Polygon", "id": "IE", "arcs": [[-451, 598]]}, {"properties": {"name": "Iran"}, "type": "MultiPolygon", "id": "IR", "arcs": [[[599]], [[-39, -68, 600, 601, -3, 602, 603, 604, 605, -64]]]}, {"properties": {"name": "Iraq"}, "type": "Polygon", "id": "IQ", "arcs": [[-605, 606, 607, 608, 609, 610, 611]]}, {"properties": {"name": "Iceland"}, "type": "Polygon", "id": "IS", "arcs": [[612]]}, {"properties": {"name": "Israel"}, "type": "Polygon", "id": "IL", "arcs": [[613, 614, 615, 616, 617, -398, 618, 619, 620, 621]]}, {"properties": {"name": "Italy"}, "type": "MultiPolygon", "id": "IT", "arcs": [[[622]], [[623]], [[624, 625, -446, -239, -59]]]}, {"properties": {"name": "Jamaica"}, "type": "Polyg
 on", "id": "JM", "arcs": [[626]]}, {"properties": {"name": "Jordan"}, "type": "Polygon", "id": "JO", "arcs": [[627, 628, -617, 629, 630, -614, 631, -610]]}, {"properties": {"name": "Japan"}, "type": "MultiPolygon", "id": "JP", "arcs": [[[632]], [[633]], [[634]], [[635]], [[636]], [[637]], [[638]], [[639]]]}, {"properties": {"name": "Baikonur"}, "type": "Polygon", "id": "KAB", "arcs": [[640]]}, {"properties": {"name": "Siachen Glacier"}, "type": "Polygon", "id": "KAS", "arcs": [[-598, 641, -286]]}, {"properties": {"name": "Kazakhstan"}, "type": "MultiPolygon", "id": "KZ", "arcs": [[[642, 643]], [[-290, 644, 645, 646, 647, 648, 649, 650], [-641]]]}, {"properties": {"name": "Kenya"}, "type": "Polygon", "id": "KE", "arcs": [[-427, 651, 652, 653, 654, 655, 656]]}, {"properties": {"name": "Kyrgyzstan"}, "type": "Polygon", "id": "KG", "arcs": [[-289, 657, 658, -645]]}, {"properties": {"name": "Cambodia"}, "type": "Polygon", "id": "KH", "arcs": [[659, 660, 661, 662]]}, {"properties": {"name
 ": "Korea"}, "type": "MultiPolygon", "id": "KR", "arcs": [[[663]], [[664, 665]]]}, {"properties": {"name": "Kosovo"}, "type": "Polygon", "id": "KOS", "arcs": [[666, -14, 667, 668]]}, {"properties": {"name": "Kuwait"}, "type": "MultiPolygon", "id": "KW", "arcs": [[[669]], [[670, -608, 671]]]}, {"properties": {"name": "Lao PDR"}, "type": "Polygon", "id": "LA", "arcs": [[672, -662, 673, 674, -280]]}, {"properties": {"name": "Lebanon"}, "type": "Polygon", "id": "LB", "arcs": [[-621, 675, 676]]}, {"properties": {"name": "Liberia"}, "type": "Polygon", "id": "LR", "arcs": [[-298, 677, 678, -464]]}, {"properties": {"name": "Libya"}, "type": "Polygon", "id": "LY", "arcs": [[-401, 679, 680, 681, -383, 682, 683]]}, {"properties": {"name": "Sri Lanka"}, "type": "Polygon", "id": "LK", "arcs": [[684]]}, {"properties": {"name": "Lesotho"}, "type": "Polygon", "id": "LS", "arcs": [[685]]}, {"properties": {"name": "Lithuania"}, "type": "Polygon", "id": "LT", "arcs": [[-112, 686, 687, 688, 689]]}, {"p
 roperties": {"name": "Luxembourg"}, "type": "Polygon", "id": "LU", "arcs": [[-364, -444, -75]]}, {"properties": {"name": "Latvia"}, "type": "Polygon", "id": "LV", "arcs": [[690, -113, -690, 691, -423]]}, {"properties": {"name": "Morocco"}, "type": "Polygon", "id": "MA", "arcs": [[-388, 692, 693]]}, {"properties": {"name": "Moldova"}, "type": "Polygon", "id": "MD", "arcs": [[694, 695]]}, {"properties": {"name": "Madagascar"}, "type": "Polygon", "id": "MG", "arcs": [[696]]}, {"properties": {"name": "Mexico"}, "type": "MultiPolygon", "id": "MX", "arcs": [[[697]], [[698]], [[699, 700, 701, 702, 703, -116, -502, 704, 705], [706]]]}, {"properties": {"name": "Macedonia"}, "type": "Polygon", "id": "MK", "arcs": [[-98, -482, 707, -15, -667, 708]]}, {"properties": {"name": "Mali"}, "type": "Polygon", "id": "ML", "arcs": [[709, -90, -300, -463, 710, 711, -385]]}, {"properties": {"name": "Myanmar"}, "type": "MultiPolygon", "id": "MM", "arcs": [[[712]], [[713]], [[-675, 714, 715, -92, -595, -281
 ]]]}, {"properties": {"name": "Montenegro"}, "type": "Polygon", "id": "ME", "arcs": [[716, -668, -21, 717, -19, 718, -512, 719]]}, {"properties": {"name": "Mongolia"}, "type": "Polygon", "id": "MN", "arcs": [[-294, 720, -292, 721]]}, {"properties": {"name": "Mozambique"}, "type": "Polygon", "id": "MZ", "arcs": [[722, 723, 724, 725, 726, 727, 728, 729, 730]]}, {"properties": {"name": "Mauritania"}, "type": "Polygon", "id": "MR", "arcs": [[731, 732, 733, -386, -712]]}, {"properties": {"name": "Mauritius"}, "type": "Polygon", "id": "MU", "arcs": [[734]]}, {"properties": {"name": "Malawi"}, "type": "Polygon", "id": "MW", "arcs": [[735, -728, 736, 737]]}, {"properties": {"name": "Malaysia"}, "type": "MultiPolygon", "id": "MY", "arcs": [[[738, 739]], [[-587, 740, -147, 741, -144, 742]]]}, {"properties": {"name": "Namibia"}, "type": "Polygon", "id": "NA", "arcs": [[743, -152, 744, 745, -8]]}, {"properties": {"name": "New Caledonia"}, "type": "MultiPolygon", "id": "NC", "arcs": [[[746]], [[
 747]], [[748]]]}, {"properties": {"name": "Niger"}, "type": "Polygon", "id": "NE", "arcs": [[749, 750, -85, -86, -710, -384, -682]]}, {"properties": {"name": "Nigeria"}, "type": "Polygon", "id": "NG", "arcs": [[751, -306, 752, -81, -751]]}, {"properties": {"name": "Nicaragua"}, "type": "Polygon", "id": "NI", "arcs": [[753, -345, 754, -507]]}, {"properties": {"name": "Netherlands"}, "type": "MultiPolygon", "id": "NL", "arcs": [[[-78, 755]], [[756]], [[-365, -80, 757], [758]]]}, {"properties": {"name": "Norway"}, "type": "MultiPolygon", "id": "NO", "arcs": [[[759]], [[760]], [[761]], [[762]], [[763]], [[764]], [[765]], [[766]], [[767, -433, 768, 769]], [[770]], [[771]], [[772]], [[773]], [[774]]]}, {"properties": {"name": "Nepal"}, "type": "Polygon", "id": "NP", "arcs": [[-594, -284]]}, {"properties": {"name": "New Zealand"}, "type": "MultiPolygon", "id": "NZ", "arcs": [[[775]], [[776]], [[777]]]}, {"properties": {"name": "Oman"}, "type": "MultiPolygon", "id": "OM", "arcs": [[[778, 77
 9, -26, 780]], [[-29, 781]]]}, {"properties": {"name": "Pakistan"}, "type": "Polygon", "id": "PK", "arcs": [[-642, -597, 782, -603, -2, -287]]}, {"properties": {"name": "Panama"}, "type": "Polygon", "id": "PA", "arcs": [[-336, 783, -343, 784]]}, {"properties": {"name": "Peru"}, "type": "Polygon", "id": "PE", "arcs": [[-140, -121, 785, -119, -270, 786, -395, -333]]}, {"properties": {"name": "Philippines"}, "type": "MultiPolygon", "id": "PH", "arcs": [[[787]], [[788]], [[789]], [[790]], [[791]], [[792]], [[793]], [[794]], [[795]], [[796]], [[797]], [[798]], [[799]], [[800]], [[801]], [[802]], [[803]], [[804]], [[805]], [[806]]]}, {"properties": {"name": "Papua New Guinea"}, "type": "MultiPolygon", "id": "PG", "arcs": [[[807]], [[808]], [[809]], [[810]], [[811]], [[812]], [[813]], [[814]], [[-569, 815]], [[816]], [[817]], [[818]]]}, {"properties": {"name": "Poland"}, "type": "Polygon", "id": "PL", "arcs": [[819, -687, -111, 820, 821, -356, -361, 822]]}, {"properties": {"name": "Puerto 
 Rico"}, "type": "Polygon", "id": "PR", "arcs": [[823]]}, {"properties": {"name": "Dem. Rep. Korea"}, "type": "Polygon", "id": "KP", "arcs": [[824, 825, -665, 826, -275]]}, {"properties": {"name": "Portugal"}, "type": "MultiPolygon", "id": "PT", "arcs": [[[827]], [[828]], [[829, -415]]]}, {"properties": {"name": "Paraguay"}, "type": "Polygon", "id": "PY", "arcs": [[-139, 830, -137, -32, -117]]}, {"properties": {"name": "Palestine"}, "type": "MultiPolygon", "id": "PSX", "arcs": [[[-397, 831, -619]], [[-631, 832, -615]]]}, {"properties": {"name": "Fr. Polynesia"}, "type": "Polygon", "id": "PF", "arcs": [[833]]}, {"properties": {"name": "Qatar"}, "type": "Polygon", "id": "QA", "arcs": [[834, 835]]}, {"properties": {"name": "Romania"}, "type": "Polygon", "id": "RO", "arcs": [[836, 837, -100, 838, -523, 839, -695]]}, {"properties": {"name": "Russia"}, "type": "MultiPolygon", "id": "RU", "arcs": [[[840]], [[841]], [[842]], [[843]], [[844]], [[845]], [[846]], [[-820, 847, -688]], [[848]], [
 [849]], [[850]], [[851]], [[852]], [[853]], [[854]], [[855, 856]], [[857, -857]], [[858]], [[859]], [[860]], [[861]], [[862]], [[863]], [[864]], [[865]], [[866]], [[867]], [[868]], [[869, -825, -274, 870, -295, -722, -291, -651, 871, -66, -460, 872, 873, -109, -691, -422, 874, -420, 875, -418, 876, -430, -768, 877]], [[878]], [[879]], [[880]], [[881]], [[882]], [[883]], [[884]], [[885]], [[886]], [[887]]]}, {"properties": {"name": "Rwanda"}, "type": "Polygon", "id": "RW", "arcs": [[888, -73, -323, 889, -321, 890]]}, {"properties": {"name": "W. Sahara"}, "type": "Polygon", "id": "SAH", "arcs": [[-387, -734, 891, -693]]}, {"properties": {"name": "Saudi Arabia"}, "type": "Polygon", "id": "SA", "arcs": [[-671, 892, -835, 893, -27, -780, 894, 895, -628, -609]]}, {"properties": {"name": "Sudan"}, "type": "Polygon", "id": "SD", "arcs": [[896, -404, -429, 897, -153, 898, -680, -400]]}, {"properties": {"name": "S. Sudan"}, "type": "Polygon", "id": "SS", "arcs": [[-428, -657, 899, -315, -154,
  -898]]}, {"properties": {"name": "Senegal"}, "type": "Polygon", "id": "SN", "arcs": [[-711, -468, -472, 900, -470, 901, -732]]}, {"properties": {"name": "S. Geo. and S. Sandw. Is."}, "type": "Polygon", "id": "GS", "arcs": [[902]]}, {"properties": {"name": "Solomon Is."}, "type": "MultiPolygon", "id": "SB", "arcs": [[[903]], [[904]], [[905]], [[906]], [[907]], [[908]], [[909]], [[910]], [[911]]]}, {"properties": {"name": "Sierra Leone"}, "type": "MultiPolygon", "id": "SL", "arcs": [[[912]], [[-679, 913, -465]]]}, {"properties": {"name": "El Salvador"}, "type": "Polygon", "id": "SV", "arcs": [[-509, 914, -500]]}, {"properties": {"name": "Somaliland"}, "type": "Polygon", "id": "SOL", "arcs": [[915, -425, -368, 916]]}, {"properties": {"name": "Somalia"}, "type": "Polygon", "id": "SO", "arcs": [[-652, -426, -916, 917]]}, {"properties": {"name": "Serbia"}, "type": "Polygon", "id": "RS", "arcs": [[-839, -99, -709, -669, -717, 918, -515, -524]]}, {"properties": {"name": "S\u00e3o Tom\u00e9
  and Principe"}, "type": "Polygon", "id": "ST", "arcs": [[919]]}, {"properties": {"name": "Suriname"}, "type": "Polygon", "id": "SR", "arcs": [[-439, -131, -503, 920]]}, {"properties": {"name": "Slovakia"}, "type": "Polygon", "id": "SK", "arcs": [[921, -526, -56, -357, -822]]}, {"properties": {"name": "Slovenia"}, "type": "Polygon", "id": "SI", "arcs": [[-518, 922, -625, -58, -525]]}, {"properties": {"name": "Sweden"}, "type": "MultiPolygon", "id": "SE", "arcs": [[[923]], [[924, -769, -432]]]}, {"properties": {"name": "Swaziland"}, "type": "Polygon", "id": "SZ", "arcs": [[-724, 925]]}, {"properties": {"name": "Syria"}, "type": "Polygon", "id": "SY", "arcs": [[-611, -632, -622, -677, 926, 927]]}, {"properties": {"name": "Chad"}, "type": "Polygon", "id": "TD", "arcs": [[-899, -158, -301, 928, -307, -752, -750, -681]]}, {"properties": {"name": "Togo"}, "type": "Polygon", "id": "TG", "arcs": [[-83, 929, -461, -87]]}, {"properties": {"name": "Thailand"}, "type": "MultiPolygon", "id": "TH
 ", "arcs": [[[930]], [[-674, -661, 931, -740, 932, -715]]]}, {"properties": {"name": "Tajikistan"}, "type": "Polygon", "id": "TJ", "arcs": [[-658, -288, -6, 933]]}, {"properties": {"name": "Turkmenistan"}, "type": "Polygon", "id": "TM", "arcs": [[-4, -602, 934, -649, 935, 936, 937]]}, {"properties": {"name": "Timor-Leste"}, "type": "MultiPolygon", "id": "TL", "arcs": [[[938, -530]], [[-532, 939]]]}, {"properties": {"name": "Trinidad and Tobago"}, "type": "Polygon", "id": "TT", "arcs": [[940]]}, {"properties": {"name": "Tunisia"}, "type": "MultiPolygon", "id": "TN", "arcs": [[[941]], [[-683, -382, 942]]]}, {"properties": {"name": "Turkey"}, "type": "MultiPolygon", "id": "TR", "arcs": [[[943, -483, -96]], [[-458, -41, -65, -606, -612, -928, 944]]]}, {"properties": {"name": "Taiwan"}, "type": "Polygon", "id": "TW", "arcs": [[945]]}, {"properties": {"name": "Tanzania"}, "type": "MultiPolygon", "id": "TZ", "arcs": [[[946]], [[947]], [[948, -654, 949, -730, 950, -738, 951, 952, -70, -889,
  953]]]}, {"properties": {"name": "Uganda"}, "type": "Polygon", "id": "UG", "arcs": [[954, -954, -891, -320, 955, -318, 956, -316, -900, -656]]}, {"properties": {"name": "Ukraine"}, "type": "Polygon", "id": "UA", "arcs": [[957, -837, -696, -840, -522, -922, -821, -110, -874], [958]]}, {"properties": {"name": "Uruguay"}, "type": "Polygon", "id": "UY", "arcs": [[959, -134, 960, -34, -136]]}, {"properties": {"name": "United States"}, "type": "MultiPolygon", "id": "US", "arcs": [[[961]], [[962]], [[963]], [[964]], [[965]], [[966]], [[967]], [[968]], [[969]], [[970, -201, 971, -199, 972, -197, 973, -195, -165, 974, -163, 975, -703, 976, -701, 977, -706, 978, -203]], [[979]], [[980]], [[982]], [[983]], [[984]], [[985]], [[986]], [[987]], [[988]], [[989]], [[990]], [[991]], [[992]], [[993]], [[994]], [[995]], [[996]], [[997]], [[998]], [[-205, 999]]]}, {"properties": {"name": "Uzbekistan"}, "type": "Polygon", "id": "UZ", "arcs": [[-643, 1000, -646, -659, -934, -5, -938, 1001, -936, -648, 1
 002]]}, {"properties": {"name": "Venezuela"}, "type": "MultiPolygon", "id": "VE", "arcs": [[[1003]], [[-504, -142, -332, 1004]]]}, {"properties": {"name": "Vietnam"}, "type": "MultiPolygon", "id": "VN", "arcs": [[[1005]], [[1006, -663, -673, -279]]]}, {"properties": {"name": "Vanuatu"}, "type": "MultiPolygon", "id": "VU", "arcs": [[[1007]], [[1008]], [[1009]], [[1010]], [[1011]]]}, {"properties": {"name": "Samoa"}, "type": "MultiPolygon", "id": "WS", "arcs": [[[1012]], [[1013]]]}, {"properties": {"name": "Yemen"}, "type": "MultiPolygon", "id": "YE", "arcs": [[[1014]], [[1015, -895, -779]]]}, {"properties": {"name": "South Africa"}, "type": "Polygon", "id": "ZA", "arcs": [[-725, -926, -723, 1016, -745, -151, 1017], [-686]]}, {"properties": {"name": "Zambia"}, "type": "Polygon", "id": "ZM", "arcs": [[-952, -737, -727, 1018, 1019, 1020, -744, -7, -327, 1021, -325, 1022]]}, {"properties": {"name": "Zimbabwe"}, "type": "Polygon", "id": "ZW", "arcs": [[-726, -1018, -150, -1021, 1023, -101
 9]]}], "bbox": [-179.99999999999986, -55.52450937299982, 180.00000000000014, 83.61347077000005]}}, "transform": {"translate": [-180, -55.52450937299982], "scale": [0.036003600360036005, 0.013915189533253314]}, "type": "Topology", "arcs": [[[7080, 6666], [-5, 5], [-10, -13], [5, -7]], [[7070, 6651], [-13, -14], [-12, 5], [-30, -6], [-10, -6], [-13, -24], [-3, 4], [-13, -29], [5, -7], [7, -29], [-2, -18], [3, -7], [-5, -19], [-10, -19], [-3, -15], [4, -8], [-2, -22], [-5, -6], [-10, -2], [-14, 8], [-5, -8], [4, -13], [4, -2], [5, -29], [-8, -13], [-13, -5], [-3, -29], [-6, -18], [2, -35], [-8, -20], [-6, -3], [-3, 12], [-5, -4], [-9, 7], [-4, -10], [-12, -18], [4, -7], [-11, -9], [-11, 8], [-7, -9], [-4, -16], [-5, -4], [-3, -23], [2, -11], [-3, -29], [3, -6], [-4, -9], [-32, -21], [-16, 2], [-11, -13], [-14, 8], [-30, -6], [-46, 32]], [[6689, 6136], [27, 70], [1, 14], [-5, 25], [-23, 9], [-1, 38], [1, 16], [-7, 53], [0, 12], [8, 28], [-10, 7], [0, 32], [6, 30], [6, 9], [4, 13], [1, 3
 3], [4, 25]], [[6701, 6550], [8, -12], [13, -2], [8, -20], [4, 10], [5, -5], [13, 16], [-1, 13], [8, 17], [25, 21], [10, 22], [0, 12], [5, 23], [-1, 11], [9, 10], [12, 1], [4, 20], [4, 3], [14, -17], [6, 2]], [[6847, 6675], [14, 2], [6, -14], [7, 6], [8, -6]], [[6882, 6663], [7, -19], [7, 6], [1, 7], [14, 15], [5, -1], [7, -14], [5, 9], [-2, 15], [5, 10], [10, 3], [7, -6], [4, 12], [-3, 17], [8, 14], [8, 22], [8, -3], [8, -9], [-2, -25], [9, -2], [-3, -24], [-2, -36], [5, -26], [7, 0], [12, 19], [11, 4], [2, 12], [15, 19], [13, -2], [1, -14], [12, 12], [12, -1], [7, -11]], [[5665, 3209], [3, -38], [-3, -16], [0, -41], [2, -14], [-5, -29], [4, -15], [-56, 0], [0, -98], [0, -130], [4, -27], [6, -9], [12, -35], [6, -10], [6, -17], [5, -8]], [[5649, 2722], [-56, -26], [-4, 6], [-12, -8], [-13, 13], [-8, -3], [-10, 4], [-18, 1], [-7, 6], [-9, 26], [-59, 0], [-35, 0], [-31, -2], [-12, 21], [-1, 7], [-9, 5], [-8, -6], [-9, -14], [-8, 0], [-6, 6], [-8, -8]], [[5326, 2750], [2, 56], [-2, 49]
 , [7, 13], [1, 27], [6, 35], [2, 23], [0, 24], [5, 18], [0, 29], [12, 33], [0, 12], [7, 16], [5, 0], [7, 25], [5, 34], [0, 31], [1, 17], [-3, 33], [-6, 19], [0, 8], [-9, 41], [-1, 22], [-5, 22], [6, 20], [5, 4], [0, 31], [-3, 10], [-12, 66], [-1, 23], [-5, 15], [-9, 42], [18, 12], [7, 9]], [[5366, 3569], [42, -1], [45, 1], [5, -2], [6, -22], [-1, -15], [2, -22], [5, -13], [2, -29], [2, -3], [13, -54], [10, 3], [5, -5], [2, 8], [33, 0], [0, 31], [4, 7], [1, 34], [21, 0], [1, 6], [8, 0], [-3, -26], [36, 0], [1, -22], [-2, -31], [2, -9], [3, -26], [-2, -25], [-1, -55], [9, -23], [4, -31], [0, -29], [-4, -6], [3, -22], [7, 9], [14, -5], [13, 10], [9, -4], [4, 11]], [[5363, 3657], [-7, -6], [-4, -15], [-7, -9], [3, -8], [-1, -40], [-8, -3]], [[5339, 3576], [-2, 10], [2, 10], [-6, 33]], [[5333, 3629], [5, 19], [4, 0], [2, 11], [6, 3], [7, 12], [6, -17]], [[5557, 7048], [4, -16], [8, -8], [2, -25]], [[5571, 6999], [-3, -39], [5, -17], [2, -13], [6, 0]], [[5581, 6930], [1, -3], [0, -1], [0,
  -4]], [[5582, 6922], [1, -7], [0, -1], [-5, -16], [-5, -27], [-9, -7], [2, -11], [-6, -14], [-5, 4]], [[5555, 6843], [0, 11], [-4, 14], [-13, 18], [3, 11], [-5, 14], [6, 22], [-3, 14], [4, 48], [-6, 3]], [[5537, 6998], [1, 17]], [[5538, 7015], [0, 17]], [[5538, 7032], [9, 24], [3, -14], [7, 6]], [[5553, 8329], [10, -7], [-8, -13], [-7, 0], [-3, 12], [8, 8]], [[5047, 7045], [-7, -5], [-1, 11]], [[5039, 7051], [8, -6]], [[6563, 5832], [2, -7], [1, -40]], [[6566, 5785], [-8, -17], [-9, 8], [1, -37], [5, -18], [-15, -9], [2, -14], [-10, -55], [0, -21]], [[6532, 5622], [-2, -6], [-27, 8], [-43, 14], [-1, 2], [-26, 81], [-1, 12]], [[6432, 5733], [6, -1], [1, -17], [14, 0], [7, 11], [28, -8], [7, 1], [15, 14], [6, 18], [3, 22], [10, 15], [13, 38], [9, 12], [6, 25]], [[6557, 5863], [3, -3], [-1, -26], [4, -2]], [[3093, 53], [0, 77], [0, 77]], [[3093, 207], [10, -24], [-7, -10], [2, -13], [10, -3], [3, -19], [19, -32], [15, -14], [8, -16], [18, -13], [19, 1], [-5, -20], [-15, 1], [-19, -11]
 , [-13, 11], [-45, 8]], [[3259, 2392], [10, -18], [10, -39], [13, -27], [10, -14], [3, -15], [19, -15], [8, 1], [16, -25], [3, -10], [15, -20], [16, -12], [13, -17], [6, -20], [-6, -16], [-3, -24], [-8, -19], [-2, -35], [-12, -28], [4, -9], [14, 1], [23, -16], [8, 5], [4, -7], [6, 4], [5, -9], [7, 20], [10, -10], [4, 8], [0, 12], [5, 12], [8, 3], [7, 21], [3, 1], [4, 33], [-1, 15], [2, 29]], [[3483, 2152], [5, -5], [3, 7], [11, -6], [2, -24], [5, -18], [-2, -34], [1, -13], [-4, -21], [-3, 1], [-9, -20], [-17, -14], [-4, -15], [-8, -6], [-3, -12], [-10, -11], [-7, -25], [-7, -14], [-3, -20], [-6, -7], [-2, -11], [-11, -32], [-6, -4], [-1, -12], [-8, -15]], [[3399, 1821], [-6, -22], [1, -30], [-3, -24], [-5, -17], [3, -5], [-2, -19], [-3, -2], [-1, -22], [3, -12], [-3, -10]], [[3383, 1658], [1, -43], [-6, -2], [-5, -43], [5, -25], [-3, -36], [9, -16], [8, -6], [10, -13], [7, -17], [3, -17], [-5, -17], [-1, -19], [3, -13], [9, -14], [7, -2], [1, -33], [-11, -40], [-13, -33], [-2, -21],
  [-16, -20], [-25, -18], [-50, -21], [-18, -2], [-14, 5], [-4, 9], [-6, 0], [2, -33], [8, -7], [-3, -33], [-5, -3], [-2, -25], [-3, -6], [7, -27], [-3, -14], [-21, -20], [-19, -1], [-27, 24], [-5, 9], [-7, -22], [5, -39], [-2, -31], [6, -15], [10, -4], [-3, -12], [13, -1], [-1, 16], [10, 10], [6, -20], [-1, -29], [-13, -10], [-6, 25], [-8, 2], [-9, -10], [-2, -9], [19, -17], [-12, -10], [-16, -37], [3, -27], [-2, -14], [2, -9], [-4, -13], [-8, -9], [0, -27], [-15, 4], [-8, -6], [-1, -10], [-10, -2], [-13, -27], [-8, -39], [6, -29], [8, -10], [10, -22], [16, -6], [6, 2], [6, -10], [1, -22], [-5, -19], [-2, -23], [-4, -3], [-10, -19], [-5, -2], [-13, -18], [-2, -10], [-10, -14], [-5, -19], [4, -3], [-7, -46], [-6, -9], [-23, -18], [-5, -16], [-3, -30], [7, -48], [7, -26], [9, -22], [-3, -3]], [[3098, 228], [0, 4], [-41, 21], [-55, 1], [-1, 9], [-9, 12], [-2, 16], [3, 18], [-2, 41], [-13, 2], [-11, -9], [-4, 35], [-6, 9], [2, 27], [-3, 17], [3, 16], [9, 0], [4, 23], [11, 14], [1, 24], 
 [8, 9], [-2, 19], [-5, 11], [10, 36], [9, 17], [-4, 10], [2, 17], [6, 8], [-2, 41], [4, 11], [-5, 16], [1, 12], [7, 4], [6, 16], [-8, 23], [-13, 5], [0, 11], [16, 1], [4, -4], [6, 19], [-2, 7], [-17, 2], [-1, 21], [5, 13], [-4, 13], [2, 11], [-6, 10], [6, 19], [-11, 14], [0, 29], [3, 8], [-3, 16], [3, 9], [8, 4], [-5, 33], [2, 49], [-3, 16], [8, 27], [-4, 10], [5, 22], [-2, 12], [8, 28], [0, 29], [15, 18], [-3, 19], [-1, 26], [-5, 26], [2, 18], [-2, 11], [3, 14], [-3, 19], [4, 25], [9, 5], [1, 11], [9, 16], [-1, 39], [-4, 21], [5, 3], [4, 42], [5, 22], [6, 2], [-2, 21], [0, 21], [3, 20], [-6, 6], [-3, 19], [3, 12], [-4, 7], [-1, 22], [-4, 13], [-3, 30], [-4, 23], [3, 32], [3, -1], [4, 43], [9, 15], [1, 13], [-3, 3], [1, 27], [-3, 25], [7, 19], [1, 33], [3, 17], [13, 34], [5, 35], [6, 24], [6, -4], [7, 9], [0, 12], [-7, 23], [0, 18], [4, 9], [-5, 53], [2, 18], [5, 6], [-6, 24], [2, 11], [7, 17], [25, 25], [9, 74], [-5, 13]], [[3133, 2350], [5, 22], [7, 6], [1, 15], [10, 7], [4, 24], 
 [4, -3], [9, -20], [21, 1], [12, -8], [8, -40], [9, 55], [32, 0], [4, -17]], [[6249, 6958], [4, -16], [13, -15], [-6, -14], [4, -17], [13, -15], [-6, -22], [12, -24], [9, -3], [-4, -12], [5, -10], [-3, -9], [1, -17]], [[6291, 6784], [-10, -1]], [[6281, 6783], [-5, 29], [-5, 6], [0, 14], [-10, -4], [-11, 20], [-7, -5]], [[6243, 6843], [-9, 20], [-11, 2], [-9, 12], [-5, 21], [5, 15], [-3, 21], [-5, 10]], [[6206, 6944], [8, 0], [13, 9], [10, -4], [12, 9]], [[6916, 483], [6, -23], [14, -13], [10, 13], [12, 2], [-1, -19], [-13, 0], [-5, -12], [13, 0], [-5, -13], [-21, 10], [-16, -10], [3, 20], [-4, 27], [7, 18]], [[9020, 1063], [27, -14], [2, -6], [17, -11], [17, 13], [12, -2], [4, 12], [6, -4], [5, 12], [9, -19], [-2, -58], [-6, -33], [-4, -42], [-8, 2], [-7, -8], [-11, -39], [-1, -10], [-6, -1], [-12, 10], [-7, -5], [0, 17], [-5, 2], [-4, 17], [-5, 7], [-7, 25], [0, 25], [3, 2], [-4, 19], [-8, 19], [-9, 51], [4, 19]], [[9109, 1136], [10, -18], [0, -19], [-5, -3], [-7, 17], [2, 23]], [[
 9001, 1112], [-4, -6], [-2, 31], [6, 6], [2, -27], [-2, -4]], [[8822, 1433], [-1, -10], [13, -3], [0, -11], [-8, 3], [-9, -15], [-6, 8], [-14, -6], [-5, 10], [1, 11], [21, 13], [8, 0]], [[9261, 2024], [-2, 21], [3, 1], [-1, -22]], [[8137, 2159], [5, -29], [-3, -4], [-3, 22], [1, 11]], [[9257, 2213], [2, -20], [-8, -47], [-3, 8], [3, 16], [-1, 10], [5, 12], [-1, 15], [3, 6]], [[8880, 2808], [-11, -20], [-5, 2], [4, 17], [9, 5], [3, -4]], [[8797, 3007], [2, -12], [-4, -31], [-5, 5], [0, 27], [7, 11]], [[8621, 3166], [3, -27], [-8, 14], [-1, 15], [6, -2]], [[8624, 3180], [2, -9], [12, 3], [8, 12], [4, -4], [3, -16], [-7, -18], [-9, -15], [-13, 20], [-4, 30], [4, -3]], [[8959, 3221], [0, -10], [5, -10], [4, -29], [-2, -7], [2, -26], [9, -10], [-4, -25], [5, -4], [5, -16], [-1, -17], [3, -1], [1, -34], [2, -14], [-2, -16], [4, -19], [3, -28], [5, -7], [14, 19], [3, -2], [3, -21], [6, -4], [4, -14], [5, -2], [1, -50], [3, -27], [3, -11], [-2, -27], [13, -43], [8, -43], [-4, -38], [0, -7],
  [9, -19], [-2, -25], [5, -13], [8, -9], [5, -9], [4, 4], [2, -12], [9, 1], [6, -31], [11, -3], [6, -7], [0, -8], [9, -6], [7, -13], [-6, -15], [6, -20], [10, -18], [7, -46], [-1, -5], [5, -32], [6, -10], [6, 17], [5, -18], [7, -9], [3, 14], [5, -11], [2, -16], [-2, -33], [1, -18], [22, -47], [2, 6], [7, -17], [6, -29], [8, -9], [7, -36], [7, -3], [1, -15], [-2, -14], [9, -19], [-4, -23], [2, -47], [-2, -27], [5, -12], [5, -24], [-1, -11], [5, -22], [1, -43], [-4, -12], [-3, -21], [-1, -27], [-9, -75], [2, -11], [-4, -42], [-5, -26], [-7, -23], [1, -20], [-9, -15], [-3, -11], [-7, -5], [-12, -47], [-3, -4], [-1, -27], [-10, -27], [0, -19], [-6, -34], [-15, -59], [0, -31], [-7, -44], [3, -21], [-1, -19], [-5, -4], [-9, -17], [-32, -3], [-11, -7], [-9, -11], [-20, -41], [-19, -8], [3, -11], [5, -1], [-2, -15], [-9, 22], [-5, -6], [-5, 19], [-4, -1], [-4, 17], [1, 13], [-10, 6], [-4, 19], [-12, -14], [5, -5], [-2, -9], [-7, -1], [-9, -14], [-6, -14], [-9, -12], [-13, 16], [-7, 4], [-11
 , 15], [-5, -3], [-8, 9], [-8, 0], [-3, -11], [-11, 22], [-12, 4], [-10, 14], [-3, 15], [-7, 13], [-7, 22], [-2, 17], [5, 13], [0, 10], [-11, 53], [-14, 25], [-12, -7], [-10, -2], [-1, 8], [8, 15], [3, 44], [-7, 21], [-7, 10], [-10, -63], [-7, 4], [-7, -8], [-9, -1], [6, 25], [11, -1], [2, 21], [-2, 33], [4, 21], [10, 25], [-4, 19], [6, 8], [-3, 26], [-13, -25], [-6, -37], [-17, -18], [-7, -12], [-4, -17], [-8, -17], [-3, -24], [-6, 0], [-8, 14], [2, 15], [-4, 34], [-11, 26], [-1, 20], [-3, 14], [-12, 0], [-6, 32], [7, 3], [-5, 16], [-8, 15], [-8, 5], [-11, -2], [-10, 18], [-6, 1], [-10, -7], [-19, 31], [-10, 9], [-10, -9], [-18, 2], [-33, -8], [-27, -28], [-20, -14], [-17, -3], [-14, 6], [-8, -7], [-10, -16], [-15, -13], [-8, -12], [-9, -4], [-7, -12], [-5, -32], [-12, -27], [-5, 3], [-5, -7], [-2, 9], [-21, -4], [-4, -7], [-5, 14], [-5, -5], [-8, 6], [-27, -5], [-4, -6], [-11, 3], [-10, -11], [-7, -27], [-4, -5], [-9, 6], [-6, -15], [-7, -5], [-2, -13], [-20, -10], [-2, -7], [-7, 
 8], [-20, -2], [-15, 16], [-13, 28], [-8, 9], [-6, -2], [-4, 19], [-1, 29], [14, 6], [7, 23], [-3, 44], [4, 15], [0, 38], [-1, 20], [-14, 59], [-6, 44], [-1, 40], [1, 13], [-4, 28], [-7, 22], [-1, 18], [-11, 30], [0, 30], [-4, 27], [-12, 46], [-8, 20], [5, 14], [5, -27], [5, -1], [2, 18], [-6, 9], [-7, 35], [3, 8], [6, -20], [-1, -18], [5, 2], [6, -23], [4, 43], [-3, 4], [-12, 48], [-3, 28], [-5, 14], [0, 35], [5, 30], [4, 9], [0, 25], [2, 8], [-5, 34], [4, 17], [8, 12], [3, -11], [6, -3], [7, 37], [8, 11], [14, 13], [10, 20], [4, 13], [7, 15], [6, 2], [9, 15], [4, -7], [7, 8], [6, -9], [11, 5], [11, 21], [6, 0], [13, 7], [7, 20], [4, 2], [9, -8], [7, 7], [12, 5], [20, 19], [7, 12], [9, 29], [3, 25], [8, 18], [11, 23], [1, 11], [-5, 4], [-1, 27], [1, 22], [3, 12], [5, 8], [3, 14], [6, 2], [-1, 11], [4, 7], [7, -22], [7, -37], [5, -2], [2, 13], [-2, 13], [6, 0], [-6, 24], [2, 21], [-2, 15], [5, 0], [4, -13], [6, 5], [3, -9], [5, 5], [-1, 8], [6, 9], [-6, 29], [3, 16], [6, -1], [-1, 1
 6], [7, -6], [2, 15], [4, 7], [6, -9], [1, 10], [-5, 6], [-1, 15], [3, 11], [6, 6], [10, -4], [5, 3], [-1, 9], [4, 13], [3, -2], [3, 13], [4, 3], [2, -14], [7, 15], [-2, 14], [6, 5], [5, -18], [5, 5], [9, -20], [4, -13], [11, -24], [-3, -31], [12, 27], [15, -9], [5, 2], [10, -7], [4, 11], [-4, 16], [-7, 12], [4, 23], [6, 5], [4, 36], [8, 4], [3, 13], [-3, 9], [0, 15], [5, 3], [1, 17], [6, 7], [1, 13], [6, -4], [5, 20], [9, -1], [5, -9], [11, 6], [4, -6], [5, 7], [6, -2], [5, 14], [-1, 30], [-6, 13], [-8, -6], [-4, 20], [7, 8], [8, -7], [6, -20], [7, 11], [7, -26], [12, -8], [5, 8], [4, -14], [3, 4], [4, -11], [2, 3], [9, -7], [5, 9], [2, -13], [6, -10], [10, 11], [5, 11], [3, -26], [5, 12], [4, -22], [6, 1], [3, 13], [-5, 5], [7, 18], [7, -24], [5, 4], [2, -11], [-6, -7], [-1, -14], [-5, -13], [4, -8], [-6, -19], [-4, 4], [-9, -5], [-2, -6], [-1, -20], [4, -14], [-3, -29], [-4, -5], [-10, -32], [2, -17], [22, -34], [0, -9], [14, -25], [6, 2], [11, -18], [10, -10], [4, -13], [9, -19]
 , [13, -6], [10, -9], [7, -32], [20, -25], [14, 5], [9, 13], [7, 47], [3, 7], [7, 46], [-2, 9], [3, 33], [5, 33], [-4, 38], [2, 30], [-3, 9], [1, 27], [5, 24], [-3, 19], [5, 11], [1, 17], [-6, 4], [11, 51], [4, 34], [1, 30], [5, 2], [6, 14]], [[5470, 7483], [-3, -17], [9, -26]], [[5476, 7440], [-4, -10], [2, -11], [-13, -6], [1, -13], [-6, -7], [2, -22], [-11, -13]], [[5447, 7358], [-4, -9], [-14, -9], [-11, 3], [-16, -17], [-22, 7]], [[5380, 7333], [-13, 3], [-23, 10], [-7, 16], [-1, 11], [-10, -7], [-12, 1], [-9, -16], [-15, 7]], [[5290, 7358], [-3, 9], [-7, -10], [-7, 12], [-7, 3], [-2, 15], [1, 18]], [[5265, 7405], [4, 2]], [[5269, 7407], [7, -2], [10, -15], [3, 17], [5, 1], [10, -12], [8, 1], [10, 13], [15, 1], [1, 6], [15, -1], [7, 13], [-7, 19], [19, 19], [3, 15], [5, -5], [3, 18]], [[5383, 7495], [7, -13], [11, 4], [7, -4], [6, 12], [2, 18], [7, -2], [23, -17], [10, 4], [12, -6], [2, -8]], [[6281, 6783], [-19, 10], [-3, 12], [-5, 3], [-10, 31]], [[6244, 6839], [-1, 4]], [[62
 89, 7001], [9, -3], [14, -40], [17, -6], [5, 18], [9, 8], [6, 19]], [[6349, 6997], [13, -31], [4, -25], [9, -20], [2, -11], [13, -3], [8, -16], [-13, 0], [-12, -21], [-1, -26], [-3, -6], [-3, -44], [-6, 12], [-3, -23], [0, -31]], [[6357, 6752], [-7, -3], [-6, 16], [-11, 15], [1, 9], [7, 7], [-5, 18], [6, 6], [-8, 20], [-6, 2], [-27, -37], [-10, -21]], [[6249, 6958], [7, 11], [6, -1], [14, -19], [7, 2], [8, -11], [5, 16], [-11, 17], [-3, 11], [7, 17]], [[5848, 3818], [-4, -18], [0, -15], [11, -13], [0, -17], [-9, -17], [-9, -41], [-4, -14], [-10, -13]], [[5823, 3670], [-9, 50], [1, 26], [-4, 5]], [[5811, 3751], [0, 20], [-6, 17], [0, 7]], [[5805, 3795], [4, 9], [4, -5], [1, -12], [10, 1], [6, 12], [1, 24], [6, -8], [6, 9], [5, -7]], [[5166, 7637], [10, -27], [-7, -18]], [[5169, 7592], [-3, 4], [-8, -21], [5, -17], [-3, -8]], [[5160, 7550], [-8, -3], [-2, 8], [-13, 14], [-5, 13], [-9, -3], [-7, 9], [-5, 20], [-8, 0], [-7, 13], [-6, 0], [-3, 18], [-10, -4], [-6, 9], [-1, 18]], [[5070, 
 7662], [23, 20]], [[5093, 7682], [1, -9], [11, -3], [12, 12]], [[5117, 7682], [1, 0]], [[5118, 7682], [14, 9], [12, -17], [7, 2], [11, -11], [-6, -20], [10, -8]], [[5099, 4831], [-3, -22], [7, -20], [0, -21], [3, -16], [-2, -14], [-5, -9], [2, -8], [-4, -23], [-5, -5], [0, -7], [-6, -18], [-1, -22], [-9, -5], [-1, -20], [0, -41], [-1, -23], [1, -7], [2, -55], [-2, -3], [0, -44]], [[5075, 4448], [-23, -7], [-8, -4]], [[5044, 4437], [5, 4], [-6, 29], [2, 23], [0, 72], [-1, 76], [-5, 16], [-2, 23], [-1, 29], [-15, 26], [0, 24], [4, 21]], [[5025, 4780], [7, 21], [3, -2], [4, 16], [5, -6], [11, 2], [8, 18], [3, 16]], [[5066, 4845], [2, 8], [-3, 15], [14, 13], [18, -41], [2, -9]], [[5006, 5062], [-2, -26], [6, -22], [-1, -9], [8, -32], [9, -7], [0, -37], [16, -30], [8, -3], [8, 7], [4, -17], [-5, -11], [9, -30]], [[5025, 4780], [-12, 1], [-18, 9]], [[4995, 4790], [-4, 2], [-6, -12], [-15, 2], [-47, -2], [-5, -27], [5, -25], [0, -31], [-1, -8], [3, -17]], [[4925, 4672], [-2, -7], [-11, 32]
 , [-14, 8], [-17, -15], [-2, -9], [-17, 21], [0, 8], [-4, 19], [-9, 1], [-3, 9]], [[4846, 4739], [3, 31], [-2, 15], [5, 5], [3, 21], [-3, 13], [1, 17], [3, 8], [10, 3], [7, 11], [10, 48], [-4, 22], [7, 19], [8, -3], [6, -10], [9, 6], [0, 27], [10, -1], [-1, 11], [3, 17], [10, 17], [9, -8], [3, 3], [2, 20], [7, 1], [10, 16], [9, 7], [8, 18], [14, 0], [13, -11]], [[7522, 5582], [-7, 33], [2, 13], [6, -26], [-1, -20]], [[7571, 5570], [0, -35], [-2, -10], [-5, 8], [-4, -11], [2, -18]], [[7562, 5504], [-6, 6], [-2, 20], [1, 12], [-5, 47], [-8, 33], [-3, 7], [-5, -16], [-8, 0], [-5, 14], [-7, 9], [-1, -13], [3, -29], [-8, -20], [-4, -17], [-8, 7], [-6, -11], [-8, -2], [-8, 7], [-1, 23]], [[7473, 5581], [-6, 60], [3, 15], [-7, 4], [1, 17], [-5, 13], [1, 15], [4, 5], [0, 26], [-7, 2], [-9, 13], [-4, 10], [5, 22], [3, -6], [4, 22], [13, 0], [-4, 24], [-7, 0], [-12, 29], [2, 17], [4, 4], [5, 18], [5, -2], [4, -14], [7, 11], [2, -18], [12, -12], [4, 14], [4, -16], [-1, -40], [15, -16], [13, -1
 ], [12, 4], [6, -5], [15, 4], [7, -20], [-4, -36], [-5, -2], [-6, -15], [-10, -5], [-4, -14], [-2, -21], [4, -22], [5, -9], [3, -15], [6, 9], [-1, 13], [5, 16], [-1, 11], [7, 6], [6, -32], [0, -24], [4, -19], [2, -51]], [[5793, 7134], [1, -15], [-4, -11], [-8, 2], [-8, -29], [0, -21], [-7, -11], [3, -21], [8, -21]], [[5778, 7007], [-14, -5], [-7, 13], [-20, -12], [-6, -15]], [[5731, 6988], [-8, -2], [2, -24], [-16, -3], [-7, -5], [-11, 11], [-8, 3], [-3, 9], [-7, 0], [-18, -14], [-9, 2], [-10, -4]], [[5636, 6961], [3, 27], [-5, 22], [-9, 8], [-5, 13]], [[5620, 7031], [5, 7], [-3, 12], [3, 21], [6, 1], [7, 23], [-13, 19], [-5, 24], [2, 14], [8, 17]], [[5630, 7169], [9, -10], [-3, -19], [11, 4], [24, -10], [9, 4], [24, -11], [12, 6], [10, 20], [24, 12], [10, -12], [15, -1], [2, -11], [16, -7]], [[2971, 5511], [-3, -12], [-14, -6], [-2, 8], [9, 15], [4, -7], [6, 2]], [[2840, 5724], [4, 7], [2, -26], [-1, -9], [-7, 10], [-2, 17], [4, 1]], [[2830, 5799], [10, -34], [1, -16], [-9, -13], [
 -4, 12], [-7, 12], [4, 7], [5, 32]], [[2819, 5911], [6, -8], [-10, -9], [-2, 6], [6, 11]], [[5523, 7215], [-3, -18], [8, -10], [-8, -9], [0, -17], [-6, -9], [-4, -40], [-10, 0], [1, -40], [9, -22]], [[5510, 7050], [-20, 23]], [[5490, 7073], [-2, 3]], [[5488, 7076], [0, 10], [-38, 81], [-3, 23], [-9, 23], [0, 23], [6, 4], [9, -15], [4, 13], [9, -1], [4, 8], [25, -16], [11, 6], [11, -4], [6, -16]], [[5781, 8025], [4, -7], [9, 3], [6, -11], [6, 6], [9, -5], [3, -19], [11, 10], [17, -2], [12, -28], [-3, -9], [6, -19], [-7, -17], [11, -11], [5, -29], [13, -12], [-2, -19], [10, 1], [10, -7], [0, -12], [7, -7], [-8, -18], [-9, -8], [-19, 8], [-5, -13], [8, -12], [1, -38], [6, -16]], [[5882, 7734], [-23, -2], [-12, -33], [3, -20], [-2, -7], [-11, 18], [-15, 0], [-8, -8], [-6, 18], [-21, -7], [-24, 7], [-7, -2], [-2, 11], [-9, 0], [-30, 13], [-16, 2], [-22, -5], [-11, -22], [-7, 5], [-4, -10]], [[5655, 7692], [-2, 7], [4, 28], [-14, 21], [6, 16], [13, 11], [1, 35], [-8, 33], [-3, 23]], [[565
 2, 7866], [20, 1], [5, -4], [13, 18], [6, -1], [13, 16], [5, 16], [2, 21], [10, 7], [4, 13], [8, -2], [6, 11], [-10, 5], [4, 24]], [[5738, 7991], [11, 11], [17, -2], [9, 22], [6, 3]], [[2547, 5318], [6, -11], [0, -15], [-6, -38], [2, -6], [-2, -23], [2, -16], [-2, -22], [-7, -27], [-3, 1], [-7, -22], [0, -7]], [[2530, 5132], [-9, 0], [2, 83], [0, 55]], [[2523, 5270], [3, 14], [5, -8], [7, 25], [4, 18], [5, -1]], [[3384, 2541], [0, 25], [-26, 38], [-25, -1], [-49, -25], [-5, -33], [-9, -34], [0, -35], [-11, -84]], [[3133, 2350], [-10, -5], [-9, 4], [1, 19], [-4, 37], [-3, 8], [-3, 27], [0, 21], [-6, 23], [-4, 6], [2, 18], [-5, 8], [-3, 30], [5, 3], [1, 14], [-4, 8], [6, 21], [-14, 37], [1, 6], [-5, 52], [-10, 45]], [[3069, 2732], [-4, 16], [6, 14], [11, 39]], [[3082, 2801], [5, 6], [7, 18], [-7, 2], [-4, 27], [-7, 10], [-3, 11]], [[3073, 2875], [6, 20], [-7, 20], [4, 26], [10, 28], [-3, 33], [1, 63], [6, 15], [2, 12], [-25, 111]], [[3067, 3203], [5, 1], [18, -5], [4, -7], [9, 9], [5,
  20], [11, 0], [3, 15], [7, 12], [8, 5], [12, 25], [22, 11], [7, -6], [4, 11], [4, -10], [0, -28], [-3, -17], [0, -26], [3, -13], [-3, -11], [3, -26], [6, -17], [2, -18], [6, -2], [9, -17], [2, -14], [13, -6], [3, 6], [9, -7], [3, -8], [9, 1], [7, -24], [11, -10], [8, -2], [0, -6], [8, -21], [14, 2], [12, -4], [12, -17], [2, -14], [-2, -8], [5, -38], [0, -34], [-7, -3], [8, -26], [2, -52], [1, -3], [47, -4], [3, -13], [-4, -13], [3, -42], [10, -16], [6, -4], [2, -21], [5, -25], [-6, -52], [-1, -10], [-9, -49], [7, -18], [-8, -13]], [[3651, 1991], [1, 28], [4, -2], [-5, -26]], [[3577, 3950], [2, -6], [-4, -28], [-14, -30], [-5, 2], [3, 13], [5, 13], [0, 15], [5, 18], [8, 3]], [[3608, 3981], [12, -8], [13, 7], [9, -2], [12, -6], [-3, -46], [-3, -14], [-5, -9], [0, -16], [-11, -13], [-7, 2], [-2, -10], [-7, -6], [-7, 8], [-6, -2], [-4, -7], [-11, 29], [2, 24], [-1, 31], [6, 33], [6, 7], [7, -2]], [[3586, 3968], [-4, 5], [2, 16], [5, 5], [4, -10], [-7, -16]], [[3625, 3995], [1, -13], [-
 7, -2], [2, 14], [4, 1]], [[3624, 4012], [-9, -21], [-4, -5], [-9, 5], [-1, 15], [7, 0], [12, 12], [4, -6]], [[3610, 4032], [-7, -16], [-1, 12], [8, 4]], [[3600, 4142], [2, -12], [-4, -5], [-1, 16], [3, 1]], [[3431, 4130], [13, -8], [2, 15], [-5, 21], [3, 13], [8, -9], [9, 3], [10, 11], [4, -10], [5, 0], [3, -9]], [[3483, 4157], [3, -8], [10, -7], [8, 14], [9, -4], [5, 7], [11, -12], [7, 13], [20, 96], [8, 24]], [[3564, 4280], [4, 13], [1, 16], [8, -19], [4, -21], [-1, -36], [5, -40], [6, -42], [7, -30], [8, 0], [7, -11], [1, -36], [-12, -25], [-13, -47], [-4, -1], [-8, -14], [-6, -31], [-7, -19], [-1, -21], [-6, -10], [0, -11], [-13, -7], [8, -14], [6, 3], [6, 12], [12, 14], [10, 7], [2, -23], [4, -26], [8, -13], [11, 11], [9, -6], [6, 10], [2, -9], [-2, -21], [3, -1], [3, 18], [7, 25], [5, -1], [9, 24], [4, -2], [4, 20], [1, 18], [6, 3], [3, 10], [3, -8], [12, 9], [2, -8], [11, -7], [10, -16], [10, -4], [7, -16], [5, 3], [14, -16], [6, -2], [12, -25], [3, -25], [0, -14], [-6, -22]
 , [-2, -22], [7, 4], [2, 29], [8, 11], [5, -11], [12, 1], [1, 14], [4, 0], [16, -16], [7, -14], [13, -4], [5, 6], [6, -12], [7, -2], [21, 7], [3, 3], [14, -4], [7, -13], [10, -12], [20, -35], [4, -3], [11, -32], [9, -17], [5, -15], [8, -6], [4, -16], [8, -2], [3, -8], [7, -5], [15, 5], [13, -6], [7, -25], [5, -51], [1, -3], [4, -47], [3, -19], [0, -34], [-3, -13], [3, -7], [-4, -32], [-6, -40], [-4, -20], [-11, -35], [-4, -4], [-5, -24], [-6, -13], [-5, -19], [-4, -3], [-9, -16], [-7, -30], [-4, -6], [-10, -56], [-11, -42], [-8, -21], [-5, -7], [0, 22], [-6, 7], [0, -19], [-5, -13], [2, -7], [-6, -14], [2, -22], [-2, -19], [3, -5], [-4, -48], [4, -75], [2, -9], [-5, -43], [-5, -52], [2, -37], [-3, -14], [-7, -10], [-3, -13], [-3, -24], [1, -64], [-4, -17], [-5, -8], [-9, -53], [-7, -22], [-4, -3], [-9, -49], [3, -30], [-8, -14], [-12, -10], [-8, -18], [1, -17], [-4, -13], [-29, 1], [-12, -10], [-8, 13], [-8, -9], [-8, 6], [-6, -7], [-2, -13], [-11, -20], [-9, -12], [0, -12], [-12, 5
 ], [-6, -5], [-5, -12], [-4, -1], [-16, -21], [-2, -9], [-22, -34], [-3, -22], [-4, -9], [-8, 4], [-4, -17], [2, -8], [-5, -30], [1, -9], [-6, -10], [5, -10], [-2, -20], [3, -21], [-2, -46], [3, -15], [-3, -25], [-5, -19], [2, -5], [-16, -27], [-13, -38], [-7, -26], [-7, -47], [-11, -42], [-12, -31], [-3, 1], [3, 29], [4, -1], [2, 13], [5, 7], [6, 34], [-10, 1], [-10, 9], [1, -15], [-5, -19], [-1, -30], [-6, -12], [-8, -5], [-2, -17], [-5, -13], [-2, -23], [4, -9], [-7, -23], [-7, -44], [-6, -15], [-15, -31]], [[3517, 1565], [-4, 13]], [[3513, 1578], [2, 3], [1, 26], [5, 7], [3, 19], [7, -9], [4, 5], [4, 20], [-4, 18], [-12, -24]], [[3523, 1643], [-7, 7], [-7, 16], [-3, 21], [-10, 10], [-9, 17], [-4, 15], [-6, 2], [-6, 12], [-6, 3], [-10, 27], [-7, -16], [-4, 0], [0, 20], [-23, 50], [-7, 0], [-4, -13], [-9, 1], [-2, 6]], [[3483, 2152], [0, 11]], [[3483, 2163], [6, 10], [0, 27], [3, 14], [1, 30], [-1, 17]], [[3492, 2261], [-10, 19], [-9, -12], [-12, -1], [-4, 27], [0, 27], [-3, 16], 
 [0, 27], [-6, 22], [-9, 3], [-7, 15], [-11, -16], [-11, 8], [-17, 3], [-4, 8], [2, 25], [-1, 17], [3, 23], [0, 28], [-4, 8], [0, 14], [-5, 19]], [[3067, 3203], [-11, 3], [-9, -11], [-7, 9], [-3, -5], [1, 83], [2, 9], [-4, 15], [-14, -30], [-5, -5], [-23, 0], [-3, 34], [-14, 9], [-11, 0], [7, 23], [-6, 27], [-10, 25], [-4, 25], [-3, 5], [2, 12], [-8, 17], [3, 12], [5, 5], [-3, 15], [2, 14], [17, 34], [-3, 25], [7, 27], [3, 31], [-1, 10], [8, 8], [16, 30], [8, 9], [11, 2], [2, 5], [9, 0], [6, 17], [13, -2], [6, -11], [3, 7]], [[3056, 3686], [6, 72], [10, 147], [-6, 33], [-1, 16], [-8, 14], [-4, 13], [1, 51], [12, 5], [3, 6], [4, -7], [6, 1], [-4, 28], [-16, 1], [0, 47], [8, 4], [6, -3], [26, 0], [6, 20], [6, -18], [6, 4], [5, 18], [7, 2], [6, -27], [2, -39], [5, 4]], [[3142, 4078], [13, -30], [7, -5], [11, 17], [5, 0], [4, -20], [3, 16], [3, 1], [2, 14], [9, 11], [3, -2], [9, 19], [3, -5], [6, 15], [2, 22], [6, 2], [10, 12], [1, 19], [-18, 4], [1, 17], [-6, 30], [0, 34], [-9, 18], [-1
 , 19], [6, 3], [6, -5], [2, -13], [18, 4], [4, -3], [10, -26], [5, 7], [-1, 26], [6, 1], [5, 10], [5, -6], [13, 12], [4, 0], [3, 12], [13, 7], [3, 13], [8, 14], [-4, 22]], [[3312, 4364], [8, -2], [7, 7], [6, -13], [-1, -26], [-3, -15], [13, -10], [-1, -15], [5, -17], [-4, -17], [-4, -6], [0, -18], [-4, -21], [-1, -27], [3, -24], [4, -7], [0, -25], [14, -39], [10, -11], [10, 3], [0, 13], [5, 11], [9, -6], [1, 10], [12, 4], [6, 19], [6, 3], [9, -10], [9, 5]], [[8198, 4343], [3, -20], [2, -23], [-6, 5], [-3, 32]], [[8194, 4337], [4, 6]], [[8166, 4321], [7, -1], [8, 8], [11, 22], [1, -8]], [[8193, 4342], [-6, -11], [2, -23], [-2, -21], [-5, -8], [-4, 17], [-4, 1], [-1, 15], [-7, 9]], [[7545, 5985], [-1, -15], [4, -10], [6, 4], [3, -12], [-2, -10], [2, -16], [-10, -10], [-9, 5], [-5, -5], [-17, -1], [-6, 8], [-8, -11], [-8, -3], [-13, 11], [-7, -2], [-10, 23], [4, 12]], [[7468, 5953], [5, 21], [14, 38], [8, 12], [11, 4], [10, -9], [2, -10], [12, -9], [5, 9], [10, -13], [0, -11]], [[5701,
  2711], [-1, -9], [8, -34], [7, -17], [5, -21], [0, -14], [5, -27], [17, -31], [13, -13], [2, -28], [12, -1], [-1, -41], [6, -17], [4, -18], [17, -6], [11, -10], [1, -18], [8, -10]], [[5815, 2396], [-9, -3], [-3, -16], [-11, -10], [-5, 0], [-12, -27], [-5, -19], [-11, -12], [-9, -18], [-5, -43], [-9, -15], [-3, -13], [-15, -8], [0, -10], [-8, -53], [-5, -9], [-10, 1], [-7, -7], [-24, 14], [-13, 25], [-12, -2], [-5, -12], [-3, -36], [-5, -16], [-8, -10], [-6, -20], [-8, -4], [-2, -13], [-16, 0], [-7, 4], [-5, -6], [-2, 14], [0, 19], [6, 21], [-1, 17], [-6, 36], [-6, 26], [-11, 20]], [[5554, 2211], [0, 112], [0, 86], [28, 0], [0, 90], [0, 72], [0, 103], [14, 1], [42, 20], [9, 1], [5, -16], [3, -18], [16, 33], [7, 5], [2, -8], [13, 19], [8, 0]], [[5634, 4775], [4, -17], [8, -18], [10, -38], [1, -15], [-2, -11], [1, -19], [-6, -19], [5, -20], [16, -3]], [[5671, 4615], [2, -9], [-3, -16], [19, -13], [7, -20], [4, -2], [2, -14], [-4, -6], [6, -18], [18, -24], [2, -11], [8, -14], [-2, -19]
 , [6, -13], [0, -12], [17, -19], [4, -16], [1, -25], [4, -9]], [[5762, 4355], [-9, 9], [-7, -12], [-11, 2], [-10, 14], [-8, -4], [-7, 12], [-5, -2], [-3, -22], [-18, -8], [-4, 13], [-15, -21], [-11, -6], [-5, -10], [-6, 11], [-7, 6], [-10, -42], [-4, -8], [-6, 1], [-13, 11], [-5, -4], [-9, 4], [-10, 11], [-7, -3], [-4, 9], [-4, 17], [-17, 26], [-8, 0], [-9, -16], [-11, -38], [-5, -5], [3, -24], [-1, -19], [1, -17]], [[5517, 4240], [-4, 11], [-18, -6], [-1, 5], [-10, 7], [-3, -7], [-10, -6], [-9, 0], [-2, -5], [-3, -45], [-8, -43]], [[5449, 4151], [-3, 33], [0, 12], [-4, 17], [-4, 1], [-17, 46], [-4, 20], [2, 6], [-3, 21], [-8, 15], [-3, 57], [1, 24], [-1, 13], [-6, 7], [4, 12], [5, 5], [6, 32], [3, 6], [5, 33], [7, 20]], [[5429, 4531], [9, -5], [16, 16], [5, 14], [6, -23], [10, 10], [4, 9], [12, 12], [25, 5], [15, 45], [-7, 13], [6, 11], [7, -1], [15, 3], [5, 7], [10, 0], [2, 9], [9, 11], [5, 23], [7, 18], [2, -2], [12, 32], [-1, 17], [12, 13], [8, 13], [11, -6]], [[2699, 7292], [2,
  -7], [13, 10], [4, -9], [5, 9], [7, -6], [3, -11], [-7, -16], [-23, 19], [-15, 7], [2, 6], [9, -2]], [[3319, 7368], [5, -9], [-3, -43], [15, -7], [1, -18], [-15, -21], [-9, -5], [-17, 0], [-6, 34], [13, 30], [6, 24], [7, 17], [3, -2]], [[3221, 7355], [6, -15], [17, -13], [31, 4], [-8, -13], [-5, -24], [-8, 0], [-4, 15], [-7, -3], [-11, 6], [-13, 23], [-9, 10], [5, 16], [6, -6]], [[2924, 7224], [19, 17], [10, 14], [3, -1], [4, 24], [8, 22], [11, 9], [15, 25], [10, 10], [4, -3], [11, 9], [21, 19], [14, 33], [28, 54], [23, 30], [44, 34], [11, 6], [18, 5], [17, -4], [12, -8], [9, -17], [1, -17], [-4, -15], [-11, -7], [-2, -9], [-14, -13], [-18, 13], [-11, -14], [14, -7], [6, -17], [16, 13], [6, -13], [-4, -23], [-7, -18], [11, -1], [-2, -14], [5, -15], [0, -15], [6, -17], [15, -4], [4, -21], [9, 0], [6, -12], [15, 3], [7, -11], [16, 20], [0, -13], [8, -7], [4, 5], [6, -17], [8, -9], [-3, -7], [-20, -9], [-7, -9], [-34, -25], [-7, -2], [-5, -10], [-9, 8], [-7, -1], [-2, -19], [-13, -33]
 , [-23, -24], [-3, 12], [-10, 6], [-2, 26], [4, 24], [9, 20], [24, 30], [14, 13], [7, -7], [8, 12], [-21, 2], [-3, -6], [-6, 7], [13, 20], [-4, 11], [-6, -18], [-15, -11], [-16, -18], [-6, 2], [-9, -11], [-17, 0], [-3, 7]], [[3134, 7237], [-9, 7], [1, 24]], [[3126, 7268], [-10, 11]], [[3116, 7279], [1, 14], [-1, 77], [-11, 22], [-19, -11], [-5, 18], [-5, 0], [-21, -52], [-2, -21], [-6, -25], [-3, -24], [-8, -12], [-4, -19], [-15, -5], [-4, -16], [-52, -1], [-37, 0]], [[3218, 7580], [21, -9], [24, -16], [9, -14], [9, -4], [5, -18], [-15, -3], [-24, 12], [-14, 12], [-9, 20], [-14, 10], [-1, 7], [9, 3]], [[1448, 7646], [19, -18], [20, -10], [10, -2], [19, -10], [7, -28], [8, -14], [3, -19], [23, -17], [3, -16], [12, -28], [-4, -22], [-31, 19], [-15, 16], [6, 11], [-18, 1], [-5, 21], [-6, 1], [-1, 13], [-14, -3], [-2, 35], [-13, -3], [-10, 20], [-8, 7], [-16, 27], [-2, 12], [15, 7]], [[3447, 7700], [0, -9], [14, 6], [-6, -18], [-10, 1], [-1, -9], [8, -2], [-3, -19], [-17, -40], [-8, -25
 ], [0, -24], [16, 34], [16, -19], [-9, -13], [3, -15], [8, -3], [10, 6], [-2, -20], [13, 4], [6, 15], [8, -11], [6, 7], [16, -17], [-12, -29], [5, -22], [13, 0], [1, -13], [-20, -19], [8, -6], [-6, -21], [5, -11], [11, 33], [6, -6], [-6, -22], [4, -14], [12, 23], [2, -17], [-5, -15], [-4, -37], [-7, -11], [-5, 7], [-5, -9], [-3, 38], [-11, -24], [-4, 6], [9, 36], [-4, 30], [-3, 2], [-11, -33], [-9, 0], [-7, -13], [-4, -20], [-14, -5], [-6, 4], [3, 12], [10, 5], [6, 9], [4, 23], [-8, 7], [0, -15], [-21, 11], [-14, 0], [-2, -7], [-36, 12], [-29, -10], [-6, 4], [-2, 19], [25, 42], [-9, 7], [17, 63], [16, 52], [4, 19], [14, 33], [7, 31], [23, 22]], [[2738, 7815], [8, -1], [10, -19], [3, -15], [-10, 1], [-29, 20], [5, 11], [13, 3]], [[1339, 7817], [-1, -14], [6, -10], [-7, -5], [4, -16], [13, -13], [6, -20], [-6, -3], [-11, 25], [-7, 8], [-16, 32], [-2, 9], [5, -1], [8, 2], [8, 6]], [[1427, 7810], [3, -22], [-3, -17], [-12, 9], [-4, 21], [3, 20], [13, -11]], [[1382, 7840], [10, -12], [-2
 , -17], [-16, 28], [8, 1]], [[1395, 7847], [12, -22], [-6, -11], [-11, 30], [-9, 15], [2, 6], [12, -18]], [[1381, 7872], [-2, -12], [-9, 10], [7, 8], [4, -6]], [[1305, 7883], [20, -4], [16, -11], [-4, -13], [-4, -38], [-6, -1], [-2, -5], [-5, -1], [-3, 6], [-4, 2], [2, 14], [-9, 7], [0, 15], [-5, 9], [4, 20]], [[2801, 8062], [3, -22], [-12, -34], [-15, 1], [15, 28], [9, 27]], [[3109, 8344], [7, -8], [-4, -13], [-13, -2], [5, 23], [5, 0]], [[3200, 8419], [-2, -21], [-17, 19], [12, 7], [7, -5]], [[2793, 8473], [5, -17], [-14, -40], [-12, 14], [0, 26], [10, 19], [11, -2]], [[3033, 8506], [17, -18], [-5, -4], [-13, 7], [1, 15]], [[2719, 8515], [7, -3], [-3, -16], [-22, -28], [-11, -10], [-4, 6], [-11, -8], [-6, 25], [17, 32], [5, -6], [10, 6], [18, 2]], [[2822, 8553], [21, -6], [2, -16], [-10, -7], [-17, 22], [4, 7]], [[2857, 8566], [12, -8], [0, -14], [-20, 16], [8, 6]], [[2625, 8719], [8, 1], [3, -26], [14, 3], [14, -21], [19, -5], [5, -13], [14, -12], [10, -1], [16, -19], [4, -28], [
 31, -11], [2, -17], [-16, -20], [-29, 17], [-13, 21], [-14, -2], [2, 12], [-16, -1], [-3, -24], [-17, -10], [-9, -23], [-19, -13], [-10, 8], [0, 31], [-29, -1], [-14, -5], [8, 24], [19, 13], [-6, 35], [7, 25], [0, 25], [4, 27], [15, 10]], [[2657, 8742], [18, -14], [-13, -12], [-5, 26]], [[2936, 8883], [24, -8], [1, -14], [-28, 0], [-10, 21], [13, 1]], [[2601, 8872], [-13, -10], [-5, 20], [9, 17], [8, -7], [1, -20]], [[2900, 8900], [13, -6], [2, -49], [-9, -14], [-14, -7], [-33, 1], [-7, 31], [17, 40], [11, 5], [20, -1]], [[2173, 8934], [-3, -16], [-12, 7], [15, 9]], [[2820, 8977], [7, -6], [-17, -28], [-16, 1], [26, 33]], [[2859, 8979], [11, -8], [-14, -14], [-6, 11], [9, 11]], [[2342, 8993], [7, -16], [-16, -2], [9, 18]], [[2834, 8998], [-15, -14], [-5, 5], [14, 14], [6, -5]], [[2294, 8992], [24, -12], [14, -15], [6, -36], [-19, -20], [-27, 6], [-8, 9], [-39, 13], [-12, 13], [34, 22], [-6, 9], [10, 25], [9, 7], [16, -13], [-2, -8]], [[2924, 7224], [-15, -10], [-15, -26]], [[2894, 7
 188], [-4, -7], [-25, -17], [-7, -21], [-14, 12], [-41, -15], [-11, -13], [-8, -23], [2, -6], [10, -4], [8, 6]], [[2804, 7100], [-1, -12]], [[2803, 7088], [4, -12], [-7, -4], [-15, -1], [-14, -7], [-8, -14], [-11, 6], [-12, -1], [-12, -17], [-3, -12], [-5, 1], [-13, -19], [-11, 0], [-5, 6], [1, 16], [18, 3], [-6, 16]], [[2704, 7049], [4, 6], [2, 27]], [[2710, 7082], [8, 5], [11, 21], [0, 50], [4, 18], [9, 20], [0, 15], [-9, 26], [8, 5], [2, -18], [10, -18], [21, -20], [4, 16], [-4, 9], [8, 9], [-7, 11], [-1, 23], [-5, -4], [-3, 16], [-9, 25], [-12, 0], [-15, 13], [-12, 1], [-7, 5], [-16, -1], [-32, 12]], [[2663, 7321], [0, 13], [-10, -5]], [[2653, 7329], [1, 35], [-9, 3], [5, 23], [-12, 21], [5, 23], [-2, 4], [-14, -4], [-12, 5], [-6, 12], [-6, 31], [-4, 13], [-8, 3], [-16, -3], [-23, 17], [-6, -22], [-4, 11], [-9, -20], [-11, -9], [-2, -17], [-9, -16]], [[2511, 7439], [-11, 1], [-5, 8], [-17, -1], [-4, 9], [-14, -14], [-7, 5], [-10, 17], [-9, -8], [-8, 22], [-17, 7], [-14, -8], [-3
 , 8], [-10, 2], [-13, 11], [-3, 35], [-10, 5], [0, -27], [-43, 0], [-49, 0], [-67, 0], [-43, 0], [-54, 0], [-49, 0], [-31, 0], [-55, 0], [-67, 0], [-55, 0], [-43, 0], [-55, 0], [-73, 0], [-49, 0], [-33, 0]], [[1590, 7511], [-8, 0], [-1, 0], [-4, 10], [-1, 34], [-8, -15], [-12, 9], [-2, 8], [3, 14], [-13, -4], [-9, 13], [4, 20], [-22, 19], [-9, -4], [-15, 4], [2, 26], [-9, -3], [-10, 9], [-5, -9], [-14, 14], [-7, 16], [5, 18], [-7, 14], [0, 17], [19, 28], [-1, 11], [-16, -14], [-15, 9], [6, 26], [-9, 5], [-3, 23], [-9, 12], [-2, 13], [-8, 10], [-3, -16], [-21, 39], [1, 15], [-11, 14], [2, 23], [5, 4], [4, 20], [-3, 6], [6, 13], [-5, 34], [3, 12]], [[1388, 8008], [-2, 14], [-28, 22], [-13, 13], [-6, 0], [-2, 15], [-7, 4], [2, 12], [-14, 34], [-23, 65], [-14, 24], [-10, 8], [-4, 15], [-20, 26], [2, 9], [-13, 18], [-21, -12], [-6, -12], [-4, -22], [-6, 0], [-16, -17], [-6, 23], [-27, 37], [-3, 10], [-13, 13], [2, 20], [-15, -1], [-10, -10], [-12, 7], [-3, -5], [-13, 7], [0, 94], [0, 126
 ], [0, 84], [0, 73], [0, 95], [0, 115], [0, 84]], [[1083, 8996], [30, -3], [22, -7], [14, -17], [40, -24], [31, -4], [9, 12], [-2, 18], [19, 12], [14, 0], [11, 15], [17, -20], [12, 1], [9, 17], [9, -2], [20, 10], [12, 14], [9, -5], [12, 18], [29, -11], [-41, -26], [-25, -7], [-4, -12], [-18, -8], [11, -7], [16, 12], [-3, 6], [18, 7], [10, -8], [15, 22], [21, 9], [21, -5], [15, 17], [10, 30], [14, 0], [8, -11], [12, -35], [22, -25], [14, -7], [7, 10], [-7, 10], [9, 11], [5, 21], [14, 8], [-2, -31], [8, -7], [-7, -19], [21, 0], [14, 9], [7, 25], [42, -5], [32, -26], [45, -13], [17, -14], [51, -14], [17, 10], [30, -19], [17, -22], [-3, -11], [-23, 1], [-10, -9], [2, -24], [35, -8], [40, -1], [3, 5], [35, 1], [26, 18], [11, -21], [18, 0], [8, -25], [9, 4], [13, -11], [-4, -30], [12, -7], [13, 23], [-13, 22], [3, 8], [-11, 14], [1, 11], [15, 14], [26, 15], [6, 10], [14, 2], [-3, 16], [-18, -8], [-4, -13], [-13, -5], [-20, 4], [0, -11], [-27, 7], [15, 25], [15, 1], [41, 19], [14, -3], [12
 , -37], [20, -8], [3, -15], [32, -1], [29, -21], [37, 2], [7, 7], [36, -4], [5, -6], [25, 7], [22, -15], [12, 13], [-16, 18], [-13, -11], [-8, 17], [12, 28], [21, -2], [24, -22], [11, 6], [-5, -44], [-8, -9], [10, -9], [26, -7], [-8, 25], [-6, 5], [6, 26], [17, -3], [18, 25], [18, 14], [-2, 28], [-8, 2], [-5, -16], [-15, -1], [8, 20], [3, 22], [-9, 22], [-9, -5], [-24, 16], [-20, 22], [-2, 15], [14, 21], [-16, 16], [5, 34], [26, 14], [-11, 8], [16, 8], [3, 17], [18, 4], [2, -13], [21, -4], [-2, -8], [23, -22], [2, -32], [8, -16], [11, -5], [6, -24], [14, -9], [-21, -20], [0, -15], [13, -11], [10, 11], [9, -11], [19, -2], [-17, -19], [16, -24], [-4, -32], [12, -9], [9, 15], [5, 37], [9, 15], [11, -1], [26, -31], [6, -34], [-16, -22], [3, -18], [29, -40], [19, 16], [0, 17], [18, 27], [6, 48], [12, 0], [3, 16], [10, 10], [-15, 5], [-5, 12], [-1, 32], [33, 7], [16, -11], [30, -2], [13, -21], [-1, -11], [14, 2], [12, -9], [-12, -14], [14, -12], [-1, -10], [-30, -20], [0, -13], [9, -4], [
 -2, -16], [24, -32], [-8, -33], [-12, -2], [-19, -29], [-10, -1], [-19, -25], [-21, 12], [-4, -11], [-19, 5], [-4, 20], [-28, -4], [-10, -6], [5, -8], [21, -11], [-16, -19], [-1, -12], [-26, -29], [-15, 0], [-49, 44], [-7, -11], [13, -12], [12, -21], [56, -7], [3, -6], [-19, -42], [-5, -3], [-7, -24], [-19, -15], [-11, -1], [-12, 8], [-17, -30], [-22, -6], [9, -36], [-22, -21], [-18, 6], [-5, -22], [-13, -7], [-6, -25], [-8, -12], [-10, -1], [5, -15], [-16, -19], [4, -9], [-14, -34], [-13, -66], [3, -45], [-3, -22], [11, -21], [19, 5], [16, -3], [1, -16], [9, -32], [4, -26], [6, -26], [-3, -18], [9, -6], [33, 17], [12, -2], [22, -18], [26, -9], [16, -23], [9, -7], [11, -28], [17, -8], [19, -15], [16, -9], [18, -22], [12, -4], [19, 6], [31, -13], [10, 0], [7, -22], [-6, -44], [8, -30], [-2, -15], [3, -23], [-5, -22], [20, -37], [5, -24], [11, -9], [11, -21], [6, -26], [18, -16], [1, 19], [10, 20], [13, -19], [2, 15], [-7, 11], [13, 25], [2, 18], [-13, 48], [2, 12], [-1, 26], [-4, 26]
 , [3, 7], [-14, 21], [-3, 23], [3, 9], [14, 7], [16, 13], [17, 17], [15, 23], [16, 35], [3, 16], [2, 35], [-3, 35], [-6, 29], [-7, 21], [-15, 22], [-12, 8], [-10, 18], [-4, 19], [20, 28], [-2, 14], [10, 19], [7, 4], [-5, 30], [-8, 15], [-2, 15], [6, 9], [-16, 7], [10, 16], [1, 27], [5, 11], [-9, 6], [-4, 14], [-2, 29], [18, 21], [51, -21], [9, 2], [15, -10], [31, 21], [17, -21], [12, -5], [1, -12], [10, -5], [19, -22], [-8, -11], [13, -19], [21, -9], [14, 2], [2, -15], [11, 3], [-5, -26], [6, -31], [-8, -7], [9, -10], [2, -13], [-7, -14], [6, -21], [2, -21], [-9, 1], [0, -16], [15, 15], [13, 2], [12, -10], [1, -14], [12, -7], [9, -19], [25, 22], [8, 23], [7, -6], [15, 19], [-4, 9], [8, 15], [-3, 26], [10, 7], [9, 38], [12, -7], [-2, -11], [10, -9], [0, -22], [11, -12], [10, -29], [13, -21], [9, -22], [-2, -17], [17, -27], [5, -20], [-8, -11], [10, -6], [-4, -12], [13, -4], [3, -10], [-7, -9], [-10, -28], [7, -13], [11, -7], [1, -14], [10, -12], [17, -8], [-1, -26], [-4, -9], [13, -4
 ], [7, 9], [7, -19], [8, 10], [19, -32], [10, 2], [21, -10], [1, -11], [-8, -9], [-14, -1], [-11, -22], [-24, -16], [-9, 1], [-9, -7], [2, -19], [15, 5], [18, 28], [17, 8], [6, 13], [18, -7], [7, -29], [-9, -8], [5, -10], [8, 17], [14, 5], [4, -15], [8, 0], [8, -32], [-6, -8], [4, -14], [-6, -6], [1, -17], [7, -1], [-2, -14], [4, -14], [-7, -13], [-20, -20], [-9, -16], [-8, 6], [-12, -3], [-15, -14], [-6, 3], [-14, -22], [0, -13], [-9, -8], [-15, -28], [-22, -8], [-19, -1], [-12, -7], [-4, 9], [-32, 6], [-12, -7], [-7, 6], [-15, -2], [-6, 4], [-12, -4], [-10, 4], [-39, -14], [-13, -22], [-3, -26], [-4, -9], [-19, -3], [-15, -18], [-13, -21], [-10, -33], [-8, -13], [-6, -25], [-15, -24], [-7, -23], [-6, -7], [-11, -20], [-10, -5], [-5, 2], [-10, -10], [-10, -18], [-11, -7], [-14, -35], [-7, -3], [-8, -14], [2, -9], [-15, -15], [-6, -11]], [[1828, 9258], [6, -13], [-1, -23], [28, 15], [49, -21], [-9, -24], [13, 2], [10, 11], [19, -9], [7, 21], [-11, 3], [3, 16], [40, -31], [-1, -15], 
 [14, -29], [-3, -11], [17, -7], [11, 15], [-9, 7], [-19, 81], [7, 16], [24, -12], [8, 9], [29, -22], [13, -16], [9, -48], [20, -47], [-9, -25], [31, -37], [19, -6], [37, -29], [13, 6], [5, -28], [-3, -10], [-20, 1], [-10, 12], [-15, -8], [2, -13], [13, -5], [8, -21], [-1, -14], [-20, -10], [-23, -5], [-35, 5], [-9, 13], [-41, 10], [2, 16], [-7, 7], [-21, -34], [-33, -6], [-12, -15], [-18, -7], [-28, -2], [-10, -5], [-45, -2], [-21, 5], [-8, 15], [2, 29], [-23, 7], [-22, -4], [-22, 4], [-18, 12], [0, 8], [-17, 14], [-5, 16], [13, 10], [26, 7], [51, 6], [44, -8], [13, 21], [-52, 16], [-44, -10], [-18, 5], [-37, -3], [-17, 17], [-6, 13], [69, 27], [2, 11], [-47, -13], [-9, 20], [-33, -1], [0, 22], [10, 15], [15, 6], [-12, 14], [34, 35], [77, 34], [11, -6]], [[2094, 9259], [-20, -29], [-33, 36], [-15, 5], [13, 16], [39, 4], [19, -14], [-3, -18]], [[2768, 9291], [25, -9], [36, 2], [26, -11], [16, -25], [11, -5], [-2, -20], [-52, 6], [-28, -10], [-21, 6], [-6, 28], [-17, 3], [-2, 34], [14
 , 1]], [[2595, 9298], [41, -3], [4, -11], [-30, -26], [-19, -35], [1, -12], [12, -18], [-6, -14], [9, -29], [18, -20], [15, -7], [-13, -16], [16, -3], [9, 23], [-5, 15], [-16, -1], [-8, 17], [6, 36], [-10, 16], [1, 19], [15, 30], [64, 30], [36, -1], [11, -34], [14, -6], [0, -17], [11, -14], [-9, -7], [14, -17], [21, 0], [15, -10], [9, 24], [23, 12], [20, -1], [6, -8], [41, -10], [4, -26], [23, -4], [-2, -25], [19, 0], [-1, -21], [17, -12], [16, 27], [24, -9], [13, -18], [-9, -14], [-17, 1], [-8, -15], [11, -6], [18, 6], [14, 17], [8, -13], [60, -25], [-4, -16], [-15, -14], [10, -14], [13, 11], [4, 14], [23, -26], [3, -17], [-25, 4], [-16, -14], [17, -9], [21, 0], [16, -20], [-28, 0], [-13, -25], [0, -21], [13, 2], [22, -11], [1, -21], [15, 0], [2, -9], [29, -2], [4, 6], [27, -32], [2, -24], [28, -4], [-7, -18], [42, -2], [13, -24], [-9, -4], [3, -13], [-18, -16], [5, -9], [-13, -3], [-6, -28], [-19, 0], [-6, -14], [4, -24], [-4, -7], [-28, 10], [-17, 23], [-10, 24], [3, 16], [-14, -
 2], [-2, 11], [-16, 10], [-7, 20], [-6, 1], [-8, -31], [1, -13], [-15, -4], [-7, 10], [-7, -7], [12, -19], [17, 0], [17, -49], [30, -15], [-3, -19], [17, -5], [-6, -14], [10, -15], [0, -17], [12, -10], [0, -23], [-8, -14], [-4, -36], [-7, -4], [-6, 18], [-14, 11], [-14, 2], [-21, 20], [-15, 25], [-11, -3], [-17, 12], [-3, -8], [19, -35], [14, -4], [14, -20], [4, -12], [10, -3], [5, -12], [14, -18], [-5, -11], [5, -11], [-9, -2], [-30, 20], [-34, 8], [-13, 9], [-15, 20], [-1, 10], [-17, -3], [-17, 10], [-24, 20], [-1, 15], [9, 8], [-3, 15], [-9, 4], [-13, -6], [-17, 28], [1, 7], [-16, 18], [0, 15], [-15, -7], [-3, 11], [-17, -21], [-24, 14], [-8, -14], [-12, -7], [-23, 1], [-24, 9], [-5, 12], [6, 33], [18, 11], [0, 14], [18, 1], [25, -14], [15, 3], [3, 10], [17, -4], [13, 14], [8, -1], [1, 18], [-8, 6], [-13, 21], [28, 29], [13, 16], [5, 19], [13, 6], [-7, 48], [-9, 8], [-2, 24], [-18, 4], [-51, 52], [-3, -9], [-29, -15], [0, 24], [28, 5], [-2, 14], [-19, 9], [-14, 30], [-22, 0], [0,
  26], [-20, 2], [-14, -23], [-22, -3], [-6, 9], [-32, 9], [-30, -23], [-25, 16], [-18, -4], [-46, 6], [-12, -3], [-14, 9], [-21, 25], [-23, -16], [-8, 11], [-15, 5], [-21, 32], [22, 10], [9, -6], [29, 3], [-22, 15], [-48, 8], [-5, 9], [5, 22], [-8, 11], [9, 15], [-5, 10], [6, 25], [12, 20], [0, 12], [17, 27], [26, 21], [33, 10]], [[2227, 9301], [17, -12], [44, 12], [19, -12], [-14, -14], [8, -6], [-33, -30], [30, -5], [6, -18], [17, -5], [4, -16], [-12, -9], [7, -12], [-2, -21], [-25, -16], [-15, 3], [-6, -18], [-14, -10], [-15, 6], [-17, 36], [-22, 24], [-16, 11], [-13, -4], [-8, 15], [-18, 12], [-4, 11], [8, 16], [20, -1], [13, -22], [24, 1], [11, 15], [-14, 21], [-28, 16], [18, 13], [0, 14], [30, 5]], [[2287, 9313], [-13, -14], [-23, -5], [-13, 8], [19, 9], [30, 2]], [[2423, 9314], [18, -6], [31, 1], [22, -8], [-33, -49], [-13, -27], [-14, -10], [-29, 6], [-13, -6], [12, -17], [-18, -29], [-29, -7], [0, 36], [-13, 17], [-2, 74], [12, 2], [0, 18], [24, 9], [31, 3], [14, -7]], [[16
 23, 9348], [47, -23], [28, -4], [22, 7], [34, -14], [42, -43], [-106, -61], [-5, -21], [-24, -9], [-7, -18], [2, -19], [-7, -15], [-22, -8], [-8, 6], [-12, -15], [-27, -12], [-26, 44], [-33, 17], [-15, 1], [1, 14], [19, 30], [3, 21], [13, 5], [-10, 12], [30, 48], [-11, 6], [-17, 36], [60, 8], [29, 7]], [[2118, 9401], [4, -8], [-17, -12], [-19, 8], [6, 16], [15, 6], [11, -10]], [[2378, 9423], [25, -24], [2, -27], [-5, -17], [-31, -1], [-17, 12], [-30, 9], [-2, 19], [15, 6], [4, 16], [25, 10], [14, -3]], [[2325, 9427], [11, -7], [-30, -12], [-2, 8], [21, 11]], [[1732, 9461], [5, -3], [-13, -25], [-19, -17], [-22, 7], [22, 23], [27, 15]], [[2149, 9471], [-6, -13], [-42, -1], [1, 10], [47, 4]], [[2113, 9497], [24, -12], [-8, -9], [-29, -1], [-7, 20], [20, 2]], [[2266, 9500], [21, -13], [2, -45], [-10, -8], [6, -13], [-8, -39], [-45, -4], [-19, 3], [-7, 30], [15, 2], [4, 16], [-76, -13], [-2, 13], [12, 14], [19, 3], [-14, 22], [1, 14], [18, 1], [8, -14], [18, -10], [11, 13], [-25, 16], [
 20, 11], [51, 1]], [[2508, 9489], [-10, -2], [-14, 16], [16, 9], [8, -23]], [[1981, 9511], [2, -30], [15, -9], [-11, -13], [39, -15], [12, 12], [24, -5], [10, -24], [-17, -43], [-28, -9], [-23, 6], [-16, -7], [-11, 11], [-21, -15], [-58, -26], [-38, -7], [-18, 3], [-21, 17], [46, 22], [34, 2], [-3, 10], [-112, -13], [-50, 16], [8, 21], [32, 0], [-2, 7], [-30, -1], [19, 42], [21, 6], [7, 16], [36, 1], [7, -20], [27, 6], [18, -18], [25, -13], [6, -23], [20, 3], [45, -6], [2, 15], [-34, 14], [20, 15], [-29, 14], [32, 38], [15, 0]], [[2354, 9525], [31, -9], [12, 2], [17, -21], [46, 5], [24, -10], [-2, -7], [37, -12], [-2, -8], [-22, -8], [27, -20], [-2, -11], [19, 1], [11, -12], [23, 9], [16, -10], [41, 7], [39, 18], [23, -6], [21, 8], [34, -5], [44, -28], [-2, -27], [5, -10], [-23, -8], [2, -10], [-32, -4], [-13, -8], [-48, 9], [-21, -5], [-94, -4], [-24, 3], [3, 19], [-29, -15], [-57, 6], [-14, 10], [-13, 31], [13, 28], [-5, 21], [-12, 9], [-14, 25], [-26, -7], [-22, 0], [-27, 10], [-
 29, 38], [30, 10], [15, -4]], [[1774, 9558], [19, -9], [-22, -11], [10, -36], [-33, -12], [4, -13], [-12, -6], [-26, 22], [-19, -6], [11, -10], [-36, -35], [-30, 11], [-46, -1], [-6, 17], [12, 12], [23, 2], [28, 23], [35, 38], [13, 6], [55, -3], [-2, 11], [22, 0]], [[2491, 9569], [17, -12], [-11, -19], [-31, 15], [1, 15], [24, 1]], [[2083, 9554], [16, -8], [-1, -11], [-21, 1], [-24, 41], [16, -1], [14, -22]], [[2350, 9580], [50, 0], [11, -4], [-9, -19], [-69, 1], [-6, 16], [23, 6]], [[2196, 9577], [-42, -1], [1, 12], [21, 0], [20, -11]], [[1824, 9597], [20, -15], [-15, -7], [-27, 18], [22, 4]], [[1955, 9601], [-14, -21], [-3, -20], [-52, -13], [-31, 15], [-1, 27], [70, 14], [31, -2]], [[1933, 9650], [25, -12], [5, -17], [-14, -4], [-54, -2], [-11, 8], [10, 12], [39, 15]], [[2308, 9646], [58, -24], [-15, -9], [8, -19], [-57, -12], [4, 8], [-21, 9], [24, 6], [-33, 13], [-10, 13], [7, 23], [35, -8]], [[2120, 9692], [29, -17], [27, -2], [58, -34], [-8, -12], [23, -26], [0, -13], [-25, -
 8], [-19, 6], [-13, 24], [-46, 13], [-34, -10], [-24, 9], [5, 16], [32, -6], [3, 19], [-19, 15], [-42, 3], [12, 20], [41, 3]], [[2237, 9747], [21, -10], [-38, -6], [-3, 11], [20, 5]], [[2423, 9834], [57, -44], [2, -10], [82, -11], [3, -17], [27, -38], [29, -5], [18, -20], [-44, -17], [-43, -42], [-14, -3], [-6, -18], [-28, 15], [-16, -18], [-35, 3], [-28, 11], [-46, 45], [23, 14], [32, -1], [-15, 19], [-59, -9], [-22, 9], [4, 11], [-26, 20], [32, 20], [-30, 16], [12, 17], [42, 2], [-27, 14], [7, 15], [58, 6], [11, 16]], [[3064, 9963], [20, -9], [71, -3], [15, -7], [67, -2], [15, -22], [37, -2], [13, -16], [-32, -17], [-53, -20], [-14, -26], [-100, -45], [-30, -26], [-36, -18], [-13, -26], [-57, -18], [-51, -12], [-28, 5], [2, -14], [32, 0], [8, -15], [-45, 6], [11, -16], [27, -4], [-1, -18], [-22, -34], [-36, -15], [-36, 4], [12, -26], [-15, -16], [-23, -6], [-46, 3], [-22, 13], [-8, -16], [51, -8], [16, 4], [12, -10], [-10, -13], [18, -3], [22, 6], [4, -21], [-43, -27], [-37, -9], 
 [-12, 4], [9, 14], [-32, 5], [-24, -7], [-40, 4], [-28, -9], [-32, 6], [-34, -5], [-43, 6], [-13, 12], [3, 19], [31, 16], [26, 4], [6, 13], [-27, 25], [1, 10], [28, 8], [27, -8], [22, -28], [18, 8], [-14, 10], [-11, 21], [-15, 8], [-35, 5], [0, 23], [24, 26], [38, 7], [56, -8], [7, 10], [-36, 1], [-13, 6], [11, 11], [-19, 31], [-41, 11], [2, 39], [73, -5], [16, 5], [126, 18], [-26, 19], [-44, -15], [-89, -8], [-47, 2], [-56, 10], [-35, 14], [27, 9], [47, 1], [5, 8], [-91, -8], [-5, 17], [-23, 16], [25, 9], [-21, 6], [2, 14], [34, 2], [19, 11], [55, 6], [66, 15], [45, 2], [32, 30], [62, 13], [89, 6], [69, -9], [29, 12], [81, 1]], [[5255, 7416], [0, -1], [10, -10]], [[5290, 7358], [-2, -14], [-8, -5], [-4, -17], [-11, -5], [-3, 14], [-5, 0], [0, -13], [-12, -17], [-11, 13], [-10, 0], [1, -9], [-8, -15], [-8, 5], [-10, -8], [-4, 4]], [[5195, 7291], [-5, 14], [-2, 21]], [[5188, 7326], [-5, 7], [-8, -5], [-3, -11]], [[5172, 7317], [-4, 13], [10, 21], [0, 13], [15, 21], [1, 19], [10, -5],
  [6, 11]], [[5210, 7410], [14, -1], [16, 15], [7, -9], [8, 1]], [[3101, 38], [-1, -14], [7, -15], [-3, -9], [-16, 10], [-4, 9], [-14, -1], [-16, 9], [4, 6], [41, 9], [2, -4]], [[3116, 44], [14, -1], [7, -10], [-6, -17], [-22, 5], [-3, 18], [10, 5]], [[3013, 111], [14, -9], [-3, -20], [-15, 12], [4, 17]], [[3003, 118], [6, -3], [-3, -21], [-5, -2], [-8, 13], [10, 13]], [[3044, 119], [2, -10], [-14, -8], [-1, 20], [11, 20], [2, -22]], [[2972, 146], [2, 4], [15, -14], [6, -12], [-10, -22], [-11, 1], [5, 17], [-22, 7], [-1, 13], [16, 6]], [[2925, 201], [9, -16], [8, 0], [0, -11], [-14, 13], [-3, 14]], [[3093, 53], [0, -1], [0, -6], [-12, -5], [-20, 12], [-12, -5], [-22, 10], [-7, 11], [11, 23], [15, -6], [7, 6], [-3, 31], [8, 11], [15, 10], [0, 12], [-25, -8], [-6, 11], [4, 18], [17, 21], [4, 19], [4, 4], [8, -17], [10, 10], [4, -7]], [[2952, 224], [-2, -20], [-11, 3], [13, 17]], [[2938, 245], [8, -16], [-5, -4], [-3, 20]], [[2931, 340], [0, -15], [-7, -7], [-4, 15], [11, 7]], [[2906, 3
 62], [4, -1], [-1, -19], [-6, 7], [3, 13]], [[2931, 363], [3, 1], [5, -23], [-5, -3], [-6, 13], [3, 12]], [[2908, 395], [10, -14], [-8, -15], [-2, 29]], [[2925, 489], [5, 0], [2, -43], [-3, -14], [3, -17], [-1, -14], [-8, -8], [-10, 14], [-10, 38], [13, 5], [6, 11], [-7, 20], [6, 10], [4, -2]], [[2906, 508], [1, -11], [-7, -7], [-2, 16], [8, 2]], [[2924, 525], [4, -11], [-1, -23], [-9, 5], [-3, 8], [9, 21]], [[2913, 533], [8, -3], [0, -14], [-5, -7], [-4, 9], [1, 15]], [[2907, 536], [7, -38], [-4, -8], [-4, 23], [-5, -2], [-1, 24], [7, 1]], [[2921, 554], [1, -19], [-13, 3], [2, 9], [10, 7]], [[2924, 698], [-1, -13], [-9, -7], [1, 16], [9, 4]], [[2948, 756], [4, -8], [-1, -12], [-6, 2], [-7, 15], [10, 3]], [[2946, 783], [-10, -13], [-3, 13], [13, 0]], [[2974, 796], [6, -6], [-4, -13], [-12, -16], [-5, 21], [15, 14]], [[2945, 986], [11, -10], [5, -26], [-8, -5], [-4, -17], [9, -13], [-4, -8], [4, -14], [-6, -3], [1, -17], [-5, -3], [-15, 11], [5, 17], [3, 28], [-2, 15], [4, 22], [-1, 
 23], [3, 0]], [[3098, 228], [-19, 10], [-8, -3], [-7, -20], [-4, 3], [-19, -17], [-8, -2], [0, -17], [-5, -28], [-1, -31], [-9, -5], [-8, 4], [-18, 18], [-5, 12], [5, 12], [15, 1], [10, 7], [5, 15], [-1, 10], [-19, -16], [-16, -22], [-1, -17], [-19, 22], [8, 10], [-1, 19], [15, 2], [0, 12], [-7, -1], [-10, -13], [2, -13], [-10, -4], [2, 33], [-10, -8], [-2, 22], [23, 34], [-3, 13], [-9, -29], [-8, 11], [-2, 24], [-7, 5], [-1, 15], [4, 13], [-9, 3], [-4, 18], [4, 4], [-5, 28], [-11, 20], [2, 7], [10, 2], [-3, 21], [4, 19], [-6, 11], [-1, 22], [2, 34], [11, 13], [-17, 26], [3, 7], [21, -5], [-9, 18], [-15, 0], [-3, 5], [11, 35], [5, 0], [5, 11], [-8, 20], [-10, 1], [-2, -8], [-11, 17], [-10, 0], [1, -20], [-4, -2], [-4, 23], [17, 30], [3, -1], [7, 18], [1, 10], [15, 3], [11, -31], [-7, -24], [5, -1], [8, 20], [-3, 23], [3, 8], [1, 29], [8, 12], [-5, 19], [18, 20], [2, 19], [-17, 23], [8, 29], [-3, 22], [10, 32], [-3, 13], [1, 42], [7, 16], [-8, 9], [7, 14], [-10, 16], [-7, -22], [-15,
  3], [-5, 56], [6, 31], [-2, 7], [2, 33], [9, 13], [4, 22], [-1, 30], [-7, 47], [2, 24], [-6, 27], [0, 25], [13, 15], [2, 35], [4, -3], [5, 32], [1, 23], [5, 10], [-1, 17], [7, 24], [4, 9], [5, 32], [1, 36], [11, 45], [-4, 31], [6, 8], [4, 45], [-4, 13], [2, 21], [-5, 54], [-1, 38], [1, 20], [8, 14], [3, 17], [-1, 22], [-2, 23], [-3, 6], [-1, 18], [6, 20], [4, 22], [1, 30], [2, 20], [4, 3], [-1, 33], [4, 12], [5, 71], [-2, 13], [1, 21], [6, 14], [-1, 26], [-3, 33], [2, 30], [0, 23], [3, 20], [-6, 0], [1, 29], [8, 13], [4, 90], [3, 17], [-4, 45], [0, 32], [2, 21], [-1, 25], [-4, 30], [-2, 38], [2, 24], [-3, 7]], [[3044, 2672], [12, 7], [5, 19], [-2, 18], [10, 16]], [[8074, 5439], [7, -12], [1, -22], [-9, -22], [-6, -50], [-6, -3], [-5, -19], [-8, 1], [0, -10], [-5, -4], [-4, 7], [-8, -1], [-12, 16], [-3, 51], [11, 28], [4, 3], [4, 20], [5, -6], [7, 12], [8, -4], [4, 8], [6, 1], [6, -7], [3, 13]], [[8386, 6251], [-10, 5], [-11, 18], [3, 4], [19, -21], [-1, -6]], [[8689, 7228], [-3, 14
 ], [-15, 6], [-5, -7]], [[8666, 7241], [-5, 7], [-11, -27], [-14, -8], [4, -12], [5, -45], [-2, -38], [3, -10], [-8, -39], [-6, 2], [-10, -10], [3, -14]], [[8625, 7047], [-8, 15], [0, 11], [-10, 7], [-5, -40], [-13, -4], [-1, -12], [-8, -14], [-24, -2], [0, -8], [7, -21], [-3, -13], [-7, 4], [-8, -2], [-15, 7], [-5, 19], [-9, -10], [-5, -22], [-12, -33], [-6, -1], [-7, -11], [-18, -17], [-14, -28]], [[8454, 6872], [-7, -19], [-24, -5], [-24, -26], [-15, -33], [-6, 4], [-4, -14], [-9, -6], [1, 16], [13, 10], [-3, 20], [-7, 17], [6, 4], [0, 15], [10, 9], [11, 37], [-7, 17], [-13, 7], [-6, 7], [-10, -7], [-1, -11], [-9, -15], [-5, -20], [-25, -22], [-6, -13], [-1, -20], [-8, -17], [-11, -3], [-7, -9], [-9, 14], [-9, -9], [-5, -34], [5, -18], [10, -17], [13, -5], [8, 6], [8, -22], [-4, -17], [0, -24], [13, -11], [9, 2], [3, 15], [9, 11], [3, 12], [12, 11], [17, -17], [7, -12], [15, 4], [11, -12], [-3, -12], [3, -15], [-6, -9], [-8, 12], [-24, -23], [-12, -15], [-3, -10], [2, -12], [-10,
  -8], [1, 11], [-8, 1], [4, -17], [-5, -9], [-4, -16], [-7, -3], [-6, -18], [-2, -17], [-5, -3], [0, -19], [7, -3], [6, -14], [17, -17], [4, -32], [13, -61], [-1, -25], [15, -20], [2, -20], [10, -12], [3, -14], [-3, -4], [-15, 14], [-8, -5], [4, -10], [5, -13], [11, -16], [7, -26], [-15, -11], [-12, -16], [-6, -18], [3, -9], [7, 12], [7, -1], [8, -23], [9, -13], [-2, -13], [0, -32], [-8, -1], [1, -19], [-5, -18], [5, -23], [-9, -8], [-6, -1], [-15, -46], [-2, -27], [-7, -6], [-4, -34], [-7, 1], [-2, 10], [-5, 0], [5, -23], [-4, -9], [-3, -22], [4, -4], [-2, -17], [-14, -24], [4, -6], [1, -11], [-9, 3], [-7, -27], [1, -7], [-5, -13], [-4, 4], [-6, -6], [-3, -20], [-5, -4], [-1, -13], [-17, -19], [-1, -8], [-10, -3], [-3, -23], [-5, -5], [-3, -20], [-5, 1], [-6, -9], [-8, -2], [-6, 5], [-6, -13], [-4, 10], [-13, -17], [-1, 14], [-14, -17]], [[8172, 5611], [-4, -2]], [[8168, 5609], [-5, -3], [-8, 32], [-7, -3], [7, -22], [0, -15], [-3, -16], [-6, 2], [-2, -10], [-5, 1], [-12, -20], [-4
 , 4], [-6, -9], [-1, 9], [-16, -22], [-12, 1], [-16, -22], [-5, 1], [-8, -19], [0, -10], [6, -1], [-1, -11], [6, -14], [-4, -13], [-8, -4], [-3, 13], [-5, 7], [-2, 22], [-3, 7], [1, 14], [3, 17], [-7, 10], [-11, -7], [0, 15], [-11, 4], [-5, 11], [-3, -11], [-4, 3], [-9, -16]], [[7999, 5534], [-4, 11], [-14, -3], [-13, 27], [-6, 2], [0, 16], [-4, 15], [6, 23], [-7, 13], [-5, -5], [-8, 8], [-4, -5], [-15, 30], [-13, -11], [-1, -17], [-13, -17], [-4, 10], [-5, -8], [-1, -14], [-10, 20], [-3, -16], [-6, 15], [-9, -25], [-4, 10], [-11, 13], [-6, -25], [-3, -1]], [[7836, 5600], [-11, 7], [-6, -19], [3, -19], [4, -11], [-1, -49], [-6, 8], [-7, -5], [-3, 27]], [[7809, 5539], [-1, 15], [-7, -6], [-4, -12], [-7, -4], [-14, 19], [-1, 23], [-3, -2], [-19, 10], [6, 25], [-1, 18], [5, 22], [-12, 3], [-6, 6], [0, 31], [-5, 13], [0, 13], [-5, 11], [-9, -1], [-15, -18], [-3, 6], [5, 13], [-2, 23], [-3, -1], [1, 22], [6, 8], [-2, 8], [11, 31], [1, 16], [6, -3], [5, 19], [5, 3], [-4, 16], [5, 38], [0,
  30], [-2, 9], [0, 29], [-7, 8], [-3, -11], [-6, 31], [1, 13], [-7, 16], [-9, 12], [-6, -23]], [[7703, 6018], [-6, 11], [-4, -3], [-8, 19], [-3, 16], [-12, 40], [-11, -2], [-7, -15], [-8, -3], [-12, 5], [-4, 11], [-10, -16], [2, -5], [-20, -25], [-5, 0], [-8, -13], [-2, -9], [-12, -19], [-1, -14], [-9, -9], [-9, -4], [-9, 2]], [[7468, 5953], [-4, 17], [3, 21], [-1, 11], [-5, 8], [-7, -9], [-7, -2], [0, -7]], [[7447, 5992], [-8, 4], [-3, -7], [-16, 1], [-3, 8], [-14, 11], [-3, -13], [-12, -2], [-4, 20], [-7, 6], [-14, 5], [2, 19], [-7, -3], [-7, 5], [-12, 21], [-4, 25], [-6, 3], [-6, -9], [-4, 2], [-10, 31], [-9, 3], [-8, 19], [-11, 10], [-1, 19], [-14, 6], [-11, -30], [-6, 14]], [[7249, 6160], [-7, 14], [-13, 13], [-12, 28], [-7, -1], [-8, 13], [-7, 22], [-2, -8], [-7, 1], [-1, 13], [4, 7], [-4, 11], [2, 14], [-8, 19], [-2, 22], [6, 3], [8, -16], [5, 2], [11, 19], [-4, 23], [1, 15], [-11, 10], [-5, 17], [-2, 38], [7, 10], [-1, 11], [-18, 21], [-8, 44], [1, 13], [-7, 3]], [[7160, 654
 1], [-10, -2], [-18, 13]], [[7132, 6552], [-6, 16], [-11, -5], [-8, 21], [4, 10], [-1, 17], [-5, 16], [-11, 4], [-2, 12], [-22, 8]], [[7080, 6666], [7, 12], [-7, 14], [2, 12], [-5, 23], [-1, 31], [-12, 11], [-6, 0], [-2, -10], [-7, 5], [-3, 18], [4, 10], [-6, 18], [1, 15]], [[7045, 6825], [8, 11], [-3, 15], [5, 18], [10, 3], [9, 17], [4, 13], [10, -6], [11, 13], [3, -23], [6, 1], [9, 9], [6, -1], [9, 38], [6, 7], [13, -5], [17, 4], [8, 25], [26, 29], [12, 7], [3, 9], [10, 1], [0, 12]], [[7227, 7022], [2, 4], [-4, 27], [3, 12], [9, 8], [-5, 9], [11, 8], [-4, 14], [2, 9], [-10, 47], [0, 39], [-3, 12], [-7, -2], [-3, 8], [5, 8], [22, 8], [25, 15], [6, -14], [9, 6], [8, -3], [1, 18], [-9, 7], [19, 102], [1, 18], [4, 1], [21, -17], [21, 1], [3, -12], [12, 15], [8, 2], [5, 23], [-4, 39], [7, 35], [11, 1], [11, 8], [5, 12], [-1, 21], [5, 8], [12, -1]], [[7425, 7518], [14, 5]], [[7439, 7523], [-1, -26], [4, -14], [17, -19], [1, -9], [13, -16], [14, 3], [5, -15], [8, 4], [9, -16], [3, -25], 
 [10, -23], [6, -30], [-4, -19], [3, -20], [-8, -20], [-2, -18], [7, -23], [7, 1], [14, -10], [10, 2], [13, -6], [8, 3], [21, -6], [11, -20], [8, -2], [4, -10], [19, -18], [10, 2], [-2, -20], [5, -2], [11, -55], [11, -20], [2, -14], [23, 3], [63, -16], [15, 8], [34, -10], [11, -1], [11, -24], [29, -13], [18, -18], [22, 8], [0, -15], [14, -5], [7, 12], [17, 17], [25, 21], [39, 12], [17, -4], [19, 4], [6, 7], [20, 16], [15, 37], [18, 17], [9, 12], [-2, 18], [-12, 29], [9, 45], [8, 8], [12, -2], [4, -10], [14, -9], [15, -3], [11, 14], [10, 19], [4, 13], [11, -1], [19, 5], [15, 19], [1, 14], [11, 29], [6, 5], [14, -2], [2, 16], [9, -4], [15, 14], [13, -2], [3, 5], [14, -10], [10, -2], [6, 9], [0, 14], [-6, 18], [-15, 26], [-2, 10], [-9, 7], [-6, 15], [-10, 5], [-12, -4]], [[8270, 7438], [-7, -14]], [[8263, 7424], [-5, -9], [-13, 15], [-17, 0], [-11, -11], [-8, 16], [-1, 13], [8, 11], [0, 19], [24, 93]], [[8240, 7571], [11, -11], [19, -12], [12, 12], [13, 20], [12, 2], [7, 8], [-1, 36], [
 13, 35], [10, 42], [12, 17], [6, 16], [-4, 16], [3, 14], [-9, 7], [-10, -3], [-1, 12], [7, 7], [17, 30], [9, 0], [31, 15], [15, -1], [11, 7], [10, -1], [17, -13], [14, -16], [11, 4], [14, -11], [16, -38], [9, -27], [-2, -12], [9, -41], [5, -8], [-1, -17], [10, -23], [1, -30], [7, -8], [-2, -28], [9, -17], [7, -4], [20, 3], [-1, -7], [9, -9], [17, -6], [6, -17], [9, -12], [12, 0], [-4, -17], [8, -21], [-4, -21], [10, -26], [11, 4], [4, -5], [26, 3], [5, 17], [11, 11], [10, -1], [8, 11], [18, 10], [9, -9], [-4, -15], [6, -24], [-8, -20], [-9, -13], [-5, -45], [-4, -11], [2, -15], [-6, -9], [-8, -40], [-8, -11], [0, -22], [-8, -5]], [[4925, 4672], [1, -15], [-4, -16], [5, -10], [3, -51], [-9, -28], [-3, -17], [-3, -37], [-5, -16], [-1, -16], [8, -72], [5, -3], [1, -29], [-2, -2]], [[4921, 4360], [-13, -2], [-19, 8], [-35, -8], [-17, -6], [-30, -27], [-15, -23], [-2, 1]], [[4790, 4303], [-1, 2], [0, 48], [2, 7], [3, 32], [-1, 18], [-10, 10], [-3, 21], [-11, 3], [-7, 17], [6, 15], [1, 27
 ], [-5, 30]], [[4764, 4533], [7, -1], [6, 46], [-7, 5], [0, 15], [8, 3], [9, -9], [-1, 17], [-8, 12], [3, 45], [-6, 0], [-2, 12], [-1, 27], [6, 15]], [[4778, 4720], [4, 4], [5, 16], [5, 0], [3, -13], [11, -5], [0, 11], [7, 0], [1, 23], [7, -7], [0, 10], [5, 2], [2, -18], [-2, -13], [6, -8], [6, 17], [8, 0]], [[5402, 4923], [3, -17], [6, -8], [2, -35], [4, -4], [1, -28], [2, -12], [-3, -25], [1, -28], [6, -35], [7, -16], [-4, -11], [-5, 4], [-13, -5], [-8, 6], [-8, -2], [-6, -24], [11, -34], [23, -49], [7, -46], [4, -4], [-3, -19]], [[5449, 4151], [-3, -19], [2, -17], [-7, 4], [-4, 8], [-7, 5], [-4, -4], [-3, 8], [-4, -3], [-7, 9], [-2, -3], [-6, 10], [-8, -4], [-27, 1]], [[5369, 4146], [-2, 7], [-13, -2], [-12, 5], [-16, -2], [-11, 2], [-1, -10]], [[5314, 4146], [-37, 0], [-5, 12]], [[5272, 4158], [2, 39], [2, 15], [-1, 13], [-8, 20], [-1, 19], [2, 9], [-4, 7], [-3, -9], [-12, 14], [-2, 34], [-11, -3], [2, 20]], [[5238, 4336], [6, 25], [3, 33], [-2, 16], [4, 7], [17, 41], [3, 2], [2
 , 17], [10, 16], [3, -9], [7, 0], [3, 13], [6, -8], [7, -17], [1, -18], [6, -1], [5, 12], [2, 19], [9, 17], [-5, 11], [8, 24], [1, 14], [4, 13], [1, 30], [5, 8], [-1, 7], [8, 5], [4, 12], [2, 39], [9, 12], [2, 19], [-1, 20], [6, 5], [3, 38], [6, 24], [6, 19], [5, -3], [12, 18], [-1, 16], [2, 30], [-3, 14], [-10, 4], [-3, 50]], [[5390, 4930], [7, 0]], [[5397, 4930], [5, -7]], [[5905, 6518], [1, 1], [1, 0]], [[5907, 6519], [-2, -1]], [[5935, 6508], [1, -3]], [[5936, 6505], [-6, 2], [-2, 10], [-7, 0], [-10, -7], [-3, 9]], [[5908, 6519], [0, -1]], [[5908, 6518], [4, -7], [15, 9], [2, -10], [6, -2]], [[5762, 4355], [9, -24], [0, -11], [7, -3], [4, -14], [6, -5], [10, 19], [7, -4], [5, -10], [3, 2], [5, 21], [9, -11], [0, -8], [9, -22], [2, -11], [9, -6], [1, -18], [5, 4], [3, -13]], [[5856, 4241], [2, -7], [-5, -26], [3, -10], [-4, -31], [5, -9], [3, 4], [8, -16]], [[5868, 4146], [-10, -19], [-12, -29], [0, -19]], [[5846, 4079], [-7, -7], [-2, -17], [-6, -8], [0, -21], [-6, -29], [-1, -1
 4]], [[5824, 3983], [-6, -8], [-4, -27], [1, -6], [8, 14]], [[5823, 3956], [-3, -32], [1, -34]], [[5821, 3890], [-6, -8], [-4, -13]], [[5811, 3869], [-3, 1], [-7, -38], [0, -20]], [[5801, 3812], [1, -12], [3, -5]], [[5811, 3751], [-4, -51], [5, -6], [-1, -28], [-3, -7], [0, -33], [7, -39], [-1, -16], [-4, -6], [4, -21], [5, -35], [7, -23], [6, -7], [6, -18], [2, -35], [7, -14], [2, -13]], [[5849, 3399], [-47, -18]], [[5802, 3381], [-15, -43], [-1, -21], [6, -1]], [[5792, 3316], [5, -29], [-2, -12], [0, -41], [2, -9], [-4, -12], [-4, -38], [-2, -7], [4, -31], [12, -24], [3, -12], [11, 3], [1, 6], [9, 7], [0, -92], [-5, 0], [-1, 15], [-11, -15], [-5, 3], [-3, 16], [-15, 51], [-11, 6], [-3, 8], [-6, -2], [-6, 26], [-5, 9], [-2, 17], [-4, -3], [-1, -19], [-8, -10], [-8, 7], [-12, 1], [-10, 12], [-3, -3], [-4, 9], [-2, 32], [-16, -9], [-4, -8], [-7, 2], [2, 21], [-7, 6], [-5, 12]], [[5366, 3569], [-10, 2], [-3, -10], [-8, -6], [-6, 21]], [[5363, 3657], [8, -11], [9, 7], [0, 16], [7, -2],
  [12, 16], [2, -11], [-3, -10], [1, -23], [7, -1], [5, 6], [11, 34], [7, 9], [3, 13], [9, 7], [9, 47], [-1, 29], [1, 18], [-1, 25], [1, 11], [8, 19], [9, 43], [5, 13], [8, 5], [12, 36], [0, 23], [6, 48], [-2, 39], [5, 39], [0, 43], [9, 40], [4, 25], [2, 5], [1, 25]], [[5333, 3629], [-6, 25], [1, 5], [-20, 48]], [[5308, 3707], [3, 18], [7, 13], [5, -12], [5, 9], [3, 18], [-7, 9], [3, 11], [-4, 14], [-2, 34], [5, -4], [5, 6], [4, -6], [11, 6], [-1, 23], [4, 13], [6, -7], [6, -30], [13, -7], [8, 23], [3, -27], [6, 0], [4, 10], [-2, 7], [2, 21], [4, 3], [2, 27], [0, 23], [-2, 15], [3, 28], [-6, 14], [-3, -1], [-1, 10], [-8, 7], [2, 11], [-1, 18], [5, 25], [5, 0], [6, 27], [-5, 17], [-3, 16], [-10, 4], [-7, -11], [-5, 1], [-6, 23], [0, 21], [4, 19]], [[3018, 4842], [-17, -14], [-8, -35], [-7, -4], [-12, -48], [-1, -44], [-12, -48], [11, 9], [2, -14], [3, 3], [4, -35], [8, -23], [1, -16], [-4, -12], [1, -36], [7, -4], [3, -23], [23, -3], [2, -4], [8, 7], [9, 1], [7, -10], [7, 0], [18, -59
 ], [5, -3], [5, 10], [12, -6], [20, 7], [2, 5], [8, -2], [4, -17], [-5, -16], [-1, -24], [-6, -13], [2, -17], [-2, -40], [6, -53], [4, -6], [5, -19], [-15, -38], [6, -6], [9, -24], [3, -5], [9, -77], [0, -8]], [[3056, 3686], [-9, 29], [-7, -3], [-5, 6], [19, 77], [-9, 16], [-17, 21], [-7, -10], [-5, -3], [-1, 9], [-8, 9], [-6, -14], [-12, -9], [-7, 8], [-8, -6], [-8, 15], [3, 10], [-2, 20], [-10, 9], [1, 14], [-4, 16], [-17, 19], [-4, 30], [-7, 17], [-16, 22], [-1, -5]], [[2909, 3983], [-11, 13], [-4, 0], [-7, 20], [-7, 7], [-3, -15], [-13, 0], [-6, 8], [-9, 4], [-1, 17], [-6, 12], [-5, -1], [-7, 8], [-13, 20], [-7, 17]], [[2810, 4093], [-5, 15], [5, 13], [7, -3], [-3, 30], [3, 15], [7, 17], [1, -7], [13, 13], [5, 25], [5, 20], [7, 17], [2, 14], [-8, 16], [3, 54], [-3, 51], [5, 23], [-7, 29], [3, 8], [1, 17], [-10, 27], [1, 10], [-6, 13]], [[2836, 4510], [2, 18], [13, 16], [1, 13], [4, 3], [-7, 38], [1, 15]], [[2850, 4613], [9, -28], [6, -10], [-2, -12], [5, -3], [-1, 34], [-5, 10],
  [8, 10], [11, 24], [5, 24], [13, 8], [-1, 18], [2, 18], [-2, 17], [4, 9], [0, 19], [13, 24], [6, 14], [9, -10], [-3, -10], [7, -4], [6, 40], [9, -4], [15, 1], [15, 29], [13, 13], [4, 16], [-1, 9], [12, 9], [1, 8], [13, -10], [3, -17], [-6, -17]], [[6207, 3133], [-6, 8], [1, 31], [3, -2], [-1, -14], [3, -23]], [[4340, 5091], [8, -22], [-1, -7], [-8, 9], [1, 20]], [[4365, 5155], [4, -3], [-3, -13], [-4, 2], [3, 14]], [[4303, 5226], [3, -6], [-9, -14], [-1, 14], [7, 6]], [[2676, 4775], [7, -39], [17, -52], [6, -6]], [[2706, 4678], [-1, -6], [-6, 8], [-3, -12], [0, -27], [6, -10], [-6, -12], [2, -9], [-2, -27], [1, -15]], [[2697, 4568], [-2, 13], [-9, 11], [-8, 5], [-4, 13], [4, 15], [-1, 15], [-8, 18], [-8, 12], [-12, 9], [-3, 27], [-10, 15], [-1, -12], [7, -13], [-7, -15], [-4, 12], [-10, 9], [-4, 13], [-3, 19], [7, 19], [-3, 23], [1, 11]], [[2619, 4787], [3, 9], [19, -19], [7, 9], [9, -6], [4, -15], [7, -5], [8, 7], [0, 8]], [[2698, 5566], [5, -3], [4, -21], [-8, -11], [-7, 2], [3, 
 11], [-3, 16], [6, 6]], [[2914, 5420], [-1, 5], [-1, 0], [-2, -5], [-8, -1], [-6, 5], [-14, 3], [-8, -4], [-18, -2], [-14, -6], [2, 14], [12, 20], [3, 12], [-8, 18], [-4, -3], [-16, 3], [-12, 24], [-3, 32], [-4, 10], [-14, -6], [-8, 5], [-20, 19], [-7, 12], [-13, 0], [-11, 8], [-12, 2], [-8, 17], [12, 3], [1, 7], [-7, 8], [-25, 1], [0, -5], [-13, -20], [-4, -11], [-15, -1], [-1, -16], [-12, -12], [-3, 19], [6, 31], [12, 19], [14, 10], [3, 8], [19, 4], [10, 10], [26, -4], [4, -7], [14, 4], [10, -13], [7, 2], [9, -14], [5, -15], [8, -12], [15, -1], [17, -20], [5, -15], [10, -8], [1, 7], [15, -28], [11, -14], [5, 1], [7, -14], [12, 1], [3, -7], [-5, -12], [2, -11], [8, 4], [18, -9], [7, -19], [8, -3], [2, -9], [-3, -9], [-15, -2], [-8, -10]], [[5944, 6510], [-3, 0]], [[5941, 6510], [-6, -2]], [[5908, 6518], [4, -1], [2, 17], [14, -5], [17, 10], [-3, -14], [2, -15]], [[5944, 6510], [-3, -8]], [[5941, 6502], [0, 8]], [[5936, 6505], [0, -2]], [[5936, 6503], [-3, -10], [-16, -14], [-8, 2],
  [-9, 7], [-1, 20], [6, 10]], [[5907, 6519], [1, 0]], [[5411, 7645], [11, 9], [4, -14], [14, -8], [13, -2], [0, -20], [10, -20], [14, 21], [12, -9], [0, -11], [7, -10], [19, -4], [8, -29]], [[5523, 7548], [-9, -2], [-9, -15], [-3, -13], [-15, -20], [-11, 3], [-6, -18]], [[5383, 7495], [-6, 13], [-6, 3], [-10, 22], [-6, 2], [-12, 30], [4, 12], [-7, 10], [7, 24], [26, 15], [4, 9], [21, 12], [4, 10], [9, -12]], [[5371, 7918], [7, -5], [-1, -17], [-13, -1], [7, 23]], [[5262, 7929], [13, -1], [6, -22], [18, -12], [8, 1], [3, -23], [8, -8], [5, 17], [13, 3], [11, 21], [14, -3], [3, -11], [10, -11], [6, 3], [6, -16], [-3, -5], [13, -13]], [[5396, 7849], [4, -30], [-2, -17], [-6, -14], [14, -19], [-3, -12], [6, -24], [-4, -20], [4, -21], [6, -4], [2, -16], [-6, -27]], [[5269, 7407], [-14, 9]], [[5210, 7410], [0, 37], [5, 18], [1, 19], [11, 25], [-15, 5], [-7, 10], [-4, -5], [-12, 8], [-3, -4], [-6, 20], [-4, 1]], [[5176, 7544], [4, 25], [-8, 6], [-3, 17]], [[5166, 7637], [-2, 20], [8, 26], 
 [-8, 30], [13, 2], [18, 29], [-2, 16], [-8, 1], [1, 11], [9, 2], [4, 23], [0, 20]], [[5199, 7817], [-4, 9], [5, 21], [20, 4], [9, -9], [9, 19], [12, 2], [-1, 18], [-11, 14], [12, 12], [-9, 17], [-1, 11]], [[5240, 7935], [22, -6]], [[6201, 4816], [-9, -35]], [[6192, 4781], [-9, 6], [-6, -6], [-12, -5], [-5, 11], [0, 14], [-1, 18], [18, 67]], [[6177, 4886], [4, 2], [4, -10], [6, 19], [6, 6]], [[6197, 4903], [6, -16], [2, -17], [-1, -17], [-9, -15], [-8, -6], [0, -11], [10, 1], [4, -6]], [[3294, 5111], [4, -6], [0, -16], [-3, -6], [-3, 20], [2, 8]], [[5312, 7939], [13, -5], [1, -17], [-8, -1], [-13, 11], [7, 12]], [[5413, 7959], [7, -7], [-2, -10], [-11, 8], [6, 9]], [[5287, 7987], [3, -12], [10, -10], [-2, -17], [-12, -1], [-9, 8], [-8, 23], [18, 9]], [[5342, 8024], [8, -6], [0, -24], [-10, -12], [5, -14], [-7, -9], [0, -28], [-6, -10], [-6, 13], [4, 7], [-7, 15], [-11, 2], [-5, 32], [16, 21], [3, -16], [11, 27], [5, 2]], [[5240, 7935], [-1, 39], [-9, 11], [-3, 16], [5, 6], [-7, 16], 
 [0, 31], [17, 6], [10, 12], [5, 14], [-16, -3], [-6, -12], [-6, 4], [10, 20], [22, 3], [15, 31], [13, -2], [3, -24], [-7, -23], [2, -25], [17, -8], [-6, -17], [-15, -5], [1, -17], [-18, -35], [3, -12], [-6, -7], [7, -13], [-8, -12]], [[3006, 5287], [2, 19], [-6, 13]], [[3002, 5319], [-1, 3], [-1, 5]], [[3000, 5327], [4, 1], [4, 12], [-2, 15], [4, 16], [-4, 36]], [[3006, 5407], [3, 12], [14, -3], [4, 7], [11, -12], [5, 0], [4, -8], [11, -2], [1, -15], [7, -24], [16, -8], [8, -1], [11, -22], [-3, -22], [-4, 2], [-1, -12], [-6, 12], [-11, 5], [-8, -3], [-10, 5], [-8, -18], [-10, -2], [-4, 17], [-10, -21], [-10, -39], [-10, 32]], [[5238, 6645], [2, -7], [-7, -15], [-5, -58], [3, -13], [-1, -39], [-2, -33], [-11, -17], [-2, -11], [-7, -12], [-1, -14], [6, -32], [2, -17], [9, -9], [6, -18], [2, -24], [19, -31], [13, -132]], [[5264, 6163], [-7, -8], [11, -37], [4, -35], [1, -24], [-2, -37], [4, -29], [-5, -41], [2, -27], [3, -6], [-2, -24], [-10, -11], [-2, -17], [15, -52], [2, -39], [5, -
 7], [5, -20], [9, 6], [22, -18], [2, -3], [11, -54]], [[5332, 5680], [-25, -37], [-37, -58], [-31, -46], [-32, -49], [-24, -52], [-21, -48], [-3, -3], [-42, -21]], [[5117, 5366], [-26, -12], [-5, 13], [4, 15], [-1, 31], [-8, 10], [-15, 9], [-6, 16], [-8, -4], [-7, 13], [0, 8], [-9, 15], [-4, 0], [-1, 27], [-32, 54], [-26, 45], [-44, 73], [-25, 44], [-38, 63]], [[4866, 5786], [-37, 58], [-32, 48], [-39, 59]], [[4758, 5951], [0, 27]], [[4758, 5978], [0, 72], [9, 17], [21, 35], [7, 0], [6, 9], [10, -5], [2, 5], [27, 7], [6, -6], [7, 26], [11, 21], [7, 8], [7, 16], [20, 14], [3, 18], [-8, 26], [4, 5], [1, 19], [23, 10], [-3, 18], [12, 6], [35, -3], [1, 22], [4, 9], [-10, 16], [-4, 14], [2, 9], [-5, 13], [2, 20], [-4, 12], [2, 30], [-4, 19], [3, 8], [-4, 8], [2, 11], [-11, 19], [-1, 6]], [[4938, 6512], [13, 3], [13, 18], [2, 13], [11, 15], [4, -4], [9, 14], [6, -9], [7, 19], [26, 31], [28, 6], [8, 5], [8, -2], [8, 14], [7, -4], [8, 2], [10, 10], [26, -1], [9, -9], [4, -9], [6, 1], [8, 12
 ], [13, 5], [4, 12], [15, -13], [7, 2], [4, 11], [14, -7], [3, -9], [9, 8], [10, -1]], [[2774, 3775], [-4, -2], [2, 21], [4, 5], [2, -8], [-4, -16]], [[2493, 3954], [2, -11], [-5, -9], [-5, 7], [1, 11], [7, 2]], [[2459, 3972], [2, -14], [-6, -1], [-2, 13], [6, 2]], [[2478, 3980], [6, -10], [-1, -6], [-6, 2], [1, 14]], [[2463, 4001], [3, -12], [1, -14], [6, -15], [0, -13], [5, -10], [-4, -17], [-13, -3], [-3, 9], [2, 8], [9, 15], [-7, 19], [-2, 20], [3, 13]], [[2909, 3983], [-6, -11], [6, -20], [-1, -15], [-3, -13], [-4, -42], [-15, -45], [-16, -32], [-33, -29], [-9, -28], [-5, -3], [-1, -26], [-8, -40], [0, -16], [-7, -14], [1, -7], [-5, -12], [-6, 4], [-4, 11], [-2, 20], [-4, 6], [-5, -3], [-8, 14], [-8, -14], [-2, 6], [0, 29], [5, -1], [4, 9], [-3, 33], [-2, 2]], [[2768, 3746], [11, 14], [6, 46], [-4, 5], [-3, -8], [-5, 1], [-4, -9], [-10, 22], [-8, 12], [6, 10], [0, 14], [-3, 21], [3, 20], [-5, 20], [3, 8], [7, 4], [4, 21], [-2, 16], [12, 31], [1, 36], [-3, 13], [2, 8], [17, 16],
  [13, 7], [4, 19]], [[5949, 6241], [2, -8]], [[5951, 6233], [16, -105], [1, -19]], [[5968, 6109], [-4, -13], [-3, -38], [-6, -33], [1, -24], [-5, -12], [-5, -1], [-10, 20], [-4, 16], [-10, 19], [-2, 34], [-7, 15], [-6, 25], [-4, 26], [-5, -26], [7, -18], [1, -27], [6, -28], [8, -21], [10, -24], [1, -23], [4, -21], [4, -6], [5, -46], [9, -44], [6, -20], [19, -95], [7, -21], [0, -44], [5, -37], [6, -18], [9, -6], [7, -21], [12, -21], [0, -5]], [[6024, 5571], [-39, 0], [-32, 0], [-32, 0], [-54, 0], [-49, 0], [-33, 0], [-54, 0], [-38, 0]], [[5693, 5571], [0, 126], [0, 105], [0, 104], [0, 72], [0, 109], [-3, 21], [-1, 30], [-4, 18], [6, 26], [3, 21], [-4, 25], [0, 17], [8, 20]], [[5698, 6265], [1, -9], [6, -2], [12, 8], [31, -12], [11, -6], [1, -7], [8, -6], [5, 4], [1, -9], [14, -2], [18, -18], [13, 9], [15, 25], [7, 3], [2, 12], [10, -9], [7, 3], [3, 13], [12, -12], [9, 6], [-2, -18], [6, -3], [4, -11], [6, 13], [11, -16], [10, 11], [4, -7], [11, 1], [15, 15]], [[6177, 4886], [-7, 22],
  [-5, 8], [-7, 26], [-14, 27], [-10, 35], [-12, 12], [-9, 14], [-5, -3], [-11, 10], [-8, -9], [-4, 14], [-6, -10], [-12, -6], [-6, 19], [-6, 3], [-3, 12], [-9, -55], [-8, 24], [-4, -2], [-2, -10], [-9, 3], [-6, -5]], [[6014, 5015], [-3, 61], [6, 24], [1, 20], [8, 38], [-2, 20], [3, 17], [0, 22], [11, -3], [3, 21], [14, 16], [6, -2], [7, 27], [4, 8]], [[6072, 5284], [9, -44], [5, -43], [3, -49], [6, -21], [1, -15], [8, -15], [3, 7], [6, -11], [-2, -8], [4, -18], [3, -5], [8, 5], [7, -20], [10, -5], [13, -41], [1, -9], [9, -7], [3, -15], [5, -4], [3, -26], [3, -1], [7, -13], [1, -11], [8, -3], [1, -9]], [[5941, 6502], [-3, 2], [-2, -1]], [[4571, 6013], [1, -21], [-5, -9], [-6, 8], [2, 23], [8, -1]], [[4552, 6044], [-7, -14], [-2, -17], [-7, -11], [-6, 26], [11, 5], [6, 10], [5, 1]], [[4604, 6012], [7, 42], [4, 0], [0, -23], [-3, -12], [-8, -7]], [[4503, 6063], [4, -8], [-3, -20], [-5, 21], [4, 7]], [[5088, 6863], [-1, -15], [9, -1], [-6, -26], [-5, -9], [-9, 10], [-3, 11], [-4, -6], [
 -4, 10], [16, 22], [7, 4]], [[4950, 7108], [1, -7], [10, -3], [-3, -12], [20, -9], [5, -11], [8, 3], [7, -11], [20, 1], [0, 10], [18, -9], [3, -9]], [[5047, 7045], [9, -11], [7, 5], [5, -6], [13, 9], [7, -2]], [[5088, 7040], [-2, -21], [3, -13], [-8, -18], [-18, -18], [-6, -14], [-15, -6], [-15, -11], [-8, -16], [4, -10], [-7, -4], [-7, -24], [-8, -18], [-10, -37], [3, -31], [12, -25], [-21, -29], [-4, -25], [-7, -31], [-9, 2], [-12, -16], [-6, -29], [-7, -16], [-6, 7], [-8, -10], [-8, 4], [-31, 0], [-11, -3], [-8, -15], [-13, -6], [-4, -20], [-7, -9], [-16, 21], [-2, 20], [-4, 4], [1, 11], [-4, 12], [-15, 18], [-10, -1]], [[4794, 6663], [-4, 27], [8, 29], [6, 4], [-9, 30], [3, 21], [8, 20], [-6, 7], [-4, 25], [-6, 16], [14, 0], [4, 23], [-4, 13], [7, 12], [-2, 7], [1, 28], [-3, 13], [8, 18], [4, 2], [8, 20], [-10, 12], [0, 13], [-16, 5], [-7, -11], [-9, 4], [-13, -6], [3, 16], [-4, 9], [-15, -14]], [[4756, 7006], [-4, 10], [4, 22], [-2, 11], [-11, 27], [0, 16], [25, 18], [1, 11], [
 17, 15], [13, -15], [28, 2], [22, -2], [19, -11], [15, -1], [18, 9], [12, -12], [10, 7], [17, -12], [10, 7]], [[5628, 8201], [13, -2], [0, -12], [-9, -11], [-16, -7], [-9, 8], [7, 17], [14, 7]], [[5778, 8265], [4, -9]], [[5782, 8256], [-5, -2], [3, -1], [-7, -11]], [[5773, 8242], [-4, -12]], [[5769, 8230], [-17, -3], [-4, -11], [6, -10], [3, -18], [10, -30]], [[5767, 8158], [1, -6], [-9, -28]], [[5759, 8124], [-13, 8], [-10, -8], [-14, 18], [-20, 21], [-27, -14]], [[5675, 8149], [6, 35], [-12, -8], [-10, 7], [-6, 15], [1, 17], [-4, 9], [1, 21], [18, 8], [6, 11], [12, -2], [21, 9], [32, -1], [5, -6], [29, -5], [4, 6]], [[6192, 4781], [-8, -27], [5, -30], [7, -21], [3, -3], [1, -13], [5, -20], [6, -6], [11, -25], [42, -35], [40, -36], [28, 0]], [[6332, 4565], [-16, -41], [-27, -67], [-14, -36], [-27, -78], [-27, 3], [-12, -8], [-12, -14], [-9, -26], [-18, -6], [-7, -16]], [[6163, 4276], [-22, -1], [-9, 23], [-26, -30], [-8, -33], [-3, 4], [-15, 4], [-11, 8], [-11, -1], [-4, 8], [-31, 
 51], [-22, 1], [-4, 12]], [[5997, 4322], [-4, 11], [0, 21], [1, 18], [-15, 14], [-5, 8], [-3, 16], [-1, 17], [-3, 12], [-3, 28], [-6, 8], [0, 10], [-6, 6], [-7, 21], [-1, 11], [-8, 17], [-19, 11], [-1, 8], [6, 24], [-1, 11], [12, 4], [2, -6], [8, 5], [4, 13], [-1, 60]], [[5946, 4670], [1, 16], [6, 42], [-1, 21], [4, 17], [4, 6], [7, -11], [3, 10], [0, 29], [4, 20], [-1, 16], [5, 9], [11, 49], [3, 7], [10, 2], [1, 17], [3, 30], [4, 15], [2, 31], [2, 19]], [[5804, 8951], [-14, -37], [6, -22], [17, -9], [20, -29], [-3, -12], [-22, -38], [-1, -11], [23, -52], [6, -28], [-12, -6], [4, -39], [-7, -7], [6, -14], [7, -1], [0, -28], [14, -13], [-1, -16], [-15, -18], [14, -20], [21, -19], [9, -21], [-9, -29], [-17, -23], [-23, -42], [-16, -25], [-12, -11], [-27, -39]], [[5772, 8342], [-10, -7], [-11, 6], [-10, -9], [-17, 0], [-10, -12], [-31, -9], [-2, -6], [-27, -5], [-11, -6], [-8, 21], [-7, 3], [0, 11], [-16, 4], [-8, 12], [-11, 7], [8, 62], [-8, 27], [1, 20], [-9, 29], [11, 24], [1, 19], 
 [12, -2], [12, 10], [4, 24], [9, -1], [3, 11], [12, 7], [10, 23], [17, 23], [9, 21], [21, 10], [-6, 11], [4, 26], [-19, 11], [-4, 12], [-10, 1]], [[5671, 8720], [-13, 28], [-2, 17], [10, 27], [-12, 24], [6, 19], [-10, 5], [2, 28], [5, 4], [-14, 14], [-10, 19], [-20, 6], [-41, 40]], [[5572, 8951], [19, 19], [10, -2], [21, -40], [22, -7], [20, 15], [33, -13], [2, 12], [13, 5], [11, 59], [13, 16], [16, -1], [22, 12], [14, -20], [21, -9], [6, -15], [-14, -18], [3, -13]], [[9951, 2743], [8, -19], [1, -20], [3, -10], [-12, -8], [-3, -7], [-9, 1], [-14, 9], [-2, 11], [5, 15], [-2, 7], [7, 14], [18, 7]], [[0, 2828], [9996, -4], [-14, -41], [-3, 8], [-11, -12], [-5, -10], [-3, 15], [10, 23], [12, 6], [2, 8], [8, 6], [-9992, 3], [0, -2]], [[3351, 300], [3, -3], [-17, -40], [-11, -3], [-3, -12], [-8, -5], [-2, 9], [7, 9], [1, 15], [12, 27], [17, -3], [1, 6]], [[3368, 302], [14, -5], [4, -13], [-1, -14], [-22, -24], [-5, 3], [-10, -17], [-7, 13], [3, 13], [11, 16], [13, 28]], [[6541, 2490], [4,
  -2], [6, -18], [-1, -12], [-7, -3], [-6, 6], [-4, 17], [2, 9], [6, 3]], [[3483, 4157], [7, 13], [5, 34], [-1, 11], [6, 24], [-2, 12], [-8, 28], [-3, 33], [-1, 31], [2, 10], [7, 22]], [[3495, 4375], [3, 6], [3, 22], [12, -12], [15, -9], [16, -34], [3, -2], [10, -26], [4, 1], [4, -30], [-1, -11]], [[3306, 5053], [4, -23], [-7, 0], [3, 23]], [[3288, 5160], [2, -14], [-4, -10], [-2, 29], [4, -5]], [[5262, 7058], [2, -10], [1, -31], [-4, -12], [0, -18], [-6, -18], [-7, 3], [-9, 29], [2, 15], [1, 33], [10, 12], [10, -3]], [[5160, 7550], [5, -7], [11, 1]], [[5172, 7317], [2, 6], [14, 3]], [[5195, 7291], [-7, -8], [5, -22], [5, -7], [-1, -11], [-14, -11], [9, -18], [1, -12], [-3, -23], [15, -18], [8, -3], [-5, -21]], [[5208, 7137], [-2, -3], [-2, -2], [-18, -22], [-1, -15], [-23, -11], [-2, 6], [-12, 6], [-1, 10], [-21, 1], [-1, 6], [-16, 6], [-15, -18], [-8, -13], [-2, -12], [0, -28], [4, -8]], [[4950, 7108], [8, 14], [9, 86], [-1, 25], [2, 26], [-2, 16], [4, 24], [-1, 16], [-20, 17], [-8
 , 23], [3, 17], [-5, 13], [-7, 5], [-2, 16], [-7, 8], [-9, -5], [-4, 9], [-17, 7], [-3, 7], [-8, -7], [-6, 13], [5, 24], [-4, 7], [-10, -5], [1, 17], [21, 11], [11, -3], [2, 11], [12, 2], [12, -24], [9, 11], [3, -6], [10, 8], [10, -1], [-3, 37], [-6, 13], [-1, 19], [13, 4], [9, -23], [23, -8], [14, 13], [-5, 6], [4, 13], [12, 10], [14, 7], [11, 18], [0, 47], [11, 10], [16, 6]], [[5308, 3707], [-3, 16], [-10, 19], [0, 10], [-5, 13], [-15, 31], [6, 13], [-11, 4], [-3, 6], [-2, 14], [-8, 25], [0, 26], [-7, 13], [-6, 40], [8, 10], [5, 14], [3, 44], [3, 6], [-5, 24], [7, 3], [0, 21], [7, 3]], [[5272, 4062], [42, 0], [0, 84]], [[4825, 7878], [-9, -4], [-12, 26], [-8, -21], [-14, 7], [-10, 18], [8, 14], [10, 7], [8, 23]], [[4798, 7948], [8, 9], [14, 4], [10, -3], [3, -17], [8, -11], [4, -38], [-8, -5], [-5, -14], [-7, 5]], [[4832, 8059], [2, -7], [9, -5], [-2, -7], [-12, -5], [3, 24]], [[4824, 8137], [5, -8], [3, -28], [-8, -3], [-12, 24], [12, 15]], [[4827, 8184], [-4, -23], [-15, -7], [-
 6, 13], [21, 25], [4, -8]], [[4907, 8205], [9, -1], [-6, -24], [-22, -25], [3, -11], [-4, -18], [16, 12], [11, -3], [32, 0], [5, -15], [-7, -11], [-6, -32], [-30, -64], [18, 6], [14, -10], [9, -21], [5, -3], [3, -30], [7, -30], [5, -9], [15, -11], [4, -15], [9, -11], [-4, -7], [10, -27], [6, -30], [-7, -24], [8, -7], [5, 13], [20, -3], [10, -11], [4, -21], [-6, -29], [-17, -33], [-11, -15], [12, -5], [12, 3], [-2, -18], [-30, -28], [-12, 6], [-18, -7], [-14, 5], [-20, -6], [1, -9], [-13, 0], [-11, 10], [-17, -11], [-5, -25], [-13, 10], [-17, -3], [-9, -10], [-4, -17], [-7, 17], [18, 29], [7, 16], [1, 14], [5, -1], [3, 14], [13, 4], [20, -3], [6, 19], [-4, 7], [-6, -12], [-10, 0], [-9, 16], [-12, -5], [-3, 14], [-15, -11], [-5, 19], [1, 12], [16, 8], [9, 10], [4, 19], [-3, 27], [-6, 8], [6, 14], [17, 5], [14, 10], [3, 20], [-2, 16], [-17, 42], [6, 26], [-12, -1], [-4, -7], [-10, 3], [-1, -9], [-13, 13], [-8, -1], [-1, 11], [15, 35], [-8, 16], [-2, 11], [-14, -16], [-1, -19], [-7, -5]
 , [2, 44], [4, 13], [-1, 11], [8, 29], [-10, -12], [-9, 9], [11, 48], [-8, 15], [2, 25], [9, 1], [5, 9], [-2, 19], [6, 8], [5, 19], [20, -7], [26, 9]], [[4964, 8345], [6, -17], [-8, -3], [-5, 17], [7, 3]], [[6206, 6944], [-6, 5], [-7, 19], [-11, 9], [-4, -9], [-13, 5], [-4, -6], [-8, 7]], [[6153, 6974], [7, 22], [-8, 59], [-10, 11], [-8, 19], [-14, 5], [-3, 13], [-7, 5]], [[6110, 7108], [7, 14], [12, -3], [10, -12], [10, -3], [5, -7], [14, -3], [10, 3], [16, -10], [5, -12], [17, -13], [-1, -10], [5, -4], [17, 15], [8, 0], [9, -6], [5, -11], [10, -1], [-2, -20], [9, -15], [13, -9]], [[4995, 4790], [5, -5], [-3, -31], [7, -17], [7, -8], [-2, -45], [-3, -6], [8, -12], [-3, -27], [3, -12], [-4, -6], [7, -21], [2, -15], [-4, -5], [2, -36], [-4, -10], [4, -17], [-3, -36], [6, -19], [1, -10], [11, -23]], [[5032, 4429], [-5, -19], [-7, -6], [-12, 2], [-8, -11], [-11, -10], [-12, -20], [-5, 0], [-16, -14], [-5, -10], [-10, -10], [-7, 13], [-21, 12], [0, 1], [8, 3]], [[4683, 4882], [-3, -16],
  [5, -12], [4, 0], [4, 13], [3, 0], [6, -22], [6, 16], [6, 7], [15, -14], [3, 11], [9, 12], [0, 11], [9, -8], [2, -23], [3, -11], [-1, -18], [11, -19], [-5, -19], [9, -9], [0, -34], [9, -20], [0, -7]], [[4764, 4533], [-6, 10], [-1, -13], [-6, -17], [-5, -5], [-3, 13], [-6, 3], [3, 14], [-5, 46], [-4, 16], [-11, -4], [-6, 4]], [[4714, 4600], [-8, -13], [-2, 15], [4, 11], [-3, 11], [0, 16], [-4, 3], [2, 16], [-5, 11], [-4, 20], [-8, 19], [-17, -1], [-7, -8], [-3, 4], [-7, -5], [-5, -32], [-7, -10], [-2, -13], [-8, -4]], [[4630, 4640], [1, 6], [-13, 53], [-20, 26], [-3, 20], [-3, 1], [-4, 28], [-6, 4]], [[4582, 4778], [10, 39], [4, 1], [7, 11], [7, -3], [8, 6], [0, 21], [-7, 10], [8, 9], [1, 15], [-2, 14]], [[4618, 4901], [18, -3], [9, -14], [11, -9], [8, 7], [19, 0]], [[4534, 4929], [-2, 20], [8, 18]], [[4540, 4967], [28, -1], [4, 14], [8, 3], [7, -4], [3, -10], [4, 3], [7, -15], [10, 9], [5, -11], [-1, -6], [-10, -8], [-5, 1], [-18, 18], [-3, 7], [-2, -12], [-17, -8], [0, -11], [-24,
  0], [-2, -7]], [[4582, 4778], [-10, 16], [-3, 12], [4, 17], [-5, 6], [-1, 13], [-11, -8], [0, 13], [-5, -2], [-12, 28], [-4, 3]], [[4535, 4876], [9, 3], [5, 6], [15, -1], [13, 17], [41, 0]], [[5272, 4062], [-13, 13], [8, 35], [5, 17], [0, 31]], [[5243, 4260], [5, -8], [-7, -32], [-6, 4], [6, 36], [2, 0]], [[5663, 6543], [8, 5], [3, -16], [19, 4], [2, -5], [12, -4], [8, 3], [2, -16], [7, 8], [6, -3], [-2, -11], [-17, -2], [-14, -5], [-10, 0], [-1, 11], [-9, 7], [-10, 1], [-14, 7], [1, 16], [9, 0]], [[5784, 6608], [-5, -25], [-8, -14], [-2, 20], [5, 13], [10, 6]], [[5571, 6755], [6, -29], [-13, 9], [7, 20]], [[5723, 6763], [3, -20], [-5, -10], [-3, 7], [5, 23]], [[5651, 6786], [11, -16], [8, -1], [1, -19], [5, -18], [6, 0], [-1, -13], [-5, 0], [-9, 30], [-11, 2], [0, 8], [-12, 22], [7, 5]], [[5733, 6816], [4, -24], [-11, 3], [-7, 8], [-1, 9], [13, 8], [2, -4]], [[5706, 6866], [-4, -15], [-6, 3], [-1, 10], [11, 2]], [[5586, 6926], [13, 1], [9, 17], [8, 4], [15, 1], [5, 12]], [[5731, 6
 988], [7, -8], [1, -16], [-8, -9], [1, -21], [-9, -16]], [[5723, 6918], [-4, 8], [-10, 1], [-14, 10], [-7, -11], [-6, 7], [-13, -16], [-8, 4], [-3, -6], [6, -24], [-7, -11], [-10, 2], [-8, 6], [-6, 13], [-4, -10], [-3, -22], [15, -40], [2, -16], [-9, 1], [5, -20], [-9, -12], [17, -15], [0, -9], [8, -3], [0, -3], [3, -7], [7, -3], [3, -43], [-3, -1], [-8, 19], [-12, 2], [-2, -26], [-12, -5], [10, -53], [-3, -20], [-6, 20], [-11, -9], [-6, 25], [-6, -2], [0, -15], [-7, 2], [-3, 24], [3, 10], [-4, 20], [-12, 19], [6, 14], [1, 13], [7, -4], [9, 13], [8, -11], [12, -8], [6, -9], [5, 17], [-17, 18], [-2, -6], [-11, 5], [-13, -9], [-4, 8], [-8, -4], [-2, 19], [-9, 33], [-11, 19], [-8, 26]], [[5582, 6922], [2, 3], [2, 1]], [[3961, 8721], [0, -14], [-16, -1], [0, 13], [11, 7], [5, -5]], [[3535, 9016], [20, -9], [5, -13], [-9, -11], [-40, -17], [-15, 7], [4, 16], [-21, 2], [-7, 8], [6, 13], [-1, 23], [10, 8], [33, -8], [15, -19]], [[4292, 9076], [5, -8], [-36, -10], [-41, -6], [28, 33], [11, 
 0], [27, 14], [6, -23]], [[4335, 9228], [22, -3], [12, -15], [1, -20], [17, -6], [-6, -11], [-41, 22], [-17, 12], [-4, 17], [16, 4]], [[4354, 9242], [38, -13], [-22, -14], [-14, 13], [-38, 1], [0, 7], [36, 6]], [[4333, 9262], [21, -8], [7, -10], [-41, -5], [-35, 11], [13, 16], [35, -4]], [[4418, 9339], [11, -1], [11, -18], [-31, -6], [-19, 9], [3, 10], [25, 6]], [[4505, 9403], [-11, -6], [11, -11], [-18, -7], [-13, 4], [2, 18], [29, 2]], [[4519, 9738], [-15, -17], [-18, -4], [-24, 13], [45, 16], [12, -8]], [[3576, 9882], [-54, 9], [20, 6], [34, -15]], [[3722, 9929], [44, -18], [-28, -15], [-40, 13], [-23, 20], [47, 0]], [[4105, 9999], [43, -1], [139, -22], [33, -28], [53, -8], [34, -12], [-31, -21], [-148, -19], [88, -6], [-3, -15], [39, 1], [3, 17], [50, 4], [11, -22], [-7, -19], [16, -11], [40, 14], [58, -10], [19, 24], [19, 6], [52, -1], [52, -13], [18, -13], [-54, -31], [-34, -2], [7, -15], [-31, -10], [-41, -5], [31, -13], [-18, -13], [-40, -4], [-44, 7], [-25, -27], [11, -13],
  [21, 0], [-10, -23], [17, -17], [-27, -9], [0, -14], [-28, -3], [1, -16], [-30, -63], [18, -1], [10, 21], [55, -25], [-10, -6], [-19, 11], [-14, -15], [9, -8], [46, -6], [7, -5], [-1, -27], [-11, -5], [-49, 13], [-36, -26], [7, -26], [18, 6], [27, -4], [7, -9], [-7, -14], [12, -14], [2, -37], [-13, -5], [-8, 14], [-18, -7], [9, -8], [-7, -22], [7, -11], [42, -14], [-11, -16], [-23, 1], [-4, 12], [-39, 0], [-19, -27], [24, -1], [25, -12], [4, -31], [-21, 0], [-28, -15], [-58, 22], [-25, -6], [-20, -19], [27, -9], [-13, -17], [23, -12], [4, -18], [25, -19], [31, -19], [6, -12], [-6, -19], [21, 2], [0, -45], [4, -9], [-11, -17], [-37, -5], [-16, 13], [-9, 33], [-12, 14], [-21, 8], [-4, -14], [-23, -15], [-42, -7], [-11, -28], [2, -9], [42, 8], [11, -7], [0, -13], [29, 15], [23, -13], [25, -8], [33, 0], [-6, -13], [-14, -1], [-17, -15], [-3, -14], [-8, 1], [-16, -21], [-27, -26], [-30, -12], [-14, -12], [-35, -7], [-42, -23], [-30, -5], [-17, 3], [-43, -40], [-3, -21], [-16, -23], [-1,
  -12], [-19, -28], [-26, -6], [-13, -25], [-13, 3], [-19, -15], [-16, 20], [-6, -7], [-6, -22], [-31, -4], [-9, 7], [-5, -8], [-3, -31], [-9, -9], [-11, 9], [-11, -19], [13, -14], [-5, -38], [7, -31], [-10, -5], [-5, -15], [-23, 1], [12, -17], [-8, -28], [-19, 0], [-8, -16], [9, -3], [4, -15], [-5, -25], [9, -1], [-9, -22], [3, -5], [-11, -24], [1, -19], [-6, -13], [4, -8], [-6, -14], [-13, -4], [9, -18], [-1, -11], [-23, 8], [-12, -3], [-5, -12], [-11, 4], [1, 32], [-7, -3], [-16, 15], [-6, 29], [-18, -5], [-6, -13], [-38, 3], [6, 14], [-6, 10], [-9, 1], [0, 13], [-9, 0], [-10, 17], [-4, 24], [-9, 5], [4, 17], [-13, 5], [-8, 12], [4, 20], [-12, 33], [-13, -3], [-3, 23], [-10, 13], [3, 22], [23, 46], [-20, 1], [-9, -24], [-14, -4], [0, 30], [6, 10], [-10, 19], [3, 10], [-11, 7], [4, 14], [-9, 12], [-13, 1], [2, 12], [-14, 20], [-1, 16], [7, 20], [22, 4], [-4, 14], [-24, 2], [-8, 12], [4, 24], [12, 8], [-9, 20], [15, 6], [0, 22], [16, 0], [18, -11], [20, 2], [-3, 15], [-31, -7], [-18
 , 10], [17, 13], [31, 3], [13, 9], [-8, 10], [3, 23], [16, -9], [7, 14], [-24, 1], [5, 9], [3, 26], [14, 14], [-56, 12], [-8, 11], [-17, 10], [-17, 2], [-20, 24], [16, 8], [43, -9], [25, -19], [8, 27], [-18, 15], [10, 21], [-20, -1], [-20, 9], [9, 18], [-28, 5], [-8, -22], [-19, -6], [-18, 2], [-17, 22], [17, 17], [-9, 5], [20, 18], [-7, 19], [13, 16], [-9, 19], [-13, 6], [6, 22], [-17, 21], [-7, 25], [-16, 13], [15, 12], [-24, 28], [-2, 12], [-30, 10], [6, 6], [-20, 16], [14, 9], [-24, 14], [-19, 19], [-28, 3], [-4, 11], [-27, 3], [-46, 13], [-48, -17], [-47, 9], [-11, -7], [-31, -2], [-34, 17], [21, 21], [-49, 10], [-19, 13], [12, 14], [50, 6], [21, 8], [44, -2], [20, 10], [-16, 13], [-27, -11], [-45, -5], [-29, 8], [-12, 16], [-17, -1], [-26, 12], [-18, 17], [8, 25], [90, 20], [9, 13], [51, 13], [36, -1], [29, 26], [-7, 25], [-21, 11], [-33, 4], [-11, 20], [19, 15], [46, 16], [9, 15], [37, 8], [13, 10], [41, -9], [16, 5], [-10, 14], [14, 10], [-18, 17], [79, 26], [115, 19], [25, 
 -19], [60, -15], [54, 3], [-31, 15], [-15, 26], [58, -4], [8, -7], [76, -23], [23, -18], [26, 4], [-20, 14], [11, 18], [23, 8], [-88, 40], [48, 15], [69, 8], [55, -21], [35, -2], [50, 14], [-29, 4], [0, 15], [111, 13], [69, 1]], [[2530, 5132], [8, -10], [5, 8], [6, -10]], [[2549, 5120], [-21, -42], [-4, -4], [-3, -15], [3, -12], [-7, -21]], [[2517, 5026], [-6, -6], [2, -7], [-16, -27], [0, -9]], [[2497, 4977], [-17, 14], [-17, 2], [-12, 16], [-14, 27]], [[2437, 5036], [3, 11], [0, 21], [2, 5], [-3, 16], [13, 56], [34, 0], [3, 25], [-7, 5], [-3, 19], [-9, 12], [-6, 19], [8, 5], [0, 40], [51, 0]], [[3409, 4384], [-2, -10], [1, -23], [-12, -2], [-5, -12], [2, -13], [-6, -35], [1, -12], [5, -24], [8, -22], [7, 3], [2, -35], [15, -63], [6, -6]], [[3312, 4364], [-17, 51], [3, 14], [4, 6], [-3, 25], [3, 13], [11, 3], [10, 13], [2, 12], [-10, 8], [1, 8], [-3, 14], [6, 21], [4, 0], [9, 17], [6, 17], [-6, 19]], [[3332, 4605], [6, -13], [2, 3], [16, -26], [14, -34], [6, -19], [-1, -22], [2, -9
 ], [10, -5], [25, -52], [0, -33], [-3, -11]], [[8172, 5611], [5, -8], [-1, -7], [-12, 1], [4, 12]], [[2691, 5068], [-8, 2], [-15, -19], [-15, -10], [-6, 4], [-2, 9], [-6, -4], [-1, -11], [-11, -33], [-11, -21], [-8, 14], [-9, -21], [-8, 2], [-2, -9], [2, -24], [-5, -5], [-4, -19], [-8, 0]], [[2574, 4923], [-5, 22], [-9, 9]], [[2560, 4954], [4, 29], [-3, 7], [-6, -3], [-2, 8], [-11, -9], [0, 9], [-10, 9], [-5, 16], [-10, 6]], [[2549, 5120], [2, -3], [7, 14], [5, 3], [6, -8], [4, 3], [13, -6], [15, 1], [13, 15], [11, -8], [14, 8], [9, -8], [0, -7], [10, 2], [15, -37], [11, -4], [7, -17]], [[5510, 7050], [2, -1]], [[5512, 7049], [1, -11]], [[5513, 7038], [-8, 15], [-15, 20]], [[5458, 7332], [9, -9], [4, -12], [10, -18], [7, -2], [8, -11], [15, -3], [7, 13], [6, 1]], [[5524, 7291], [7, -70], [-3, -7]], [[5528, 7214], [-5, 1]], [[5488, 7076], [-14, 22], [-6, 12], [-15, 10], [-8, -4], [-3, 13], [-13, 18], [-9, 19], [5, 12], [-12, 24], [1, 19], [-9, 24], [-7, 5], [-5, -26], [-9, -12], [-6,
  17], [-1, 30]], [[5377, 7259], [8, -4], [22, 7], [18, -6], [-2, 19], [12, 9], [-1, 27], [15, 12], [4, 12], [5, -3]], [[2977, 5334], [-13, 15], [2, 4], [10, -10], [1, -9]], [[3000, 5327], [-1, -5], [3, -3]], [[3006, 5287], [-8, 14], [-11, -1], [-12, -6], [-14, 8], [-8, -1], [-5, -9], [-9, 13], [-4, -1], [-4, 11], [1, 12], [8, 4], [13, -11], [4, 1], [22, -6], [3, 9], [7, -2], [2, 10], [-7, 8], [-7, 21], [2, 25], [-8, 13], [-10, 2], [-1, 11], [8, 10], [10, 1], [24, -19], [4, 3]], [[5614, 7469], [21, -33]], [[5635, 7436], [-4, -9], [-13, -8], [-8, -16], [-6, -27], [-4, -7], [-3, -21], [-5, -8], [-5, -24], [-9, -1], [-6, -10], [-10, -1]], [[5562, 7304], [-20, 4], [-7, -13], [-11, -4]], [[5458, 7332], [-7, 26], [-4, 0]], [[5476, 7440], [5, 0], [14, -18], [26, 5], [2, 16], [18, 5], [4, 8], [7, -7], [12, 11], [4, 17], [9, 4], [9, -6], [9, 5], [8, -16], [11, 5]], [[8426, 3230], [-4, -17], [-11, -8], [0, 11], [6, 4], [8, 16], [1, -6]], [[8333, 3318], [6, -11], [1, -10], [6, 0], [9, -32], [-1
 0, -16], [-8, 7], [-5, 16], [-14, 18], [-2, -3], [-10, 8], [-3, 7], [6, 14], [13, 3], [11, -1]], [[8473, 3309], [-2, -13], [-16, -36], [-8, -1], [-8, -14], [-9, 2], [5, 52], [9, 20]], [[8444, 3319], [8, -11], [4, 22]], [[8456, 3330], [13, 16]], [[8469, 3346], [5, -2], [1, -14], [-5, -4], [3, -17]], [[8242, 3387], [-7, -38], [-14, 2], [2, 13], [-1, 19], [10, 18], [7, -5], [3, -9]], [[8442, 3398], [-15, -25], [-1, 13], [12, 16], [4, -4]], [[8858, 3390], [-10, -1], [4, 13], [4, 0], [2, -12]], [[8459, 3406], [15, -2], [1, -14], [-20, -8], [-2, 4], [3, 19], [3, 1]], [[8276, 3408], [5, -2], [4, -17], [4, 8], [15, -4], [2, -23], [-8, -6], [0, -6], [-8, -5], [-5, 8], [-4, -8], [-11, -3], [-12, -11], [-9, -3], [-6, 6], [0, 31], [12, 17], [6, -8], [4, 4], [7, -22], [4, -2], [5, 18], [-4, 1], [-8, 18], [7, 9]], [[8415, 3404], [1, -13], [-3, -2], [-3, -18], [-11, -9], [-8, 1], [-9, -11], [-11, 6], [-1, -9], [-12, 0], [-9, 9], [-20, -1], [-1, 19], [12, 20], [9, 3], [4, -7], [7, -1], [14, -19], [
 5, 7], [10, -1], [7, -8], [6, 4], [3, 13], [8, 8], [2, 9]], [[8208, 3403], [5, -15], [-3, -9], [-7, -9], [-3, -9], [-8, 21], [-8, 5], [-6, 21], [12, -7], [10, 10], [8, -8]], [[8604, 3429], [2, -9], [-2, -9], [-5, 10], [5, 8]], [[8519, 3439], [-7, -21], [-18, 7], [4, 13], [10, -1], [9, 10], [2, -8]], [[8857, 3412], [-6, -9], [-6, -15], [-17, 0], [-6, -3], [4, 25], [7, 33], [6, 11], [11, 7], [5, -1], [7, -14], [-5, -34]], [[8656, 3475], [1, -18], [-1, -13], [-8, -25], [-7, -4], [-1, 10], [5, 28], [8, 22], [3, 0]], [[8166, 3496], [3, -8], [-8, -10], [-4, 1], [-4, -9], [-11, 1], [-12, 5], [4, 18], [6, 2], [26, 0]], [[8738, 3529], [-2, -7], [-5, 10], [3, 6], [4, -9]], [[8733, 3527], [2, -14], [-9, -20], [-3, 7], [2, 46], [8, -19]], [[8726, 3559], [6, -20], [-1, -4], [-6, 15], [1, 9]], [[7948, 3558], [3, 5], [6, -6], [14, -4], [2, 12], [8, -4], [3, -12], [6, -7], [4, 3], [8, -9], [3, 6], [9, -18], [2, -20], [9, -6], [2, 4], [10, -6], [5, 3], [10, -6], [8, 2], [8, -4], [5, 19], [0, 13], [7
 , 7], [4, -4], [3, -17], [7, 0], [2, 5], [7, -11], [7, 0], [2, -8], [15, -1], [3, -25], [3, -1], [-2, -19], [15, -19], [7, 7], [7, -2], [6, 8], [13, -16], [-3, -41], [6, -26], [-6, 2], [-2, 9], [-5, -2], [-10, 8], [-15, 18], [-15, -12], [-9, 8], [-15, 6], [-4, -8], [-6, 6], [-8, 0], [-19, 12], [-12, 17], [-19, 12], [-23, 1], [-6, -9], [-18, 12], [-7, 12], [-25, 6], [-4, 7], [5, 23], [-7, 0], [-9, 12], [-14, -3], [-1, 4], [10, 21], [3, 32], [4, 14], [3, -10]], [[8737, 3600], [5, -20], [1, -27], [-5, -21], [-7, 11], [-2, 10], [2, 27], [4, 19], [2, 1]], [[8386, 3624], [4, -7], [0, -17], [-3, -3], [-4, 15], [3, 12]], [[8410, 3635], [-4, -10], [0, -17], [-3, -8], [-7, 4], [3, 22], [-2, 17], [2, 7], [9, 6], [2, -21]], [[8422, 3654], [-5, -5], [-2, -18], [7, -22], [-8, -16], [-3, -11], [-5, 1], [-2, 11], [5, 22], [4, 53], [3, 6], [6, -21]], [[8418, 3703], [5, -7], [-5, -10], [-4, 13], [4, 4]], [[8225, 3701], [-3, 27], [3, 24], [4, 7], [1, -49], [-5, -9]], [[8523, 3767], [7, -7], [4, -13], 
 [0, -16], [-14, -18], [-16, 18], [-5, 26], [12, 13], [12, -3]], [[8598, 3790], [14, -15], [8, 1], [6, -10], [3, -20], [6, -13], [-2, -18], [-6, 4], [-5, 10], [-12, 13], [-3, 9], [-9, 2], [-2, -12], [-10, 9], [-5, -1], [-2, 11], [-5, -16], [-6, -3], [-11, 33], [3, 11], [19, 0], [5, 4], [2, -11], [12, 12]], [[7790, 3770], [-3, -4], [-5, 11], [1, 14], [7, -21]], [[7995, 3807], [6, -3], [6, -12], [-3, -27], [-5, -8], [-4, 7], [-6, -7], [-1, 17], [2, 32], [5, 1]], [[8620, 3868], [2, -11], [-1, -11], [-7, -4], [-12, 13], [9, 9], [9, 4]], [[8458, 3873], [21, -7], [1, -10], [-13, -2], [-12, -8], [-2, 13], [1, 11], [4, 3]], [[8762, 3876], [20, -5], [6, -5], [8, 0], [-1, -11], [-11, -2], [-22, 23]], [[7940, 3883], [5, -7], [3, -21], [3, -34], [2, -8], [10, -5], [-2, -29], [-5, -3], [-13, 11], [-1, 24], [-3, 7], [-1, 16], [-6, 8], [-8, -5], [-4, 4], [0, 10], [6, 8], [0, 13], [6, 9], [8, 2]], [[8550, 3887], [8, -10], [-2, -10], [-14, -1], [-5, 7], [7, 22], [6, -8]], [[8421, 3907], [10, -8], [0,
  -12], [-10, -4], [-1, 13], [-8, -20], [-1, 10], [2, 19], [8, 2]], [[8044, 3920], [5, -11], [-9, -12], [0, 21], [4, 2]], [[7747, 3923], [7, -34], [2, -26], [-4, -2], [-6, 9], [-8, 34], [2, 17], [7, 2]], [[8636, 3924], [4, -4], [-2, -27], [-6, 8], [-4, 18], [8, 5]], [[8761, 3943], [12, -3], [6, -12], [6, -23], [-11, 0], [-3, 22], [-4, -1], [-7, 12], [1, 5]], [[8915, 3803], [0, -143], [0, -125], [-3, -26], [3, -14], [0, -77], [0, -82]], [[8915, 3336], [-3, 4], [-10, 29], [-13, 29], [-3, 9], [-16, -6], [-4, 9], [-8, -16], [-2, 11], [4, 20], [3, 22], [-11, 26], [2, 6], [-6, 12], [7, 10], [-10, 29], [-5, 37], [-6, 12], [0, 11], [-4, 13], [-15, 25], [-15, 8], [-13, 18], [-11, 11], [-15, 7], [-6, -2], [-11, 14], [-11, 25], [-3, -8], [-4, 17], [-6, -4], [-10, 20], [-5, -11], [1, -9], [-5, -15], [-8, -4], [-7, 31], [6, 9], [-7, 15], [-4, 17], [-6, 11], [-9, 3], [5, 17], [11, -3], [4, -7], [9, 24], [3, 4], [12, -8], [6, 4], [4, 13], [-3, 11], [-5, -6], [-10, 2], [-17, -7], [-4, 8], [-6, -6], 
 [-7, 12], [-3, 10], [-2, 30], [-16, 6], [-3, -4], [-7, 5], [2, 13], [6, 14], [0, 18], [18, 10], [6, 15], [9, 9], [7, -1], [13, -12], [6, -14], [17, 0], [3, -6], [-2, -11], [7, -28], [-5, -24], [3, -50], [8, -14], [5, 1], [1, -28], [4, -4], [-1, -9], [5, -14], [13, -2], [8, 20], [4, 7], [2, 15], [8, 15], [4, 25], [10, -2], [13, 12], [-3, 14], [1, 7], [18, 22], [8, -10], [16, -12], [4, -10], [29, -32], [7, 3], [6, -9], [2, 4], [10, -7], [0, -8], [6, 0]], [[7903, 3962], [-1, -16], [-7, 10], [2, 8], [6, -2]], [[8544, 3960], [0, -15], [8, -10], [-4, -8], [-13, 26], [1, 13], [8, -6]], [[8633, 3990], [13, -11], [-1, -17], [-22, 8], [-2, 9], [12, 11]], [[7904, 3991], [5, -16], [-6, -4], [-3, 6], [4, 14]], [[7850, 4062], [4, 1], [7, -12], [-13, -5], [2, 16]], [[7861, 4065], [-6, -1], [0, 10], [6, -9]], [[7905, 4076], [1, -7], [-1, -19], [-3, 2], [-3, 25], [6, -1]], [[7845, 4059], [-6, 10], [0, 22], [7, -12], [-1, -20]], [[7704, 4099], [3, -3], [6, -21], [7, -14], [-2, -25], [-5, -5], [-2, 18
 ], [-7, 10], [-3, 22], [-4, 9], [7, 9]], [[8473, 4111], [3, -1], [2, -13], [-3, -5], [-6, -32], [-7, -12], [-4, -19], [-5, -10], [-16, -6], [-15, 1], [-4, 13], [-3, -2], [-18, 1], [-14, -5], [-4, 7], [-22, -7], [-6, 7], [-8, -3], [-7, -22], [-4, -28], [3, -32], [4, -17], [5, -1], [5, -14], [2, -21], [5, 4], [6, -6], [12, 40], [5, 4], [1, -9], [11, 1], [3, 11], [19, 0], [-2, 11], [11, 3], [6, -13], [-2, -18], [-4, -1], [-4, 10], [-7, -3], [-13, -41], [-5, -9], [-11, -7], [-7, -25], [1, -7], [7, -9], [5, -29], [9, -17], [1, -21], [-4, -24], [1, -8], [11, -16], [1, -17], [6, -5], [0, -14], [-4, -7], [-4, 6], [-14, -9], [-3, -24], [-8, 2], [-6, 13], [1, 30], [3, 10], [-8, 9], [-13, 31], [0, 7], [5, 18], [1, 20], [-3, 18], [-6, 3], [-15, -24], [4, -19], [2, -37], [-3, -14], [1, -33], [2, -17], [-4, -18], [-1, -20], [3, -13], [-2, -13], [-6, -6], [-5, 2], [-3, -9], [-6, 3], [-6, 18], [0, 15], [4, 22], [-1, 10], [4, 31], [-1, 25], [-4, 18], [2, 16], [-6, 5], [-10, -10], [-5, 34], [2, 34], 
 [2, -2], [7, 15], [-1, 17], [3, 14], [3, 3], [0, 54], [3, 8], [3, 18], [4, 8], [5, -3], [-3, 22], [1, 27], [2, 12], [-2, 12], [3, 17], [3, 3], [1, 17], [8, 8], [6, -6], [7, 21], [0, 17], [3, 3], [14, -8], [6, -12], [8, 2], [9, -6], [6, 1], [11, -15], [3, 10], [11, -2], [13, -7], [13, 15], [2, 10], [6, 1], [-1, 12], [8, 9], [0, 7], [6, 7]], [[7825, 4138], [0, -20], [-4, -5], [-5, 16], [1, 10], [8, -1]], [[8556, 4148], [-5, -27], [4, -7], [1, -13], [-4, -28], [-7, -11], [4, -14], [4, 15], [7, 13], [-1, 8], [6, 14], [10, 5], [-1, -36], [-11, -12], [-2, -9], [2, -8], [11, -9], [0, -14], [-12, 3], [-8, 7], [-3, -13], [1, -23], [4, -29], [5, -21], [-5, 0], [-5, 25], [-5, 10], [1, 36], [-5, 20], [2, 20], [-6, 29], [4, 17], [1, 20], [9, 30], [4, 2]], [[8571, 4178], [3, -13], [-4, -23], [-6, -5], [-4, 16], [8, 24], [3, 1]], [[7663, 4199], [16, -39], [-5, 1], [-6, 15], [-4, 1], [-6, 13], [5, 9]], [[8008, 4284], [2, -15], [-2, -14], [-6, 1], [-3, 23], [6, 16], [3, -11]], [[8265, 4289], [-3, -5
 ], [6, -12], [4, -16], [-9, -6], [-8, 2], [3, -15], [4, 0], [-3, -18], [7, -7], [1, -20], [4, -4], [1, -10], [7, -25], [-6, -16], [0, -11], [7, -17], [9, -12], [16, -38], [-6, -11], [-13, 4], [-14, -3], [-9, -39], [1, -22], [-3, -17], [5, -11], [-2, -20], [2, -6], [-10, -9], [-6, -21], [-6, -4], [-8, -16], [-2, -23], [-1, -29], [5, -2], [-2, -20], [-4, -10], [0, -13], [-6, -25], [-5, -31], [-38, -41], [0, 35], [-4, 15], [-6, 9], [-6, 0], [-11, -7], [-1, 19], [-7, -4], [-9, 18], [0, -12], [-12, -19], [-8, 8], [-5, -5], [-6, -13], [-3, 1], [1, 35], [-2, 11], [-5, -7], [-8, 5], [-7, -9], [-8, 3], [-7, 11], [-7, -10], [-1, 34], [-4, 24], [0, 20], [-5, 7], [4, 13], [1, 15], [-4, 24], [-12, 18], [-6, 0], [-1, 19], [-4, 6], [-1, 16], [3, 5], [0, 23], [-7, 17], [0, 21], [-2, 14], [3, 12], [-1, 10], [5, 30], [7, 18], [-1, 9], [9, 11]], [[8045, 4140], [-3, -14], [3, -18], [5, -17], [9, -16], [3, -13], [8, -11], [8, 11], [10, 5], [4, -4], [13, 0], [8, 10], [2, 21], [8, 9], [16, -2], [2, -8], [
 15, -14], [7, 15], [7, -1], [7, 5], [3, -5], [4, 19], [0, 9], [5, 6], [-2, 25], [10, 16], [-2, 25], [5, 16], [7, -1], [1, 23], [2, 7], [-1, 32], [3, 20], [6, 13], [4, -6], [3, 8], [7, -6], [9, 5], [14, -1], [10, -14]], [[8523, 4313], [2, -15], [-5, -21], [-2, 3], [2, 36], [3, -3]], [[7652, 4393], [11, -7], [6, -16], [15, -5], [9, 4], [8, -8], [6, 7], [12, -26], [4, -24], [6, -10], [1, -25], [10, -11], [4, -14], [4, -4], [22, -35], [6, -17], [3, -22], [4, 5], [5, -26], [5, -14], [6, 1], [1, 6], [6, 3], [7, -18], [2, -19], [11, -10], [10, -18], [3, -29], [6, -15], [12, -4], [5, -20], [8, 7], [10, -16], [2, -24], [-8, -7], [-3, -44], [13, -22], [3, 4], [7, -7], [5, 3], [4, -59], [4, -13], [3, 3], [3, -21], [20, -8], [0, -11], [4, -10], [1, -12], [6, -8], [2, -21], [-4, -8], [-3, -22], [3, -11], [-4, -29], [3, -17], [-3, -98], [-5, 2], [-8, 24], [-4, -8], [-1, -15], [-15, 22], [-2, -5], [0, -21], [-18, 45], [-5, 19], [-9, 10], [-6, 14], [-7, 9], [-6, 16], [-11, 20], [-2, 25], [-17, 29],
  [-8, 36], [-6, 11], [-8, 32], [2, 8], [-9, 43], [0, 8], [-6, 15], [-2, 22], [-13, 37], [-2, 19], [-4, 9], [-13, 13], [-1, 25], [-10, 66], [2, 10], [-8, 18], [-7, 8], [-9, 16], [-6, 1], [-2, 10], [-2, 32], [-5, 5], [-4, 20], [-7, 22], [-7, 17], [-9, 5], [-7, 22], [-5, 7], [-16, 43], [-6, 34], [0, 18], [8, 4]], [[4872, 7877], [-3, 10], [7, 13], [4, -9], [-8, -14]], [[7606, 4509], [2, -15], [-1, -15], [-6, 15], [0, 12], [5, 3]], [[7571, 4766], [0, -15], [-6, -3], [0, 17], [6, 1]], [[7583, 4965], [2, -22], [-2, -16], [-2, 1], [1, -38], [-2, -23], [-4, -9], [1, -15], [-5, -20], [-2, 22], [3, 10], [2, 24], [0, 32], [2, 3], [1, 34], [5, 17]], [[7249, 6160], [-4, -4], [-10, -24], [-8, -28], [2, -7], [-6, -34], [8, -16], [4, 4], [11, -16], [7, -6], [5, -18], [16, -19], [4, 4], [10, -17], [7, 2], [3, -15], [17, -2], [12, -7], [8, 10], [6, -9], [8, -4], [1, -21], [15, -13], [3, -8], [9, 8], [6, -20], [5, 6], [8, -3], [12, -15], [9, 12], [1, -10], [7, -6], [15, 8], [6, -1], [2, 21], [-5, 26], 
 [1, 28], [4, 20], [-1, 6]], [[7703, 6018], [0, -23], [-3, 0], [-10, -20], [1, -15], [-4, -5], [-17, -6], [-21, -41], [-5, -1], [-5, -14], [0, -17], [3, -14], [-4, -9], [0, -13], [-11, -25], [-1, -11], [4, -15], [-12, -51], [-5, -34], [-13, 12], [-5, -4], [-2, -60], [-7, -9], [-1, -16], [2, -28], [0, -14], [-4, 1], [-1, -15], [-8, 11], [-3, -12]], [[7473, 5581], [-1, -15], [1, -23], [-5, 3], [-3, -7], [-9, 5], [-5, -5], [-3, 29], [-13, -22], [-13, -7], [-8, -16], [-3, -11], [5, -37], [-7, -14], [-1, -13], [-6, -7], [-6, -20], [-20, -12], [-3, 12], [-8, -21], [3, -6], [-11, -23], [-13, -42], [-9, -26], [-13, -16], [-11, -32], [-21, -28], [-5, -13], [2, -16], [-1, -16], [-16, -19], [-9, 5], [-5, -5], [-2, -24], [-5, -10], [-12, 2], [-8, -14], [-5, -27], [-1, -21], [4, -32], [-2, -22], [3, -36], [-5, -10], [8, -19], [-3, -49], [-4, -23], [-6, -24], [-3, -32], [2, -30], [0, -63], [-12, 3], [-5, -11], [1, -8], [-8, -28], [-2, -14], [2, -14], [-15, -12], [-5, -10], [-5, -43], [-16, -21], [
 -5, 3], [-9, 18], [-12, 39], [-7, 41], [-1, 23], [2, 8], [-5, 13], [-3, 30], [-4, 18], [-2, 24], [-9, 43], [-11, 37], [-8, 47], [-6, 69], [-3, 13], [-7, 50], [-4, 6], [-6, 21], [0, 19], [-3, 4], [-3, 22], [-7, 26], [-2, 26], [-3, 63], [-7, 56], [-6, 65], [0, 25], [-4, 36], [3, 32], [4, 16], [-1, 39], [-8, 24], [6, 21], [-7, 3], [-1, 37], [-5, 0], [0, -11], [-5, -11], [5, -20], [-6, -32], [-31, -35], [-12, 7], [-14, 24], [-12, 34], [-12, 26], [-7, 22], [2, 10], [6, -2], [0, -9], [11, 6], [10, 13], [6, 2], [6, 27], [-4, 3], [-12, -9], [-3, -8], [-13, 7], [-11, 13], [-9, 18], [1, 5], [-10, 23], [-1, 13]], [[6893, 5704], [7, 9], [8, -1], [0, 24], [7, -3], [17, 2], [3, -6], [8, -2], [4, 10], [11, 8], [1, -9], [9, -2], [5, 30], [-5, 33], [-6, 21], [-1, 19], [-10, 0], [-5, 20], [2, 40], [-9, 3], [-10, 17], [3, 27], [12, 30], [2, 14], [7, 15], [8, -6], [6, -16], [13, 11], [15, 7], [1, 10], [7, 19], [7, 31], [14, 17], [10, 37], [3, 28], [11, 9], [5, 10], [-3, 11], [6, 13], [8, 27], [8, 11], 
 [-3, 9], [3, 19], [-4, 19], [10, 23], [9, 4], [6, 13], [-10, 14], [-8, 0], [-2, 19], [-10, 6], [1, 12], [-9, 14], [4, 27], [-5, 7], [2, 13], [-3, 13], [2, 14], [-6, 12], [4, 20], [10, 9], [29, -15], [12, -4], [7, 12], [15, 4], [10, 14], [4, 13]], [[7140, 6513], [20, 28]], [[4825, 7878], [5, -38], [3, -44], [-6, -30], [-7, -16], [-12, -12], [-15, -2], [-4, -10], [-31, -25], [-18, -12], [-19, 9], [-7, 28], [10, 6], [3, 38], [9, 11], [6, 29], [-21, 17], [-3, 11], [6, 4], [0, 12], [8, 4], [-13, 29], [7, 7], [34, -5], [-1, 8], [10, 8], [-2, 9], [-8, 1], [11, 39], [28, 14], [9, -10], [-9, -10]], [[6560, 5924], [-7, -15], [-4, 7], [3, 8], [8, 0]], [[6357, 6752], [2, -36], [5, -22], [9, -9], [19, -7], [10, -26], [16, -22], [23, -11], [44, 22], [15, -5], [-3, 38]], [[6497, 6674], [8, -2], [16, 14], [2, 18], [16, 22], [8, 4], [16, -3], [4, 12], [8, 1], [9, -6], [5, 6], [3, -21], [10, -4], [13, -10], [6, -11], [12, 5], [15, -14], [1, -13], [5, -10], [13, -11], [9, -28], [20, 1], [2, -17], [3, 
 -57]], [[6689, 6136], [13, -33], [8, -38], [9, -24], [13, -8], [6, -14], [4, 2], [0, -19], [2, -36], [0, -19], [12, -1], [1, -23], [-4, -19], [-11, 1], [-12, -10], [-2, -11], [-10, -8], [-3, -29], [-3, -5], [-2, -41]], [[6710, 5801], [-5, -10], [-10, 11], [-11, 5], [-3, 12], [-18, -8], [-12, 9], [-12, -4], [-6, 11], [-11, 4], [-7, -5], [-6, 11], [-5, -5], [-1, 9], [-11, 2], [-5, 22], [2, 6], [-4, 20], [-2, 29], [-6, 21], [-12, 4], [-7, -3], [-5, -10], [-7, -1], [-5, -17], [-6, 2], [-13, -22], [-12, 8], [-2, 8], [-17, 0], [-8, 20], [-9, 7], [-14, 22], [-4, 18], [-12, 13], [-12, 2], [-5, 10], [-7, 29], [-2, 24], [-5, 7], [-1, 22], [-6, 1], [0, 22], [-14, 35], [-2, 18], [-4, 1], [-9, -13], [-3, 9], [-7, 0], [-10, 14], [2, -19], [-12, -9]], [[6347, 6143], [-3, 19], [-11, 17], [0, 37], [-9, 2], [0, 29], [4, 26], [-14, 50], [-6, 0], [-11, 21], [-12, 15], [-5, -1], [1, 22], [-7, 27], [-4, -3], [-7, 25], [2, 24], [-4, 13], [14, 46], [6, 1], [1, 8], [-6, 20], [3, 26], [-7, -3], [-10, 14], [-
 3, -2], [-3, 30], [-7, 10], [0, 15], [-4, 3], [1, 17], [-3, 8]], [[6243, 6659], [1, 11], [-7, 11], [1, 20], [-10, 18], [6, 25], [-4, 5], [-1, 33], [-5, 25], [-1, 15], [10, 2], [4, 24], [7, -9]], [[6347, 6143], [-8, 5], [-8, -2]], [[6331, 6146], [-7, 7], [-9, 0], [-7, -10], [-7, -37], [-9, -25]], [[6292, 6081], [-5, -2], [-46, 10], [-22, 40], [-29, 53], [-22, 42], [-46, 60], [-35, 14]], [[6087, 6298], [-3, 28], [-8, 62]], [[6076, 6388], [54, 69], [8, 7], [6, 25], [0, 30], [4, 34], [-3, 27], [1, 23], [4, 12], [12, 7], [15, 32], [-1, 3]], [[6176, 6657], [6, 3], [4, 15], [10, 1], [11, -9], [12, -2], [2, 7], [7, -5], [-1, -12], [3, -7], [8, 13], [5, -2]], [[4554, 8772], [9, -22], [18, -13], [11, 0], [-5, -23], [27, -8], [7, -8], [-1, -26], [4, -7], [-9, -18], [-16, -12], [-16, -27], [-11, 5], [-17, -13], [-17, -20], [-35, -9], [-2, -16], [-22, -9], [-28, 11], [-11, -1], [-17, 20], [-11, 5], [-14, -4], [-19, 3], [15, 21], [-15, 28], [1, 15], [-36, 4], [-10, -4], [-3, 10], [23, 2], [19, 18
 ], [8, 19], [-7, 6], [-24, -1], [-14, -8], [-18, 8], [14, 12], [7, 28], [26, 29], [16, -7], [26, -28], [-1, -36], [24, 1], [7, 18], [-5, 20], [7, 8], [15, -27], [8, 24], [16, 7], [24, -3], [14, -11], [5, 14], [20, -1], [-1, 24], [14, 2]], [[5993, 6343], [-6, -7], [0, -18]], [[5987, 6318], [-10, 11], [-4, -6], [-3, -20], [1, -17], [6, -10], [-6, -13], [-3, -17], [8, -2], [7, 9]], [[5983, 6253], [0, -12]], [[5983, 6241], [0, -6], [1, -10], [-8, -48], [0, -20], [-6, -43]], [[5970, 6114], [-2, -5]], [[5951, 6233], [8, 22], [-2, 5]], [[5957, 6260], [7, 26], [3, 24], [3, 38], [3, 4], [2, 16]], [[5975, 6368], [10, 0], [9, 23]], [[5994, 6391], [2, -33], [-3, -15]], [[5434, 6740], [-12, -37], [-3, -31], [6, -21], [-4, -6], [-3, -20], [-16, 9], [-6, 18], [-11, 4], [-26, 34], [-8, 0], [-6, 17], [2, 15], [6, 8], [5, -7], [5, 12], [6, 2], [14, -18], [6, 6], [7, -3], [18, 13], [5, -5], [11, 12], [4, -2]], [[5256, 6955], [9, -10], [0, -13], [7, -30], [-5, -18], [3, -13], [-5, -68], [-13, 5], [-2, 
 -16], [-5, -8], [-7, 2], [-6, 23], [3, 25], [-2, 24], [2, 14], [-5, 34], [-4, 0], [2, 24], [8, -6], [7, 6], [13, 25]], [[5380, 7333], [-9, -16], [7, -8], [-1, -27], [8, -13], [-5, -2]], [[5380, 7267], [1, 8], [-14, 5], [-20, -22], [-7, -1], [-3, -14], [11, -21], [-8, -16], [3, -36], [10, -19], [6, -6], [19, -26], [12, -67], [19, -37], [11, -11], [9, -2], [16, 2], [4, -11], [-7, -10], [3, -16], [15, -15], [13, -9], [12, -19], [15, -12], [14, -39], [-4, -23], [-9, 8], [-6, 28], [-9, 1], [-13, 15], [-4, -5], [-8, -26], [-3, -29], [18, -20], [-1, -34], [-8, -1], [-8, -14], [1, -21], [-11, -21], [-3, -14], [-11, 2], [-1, 19], [7, 17], [-1, 13], [9, 7], [1, 11], [-4, 12], [-2, 26], [-4, 9], [-2, 22], [-5, 15], [-7, -5], [-12, 17], [2, 11], [-7, 20], [-6, -4], [-6, 16], [-7, 0], [-9, 30], [-11, 3], [-8, -5], [-4, 12], [-8, 5], [-11, 20], [-2, 12], [-9, 9], [-5, 18], [-13, 11], [-5, 20], [-14, 16], [1, 15], [-6, 24], [-1, 24], [-5, 14], [-8, 4], [-16, 21], [-14, 5], [-7, -9], [-9, -25], [-5
 , -7], [-13, -5]], [[2849, 5317], [15, -4], [3, -9], [12, -9], [3, -15], [-2, -6], [-8, 1], [-7, 8], [-3, -11], [-4, 5], [-3, -14], [-6, 11], [-8, -1], [-10, 25], [-8, 5], [4, 13], [9, 5], [13, -4]], [[6087, 6298], [-5, -9], [-56, -36], [28, -71], [-9, -13], [-5, -23], [-20, -10], [-7, -26], [-13, -22], [-30, 12]], [[5970, 6100], [0, 14]], [[5983, 6241], [4, 2], [0, 30]], [[5987, 6273], [0, 45]], [[5993, 6343], [8, -16], [9, -9], [12, -5], [54, 75]], [[8563, 5909], [-7, -11], [-7, -23], [-2, 15], [6, 7], [8, 19], [2, -7]], [[8624, 6180], [5, -7], [-7, -10], [-1, 11], [3, 6]], [[8616, 6327], [-2, -18], [-4, 6], [1, 12], [5, 0]], [[8638, 6426], [2, -17], [10, -5], [2, 6], [6, -7], [-1, -12], [-5, -10], [10, -5], [4, -28], [-3, -2], [-7, -23], [-6, -42], [1, -8], [-3, -27], [-12, -20], [-5, 1], [1, 16], [-2, 8], [3, 16], [-6, 0], [-2, -12], [3, -24], [-12, 5], [4, 27], [-5, 12], [0, 22], [3, 0], [8, 24], [2, 13], [-6, 34], [-5, 7], [-3, -6], [6, -30], [-5, -7], [-6, 11], [-3, -7], [-6,
  24], [3, 6], [-5, 11], [2, 11], [5, -1], [16, 18], [3, 18], [5, 6], [9, -3]], [[8726, 6460], [8, -11], [5, 1], [0, -32], [-10, -20], [-2, -18], [-8, 17], [-5, 3], [-13, -13], [0, -10], [-7, -14], [0, -11], [-6, -9], [-9, 14], [2, 21], [-4, 6], [0, 16], [8, 13], [2, 20], [7, 4], [4, -8], [10, 2], [3, 16], [9, 14], [6, -1]], [[8845, 6726], [1, -13], [-6, -6], [-1, 21], [6, -2]], [[8923, 6962], [5, -3], [0, -46], [8, -21], [6, -27], [3, -33], [-3, -6], [-1, -25], [-7, -9], [-6, -44], [-10, 0], [-3, -15], [-1, -20], [2, -12], [1, -25], [-2, -29], [-5, -6], [-6, -43], [2, -20], [5, -19], [-10, -13], [-2, -26], [-15, -14], [-1, 23], [7, 20], [-7, 2], [-1, -9], [-7, -14], [-11, -6], [0, -26], [-8, -20], [-3, 10], [2, 28], [-7, -2], [-5, -12], [-5, -23], [-4, 4], [-17, 1], [-4, 9], [-12, 2], [-4, 14], [-5, -18], [0, -11], [10, -13], [-2, -9], [-9, -3], [-6, -8], [-1, -13], [-4, -6], [-4, -22], [-6, -8], [-9, 5], [-8, 24], [1, 18], [-3, 10], [10, 21], [-5, 6], [-8, 0], [-6, 9], [-14, -4], [
 -8, -19], [-7, 5], [-13, -7], [-2, -9], [-9, 1], [-8, -7], [-1, 11], [-8, -9], [0, -18], [-5, -7], [-8, 12], [-13, -10], [-12, 14], [3, 23], [13, -1], [5, 17], [5, 2], [17, 35], [7, 9], [-1, 10], [13, 12], [9, -11], [23, 7], [8, 9], [11, -2], [8, 9], [1, -17], [11, -4], [13, 21], [-4, 14], [5, 18], [8, 15], [9, 32], [-2, 22], [2, 13], [15, 12], [-2, -17], [-7, -30], [10, -8], [3, 12], [22, 18], [9, 14], [8, 33], [13, 15], [3, 9], [5, 35], [5, 12], [7, 49], [0, 23], [-6, 10], [4, 12], [2, 16], [-5, 17], [5, 13], [6, 1], [3, 34], [6, -3], [3, -23], [14, 1], [1, 24], [-11, -8], [2, 27], [10, -11]], [[8944, 7257], [27, -63], [20, -28], [2, -7], [12, 1], [6, -12], [11, 0], [10, 19], [5, 0], [-8, -32], [7, -28], [4, -8], [-20, -24], [-16, 4], [-15, -23], [-8, -25], [-3, -27], [-8, 12], [-14, 12], [-8, 14], [-12, 11], [-8, -4], [-12, -18], [-8, 18], [-9, -4], [-3, -18], [7, -11], [5, 2], [13, -25], [-5, -5], [-10, 7], [-7, -22], [-5, -8], [-6, 12], [4, 30], [-10, 19], [3, 30], [10, 7], [8,
  18], [-6, 14], [5, 12], [8, -13], [10, -4], [8, 16], [-3, 26], [9, 16], [0, 24], [4, 23], [-2, 26], [-4, 15], [3, 17], [9, 4]], [[6762, 7265], [-7, 1], [-8, 12], [-3, 22], [6, 17], [15, 6], [8, -12], [3, -23], [-6, -16], [-8, -7]], [[7140, 6513], [-8, 39]], [[6651, 7234], [-20, 24]], [[6631, 7258], [10, 25], [8, -19], [2, -30]], [[7227, 7022], [-8, 17], [-13, 3], [-8, 23], [-3, -2], [-15, 8], [-36, 3], [-7, 6], [-15, -8], [-18, 3], [-3, -9], [-13, 4], [-13, 10], [-13, 16], [-17, -11], [-9, -41], [-13, 4], [-4, 7], [-24, 13], [-12, -2], [-11, -17], [-5, -19], [3, -4]], [[6970, 7026], [-6, -3], [-3, -13], [-5, 5], [-15, -27], [-8, -3], [-16, -22], [0, -11], [-8, -11], [-6, -16], [3, -12], [-5, -6], [-11, 14], [2, 15], [-6, 15], [-31, -4], [-3, 4], [-5, 57], [-14, 0], [2, 72], [-8, -8], [-8, 30], [-7, 8], [-8, 20], [-15, -10], [-34, 5], [-33, -10], [-24, 49], [-3, 16], [-27, 33]], [[6668, 7213], [0, 37], [-1, 15], [-9, 3], [5, 21], [15, -5], [10, 21], [11, 8], [2, 15], [-9, 3], [-20, 
 15], [-6, -10], [4, -13], [6, 3], [13, -12], [-5, -13], [-17, 4], [-8, -4], [-3, -21], [-12, 0], [4, 14], [-17, -6], [-4, -25]], [[6627, 7263], [-2, 1], [-71, -40], [0, -99], [0, -66], [0, -99]], [[6554, 6960], [-15, -2], [-13, 36], [-1, 10], [-20, 27], [-4, 2], [-18, -6], [-12, -9], [-15, -28]], [[6456, 6990], [-1, 25], [5, 18], [4, 28], [-16, 11], [-6, -4], [-8, 26], [-10, -3], [1, 21], [-13, 43], [0, 11], [-17, 14], [2, 19], [16, -2], [7, -10], [5, 8], [-10, 18], [12, 35], [33, 5], [15, -7], [1, 6], [-12, 10], [1, 8], [8, 21], [3, 30], [-4, 13], [5, 8], [-4, 19], [-17, 7], [-9, -14], [-17, 18], [-8, 5], [-10, -6], [-3, -9], [-9, -3], [-17, -24], [-5, 2], [-11, -8], [0, -9]], [[6367, 7320], [-13, 25], [7, 6], [-9, 24], [-5, 22], [-13, 26], [-26, 4], [-1, 32], [-17, 10], [8, 36], [8, 21], [-7, 9], [3, 35], [11, 17], [0, 16], [7, 13], [13, -20], [6, -22], [5, -4], [13, 15], [-5, 22], [-1, 18], [21, 19], [0, 19], [10, 0], [16, 15], [6, 23], [19, 4], [11, -17], [6, 16], [13, 6], [5, -
 20], [12, -2], [11, 3], [8, -9], [1, -11], [8, -2], [6, -16], [9, -8], [-3, -17], [8, -1], [-1, 30], [11, -10], [8, -16], [9, -10], [12, 14], [3, 14], [9, 11], [18, 2], [5, -15], [10, 1], [2, 16], [10, -5], [5, 7], [8, -9], [-1, -12], [10, -13], [14, -3], [3, -11], [7, 4], [7, 23], [7, -12], [12, -3], [18, 10], [5, 30], [-2, 16], [-13, 4], [-2, 9], [-16, 5], [3, 8], [-9, 7], [10, 19], [5, 0], [10, 13], [-10, 24], [14, 25], [20, -5], [4, 13], [-24, 11], [4, 19], [-9, 7], [5, 13], [-5, 9], [11, 8], [12, -5], [35, 7], [25, 16], [25, 7], [9, -4], [0, 13], [6, 7], [15, -1], [13, 7], [33, 10], [15, 8], [2, 17], [10, 0], [3, 12], [11, 2], [16, -4], [14, -15], [7, 11], [11, 1], [4, -16], [1, -22], [5, -3], [3, -38], [11, -5], [2, 9], [8, -2], [3, 10], [14, -23], [8, 5], [3, -10], [12, -1], [-8, -21], [5, -11], [15, 9], [8, -3], [11, 6], [4, 11], [7, -2], [17, 21], [16, 11], [1, 7], [15, 1], [-7, -29], [30, -37], [7, -12], [17, -46], [28, -82], [14, -51], [13, 12], [0, 18], [6, 7], [13, -12]
 , [-2, -14], [9, 1], [2, -16], [8, 4], [20, -5], [8, 14], [19, 6], [11, -9], [10, -27], [2, -17], [20, -13], [8, -36], [9, 3], [9, -9], [13, 9], [6, 13], [5, -8], [7, -32], [8, -11]], [[6163, 4276], [-15, -56], [-11, -28], [0, -94], [0, -108], [1, -62], [15, -51], [0, -9]], [[6153, 3868], [-7, -19], [-9, -8], [-3, -21], [-6, -13], [-7, -1], [-6, -14], [2, -17], [-3, -18], [-4, -11], [-5, -37], [-7, -37], [-5, -15], [-5, -3]], [[6088, 3654], [-39, 74], [-5, 10], [3, 14], [-2, 19], [-26, 38], [-36, 52], [-37, 54]], [[5946, 3915], [3, 14], [-3, 4], [-1, 17], [4, 10], [7, -7], [0, 12], [11, 3], [-3, 16], [-10, -7], [-1, -11], [-9, 21], [0, 21]], [[5944, 4008], [4, 26], [7, 15], [3, 20], [8, 10], [-1, 11], [6, 21], [0, 30], [-3, 18], [2, 9], [-6, 27], [-4, 7], [-5, 32], [1, 20], [-10, 15], [-3, 24]], [[5943, 4293], [11, 29], [8, 11], [16, 15], [9, -5], [2, -21], [8, 0]], [[7045, 6825], [-14, -7], [-14, 3], [-12, -11], [-4, 9], [-9, -6], [0, 12], [-6, 1], [-2, 11], [-11, -8], [-1, -7], [-
 9, 1], [-2, 10], [-11, -3], [-15, 4], [-11, -2], [-2, 15], [3, 17], [18, 16], [18, -16], [1, 7], [8, 11]], [[6970, 6882], [8, 6], [12, -13], [12, 20], [9, 3], [9, 8], [1, 7], [9, 8], [-3, 6], [-10, 1], [-4, 9], [-9, 3], [0, 9], [-8, 2], [-4, 18], [-10, -24], [-17, 9], [-4, 16], [-4, -4], [-9, 12], [31, 45], [-9, 3]], [[7901, 4739], [-6, 11], [-11, 1], [-6, -6], [-4, 10], [5, 8], [0, 22], [-5, 5], [-4, -18], [-7, 4], [2, 28], [-7, 23]], [[7858, 4827], [0, 9], [-6, 27], [2, 19], [-8, 18], [0, 25], [-4, 19], [0, 21], [7, 3], [8, 30], [1, 12], [5, 8], [16, 9], [9, -6], [7, 4], [6, -3], [9, 6], [11, -7]], [[7921, 5021], [4, -17], [6, 4], [6, -5], [5, -13], [6, 12], [-5, 21], [5, 0], [2, 8], [5, -1], [3, 9], [8, -20], [4, 1], [9, 19], [4, -4], [3, 12]], [[7986, 5047], [-4, -20], [-2, -22], [4, -24], [4, -18], [0, -12], [-4, -25], [3, -30], [-1, -19], [-10, -5], [-5, -12], [-15, -17], [-4, -14], [-8, 7], [-6, -10], [1, -24], [9, -17], [0, -20], [-11, 17], [-12, -12], [-8, 5], [1, -13], [-6
 , -15], [-9, -1], [-2, -7]], [[8522, 6402], [3, -9], [-3, -9], [-15, -8], [-3, 5], [4, 14], [14, 7]], [[8518, 6709], [10, 30], [3, 4], [25, 0], [9, 23]], [[8565, 6766], [7, -35], [12, -33], [8, -29], [4, -36], [-3, -41], [5, -10], [-3, -40], [-7, -25], [-5, -7], [-15, 3], [-1, -19], [-12, 11], [-8, -2], [1, -16], [-10, 1], [3, -12], [-5, -10], [-3, 18], [-6, -6], [-3, -14], [-4, 4], [-4, -13], [-4, 4], [0, 25], [-3, 19], [0, 22], [3, 26], [7, 16], [-5, 21], [1, 16], [-9, 36], [4, -1], [9, 10], [0, 28], [-3, 4], [-2, 22], [4, 6]], [[5598, 7026], [-9, -11], [-3, 8], [-10, -10], [0, -11], [-5, -3]], [[5557, 7048], [8, 20]], [[5565, 7068], [9, 20], [4, 5], [7, -6], [8, -25], [11, -5], [-6, -31]], [[6338, 6145], [4, -14], [-3, -14], [-5, 15], [4, 13]], [[6345, 6041], [-22, 0], [-6, 33], [-25, 7]], [[6331, 6146], [2, -16], [-1, -14], [-8, -16], [11, -1], [2, -23], [8, -35]], [[7836, 5600], [3, -12], [10, -24], [2, -17], [8, 5], [1, -11], [-3, -20], [2, -17], [5, -14], [8, -4], [7, -11], [
 3, 12], [8, 9], [6, -5], [9, -16], [-2, -9], [12, -32], [-5, -13], [0, -9], [-8, -13], [-8, 7], [-5, -7], [2, -9], [-7, -11], [17, -25], [7, -13], [11, -7], [-1, -18], [8, -21], [2, 3], [8, -38], [13, -30], [3, 2], [3, -21], [3, -1], [1, -21], [6, -18], [10, -13], [6, -24], [-5, -11], [6, -19], [8, -16], [-4, -41]], [[7921, 5021], [6, 6], [3, 12], [1, 30], [-3, 12], [4, 7], [2, 26], [-6, 9], [-1, 18], [-10, 9], [-1, 10], [-7, 18], [0, 36], [2, 25], [-15, 34], [-8, 34], [-3, -3], [-14, 11], [-12, -31], [-10, -11], [-1, 9], [-7, 5], [-6, 12], [-10, -22], [-4, -3], [-13, -29], [-6, 10], [3, 21], [4, 12], [0, 19], [-3, 8], [5, 17], [3, 27], [-3, 7], [1, 31], [-11, 3], [-3, -10], [-8, 4], [-2, 17], [4, 21], [-5, 22], [-7, -4]], [[7780, 5450], [3, 28], [5, 9], [4, -1], [0, 15], [5, 21], [8, 7], [4, 10]], [[5975, 6368], [4, 27], [9, 33], [2, 26], [9, 18], [0, 8]], [[5999, 6480], [11, -4], [6, -28], [-10, -25], [-5, -3], [-7, -29]], [[4790, 4303], [-20, 16], [-21, 29], [-7, 12], [-31, 74], 
 [-12, 10], [-2, 13], [-13, 15], [-3, 15]], [[4681, 4487], [3, 16], [21, 46], [0, 17], [7, 10], [2, 24]], [[5693, 5571], [0, -143], [-27, -1], [0, -36]], [[5666, 5391], [-21, 27], [-45, 57], [-30, 39], [-38, 48], [-48, 62], [-41, 51], [-27, -32]], [[5416, 5643], [-21, -27], [-21, 40], [-42, 24]], [[5264, 6163], [10, 9], [9, 27], [2, 13], [-5, 36], [5, 19], [7, 5], [2, 15], [8, 13], [15, 16], [4, 7], [-3, 13], [1, 39]], [[5319, 6375], [10, -7], [13, -18], [11, -3], [17, 8], [6, -7], [17, -7], [8, -14], [21, -9], [4, -17], [0, -16], [4, -19], [7, -20], [8, -8], [19, -4], [18, -10], [22, -21], [14, -27], [11, -11], [8, 3], [11, 15], [8, 22], [3, 29], [-6, 36], [0, 17], [4, 16], [14, 27], [14, 16], [10, 2], [5, 9], [15, 1], [10, -11], [16, -11], [0, -23], [4, -7], [12, -3], [12, -13], [16, 2], [8, -4], [5, -23]], [[7235, 4679], [9, -23], [3, -18], [9, -26], [-1, -13], [4, 1], [3, -26], [7, -27], [5, -30], [0, -22], [-3, -30], [-3, -10], [-9, -17], [-21, -22], [-11, 8], [-5, 17], [-4, 38]
 , [-2, 57], [-3, 36], [4, 3], [1, 29], [2, 14], [-1, 15], [4, 6], [2, 15], [-2, 11], [6, 8], [-9, 14], [1, 9], [7, 1], [7, -18]], [[5798, 1928], [13, -27], [3, -1], [3, -18], [-8, -24], [0, -17], [-8, -11], [-14, -7], [-8, -35], [-9, 3], [-8, 21], [-2, 0], [-10, 49], [11, 17], [9, 35], [8, 3], [4, 12], [13, 9], [3, -9]], [[5652, 7866], [-2, 17], [-16, 17], [-2, -4]], [[5632, 7896], [-3, 7], [4, 32], [-6, 12], [-14, -2], [-23, 16]], [[5590, 7961], [-6, 45], [0, 14]], [[5584, 8020], [8, 11], [21, 14], [28, -8], [17, 3], [21, -7], [12, 13], [6, -18], [15, -3], [17, -29], [9, -5]], [[5759, 8124], [14, -17], [-3, -18], [3, -21], [8, -15], [0, -28]], [[5584, 8020], [-2, 13], [3, 42], [9, 14], [0, 18], [8, 19], [25, 15], [2, -12], [13, -16], [3, -18], [13, -11], [7, 3], [12, 16], [-2, 46]], [[4758, 5978], [-3, 0], [1, -34], [-1, -5], [-17, -2], [-9, -16], [-8, 3], [-6, -3], [-9, 9], [-10, 1], [-13, -9], [2, -18], [-9, -24], [-2, -14], [-9, -5], [-7, -66], [-4, -20], [-17, -31], [-7, -30], 
 [-13, -14], [-7, -27], [-4, -47], [-1, -33], [-12, -32], [-1, -19], [-5, -10], [-17, 0], [-8, 3], [-27, -2], [-8, -3]], [[4527, 5530], [1, 25], [7, 36], [6, 3], [4, 19], [5, 39], [11, 48], [1, 12], [4, 5], [12, 33], [7, 14], [2, 17], [0, 21], [2, 17], [7, 34], [3, 24], [7, 12], [7, 6], [8, 13], [13, 72], [5, 16], [25, 13], [16, 17], [13, 31], [13, 17], [12, 31], [9, 30], [4, 20], [2, 20], [-8, 20], [2, 8], [-1, 44], [5, 24], [8, 21], [3, 14], [0, 25], [11, 22], [10, 28], [28, 27], [11, 14], [8, 14], [15, 61], [10, 66], [9, 2], [6, 7], [1, -6], [3, -19], [13, -24], [11, -7], [11, 7], [18, -3], [11, 9], [1, -4], [0, -7], [19, -6]], [[5783, 7257], [-3, 39], [4, 31], [0, 17], [-6, 25], [-6, 9], [-7, 23], [-7, 15], [-7, 32], [-12, 10]], [[5739, 7458], [6, 10], [11, -1], [14, 5], [19, -24], [10, 0], [5, -13], [8, -5], [-4, -24], [8, -18], [4, 3], [0, -27], [11, -10], [-6, -25], [-14, -7], [-7, -26], [-14, -25], [1, -11], [-8, -3]], [[6370, 3121], [-3, -6], [8, -14], [2, -20], [6, -11], [4
 , -16], [0, -22], [5, -32], [3, -69], [6, -33], [1, -18], [-7, -38], [-6, 8], [-3, 32], [-8, -9], [3, -26], [-2, -8], [5, -16], [0, -22], [-3, -12], [1, -10], [-4, -2], [-6, -29], [2, -37], [-4, -45], [-7, -46], [-6, -44], [-1, -16], [-8, -49], [-3, -31], [-7, -56], [-8, -49], [-2, -31], [-7, -68], [-7, -34], [0, -11], [-7, -35], [-8, -13], [-15, -4], [-21, -27], [-10, 0], [-8, 17], [-13, 6], [-10, 19], [-5, 35], [-4, 7], [-1, 16], [0, 39], [3, 14], [-4, 8], [-1, 19], [-6, 18], [-4, 41], [3, 36], [4, 6], [0, 19], [3, 9], [6, 4], [3, 24], [6, 28], [4, 9], [6, 33], [-3, 10], [3, 18], [-7, 34], [1, 18], [-6, 27], [-1, 35], [1, 12], [-3, 23], [14, 54], [-1, 24], [1, 13], [11, -3], [12, 22], [7, -3], [5, 13], [3, -2], [11, 7], [19, 35], [5, 1], [11, 40], [1, -12], [7, 16], [-1, 17], [3, 11], [6, 4], [-5, 27], [1, 13], [7, 0], [1, -11], [4, -2], [3, 18], [8, 8], [6, 44], [1, 34], [10, 17]], [[1881, 6090], [2, -14], [-3, -20], [-7, 9], [4, 24], [4, 1]], [[1847, 6113], [9, -18], [-5, -8], [
 -6, 17], [2, 9]], [[2186, 6120], [1, -11], [6, -2]], [[2193, 6107], [10, -24], [2, -14], [6, -24], [3, -21], [6, -11], [10, -35], [6, -6], [1, -37]], [[2237, 5935], [6, -18], [2, -18]], [[2245, 5899], [2, -11], [8, -3], [5, -9], [7, -3], [4, -9], [12, -1], [11, -15], [7, 8]], [[2301, 5856], [0, -17], [-8, -39], [-6, -48], [-2, -36], [-1, -54], [1, -21], [-4, -25], [3, -38], [4, -19], [-1, -14], [5, -17], [9, -54], [13, -35], [6, -21], [5, -40], [9, -18], [3, -25], [4, 3], [14, -3], [6, -11], [5, -3], [7, -24], [3, -3], [13, 9], [6, 1], [5, 10], [20, 3], [5, 12], [18, 5], [5, -12], [9, -6], [6, 9], [2, 12], [-5, 10], [14, 20], [5, 16], [1, 22], [6, 17], [0, 44], [4, 33], [16, 21], [18, 5], [12, 7], [7, 9], [9, 3], [17, -11], [9, 0], [1, 11], [9, -14], [2, -19], [-3, -22], [-10, -26], [-6, -22], [-1, -22], [-8, -19], [9, -9], [-6, -9], [1, -25], [-4, -44], [-9, 7], [-6, -2]], [[2437, 5036], [-16, 45], [-23, 47], [-8, 13], [-5, 15], [-20, 15], [-14, -25], [-2, -8], [-15, -10], [-7, -11
 ], [-9, -1], [-8, 5], [-12, 14], [-14, 4], [-12, 17], [-7, 4], [-9, 20], [-2, -2], [-25, 15], [-7, 12], [-28, 25], [-5, 12], [-13, 18], [-4, 16], [-7, 7], [-4, -5], [-15, 11], [-21, 19], [-6, 23], [-8, 16], [-18, 20], [-10, 15], [-2, 14], [-5, 7], [-7, 27], [-5, 27], [10, 7], [3, 9], [-7, 17], [7, 14], [1, 31], [-6, 8], [-6, 25], [-1, 22], [-4, 27], [-18, 43], [-16, 54], [-10, 16], [-7, 18], [-10, 14], [-5, 16], [1, 18], [-7, 6], [-9, 14], [-2, 10], [-7, -6], [-11, 24], [0, 16], [6, 18], [-1, 16], [-8, 14], [-6, 1], [-4, 26], [-11, 6], [-8, 22], [0, 28], [-6, 6], [-2, -6], [-10, 15], [-7, 24], [-6, 5], [-6, 25], [-6, 12], [-4, 26], [-11, 41], [-5, 38], [-8, 28], [3, 24], [-14, 10], [-3, 15], [-6, 7], [-8, -7], [-12, 19], [-7, 2], [-2, -45], [5, -16], [3, -37], [-1, -18], [7, -28], [4, -1], [14, -26], [4, -12], [1, -21], [9, -8], [4, -24], [7, -6], [2, -40], [5, -15], [6, -7], [10, -42], [13, -20], [7, -45], [0, -21], [8, -24], [3, -22], [7, -24], [-2, -18], [5, -25], [7, 1], [2, 9],
  [11, -21], [4, -29], [6, -7], [1, -19], [-3, -13], [-11, -17], [-4, 10], [-2, 22], [-4, 16], [-8, 10], [-13, 30], [-20, 32], [-4, 14], [-5, 3], [-1, 28], [2, 23], [-1, 21], [-7, 28], [-11, 14], [-9, 17], [-3, 13], [-9, 1], [-4, -5], [-5, 16], [-18, 21], [-1, 12], [-6, 8], [-5, 23], [11, -5], [13, 18], [-2, 17], [2, 14], [-12, 34], [-3, 3], [-11, 29], [-6, 4], [-14, 24], [-3, 14], [-1, 28], [-6, 10], [0, 24], [-8, 10], [1, 14], [-10, 29], [1, 22], [-6, 9], [-8, 39]], [[1746, 6328], [37, 7], [30, 6], [-3, -15], [24, -19], [46, -37], [35, -28], [30, 0], [49, 0], [0, 32], [47, 0], [4, -4], [6, -20], [4, -3], [18, -40], [10, -12], [9, -35], [0, -18], [4, -20], [13, -23], [8, -5], [13, -20], [5, -1], [8, 18], [-2, 3], [6, 34], [8, 2], [3, 9], [9, -6], [16, -4], [3, -9]], [[2290, 5819], [-4, -6], [-1, -36], [1, -17], [-4, -7], [4, -10], [4, 48], [4, 17], [-4, 11]], [[5586, 6926], [-4, 3], [-1, 1]], [[5598, 7026], [20, 9], [2, -4]], [[5117, 5366], [0, -71], [0, -83], [-1, -14], [0, -28], [
 -4, -9], [-5, -41], [-10, -16], [0, -10], [-12, 5], [-2, -6], [-47, -4], [-9, -21], [-9, -4], [-4, 4], [-8, -6]], [[4683, 4882], [-2, 48], [-4, 20], [-8, 7], [-6, 18], [4, 15], [-2, 24], [-5, 10], [2, 17], [-3, 11]], [[4659, 5052], [5, -3], [7, 12], [-1, 20], [4, 26], [9, 4], [13, -35], [5, 23], [12, 0], [13, -4], [14, 9], [28, 0], [46, 0], [32, 0], [5, 58], [-8, 16], [-3, 87], [-6, 135], [-4, 94], [-3, 64], [-5, 96], [-6, 132], [50, 0]], [[7737, 4838], [0, -13], [-4, -4], [-1, 15], [5, 2]], [[7710, 5156], [-4, 16], [5, 3], [-1, -19]], [[7780, 5450], [-5, 9], [-4, -8], [-9, 0], [2, -9], [-7, -10], [-5, 4], [-3, -20], [-13, -12], [-6, 1], [-8, 8], [0, -11], [-7, -18], [1, -20], [-4, -14], [2, -25], [-8, -6], [0, -11], [5, -7], [4, -19], [-3, -10], [9, -24], [3, -14], [12, -30], [-2, -12], [5, -19], [8, -7], [-2, -16], [-5, -2], [-3, -27], [0, -27], [-8, -5], [-3, -12], [2, -23], [9, -31], [11, -22], [5, -25], [2, -35], [-3, -4], [3, -32], [5, -10], [2, -33], [5, -23], [-12, -51], [-6
 , -10], [0, -10], [-6, -10], [-1, -24]], [[7742, 4734], [-6, 1], [-2, 25], [7, 15], [2, 25], [-3, 30], [-2, 3], [3, 17], [-4, 23], [4, 31], [-3, 15], [0, 19], [-10, 38], [-4, -1], [0, 31], [-3, 14], [-5, 40], [-3, 72], [-3, 9], [2, 38], [-7, -2], [-4, 13], [-2, 22], [-3, 18], [-5, 5], [0, -18], [-3, -24], [-5, -16], [-8, -5], [-16, -22], [-2, -14], [-7, -15], [-10, 8], [-6, -4], [-8, 12], [3, 12], [-1, 11], [-8, -20], [-4, 1], [2, 38], [4, 18], [5, 37], [0, 22], [-4, 26], [1, 4], [-6, 34], [-3, 20], [-14, 17], [-5, 27], [4, 1], [5, -12], [5, 16], [-7, 11], [-5, 21], [-7, 11], [-7, -5], [-8, 15], [4, 8], [-3, 14], [-4, -6], [-8, 20], [-3, 26]], [[5533, 7119], [11, -27], [9, -3], [12, -21]], [[5538, 7032], [0, -3], [-1, 0], [1, -14]], [[5537, 6998], [-13, 31], [-11, 9]], [[5512, 7049], [3, 5], [-3, 26], [5, 2], [1, 16], [6, 8], [1, 11], [8, 2]], [[8263, 7424], [5, -8], [6, 12], [-4, 10]], [[7439, 7523], [9, 8], [1, 12], [12, 4], [7, -4], [22, 19], [-1, 14], [9, 5], [3, 8], [18, 15], [
 8, 10], [12, 3], [9, 16], [11, 0], [4, 11], [10, -12], [9, 7], [1, -11], [34, -4], [3, -23], [8, -17], [8, 3], [4, -8], [13, -4], [9, 9], [14, -9], [17, 0], [9, -11], [22, 24], [6, 33], [-8, 9], [-6, 25], [7, 34], [5, 0], [3, 18], [10, 9], [5, 20], [12, -14], [10, -3], [9, -11], [14, 0], [25, -20], [14, -3], [8, -6], [-1, -17], [5, -39], [7, -10], [30, -20], [15, 3], [5, 9], [26, 13], [18, -6], [7, -8], [12, 3], [16, -24], [20, -4], [0, -20], [16, -24], [17, 1], [29, -13], [5, 6], [10, -8], [17, 17], [19, 3], [11, 9], [9, -3], [8, 7], [5, 17], [10, 14], [20, 18], [13, -3], [17, -24], [10, -1], [13, 9], [13, -13]], [[5913, 2061], [-22, 0]], [[5891, 2061], [-2, 40], [1, 20], [-3, 4]], [[5887, 2125], [1, 22], [0, 88], [-4, 34], [-3, 8], [-6, 30], [0, 19], [-6, 55]], [[5869, 2381], [4, 6], [27, 73], [-2, 11], [4, 17], [1, 24], [3, 1], [10, 38], [1, 17], [-6, 8], [-1, 15], [2, 25], [-5, 8], [1, 13], [5, 3], [-1, 18], [5, 15], [-2, 7], [-1, 26], [3, 37], [-6, 30], [2, 16], [-17, 19], [-10
 , 2], [-6, 15], [-8, 4], [-4, 10], [-8, -3], [-3, 5], [-13, -1], [0, 27]], [[5844, 2867], [-1, 18], [-4, 29], [16, 15], [17, 10], [7, 8], [43, 36]], [[5922, 2983], [6, -26], [5, -11], [5, 0], [15, 10], [5, -13], [2, -30], [0, -20], [-5, -15], [0, -12], [-5, -18], [5, -10], [0, -11], [17, -45], [2, 0], [0, -22], [6, -1], [-1, 31], [-4, 12], [7, 28], [9, 3], [3, 7], [1, 42], [-2, 16], [4, 22], [-2, 16], [-11, 38], [-10, 31], [-6, 14]], [[5968, 3019], [-3, 41], [2, 16], [-4, 18], [0, 20], [5, 11], [3, 33]], [[5971, 3158], [17, -2], [7, 14], [9, -12], [1, -9], [10, -2], [7, 11], [17, -10], [10, 12], [2, 17], [11, 3], [7, -10], [11, 18], [11, 1], [5, 11], [8, 4], [7, 9], [12, 24]], [[6123, 3237], [2, -2], [3, -24], [-4, -8], [-2, -49], [3, -26], [-1, -18], [4, -36], [-2, -25], [-1, -39], [6, -45], [-1, -7], [4, -7], [0, -25], [-7, -23], [2, -7], [-3, -20], [-11, -30], [-5, -22], [-6, -5], [-2, -17], [-14, -20], [-3, -12], [-14, -8], [-19, -19], [-16, -23], [-6, -14], [-6, -23], [-11, -28
 ], [-2, -14], [-11, -11], [-10, -15], [-9, -28], [-13, -24], [-4, -2], [1, -18], [-2, -15], [2, -15], [6, -13], [4, -17], [-2, -20], [6, -28], [2, -32], [5, -10], [-1, -24], [1, -25], [2, -3], [-3, -16], [-2, -48], [4, -2], [-2, -17], [-10, -35], [-13, -16], [-26, -21], [-16, -19], [-7, -12], [-6, -25], [-4, -7], [9, -22], [2, 2], [-1, -42]], [[4659, 5052], [-6, 16], [-11, 16], [-3, 21], [-7, 8], [-2, 21], [-5, 17], [-9, -2], [-15, 37], [-16, 0], [-21, -11], [-18, -1], [-4, -21], [-2, -27]], [[4540, 5126], [0, 33], [2, 27], [8, 45], [4, 29], [0, 21], [-1, 38], [-4, 35], [-7, 20], [5, 20], [-3, 3], [5, 16], [-2, 9], [3, 21], [-6, 25], [-7, 8], [-7, 35], [-4, -28]], [[4526, 5483], [-1, 7], [3, 33], [55, 0], [55, 0], [-2, 84], [-2, 18], [4, 19], [11, 19], [16, 12], [1, 58], [0, 125], [25, 0], [39, 0], [28, 2], [0, 91]], [[6603, 2546], [2, -9], [-4, -19], [-8, -2], [0, 18], [4, 17], [6, -5]], [[5941, 3292], [2, -21], [8, -31], [-1, -13], [3, -77], [-7, -21], [-1, -15], [4, -15], [0, -19
 ], [4, -25], [0, -27], [8, -23], [-2, -19], [5, -22], [4, 13], [12, -17], [-7, 43], [-5, 5], [0, 11]], [[5922, 2983], [-6, -3], [-6, 29], [4, 26], [2, 29], [-1, 12], [2, 10], [9, 5], [1, 12], [-4, 15], [2, 17], [-3, 35], [5, 18], [-2, 9], [0, 16], [3, 0], [7, 17], [-4, 25], [-6, 11], [1, 13], [-5, 21], [-6, 0], [-1, 14]], [[5914, 3314], [13, -14], [9, 1], [5, -9]], [[7835, 4440], [8, -9], [3, -17], [18, -37], [9, -42], [1, -33], [-3, -16], [1, -10], [-2, -16], [4, -17], [-2, -11], [0, -29], [6, -21], [4, -3], [12, -60], [2, -25], [-5, -5], [-7, 7], [-10, -13], [-3, 18], [-16, 23], [-2, -1], [-7, 18], [-8, 8], [-11, 26], [-7, 6], [-7, 14], [2, 11], [-2, 20], [-7, 24], [-9, 18], [2, 16], [-6, 17], [2, 15], [-2, 23], [-6, 17], [2, 15], [-2, 27], [0, 24], [-6, 31]], [[7781, 4453], [1, 18], [6, -12], [11, -8], [1, -11], [7, -1], [0, -23], [-3, -10], [4, -11], [4, 11], [8, 9], [7, -12], [7, 25], [1, 12]], [[8045, 4140], [0, -11], [8, -17], [12, 2], [10, -13], [7, -3], [6, 41], [2, 25], [4
 , 5], [1, 14], [6, 12], [10, 3], [27, 19], [8, 24], [4, 19], [9, 18], [5, 19], [2, 24]], [[8193, 4342], [1, -5]], [[8198, 4343], [6, 0], [5, 11], [0, 10], [-5, 8], [5, 16], [8, 2], [6, 20], [1, 20], [11, 27], [8, 38], [5, -23], [5, 22], [5, -27], [5, -2], [7, -16], [-4, -13], [2, -15], [6, -3], [3, 8], [4, -19], [7, 0], [16, -27], [6, 1], [2, -17], [-3, -7], [-13, -11], [-5, -1], [-4, 7], [-6, -11], [5, -17], [9, -14], [-3, -6], [-18, -8], [-6, 12], [-3, -19]], [[5649, 2722], [23, 12], [12, -1], [9, -4], [8, -18]], [[5554, 2211], [1, -85], [0, -69], [-1, -109], [-11, -8], [-8, -25], [-6, -6], [-9, 9], [-16, -5], [-7, 9], [-14, 5], [-2, 35], [-4, 1], [-3, 13], [-5, -4], [-3, -20], [-9, -15]], [[5457, 1937], [-3, 1], [-19, 44], [-11, 45], [-1, 25], [-5, 20], [2, 17], [-5, 9], [1, 20], [-4, 21], [1, 13], [-2, 23], [1, 14], [-2, 19], [-5, 17], [-3, 29], [1, 19], [-1, 42], [-2, 24], [3, 4], [-1, 27], [-3, 19], [-12, 36], [-3, 23], [-13, 46], [-6, 48], [-13, 53], [-3, 22], [-8, 30], [-7, 
 13], [-5, 26], [-4, 43], [1, 21]], [[9665, 2454], [5, -4], [-1, -14], [-7, 2], [-2, 15], [5, 1]], [[9646, 2502], [3, -34], [-9, 14], [6, 20]], [[9555, 2547], [5, -12], [8, -4], [16, -31], [4, -2], [6, -21], [6, -15], [8, -8], [1, -8], [13, -16], [4, -12], [8, -11], [4, -21], [-6, -5], [-10, 16], [-2, -2], [-19, 31], [-11, 14], [-10, 21], [-3, 14], [-12, 23], [-5, 17], [-2, 16], [-4, 3], [1, 13]], [[5416, 5643], [5, -72], [0, -35], [3, -8], [9, -32], [-2, -11], [12, -31], [-6, -33], [-4, -118], [-4, -97], [0, -3], [-30, -81], [-15, -52], [-2, -22], [-9, -24], [4, -49]], [[5377, 4975], [-6, 1], [-4, -12], [-10, -4], [-9, -18], [-2, -13], [-12, 4], [-5, 9], [-12, 9], [-21, 0], [-14, -7], [-7, -9], [-8, -23], [-10, -1], [-16, 8], [-17, 28], [-9, 1], [-10, -15], [-6, 0], [-8, -8], [-6, 23], [-9, 21], [-7, 2], [-15, 16], [-8, -8], [-12, 1], [-9, -6], [-11, -16], [-1, -34], [-4, -17], [-8, -16], [-2, -60]], [[5377, 4975], [13, -45]], [[5238, 4336], [-9, -19], [-15, -3], [-11, 7], [-10, -16
 ], [-24, -7], [-4, 4], [-10, 21], [-3, 15], [-4, 36], [-13, 48], [-13, 25], [-24, 7], [-4, -4], [-19, -2]], [[2691, 5068], [-5, -16], [3, -28], [-1, -10], [-6, -21], [-4, -48], [2, -28], [-1, -23], [2, -13], [-4, -1], [-1, 13], [-3, -1], [1, -13], [3, -1], [-6, -35], [5, -18], [-6, -17], [1, -17], [5, -16]], [[2619, 4787], [-6, 16], [-16, 32], [-8, 33], [-6, 9], [-18, 38], [2, 14], [5, -11], [2, 5]], [[5093, 7682], [24, 0]], [[5162, 7768], [0, -6], [-2, -4], [-7, -5], [-3, -6], [-8, 8], [15, 16], [5, -3]], [[5118, 7682], [-12, 1], [0, 16], [19, 52], [6, 46], [5, -5], [13, 14], [6, 15], [11, 7], [20, 4], [13, -15]], [[5140, 7793], [-1, -41], [12, -7], [2, 1], [4, 8], [3, 2], [2, 5], [0, 9], [-7, 5], [2, 11], [-17, 7]], [[5249, 8565], [3, -9], [-16, -7], [1, 12], [12, 4]], [[5441, 8946], [19, -18], [-3, -12], [-14, -11], [-20, -4], [6, 34], [12, 11]], [[5421, 8944], [6, -15], [-9, -10], [-19, 7], [22, 18]], [[5492, 8988], [9, -4], [-3, -22], [-27, -3], [0, 15], [21, 14]], [[5523, 9012
 ], [-1, -21], [-23, 0], [24, 21]], [[5533, 9026], [6, -17], [-8, -4], [-8, 17], [10, 4]], [[5652, 9065], [5, -11], [-16, -13], [-6, 9], [17, 15]], [[5649, 9081], [-14, -22], [-21, -4], [4, 14], [15, -2], [16, 14]], [[5856, 9007], [0, -20], [-15, 6], [-10, -18], [-17, -6], [-10, -18]], [[5572, 8951], [-8, -9], [-2, -31], [-9, -9], [-25, 11], [-24, 2], [0, -27], [-7, -13], [-16, 10], [-15, -14], [-9, -26], [-10, -10], [8, -26], [-27, -40], [2, -16], [-12, -9], [-15, -2], [3, -20], [-3, -38], [-6, -17], [-19, -36], [14, -10], [1, -17], [-6, -14], [-20, 6], [-15, -10], [-14, -25], [-5, -23], [6, -20], [-4, -30], [7, -25], [-5, -37], [20, -25], [-5, -24], [-12, -4], [9, -34], [-2, -28], [-17, -25], [-6, -16], [4, -22], [-5, -24], [-6, 6]], [[5317, 8230], [-2, 7], [-14, 6], [-11, 19], [-6, -30], [-21, -7], [-4, -13], [-34, -46], [-20, -6], [-24, 7], [4, 7], [-19, 12], [-8, 10], [-5, 25], [14, 9], [-4, 6], [10, 17], [-24, -1], [-6, 15], [4, 8], [12, 4], [-1, 12], [7, 8], [-6, 13], [-16, 10
 ], [2, 15], [-5, 26], [-2, 31], [4, 18], [-4, 15], [10, 12], [-5, 22], [13, -4], [21, 19], [-4, 11], [20, 11], [-2, 15], [10, 6], [7, -8], [30, 17], [-2, 12], [8, 9], [10, -2], [15, 17], [-4, 9], [14, 11], [-2, 8], [13, 23], [12, 9], [13, -5], [4, 12], [-7, 20], [16, 12], [18, 5], [-4, 13], [9, 13], [-9, 13], [16, 26], [9, 22], [1, 30], [12, 8], [-3, 8], [18, 3], [5, 21], [9, 15], [24, 19], [8, 14], [16, 0], [-8, 19], [12, 31], [30, 18], [-6, 8], [17, 12], [6, 23], [15, 5], [7, 13], [19, 5], [20, -3], [19, 8], [6, 11], [-5, 13], [21, 8], [33, -17], [10, 20], [20, 17], [12, 27], [35, -9], [-19, -21], [5, -17], [33, 45], [10, -28], [13, 23], [-6, 10], [36, -3], [19, -9], [4, -11], [21, 1], [26, -30], [-14, -3], [-12, -13], [-38, 7], [0, -6], [26, -9], [0, -16], [32, 5]], [[5713, 9104], [11, -13], [-15, -3], [-7, 8], [11, 8]], [[5647, 9610], [-5, -15], [36, -12], [-33, -40], [-23, 0], [-6, 17], [-35, -4], [20, 34], [-22, 12], [23, 9], [45, -1]], [[5596, 9638], [17, 0], [5, -23], [-34, 
 -5], [-24, 21], [36, 7]], [[5467, 9730], [20, 2], [37, -33], [2, -20], [23, 0], [3, -11], [45, -11], [-3, -13], [-33, -2], [-34, -13], [2, -27], [-13, -2], [-11, -41], [-13, 0], [-15, -55], [-17, -11], [-18, 14], [-25, 26], [-18, 5], [-18, 41], [-4, 21], [40, 4], [21, 16], [-15, 23], [-24, -11], [-15, -21], [-26, 2], [-1, 8], [-34, 28], [1, 23], [-11, 3], [-16, 33], [31, 20], [95, -16], [7, -21], [13, -1], [-8, 28], [10, 22], [22, -10]], [[5642, 9767], [-2, -10], [51, 6], [12, -7], [53, -10], [-2, -17], [-37, -17], [-5, -16], [-38, -6], [-6, -9], [-32, 2], [-14, 14], [-44, -2], [-33, 16], [61, 7], [1, 9], [-86, -8], [-16, 13], [21, 19], [40, 19], [14, -15], [41, -8], [21, 20]], [[9665, 634], [6, -13], [2, -14], [-13, -7], [-4, 9], [5, 11], [-1, 14], [5, 0]], [[9802, 1079], [-6, -12], [10, -15], [-1, -19], [5, -11], [11, 18], [17, 4], [0, -14], [-4, -17], [5, -21], [-1, -11], [-9, -26], [-9, -18], [-7, -34], [-14, -15], [-1, -34], [10, -5], [0, -9], [-9, -3], [-8, 11], [-7, -11], [-2
 5, -29], [-5, -21], [1, -24], [-7, -18], [-3, -23], [-4, -14], [2, -14], [-12, -8], [-3, -13], [-11, -16], [0, -6], [-10, -12], [-13, -4], [-5, 9], [-7, -4], [-7, 6], [-5, 14], [-8, -4], [-5, 15], [-8, -5], [-18, 3], [-8, 17], [1, 12], [11, 3], [-5, 16], [14, 44], [15, 24], [16, 35], [9, 11], [2, -4], [13, 19], [15, 13], [10, 23], [17, 21], [11, 26], [5, 22], [6, 33], [10, 12], [6, 18], [1, 38], [15, 27], [7, 0]], [[9807, 1517], [1, -28], [10, -13], [11, -1], [9, -25], [4, 4], [6, -22], [-2, -28], [9, -21], [-5, -38], [19, -15], [1, -14], [6, 5], [-3, 19], [1, 16], [9, -12], [5, -44], [0, -14], [14, -10], [18, -18], [11, 8], [5, 17], [8, 9], [7, -1], [8, -11], [-6, -21], [-1, -38], [-10, -16], [-2, -24], [-14, 1], [-9, -9], [-4, -18], [4, -22], [-6, -30], [-13, -37], [-11, -40], [-18, -26], [-4, 14], [-9, 0], [-7, 9], [10, 23], [6, 29], [2, 20], [-8, 27], [-11, 6], [-7, 15], [-9, 6], [-6, 10], [0, 14], [12, 16], [10, 10], [4, 53], [5, 3], [-1, 20], [-4, 33], [3, 27], [-9, -5], [-2, 
 18], [-6, 16], [7, 8], [-2, 15], [-8, -13], [-7, 24], [-21, 61], [2, 21], [-12, 36], [10, 1]], [[6474, 5186], [-8, 45], [-2, 2], [-21, 122]], [[6443, 5355], [46, 40], [38, 32], [9, 70], [9, 73], [-13, 52]], [[6566, 5785], [6, -34], [9, -28], [6, -11], [21, -17], [24, -13], [9, -35], [12, -36], [9, -8], [-2, -18], [-8, -31], [-4, -23], [-12, -21], [-7, -23], [-6, -33], [-7, 3], [-3, 12], [-7, -33], [-4, -26], [2, -35], [2, -18], [-4, -5], [-14, -3], [-8, -7], [-7, -15], [-3, -33], [-6, -15], [-4, 2], [-21, -9], [-6, -23], [1, -21], [-6, -15], [-7, -5], [-5, 7], [-16, -4], [-12, -17], [-14, -8]], [[6557, 5863], [3, 13], [6, -15], [-3, -29]], [[6893, 5704], [-1, -11], [-6, 10], [-8, -2], [-5, 19], [-3, 0], [-5, 43], [-8, 13], [-5, -1], [1, 28], [-8, 27], [-5, -9], [-16, -9], [-8, 3], [-7, -7], [-9, 2], [-5, -7], [-16, 9], [-14, 1], [-2, -12], [-28, 4], [-5, -8], [-4, 6], [-2, -9], [-14, 7]], [[2836, 4510], [-11, 33], [-4, 28], [5, 5], [2, 18], [-8, 3], [-1, 14], [-10, 18], [-9, 9], [-5
 , 0], [-10, -12], [-1, -19], [-13, -20], [-7, -6], [1, -13], [9, -21], [3, -21], [-9, -5], [-3, -10], [-11, -2], [-7, 45], [-2, 0], [-1, -17], [-10, 11], [-4, 26], [-11, 8], [-5, 8], [-6, -5], [-4, 3], [-6, -7], [-1, -13]], [[2706, 4678], [6, -12], [0, -11], [3, -17], [4, -6], [9, 0], [2, 7], [5, -15], [6, -3], [14, 8], [2, 8], [18, 16], [8, 12], [5, 16], [16, -6], [4, -8], [9, 1], [15, -15], [16, -40], [2, 0]], [[3073, 2875], [-10, 17], [-6, -9], [4, -28], [3, -12], [7, -4], [0, -12], [9, -3], [4, 0], [-4, -19], [2, -4]], [[3044, 2672], [-8, 13], [-6, 15], [-13, 19], [-1, 21], [-3, 8], [-16, 19], [-7, 19], [-10, 7], [-28, 32], [-9, 18], [-11, 12], [-1, 5], [-19, 24], [-11, 37], [-10, 16], [-2, 14], [-8, 23], [3, 43], [-2, 13], [-7, 23], [-1, 12], [-8, 28], [-1, 13], [-9, 17], [0, 24], [-4, 17], [-9, 15], [1, 9], [-2, 17], [-10, 42], [-5, 28], [0, 11], [-4, 13], [-1, 18], [-10, 43], [0, 12], [-5, 12], [-1, 16], [-9, 20], [-5, 16], [-6, 43], [-8, 23], [-9, 18], [-13, 17], [-9, 17], [
 -1, 13], [5, 3], [3, 14], [-2, 14], [-8, 18], [4, 13], [-8, 25], [3, 32], [10, 26], [3, 12], [12, 22]], [[8361, 4428], [6, -11], [-9, -4], [-1, 6], [4, 9]], [[8390, 4451], [-7, 13], [7, 11], [5, -13], [-5, -11]], [[8489, 4681], [8, -9], [11, -38], [-1, -14], [-5, -11], [8, -8], [-2, -11], [4, -8], [-2, -29], [5, -8], [1, -32], [-4, -20], [-3, 0], [-3, -17], [-1, -21], [-3, 3], [-1, 24], [-2, 7], [-5, 29], [-4, -8], [-8, -33], [0, -13], [5, -5], [4, -27], [-1, -14], [-8, -27], [-6, 16], [3, 13], [-3, 9], [-3, -18], [-13, 10], [-10, 14], [-5, 18], [0, 26], [-2, 1], [1, 22], [5, 8], [0, 13], [-4, 14], [-10, 14], [-7, 0], [1, -10], [-3, -7], [-9, 6], [-1, -13], [-5, 6], [0, 14], [-6, 1], [-7, -22], [-3, -26], [-4, -14], [-5, 6], [0, 17], [3, 6], [3, 37], [4, 14], [18, 10], [4, 26], [7, 2], [5, 11], [7, -6], [2, -11], [1, -22], [10, 4], [3, 22], [4, 8], [4, -11], [4, 2], [0, 32], [4, 4], [6, -12], [5, 12], [6, 2], [0, 12], [-4, 35], [2, 10], [5, -15]], [[8453, 4720], [7, -9], [1, -16], [
 -9, -14], [-11, 1], [-3, 13], [11, 24], [4, 1]], [[8490, 4738], [0, -34], [-5, 15], [2, 16], [3, 3]], [[8423, 4779], [7, -4], [2, -7], [-5, -28], [-3, -24], [-4, -17], [0, -18], [5, -19], [-3, -17], [-5, -5], [-5, 20], [-7, 8], [-6, 29], [2, 10], [7, 1], [4, 9], [-1, 30], [4, 14], [1, 13], [7, 5]], [[8444, 4786], [1, -13], [-1, -37], [-10, -24], [-5, -34], [-4, -5], [3, 39], [7, 30], [9, 44]], [[8319, 4805], [0, -26], [2, -22], [4, -11], [-5, -10], [-5, -4], [-5, -19], [-9, -6], [-10, -47], [-10, -14], [-4, -17], [-6, -13], [-6, -3], [-2, -11], [-8, -5], [2, 14], [10, 30], [14, 24], [11, 28], [8, 30], [3, 2], [2, 13], [3, -1], [6, 24], [-3, 9], [3, 7], [2, 25], [3, 3]], [[8456, 4813], [5, -10], [6, 9], [4, -4], [2, -30], [-1, -12], [5, -14], [1, -25], [-13, -7], [-1, 17], [1, 31], [-4, 13], [-3, -9], [-3, 4], [1, 37]], [[8396, 4835], [9, -18], [7, 6], [1, -11], [6, 8], [0, -26], [-9, -16], [-1, -11], [-5, -8], [-16, -5], [-2, 11], [3, 17], [2, 46], [-7, 8], [3, 12], [9, -13]], [[833
 1, 4873], [7, -12], [-2, -10], [-4, 3], [-1, 19]], [[8469, 4893], [7, 1], [9, -24], [-1, -20], [0, -26], [5, -17], [-3, -16], [-8, -4], [-3, 14], [-4, 1], [-2, 32], [-7, 21], [-8, 14], [-3, 22], [11, -1], [7, 3]], [[8426, 4892], [14, -24], [5, -17], [-1, -14], [-7, 10], [-6, 20], [-9, 2], [4, 23]], [[8392, 4898], [-3, -30], [-3, 6], [3, 23], [3, 1]], [[8421, 4918], [-7, 10], [3, 6], [4, -16]], [[8360, 4962], [6, -6], [6, -15], [2, -33], [1, -9], [-3, -19], [-5, -12], [-4, 3], [-8, 34], [-1, 20], [-8, 21], [2, 15], [5, -3], [7, 4]], [[8385, 4964], [6, -6], [-3, -19], [-5, 10], [2, 15]], [[8450, 5001], [5, -14], [-1, -11], [-6, -13], [-4, 10], [3, 7], [0, 20], [3, 1]], [[8387, 5072], [2, -23], [-3, -1], [-3, 16], [4, 8]], [[8358, 5325], [5, 5], [14, -20], [10, -6], [7, 17], [3, -19], [-4, -10], [-1, -36], [3, -18], [3, -1], [5, -19], [-10, -55], [-3, -9], [-9, -8], [-5, -11], [2, -12], [-7, -33], [9, -42], [-2, -1], [3, -37], [5, -14], [8, -6], [2, 16], [5, 15], [11, -5], [6, -22], [1
 , -18], [8, 18], [8, -6], [-4, -19], [9, -34], [6, -10], [2, -15], [-2, -17], [-7, 11], [2, 9], [-9, 4], [-4, 10], [-4, -2], [0, 16], [-3, 16], [-6, 5], [-3, 12], [-9, 20], [-1, -23], [3, -7], [2, -23], [-3, -4], [-2, 14], [-11, 27], [-11, 16], [-6, -8], [-2, -14], [-4, -5], [-7, 4], [-4, 19], [-5, 1], [-3, 15], [1, 10], [9, 16], [-3, 19], [-8, 5], [1, -23], [-5, -4], [-1, 12], [-8, 12], [-2, 35], [-4, 11], [1, 30], [-4, 26], [4, 3], [5, -13], [6, -2], [0, 53], [3, 13], [1, 29], [-3, 14], [7, 58], [0, 12], [9, 3]], [[9256, 3174], [14, -15], [-2, -4], [-9, 5], [-3, 14]], [[9184, 3312], [3, 3], [5, -18], [-11, 2], [3, 13]], [[9176, 3317], [-1, -11], [-6, 11], [3, 12], [4, -12]], [[9234, 3347], [9, -4], [5, -6], [-4, -12], [-10, 22]], [[9105, 3596], [7, -9], [-1, -15], [-7, 15], [1, 9]], [[9299, 3596], [6, -4], [6, -24], [5, -9], [3, -14], [3, -2], [8, -21], [1, -15], [-6, -11], [-10, 9], [-5, 14], [1, 14], [-7, 12], [-6, 18], [-2, 13], [3, 20]], [[9089, 3600], [-6, 7], [3, 10], [3, -1
 7]], [[9228, 3689], [-2, -8], [7, -4], [0, -23], [-4, -18], [-8, -3], [0, -14], [4, -9], [-1, -12], [-16, -15], [-13, -26], [-5, -2], [-11, -16], [-24, -1], [-4, 14], [-5, 3], [-6, -6], [-2, 8], [-11, 16], [-6, 2], [-2, 9], [3, 15], [12, -7], [3, 5], [7, -9], [14, 2], [7, 9], [9, -8], [4, 7], [5, -7], [11, 12], [2, 16], [8, 19], [7, -5], [2, 11], [-4, 46], [7, -3], [5, -7], [7, 9]], [[8915, 3803], [9, -5], [20, -20], [1, -8], [27, -21], [13, -5], [9, -14], [5, -12], [7, -6], [7, 4], [1, -11], [9, -9], [5, -18], [7, -2], [14, -35], [-2, -40], [20, -13], [10, -17], [7, -8], [11, -1], [10, -27], [1, -26], [-24, -3], [-1, -16], [5, -18], [1, -13], [12, -22], [4, -17], [11, -8], [3, -38], [5, -7], [4, -26], [5, -5], [14, 8], [2, -13], [-4, -14], [1, -9], [11, -9], [11, -2], [1, -5], [-9, -7], [6, -18], [7, -2], [4, -20], [10, -13], [-13, -11], [-8, 11], [-5, 15], [-8, -1], [-11, 9], [-9, 0], [0, 5], [-10, -3], [-4, 7], [-7, -4], [-13, 20], [-6, 25], [-7, 5], [-4, 26], [-8, 6], [-5, 29], 
 [-5, 13], [-5, 25], [-21, 16], [-12, 6], [-5, 12], [-14, -13], [-10, 5], [3, -18], [-11, -4], [1, -15], [-7, -1], [-10, -6], [11, -32], [1, -13], [-7, -6], [-14, -20], [-12, 12], [-10, -4], [-10, 0], [-3, 5], [-8, -5], [-4, 8]], [[9195, 3795], [5, -11], [6, -3], [10, -19], [7, -5], [4, -15], [8, -14], [2, -12], [11, -13], [5, -20], [-2, -23], [-3, -15], [-6, 11], [-2, 14], [0, 21], [-4, 22], [-7, 21], [-13, 15], [-5, 14], [-18, 27], [2, 5]], [[9172, 3819], [6, -7], [0, -13], [-7, -1], [-6, 15], [7, 6]], [[9079, 3850], [9, -2], [0, -15], [-15, 1], [-2, 11], [8, 5]], [[5544, 7904], [0, -1], [4, -1], [33, -3], [51, -3]], [[5655, 7692], [1, -12], [14, -36], [-1, -22], [-10, -11], [-18, -31], [-13, -30], [4, -35], [-6, 2]], [[5626, 7517], [-15, 10], [-5, 12], [-16, 5], [-9, -11], [-7, 7], [-10, -1], [-8, -15], [-11, 16], [-5, 15], [-8, -15], [-9, 8]], [[5396, 7849], [7, -2], [2, 12], [-11, 3], [0, 4], [46, 23], [10, 2], [10, 20], [21, 14], [27, 6], [8, -29], [11, -6], [17, 8]], [[3138, 5
 320], [29, -3], [9, -7], [2, -10], [-7, -14], [-10, -7], [-8, 4], [-20, -2], [1, 17], [-3, 12], [7, 10]], [[8625, 7047], [5, -17]], [[8630, 7030], [-6, 3], [-12, -19], [-12, -38], [5, -12], [-3, -19], [0, -20], [-13, -10], [-4, -16], [-13, -13], [1, -7], [-9, -12], [-9, 1], [-4, -11], [-10, -10], [2, -11], [-6, -26], [11, -9], [7, -18], [10, -17]], [[8518, 6709], [-8, 4], [-9, -6], [-7, 13], [-5, -16], [-8, -2], [-1, 12], [-12, 16], [0, 17], [5, 15], [7, 10], [-5, 7], [6, 43], [-3, 13], [-5, 1], [-20, 22], [1, 14]], [[4286, 6710], [15, 0], [-1, -8], [-14, 1], [0, 7]], [[4220, 6752], [-11, -2], [2, 11], [9, -9]], [[4794, 6663], [-12, -14], [-10, 7], [-12, 2], [-10, -4], [5, 30], [0, 32], [1, 18], [-4, 24], [-8, 3], [-8, 11], [4, 47], [7, 16], [6, 39], [-1, 5], [6, 44], [1, 23], [-6, 44], [3, 16]], [[3492, 2261], [-2, -5], [2, -15], [-6, -42], [0, -16], [-3, -20]], [[5949, 6241], [8, 19]], [[5987, 6273], [-4, -20]], [[853, 2717], [-8, -1], [-1, 15], [7, -1], [2, -13]], [[6422, 5760], 
 [-7, -4], [-4, 13]], [[6411, 5769], [-2, 48], [8, 45], [6, 8], [10, -28], [-4, -18], [3, -17], [0, -24], [-4, -19], [-6, -4]], [[5783, 7257], [3, -10], [13, -6], [15, 15], [9, -7], [0, -9]], [[5823, 7240], [-1, -26], [-13, -5], [-3, 5], [-6, -10], [-1, -18], [-4, -10], [1, -24], [-3, -18]], [[5630, 7169], [-6, 19], [4, 5], [-6, 12], [-6, -16], [-5, 10], [-10, 3], [-8, 12], [3, 21], [-14, 13], [-6, 12], [-1, 17], [-13, 27]], [[5635, 7436], [7, 10], [6, -7], [12, 0], [13, -7], [9, 3], [9, -16], [10, 13], [25, 7], [4, 16], [9, 3]], [[9064, 7183], [-15, -34], [-2, 6], [11, 34], [6, -6]], [[9133, 7248], [-17, -10], [-35, -56], [-2, 5], [9, 17], [1, 9], [15, 25], [15, 6], [8, 16], [5, 1], [1, -13]], [[9182, 7313], [-12, -24], [-14, -21], [1, 17], [4, 2], [11, 22], [10, 4]], [[9301, 7557], [-1, -20], [-6, 1], [7, 19]], [[9336, 7619], [-7, -17], [-18, -15], [5, 22], [9, 5], [4, 19], [7, -14]], [[8967, 7891], [4, -10], [-2, -27], [8, -29], [4, -47], [-5, -28], [-1, -25], [5, -16], [-3, -16],
  [7, -4], [9, -83], [6, -22], [6, -34], [2, -20], [-22, 7], [-12, -12], [-2, -19], [-12, -65], [0, -18], [6, -24], [7, -13], [4, -39], [10, -9], [3, -15], [-8, 2], [1, 9], [-16, 5], [-2, 10], [-8, -8], [-7, -43], [-7, 1], [-3, 40], [6, 33], [-2, 40], [6, 25], [-2, 26], [-7, 32], [3, 7], [5, 58], [0, 48], [-3, 13], [2, 27], [4, 13], [-5, 28], [-12, 30], [0, 36], [5, 15], [3, 30], [-5, 26], [13, 10], [10, -1], [3, 32], [-8, 21], [12, 3]], [[8827, 7953], [9, -10], [-4, -15], [-8, -12], [-6, 18], [-6, 1], [10, 22], [5, -4]], [[5544, 7904], [6, 10], [6, 25], [9, 0], [16, 24], [1, -1], [-12, -22], [19, -2], [1, 23]], [[9609, 7969], [9, -4], [-1, -11], [6, -15], [-3, -8], [-11, 26], [0, 12]], [[9571, 8243], [4, -11], [-3, -11], [-12, -3], [-7, -9], [-5, 12], [6, 11], [17, 11]], [[6924, 8790], [22, -7], [-6, -15], [-16, 22]], [[0, 8666], [0, 282], [8, -5], [24, -12], [34, -39], [5, 3], [20, -16], [12, -22], [13, 7], [15, -11], [15, -26], [-5, -19], [7, -20], [13, -12], [8, 5], [-3, 21], [13
 , 10], [25, -15], [26, 5], [10, -20], [35, -37], [11, -3], [-22, -18], [-1, -18], [-20, -7], [-20, -1], [-5, -6], [2, -27], [-17, -12], [-3, -20], [9, -3], [2, -11], [-20, -12], [-24, 12], [-2, 8], [-16, 15], [-22, 3], [-12, 16], [3, 9], [-4, 20], [-30, 15], [-12, -12], [-24, 0], [-7, 5], [3, 12], [-14, 17], [4, 18], [-28, -4], [2, -23], [12, -11], [-11, -35], [-9, -6]], [[6396, 8963], [-16, -22], [-31, -12], [-10, 13], [2, 27], [14, 15], [13, 1], [28, -22]], [[9705, 9004], [-6, -14], [-9, 0], [-31, 19], [14, 13], [32, -10], [0, -8]], [[6648, 9046], [5, -10], [26, -21], [0, -14], [-25, -1], [-4, 13], [-15, 3], [-12, 19], [16, 20], [9, -9]], [[0, 9092], [9990, -8], [-23, -5], [-6, 16], [6, 13], [-9967, 23]], [[0, 9131], [0, -39]], [[0, 9131], [35, 3], [10, -3], [26, -21], [-14, -14], [-39, -10], [-18, 6]], [[7160, 9186], [-24, -1], [19, 25], [22, -10], [-17, -14]], [[7209, 9231], [1, -13], [-19, 0], [-9, 8], [16, 17], [11, -12]], [[6536, 9261], [34, -13], [-11, -27], [-11, 0], [-10, 
 -35], [5, -7], [-10, -20], [8, -2], [5, -21], [12, -25], [26, -28], [16, -10], [-9, -12], [-16, 6], [-6, -7], [-17, 3], [-13, 12], [-12, -9], [-8, 10], [-17, -2], [-20, 8], [12, 17], [-15, 26], [-11, -4], [-6, 11], [-22, -7], [-9, 8], [-4, 22], [6, 16], [22, 0], [14, 36], [-14, 9], [21, 18], [0, 13], [16, 11], [13, -2], [20, 11], [11, -6]], [[6970, 9273], [20, -20], [-5, -6], [-34, -8], [-8, 26], [27, 8]], [[8951, 9298], [32, -23], [4, -22], [-11, -4], [-46, 9], [-20, 8], [-23, -6], [-2, 10], [17, 1], [17, 29], [32, -2]], [[8903, 9302], [-9, 22], [19, 4], [4, -20], [-14, -6]], [[8148, 9333], [-16, -19], [-33, 13], [12, 20], [36, -4], [1, -10]], [[9075, 9415], [47, -5], [5, -15], [42, 1], [14, -8], [0, -16], [-39, -9], [-29, 3], [-58, 31], [18, 18]], [[8773, 9407], [-11, 0], [4, 28], [15, -10], [-8, -18]], [[8863, 9459], [19, -15], [30, -11], [1, 18], [14, 11], [32, -20], [39, -2], [36, -23], [-15, -6], [5, -10], [-16, -18], [-40, 8], [-11, 16], [15, 16], [-14, 9], [-12, -14], [15, -
 31], [23, -7], [0, -7], [-31, -6], [-14, 13], [-49, -12], [-16, 8], [-4, -18], [-33, 6], [-28, 26], [6, 15], [-8, 27], [14, 4], [-4, 13], [41, 18], [5, -8]], [[6893, 9521], [21, -13], [0, -15], [-16, -16], [-60, -28], [-109, -37], [-22, -16], [-18, -5], [-7, -21], [-24, -20], [-32, -14], [5, -11], [-18, -13], [-4, -18], [-19, -25], [-17, -15], [-34, 6], [-11, 8], [-22, -8], [-10, 32], [35, 30], [11, 33], [10, 14], [-2, 22], [25, 10], [41, 21], [20, 20], [23, 5], [14, 13], [13, -8], [10, 20], [15, 2], [37, -7], [52, 20], [59, 33], [34, 1]], [[0, 8666], [9985, -17], [-21, -10], [-21, -1], [-19, 12], [-30, 2], [14, -21], [7, 10], [14, 4], [-1, -25], [15, -15], [8, 10], [11, -29], [3, -22], [-11, -1], [6, -16], [20, -14], [-2, -16], [10, -21], [-13, -26], [-30, 15], [-27, 3], [-13, -7], [-9, -12], [-18, -9], [-32, -28], [-10, 3], [-4, -10], [-12, 3], [-2, -14], [-15, -15], [-24, -33], [-19, -10], [-6, -14], [-10, -3], [-9, -17], [-3, -22], [-12, 6], [-7, 25], [-15, 12], [-30, 0], [-33, 
 -20], [-15, -29], [-7, -4], [4, 40], [-5, 5], [-10, -14], [-16, -13], [2, -7], [-11, -14], [-9, 23], [-9, -11], [-4, 6], [-14, -10], [-3, -19], [-6, -9], [4, -16], [-12, -13], [5, -7], [-19, -26], [-11, -40], [1, -12], [12, -10], [7, 13], [17, -19], [-7, -17], [-7, -6], [-1, -45], [12, -1], [4, -40], [-9, -13], [-11, 15], [7, 15], [-6, 4], [-8, -8], [6, -7], [-13, -10], [-10, -38], [-1, -16], [4, -22], [7, -16], [-12, -25], [-11, -1], [-5, 8], [-11, -5], [-19, -26], [-6, -31], [4, -12], [-2, -21], [-8, -2], [-17, -12], [-8, -14], [-7, -33], [2, -10], [-7, -23], [-15, -31], [-27, -40], [-2, 15], [-5, 7], [-2, 67], [-10, 51], [-4, 67], [-6, 41], [-5, 61], [3, 46], [7, 48], [6, 17], [16, 18], [8, 25], [-5, 25], [5, 6], [13, -4], [7, 16], [14, 0], [22, 28], [20, 34], [4, 18], [12, 15], [5, 15], [9, 4], [20, 33], [10, 10], [1, 15], [23, 16], [4, 8], [24, 12], [-8, 6], [15, 25], [-7, 7], [8, 17], [2, 42], [18, 21], [-5, 8], [-37, -11], [-5, -21], [2, -14], [-5, -16], [10, -7], [-12, -9], 
 [-3, 9], [-10, -3], [-12, -21], [-11, -9], [-21, -36], [-19, -6], [8, 27], [-12, 5], [-3, 13], [14, 34], [-23, -8], [-6, 17], [-31, -5], [-5, -6], [-17, 3], [-22, -18], [-1, -18], [-17, -24], [-3, -14], [-27, -28], [-10, -19], [-3, -14], [-7, -2], [-1, -21], [22, -6], [6, -19], [-14, -6], [-5, 5], [-13, -12], [-19, 14], [-12, -24], [-16, 8], [-9, -11], [-19, -1], [-6, 15], [9, 7], [18, -1], [1, 10], [-10, 1], [-10, 21], [-13, -3], [-37, 15], [-13, -9], [-10, -29], [-10, 2], [-1, 8], [-13, 1], [-10, -11], [-8, 7], [-26, 5], [0, -16], [-14, 5], [3, 12], [-26, -3], [-31, 4], [-11, -8], [-9, 3], [-25, -17], [-19, -36], [-19, -17], [-6, -14], [-5, -25], [-15, -11], [-5, -15], [-16, -15], [-15, -21], [-17, -43], [-13, -19], [-35, -45], [-13, -23], [-9, -6], [-9, -14], [1, -12], [14, -11], [14, 3], [17, -2], [-5, -56], [12, 0], [5, 16], [-7, 8], [11, 13], [1, -15], [8, -12], [-12, -30], [16, 4], [16, -3], [8, 31], [-1, 25], [18, -9], [12, 1], [12, -11], [0, -12], [9, -18], [22, -24], [2, -
 11], [-7, -12], [3, -29], [-5, -10], [10, -19], [-1, -17], [-9, -19], [-6, -5], [-5, -20], [0, -18], [-5, -15], [-3, -23], [3, -29], [3, -6], [-6, -14], [4, -21], [-6, -26], [1, -16], [-4, -9], [-2, -30], [-26, -48], [-8, -34], [-12, -23], [-12, -55], [-12, -31], [-14, -30], [-9, -12], [-8, -22], [-5, -8], [-7, -23], [-6, -5], [-7, -17], [-3, -20], [-9, -15], [-2, -12], [-15, -20], [-21, -24], [-19, -15], [-12, 16], [-12, -2], [1, 21], [-16, 8], [-8, -30], [-7, -18], [-10, 3], [-4, -26]], [[8666, 7241], [3, -18], [-2, -12], [9, -21], [7, 11], [6, 27]], [[6367, 7320], [-10, -16], [-6, -2], [-7, -18], [-8, -8], [-14, -1], [-3, -20], [-12, -44], [-10, -12], [0, -15], [15, -17], [7, -31], [-4, -15], [4, -7], [-1, -32], [6, -11], [5, -20], [20, -54]], [[6110, 7108], [-28, 55], [-11, 13], [-11, 5], [-9, 21], [-11, -1], [-5, 18], [-16, 13], [4, 24], [9, -8], [15, 0], [-3, 24], [6, 6], [3, 19], [9, 9], [-4, 17], [-8, 7], [16, 25], [11, 5], [8, 10], [5, -2], [0, 19], [-29, -12]], [[6061, 737
 5], [0, 14], [4, 22], [10, 5], [3, 13], [26, -1], [2, 20], [4, 11], [-5, 23], [-5, 0], [4, 22], [10, 25], [-2, 15], [-14, 20], [-10, 9], [-7, -4], [-21, 19], [-5, -10], [-8, 11], [-8, 25], [-14, -6], [-9, -10], [-9, 6], [-5, 10], [-11, -6], [-7, 10], [-3, 31], [-10, 22], [-6, -4], [-16, 17], [-2, 20], [8, 10], [-8, 10], [-2, 15], [-7, 14], [-7, -5], [-9, 6], [-8, -9], [-16, 5], [-3, -17], [-13, 1]], [[5767, 8158], [9, 13], [-13, 4], [10, 18], [-4, 37]], [[5773, 8242], [9, 14]], [[5778, 8265], [-1, 16], [11, -3], [4, 14], [12, -2], [5, 12], [22, 2], [-7, 12], [-16, -1], [-14, 15], [1, 21], [-12, -10], [-11, 1]], [[5856, 9007], [24, -5], [10, 16], [29, -22], [-18, -12], [30, -4], [2, -8], [23, -1], [42, -9], [48, -34], [21, -25], [30, -21], [14, -4], [28, -23], [2, -32], [7, -6], [-5, -26], [-20, -29], [-31, -19], [-22, -6], [-17, 3], [-29, 14], [-13, 0], [-29, 9], [-16, 14], [-10, -4], [-10, 11], [-33, 5], [4, -13], [19, -12], [-3, -9], [25, -13], [10, -16], [-4, -26], [-10, -10], [7
 , -10], [11, -37], [-5, -3], [3, -18], [11, -11], [13, 3], [14, -24], [24, -8], [3, -6], [20, 10], [0, 26], [-9, 8], [-15, -2], [-19, 37], [10, 3], [5, 16], [20, -11], [9, -12], [9, 0], [33, -22], [14, 5], [13, -6], [-4, 28], [-18, 34], [3, 15], [12, 9], [15, 19], [15, 5], [24, 33], [15, -9], [14, 3], [11, -16], [12, -4], [11, 37], [0, 17], [-8, 15], [-11, 4], [12, 77], [-7, 22], [37, -1], [18, -7], [16, -23], [5, -20], [-38, -8], [-11, -30], [18, -12], [7, -19], [20, -5], [32, 13], [-1, 15], [9, 32], [14, 1], [9, 14], [8, 0], [51, 34], [30, 15], [39, 27], [18, 6], [-10, -25], [5, -19], [-13, -1], [-6, -9], [28, -3], [32, 26], [16, 6], [38, -6], [18, 20], [25, 11], [15, -17], [-10, -11], [1, -15], [16, -5], [8, 9], [-5, 15], [19, 4], [13, 14], [-1, 15], [-9, 2], [-12, 30], [14, 7], [3, 13], [74, -13], [31, -16], [33, -26], [39, -18], [-2, -4], [33, -32], [9, 3], [15, 36], [-17, 7], [-13, 26], [0, 11], [-35, 18], [3, 18], [12, 5], [-6, 12], [5, 13], [0, 30], [-16, -4], [-1, 22], [7, 
 16], [29, 16], [15, 23], [14, 62], [8, 10], [63, 5], [26, -9], [9, -10], [1, -27], [-14, -29], [-4, -18], [-10, -6], [7, -18], [16, -13], [4, -16], [-1, -33], [-10, -11], [8, -31], [-6, -14], [4, -25], [-2, -25], [30, -32], [-15, -21], [3, -25], [-22, -27], [-5, -23], [-14, -18], [-9, 1], [5, -19], [-25, -11], [-21, 25], [-22, -2], [-1, -15], [35, -21], [22, 3], [23, -10], [11, 8], [3, 20], [28, 14], [10, 14], [1, 20], [23, 28], [3, 19], [-4, 17], [-10, 15], [3, 22], [21, 13], [33, 8], [8, -16], [18, -17], [-4, -18], [5, -3], [-6, -34], [25, -16], [8, 10], [-24, 8], [2, 24], [18, 11], [-13, 25], [-1, 19], [-21, 8], [-5, 9], [-34, 10], [-11, -12], [-38, 6], [4, 17], [-11, 23], [6, 32], [17, 24], [-21, 53], [-15, 11], [12, 17], [2, 13], [39, 19], [5, 18], [-4, 38], [15, -9], [6, -36], [-12, -20], [6, -30], [-5, -15], [23, -8], [45, -6], [6, -13], [13, -5], [-5, 26], [-17, 2], [-38, 20], [-9, 25], [25, 10], [19, -16], [18, 12], [-20, 13], [28, 17], [25, -2], [17, -13], [23, -9], [14, -
 23], [11, -4], [31, 6], [13, -7], [-8, -20], [-21, -9], [-2, -19], [26, -10], [-4, -33], [13, -6], [8, 17], [-17, 48], [13, 26], [-7, 17], [-16, 5], [-17, 13], [0, 14], [-27, 5], [-14, 14], [4, 27], [-16, 28], [16, 18], [31, 7], [42, -1], [37, 8], [17, -4], [5, 8], [33, 6], [0, 20], [-21, 6], [-3, 8], [23, 24], [69, 57], [120, 25], [-6, 16], [31, 0], [26, 7], [22, -6], [18, -12], [48, 23], [26, 17], [38, 5], [7, 14], [-5, 17], [34, 31], [30, 18], [42, 3], [34, -20], [-10, -22], [51, -15], [-28, -29], [32, 0], [10, 17], [67, 1], [33, -5], [31, -23], [16, -7], [8, -24], [10, -6], [-10, -25], [2, -16], [-20, -21], [-21, -8], [-11, -15], [-48, -21], [-3, -13], [-25, -13], [-14, -17], [-21, -12], [-16, 1], [-22, -31], [37, -2], [19, 11], [41, 11], [12, 17], [-19, 0], [11, 22], [16, -1], [34, -18], [28, 0], [19, -17], [33, 6], [20, 8], [57, -8], [27, 0], [1, -28], [36, -13], [36, -7], [43, 7], [15, -8], [11, 22], [-8, 25], [20, 4], [10, 13], [40, -24], [12, 6], [12, -12], [11, 12], [24, -
 8], [43, -30], [-32, -8], [-9, -18], [18, -13], [24, -9], [-4, -19], [-11, -1], [5, -33], [7, -20], [26, -29], [25, -13], [18, 28], [7, 27], [12, 26], [17, -22], [28, -15], [24, 12], [26, 7], [42, -21], [14, -16], [9, 16], [-13, 4], [11, 15], [14, 3], [27, -14], [8, 5], [-12, 30], [9, 17], [-21, 9], [11, 14], [37, 3], [19, 17], [107, -16], [42, -17], [-36, -17], [5, -11], [-16, -6], [3, -13], [23, 12], [29, 36], [33, -1], [34, -12], [13, -16], [-10, -11], [11, -18], [14, 0], [28, -16], [13, -18], [-4, -7], [18, -8], [30, 2], [15, 7], [48, 10], [57, -4], [34, -16], [13, -11], [11, -29], [-11, -27], [19, -16], [15, -2], [1, -39], [17, -6], [-4, 26], [27, 21], [38, 2], [7, 5], [23, -14], [23, 2], [35, -7], [21, 19], [15, -15], [2, -23], [28, -10], [9, -23], [20, 3], [15, 12], [1, 23], [-10, 21], [1, 37], [39, -9], [22, -2], [11, -8], [7, 7], [46, -7], [17, 2], [69, -31], [16, -2], [-3, -9], [16, -2], [15, -20], [-9993, -1], [0, -281]], [[7858, 9687], [-5, -8], [35, -2], [14, -19], [19,
  -4], [5, -22], [-16, -12], [-105, -15], [-27, -12], [-21, 6], [21, 21], [6, 23], [36, 49], [21, 7], [17, -12]], [[7524, 9745], [79, -11], [-31, -18], [-38, 16], [-10, 13]], [[7715, 9749], [4, -17], [36, 11], [17, -22], [-8, -45], [12, -11], [-16, -10], [-29, -3], [-30, 5], [-13, 10], [-49, 3], [-19, 14], [-1, 18], [-17, 6], [17, 26], [33, 13], [63, 2]], [[6585, 9764], [-4, -20], [-33, 3], [7, 17], [30, 0]], [[6329, 9798], [-24, -19], [-26, -8], [-27, 15], [77, 12]], [[6729, 9796], [-5, -13], [-29, -15], [-38, 2], [-12, 16], [12, 13], [66, 4], [6, -7]], [[6388, 9801], [47, -13], [-20, -10], [-59, -11], [7, -14], [-40, -9], [-28, 18], [41, 1], [42, 22], [-17, 10], [27, 6]], [[6797, 9826], [20, -21], [-28, -12], [-36, -5], [-17, 12], [42, 10], [19, 16]], [[7536, 9817], [-37, 2], [2, 8], [39, -2], [-4, -8]], [[7665, 9826], [55, -36], [-21, -4], [0, -30], [-74, -7], [-23, -10], [-33, 12], [-16, 22], [22, 3], [-6, 19], [15, 16], [81, 15]], [[5846, 3914], [2, -19], [5, -6], [3, -13], [-1,
  -31], [2, -4], [-1, -19], [-8, -4]], [[5801, 3812], [14, 32], [-4, 25]], [[5821, 3890], [7, 5], [2, -10], [7, 9], [6, 20], [3, 0]], [[4526, 5483], [-1, 5], [2, 42]], [[6345, 6041], [5, -30], [7, -20], [-2, -9], [8, -12], [6, -25], [6, -1], [5, -16], [8, -11], [1, -23], [5, -6], [0, -17], [-3, -13], [1, -21], [9, -18], [3, -27], [7, -23]], [[6422, 5760], [2, -23], [8, -4]], [[6443, 5355], [-26, -9], [-53, -18], [-27, -34], [-16, -49], [-4, -27], [-7, -9], [-6, 0], [-7, 23], [-11, -4], [-25, 6], [-7, 9], [-21, -1], [-8, -5], [-10, 0], [-10, 12], [-7, -14], [-1, -28], [3, -11], [-5, -17], [-7, -12]], [[6188, 5167], [-1, 21], [-6, 15], [0, 9], [-6, 12], [-1, 20], [-16, 33], [-7, 27], [-1, 13], [-6, 17], [1, 10], [-8, 36], [0, 12], [-12, 34], [-13, 22], [-8, 5], [-13, 41], [-6, 28], [2, 6], [-6, 38], [4, 32], [-2, 28], [-8, 34], [-3, 24], [-4, 15], [-11, 21], [-11, 16], [-4, -2], [-8, 34], [1, 16], [-1, 17], [-9, 32], [-7, 15], [1, 12], [-5, 5], [-8, 39], [-12, 40], [-7, 19], [-6, 31], 
 [-8, 17], [-12, 3], [5, 26], [-1, 10], [5, 50]], [[6024, 5571], [0, -25], [6, -27], [0, -16], [4, -35], [-2, -15], [2, -38], [0, -12], [2, -36], [6, -32], [4, 2], [12, -24], [-1, -4], [13, -17], [2, -8]], [[5946, 4670], [-5, 0], [2, 27], [-2, 26], [-15, 33], [-6, 6], [1, 7], [-3, 54], [4, 45], [-13, 0], [0, -15], [-18, 0], [7, -21], [2, -48], [-13, -28], [-8, -32], [-12, -30], [-13, -4], [-8, 17], [-13, 21], [-11, -15], [-4, -21], [-13, -12], [-5, -12], [1, -8], [-23, 1], [-4, 19], [-22, 1], [-11, -10], [-4, 3], [-10, 32], [-8, 17], [-2, 16], [-21, -9], [-3, -23], [-5, -13], [0, -21], [-3, -9], [-3, -35], [-11, -14]], [[5634, 4775], [3, 21], [-1, 13], [-8, 8], [-3, 13], [2, 28], [-6, 28], [2, 10], [-7, 10], [-7, -7], [-4, 11], [4, 19], [9, 19], [-5, 32], [4, 15], [8, 10], [-4, 30], [8, 10], [2, 22], [6, 17], [-1, 25], [5, 10], [6, -2], [8, 5], [11, -2], [0, 121], [0, 150]], [[5943, 4293], [-12, -32], [-9, -1], [-5, 9], [-8, -8], [-10, -3], [-6, -15], [-6, 5], [-5, 16], [-7, -11], [-
 11, 9], [-5, -7], [-3, -14]], [[4535, 4876], [-2, 11], [1, 42]], [[4540, 4967], [-5, 16], [-2, 21], [-11, 39], [-5, 11], [6, 9], [8, 22], [9, 41]], [[3953, 110], [29, -9], [10, -12], [9, -20], [2, -16], [-6, -7], [-10, 25], [-12, 14], [-23, 15], [1, 10]], [[9481, 3257], [13, -18], [8, 0], [5, -16], [0, -11], [-14, 7], [-8, 22], [-6, 7], [2, 9]], [[9483, 3314], [3, -14], [-4, -3], [1, 17]], [[9442, 3312], [12, 2], [11, -23], [1, -10], [-5, -5], [-9, 9], [-13, 1], [-7, 21], [3, 19], [7, -14]], [[9466, 3390], [5, -18], [-1, -15], [6, -11], [2, -35], [-10, 22], [-6, 39], [4, 18]], [[9378, 3402], [3, -3], [4, -20], [-6, 0], [-3, 16], [-6, 1], [1, 17], [5, 2], [2, -13]], [[9365, 3408], [-3, -2], [-3, 11], [4, 9], [2, -18]], [[9349, 3446], [6, -12], [-4, -10], [-4, 11], [2, 11]], [[9405, 3445], [4, 0], [10, -24], [9, -8], [11, -21], [-1, -5], [-13, 10], [-11, 15], [-10, 22], [1, 11]], [[9349, 3512], [12, -17], [7, -34], [-10, 11], [-7, 23], [-6, 11], [4, 6]], [[4650, 4537], [-1, -9], [-6, 
 4], [0, 6], [7, -1]], [[4681, 4487], [-10, 17], [-19, 17], [1, 18], [-7, 5], [-6, 15], [1, 12], [-2, 11], [-5, -3], [-3, 16], [3, 8], [-2, 21], [2, 7], [-4, 9]], [[2560, 4954], [-3, -18], [-24, 6], [-12, 16], [-16, 4], [-8, 15]], [[6359, 4799], [0, -130], [-27, -104]], [[6201, 4816], [6, -10], [0, -8], [10, -31], [12, -25], [9, -6], [10, 3], [11, 18], [4, 1], [7, 13], [20, -12], [5, 4], [20, 30], [9, -5], [13, 3], [5, 10], [9, 3], [8, -5]], [[6359, 4799], [13, 6], [4, 9], [8, 0], [12, 9], [6, 13], [2, 11], [6, 5], [14, -11], [-5, -24], [0, -37], [2, -39], [-7, -9], [-3, -50], [1, -12], [-5, -14], [-2, -16], [-5, -13], [-4, -27], [-6, -26], [-6, -12], [-1, -16], [-6, -30], [-6, -21], [-8, -44], [-2, -19], [-10, -48], [-13, -41], [-7, -32], [-12, -38], [-24, -65], [-17, -43], [-22, -33], [-7, -8], [-12, -22], [-21, -46], [-9, -21], [-20, -54], [-3, -7], [-16, -46], [-12, -50], [-3, -10]], [[5533, 7119], [7, 16], [-6, 14], [10, 6], [-12, 18], [-1, 16], [6, 27], [-9, -2]], [[5183, 3996]
 , [-4, 10], [5, 14], [3, -9], [-4, -15]], [[3409, 4384], [2, 4], [3, 30], [4, 4], [28, -15], [2, 13], [30, 0], [21, -10], [1, -7], [-5, -28]], [[5626, 7517], [-12, -48]], [[5377, 7259], [3, 8]], [[5521, 8147], [-2, -43], [-14, -12], [-2, 31], [9, 21], [9, 3]], [[5671, 8720], [-7, -4], [-15, 4], [-8, -6], [-20, 9], [-1, -21], [-18, -20], [-14, -32], [2, -16], [10, -12], [-19, -23], [-4, -18], [-15, -17], [-22, -8], [-5, -14], [-14, -6], [-11, -22], [-13, -9], [4, -17], [-20, -13], [6, -11], [-5, -21], [0, -18], [-6, -7], [0, -45], [13, -34], [8, 6], [14, -29], [11, -6], [3, -12], [-6, -24], [-12, -13], [3, -20], [-36, -35], [-8, -5], [1, -30], [-10, -20], [6, -13], [0, -18], [-6, -21], [-3, -36], [-3, -2], [-6, -28], [-5, -12], [-8, 8], [-7, -4], [-18, 0], [-9, -14], [-4, -16], [4, -15], [-5, -9], [-8, 3], [-17, -6], [-9, 5], [3, 18], [-4, 6], [-11, 37], [11, 13], [-1, 14], [-14, 19], [-6, 29], [-7, 6], [0, 16], [-6, 16], [5, 26], [-2, 9], [-16, 3], [-1, 26], [7, 19]], [[5891, 2061],
  [-3, 3], [-1, -37], [-12, 1], [-10, 7], [-5, 12], [-6, 41], [10, 40], [8, 12], [12, -17], [3, 2]], [[5999, 6480], [-3, 20], [2, 20], [-1, 15], [-5, 11], [5, 25]], [[5997, 6571], [6, -7], [6, 13], [1, 15], [8, 2], [-4, 19], [4, 24], [8, -6], [2, -8], [12, 0], [20, 19], [10, -5], [3, -8], [16, -4], [15, 6], [26, 25], [22, -1], [14, 7], [6, 11], [4, -16]], [[5402, 4923], [7, 7], [-6, 13], [-4, -13], [-1, 0], [-1, 0]], [[5044, 4437], [-12, -8]], [[7729, 4579], [5, -9], [0, -13], [-5, -7], [0, 29]], [[7858, 4827], [-5, 28], [-5, 12], [-7, -1], [-6, 22], [-7, 13], [-11, -4], [-10, 4], [-4, -4], [-2, 35], [3, 26], [-9, 4], [-11, -3], [-6, -6], [-2, -10], [4, -14], [-4, -31], [2, -32], [-5, -16], [-10, -61], [0, -15], [-10, -39], [1, -52], [3, -18], [-1, -11], [6, -3], [6, 9], [5, -2], [2, -14], [1, -33], [4, -16], [5, -7], [1, -40], [-5, -4], [1, -14], [8, -27], [4, 4], [4, -15], [7, -9], [10, 3], [6, -5], [5, -24], [9, -17]], [[7781, 4453], [-10, 27], [-3, 4], [0, 19], [-8, 13], [-3, 22]
 , [-10, 31], [-5, 1], [0, 11], [-4, 11], [-9, -10], [-2, 22], [1, 14], [4, 24], [-1, 7], [4, 37], [7, 48]], [[6882, 6663], [1, 24], [12, 30], [3, 17], [-8, 26], [1, 32], [-11, 0], [-1, 9], [-9, 8], [3, 19], [9, 10], [16, -7], [5, 1], [2, 20], [5, 12], [-5, 13], [12, 4], [7, -2], [-3, 25], [7, 18], [6, -11], [18, 17], [4, 10], [9, -23], [-11, -17], [6, -17], [10, 1]], [[6497, 6674], [-3, 29], [1, 33], [0, 23], [4, 27], [-8, 14], [-3, 15], [-14, 5], [3, 10], [14, 2], [-8, 17], [4, 12], [-11, 4], [-8, -4], [-4, 8], [-1, 15], [7, 51], [5, -15], [15, 1], [2, -11], [8, 2], [17, 13], [3, 9], [-4, 16], [-16, 25], [-4, 39], [-5, 5], [-15, -3], [-6, -9], [-4, -18], [3, -3], [-3, -21], [-7, 9], [-3, 16]], [[6554, 6960], [29, -5], [4, 8], [-4, 7], [-2, 29], [4, 4]], [[6585, 7003], [7, -27], [14, 10], [-4, 15], [-1, 18]], [[6601, 7019], [5, 3], [4, 22], [7, -2], [1, 16], [6, -3], [3, 10], [8, -17], [7, -1], [3, -12], [7, -6], [10, 1], [5, -7], [1, -35], [3, -9], [-2, -14], [9, -11], [12, 1], [12
 , -7], [5, 10], [11, -12], [9, -45], [4, -5], [3, -31], [4, -8], [25, -35], [6, -15], [11, -17], [6, 1], [9, -16], [9, -10], [18, -27], [7, 3], [19, -18], [-1, -48]], [[8444, 3319], [12, 11]], [[8469, 3346], [6, 24], [21, 11], [5, -3], [10, 7], [3, -5], [12, 13], [10, -8], [-9, -18], [-12, -10], [-4, -10], [-7, -3], [-6, -10], [-10, -4], [-15, -21]], [[3308, 4769], [-4, -11], [1, -39], [-5, -5], [-17, 1], [9, 16], [0, 21], [-3, 11], [19, 6]], [[5303, 6426], [4, -7], [-5, -10], [-4, 4], [0, 12], [5, 1]], [[5238, 6645], [6, 2], [11, 19], [13, 7], [7, -12], [6, 5], [2, -19], [6, -17], [17, 25], [3, -15], [-10, -30], [-7, -8], [-1, -19], [3, -16], [11, -14], [3, -33], [-5, -24], [-9, -23], [-13, -16], [-4, -11], [2, -14], [7, -20], [11, 1], [0, -17], [11, 5], [2, -24], [9, -2]], [[5778, 7007], [2, -24], [8, -14], [20, -15], [-4, -17], [-9, -3], [-11, 9], [-8, -8], [-12, 1], [-10, -26], [-13, -13], [-10, -18], [-4, 9], [9, 20], [-12, 1], [-1, 9]], [[5997, 6571], [2, 8], [-5, 21], [11, 21
 ], [0, 14], [-5, 9], [-12, -13], [1, -10], [-8, -5], [-16, 20], [-6, -4], [-24, -44], [-15, -1], [-9, -8], [-13, 11], [-9, 26], [-19, 19], [-18, 6], [-3, -8], [0, -18], [-4, -20], [-5, 4], [-14, -12], [-16, 15], [-2, 23], [-14, 5], [-5, 7], [-9, -13], [-3, 28], [-10, -4], [-8, 2], [5, 18], [-8, 6], [0, 46], [-10, 4], [-3, 13], [-4, -8], [-10, 13], [6, 5], [-4, 19], [5, 2], [3, -17], [8, -3], [-5, 25], [8, 11], [-6, 5], [2, 9], [-6, 17], [8, 19], [-24, -7], [2, 34], [7, 18], [9, 15], [16, 4], [4, -10], [9, 0], [7, 11], [2, -6], [15, -2], [10, 20], [8, 2], [2, 7], [-9, 15], [5, 19], [19, -7], [10, 5], [16, -10], [11, 1], [5, 16], [20, 21], [4, 8], [18, 12], [11, 10], [38, -5], [7, 11], [5, -7], [3, -18], [8, -9], [12, 7], [5, -7], [0, -12], [9, -16], [5, 10], [10, -6], [1, -8], [15, -11], [3, 8], [6, -12], [12, -4], [31, 14], [4, -7], [15, -7], [25, 22], [10, 11], [4, 10]], [[8378, 5803], [7, -8], [-2, -19], [1, -21], [-5, -26], [-8, -75], [-7, -29], [-5, -16], [-3, -43], [-4, 4], [-2
 , 22], [-8, 17], [-8, 45], [4, 45], [14, 60], [3, 4], [7, 27], [14, 17], [2, -4]], [[6093, 3565], [6, -36], [-3, -2], [-8, 21], [0, 16], [5, 1]], [[5914, 3851], [5, -2], [-1, -11], [-6, 5], [2, 8]], [[5882, 3918], [1, 0], [1, 0], [0, -20], [-5, -44], [2, -31], [2, -27], [6, -4], [-1, 19], [9, 16], [2, -12], [14, -4], [3, 8], [6, -10], [6, 4], [11, 18], [-2, 9], [-4, -7], [-7, 1], [-2, 8], [1, 17], [5, -1], [5, 12], [3, 24], [8, 21]], [[6088, 3654], [0, -14], [-11, -83], [2, -23], [10, -21], [2, -13], [5, -3], [2, -18], [-5, -11], [-3, -24], [5, -17], [0, -12], [-4, -26], [2, -25], [3, -8], [0, -18], [5, -8], [-1, -17], [5, -28], [-1, -12], [13, -16], [6, -20]], [[5971, 3158], [-2, 12], [0, 1], [-5, 9], [0, 3], [-4, 16], [3, 18], [-3, 16], [0, 17], [-3, 25], [-5, 18], [-3, 7], [-3, 6], [0, 1], [-4, -3], [-1, -12]], [[5914, 3314], [-11, 11], [-4, 9], [-11, 4], [-1, 10], [-8, 2], [-4, 15], [-5, 8], [-5, 0]], [[5865, 3373], [-1, 14], [-4, 9], [-2, 18], [-9, 37], [-2, 28], [1, 11], [-6, 
 23], [-6, 14], [-5, -3], [-5, 16], [-1, 16], [6, 9], [0, 9], [-5, 26], [2, 22], [-7, 16], [2, 32]], [[5846, 3914], [10, 4], [26, 0]], [[5944, 4008], [-3, -5], [-9, 0], [-3, 13], [-5, 2], [-8, -20], [-11, 2], [-12, -15], [-3, 3], [-4, -12], [3, -7], [-5, -13], [-4, -23], [2, -15]], [[5823, 3956], [5, 8], [0, 14], [-4, 5]], [[5846, 4079], [2, -15], [11, 35], [7, 7], [5, 18], [0, 20], [-3, 2]], [[6061, 7375], [-18, -1], [-7, -15], [-3, 4], [-11, -15], [-3, 4], [-22, -9], [-17, -26], [-14, -9], [2, -17], [13, -40], [4, -6], [18, 12], [13, -2], [-5, -14], [1, -12], [-17, -5], [-8, 9], [-15, -21], [-15, -7], [-4, -14], [-10, -11], [-7, 1], [-7, 15], [4, 23], [-1, 12], [-9, 4], [-10, 15], [-10, -1], [0, 8], [9, 12], [24, 20], [-4, 13], [-10, 5], [-20, -6], [-6, 4], [-9, 16], [4, 12], [-3, 12], [-28, -6], [-14, -37], [-9, -19], [-5, 1], [-9, -44]], [[5948, 7316], [-4, -13], [10, -15], [8, -2], [9, -14], [4, -24], [6, 1], [-19, 53], [-14, 14]], [[3523, 1643], [-5, -20], [-8, -12], [3, -33]],
  [[3517, 1565], [-5, -23], [-4, -9], [-2, -14], [-13, -21], [-19, -21], [-13, 12], [-11, 2], [-8, -9], [-7, 0], [-13, 15], [-11, 18], [-16, -2], [-17, 38], [-2, 11], [2, 46], [6, 3], [3, 14], [-4, 33]], [[678, 5437], [7, -6], [7, -14], [0, -9], [7, -18], [-4, -10], [-15, -14], [-5, -15], [-5, 7], [0, 22], [-5, 28], [6, 21], [-1, 17], [8, -9]], [[650, 5501], [3, -9], [5, 4], [9, -11], [0, -8], [-12, -7], [-1, 14], [-7, 9], [3, 8]], [[632, 5515], [10, -4], [0, -8], [-11, 3], [1, 9]], [[614, 5542], [0, -19], [-6, -3], [-3, 14], [7, 16], [2, -8]], [[572, 5588], [3, -6], [-4, -20], [-9, 8], [1, 13], [9, 5]], [[2993, 6946], [-5, -5], [0, -14], [-13, -9], [-10, -2], [-13, -9], [-5, 14], [7, 8], [29, 7], [10, 10]], [[2582, 7245], [0, -13], [-7, -21], [-3, 8], [10, 26]], [[2563, 7399], [-5, -2], [-14, -30], [-6, 18], [5, 10], [11, 8], [9, -4]], [[2541, 7452], [-5, -11], [-12, -13], [-2, 6], [19, 18]], [[2511, 7439], [-14, -13], [-12, -7], [-13, -16], [-14, -26], [-16, -23], [8, -7], [28, 17]
 , [-2, -18], [12, -9], [10, 8], [7, 11], [11, 2], [12, 11], [8, 15], [7, -17], [18, -6], [5, -5], [7, -23], [11, 2], [9, -7], [14, 18], [17, -1], [14, 6], [-1, -17], [16, -5]], [[2663, 7321], [-3, -13], [6, -15], [-18, 7], [-2, -14], [-8, 12], [-15, 5], [-3, -8], [-16, -2], [-8, -14], [-7, 7], [-2, -9], [-9, -5], [-10, -34], [-3, -13], [-5, -5], [-6, -27], [3, -1], [8, 19], [9, -1], [-6, -35], [1, -7], [-6, -21], [1, -16], [-6, -31], [0, -18], [3, -15], [-1, -38], [7, -36], [10, -11], [16, 18], [7, 27], [5, 32], [0, 19], [-9, 47], [3, 12], [-3, 21], [7, 21], [0, 23], [6, 16], [6, 2], [9, -12], [3, 11], [1, 21], [6, 11], [2, 18], [9, 13], [15, -12], [4, -10], [16, -10], [6, -19], [-5, -7], [5, -21], [-2, -27], [-5, -5], [-1, -14], [-8, -6], [-1, -22], [6, -5], [6, 7], [7, 20], [8, 6], [7, -10], [4, -47], [3, -18]], [[2704, 7049], [-5, 6], [-2, -18], [-7, -12], [-2, -17], [-7, -20], [13, -12], [6, 0], [8, -11], [13, 8], [10, 1], [9, 15], [27, 21], [25, 28], [9, 12], [8, 19], [-1, 15],
  [-5, 4]], [[2804, 7100], [10, 6], [16, 3], [16, -10], [23, 6], [15, 23], [-2, 12], [4, 13], [-7, 9], [16, 22], [-1, 4]], [[3116, 7279], [5, -11], [5, 0]], [[3134, 7237], [3, -15], [-5, -23], [-37, -18], [1, -12], [-11, 7], [-4, -20], [-12, -14], [-4, 3], [-4, -12], [-6, 9], [-6, -11], [1, -10], [-11, -21], [-7, -33], [2, -11], [-8, -22], [12, -19], [2, -20], [8, -7], [9, 6], [0, -9], [-27, -9], [-8, -6], [0, 19], [-4, 1], [-4, -27], [-28, -8], [-8, 1], [-24, -19], [-18, -36], [9, -13], [-6, -42], [-16, -49], [-8, 11], [-11, 8], [1, -19], [9, -19], [0, -32], [-4, -9], [-7, -28], [-9, -27], [-4, 9], [7, 16], [-4, 30], [-12, 14], [3, 9], [-1, 19], [-9, 6], [0, -26], [4, -10], [1, -24], [3, -11], [-4, -26], [-1, -22], [4, -20], [8, -3], [0, -26], [-1, -4], [3, -20], [-5, -16], [7, -1], [3, -11], [0, -13], [-12, -22], [-9, 4], [-4, -15], [2, -14], [6, -7], [-5, -12], [-10, 1], [-9, -7], [-9, -13], [-8, -19], [-2, -17], [-4, -5], [-10, 2], [-10, -10], [-10, -26], [-2, -17], [-18, -31], [
 -4, -10], [-14, -10], [0, -11], [-11, -18], [1, -5], [-10, -20], [-4, -21], [2, -11], [-6, -15], [-1, -15], [3, -13], [-2, -10], [7, -58], [9, -48], [5, -50], [10, -51], [8, -49], [1, -12], [-2, -65], [-8, -47], [-8, -8], [-11, -1], [-1, 19], [-5, 28], [-14, 23], [-1, 22], [-5, 9], [-1, 11], [-7, 12], [-9, 42], [7, 26], [-1, 8], [-12, -3], [2, 23], [4, 19], [0, 27], [-4, 25], [-6, 0], [-11, 25], [-8, 28], [-9, 14], [-7, -1], [-7, -12], [-13, -15], [-9, -2], [-5, 26], [-7, 6], [-15, 26], [-17, -7], [-3, 9], [-9, -15], [-7, -3], [-9, 11], [-1, 17], [-3, -1], [-2, -23], [-6, 5], [-4, -6], [-10, 7], [-14, -8], [-3, -8], [-7, -1], [-14, 15], [-6, -18], [2, -5], [14, -5], [6, -9], [4, 15], [4, -16], [-11, -16], [6, -18], [9, -2], [5, -15], [-9, -9], [-4, 15], [-8, 8], [-1, 9], [-7, -1], [0, -20], [-10, 12], [-8, -16], [-17, 12], [1, 14], [-7, 4], [-4, 15], [-5, 6], [-8, -5], [1, -10], [-4, -6], [-12, 5], [-14, 12], [-24, -7], [-14, -11], [-5, 0], [1, 16], [-8, -5], [-1, -10], [4, -12], [-
 8, -16], [0, -7], [-12, -21], [-17, -12], [-2, 6], [-6, -9], [3, -8], [-11, -14], [-6, -15], [-7, -26], [-8, -48], [7, -63], [4, -12]], [[2245, 5899], [-2, 25], [-6, 11]], [[2193, 6107], [-7, 13]], [[1746, 6328], [-3, 12], [-2, 30], [-5, 16], [-16, 28], [-9, 8], [-4, 14], [-7, -2], [-12, 10], [-1, 8], [-10, 12], [-14, 4], [-10, -2], [-4, 10], [0, 39], [-7, 8], [0, 12], [-11, 18], [-13, 39], [-4, 7], [-2, 14], [5, 22], [-4, 13], [-6, 0], [-7, 15], [-4, 24], [0, 21], [-10, 15], [-2, 17], [-21, 47], [1, 8], [-4, 23], [2, 14], [-3, 21], [-7, 19], [-7, 12], [-1, 13], [5, 18], [5, 53], [-5, 41], [-6, 23], [1, 24], [-4, 13], [5, 36], [2, 1], [4, 38], [3, 67], [5, 49], [-3, 19], [1, 23], [5, 9], [-8, 11], [4, 6], [0, 20], [-5, 1], [2, 18], [-4, 4], [-7, 50], [-6, 12], [-3, 19], [4, 14], [15, -14], [35, -6], [9, -24], [-5, -4], [4, -13], [-2, -18], [-8, 4], [-4, -11], [8, -6], [11, 22], [-2, 28], [5, 15], [-5, 23], [-4, 5], [3, 14], [-9, 30]], [[96, 7724], [4, -14], [-13, -3], [4, 17], [5, 0
 ]], [[163, 7756], [1, -19], [-18, -9], [1, 8], [10, 6], [0, 11], [6, 3]], [[9802, 7799], [12, -6], [-11, -12], [-8, 9], [0, 10], [7, -1]], [[333, 7840], [4, -13], [-12, -11], [-5, -14], [-8, 10], [11, 6], [0, 14], [10, 8]], [[368, 7869], [6, -13], [-5, -20], [-27, -18], [-1, 8], [17, 10], [2, 17], [-3, 8], [11, 8]], [[451, 7947], [5, 0], [10, -27], [-11, -5], [-14, 1], [-8, -14], [-12, -1], [-3, 12], [7, 7], [4, 14], [9, 1], [13, 12]], [[1355, 8011], [7, -18], [0, -20], [-6, -17], [-18, 20], [5, 6], [2, 26], [10, 3]], [[1289, 8040], [11, -2], [4, -20], [12, -8], [8, -21], [2, -17], [8, -15], [-1, -36], [-8, 3], [-6, 27], [-8, 11], [-11, 1], [2, 16], [-7, 9], [6, 14], [-4, 25], [-7, 1], [-1, 12]], [[1309, 8072], [9, -14], [-11, -6], [2, 20]], [[1278, 8077], [4, -20], [-3, -36], [-7, -2], [-2, 22], [7, 4], [-10, 22], [-1, 8], [12, 2]], [[1284, 8092], [22, -10], [1, -21], [-6, -13], [-13, -2], [-3, 27], [-7, 18], [6, 1]], [[1234, 8104], [-2, -17], [-5, -1], [-1, 24], [8, -6]], [[1238, 
 8119], [12, -4], [4, -10], [7, -38], [-1, -29], [-7, 0], [-8, 36], [-5, 9], [-2, 36]], [[750, 8153], [7, -7], [4, 8], [8, -8], [-4, -12], [9, -3], [-15, -23], [-16, -5], [-20, -35], [-16, 18], [0, 13], [-7, 12], [8, 17], [8, 7], [9, -2], [5, 18], [9, -13], [11, 15]], [[1230, 8175], [22, -15], [-3, -11], [6, -27], [-7, -2], [-16, 17], [-6, -22], [-15, 32], [0, 21], [16, 10], [3, -3]], [[1252, 8185], [6, -15], [14, 0], [6, -16], [-6, -7], [7, -16], [2, -19], [-19, -23], [-2, 12], [5, 14], [-6, 14], [-4, 37], [-3, 19]], [[761, 8192], [17, -13], [-23, -21], [-11, 12], [12, 9], [5, 13]], [[913, 8328], [6, -3], [-16, -27], [-6, 4], [16, 26]], [[386, 8330], [12, -6], [2, -28], [-18, -8], [-10, 4], [-20, 16], [-3, 9], [16, 0], [2, 6], [19, 7]], [[231, 8575], [5, -14], [16, -2], [17, 9], [23, -25], [21, -3], [-2, -10], [-13, 2], [-12, -10], [-32, 29], [-16, -10], [-12, 14], [5, 20]], [[1388, 8008], [-4, -11], [5, -34], [-10, -27], [-9, -10], [-7, 4], [-4, 23], [5, 14], [0, 27], [-8, 20], [-1
 5, -8], [-7, -27], [-8, 17], [9, 19], [-1, 25], [-14, 18], [-8, 26], [-22, 15], [5, 12], [-5, 27], [-17, 35], [-17, 14], [-11, 17], [-4, -28], [-3, 11], [-35, -8], [-12, 8], [-23, 29], [-9, 20], [-33, 22], [-8, 12], [8, 12], [-11, 7], [-21, -8], [-38, 23], [-23, 6], [-31, -8], [-24, 22], [-3, 19], [-9, -15], [-10, 6], [-3, 12], [-14, 2], [-17, 28], [-21, -3], [-9, -11], [-8, 14], [-4, -15], [10, -27], [-9, -12], [-8, -23], [-17, 4], [-15, -9], [-17, -30], [-8, -2], [-15, -17], [-14, -3], [-9, 11], [3, 7], [17, 10], [-17, 17], [12, 29], [5, 25], [-4, 13], [9, 4], [18, 18], [11, -8], [12, 6], [-29, 22], [-14, -17], [-16, -11], [-3, -12], [-14, -20], [3, -5], [-10, -13], [-4, -23], [-9, -14], [-11, -3], [-7, -14], [-10, -6], [-3, -25], [13, 2], [11, -12], [-3, -12], [-18, -17], [-2, -20], [-26, -23], [-9, -12], [-26, -23], [-6, -31], [-6, 1], [-11, -16], [-21, -8], [1, -13], [-15, -3], [0, -28], [-12, -2], [-2, -7], [-17, -3], [-15, -11], [-11, -17], [-12, 2], [-10, -12], [-7, 2], [4, 
 14], [-7, 3], [-9, -35], [-13, -7], [-5, 10], [-5, -17], [-7, 12], [23, 43], [11, 13], [10, 5], [12, -4], [6, -11], [8, 9], [-1, 10], [5, 19], [18, 22], [21, 16], [8, -1], [0, 17], [10, 21], [17, 23], [3, 34], [5, 5], [-2, 21], [12, 19], [-1, 11], [-29, -20], [-7, 12], [-11, 3], [-1, -30], [-6, 2], [-9, 24], [-10, 11], [-5, -11], [-10, 11], [-2, 11], [-14, -15], [-12, -5], [-8, -13], [-6, 11], [0, 18], [-7, 16], [9, 19], [-14, 38], [-15, -2], [-9, -10], [-15, -4], [-13, 2], [-1, 11], [-10, 14], [-14, 12], [-9, 17], [18, 17], [20, -3], [5, -14], [8, 7], [-2, 9], [-28, 3], [-16, 5], [2, 10], [-16, 6], [0, 10], [-16, 23], [17, 18], [-3, 19], [16, 29], [9, 7], [-2, 16], [8, 21], [12, 9], [11, -2], [11, -14], [21, 18], [10, 19], [22, -6], [19, 20], [-7, 55], [6, 10], [-10, 21], [-7, -12], [-18, -4], [-15, -15], [-18, 10], [-8, -6], [-22, 2], [-19, -10], [-32, 10], [-9, 10], [3, 12], [-10, 12], [11, 15], [-29, 9], [-19, 14], [14, 9], [8, 13], [6, -2], [10, 14], [23, 13], [32, 22], [21, 4]
 , [6, -7], [-9, -21], [11, -10], [26, 2], [25, -7], [8, 18], [-30, 46], [9, 4], [7, -21], [13, -15], [11, 6], [12, -12], [15, 2], [0, 9], [-18, 11], [-17, -10], [-10, 12], [1, 25], [-17, -5], [-35, 9], [-13, 37], [-36, 31], [-13, 6], [-17, 16], [8, 15], [0, 22], [16, -1], [37, 5], [20, 13], [13, 22], [6, 27], [26, 35], [18, -2], [14, 7], [25, 20], [8, 13], [8, -4], [37, 6], [22, 17], [18, 20], [27, -12], [-12, -15], [4, -11], [10, 3], [10, 18], [17, -8], [-1, -13], [14, -2], [23, 9], [27, -5], [-4, -21], [13, -8], [33, 4], [19, -4], [21, 4], [34, -11], [9, -8], [19, -5], [35, 0], [16, -13], [57, 9], [18, -7], [9, -12], [24, -14], [11, 0]], [[6651, 7234], [-7, -29], [12, -27], [-3, -15], [11, 5], [3, 15], [-2, 16], [3, 14]], [[6601, 7019], [-7, 14], [-5, -4], [-4, -26]], [[6627, 7263], [-10, -44], [2, -36], [6, 6], [6, 16], [-3, 20], [5, 13], [-2, 20]], [[3313, 4628], [1, -6], [-5, -11], [-6, 0], [-1, 8], [11, 9]], [[3018, 4842], [-1, -7], [-16, -12], [0, -15], [5, -20], [3, -4], [-1
 , -15], [3, -8], [-1, -20], [-9, -25], [-5, -20], [5, -22], [6, -11], [-1, -17], [7, -5], [7, 6], [6, 16], [0, 29], [-9, 33], [-5, 24], [1, 14], [3, 12], [15, 20], [10, 4], [9, 9], [4, 10], [8, -3], [-3, 16], [-9, -7], [-3, 19], [3, 18], [5, 6], [5, -13], [1, -16], [5, -24], [10, 5], [11, -6], [13, -23], [4, -16], [-2, -7], [2, -17], [8, -8], [22, 7], [4, 4], [13, 1], [12, -2], [0, -7], [8, -19], [18, -10], [3, -4], [9, 5], [3, 10], [4, -1], [10, 17], [9, -2], [-3, 13], [33, 9], [16, -5], [-5, -11], [-14, 0], [10, -27], [5, -28], [3, 18], [9, -14], [12, 0], [9, -18], [7, -8], [2, -10], [-5, -11], [-9, -55], [9, 12], [8, 3], [6, -5], [3, 7], [9, -6]], [[7888, 4741], [2, -14], [-2, -7], [-4, 12], [4, 9]], [[7999, 5534], [-6, 2], [-5, -15], [-6, -2], [0, -18], [-6, -7], [-7, 1], [-8, -22], [-2, -29], [-4, -2], [-7, -16], [-4, 1], [-6, -28], [0, -23], [-5, -26], [6, -24], [7, -21], [9, -14], [3, -11], [-2, -7], [5, -27], [14, -28], [2, -12], [14, -29], [5, -17], [10, -15], [6, -23], [7,
  -22], [7, -14], [-2, -7], [5, -30], [0, -11], [7, -51], [-3, -9], [2, -13], [-2, -12], [3, -19], [4, -16], [-7, -19], [0, -42], [-2, -12], [3, -11], [-6, -16], [-1, -12], [-12, -12], [-6, -17], [-7, -2], [-3, -16], [-3, 1], [-17, -24], [-9, 9], [-2, 11], [-4, -14], [2, -22], [-4, -13], [1, -6], [-6, -25], [-8, 0], [0, -12], [-18, -18], [-6, -21], [-6, -14], [-7, -5], [-2, 18], [1, 53], [2, 21], [6, 7], [-3, 10], [-12, 13], [-3, 11]], [[9699, 2644], [4, -12], [-2, -7], [-8, 9], [0, 13], [6, -3]], [[9675, 2729], [7, -11], [-5, -9], [-6, 12], [4, 8]], [[9675, 2818], [-5, -4], [-6, 8], [6, 13], [5, -17]], [[9650, 2832], [10, -17], [-1, -14], [-8, -1], [-4, 32], [-5, 2], [1, 14], [4, -1], [3, -15]], [[9633, 2901], [7, 16], [3, -35], [-2, -11], [-9, -6], [-5, 20], [1, 8], [-3, 31], [6, 1], [2, -24]], [[234, 2989], [-5, -9], [-5, 5], [2, 13], [8, -9]], [[214, 3021], [2, -23], [-8, 0], [-7, 16], [11, 9], [2, -2]], [[6488, 4903], [5, -6], [10, 6], [9, -11], [-9, -14], [-16, -1], [-6, 13], [
 2, 10], [5, 3]], [[6474, 5186], [-14, -12], [-8, -15], [-4, -20], [2, -27], [-5, -3], [-19, -24], [-22, -13], [-11, -15], [-6, 0], [-10, -8], [-14, -16], [-2, -13], [-9, -21], [-14, -5], [-5, 6], [-10, -12], [-7, -17], [-14, -8], [-5, -8], [-13, 1], [-16, -7], [-7, -20], [-8, -7], [-7, -17], [-9, 5], [-7, -12], [-10, -2], [-13, 17], [-6, 27], [1, 36], [-6, 26], [-4, 62], [-3, 23], [-4, 33], [4, 11], [-1, 36]], [[5913, 2061], [-1, -20], [-5, -29], [-4, -48], [-4, -26], [-10, -22], [-8, -7], [-15, -43], [-5, -27], [-3, -6], [-14, -60], [-11, -32], [-17, -31], [-15, -40], [-9, -20], [-40, -69], [-16, -17], [-16, 4], [-7, -6], [-3, -19], [-13, 7], [-4, -2], [-3, -15], [-11, 2], [-8, 8], [-15, 5], [-8, -6], [-10, -1], [-12, 6], [-11, -7], [0, -6], [-13, -15], [-12, -2], [-8, 4], [-4, -8], [-8, 1], [-16, -25], [-9, 2], [-7, 13], [-2, 13], [-6, 5], [-8, -1], [1, 15], [-8, 6], [-7, 42], [-4, 9], [-4, 25], [-3, -3], [-2, 17], [7, 2], [5, 10], [2, 28], [-5, 43], [-8, 23], [-16, 71], [-7, 49],
  [-7, 43], [-5, 15], [-4, 21]], [[5815, 2396], [11, 4], [15, -15], [15, 4], [13, -8]], [[5844, 2867], [-16, 1], [-12, -7], [-15, -24], [0, -25], [-3, -10]], [[5798, 2802], [-2, 4], [-13, -11], [-4, -14], [-4, 4], [-4, -5], [-13, -42], [1, -10], [-7, -16], [-2, -12]], [[5750, 2700], [-9, -8], [-14, 13], [-6, -8], [-8, 13], [-5, -3], [-7, 4]], [[5792, 3316], [5, 6], [8, 22], [4, 23], [-7, 14]], [[5849, 3399], [-3, -20], [9, -4], [6, -17], [5, 8], [-1, 7]], [[5750, 2700], [9, 25], [6, 8], [4, 22], [10, 14], [1, 11], [16, 11], [5, -6], [2, 13], [-5, 4]]]}
\ No newline at end of file
diff --git a/src/main/resources/web/jsps/rs.jsp b/src/main/resources/web/jsps/rs.jsp
index 22a8377..ec635f7 100644
--- a/src/main/resources/web/jsps/rs.jsp
+++ b/src/main/resources/web/jsps/rs.jsp
@@ -29,7 +29,7 @@
     <noscript>
       <div class="alert alert-warning">
       <p><strong>JavaScript required</strong><br>
-      Please enable JavaScript to use this service. If you are using Tor Browser on High Security mode, it is possible to enable JavaScript to run only on this page. Click the NoScript <img src="img/noscript.png"> icon on your address bar and select "Temporarily allow all on this page". Relay Search only uses JavaScript resources that are hosted by the Tor Metrics team.</p>
+      Please enable JavaScript to use this service. If you are using Tor Browser on High Security mode, it is possible to enable JavaScript to run only on this page. Click the NoScript <img src="images/noscript.png"> icon on your address bar and select "Temporarily allow all on this page". Relay Search only uses JavaScript resources that are hosted by the Tor Metrics team.</p>
     </noscript>
   </div>
 </div> <!-- /container -->
@@ -39,6 +39,6 @@
     urlArgs: "v29"
   };
 </script>
-<script data-main="/rs/js/main" src="/rs/js/libs/require/require.js"></script>
+<script data-main="/js/rs/main" src="/js/rs/libs/require/require.js"></script>
 
 <jsp:include page="bottom.jsp"/>
diff --git a/src/main/resources/web/rs b/src/main/resources/web/rs
deleted file mode 160000
index 887512f..0000000
--- a/src/main/resources/web/rs
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 887512f3a111981e1604e9cd6c46b2d32300db14
diff --git a/src/main/resources/web/templates/rs/aggregate/map.html b/src/main/resources/web/templates/rs/aggregate/map.html
new file mode 100644
index 0000000..87ce0dc
--- /dev/null
+++ b/src/main/resources/web/templates/rs/aggregate/map.html
@@ -0,0 +1,67 @@
+
+<h2 id="search-title"></h2>
+
+<% if(!aggregates) { %>
+    <% if(error == 0) { %>
+    <div class="alert alert-info">
+        <strong>No Results found!</strong><p>
+    No Tor relays matched your query :(</p>
+    <p><a href="#">Return to home page</a></p>
+    </div>
+    <% } else if (error == 2) { %>
+    <div class="alert alert-danger">
+        <strong>Backend error!</strong>
+        <p>Relay Search is unable to get a response from its backend server. This
+        probably means that the backend server is unavailable right now. This
+        can also happen, however, if you did not format your query correctly.
+        Please have a look at <a href="#about">the About page</a> that explains
+        what type of search queries are supported by Relay Search.</p>
+    </div>
+    <% } else if (error == 3) { %>
+    <div class="alert alert-danger">
+	<strong>JavaScript Error!</strong><p>There is a problem with your
+	javascript environment, you may have noscript enabled on the remote
+	onionoo backend. Try temporarily allowing noscript to connect to the
+	backend IP address. If the problem persits consult <a
+		href="https://trac.torproject.org/">the bugtracker.</a></p>
+    </div>
+    <% } else if (error == 5) { %>
+    <div class="alert alert-warning">
+        <strong>No query submitted!</strong>
+        <p>The search query was found to be empty, which is not supported. You
+        must enter a search query in order to generate results. Please have a
+        look at <a href="#about">the About page</a> that explains what type of
+        search queries are supported by Relay Search.</p>
+    </div>
+    <% } %>
+<% } else { %>
+   <div class="panel panel-default">
+   <div class="panel-body">
+   <div id="aggregate-map">
+    <div class="alert alert-danger" id="no-svg">
+        <strong>SVG Not Supported!</strong>
+        <p>Your browser does not support Scalable Vector Graphics. This support
+        is required in order to produce the map view. If you are using Tor
+        Browser on high-security mode, you will need to use either medium- or
+        low-security mode instead to view the map.</p>
+    </div>
+   </div>
+   <div id="map-explain"></div>
+   </div></div>
+   <div class="panel panel-default">
+   <div class="panel-body">
+   <form id="map-radio-buttons">
+     <label class="radio-inline"><input type="radio" name="aggregate-property" value="relays"<% if (mapProperty == "relays") { %> checked="checked"<% } %>> Number of Relays</label>
+     <label class="radio-inline"><input type="radio" name="aggregate-property" value="consensus_weight_fraction"<% if (mapProperty == "consensus_weight_fraction") { %> checked="checked"<% } %>> Consensus Weight</label>
+     <label class="radio-inline"><input type="radio" name="aggregate-property" value="guard_probability"<% if (mapProperty == "guard_probability") { %> checked="checked"<% } %>> Guard Probability</label>
+     <label class="radio-inline"><input type="radio" name="aggregate-property" value="middle_probability"<% if (mapProperty == "middle_probability") { %> checked="checked"<% } %>> Middle Probability</label>
+     <label class="radio-inline"><input type="radio" name="aggregate-property" value="exit_probability"<% if (mapProperty == "exit_probability") { %> checked="checked"<% } %>> Exit Probability</label>
+     <label class="radio-inline"><input type="radio" name="aggregate-property" value="advertised_bandwidth"<% if (mapProperty == "advertised_bandwidth") { %> checked="checked"<% } %>> Advertised Bandwidth</label>
+     <label class="radio-inline"><input type="radio" name="aggregate-property" value="consensus_weight_to_bandwidth"<% if (mapProperty == "consensus_weight_to_bandwidth") { %> checked="checked"<% } %>> Consensus Weight to Bandwidth Ratio</label>
+   </form>
+   <a class="btn btn-primary" href="#aggregate/cc<%= (query) ? "/" + query : "" %>">View Table</a>
+   <a class="btn btn-secondary" id="save_svg">Save Map</a>
+   <a class="btn btn-secondary" id="permalink">Permalink</a>
+   </div>
+   </div>
+<% } %>
diff --git a/src/main/resources/web/templates/rs/aggregate/search.html b/src/main/resources/web/templates/rs/aggregate/search.html
new file mode 100644
index 0000000..9a6b6c5
--- /dev/null
+++ b/src/main/resources/web/templates/rs/aggregate/search.html
@@ -0,0 +1,129 @@
+
+<h2 id="search-title"></h2>
+
+<div class="results_box">
+<% if(!aggregates) { %>
+    <% if(error == 0) { %>
+    <div class="alert alert-info">
+        <strong>No Results found!</strong><p>
+    No Tor relays matched your query :(</p>
+    <p><a href="#">Return to home page</a></p>
+    </div>
+    <% } else if (error == 2) { %>
+    <div class="alert alert-danger">
+        <strong>Backend error!</strong>
+        <p>Relay Search is unable to get a response from its backend server. This
+        probably means that the backend server is unavailable right now. This
+        can also happen, however, if you did not format your query correctly.
+        Please have a look at <a href="#about">the About page</a> that explains
+        what type of search queries are supported by Relay Search.</p>
+    </div>
+    <% } else if (error == 3) { %>
+    <div class="alert alert-danger">
+	<strong>JavaScript Error!</strong><p>There is a problem with your
+	javascript environment, you may have noscript enabled on the remote
+	onionoo backend. Try temporarily allowing noscript to connect to the
+	backend IP address. If the problem persits consult <a
+		href="https://trac.torproject.org/">the bugtracker.</a></p>
+    </div>
+    <% } else if (error == 5) { %>
+    <div class="alert alert-warning">
+        <strong>No query submitted!</strong>
+        <p>The search query was found to be empty, which is not supported. You
+        must enter a search query in order to generate results. Please have a
+        look at <a href="#about">the About page</a> that explains what type of
+        search queries are supported by Relay Search.</p>
+    </div>
+    <% } %>
+<% } else { %>
+
+<table class="table table-hover table-striped" id="torstatus_results">
+	<thead>
+		<tr>
+                        <% if (aType == "version") { %><th>Version</th><% } %>
+			<th>Country</sup></th>
+                        <th>Autonomous System</th>
+			<th>Consensus Weight</th>
+			<th>Advertised Bandwidth</th>
+			<th>Guard Probability</th>
+			<th>Middle Probability</th>
+			<th>Exit Probability</th>
+			<th>Relays</th>
+                        <th>Guard</th>
+                        <th>Exit</th>
+		</tr>
+	</thead>
+	<tbody>
+
+<% _.each(aggregates, function(aggregate) { %>
+  <tr>
+    <% if (aType == "version") { %>
+    <td>
+      <%= aggregate.version %>
+    </td>
+    <% } %>
+    <td>
+      <% if ((typeof aggregate.country) == "string") { %>
+        <a href="#search/<%= (query) ? query + " " : "" %><%= (aggregate.version) ? "version:" + aggregate.version + " " : "" %><% if (query.indexOf("country:") == -1) { %>country:<%= aggregate.country  %><% } %>"><img class="inline country" src="/images/cc/<%= aggregate.country %>.png"> <%= countries[aggregate.country] %></a>
+      <% } else { %>
+        <% if ((typeof aggregate.as) == "string") { %>
+          (<a href="#aggregate/ascc/<%= (query) ? query + " " : "" %><%= (aggregate.version) ? "version:" + aggregate.version + " " : "" %><% if (query.indexOf("as:") == -1) { %>as:<%= aggregate.as %><% } %>"><%= aggregate.country.size %> distinct</a>)
+        <% } else { %>
+          (<a href="#aggregate/cc<%= (query || aggregate.version) ? "/" : "" %><% (query) ? query + " " : "" %><%= (aggregate.version) ? "version:" + aggregate.version + " " : "" %>"><%= aggregate.country.size %> distinct</a>)
+        <% } %>
+      <% } %>
+    </td>
+    <td>
+      <% if ((typeof aggregate.as) == "string") { %>
+        <a href="#search/<%= (query) ? query + " " : "" %><%= (aggregate.version) ? "version:" + aggregate.version + " " : "" %><% if (query.indexOf("as:") == -1) { %>as:<%= aggregate.as  %><% } %>"><%= aggregate.as_name %> (<%= aggregate.as %>)</a>
+      <% } else { %>
+        <% if ((typeof aggregate.country) == "string") { %>
+          (<a href="#aggregate/ascc/<%= (query) ? query + " " : "" %><%= (aggregate.version) ? "version:" + aggregate.version + " " : "" %><% if (query.indexOf("country:") == -1) { %>country:<%= aggregate.country %><% } %>"><%= aggregate.as.size %> distinct</a>)
+        <% } else { %>
+          (<a href="#aggregate/as<%= (query || aggregate.version) ? "/" : "" %><% (query) ? query + " " : "" %><%= (aggregate.version) ? "version:" + aggregate.version + " " : "" %>"><%= aggregate.as.size %> distinct</a>)
+        <% } %>
+      <% } %>
+    </td>
+    <td data-order="<%= aggregate.consensus_weight_fraction %>"><span class="tip" title="<%= aggregate.consensus_weight %>"><%= (aggregate.consensus_weight_fraction * 100).toFixed(4) %>%</span></td>
+    <td data-order="<%= aggregate.advertised_bandwidth %>"><%= hrBandwidth(aggregate.advertised_bandwidth) %></span></td>
+    <td data-order="<%= aggregate.guard_probability %>"><%= (aggregate.guard_probability * 100).toFixed(4) %>%</td>
+    <td data-order="<%= aggregate.middle_probability %>"><%= (aggregate.middle_probability * 100).toFixed(4) %>%</td>
+    <td data-order="<%= aggregate.exit_probability %>"><%= (aggregate.exit_probability * 100).toFixed(4) %>%</td>
+    <td>
+      <% if ((typeof aggregate.as) == "string" || (typeof aggregate.country) == "string") { %>
+        <a href="#search/<% if ((typeof aggregate.as) == "string" && query.indexOf("as:") == -1) { %>as:<%= aggregate.as %> <% } if ((typeof aggregate.country) == "string" && query.indexOf("country:") == -1) { %>country:<%= aggregate.country  %> <% } %><%= (query) ? query + " " : "" %><%= (aggregate.version) ? "version:" + aggregate.version + " " : "" %>"><%= aggregate.relays %></a>
+      <% } else { %>
+        <%= aggregate.relays %>
+      <% } %>
+    </td>
+    <td>
+      <% if (aggregate.guards > 0) { %>
+        <a href="#search/<% if ((typeof aggregate.as) == "string" && query.indexOf("as:") == -1) { %>as:<%= aggregate.as %> <% } if ((typeof aggregate.country) == "string" && query.indexOf("country:") == -1) { %>country:<%= aggregate.country  %> <% } %><%= (query) ? query + " " : "" %><% if (query.indexOf("flag:") == -1) { %>flag:guard <% } %><%= (aggregate.version) ? "version:" + aggregate.version + " " : "" %>"><%= aggregate.guards %></a></td>
+      <% } else { %>
+        0
+      <% } %>
+    </td>
+    <td>
+      <% if (aggregate.exits > 0) { %>
+        <a href="#search/<% if ((typeof aggregate.as) == "string" && query.indexOf("as:") == -1) { %>as:<%= aggregate.as %> <% } if ((typeof aggregate.country) == "string" && query.indexOf("country:") == -1) { %>country:<%= aggregate.country  %> <% } %><%= (query) ? query + " " : "" %><% if (query.indexOf("flag:") == -1) { %>flag:exit <% } %><%= (aggregate.version) ? "version:" + aggregate.version + " " : "" %>"><%= aggregate.exits %></a></td>
+      <% } else { %>
+        0
+      <% } %>
+    </td>
+  </tr>
+<% }); %>
+</tbody>
+</table>
+<div class="panel panel-default">
+<div class="panel-body">
+<a href="#map<%= (query) ? "/" + query : "" %>" class="btn btn-primary">View Map</a>
+</div>
+</div>
+  <p>The aggregated search tool displays aggregated data about relays in the
+Tor network. It provides insight into diversity in the network and the
+probabilities of using relays in a particular country or AS as a guard, middle
+or exit relay. The results are restricted to only relays that were running at
+the last time the relays data was updated and do not include bridge data.</p>
+<p>Information for relays was published: <%= relaysPublished %> UTC.<p>
+<% } %>
+</div>
diff --git a/src/main/resources/web/templates/rs/details/bridge.html b/src/main/resources/web/templates/rs/details/bridge.html
new file mode 100644
index 0000000..6eb7dcf
--- /dev/null
+++ b/src/main/resources/web/templates/rs/details/bridge.html
@@ -0,0 +1,204 @@
+
+<h2>
+    Details for: <%= relay.get('nickname') %>
+    <% if (relay.get('running') === false) { %>
+    <span class="tip circle circle-offline" title="This bridge is offline."></span>
+    <% } else { %>
+    <span class="tip circle circle-online" title="This bridge is running."></span>
+    <% } %>
+</h2>
+
+<div class="row">
+    <div class="col-md-6">
+    <h3>Configuration</h3>
+    <dl>
+      <dt><span class="tip" title="This is the nickname that the Tor bridge operator chose.">Nickname</span></dt>
+      <dd><%= _.escape(relay.get('nickname')) %></dd>
+
+      <dt><span class="tip" title="Ports (addresses are hidden) where the bridge listens for incoming connections from clients and other relays.">OR Addresses</span></dt>
+      <dd><%= relay.get('or_addresses') %></dd>
+
+      <dt>
+      <span class="tip" title="The volume of traffic, both incoming and outgoing, that this bridge is willing to sustain, as configured by the operator and claimed to be observed from recent data transfers.">Advertised Bandwidth</span>
+      </dt>
+      <dd><%= relay.get('bandwidth_hr') ? relay.get('bandwidth_hr') : 'not defined' %></dd>
+    </dl>
+
+
+    </div>
+    <div class="col-md-6">
+    <% if (relay.get('running') === true) { %>
+    <h3>Properties</h3>
+    <% } else { %>
+    <h3>Last Known Properties</h3>
+    <% } %>
+    <dl>
+
+    <dt><span class="tip" title="Hash of 20-byte unique identifier of the bridge.">Hashed Fingerprint</span></dt>
+    <dd><pre><%= relay.get('fingerprint') %></pre></dd>
+
+    <% if (relay.get('running') === true) { %>
+    <dt><span class="tip" title="The time since this bridge is online.">Uptime</span></dt>
+    <dd><%= relay.get('uptime_hrfull') %></dd>
+    <% } else { %>
+    <dt><span class="tip" title="The time since this bridge was last seen online.">Downtime</span></dt>
+    <dd><%= relay.get('downtime') %></dd>
+    <dt><span class="tip" title="Timestamp when the bridge was last seen in the consensus.">Last Seen</span></dt>
+    <dd><%= relay.get('last_seen') %></dd>
+    <% } %>
+
+    <dt><span class="tip" title="Flags that the directory authorities assigned to this bridge.">Flags</span></dt>
+    <dd><% _.each(relay.get('flags'), function(flag) { %>
+    <span class="tip flags" title="<%= flag[2] %>">
+        <img class="inline" alt="" src="/images/flags/<%= flag[1] %>.png"/>
+        <span class="inline"><%= flag[0] %></span>
+    </span>
+    <% }); %>
+    </dd>
+    
+    <dt><span class="tip" title="Flags that have been generated by Relay Search to provide extra useful information. These flags do not appear in the directory consensus.">Additional Flags</span></dt>
+    <dd>
+        <% var propertyCount = 0; %>
+        <% _.each(relay.get('additional_flags'), function(flag) { propertyCount++; %>
+            <span class="tip flags" title="<%= flag[2] %>">
+                <img class="inline" alt="" src="/images/flags/<%= flag[1] %>.png"/>
+                <span class="inline"><%= flag[0] %></span>
+            </span>
+        <% }); %>
+        <%= propertyCount==0 ? 'none' : '' %>
+    </dd>
+
+    <dt><span class="tip" title="The first time that this relay was seen online.">First Seen</span></dt>
+    <dd><%= relay.get('first_seen') %></dd>
+
+    <dt><span class="tip" title="Date and time when the bridge was last (re-)started.">Last Restarted</span></dt>
+    <dd><%= relay.get('last_restarted') %></dd>
+
+    <dt><span class="tip" title="What OS and Tor version the bridge is using">Platform</span></dt>
+    <dd><%= _.escape(relay.get('platform')) %></dd>
+
+    <dt><span class="tip" title="Transport protocols supported by this bridge.">Transport protocols</span></dt>
+    <dd><%= relay.get('transports') ? relay.get('transports') : 'none' %></dd>
+
+    </dl>
+    </div>
+</div>
+
+<h3>History</h3>
+
+<ul class="nav nav-tabs">
+  <li id="history-1m-tab" class="history-tabs active"><a onclick="$('.history').hide();$('#history-1m').fadeIn();$('.history-tabs').removeClass('active');$('#history-1m-tab').addClass('active');">1 Month</a></li>
+  <li id="history-3m-tab" class="history-tabs"><a onclick="$('.history').hide();$('#history-3m').fadeIn();$('.history-tabs').removeClass('active');$('#history-3m-tab').addClass('active');">3 Months</a></li>
+  <li id="history-1y-tab" class="history-tabs"><a onclick="$('.history').hide();$('#history-1y').fadeIn();$('.history-tabs').removeClass('active');$('#history-1y-tab').addClass('active');">1 Year</a></li>
+  <li id="history-5y-tab" class="history-tabs"><a onclick="$('.history').hide();$('#history-5y').fadeIn();$('.history-tabs').removeClass('active');$('#history-5y-tab').addClass('active');">5 Years</a></li>
+</ul>
+
+<div class="tab-content" id="history-tab-content">
+  <div id="history-1m" class="history tab-pane active">
+    <div class="row">
+        <div class="col-md-6">
+          <div class="thumbnail">
+            <div id="bw_month" class="graph">
+            <img src="/images/no-data-available.png" alt="">
+            </div>
+            <div class="caption">
+              <h5>1 Month graph</h5>
+              <a id="save_bw_month" href="">Save Graph</a>
+            </div>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <div class="thumbnail">
+            <div id="clients_month" class="graph">
+            <img src="/images/no-data-available.png" alt="">
+            </div>
+            <div class="caption">
+              <h5>1 Month graph</h5>
+              <a id="save_clients_month" href="">Save Graph</a>
+            </div>
+          </div>
+        </div>
+     </div>
+  </div>
+  <div id="history-3m" class="history tab-pane">
+    <div class="row">
+        <div class="col-md-6">
+          <div class="thumbnail">
+
+            <div id="bw_months" class="graph">
+            <img src="/images/no-data-available.png" alt="">
+            </div>
+            <div class="caption">
+              <h5>3 Months graph</h5>
+              <a id="save_bw_months" href="">Save Graph</a>
+            </div>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <div class="thumbnail">
+            <div id="clients_months" class="graph">
+            <img src="/images/no-data-available.png" alt="">
+            </div>
+            <div class="caption">
+              <h5>3 Months graph</h5>
+              <a id="save_clients_months" href="">Save Graph</a>
+            </div>
+          </div>
+        </div>
+    </div>
+  </div>
+  <div id="history-1y" class="history tab-pane">
+    <div class="row">
+        <div class="col-md-6">
+          <div class="thumbnail">
+            <div id="bw_year" class="graph">
+            <img src="/images/no-data-available.png" alt="">
+            </div>
+            <div class="caption">
+              <h5>1 Year graph</h5>
+              <a id="save_bw_year" href="">Save Graph</a>
+            </div>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <div class="thumbnail">
+            <div id="clients_year" class="graph">
+            <img src="/images/no-data-available.png" alt="">
+            </div>
+            <div class="caption">
+              <h5>1 Year graph</h5>
+              <a id="save_clients_year" href="">Save Graph</a>
+            </div>
+          </div>
+        </div>
+    </div>
+  </div>
+  <div id="history-5y" class="history tab-pane">
+    <div class="row">
+        <div class="col-md-6">
+          <div class="thumbnail">
+            <div id="bw_years" class="graph">
+            <img src="/images/no-data-available.png" alt="">
+            </div>
+            <div class="caption">
+              <h5>5 Years graph</h5>
+              <a id="save_bw_years" href="">Save Graph</a>
+            </div>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <div class="thumbnail">
+            <div id="clients_years" class="graph">
+            <img src="/images/no-data-available.png" alt="">
+            </div>
+
+           <div class="caption">
+              <h5>5 Years graph</h5>
+              <a id="save_clients_years" href="">Save Graph</a>
+            </div>
+          </div>
+        </div>
+    </div>
+  </div>
+<p>Information for bridges was published: <%= relay.get('bridgesPublished') %> UTC.</p>
+
diff --git a/src/main/resources/web/templates/rs/details/error.html b/src/main/resources/web/templates/rs/details/error.html
new file mode 100644
index 0000000..2439927
--- /dev/null
+++ b/src/main/resources/web/templates/rs/details/error.html
@@ -0,0 +1,5 @@
+    <div class="alert alert-info">
+        <strong>No Results found!</strong><p>
+    No Tor relays or bridges matched your query :(</p>
+    <p><a href="#">Return to home page</a></p>
+    </div>
diff --git a/src/main/resources/web/templates/rs/details/router.html b/src/main/resources/web/templates/rs/details/router.html
new file mode 100644
index 0000000..ef0508c
--- /dev/null
+++ b/src/main/resources/web/templates/rs/details/router.html
@@ -0,0 +1,307 @@
+<h2>
+    Details for: <%= relay.get('nickname') %>
+    <% if (relay.get('running') === false) { %>
+    <span class="tip circle circle-offline" title="This relay is offline."></span>
+    <% } else { %>
+    <span class="tip circle circle-online" title="This relay is running."></span>
+    <% } %>
+</h2>
+
+<% if (relay.get('new_relay') === true) {%>
+<div class="alert alert-info">This relay appears to be less than 2 weeks old. <a href="https://blog.torproject.org/lifecycle-new-relay">This blog post</a> explains the lifecycle of a new relay, and why it will not be immediately fully used to capacity.</div>
+<% } %>
+<% if (relay.get('recommended_version') === false && relay.get('version_consistent') == true) { %>
+<div class="alert alert-danger">This relay is running a version of Tor that is not recommended.
+It is most likely too old and may be missing important security fixes. If
+this is the case, and this is your relay, you should update it as soon as
+possible. Development versions (versions that are too new) will also trigger
+this warning message (see bug <a
+href="https://bugs.torproject.org/24256">#24256</a>).</div>
+<% } %>
+<div class="row">
+    <div class="col-md-6">
+    <h3>Configuration</h3>
+    <dl>
+      <dt><span class="tip" title="This is the nickname that the Tor relay operator chose.">Nickname</span> <a href="#search/<%= _.escape(relay.get('nickname')) %>"><i class="fa fa-search"></i></a></dt>
+      <dd><%= _.escape(relay.get('nickname')) %></dd>
+
+      <dt><span class="tip" title="Addresses and ports where the relay listens for incoming connections from clients and other relays.">OR Addresses</span> <a href="#search/<%= relay.get('or_addresses')[0].split(":")[0] %>"><i class="fa fa-search"></i></a></dt>
+      <dd>
+        <pre class="pre-scrollable"><% _.each(relay.get('or_addresses'),
+          function(or_address) { %><%= $.trim(or_address) %><br><% }); %></pre>
+      </dd>
+      <% if (relay.get('unreachable_or_addresses').length > 0) { %>
+      <dt><span class="tip" title="Addresses and ports where the relay claims to listen for incoming connections from clients and other relays but that the directory authorities failed to confirm as reachable.">Unreachable OR Addresses</span></dt>
+      <dd>
+        <pre class="pre-scrollable"><% _.each(relay.get('unreachable_or_addresses'),
+          function(or_address) { %><%= $.trim(or_address) %><br><% }); %></pre>
+      </dd>
+      <% } %>
+
+      <dt><span class="tip" title="These are the contact details of the Tor relay operator">Contact</span></dt>
+      <dd><%= _.escape( relay.get('contact')!='undefined' ? relay.get('contact') : 'none' ) %></dd>
+
+      <dt><span class="tip" title="Address and port where the relay listens for directory requests.">Dir Address</span></dt>
+      <dd><%= relay.get('dir_address') ? relay.get('dir_address') : 'none' %></dd>
+
+      <dt><span class="tip" title="Addresses that the relay used to exit to the Internet in the past 24 hours. <em>Only lists addresses that are different from the OR addresses.</em>">Exit Addresses</span></dt>
+      <dd>
+        <% if (relay.get('exit_addresses')) { %>
+          <% _.each(relay.get('exit_addresses'), function(exit_address) { %>
+            <a href="#search/<%= exit_address %>"><%= exit_address %></a><br>
+          <% }); %>
+        <% } else { %>
+          none
+        <% } %>
+      </dd>
+
+      <dt>
+      <span class="tip" title="The volume of traffic, both incoming and outgoing, that the relay is willing to sustain, as configured by the operator and claimed to be observed from recent data transfers.">Advertised Bandwidth</span>
+      </dt>
+      <dd><span class="tip" title="Bandwidth rate: <%= relay.get('bandwidthr') %><br>Bandwidth burst: <%= relay.get('bandwidthb') %><br>Observed bandwidth: <%= relay.get('obandwidth') %>"><%= relay.get('bandwidth_hr') %></span></dd>
+      <dt><span class="tip" title="Port summary of IPv4 exit connections that the relay is going to accept or reject.">IPv4 Exit Policy Summary</span></dt>
+      <dd>
+      <% if ('accept' in relay.get('exit_policy_summary')) { %>
+        <pre class="pre-scrollable">accept<% _.each(relay.get('exit_policy_summary')['accept'],
+          function(ports) { %><br>  <%= $.trim(ports) %><% });} %></pre>
+      <% if ('reject' in relay.get('exit_policy_summary')) { %>
+        <pre class="pre-scrollable">reject<% _.each(relay.get('exit_policy_summary')['reject'],
+          function(ports) { %><br>  <%= $.trim(ports) %><% });} %></pre>
+      </dd>
+      <dt><span class="tip" title="Port summary of IPv6 exit connections that the relay is going to accept or reject.">IPv6 Exit Policy Summary</span></dt>
+      <dd>
+      <% if (relay.get('exit_policy_v6_summary') && ('accept' in relay.get('exit_policy_v6_summary'))) { %>
+        <pre class="pre-scrollable">accept<% _.each(relay.get('exit_policy_v6_summary')['accept'],
+          function(ports) { %><br>  <%= $.trim(ports) %><% });} %></pre>
+      <% if (relay.get('exit_policy_v6_summary') && ('reject' in relay.get('exit_policy_v6_summary'))) { %>
+        <pre class="pre-scrollable">reject<% _.each(relay.get('exit_policy_v6_summary')['reject'],
+          function(ports) { %><br>  <%= $.trim(ports) %><% });} %></pre>
+      <% if (relay.get('exit_policy_v6_summary') == null) { %>
+        <pre class="pre-scrollable">reject<br>  1-65535</pre>
+      <% } %>
+      </dd>
+      <dt><span class="tip" title="Policy of exit connections that the relay is going to accept or reject.">Exit Policy</span></dt>
+      <dd>
+      <pre class="pre-scrollable"><% _.each(relay.get('exit_policy'), function(line) { %>
+<%= $.trim(line) %><% }); %></pre>
+      </dd>
+    </dl>
+
+    <dt><span class="tip" title="Relays that are part of this relay's family and consider this relay to be part of their family.">Effective Family Members</span>
+    <% if (relay.get('effective_family') !== null) { %><a href="#search/family:<%= relay.get('fingerprint') %>"><i class="fa fa-search"></i></a><% } %></dt>
+    <dd>
+        <pre class="pre-scrollable"><% if (relay.get('effective_family') !== null) { %><% _.each(relay.get('effective_family'), function(member) { %><% var valid = member.match(RegExp("^[A-F0-9]{40}$")); %>
+<% if (valid) { %><a href="#details/<%= member %>"><% } %><%= member %><% if (valid) { %></a><% }}); %>
+<% } else { %>none<% } %></pre>
+    </dd>
+    <dt><span class="tip" title="Relays that are part of this relay's family but don't consider this relay to be part of their family.">Alleged Family Members</span></dt>
+    <dd>
+        <pre class="pre-scrollable"><% if (relay.get('alleged_family') !== null) { %><% _.each(relay.get('alleged_family'), function(member) { %><% var valid = member.match(RegExp("^[A-F0-9]{40}$")); %>
+<% if (valid) { %><a href="#details/<%= member %>" class="alleged"><% } %><%= member %><% if (valid) { %></a><% }}); %>
+<% } else { %>none<% } %></pre>
+    </dd>
+
+
+    </div>
+    <div class="col-md-6">
+    <% if (relay.get('running') === true) { %>
+    <h3>Properties</h3>
+    <% } else { %>
+    <h3>Last Known Properties</h3>
+    <% } %>
+    <dl>
+
+    <dt><span class="tip" title="20-byte unique identifier of the relay.">Fingerprint</span></dt>
+    <dd><pre><%= relay.get('fingerprint') %></pre></dd>
+
+    <% if (relay.get('running') === true) { %>
+    <dt><span class="tip" title="The time since this relay is online.">Uptime</span></dt>
+    <dd><%= relay.get('uptime_hrfull') %></dd>
+    <% } else { %>
+    <dt><span class="tip" title="The time since this relay was last seen online.">Downtime</span></dt>
+    <dd><%= relay.get('downtime') %></dd>
+    <dt><span class="tip" title="Timestamp when the relay was last seen in the consensus.">Last Seen</span></dt>
+    <dd><%= relay.get('last_seen') %></dd>
+    <% } %>
+
+    <dt><span class="tip" title="Flags that the directory authorities assigned to this relay.">Flags</span></dt>
+    <dd><% _.each(relay.get('flags'), function(flag) { %>
+        <span class="tip flags" title="<%= flag[2] %>">
+            <img class="inline" alt="" src="/images/flags/<%= flag[1] %>.png"/>
+            <span class="inline"><%= flag[0] %></span>
+        </span>
+    <% }); %>
+    </dd>
+    
+    <dt><span class="tip" title="Flags that have been generated by Relay Search to provide extra useful information. These flags do not appear in the directory consensus.">Additional Flags</span></dt>
+    <dd>
+    <dd>
+        <% var propertyCount = 0; %>
+        <% _.each(relay.get('additional_flags'), function(flag) { propertyCount++; %>
+            <span class="tip flags" title="<%= flag[2] %>">
+                <img class="inline" alt="" src="/images/flags/<%= flag[1] %>.png"/>
+                <span class="inline"><%= flag[0] %></span>
+            </span>
+        <% }); %>
+        <%= propertyCount==0 ? 'none' : '' %>
+    </dd>
+
+    <dt><span class="tip" title="Host name as found in a reverse DNS lookup of the relay's primary IP address. This field is updated at most once in 12 hours, unless the relay IP address changes. Omitted if the relay IP address was not looked up, if no lookup request was successful yet or if no A record was found matching the PTR record.">Host Name</span></dt>
+    <dd><% if (relay.get('host_name')) { %><%= relay.get('host_name') %><% } else { %>No PTR record found<% } %></dd>
+
+    <dt><span class="tip" title="Country as found in a GeoIP database by resolving the relay's first onion-routing address.">Country</span></dt>
+    <dd><% if (relay.get('country')) { %><img class="inline country" title="<%= relay.get('countryname') %>" alt="" src="/images/cc/<%= relay.get('country') %>.png"/> <%= relay.get('countryname') %><% } else { %>Unknown<% } %></dd>
+
+    <dt><span class="tip" title="Autonomous System Number">AS Number</span></dt>
+    <dd><% if (relay.get('as_number') !== null) { %><a href="#search/as:<%= relay.get('as_number') %>"><%= _.escape(relay.get('as_number')) %></a><% } else { %>unknown<% }; %></dd>
+
+    <dt><span class="tip" title="Autonomous System Name">AS Name</span></dt>
+    <dd><%= relay.get('as_name') ? _.escape(relay.get('as_name')) : "unknown" %></dd>
+
+    <dt><span class="tip" title="The first time that this relay was seen online.">First Seen</span></dt>
+    <dd><%= relay.get('first_seen') %> (<%= relay.get('age') %>)</dd>
+
+    <dt><span class="tip" title="Date and time when the relay was last (re-)started.">Last Restarted</span></dt>
+    <dd><%= relay.get('last_restarted') %></dd>
+
+
+    <dt><span class="tip" title="Weight assigned to this relay by the directory authorities that clients use in their path selection algorithm. The unit is arbitrary; currently it's kilobytes per second, but that might change in the future.">Consensus Weight</span></dt>
+    <dd><%= relay.get('consensus_weight') %></dd>
+
+    <dt><span class="tip" title="What OS and Tor version the relay is using">Platform</span></dt>
+    <dd><%= _.escape(relay.get('platform')) %><% if (!relay.get('version_consistent')) { %> (version is <%= _.escape(relay.get('version')) %> in consensus)<% } %></dd>
+
+    </dl>
+    </div>
+</div>
+
+<h3>History</h3>
+
+<ul class="nav nav-tabs">
+  <li id="history-1m-tab" class="history-tabs active"><a onclick="$('.history').hide();$('#history-1m').fadeIn();$('.history-tabs').removeClass('active');$('#history-1m-tab').addClass('active');">1 Month</a></li>
+  <li id="history-3m-tab" class="history-tabs"><a onclick="$('.history').hide();$('#history-3m').fadeIn();$('.history-tabs').removeClass('active');$('#history-3m-tab').addClass('active');">3 Months</a></li>
+  <li id="history-1y-tab" class="history-tabs"><a onclick="$('.history').hide();$('#history-1y').fadeIn();$('.history-tabs').removeClass('active');$('#history-1y-tab').addClass('active');">1 Year</a></li>
+  <li id="history-5y-tab" class="history-tabs"><a onclick="$('.history').hide();$('#history-5y').fadeIn();$('.history-tabs').removeClass('active');$('#history-5y-tab').addClass('active');">5 Years</a></li>
+</ul>
+
+<div class="tab-content" id="history-tab-content">
+  <div id="history-1m" class="history tab-pane active">
+    <div class="row">
+        <div class="col-md-6">
+          <div class="thumbnail">
+            <div id="bw_month" class="graph">
+            <img src="/images/no-data-available.png" alt="">
+            </div>
+            <div class="caption">
+              <h5>1 Month graph</h5>
+              <a id="save_bw_month" href="">Save Graph</a>
+            </div>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <div class="thumbnail">
+            <div id="weights_month" class="graph">
+            <img src="/images/no-data-available.png" alt="">
+            </div>
+           <div class="caption">
+              <h5>1 Month graph</h5>
+              <a id="save_weights_month" href="">Save Graph</a>
+            </div>
+          </div>
+        </div>
+    </div>
+  </div>
+  <div id="history-3m" class="history tab-pane">
+    <div class="row">
+        <div class="col-md-6">
+          <div class="thumbnail">
+            <div id="bw_months" class="graph">
+            <img src="/images/no-data-available.png" alt="">
+            </div>
+            <div class="caption">
+              <h5>3 Months graph</h5>
+              <a id="save_bw_months" href="">Save Graph</a>
+            </div>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <div class="thumbnail">
+            <div id="weights_months" class="graph">
+            <img src="/images/no-data-available.png" alt="">
+            </div>
+           <div class="caption">
+              <h5>3 Months graph</h5>
+              <a id="save_weights_months" href="">Save Graph</a>
+            </div>
+          </div>
+        </div>
+      </div>
+  </div>
+  <div id="history-1y" class="history tab-pane">
+    <div class="row">
+        <div class="col-md-6">
+          <div class="thumbnail">
+            <div id="bw_year" class="graph">
+            <img src="/images/no-data-available.png" alt="">
+            </div>
+            <div class="caption">
+              <h5>1 Year graph</h5>
+              <a id="save_bw_year" href="">Save Graph</a>
+            </div>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <div class="thumbnail">
+            <div id="weights_year" class="graph">
+            <img src="/images/no-data-available.png" alt="">
+            </div>
+           <div class="caption">
+              <h5>1 Year graph</h5>
+              <a id="save_weights_year" href="">Save Graph</a>
+            </div>
+          </div>
+        </div>
+    </div>
+  </div>
+  <div id="history-5y" class="history tab-pane">
+    <div class="row">
+        <div class="col-md-6">
+          <div class="thumbnail">
+            <div id="bw_years" class="graph">
+            <img src="/images/no-data-available.png" alt="">
+            </div>
+           <div class="caption">
+              <h5>5 Years graph</h5>
+              <a id="save_bw_years" href="">Save Graph</a>
+            </div>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <div class="thumbnail">
+            <div id="weights_years" class="graph">
+            <img src="/images/no-data-available.png" alt="">
+            </div>
+           <div class="caption">
+              <h5>5 Years graph</h5>
+              <a id="save_weights_years" href="">Save Graph</a>
+            </div>
+          </div>
+        </div>
+    </div>
+  </div>
+</div>
+
+<% if (relay.get('dir_address')) { %>
+<h3>Advanced</h3>
+<p>
+<a href="http://<%= relay.get('dir_address') %>/tor/server/authority"
+  class="btn btn-info">Latest server descriptor</a>
+
+<a href="http://<%= relay.get('dir_address') %>/tor/extra/authority"
+  class="btn btn-info">Latest extra-info descriptor</a>
+</p>
+<% } %>
+
+</div><!-- container-fluid -->
+
+<p>Information for relays was published: <%= relay.get('relaysPublished') %> UTC.</p>
diff --git a/src/main/resources/web/templates/rs/search/do.html b/src/main/resources/web/templates/rs/search/do.html
new file mode 100644
index 0000000..71ec7be
--- /dev/null
+++ b/src/main/resources/web/templates/rs/search/do.html
@@ -0,0 +1,133 @@
+
+<h2 id="search-title"></h2>
+
+<div class="results_box">
+<% if(!relays) { %>
+    <% if(error == 0) { %>
+    <div class="alert alert-info">
+        <strong>No Results found!</strong><p>
+    No Tor relays matched your query :(</p>
+    <p><a href="#">Return to home page</a></p>
+    </div>
+    <% } else if (error == 2) { %>
+    <div class="alert alert-danger">
+        <strong>Backend error!</strong>
+        <p>Relay Search is unable to get a response from its backend server. This
+        probably means that the backend server is unavailable right now. This
+        can also happen, however, if you did not format your query correctly.
+        Please have a look at <a href="#about">the About page</a> that explains
+        what type of search queries are supported by Relay Search.</p>
+    </div>
+    <% } else if (error == 3) { %>
+    <div class="alert alert-danger">
+	<strong>JavaScript Error!</strong><p>There is a problem with your
+	javascript environment, you may have noscript enabled on the remote
+	onionoo backend. Try temporarily allowing noscript to connect to the
+	backend IP address. If the problem persits consult <a
+		href="https://trac.torproject.org/">the bugtracker.</a></p>
+    </div>
+    <% } else if (error == 5) { %>
+    <div class="alert alert-warning">
+        <strong>No query submitted!</strong>
+        <p>The search query was found to be empty, which is not supported. You
+        must enter a search query in order to generate results. Please have a
+        look at <a href="#about">the About page</a> that explains what type of
+        search queries are supported by Relay Search.</p>
+    </div>
+    <% } %>
+<% } else { %>
+    <% if (error == 4) { %>
+    <div class="alert alert-warning">
+        <strong>Too many matches!</strong><p>The current version of
+        Relay Search does not support a result set greater than 2000 and only displays
+        the first 2000 hits. This is due to some performance issues in rendering
+        large results sets in JavaScript. Future versions will
+        hopefully manage to overcome this issue.</p>
+	<% if ( ! query.includes("running:true") ) { %><p>You may find it
+        useful to <a href="#search/running:true <%= query %>">add
+        <code>running:true</code> to your query</a> to only return relays that are
+        currently running.</p><% } %>
+    </div>
+    <% } %>
+
+
+<table class="table table-hover table-striped" id="torstatus_results">
+	<thead>
+		<tr>
+			<th></th>
+			<th>Nickname<sup>†</sup></th>
+			<th>Advertised Bandwidth</th>
+			<th>Uptime</th>
+			<th>Country</th>
+			<th>IPv4</th>
+			<th>IPv6</th>
+			<th>Flags</th>
+			<th style="white-space: nowrap;">Add. Flags</th>
+			<th>ORPort</th>
+			<th>DirPort</th>
+			<th>Type</th>
+		</tr>
+	</thead>
+	<tbody>
+
+<% _.each(relays, function(relay) { %>
+            <tr<% if (relay.get('running') === false) { %> class="danger"<% } %>>
+            <td>
+            <% if (relay.get('running') === false) { %>
+                <span class="tip circle circle-offline" title="This relay is offline."></span>
+            <% } else { %>
+                <span class="tip circle circle-online" title="This relay is running."></span>
+            <% } %>
+            </td>
+			<td>
+            <a href="#details/<%= relay.get('fingerprint') %>">
+            <%= _.escape(relay.get('nickname')) %></a>
+            <% if (!relay.get('is_bridge')) { %>
+	    (<a href="#search/family:<%= relay.get('fingerprint') %>"><%= relay.get('effective_family') == null ? 1 : relay.get('effective_family').length + 1 %></a>)
+            <% } %>
+            </a>
+            </td>
+			<td><span data-filter="<%= relay.get('bandwidth') %>"><%= relay.get('bandwidth_hr') %></span></td>
+			<td data-order="<%= relay.get('uptime') %>">
+            <span data-hidden="<%= relay.get('last_restarted') %>" title="<%= relay.get('uptime_hrfull') %>" data-filter="<%= relay.get('uptime') %>" class="tip uptime">
+            <% if (relay.get('running') === false) { %><s><% } %><%= relay.get('uptime_hr') %><% if (relay.get('running') === false) { %></s><% } %>
+            </span>
+            </td>
+            <% if ( relay.get('country')) { %>
+              <td data-order="<%= relay.get('countryname') %>">
+                <img class="tip inline country" title="<%= relay.get('countryname') %>" alt="<%= relay.get('countryname') %>" src="/images/cc/<%= relay.get('country') %>.png"/>
+              </td>
+            <% } else { %>
+              <td data-order="Unknown"><img class="tip inline country" title="Unknown" alt="Unknown" src="/images/cc/xz.png"></td>
+            <% } %>
+			<td><%= relay.get('or_address') %></td>
+			<td><%= (relay.get('or_v6_address')) ? relay.get('or_v6_address') : '-' %></td>
+			<td class="flags-cell">
+            <% _.each(relay.get('flags'), function(flag) { %><img class="tip flags" src="/images/flags/<%= flag[1] %>.png" alt="<%= flag[0] %>" title="<%= flag[0] %><br /><%= flag[2] %>"/><% }); %>
+            </td>
+            <td>
+            <% _.each(relay.get('additional_flags'), function(flag) { %><img class="tip flags" src="/images/flags/<%= flag[1] %>.png" alt="<%= flag[0] %>" title="<%= flag[0] %><br /><%= flag[2] %>"/><% }); %>
+            </td>
+			<td><%= relay.get('or_port') %></td>
+			<td><%= relay.get('dir_port') %></td>
+			<td>
+				<% if (relay.get('is_bridge')) { %>
+				Bridge
+				<% } else { %>
+				Relay
+				<% } %>
+			</td>
+            </tr>
+<% }); %>
+	</tbody>
+</table>
+<p><sup>†</sup>The number shown in brackets is the total effective
+family size for the relay including the relay itself. A size of 1 indicates
+that the relay does not have any other effective family members. Note that
+bridge relays do not advertise family members in their descriptors and so there
+is no value shown for bridge relays.</p>
+<p>Information for relays was published: <%= relaysPublished %> UTC.<br>
+Information for bridges was published: <%= bridgesPublished %> UTC.</p>
+<% } %>
+</div>
+
diff --git a/src/main/resources/web/templates/rs/search/main.html b/src/main/resources/web/templates/rs/search/main.html
new file mode 100644
index 0000000..b69612c
--- /dev/null
+++ b/src/main/resources/web/templates/rs/search/main.html
@@ -0,0 +1,162 @@
+<ul class="nav nav-tabs">
+  <li id="main-search-tab" class="search-tabs active"><a href="#simple">Simple Search</a></li>
+  <li id="aggregated-search-tab" class="search-tabs"><a href="#aggregate">Aggregated Search</a></li>
+  <li id="advanced-search-tab" class="search-tabs"><a href="#advanced">Advanced Search</a></li>
+</ul>
+
+<div class="tab-content" id="search-tab-content">
+  <div id="main-search-tab-content" class="search tab-pane active">
+
+  <p>The relay search tool displays data about single relays and bridges in the
+Tor network. It provides useful information on how relays are configured along
+with graphs about their past.</p>
+  <form id="home-search">
+    <div class="input-group">
+      <input class="search-query form-control" id="query" placeholder="Query" type="text" autocorrect="off" autocapitalize="none">
+      <span class="input-group-btn"><button id="do-search" class="btn btn-primary" type="button">Search</button><button class="btn btn-secondary" type="button" id="do-top-relays">Top Relays</button></span>
+    </div>
+  </form>
+</div>
+
+  <div id="aggregated-search-tab-content" class="search tab-pane">
+
+  <p>The aggregated search tool displays aggregated data about relays in the
+Tor network. It provides insight into diversity in the network and the
+probabilities of using relays in a particular country or AS as a guard, middle
+or exit relay. The results are restricted to only currently running relays and
+do not include bridge data.</p>
+  <form id="home-aggregate-search">
+    <div class="input-group">
+      <input class="search-query form-control" id="aggregated-query" placeholder="Query" type="text" autocorrect="off" autocapitalize="none">
+      <span class="input-group-btn"><button id="do-aggregate" class="btn btn-primary" type="button">Aggregate</button><button class="btn btn-secondary" type="button" id="do-full-aggregation">Entire Network</button></span>
+    </div>
+  </form>
+  </div>
+</div>
+
+<div id="advanced-search-tab-content" class="search tab-pane">
+
+  <p>The advanced search tool allows you to build advanced queries to search
+for data about single relays and bridges in the Tor network or aggregated data about currently running relays. For single relays, it provides useful
+information on how relays are configured along with graphs about their
+past. Aggregated data provides insight into diversity in the network and the
+probabilities of using relays in a particular country or AS as a guard, middle
+or exit relay filtered by the search parameters.</p>
+<div class="panel panel-default"><div class="panel-body">
+  <form id="home-advanced-search">
+    <div class="row">
+    <div class="col-md-6">
+    <div class="form-group">
+      <label for="advanced-search-nickname">Nickname:</label>
+      <input type="text" class="form-control search-query" autocorrect="off" autocapitalize="off" id="advanced-search-nickname">
+    </div>
+    <div class="form-group">
+      <label for="advanced-search-fingerprint">Fingerprint:</label>
+      <div class="input-group">
+        <input type="text" class="form-control" autocorrect="off" autocapitalize="off" id="advanced-search-fingerprint">
+        <span class="input-group-addon"><input type="checkbox" id="advanced-search-family"> Include Family</span>
+      </div>
+    </div>
+    <div class="form-group">
+      <label for="advanced-search-contact">Contact:</label>
+      <input type="text" class="form-control search-query" autocorrect="off" autocapitalize="off" id="advanced-search-contact">
+    </div>
+    <div class="form-group">
+      <label for="advanced-search-flag">Flag:</label>
+      <select class="form-control" id="advanced-search-flag">
+        <option value="">Any</option>
+        <option value="stable">Stable</option>
+        <option value="running">Running</option>
+        <option value="fast">Fast</option>
+        <option value="guard">Guard</option>
+        <option value="exit">Exit</option>
+        <option value="authority">Authority</option>
+        <option value="noedconsensus">NoEdConsensus</option>
+      </select>
+    </div>
+    <div class="form-group">
+      <label for="advanced-search-country">Country:</label>
+      <select class="form-control" id="advanced-search-country">
+        <option value="">Any</option>
+        <% var knownCountries = Object.keys(countries); knownCountries.sort(); %>
+        <% _.each(knownCountries, function(country){ %>
+          <option value="<%= country %>"><%= country %> - <%= countries[country] %></option>
+        <% }); %>
+      </select>
+    </div>
+     <div class="form-group">
+      <label for="advanced-search-as">Autonomous System:</label>
+      <div class="input-group">
+        <span class="input-group-addon">AS</span>
+        <input type="text" id="advanced-search-as" class="search-query form-control">
+      </div>
+     </div>
+    </div><!-- col-md-6 -->
+    <div class="col-md-6">
+    <div class="form-group">
+      <label for="advanced-search-hostname">Hostname:</label>
+      <input type="text" class="form-control search-query" autocorrect="off" autocapitalize="off" id="advanced-search-hostname">
+    </div>
+    <div class="form-group">
+      <label for="advanced-search-first-seen-from">First Seen:</label><br>
+      From <input type="number" id="advanced-search-first-seen-from" class="form-control day-spinner" value="0"> to <input type="number" id="advanced-search-first-seen-to" class="form-control day-spinner" value="0"> days ago
+    </div>
+    <div class="form-group">
+      <label for="advanced-search-last-seen-from">Last Seen:</label><br>
+      From <input type="number" id="advanced-search-last-seen-from" class="form-control day-spinner" value="0"> to <input type="number" id="advanced-search-last-seen-to" class="form-control day-spinner" value="0"> days ago
+    </div>
+    <div class="form-group">
+      <label for="advanced-search-version">Version:</label>
+      <input type="text" class="form-control search-query" autocorrect="off" autocapitalize="off" id="advanced-search-version">
+    </div>
+    <div class="form-group">
+      <label for="advanced-search-type">Type<sup>†</sup>:</label>
+      <select class="form-control" id="advanced-search-type">
+        <option value="">Any</option>
+        <option value="relay">Only Relays</option>
+        <option value="bridge">Only Bridges</option>
+      </select>
+    </div>
+    <div class="form-group">
+      <label for="advanced-search-running">Running<sup>†</sup>:</label>
+      <select class="form-control" id="advanced-search-running">
+        <option value="">Any</option>
+        <option value="true">Only Running Relays</option>
+        <option value="false">Only Offline Relays</option>
+      </select>
+    </div>
+    </div><!-- col-md-6 -->
+    </div><!-- row -->
+    <p><button id="do-advanced" class="btn btn-primary" type="submit">Advanced Search</button></p>
+    <p>
+      <button id="do-advanced-aggregation" class="btn btn-primary" type="button">Advanced Aggregation</button>
+      <button id="do-advanced-aggregation-as" class="btn btn-secondary tip" type="button" title="Aggregate by Autonomous System">by AS</button>
+      <button id="do-advanced-aggregation-cc" class="btn btn-secondary tip" type="button" title="Aggregate by Country">by CC</button>
+      <button id="do-advanced-aggregation-ascc" class="btn btn-secondary tip" type="button" title="Aggregate by both Autonomous System and Country">by AS+CC</button>
+      <button id="do-advanced-aggregation-version" class="btn btn-secondary tip" type="button" title="Aggregate by Version">by Version</button>
+    </p>
+  </form>
+  <p><sup>†</sup> These options are ignored when performing an aggregation as the aggregated searches are restricted to only currently running relays.</p>
+</div></div><!-- /panel -->
+  </div>
+</div>
+
+  <div class="well">
+  <p>You can search for Tor relays and bridges by using keywords. In
+particular, this tool enables you to search for (partial) nicknames (e.g.,
+“moria”), IP addresses (e.g., “<a href="#search/128.31.">128.31.</a>”), and
+fingerprints (e.g., “<a href="#search/9695DFC3">9695DFC3</a>”).  It is also
+possible to combine searches, e.g., “<a href="#search/moria%20128.31.">moria
+128.31.</a>”. Finally, you can use qualifiers to search for relays in specific
+countries (e.g., “<a href="#search/moria%20country:us">moria country:us</a>”),
+with specific contact information (e.g., “<a
+href="#search/contact:arma">contact:arma</a>”), or with specific flags (e.g.,
+“<a href="#search/flag:Authority">flag:Authority</a>”).</p>
+  <p>If you are searching for a bridge, you will need to search by the hashed
+fingerprint. This prevents leaking the fingerprint of the bridge when
+searching. You can find this in the <code>hashed-fingerprint</code> file in the
+Tor data directory. On Debian systems, this is in <code>/var/lib/tor</code> but
+may be in another location on your system. The location is specified as
+<code>DataDirectory</code> in your <code>torrc</code>.</p>
+  </div>
+





More information about the tor-commits mailing list