├── COPYING.md ├── README.md ├── agpl.txt ├── data ├── judete-id.json ├── recensaminte.csv └── romania-topo.json ├── index.html ├── script.js ├── style.css └── vendor ├── JSXTransformer.js ├── TrackballControls.js ├── bootstrap.css ├── classNames.js ├── d3-threeD.js ├── d3.js ├── react.js ├── three.js └── topojson.js /COPYING.md: -------------------------------------------------------------------------------- 1 | Copyright (C) 2015 Cristi Burcă 2 | 3 | This program is free software: you can redistribute it and/or modify 4 | it under the terms of the GNU Affero General Public License as published by 5 | the Free Software Foundation, either version 3 of the License, or 6 | (at your option) any later version. 7 | 8 | This program is distributed in the hope that it will be useful, 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | GNU Affero General Public License for more details. 12 | 13 | You should have received a copy of the GNU Affero General Public License 14 | along with this program. If not, see . 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Romania Population 3D Map 2 | 3 | This is an extruded map that plots historical population count, split per county. Period: 1948-2011. 4 | 5 | ### Technologies used 6 | 7 | - [topojson](https://github.com/mbostock/topojson) - topology encoding format 8 | - [D3](http://d3js.org/) - visualization library 9 | - [three.js](http://threejs.org/) - 3D library 10 | - [d3-threeD](https://github.com/asutherland/d3-threeD) - for converting D3 paths to three.js geometries 11 | - [React](http://facebook.github.io/react/) - UI library 12 | - [Bootstrap](http://getbootstrap.com/) - UI styling 13 | 14 | ### Data sources 15 | 16 | - county topology: 17 | - census data: 18 | -------------------------------------------------------------------------------- /agpl.txt: -------------------------------------------------------------------------------- 1 | GNU AFFERO GENERAL PUBLIC LICENSE 2 | Version 3, 19 November 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU Affero General Public License is a free, copyleft license for 11 | software and other kinds of works, specifically designed to ensure 12 | cooperation with the community in the case of network server software. 13 | 14 | The licenses for most software and other practical works are designed 15 | to take away your freedom to share and change the works. By contrast, 16 | our General Public Licenses are intended to guarantee your freedom to 17 | share and change all versions of a program--to make sure it remains free 18 | software for all its users. 19 | 20 | When we speak of free software, we are referring to freedom, not 21 | price. Our General Public Licenses are designed to make sure that you 22 | have the freedom to distribute copies of free software (and charge for 23 | them if you wish), that you receive source code or can get it if you 24 | want it, that you can change the software or use pieces of it in new 25 | free programs, and that you know you can do these things. 26 | 27 | Developers that use our General Public Licenses protect your rights 28 | with two steps: (1) assert copyright on the software, and (2) offer 29 | you this License which gives you legal permission to copy, distribute 30 | and/or modify the software. 31 | 32 | A secondary benefit of defending all users' freedom is that 33 | improvements made in alternate versions of the program, if they 34 | receive widespread use, become available for other developers to 35 | incorporate. Many developers of free software are heartened and 36 | encouraged by the resulting cooperation. However, in the case of 37 | software used on network servers, this result may fail to come about. 38 | The GNU General Public License permits making a modified version and 39 | letting the public access it on a server without ever releasing its 40 | source code to the public. 41 | 42 | The GNU Affero General Public License is designed specifically to 43 | ensure that, in such cases, the modified source code becomes available 44 | to the community. It requires the operator of a network server to 45 | provide the source code of the modified version running there to the 46 | users of that server. Therefore, public use of a modified version, on 47 | a publicly accessible server, gives the public access to the source 48 | code of the modified version. 49 | 50 | An older license, called the Affero General Public License and 51 | published by Affero, was designed to accomplish similar goals. This is 52 | a different license, not a version of the Affero GPL, but Affero has 53 | released a new version of the Affero GPL which permits relicensing under 54 | this license. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | TERMS AND CONDITIONS 60 | 61 | 0. Definitions. 62 | 63 | "This License" refers to version 3 of the GNU Affero General Public License. 64 | 65 | "Copyright" also means copyright-like laws that apply to other kinds of 66 | works, such as semiconductor masks. 67 | 68 | "The Program" refers to any copyrightable work licensed under this 69 | License. Each licensee is addressed as "you". "Licensees" and 70 | "recipients" may be individuals or organizations. 71 | 72 | To "modify" a work means to copy from or adapt all or part of the work 73 | in a fashion requiring copyright permission, other than the making of an 74 | exact copy. The resulting work is called a "modified version" of the 75 | earlier work or a work "based on" the earlier work. 76 | 77 | A "covered work" means either the unmodified Program or a work based 78 | on the Program. 79 | 80 | To "propagate" a work means to do anything with it that, without 81 | permission, would make you directly or secondarily liable for 82 | infringement under applicable copyright law, except executing it on a 83 | computer or modifying a private copy. Propagation includes copying, 84 | distribution (with or without modification), making available to the 85 | public, and in some countries other activities as well. 86 | 87 | To "convey" a work means any kind of propagation that enables other 88 | parties to make or receive copies. Mere interaction with a user through 89 | a computer network, with no transfer of a copy, is not conveying. 90 | 91 | An interactive user interface displays "Appropriate Legal Notices" 92 | to the extent that it includes a convenient and prominently visible 93 | feature that (1) displays an appropriate copyright notice, and (2) 94 | tells the user that there is no warranty for the work (except to the 95 | extent that warranties are provided), that licensees may convey the 96 | work under this License, and how to view a copy of this License. If 97 | the interface presents a list of user commands or options, such as a 98 | menu, a prominent item in the list meets this criterion. 99 | 100 | 1. Source Code. 101 | 102 | The "source code" for a work means the preferred form of the work 103 | for making modifications to it. "Object code" means any non-source 104 | form of a work. 105 | 106 | A "Standard Interface" means an interface that either is an official 107 | standard defined by a recognized standards body, or, in the case of 108 | interfaces specified for a particular programming language, one that 109 | is widely used among developers working in that language. 110 | 111 | The "System Libraries" of an executable work include anything, other 112 | than the work as a whole, that (a) is included in the normal form of 113 | packaging a Major Component, but which is not part of that Major 114 | Component, and (b) serves only to enable use of the work with that 115 | Major Component, or to implement a Standard Interface for which an 116 | implementation is available to the public in source code form. A 117 | "Major Component", in this context, means a major essential component 118 | (kernel, window system, and so on) of the specific operating system 119 | (if any) on which the executable work runs, or a compiler used to 120 | produce the work, or an object code interpreter used to run it. 121 | 122 | The "Corresponding Source" for a work in object code form means all 123 | the source code needed to generate, install, and (for an executable 124 | work) run the object code and to modify the work, including scripts to 125 | control those activities. However, it does not include the work's 126 | System Libraries, or general-purpose tools or generally available free 127 | programs which are used unmodified in performing those activities but 128 | which are not part of the work. For example, Corresponding Source 129 | includes interface definition files associated with source files for 130 | the work, and the source code for shared libraries and dynamically 131 | linked subprograms that the work is specifically designed to require, 132 | such as by intimate data communication or control flow between those 133 | subprograms and other parts of the work. 134 | 135 | The Corresponding Source need not include anything that users 136 | can regenerate automatically from other parts of the Corresponding 137 | Source. 138 | 139 | The Corresponding Source for a work in source code form is that 140 | same work. 141 | 142 | 2. Basic Permissions. 143 | 144 | All rights granted under this License are granted for the term of 145 | copyright on the Program, and are irrevocable provided the stated 146 | conditions are met. This License explicitly affirms your unlimited 147 | permission to run the unmodified Program. The output from running a 148 | covered work is covered by this License only if the output, given its 149 | content, constitutes a covered work. This License acknowledges your 150 | rights of fair use or other equivalent, as provided by copyright law. 151 | 152 | You may make, run and propagate covered works that you do not 153 | convey, without conditions so long as your license otherwise remains 154 | in force. You may convey covered works to others for the sole purpose 155 | of having them make modifications exclusively for you, or provide you 156 | with facilities for running those works, provided that you comply with 157 | the terms of this License in conveying all material for which you do 158 | not control copyright. Those thus making or running the covered works 159 | for you must do so exclusively on your behalf, under your direction 160 | and control, on terms that prohibit them from making any copies of 161 | your copyrighted material outside their relationship with you. 162 | 163 | Conveying under any other circumstances is permitted solely under 164 | the conditions stated below. Sublicensing is not allowed; section 10 165 | makes it unnecessary. 166 | 167 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 168 | 169 | No covered work shall be deemed part of an effective technological 170 | measure under any applicable law fulfilling obligations under article 171 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 172 | similar laws prohibiting or restricting circumvention of such 173 | measures. 174 | 175 | When you convey a covered work, you waive any legal power to forbid 176 | circumvention of technological measures to the extent such circumvention 177 | is effected by exercising rights under this License with respect to 178 | the covered work, and you disclaim any intention to limit operation or 179 | modification of the work as a means of enforcing, against the work's 180 | users, your or third parties' legal rights to forbid circumvention of 181 | technological measures. 182 | 183 | 4. Conveying Verbatim Copies. 184 | 185 | You may convey verbatim copies of the Program's source code as you 186 | receive it, in any medium, provided that you conspicuously and 187 | appropriately publish on each copy an appropriate copyright notice; 188 | keep intact all notices stating that this License and any 189 | non-permissive terms added in accord with section 7 apply to the code; 190 | keep intact all notices of the absence of any warranty; and give all 191 | recipients a copy of this License along with the Program. 192 | 193 | You may charge any price or no price for each copy that you convey, 194 | and you may offer support or warranty protection for a fee. 195 | 196 | 5. Conveying Modified Source Versions. 197 | 198 | You may convey a work based on the Program, or the modifications to 199 | produce it from the Program, in the form of source code under the 200 | terms of section 4, provided that you also meet all of these conditions: 201 | 202 | a) The work must carry prominent notices stating that you modified 203 | it, and giving a relevant date. 204 | 205 | b) The work must carry prominent notices stating that it is 206 | released under this License and any conditions added under section 207 | 7. This requirement modifies the requirement in section 4 to 208 | "keep intact all notices". 209 | 210 | c) You must license the entire work, as a whole, under this 211 | License to anyone who comes into possession of a copy. This 212 | License will therefore apply, along with any applicable section 7 213 | additional terms, to the whole of the work, and all its parts, 214 | regardless of how they are packaged. This License gives no 215 | permission to license the work in any other way, but it does not 216 | invalidate such permission if you have separately received it. 217 | 218 | d) If the work has interactive user interfaces, each must display 219 | Appropriate Legal Notices; however, if the Program has interactive 220 | interfaces that do not display Appropriate Legal Notices, your 221 | work need not make them do so. 222 | 223 | A compilation of a covered work with other separate and independent 224 | works, which are not by their nature extensions of the covered work, 225 | and which are not combined with it such as to form a larger program, 226 | in or on a volume of a storage or distribution medium, is called an 227 | "aggregate" if the compilation and its resulting copyright are not 228 | used to limit the access or legal rights of the compilation's users 229 | beyond what the individual works permit. Inclusion of a covered work 230 | in an aggregate does not cause this License to apply to the other 231 | parts of the aggregate. 232 | 233 | 6. Conveying Non-Source Forms. 234 | 235 | You may convey a covered work in object code form under the terms 236 | of sections 4 and 5, provided that you also convey the 237 | machine-readable Corresponding Source under the terms of this License, 238 | in one of these ways: 239 | 240 | a) Convey the object code in, or embodied in, a physical product 241 | (including a physical distribution medium), accompanied by the 242 | Corresponding Source fixed on a durable physical medium 243 | customarily used for software interchange. 244 | 245 | b) Convey the object code in, or embodied in, a physical product 246 | (including a physical distribution medium), accompanied by a 247 | written offer, valid for at least three years and valid for as 248 | long as you offer spare parts or customer support for that product 249 | model, to give anyone who possesses the object code either (1) a 250 | copy of the Corresponding Source for all the software in the 251 | product that is covered by this License, on a durable physical 252 | medium customarily used for software interchange, for a price no 253 | more than your reasonable cost of physically performing this 254 | conveying of source, or (2) access to copy the 255 | Corresponding Source from a network server at no charge. 256 | 257 | c) Convey individual copies of the object code with a copy of the 258 | written offer to provide the Corresponding Source. This 259 | alternative is allowed only occasionally and noncommercially, and 260 | only if you received the object code with such an offer, in accord 261 | with subsection 6b. 262 | 263 | d) Convey the object code by offering access from a designated 264 | place (gratis or for a charge), and offer equivalent access to the 265 | Corresponding Source in the same way through the same place at no 266 | further charge. You need not require recipients to copy the 267 | Corresponding Source along with the object code. If the place to 268 | copy the object code is a network server, the Corresponding Source 269 | may be on a different server (operated by you or a third party) 270 | that supports equivalent copying facilities, provided you maintain 271 | clear directions next to the object code saying where to find the 272 | Corresponding Source. Regardless of what server hosts the 273 | Corresponding Source, you remain obligated to ensure that it is 274 | available for as long as needed to satisfy these requirements. 275 | 276 | e) Convey the object code using peer-to-peer transmission, provided 277 | you inform other peers where the object code and Corresponding 278 | Source of the work are being offered to the general public at no 279 | charge under subsection 6d. 280 | 281 | A separable portion of the object code, whose source code is excluded 282 | from the Corresponding Source as a System Library, need not be 283 | included in conveying the object code work. 284 | 285 | A "User Product" is either (1) a "consumer product", which means any 286 | tangible personal property which is normally used for personal, family, 287 | or household purposes, or (2) anything designed or sold for incorporation 288 | into a dwelling. In determining whether a product is a consumer product, 289 | doubtful cases shall be resolved in favor of coverage. For a particular 290 | product received by a particular user, "normally used" refers to a 291 | typical or common use of that class of product, regardless of the status 292 | of the particular user or of the way in which the particular user 293 | actually uses, or expects or is expected to use, the product. A product 294 | is a consumer product regardless of whether the product has substantial 295 | commercial, industrial or non-consumer uses, unless such uses represent 296 | the only significant mode of use of the product. 297 | 298 | "Installation Information" for a User Product means any methods, 299 | procedures, authorization keys, or other information required to install 300 | and execute modified versions of a covered work in that User Product from 301 | a modified version of its Corresponding Source. The information must 302 | suffice to ensure that the continued functioning of the modified object 303 | code is in no case prevented or interfered with solely because 304 | modification has been made. 305 | 306 | If you convey an object code work under this section in, or with, or 307 | specifically for use in, a User Product, and the conveying occurs as 308 | part of a transaction in which the right of possession and use of the 309 | User Product is transferred to the recipient in perpetuity or for a 310 | fixed term (regardless of how the transaction is characterized), the 311 | Corresponding Source conveyed under this section must be accompanied 312 | by the Installation Information. But this requirement does not apply 313 | if neither you nor any third party retains the ability to install 314 | modified object code on the User Product (for example, the work has 315 | been installed in ROM). 316 | 317 | The requirement to provide Installation Information does not include a 318 | requirement to continue to provide support service, warranty, or updates 319 | for a work that has been modified or installed by the recipient, or for 320 | the User Product in which it has been modified or installed. Access to a 321 | network may be denied when the modification itself materially and 322 | adversely affects the operation of the network or violates the rules and 323 | protocols for communication across the network. 324 | 325 | Corresponding Source conveyed, and Installation Information provided, 326 | in accord with this section must be in a format that is publicly 327 | documented (and with an implementation available to the public in 328 | source code form), and must require no special password or key for 329 | unpacking, reading or copying. 330 | 331 | 7. Additional Terms. 332 | 333 | "Additional permissions" are terms that supplement the terms of this 334 | License by making exceptions from one or more of its conditions. 335 | Additional permissions that are applicable to the entire Program shall 336 | be treated as though they were included in this License, to the extent 337 | that they are valid under applicable law. If additional permissions 338 | apply only to part of the Program, that part may be used separately 339 | under those permissions, but the entire Program remains governed by 340 | this License without regard to the additional permissions. 341 | 342 | When you convey a copy of a covered work, you may at your option 343 | remove any additional permissions from that copy, or from any part of 344 | it. (Additional permissions may be written to require their own 345 | removal in certain cases when you modify the work.) You may place 346 | additional permissions on material, added by you to a covered work, 347 | for which you have or can give appropriate copyright permission. 348 | 349 | Notwithstanding any other provision of this License, for material you 350 | add to a covered work, you may (if authorized by the copyright holders of 351 | that material) supplement the terms of this License with terms: 352 | 353 | a) Disclaiming warranty or limiting liability differently from the 354 | terms of sections 15 and 16 of this License; or 355 | 356 | b) Requiring preservation of specified reasonable legal notices or 357 | author attributions in that material or in the Appropriate Legal 358 | Notices displayed by works containing it; or 359 | 360 | c) Prohibiting misrepresentation of the origin of that material, or 361 | requiring that modified versions of such material be marked in 362 | reasonable ways as different from the original version; or 363 | 364 | d) Limiting the use for publicity purposes of names of licensors or 365 | authors of the material; or 366 | 367 | e) Declining to grant rights under trademark law for use of some 368 | trade names, trademarks, or service marks; or 369 | 370 | f) Requiring indemnification of licensors and authors of that 371 | material by anyone who conveys the material (or modified versions of 372 | it) with contractual assumptions of liability to the recipient, for 373 | any liability that these contractual assumptions directly impose on 374 | those licensors and authors. 375 | 376 | All other non-permissive additional terms are considered "further 377 | restrictions" within the meaning of section 10. If the Program as you 378 | received it, or any part of it, contains a notice stating that it is 379 | governed by this License along with a term that is a further 380 | restriction, you may remove that term. If a license document contains 381 | a further restriction but permits relicensing or conveying under this 382 | License, you may add to a covered work material governed by the terms 383 | of that license document, provided that the further restriction does 384 | not survive such relicensing or conveying. 385 | 386 | If you add terms to a covered work in accord with this section, you 387 | must place, in the relevant source files, a statement of the 388 | additional terms that apply to those files, or a notice indicating 389 | where to find the applicable terms. 390 | 391 | Additional terms, permissive or non-permissive, may be stated in the 392 | form of a separately written license, or stated as exceptions; 393 | the above requirements apply either way. 394 | 395 | 8. Termination. 396 | 397 | You may not propagate or modify a covered work except as expressly 398 | provided under this License. Any attempt otherwise to propagate or 399 | modify it is void, and will automatically terminate your rights under 400 | this License (including any patent licenses granted under the third 401 | paragraph of section 11). 402 | 403 | However, if you cease all violation of this License, then your 404 | license from a particular copyright holder is reinstated (a) 405 | provisionally, unless and until the copyright holder explicitly and 406 | finally terminates your license, and (b) permanently, if the copyright 407 | holder fails to notify you of the violation by some reasonable means 408 | prior to 60 days after the cessation. 409 | 410 | Moreover, your license from a particular copyright holder is 411 | reinstated permanently if the copyright holder notifies you of the 412 | violation by some reasonable means, this is the first time you have 413 | received notice of violation of this License (for any work) from that 414 | copyright holder, and you cure the violation prior to 30 days after 415 | your receipt of the notice. 416 | 417 | Termination of your rights under this section does not terminate the 418 | licenses of parties who have received copies or rights from you under 419 | this License. If your rights have been terminated and not permanently 420 | reinstated, you do not qualify to receive new licenses for the same 421 | material under section 10. 422 | 423 | 9. Acceptance Not Required for Having Copies. 424 | 425 | You are not required to accept this License in order to receive or 426 | run a copy of the Program. Ancillary propagation of a covered work 427 | occurring solely as a consequence of using peer-to-peer transmission 428 | to receive a copy likewise does not require acceptance. However, 429 | nothing other than this License grants you permission to propagate or 430 | modify any covered work. These actions infringe copyright if you do 431 | not accept this License. Therefore, by modifying or propagating a 432 | covered work, you indicate your acceptance of this License to do so. 433 | 434 | 10. Automatic Licensing of Downstream Recipients. 435 | 436 | Each time you convey a covered work, the recipient automatically 437 | receives a license from the original licensors, to run, modify and 438 | propagate that work, subject to this License. You are not responsible 439 | for enforcing compliance by third parties with this License. 440 | 441 | An "entity transaction" is a transaction transferring control of an 442 | organization, or substantially all assets of one, or subdividing an 443 | organization, or merging organizations. If propagation of a covered 444 | work results from an entity transaction, each party to that 445 | transaction who receives a copy of the work also receives whatever 446 | licenses to the work the party's predecessor in interest had or could 447 | give under the previous paragraph, plus a right to possession of the 448 | Corresponding Source of the work from the predecessor in interest, if 449 | the predecessor has it or can get it with reasonable efforts. 450 | 451 | You may not impose any further restrictions on the exercise of the 452 | rights granted or affirmed under this License. For example, you may 453 | not impose a license fee, royalty, or other charge for exercise of 454 | rights granted under this License, and you may not initiate litigation 455 | (including a cross-claim or counterclaim in a lawsuit) alleging that 456 | any patent claim is infringed by making, using, selling, offering for 457 | sale, or importing the Program or any portion of it. 458 | 459 | 11. Patents. 460 | 461 | A "contributor" is a copyright holder who authorizes use under this 462 | License of the Program or a work on which the Program is based. The 463 | work thus licensed is called the contributor's "contributor version". 464 | 465 | A contributor's "essential patent claims" are all patent claims 466 | owned or controlled by the contributor, whether already acquired or 467 | hereafter acquired, that would be infringed by some manner, permitted 468 | by this License, of making, using, or selling its contributor version, 469 | but do not include claims that would be infringed only as a 470 | consequence of further modification of the contributor version. For 471 | purposes of this definition, "control" includes the right to grant 472 | patent sublicenses in a manner consistent with the requirements of 473 | this License. 474 | 475 | Each contributor grants you a non-exclusive, worldwide, royalty-free 476 | patent license under the contributor's essential patent claims, to 477 | make, use, sell, offer for sale, import and otherwise run, modify and 478 | propagate the contents of its contributor version. 479 | 480 | In the following three paragraphs, a "patent license" is any express 481 | agreement or commitment, however denominated, not to enforce a patent 482 | (such as an express permission to practice a patent or covenant not to 483 | sue for patent infringement). To "grant" such a patent license to a 484 | party means to make such an agreement or commitment not to enforce a 485 | patent against the party. 486 | 487 | If you convey a covered work, knowingly relying on a patent license, 488 | and the Corresponding Source of the work is not available for anyone 489 | to copy, free of charge and under the terms of this License, through a 490 | publicly available network server or other readily accessible means, 491 | then you must either (1) cause the Corresponding Source to be so 492 | available, or (2) arrange to deprive yourself of the benefit of the 493 | patent license for this particular work, or (3) arrange, in a manner 494 | consistent with the requirements of this License, to extend the patent 495 | license to downstream recipients. "Knowingly relying" means you have 496 | actual knowledge that, but for the patent license, your conveying the 497 | covered work in a country, or your recipient's use of the covered work 498 | in a country, would infringe one or more identifiable patents in that 499 | country that you have reason to believe are valid. 500 | 501 | If, pursuant to or in connection with a single transaction or 502 | arrangement, you convey, or propagate by procuring conveyance of, a 503 | covered work, and grant a patent license to some of the parties 504 | receiving the covered work authorizing them to use, propagate, modify 505 | or convey a specific copy of the covered work, then the patent license 506 | you grant is automatically extended to all recipients of the covered 507 | work and works based on it. 508 | 509 | A patent license is "discriminatory" if it does not include within 510 | the scope of its coverage, prohibits the exercise of, or is 511 | conditioned on the non-exercise of one or more of the rights that are 512 | specifically granted under this License. You may not convey a covered 513 | work if you are a party to an arrangement with a third party that is 514 | in the business of distributing software, under which you make payment 515 | to the third party based on the extent of your activity of conveying 516 | the work, and under which the third party grants, to any of the 517 | parties who would receive the covered work from you, a discriminatory 518 | patent license (a) in connection with copies of the covered work 519 | conveyed by you (or copies made from those copies), or (b) primarily 520 | for and in connection with specific products or compilations that 521 | contain the covered work, unless you entered into that arrangement, 522 | or that patent license was granted, prior to 28 March 2007. 523 | 524 | Nothing in this License shall be construed as excluding or limiting 525 | any implied license or other defenses to infringement that may 526 | otherwise be available to you under applicable patent law. 527 | 528 | 12. No Surrender of Others' Freedom. 529 | 530 | If conditions are imposed on you (whether by court order, agreement or 531 | otherwise) that contradict the conditions of this License, they do not 532 | excuse you from the conditions of this License. If you cannot convey a 533 | covered work so as to satisfy simultaneously your obligations under this 534 | License and any other pertinent obligations, then as a consequence you may 535 | not convey it at all. For example, if you agree to terms that obligate you 536 | to collect a royalty for further conveying from those to whom you convey 537 | the Program, the only way you could satisfy both those terms and this 538 | License would be to refrain entirely from conveying the Program. 539 | 540 | 13. Remote Network Interaction; Use with the GNU General Public License. 541 | 542 | Notwithstanding any other provision of this License, if you modify the 543 | Program, your modified version must prominently offer all users 544 | interacting with it remotely through a computer network (if your version 545 | supports such interaction) an opportunity to receive the Corresponding 546 | Source of your version by providing access to the Corresponding Source 547 | from a network server at no charge, through some standard or customary 548 | means of facilitating copying of software. This Corresponding Source 549 | shall include the Corresponding Source for any work covered by version 3 550 | of the GNU General Public License that is incorporated pursuant to the 551 | following paragraph. 552 | 553 | Notwithstanding any other provision of this License, you have 554 | permission to link or combine any covered work with a work licensed 555 | under version 3 of the GNU General Public License into a single 556 | combined work, and to convey the resulting work. The terms of this 557 | License will continue to apply to the part which is the covered work, 558 | but the work with which it is combined will remain governed by version 559 | 3 of the GNU General Public License. 560 | 561 | 14. Revised Versions of this License. 562 | 563 | The Free Software Foundation may publish revised and/or new versions of 564 | the GNU Affero General Public License from time to time. Such new versions 565 | will be similar in spirit to the present version, but may differ in detail to 566 | address new problems or concerns. 567 | 568 | Each version is given a distinguishing version number. If the 569 | Program specifies that a certain numbered version of the GNU Affero General 570 | Public License "or any later version" applies to it, you have the 571 | option of following the terms and conditions either of that numbered 572 | version or of any later version published by the Free Software 573 | Foundation. If the Program does not specify a version number of the 574 | GNU Affero General Public License, you may choose any version ever published 575 | by the Free Software Foundation. 576 | 577 | If the Program specifies that a proxy can decide which future 578 | versions of the GNU Affero General Public License can be used, that proxy's 579 | public statement of acceptance of a version permanently authorizes you 580 | to choose that version for the Program. 581 | 582 | Later license versions may give you additional or different 583 | permissions. However, no additional obligations are imposed on any 584 | author or copyright holder as a result of your choosing to follow a 585 | later version. 586 | 587 | 15. Disclaimer of Warranty. 588 | 589 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 590 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 591 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 592 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 593 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 594 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 595 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 596 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 597 | 598 | 16. Limitation of Liability. 599 | 600 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 601 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 602 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 603 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 604 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 605 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 606 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 607 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 608 | SUCH DAMAGES. 609 | 610 | 17. Interpretation of Sections 15 and 16. 611 | 612 | If the disclaimer of warranty and limitation of liability provided 613 | above cannot be given local legal effect according to their terms, 614 | reviewing courts shall apply local law that most closely approximates 615 | an absolute waiver of all civil liability in connection with the 616 | Program, unless a warranty or assumption of liability accompanies a 617 | copy of the Program in return for a fee. 618 | 619 | END OF TERMS AND CONDITIONS 620 | 621 | How to Apply These Terms to Your New Programs 622 | 623 | If you develop a new program, and you want it to be of the greatest 624 | possible use to the public, the best way to achieve this is to make it 625 | free software which everyone can redistribute and change under these terms. 626 | 627 | To do so, attach the following notices to the program. It is safest 628 | to attach them to the start of each source file to most effectively 629 | state the exclusion of warranty; and each file should have at least 630 | the "copyright" line and a pointer to where the full notice is found. 631 | 632 | 633 | Copyright (C) 634 | 635 | This program is free software: you can redistribute it and/or modify 636 | it under the terms of the GNU Affero General Public License as published by 637 | the Free Software Foundation, either version 3 of the License, or 638 | (at your option) any later version. 639 | 640 | This program is distributed in the hope that it will be useful, 641 | but WITHOUT ANY WARRANTY; without even the implied warranty of 642 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 643 | GNU Affero General Public License for more details. 644 | 645 | You should have received a copy of the GNU Affero General Public License 646 | along with this program. If not, see . 647 | 648 | Also add information on how to contact you by electronic and paper mail. 649 | 650 | If your software can interact with users remotely through a computer 651 | network, you should also make sure that it provides a way for users to 652 | get its source. For example, if your program is a web application, its 653 | interface could display a "Source" link that leads users to an archive 654 | of the code. There are many ways you could offer source, and different 655 | solutions will be better for different programs; see section 13 for the 656 | specific requirements. 657 | 658 | You should also get your employer (if you work as a programmer) or school, 659 | if any, to sign a "copyright disclaimer" for the program, if necessary. 660 | For more information on this, and how to apply and follow the GNU AGPL, see 661 | . 662 | -------------------------------------------------------------------------------- /data/judete-id.json: -------------------------------------------------------------------------------- 1 | { 2 | "MARAMURES": "MM", 3 | "SALAJ": "SJ", 4 | "SATU MARE": "SM", 5 | "ARGES": "AG", 6 | "CALARASI": "CL", 7 | "DAMBOVITA": "DB", 8 | "GIURGIU": "GR", 9 | "IALOMITA": "IL", 10 | "PRAHOVA": "PH", 11 | "TELEORMAN": "TR", 12 | "BRAILA": "BR", 13 | "BACAU": "BC", 14 | "CONSTANTA": "CT", 15 | "GALATI": "GL", 16 | "ILFOV": "IF", 17 | "ALBA": "AB", 18 | "BRASOV": "BV", 19 | "TULCEA": "TL", 20 | "VRANCEA": "VN", 21 | "DOLJ": "DJ", 22 | "GORJ": "GJ", 23 | "MEHEDINTI": "MH", 24 | "OLT": "OT", 25 | "VALCEA": "VL", 26 | "ARAD": "AR", 27 | "CARAS-SEVERIN": "CS", 28 | "HUNEDOARA": "HD", 29 | "TIMIS": "TM", 30 | "COVASNA": "CV", 31 | "HARGHITA": "HR", 32 | "MURES": "MS", 33 | "SIBIU": "SB", 34 | "BOTOSANI": "BT", 35 | "IASI": "IS", 36 | "NEAMT": "NT", 37 | "SUCEAVA": "SV", 38 | "BIHOR": "BH", 39 | "MUNICIPIUL BUCURESTI": "B", 40 | "VASLUI": "VS", 41 | "BISTRITA-NASAUD": "BN", 42 | "CLUJ": "CJ", 43 | "BUZAU": "BZ" 44 | } 45 | -------------------------------------------------------------------------------- /data/recensaminte.csv: -------------------------------------------------------------------------------- 1 | name,1948,1956,1966,1977,1992,2002,2011 2 | ALBA,361062,370800,382786,409634,413919,382747,342376 3 | ARAD,476207,475620,481248,512020,487617,461791,430629 4 | ARGES,448964,483741,529833,631918,681206,652625,612431 5 | BACAU,414996,507937,598321,667791,737512,706623,616168 6 | BIHOR,536323,574488,586460,633094,638863,600246,575398 7 | BISTRITA-NASAUD,233650,255789,269954,286628,326820,311657,286225 8 | BOTOSANI,385236,428050,452406,451217,461305,452834,412626 9 | BRASOV,300836,373941,442692,582863,643261,589028,549217 10 | BRAILA,271251,297276,339954,377954,392031,373174,321212 11 | BUZAU,430225,465829,480951,508424,516961,496214,451069 12 | CARAS-SEVERIN,302254,327787,358726,385577,376347,333219,295579 13 | CALARASI,287722,318573,337261,338807,338804,324617,306691 14 | CLUJ,520073,580344,629746,715507,736301,702755,691106 15 | CONSTANTA,311062,369940,465752,608817,748769,715151,684082 16 | COVASNA,157166,172509,176858,199017,233256,222449,210177 17 | DAMBOVITA,409272,438985,453241,527620,562041,541763,518745 18 | DOLJ,615301,642028,691116,750328,762142,734231,660544 19 | GALATI,341797,396138,474279,581561,641011,619556,536167 20 | GIURGIU,313793,325045,320120,327494,313352,297859,281422 21 | GORJ,280524,293031,298382,348521,401021,387308,341594 22 | HARGHITA,258495,273964,282392,326310,348335,326222,310867 23 | HUNEDOARA,306955,381902,474602,514436,547950,485712,418565 24 | IALOMITA,244750,274655,291373,295965,306145,296572,274148 25 | IASI,431586,516635,619027,729243,811342,816910,772348 26 | ILFOV,167533,196265,229773,287738,286965,300123,388738 27 | MARAMURES,321287,367114,427645,492860,540099,510110,478659 28 | MEHEDINTI,304788,304091,310021,322371,332673,306732,265390 29 | MURES,461403,513261,561598,605345,610053,580851,550846 30 | NEAMT,357348,419949,470206,532096,578420,554516,470766 31 | OLT,442442,458982,476513,518804,523291,489274,436400 32 | PRAHOVA,557776,623817,701057,817168,874349,829945,762886 33 | SATU MARE,312672,337351,359393,393840,400789,367281,344360 34 | SALAJ,262580,271989,263103,264569,266797,248015,224384 35 | SIBIU,335116,372687,414756,481645,452873,421724,397322 36 | SUCEAVA,439751,507674,572781,633899,701830,688435,634810 37 | TELEORMAN,487394,510488,516222,518943,483840,436025,380123 38 | TIMIS,588936,568881,607596,696884,700033,677926,683540 39 | TULCEA,192228,223719,236709,254531,270997,256492,213083 40 | VASLUI,344917,401626,431555,437251,461374,455049,395499 41 | VALCEA,341590,362356,368779,414241,438388,413247,371714 42 | VRANCEA,290183,326532,351292,369740,393408,387632,340310 43 | MUNICIPIUL BUCURESTI,1025180,1177661,1366684,1807239,2067545,1926334,1883425 44 | -------------------------------------------------------------------------------- /data/romania-topo.json: -------------------------------------------------------------------------------- 1 | {"type":"Topology","transform":{"scale":[0.0009458587030253588,0.0004646055131870291],"translate":[20.262419802867125,43.6192583399312]},"objects":{"romania-counties-geojson":{"type":"GeometryCollection","geometries":[{"type":"Polygon","id":"TR","arcs":[[0,1,2,3,4]],"properties":{"name":"Teleorman"}},{"type":"Polygon","id":"B","arcs":[[5]],"properties":{"name":"Municipiul București"}},{"type":"Polygon","id":"GR","arcs":[[6,7,-4,8,9]],"properties":{"name":"Giurgiu"}},{"type":"Polygon","id":"CL","arcs":[[-7,10,11,12,13]],"properties":{"name":"Călărași"}},{"type":"Polygon","id":"DJ","arcs":[[14,15,16,17,18]],"properties":{"name":"Dolj"}},{"type":"Polygon","id":"IF","arcs":[[-11,-10,19,20,21],[-6]],"properties":{"name":"Ilfov"}},{"type":"Polygon","id":"CT","arcs":[[-13,22,23,24,25]],"properties":{"name":"Constanța"}},{"type":"Polygon","id":"IL","arcs":[[-23,-12,-22,26,27,28]],"properties":{"name":"Ialomița"}},{"type":"Polygon","id":"OT","arcs":[[-1,29,-15,30,31]],"properties":{"name":"Olt"}},{"type":"Polygon","id":"MH","arcs":[[32,33,-17,34]],"properties":{"name":"Mehedinți"}},{"type":"Polygon","id":"GJ","arcs":[[-18,-34,35,36,37]],"properties":{"name":"Gorj"}},{"type":"Polygon","id":"DB","arcs":[[-9,-3,38,39,40,-20]],"properties":{"name":"Dâmbovița"}},{"type":"Polygon","id":"PH","arcs":[[-27,-21,-41,41,42]],"properties":{"name":"Prahova"}},{"type":"Polygon","id":"BR","arcs":[[-24,-29,43,44,45,46]],"properties":{"name":"Brăila"}},{"type":"Polygon","id":"TL","arcs":[[-25,-47,47,48]],"properties":{"name":"Tulcea"}},{"type":"Polygon","id":"VL","arcs":[[-31,-19,-38,49,50,51,52]],"properties":{"name":"Vâlcea"}},{"type":"Polygon","id":"AG","arcs":[[-2,-32,-53,53,54,-39]],"properties":{"name":"Argeș"}},{"type":"Polygon","id":"CS","arcs":[[-33,55,56,57,-36]],"properties":{"name":"Caraș-Severin"}},{"type":"Polygon","id":"BZ","arcs":[[-28,-43,58,59,60,-44]],"properties":{"name":"Buzău"}},{"type":"Polygon","id":"BV","arcs":[[-59,-42,-40,-55,61,62,63,64]],"properties":{"name":"Brașov"}},{"type":"Polygon","id":"GL","arcs":[[-48,-46,65,66,67]],"properties":{"name":"Galați"}},{"type":"Polygon","id":"VN","arcs":[[-66,-45,-61,68,69,70]],"properties":{"name":"Vrancea"}},{"type":"Polygon","id":"TM","arcs":[[71,-57,72,73]],"properties":{"name":"Timiș"}},{"type":"Polygon","id":"SB","arcs":[[-54,-52,74,75,-62]],"properties":{"name":"Sibiu"}},{"type":"Polygon","id":"CV","arcs":[[-69,-60,-65,76,77]],"properties":{"name":"Covasna"}},{"type":"Polygon","id":"HD","arcs":[[-37,-58,-72,78,79,-50]],"properties":{"name":"Hunedoara"}},{"type":"Polygon","id":"AB","arcs":[[80,-75,-51,-80,81,82,83]],"properties":{"name":"Alba"}},{"type":"Polygon","id":"AR","arcs":[[-79,-74,84,85,-82]],"properties":{"name":"Arad"}},{"type":"Polygon","id":"BC","arcs":[[-70,-78,86,87,88]],"properties":{"name":"Bacău"}},{"type":"Polygon","id":"VS","arcs":[[-67,-71,-89,89,90,91]],"properties":{"name":"Vaslui"}},{"type":"Polygon","id":"MS","arcs":[[-63,-76,-81,92,93,94,95]],"properties":{"name":"Mureș"}},{"type":"Polygon","id":"HR","arcs":[[-87,-77,-64,-96,96,97]],"properties":{"name":"Harghita"}},{"type":"Polygon","id":"NT","arcs":[[-90,-88,-98,98,99]],"properties":{"name":"Neamț"}},{"type":"Polygon","id":"CJ","arcs":[[-93,-84,100,101,102,103]],"properties":{"name":"Cluj"}},{"type":"Polygon","id":"SJ","arcs":[[104,105,106,-102]],"properties":{"name":"Sălaj"}},{"type":"Polygon","id":"BN","arcs":[[-94,-104,107,108]],"properties":{"name":"Bistrița-Năsăud"}},{"type":"Polygon","id":"IS","arcs":[[-91,-100,109,110,111]],"properties":{"name":"Iași"}},{"type":"Polygon","id":"BH","arcs":[[-101,-83,-86,112,113,-105]],"properties":{"name":"Bihor"}},{"type":"Polygon","id":"SV","arcs":[[-110,-99,-97,-95,-109,114,115,116]],"properties":{"name":"Suceava"}},{"type":"Polygon","id":"MM","arcs":[[-108,-103,-107,117,118,-115]],"properties":{"name":"Maramureș"}},{"type":"Polygon","id":"SM","arcs":[[-106,-114,119,-118]],"properties":{"name":"Satu Mare"}},{"type":"Polygon","id":"BT","arcs":[[-111,-117,120]],"properties":{"name":"Botoșani"}}]}},"arcs":[[[4642,229],[8,11],[-2,23],[-9,10],[6,16],[18,-3],[1,13],[13,4],[-2,26],[11,4],[-1,17],[16,6],[-2,7],[22,1],[2,24],[-7,15],[36,24],[-13,3],[-20,15],[-28,1],[-9,-16],[-4,14],[8,12],[11,-5],[19,7],[0,9],[-21,30],[-3,24],[-7,-3],[0,19],[-14,-1],[1,21],[-18,14],[-10,37],[3,22],[-9,23],[-8,5],[-9,19],[14,18],[-14,7],[-1,9],[-26,36],[-3,24],[-8,10],[9,3],[-1,20],[-15,-2],[-6,24],[46,40],[4,-4],[34,21],[56,17],[16,2],[-17,48],[45,17],[0,10],[46,11],[-3,13],[45,11],[12,12],[0,27],[-10,36],[-1,19],[-30,36],[-12,20],[2,22],[-13,46],[9,21],[37,55],[-21,15],[11,8],[-3,15],[5,59],[-7,24],[1,35],[13,8],[-6,16],[10,3],[8,15],[-9,9],[-12,25],[2,7],[-17,53],[-5,38]],[[4806,1636],[34,15],[11,-9],[2,-16],[34,3],[0,13],[80,-7],[13,16],[-3,11],[18,13],[9,13],[18,-11],[7,18],[28,-21],[7,21],[17,-14],[27,30],[34,24],[4,-13],[59,48],[6,-13],[23,21],[21,-47]],[[5255,1731],[10,-5],[8,-21],[8,8],[20,-2],[28,20],[-7,13],[12,16],[4,-6],[16,23],[-5,3],[22,40],[11,-16],[13,35],[-9,11],[13,38],[21,32],[6,14],[22,-20],[14,-8],[8,9],[18,-19],[-18,-40],[24,-22]],[[5494,1834],[20,-21],[-9,-15],[11,-9],[-15,-31],[6,-3],[-8,-19],[16,-8],[11,-12],[-2,-20],[15,0],[11,-14],[-31,-51],[11,-16],[-19,-32],[-7,-64],[38,-22],[21,-2],[32,9],[12,-6],[4,-16],[11,17],[5,-10],[10,0],[9,20],[19,-11],[10,-18],[-13,-34],[34,-35],[5,46],[15,-8],[-4,-30],[3,-18],[23,-18],[6,-26],[-4,-17],[-8,-8],[-6,-32],[-12,-20],[-6,-25],[4,-6],[-12,-75],[5,0],[24,-23],[20,-27],[14,-29],[-8,-7],[-2,-31],[4,-20],[-12,9],[-6,33],[-8,-3],[3,-21],[-12,5],[-3,-17],[8,-15],[-5,-16],[-16,28],[-3,30],[-12,-27],[-10,-12],[-3,-18],[-20,-37],[2,-30],[14,-12],[-6,-11],[-20,-8],[1,-15],[-9,-3],[0,-43],[-5,-8],[8,-26],[4,-54],[8,-5],[6,-18],[-14,-11],[20,-47],[-9,-11],[-3,-60],[6,-25],[-5,-30],[-16,-13],[14,-23],[12,-35],[-3,-32],[9,-23],[26,2],[8,-112],[4,-94],[7,-42],[2,-33]],[[5719,154],[-13,-6],[-29,-28],[-25,-18],[-38,-41],[-13,-8],[-31,0],[-30,4],[-27,-10],[-26,-22],[-33,-17],[-24,-8],[-34,5],[-23,15],[-22,30],[-14,13],[-25,16],[-32,51],[-11,9],[-47,14],[-26,17],[-30,-3],[-22,-18],[-19,-9],[-16,1],[-48,22],[-13,20],[-21,22],[-8,17],[-13,12],[-40,4],[-23,-6],[-11,-15],[-23,-18],[-34,-12],[-14,0],[-24,13],[-12,2],[-32,-9],[-2,-8],[-27,-26],[-21,-15],[-15,-3],[-23,12],[-33,33],[-4,13],[-26,30]],[[6168,1978],[5,7],[4,-36],[-4,-35],[14,-46],[72,-18],[-7,-7],[-22,-43],[13,-9],[10,5],[0,-21],[22,-5],[15,-13],[16,-1],[-10,-37],[0,-21],[-7,-6],[1,-23],[-37,-3],[-17,10],[-20,-62],[10,-27],[-7,-11],[-7,8],[-6,-12],[-3,12],[-19,14],[1,8],[-35,9],[-36,16],[-17,23],[-21,39],[-15,-9],[-6,13],[-15,-3],[-10,33],[-2,40],[51,5],[5,7],[-7,26],[-29,19],[-12,-8],[9,19],[6,40],[-3,16],[13,-5],[11,7],[3,29],[16,16],[0,16],[10,-8],[37,24],[5,8],[25,0]],[[6333,1459],[35,-36],[10,-43],[15,-19],[11,4],[16,-26],[26,1],[1,-41],[42,2],[3,-39],[12,-8],[0,-15],[-16,-2],[1,-17],[12,6],[0,-29],[7,-28],[4,7],[6,-21],[1,-21],[-8,-27],[-18,-18],[-18,-8],[-40,-41],[0,-8],[19,-127]],[[6454,905],[-3,-7],[-22,-5],[-37,-16],[-47,-45],[-21,-11],[-39,-28],[-13,-6],[-26,2],[-23,-3],[-40,-27],[-31,-57],[-3,-25],[-28,-59],[-8,-10],[-48,-38],[-25,-32],[-23,-19],[-30,-51],[-12,-42],[-29,-49],[-3,-25],[-33,-50],[-35,-19],[-20,-31],[-8,-31],[-15,-25],[-38,-33],[-13,-7],[-62,-2]],[[5494,1834],[7,10],[7,31],[8,13],[22,51],[17,0],[12,28],[18,-8],[21,19],[14,-9],[11,-19],[13,9],[16,42],[20,20],[6,-18],[8,2],[1,-19],[12,-4],[0,-10],[11,-7],[12,-18],[29,45],[13,2],[4,-18],[22,5],[31,-19],[8,14],[9,-8],[35,22],[22,-35],[7,21],[24,-8],[15,14]],[[5949,1982],[33,-51],[-10,-36],[-15,-38],[19,-5],[-18,-60],[-17,16],[-12,1],[-7,39],[-15,-22],[8,-6],[7,-50],[-8,-11],[7,-10],[-10,-9],[15,-22],[-31,-26],[-12,-14],[-2,-19],[11,1],[13,-9],[8,7],[1,-35],[13,-15],[-8,-13],[14,-11],[17,4],[4,-14],[-5,-9],[9,-4],[12,-23],[20,5],[16,-16],[10,0],[-2,-27],[15,-1],[3,22],[29,-28],[1,-18],[-8,-35],[-17,-39],[3,-3],[22,53],[1,11],[12,4],[12,-17],[13,-1],[1,-20],[10,-6],[19,-30],[28,2],[5,-32],[21,-15],[14,-3],[19,-20],[20,6],[11,28],[9,-12],[25,54],[8,-21],[22,37],[21,43]],[[6333,1459],[25,42],[-25,28],[29,41],[7,-7],[15,19],[5,-8],[18,21],[-10,3],[17,23],[-16,1],[-5,43],[9,3],[2,-19],[15,9],[-13,18],[17,14],[6,-11],[6,22],[28,26],[5,-5],[12,11],[12,-15],[5,10],[21,21],[40,35],[-4,14],[-11,1],[8,9],[-9,9],[-2,-15],[-12,13],[-12,-13],[-33,2],[0,19],[-12,-2],[-7,25],[-17,19],[41,55],[7,-9],[10,29]],[[6505,1940],[9,5],[46,53],[-35,2],[26,43],[24,33],[38,-36],[0,-16],[29,-56],[25,-14],[32,-8],[-12,-25],[10,8],[12,-17],[-12,-14],[18,-31],[-5,-32],[15,5],[9,-12],[-1,-26],[15,-7],[13,5],[11,-16],[17,-5],[19,3],[7,30],[8,17],[23,15],[6,11],[3,-38],[11,15],[27,51],[8,30],[16,15],[6,13],[7,-13],[11,29],[19,-5],[-5,-19],[22,9],[10,-6],[7,20],[21,-9],[-5,-17],[57,20],[5,8],[33,3],[46,0],[-1,-48],[63,0],[2,-49],[47,-4],[6,41],[54,-24],[0,-6],[18,-6],[5,34],[-5,2],[8,25],[14,-4],[4,-9],[-5,-33],[39,-11],[11,56],[20,-6],[-4,-45],[26,-7],[1,5],[40,-8],[8,67],[12,-1],[-1,-22],[22,0],[-2,-21],[32,3],[0,-6],[45,0],[61,7],[6,99],[22,-4],[1,43],[26,-7],[6,-71],[-1,-20],[2,-89],[54,-1],[0,-16],[24,0],[-3,-61],[10,0],[-4,-39],[78,-3],[1,-13],[13,-1],[31,-39],[-27,-27],[15,-30],[-10,-13],[14,-33],[10,-6],[18,23],[11,-36],[4,7],[11,-14],[16,14],[9,20],[7,43],[12,20],[37,-16],[104,-52],[31,-18]],[[8199,1551],[-7,-39],[-15,-36],[-18,-30],[-13,-37],[-19,-34],[-16,-18],[-12,-7],[-45,9],[-15,-11],[-35,3],[-15,-3],[-28,-18],[-18,-16],[-19,-30],[-27,-35],[-9,-6],[-32,2],[-10,7],[-57,10],[-37,-19],[-34,-25],[-50,-48],[-13,-26],[-22,-17],[-18,-26],[-21,-13],[-25,4],[-18,9],[-25,2],[-14,-7],[-22,4],[-15,18],[-27,4],[-17,-10],[-22,-21]],[[7409,1091],[-19,-13],[-27,-9],[-41,6],[-44,39],[-23,7],[-40,-13],[-23,7],[-18,10],[-22,1],[-35,-18],[-28,4],[-31,-4],[-26,1],[-38,-26],[-19,-10],[-26,-20],[-4,-8],[-69,-57],[-34,-10],[-29,5],[-21,-5],[-35,-27],[-26,-5],[-30,-14],[-33,3],[-38,0],[-19,-6],[-21,-13],[-62,-24],[-64,19],[-10,-6]],[[3875,1960],[-19,-35],[-21,-12],[9,-1],[5,-20],[-12,-24],[-27,-33],[-3,-8],[28,-18],[7,-18],[-11,-32],[30,-23],[-3,-5],[42,-17],[9,-10],[15,-5],[-6,-24],[-9,-13],[-1,-17],[41,-24],[3,17],[27,-14],[19,-21],[-11,-32],[8,1],[19,-32],[9,-33],[10,-2],[15,-44],[12,-13],[1,-45],[48,-19],[1,-14],[11,-4],[-8,-27],[16,-13],[18,-5],[22,5],[12,-51],[12,2],[-16,-84],[23,-5],[-9,-47],[-5,1],[-10,-77],[-8,-75],[3,-1],[-11,-100],[-5,-32],[17,-4],[-4,-29],[24,1],[-2,-19],[6,-1],[-9,-42],[14,-7],[-4,-16],[-18,9],[-8,-32],[18,-10],[10,-13],[-5,-20],[-7,-6],[11,-5],[-20,-129],[-8,-20],[-8,-34],[-11,3],[-4,-19],[-10,3],[-12,-35],[-21,-50],[-8,-35],[-7,2],[-9,-91],[-8,-61],[26,-25],[3,-16]],[[4101,156],[-32,17],[-19,3],[-23,19],[-14,20],[-42,21],[-35,24],[-23,10],[-46,1],[-55,17],[-23,13],[-18,17],[-24,16],[-24,9],[-23,19],[-12,27],[-27,7],[-38,-1],[-28,-8],[-36,-19],[-18,1],[-35,14],[-33,26],[-30,43],[-16,13],[-24,4],[-21,8],[-27,19],[-22,5],[-41,-10],[-52,5],[-60,-6],[-31,-20],[-28,-10],[-32,-20],[-55,-39],[-77,-21],[-18,3],[-29,16],[-47,13],[-43,28],[-36,9],[-27,18],[-15,23],[-9,24],[-7,33],[-2,31],[12,46],[10,26],[1,29],[8,29],[4,33],[12,45],[16,16],[29,18],[44,17],[3,-5],[30,9],[12,11],[3,13],[20,35],[13,46],[1,15],[-13,38],[-15,15],[-30,14],[-26,3]],[[2858,1031],[16,51],[14,20],[46,81],[16,-10],[46,-39],[6,3],[6,87],[11,98],[-41,28],[3,29],[27,7],[1,17],[8,33],[3,35],[12,27],[3,17],[43,15],[5,-3],[13,38],[-3,35],[5,13],[14,-3],[11,16],[22,-5],[4,28],[-24,27],[-70,48],[7,24],[11,-7],[3,14],[15,-8],[9,45],[3,39],[33,22],[10,13],[-1,21],[17,2],[24,10],[-1,21],[-20,8],[-4,23],[25,2],[13,7],[38,-3],[12,-8],[7,5],[11,23],[15,-1],[11,-12],[18,19],[16,-17],[19,0],[22,40],[7,41]],[[3375,2047],[15,15],[12,-5],[21,17],[6,34],[17,-1],[15,19],[30,1],[26,15],[12,-19],[-2,-13],[7,-13],[21,-9],[6,8],[20,9],[3,9],[32,-5],[16,5],[-1,-8],[11,-26],[7,22],[-5,29],[8,24],[3,28],[-9,20],[3,21],[-6,12],[12,31],[7,29],[-5,15],[0,40],[7,-5],[10,20],[10,-9],[20,-1]],[[3704,2356],[-4,-30],[12,-15],[2,-20],[-7,-15],[-2,-29],[13,-4],[1,-23],[12,-37],[5,36],[12,-9],[4,-12],[18,-10],[14,5],[23,-26],[22,7],[19,-12],[-6,-8],[1,-28],[-7,-7],[1,-29],[7,-31],[13,7],[12,-38],[-1,-22],[7,-46]],[[5949,1982],[-17,29],[14,11],[-26,32],[14,26],[9,-9],[22,-39],[33,25],[16,19],[41,65],[-7,25],[-48,43],[4,27],[19,-2],[13,7],[6,16],[-8,39],[19,15],[-5,12],[-9,1],[-8,45],[-15,5],[-20,-57],[-6,6],[-2,22],[-7,5],[-9,23],[-4,26],[15,2],[2,19],[12,9],[16,-20],[5,15]],[[6018,2424],[1,-10],[16,-9],[17,19],[13,-20],[10,12],[14,6],[11,-6],[10,4],[9,-10],[12,4],[2,20],[10,2],[14,-21],[13,-2],[-13,50],[13,-2],[5,7],[9,-24],[20,-11],[24,19],[8,-12],[18,-5],[0,13],[9,1],[7,-12],[26,-3],[22,-13],[1,-10],[14,-6],[12,34],[16,28],[7,6],[16,-3]],[[6384,2470],[16,-14],[3,-10],[21,-25],[11,-23],[7,-32],[12,-23],[0,-37],[-24,-7],[-8,-25],[11,-12],[18,-52],[12,-55],[49,19],[-1,7],[34,19],[5,-20],[-10,-12],[8,-9],[-8,-7],[7,-11],[-29,-32],[-20,37],[-42,-58],[10,-14],[-24,-40],[5,-7],[-14,-21],[15,-26],[-6,-7],[8,-18],[27,10],[6,-34],[9,29],[13,-20]],[[8199,1551],[5,43],[9,25],[15,29],[20,30],[6,29],[25,22],[10,14],[6,27],[-13,43],[-1,23],[-8,41],[-33,33],[-9,26],[-6,31],[-10,34],[-16,29],[-6,29],[2,22],[18,46],[1,32],[-19,60],[-15,14],[-28,41],[-11,7],[-23,-2],[-14,12],[-14,24],[-26,17],[-17,29],[-3,40],[6,48],[4,12]],[[8054,2461],[16,19],[55,19],[26,-17],[22,-26],[15,-7],[22,14],[8,-7],[9,26],[19,19],[11,44]],[[8257,2545],[42,-18],[9,11],[7,-4],[14,13],[12,-5],[31,-32],[0,-52],[13,-16],[23,1],[6,21],[43,3],[0,-30],[-9,-17],[0,-20],[15,-6],[-10,-30],[18,-9],[-20,-24],[19,-11],[19,24],[27,-16],[-4,-10],[18,-6],[-12,-20],[20,-3],[0,-9],[37,-3],[5,-8],[28,-2],[-19,-45],[37,-12],[5,19],[29,-9],[3,24],[26,3],[-8,-17],[19,-8],[-8,-17],[10,-5],[-4,-14],[18,18],[38,-1],[2,42],[45,-11],[70,18],[28,0],[27,6],[-4,39],[44,7],[6,-11],[1,-25],[11,-7],[16,10],[-2,-25],[5,-29],[13,-30],[13,7],[9,-12],[-8,-22],[8,-5],[24,46],[31,45],[28,27],[50,44],[27,-7],[23,-28],[9,-1]],[[9230,2281],[-19,-33],[-33,-73],[-73,-211],[-24,-57],[-19,-38],[-59,-103],[-37,-68],[-24,-52],[-11,-16],[-20,-59],[-3,-28],[-3,12],[-21,-2],[-7,-27],[-28,-3],[7,-7],[-11,-39],[-7,-60],[0,-54],[7,-49],[8,-22],[9,-2],[7,-14],[4,-32],[0,-33],[5,-17],[-2,-29],[-2,22],[-7,-11],[5,-27],[-12,-5],[3,-12],[13,6],[10,-6],[-21,-10],[4,-18],[-8,-9],[-2,-56],[-5,-7],[8,-13],[3,12],[12,2],[6,18],[0,-21],[5,-21],[-27,-9],[-5,-13],[0,-20],[6,-48],[7,-17],[14,-65],[-2,-21],[5,-26],[-13,-24],[-1,-20],[-13,-19],[-3,-34],[-6,-17],[3,-22],[-6,-22],[-9,-10],[-9,-23],[-8,-43],[2,-58],[-19,-30],[3,-15],[-5,-15],[-1,-29],[-14,-22],[8,-21],[-3,-48],[-5,-21],[6,-40],[-143,-11],[-101,39],[-119,14],[-91,59],[-72,53],[-19,17],[-55,42],[-19,11],[-19,124],[-24,90],[-10,91],[-29,51],[-78,-90],[-94,-17],[-17,-11],[-30,13],[-38,151],[-32,39],[-33,-76],[-88,12],[-32,6],[-34,3],[-71,-21],[-29,54],[-16,45],[-57,28],[-12,8],[-1,16],[-13,28],[0,25],[6,4],[-9,15],[-5,22]],[[6384,2470],[7,20],[-6,7],[5,20],[30,-8],[-1,15],[7,-1],[-2,-28],[28,11],[16,-17],[19,-11],[12,22],[50,66],[37,-38],[16,7],[20,37],[15,-13],[10,17],[-3,10],[8,7],[3,16],[15,23],[41,37]],[[6711,2669],[0,-18],[8,-22],[3,-25],[11,-33],[12,12],[10,-20],[31,1],[16,9],[10,-12],[11,10],[2,-10],[54,12],[13,-8],[-5,-9],[16,-21],[-4,-8],[20,-18],[4,4],[17,-9],[11,23],[17,18],[10,-9],[3,18],[13,30],[32,-32],[2,5],[66,-41],[2,3],[24,-22],[4,22],[-5,3],[13,35],[12,22],[39,-45],[58,-34],[-15,-78],[38,-19],[4,15],[46,-26],[13,46],[-25,9],[2,7],[-26,12],[9,51],[50,-6]],[[7337,2511],[16,-10],[-3,-15],[16,-11],[13,-23],[28,-31],[49,133],[48,-8],[-7,-20],[41,-34],[7,-1],[13,26],[19,2],[1,-21],[6,2],[64,0],[0,-17],[26,-3],[-1,26],[18,-5],[58,7],[3,-11],[42,-9],[16,-1],[38,-12],[26,-11],[16,2],[82,17],[36,10],[36,-6],[10,-26]],[[4642,229],[-27,32],[-12,9],[-39,18],[-31,6],[-45,15],[-10,-2],[-55,-46],[-2,4],[-31,-11],[-18,-17],[-16,-22],[-9,-22],[-32,-28],[-13,-1],[-23,8],[-23,-4],[-38,-14],[-23,-4],[-14,-8],[-35,-7],[-27,7],[-18,14]],[[3875,1960],[12,9],[23,-6],[21,11],[21,-2],[14,-11],[17,-6],[-4,-23],[16,16],[2,-21],[-6,-15],[12,-3],[9,-26],[14,4],[6,-10],[14,5],[14,24],[-3,21],[17,21],[0,28],[15,11],[12,26],[-3,15],[16,-3],[17,12],[14,-3],[15,-24],[4,5],[22,-2],[21,10],[-1,39],[19,-3],[0,53],[13,-2],[11,6],[6,-42],[-6,-6],[2,-23],[11,-10],[7,8],[17,3],[12,8],[3,24],[-9,33],[3,14],[-7,15],[10,8],[-8,43],[-9,22],[-9,9],[0,26],[7,11],[-12,2],[6,18],[-9,19],[-13,6],[2,25],[-7,4],[-3,35],[6,22],[-5,15],[6,31],[-2,7],[12,23],[1,31],[22,2],[-4,41],[6,27],[-6,31],[4,17],[32,37],[-12,28],[2,15],[23,11],[3,9],[16,2],[8,13],[12,-4],[11,28],[21,-16],[4,-24],[-9,-16],[6,-7],[-3,-30],[18,-22]],[[4415,2639],[4,-9],[-15,-30],[-1,-10],[19,-24],[15,12],[16,3],[6,15],[14,-1],[2,33],[-6,21],[12,9],[3,24],[8,4],[1,20],[6,11],[5,29],[9,-9],[11,1],[2,-20],[0,-51],[8,-12],[0,-18],[7,-35],[14,-23],[3,-32],[15,-10],[-7,-52],[7,-1],[6,-40],[14,-2],[8,-13],[6,-35],[25,7],[43,2],[25,-3],[-9,-21],[7,-13],[-2,-22],[-21,-23],[19,-55],[-1,-36],[3,-17],[8,-11],[2,-25],[10,-21],[8,-39],[-16,-17],[0,-31],[5,-1],[9,-24],[1,-22],[-7,-32],[11,-27],[-2,-38],[-13,-25],[1,-19],[12,-26],[-6,-36],[9,-8],[-7,-24],[1,-27],[10,-38],[-8,-18],[14,-23],[0,-12],[12,-5],[-2,-8],[17,-1],[17,7],[18,-8],[6,-18]],[[1839,2145],[41,-31],[7,-8],[17,27],[2,12],[16,15],[9,-8],[20,-51],[16,-9],[11,16],[12,-29],[14,14],[-1,16],[11,18],[-1,17],[9,21],[-3,21],[4,12],[-7,19],[-17,1],[-15,20],[6,43],[4,6],[-8,22],[13,40],[4,61],[29,2],[9,12],[-1,14],[12,18],[-8,13],[-3,48],[10,11],[6,37],[8,11],[32,-24],[23,-52],[19,-5],[12,3],[12,-10],[21,7],[15,-7],[18,21],[9,1],[5,-12],[25,-12],[7,24],[8,11],[4,26],[12,-3],[6,18],[15,26],[-1,24],[16,22],[-2,17],[13,21],[8,37],[9,10],[2,28],[-7,21],[7,17],[8,35],[-6,27],[6,24],[21,19],[-25,20],[6,19],[33,35],[28,47],[9,34],[11,18],[10,2],[17,23],[1,12],[15,29],[17,23],[10,26],[17,18],[0,6]],[[2531,3202],[15,-11],[13,9],[10,-29],[12,-23],[6,-25],[22,-10],[14,-17],[27,7],[18,-37],[12,-2],[22,-18],[13,-22],[2,-18],[14,-23],[9,-5],[-2,-25],[24,-2],[19,-28],[3,-22],[-6,-30],[-20,-12],[11,-73],[8,-15],[-2,-24],[9,-21],[-4,-43],[7,-35],[1,-37],[27,-36],[15,-24],[-16,-23],[4,-11],[21,-19],[13,32],[12,-8],[25,-31],[-5,-8],[4,-24],[10,-13],[1,-23],[10,-13],[17,-11],[18,0],[6,-18],[7,9],[6,-13],[-3,-24],[12,-8],[3,-14],[14,-14],[15,-2],[6,-18],[29,0],[4,7],[27,-18],[13,1],[13,-10],[11,3],[18,-7],[9,4],[12,-14],[35,-13],[18,-16],[26,-14],[25,-26],[9,-3],[13,-17],[11,-5],[44,-35],[2,-20],[-13,-22],[28,-6],[8,-21],[23,-18]],[[2858,1031],[-34,2],[-13,8],[-25,26],[-27,37],[-38,33],[-34,24],[-28,34],[-26,45],[-13,10],[-48,8],[-20,20],[-6,14],[2,25],[13,44],[0,31],[-8,29],[-14,18],[-26,12],[-23,-1],[-35,13],[-22,13],[-7,9],[-13,33],[-20,30],[-18,74],[-6,15],[-4,33],[-1,36],[3,12],[-31,40],[-7,13],[-9,37],[-1,27],[11,18],[14,-1],[44,-17],[21,12],[15,24],[5,34],[0,37],[3,26],[15,29],[10,7],[29,4],[29,-16],[37,-46],[17,-15],[8,0],[63,44],[4,9],[-6,42],[-14,27],[-40,66],[-25,9],[-8,20],[-8,4],[-29,-10],[-19,-1],[-22,17],[-20,21],[-12,5],[-8,27],[-13,11],[-8,18],[-34,52],[-3,12],[-15,17],[-11,20],[-24,17],[-45,-20],[-16,-36],[-19,-26],[-16,-5],[-29,8],[-14,-8],[-28,-44],[-5,-35],[-25,-24],[-10,-59],[-26,-60],[-13,-24],[-26,-87],[-10,-22],[-14,-60],[-9,-11],[-20,-11],[-13,0],[-25,13],[-40,56],[-13,50],[-12,14],[-22,17],[-11,53],[2,17],[-2,36],[-22,35],[-3,20]],[[2531,3202],[0,18],[-6,26],[-12,1],[-12,16],[-4,-4],[-22,9],[-9,-8],[-17,8],[-15,25],[-5,27],[16,42],[28,53],[14,8],[14,-1],[19,23],[3,19],[-8,9]],[[2515,3473],[23,6],[9,9],[4,17],[21,11],[10,11],[19,-8],[13,5],[4,16],[19,3],[2,8],[19,-2],[5,-9],[34,18],[12,22],[20,-24],[7,-1],[13,-20],[6,0],[30,26],[19,10],[19,-1],[10,-11],[16,0],[29,49],[1,-37],[11,-22],[-1,-18],[18,-11],[7,-19],[9,-3],[-8,-25],[3,-15],[18,-5],[18,19],[8,18],[19,24],[-2,32],[6,13],[0,28],[6,10],[23,-4],[14,-14],[28,-12],[13,-16],[24,29],[20,-13],[11,36],[9,11],[28,19],[19,-4],[19,5],[20,-16],[10,2],[12,14],[1,29],[18,29],[23,-8],[11,15],[17,-41],[33,-31],[12,-3],[4,-14],[13,0],[20,10],[9,25],[29,20],[6,11],[16,2],[11,23],[12,-1],[20,25],[20,5]],[[3516,3730],[18,-25],[10,-2],[6,-12],[9,2],[12,31],[9,0],[20,-16],[21,-29],[8,7],[23,-1],[10,-9],[10,11],[28,14],[14,20],[22,4],[22,-12],[10,-21],[16,-2],[3,-36],[-18,-35],[-15,-41],[-12,-26],[-6,-3],[7,-62],[6,-8],[3,-35],[11,-37],[17,-19],[16,-68],[4,-31],[-11,-3],[-29,-22],[-4,-15],[9,-19],[2,-29],[-9,-46],[0,-24],[-13,-15],[0,-42],[-8,-11],[-3,-22],[-19,-49],[-17,-10],[-7,-20],[8,-19],[1,-44],[6,-10],[3,-23],[-5,-59],[3,-43],[-7,-7],[2,-20],[-10,-47],[8,4],[15,-6],[9,-39],[-1,-17],[14,-19],[-16,-12],[-5,-32],[2,-31],[-11,-40],[5,-30],[7,-12],[-3,-17],[6,-15],[-11,-50],[-2,-30],[-5,12]],[[5255,1731],[40,55],[1,23],[-4,25],[13,7],[-14,55],[-2,15],[-8,10],[17,26],[-15,18],[9,13],[6,-12],[7,11],[-18,39],[-15,21],[-32,78],[-13,0],[-8,11],[-6,28],[12,24],[-9,7],[-5,15],[-29,38],[12,13],[11,-13],[11,13],[30,47],[5,32],[-19,13],[-22,7],[-13,13],[10,33],[6,6],[7,31],[13,24],[4,28],[-9,9],[3,10],[-10,23],[-8,47],[2,25],[-3,25],[12,32],[-12,42],[-1,21],[5,40],[-23,34],[-11,33],[5,18],[-2,21],[4,13],[-1,41],[7,30],[16,6],[8,19],[-2,34],[-10,30],[-17,1],[1,15],[-9,13],[-17,-6],[-8,19],[-13,18],[1,39],[12,13],[3,13],[11,-7],[2,-17],[11,4],[10,32],[0,24],[-10,10],[-11,39],[5,18],[-15,8],[5,21],[-6,19],[11,27],[-1,27],[3,24],[-25,6],[-6,19],[2,21],[9,7],[15,28],[7,-22],[13,-13],[11,-24],[-1,-31],[6,-23],[15,-33],[7,-2],[5,13],[30,12],[11,11],[-2,49],[-4,20],[7,8],[28,2],[13,14],[2,20],[-8,15],[0,30],[-7,32],[7,8],[10,26],[11,16],[-1,26],[12,38],[-7,25],[15,23],[2,24],[-6,7],[-4,26],[7,27]],[[5349,3797],[14,0],[28,17],[16,-6],[12,3],[15,-8],[8,15],[-2,61],[6,14],[17,20],[2,-4],[21,12]],[[5486,3921],[14,-25],[6,-22],[-1,-17],[8,-35],[-1,-17],[-10,-29],[4,-12],[-7,-11],[-2,-23],[5,-27],[-6,0],[0,-17],[11,-21],[17,-9],[10,13],[8,-18],[21,-19],[1,-13],[26,-54],[2,-19],[-16,-20],[-8,-25],[-3,-25],[-8,-29],[9,-36],[5,-33],[14,-6],[15,5],[5,-57],[10,1],[20,-20],[6,-31],[5,-7],[3,-27],[11,-31],[8,-5],[16,-26],[18,-9],[11,-23],[8,-2],[6,-42],[-4,-10],[11,-54],[0,-18],[-11,-22],[1,-41],[16,-7],[-15,-35],[0,-15],[8,-26],[8,4],[-6,17],[12,7],[6,-17],[20,13],[12,-3],[14,-42],[31,13],[4,-20],[8,4],[13,-39],[10,5],[4,-27],[7,0],[-2,-23],[-17,-6],[12,-55],[-17,-21],[-9,-20],[15,-50],[17,1],[19,-20],[14,-5],[19,24],[17,-29],[-2,-12],[9,-25],[17,-11],[-3,-10],[14,-25],[-3,-17],[8,2],[18,-42],[7,-1],[9,-16]],[[5486,3921],[10,29],[14,-1],[25,28],[5,16],[31,-31],[35,8],[25,-4],[3,11],[15,8],[1,14],[18,16],[47,4],[24,13],[7,-2],[10,-28],[-1,-13],[13,-3],[7,-12],[43,2],[14,22],[11,4],[8,-15],[11,-6],[13,-30],[-1,-12],[9,-18],[-1,-23],[28,-7],[12,-12],[7,33],[14,17],[-1,25],[4,22],[8,12],[2,17],[-5,20],[18,34],[9,6],[2,16],[29,-4],[23,-13],[6,8],[23,5],[10,-16],[8,-30],[20,-15],[12,-15]],[[6111,4001],[11,-11],[-3,-25],[4,-26],[-9,-24],[34,-40],[17,-7],[2,-12],[12,-6],[15,-29],[1,-17],[7,-8],[14,-40],[18,-6],[11,3],[26,-24],[11,-23],[6,-31],[12,0],[12,-25],[-7,-26],[-18,-11],[7,-23],[-7,-22],[17,-1],[0,-17],[6,-21],[-8,-46],[5,-17],[-4,-11],[4,-24],[13,-13],[5,-17],[16,6],[15,12],[38,-11],[11,22],[10,9],[20,-10],[8,5],[-11,-31],[-1,-23],[6,-10],[2,-46],[9,0],[15,-12],[20,42],[15,-9],[13,4],[15,24],[6,2],[35,-76],[1,-13],[-8,-8],[-4,-34],[-11,-2],[3,-29],[-6,-3],[9,-14],[-9,-8],[3,-17],[-6,-7],[-1,-35],[14,-5],[18,-24],[0,-55],[10,-30],[0,-34],[16,-32],[16,16],[-1,7],[19,6],[12,-11],[19,-47],[-7,-9],[5,-11],[16,16],[4,-58],[-51,-27],[-15,-25],[6,-15],[15,-12],[4,4],[15,-24],[4,-25],[15,-26],[11,10],[28,-49]],[[7337,2511],[5,23],[-10,18],[-14,9],[4,8],[23,-12],[18,92],[-1,21],[-23,13],[5,18],[26,-11],[26,133],[-24,7],[8,49],[17,-13],[1,12],[15,0],[4,8],[0,49],[-8,3],[3,21],[-36,1],[8,70],[-53,1],[2,44],[6,48],[1,50],[-9,4],[-20,-3],[-11,13],[-20,152],[-15,-12],[3,-5],[-49,-36],[-23,33],[16,40],[16,20],[21,47],[48,67],[12,-20],[6,7],[26,-36],[4,10],[30,-31],[4,22],[43,-44],[11,32],[14,-6],[11,24],[20,-10],[16,28],[-17,12],[12,28],[-16,13],[4,11],[14,-10],[9,29],[12,-5],[8,7],[-3,26],[17,9],[0,57],[-10,32],[14,7],[-1,13],[18,11],[-2,21],[-9,19],[9,0],[36,31],[-7,40]],[[7582,3820],[-5,23],[15,2],[27,20],[22,22],[-5,12],[14,14],[-6,14],[9,18],[20,21],[34,48]],[[7707,4014],[11,17],[11,-1],[16,-14],[12,-3],[14,-29],[-2,-16],[22,8],[-4,9],[8,17],[20,2],[-2,22],[12,-1],[-5,-36],[14,4],[12,14],[9,0],[2,-16],[-14,-19],[35,-7],[5,-9],[-7,-22],[21,7],[-2,-17],[16,12],[-1,-44],[-6,-17],[6,-13],[35,18],[6,-4],[2,-28],[31,-13],[2,-15],[8,8],[23,4],[14,-8],[9,6],[-11,5],[10,9],[7,25],[11,-8],[-1,14],[21,-9],[22,-22],[21,1],[20,-11],[25,-22],[9,22],[9,-11],[12,11],[16,3]],[[8211,3837],[-4,-33],[2,-45],[-19,-95],[-14,-36],[-2,-39],[24,-36],[12,-13],[35,-22],[21,-9],[19,2],[11,16],[8,-4],[4,-30],[10,-20],[-27,-61],[-14,-26],[1,-8],[44,-38],[17,-18],[28,-38],[17,-7],[5,-10],[-23,-20],[-7,-16],[11,-29],[-6,-13],[-10,-2],[-28,8],[-3,-5],[-1,-43],[8,-52],[10,-48],[-11,-5],[-12,-27],[0,-20],[5,-32],[10,-39],[8,-9],[-4,-19],[-17,-41],[-7,-49],[2,-46],[17,-23],[-6,-19],[-30,-26],[-11,-24],[-1,-27],[-16,-35],[-8,-26],[-2,-35]],[[8211,3837],[11,31],[22,25],[22,19],[29,8],[19,-4],[22,-18],[30,-34],[18,0],[-1,45],[5,35],[16,32]],[[8404,3976],[10,-1],[49,-28],[14,-20],[6,-23],[-3,-56],[8,-36],[12,-25],[18,-59],[23,-57],[8,-10],[76,-49],[24,-17],[11,-3],[82,-55],[31,-27],[19,-7],[54,-5],[42,-17],[28,-23],[24,-4],[27,19],[47,14],[4,21],[-8,17],[-23,15],[-10,25],[-2,18],[14,15],[19,-1],[11,5],[13,36],[-3,8],[-19,13],[-4,17],[26,20],[18,-6],[9,-17],[19,-21],[26,0],[37,-55],[11,-12],[24,-10],[11,13],[2,22],[-6,31],[11,31],[11,14],[13,-1],[16,11],[12,17],[19,13],[16,20],[18,0],[16,14],[10,15],[23,2],[17,17],[31,13],[19,13],[12,14],[6,21],[41,26],[15,22],[17,1],[20,-13],[25,4],[28,41],[16,-5],[10,-15],[26,-2],[12,4],[9,-8],[34,15],[17,-20],[23,-11],[19,-15],[15,-2],[27,-14],[26,-9],[24,-20],[26,-26],[28,-52],[42,-69],[3,-25],[8,-24],[2,-35],[9,-54],[-16,-19],[-4,-17],[2,-26],[9,-40],[13,-37],[-19,7],[-10,10],[-23,1],[-4,-10],[3,-30],[9,-49],[11,-16],[24,-2],[32,9],[17,-2],[-15,-9],[-15,-18],[1,-6],[-15,-23],[-16,-44],[-8,-34],[-6,-43],[-6,-76],[-2,-43],[-12,-163],[-1,-31],[-8,-82],[-1,-38],[-5,-13],[0,-25],[-9,-37],[-10,-26],[-29,2],[-16,-24],[-20,0],[-28,-8],[-78,-11],[-45,-10],[-43,-4],[-42,-9],[-67,-17],[-31,-12],[-86,-42],[-27,-18],[-35,-35],[-30,-40],[-29,-44],[-35,-64]],[[3516,3730],[-2,23],[16,32],[-4,31],[-8,16],[-1,23],[4,20],[-18,7],[-1,9],[21,53],[-2,19],[4,14]],[[3525,3977],[23,-3],[9,13],[5,-13]],[[3562,3974],[-2,-15],[23,0],[25,18],[15,23],[0,8],[19,38],[34,4],[25,25],[13,5],[10,26],[8,8],[24,-7],[18,10],[32,0],[7,-19],[9,-2],[14,11],[33,11],[48,-4],[7,6],[23,-4],[9,-7],[21,3],[5,-9],[19,-14],[9,1],[26,-16],[32,-1],[11,23],[14,-4],[11,8],[26,-7],[39,6],[6,17],[14,18],[2,15],[31,-9],[11,13],[-1,12],[27,37],[13,-9],[11,5],[25,29],[17,6],[41,-8],[22,3],[20,-5],[14,20],[14,-21],[16,0],[21,-8]],[[4473,4214],[-6,-7],[8,-36],[1,-25],[-5,-10],[1,-18],[-7,-21],[-16,-11],[-7,-47],[-14,-42],[-16,-10],[20,-44],[-2,-20],[5,-19],[-9,-8],[8,-11],[-5,-9],[0,-21],[13,-19],[4,-43],[-3,-17],[13,5],[19,-17],[-10,-18],[2,-48],[-16,-14],[10,-1],[7,-17],[2,-34],[7,-21],[-9,-16],[8,-17],[-10,-22],[-7,-5],[3,-25],[-17,-54],[9,-32],[21,-21],[9,-18],[-5,-14],[4,-14],[15,2],[6,-20],[-6,-31],[-17,-13],[11,-19],[8,-25],[-8,-62],[-14,15],[-12,-28],[2,-14],[21,5],[1,-30],[-17,-14],[-9,-17],[5,-17],[10,-5],[14,-22],[-9,-26],[-1,-31],[-16,-22],[20,-30],[-12,-17],[-19,-43],[-4,-22],[-6,-7],[-2,-19],[9,7],[17,-4],[-11,-43],[-11,-15],[-7,-21],[1,-19],[12,-11],[-3,-28],[-9,-25],[5,-5],[-8,-26],[-19,-19],[-5,-13]],[[4473,4214],[20,18],[17,-11],[9,10],[20,4],[12,-15],[42,40],[14,1],[6,9],[19,2],[13,-13],[18,-7],[14,19]],[[4677,4271],[14,-1],[31,8],[7,-8],[12,8],[26,8],[23,-17],[19,15],[21,-9],[5,-29],[18,-3],[18,7],[21,2],[30,-3],[17,-22],[20,18],[13,4],[17,-3],[14,-12],[28,1],[13,12],[20,-16],[16,1],[11,-8],[25,7],[13,-25],[13,-4],[4,-17],[17,-14],[8,-29],[22,-17],[14,-27],[9,-3],[9,16],[29,-32],[9,-28],[-5,-43],[2,-19],[7,-7],[14,-31],[-3,-17],[11,-19],[-14,-23],[5,-13],[10,6],[15,-6],[7,-11],[15,11],[6,-15],[1,-24],[5,-15],[-5,-14],[15,-14]],[[1839,2145],[-4,27],[-6,9],[-45,5],[-28,23],[-12,4],[-11,-7],[-13,1],[-24,12],[-31,8],[-9,-7],[-23,4],[-13,22],[-31,-6],[-25,-12],[-26,-2],[-22,21],[-24,3],[-28,-12],[-15,3],[-11,12],[-12,40],[-1,31],[5,36],[-4,24],[-18,54],[-12,17],[-30,20],[-23,7],[-33,-4],[-44,13],[-45,-7],[-24,15],[-6,18],[-3,29],[-8,22],[-23,29],[7,13],[-9,3],[-1,19],[12,47],[19,3],[3,9],[12,-7],[16,6],[5,9],[24,-13],[6,15],[18,-14],[10,6],[14,-5],[22,16],[4,9],[22,5],[30,14],[-1,24],[-10,42],[4,8],[-6,15],[-21,19],[-8,-2],[-53,44],[-26,8],[-8,-3],[-33,38],[9,18],[-9,12],[-25,19],[-23,40],[6,11],[37,10],[7,12],[18,0],[33,10],[-9,30],[12,40],[25,40],[-11,23],[-1,17],[7,24],[19,8],[33,30],[2,19],[-15,52],[-23,3],[-10,38]],[[1291,3381],[9,15],[8,-10],[20,19],[-8,27],[7,25],[10,16],[-5,27],[11,6],[2,34],[21,16],[-7,32],[8,15],[-9,18],[-24,30],[0,32],[-16,21],[-22,13],[-33,49],[9,8],[-22,38],[-4,47],[19,6],[1,8],[33,11],[2,-9],[16,3],[-8,18],[-9,0],[-2,13],[-15,-8],[-11,6],[-6,72],[0,18],[28,22],[51,10],[19,38],[10,-12],[14,26],[-11,17],[16,60],[8,23],[12,19],[30,-6],[22,25],[26,13],[14,-8],[8,-18],[9,2],[-3,-20],[11,-12],[14,6],[9,-16],[9,-2],[16,-50],[23,3],[35,-2],[20,-7],[10,16],[35,-2],[6,11],[-5,14],[0,27],[14,8],[4,-9],[0,-43],[9,-22],[9,7],[19,0],[9,9],[10,-6],[13,-22],[-17,-54],[22,-19],[5,7],[10,-14],[8,10],[12,-4],[12,7],[24,-9],[5,30],[10,12],[12,4],[2,43],[-9,25],[-2,45],[5,4],[-4,18],[18,19],[12,-18],[34,48],[6,-6],[7,12],[21,-2],[7,33],[17,42],[24,-9],[14,-46],[24,-7],[18,5],[19,-36],[14,-3],[25,42],[6,66],[12,32],[15,28],[10,-6],[11,-18],[31,1],[13,17],[12,-2],[10,-17],[8,8],[15,29]],[[2287,4413],[19,-18],[12,-6],[-1,-21],[13,-34],[9,-14],[22,-23],[3,-19],[10,-29],[4,-26],[10,-13],[24,11],[23,0],[17,8],[13,-20],[-1,-25],[16,1],[27,17],[7,-10],[4,-28],[-18,-24],[0,-16],[20,11],[5,-24],[20,-27],[-2,-14],[8,-32],[8,-4],[7,-16],[2,-29],[7,-29],[-12,-17],[9,-25],[6,-43],[8,-12],[-9,-30],[-22,-33],[-17,-14],[-7,-13],[11,-27],[3,-31],[-9,-5],[-23,-31],[-11,-7],[-37,-54],[8,-63],[-2,-27],[-9,-18],[-1,-16],[44,-1],[10,-20]],[[6111,4001],[16,14],[10,18],[-1,18],[16,29],[10,4]],[[6162,4084],[15,-5],[5,10],[27,5],[6,8],[14,37],[4,3],[7,32],[15,30],[-4,16],[3,28],[6,8],[2,24],[22,19],[4,11],[24,2],[11,-9],[11,-41],[28,-28],[27,42],[14,37],[10,14],[2,18],[-6,27],[8,38],[-1,37],[18,36],[5,23],[-3,21],[11,4],[10,20],[13,2],[-2,31],[9,37],[-6,35],[3,26],[6,15]],[[6480,4697],[17,-22],[33,-13],[-7,-8],[11,-20],[1,-45],[-8,-25],[7,-19],[18,-14],[7,-13],[1,-31],[15,-8],[7,-18],[0,-20],[20,-33],[5,-21],[17,-34],[13,0],[5,-21],[18,-8],[11,12],[7,-4],[9,-20],[13,-4],[22,19],[2,9],[15,0],[8,-24],[-3,-22],[14,-20],[10,-33],[7,-7],[19,-1],[14,11],[14,-32],[16,-21],[13,-30],[21,-4],[3,5],[18,-7],[10,10],[17,-13],[12,-47],[11,-9],[19,5],[24,-1],[12,-6],[16,7],[11,27],[21,-2],[27,-19],[13,16],[8,0],[13,-24],[2,-29],[6,-8],[0,-21],[12,-26],[2,-17],[14,-7],[6,-23],[16,-17],[31,-11],[32,32],[4,16],[21,-13],[-19,-55],[15,9],[36,-42],[5,-14],[32,35],[1,6],[24,10],[12,-29],[15,12],[4,-6],[7,26],[9,16],[24,9],[2,-43],[-18,-28],[8,-94],[36,-22],[2,15],[25,-6],[22,0],[29,9],[15,17],[8,-13],[35,37]],[[4677,4271],[0,24],[-10,11],[6,44],[7,20],[-6,40],[3,22],[-10,26],[5,40],[-8,19],[-12,52],[-26,73],[2,14],[-9,26],[-1,21],[34,42],[18,11],[12,15],[22,4],[14,9],[17,-5],[16,4],[17,-2],[4,19],[-5,22],[5,3],[-8,16],[-8,1],[-6,15],[-16,11],[-16,22],[-9,4],[-5,18],[0,20],[-7,18],[1,16],[-7,15],[3,13],[20,14],[28,-22],[10,7],[-2,20],[18,32],[0,24],[21,-3],[6,6],[23,-3],[16,7],[2,18],[-7,12],[7,12],[-1,18],[20,10],[11,-1],[11,44],[11,6],[7,28],[34,19],[8,21],[15,2],[-6,17],[3,12]],[[4949,5294],[9,21],[-6,18],[2,13],[11,21],[21,19],[11,5],[9,24],[10,7],[8,18],[6,-11],[29,-19],[30,32],[27,4],[12,-18],[23,-11],[12,3],[-1,27],[5,16],[13,5],[12,13]],[[5192,5481],[7,-4],[10,14],[12,-17],[24,-25],[6,-11],[25,-16],[6,10],[5,49],[6,8],[21,11],[13,15],[24,-24],[18,5],[21,-32],[3,-17],[7,4],[-7,-22],[4,-12],[20,-3],[38,-14],[17,2],[11,-8],[6,-20]],[[5489,5374],[-2,-29],[4,-7],[-3,-26],[-9,-10],[9,-28],[16,-11],[13,-17],[13,-26],[1,-18],[19,22],[15,10],[11,-6],[17,15],[0,-15],[8,11],[-1,-38],[12,-10],[1,-15],[9,4],[5,-16],[-14,-6],[2,-28],[-16,-3],[-1,-12],[-13,1],[8,-19],[-8,6],[-7,-43],[1,-33],[12,-16],[-16,-9],[5,-7],[-1,-21],[14,4],[-6,-12],[17,-26],[-9,-6],[-7,-16],[5,-7],[-11,-11],[10,-4],[28,8],[22,-11],[-5,-32],[-18,-6],[-21,6],[4,-31],[10,6],[-8,-15],[5,-12],[-10,2],[8,-16],[-3,-11],[6,-13],[17,-18],[14,-2],[8,9],[13,-13],[-4,-19],[7,-13],[21,-1],[6,-10],[-8,-7],[5,-9],[6,11],[3,-16],[16,-19],[-4,-7],[6,-16],[8,-3],[-6,-25],[8,-8],[19,6],[10,32],[13,-9],[9,14],[21,-14],[1,-18],[20,-15],[24,16],[15,-15],[-1,-12],[22,-6],[-3,-22],[13,-6],[22,-30],[8,-33],[46,10],[9,-7],[26,-34],[29,-11],[1,-15],[12,-14],[0,-19],[-11,-13],[-4,-24],[34,-5],[26,-18],[-8,-29],[1,-12],[45,-1],[-1,-13],[26,-27],[10,-16],[5,-25],[-2,-49],[9,-24],[-8,-25],[-2,-38]],[[7707,4014],[-12,20],[-17,10],[8,15],[7,-1],[2,14],[-18,16],[-2,22],[8,36],[-8,20],[-17,11],[-2,17],[10,20],[20,3],[3,10],[-18,15],[-3,31],[-20,9],[18,15],[-6,19],[-19,-1],[10,24],[-13,8],[-22,-5],[1,14],[-16,25],[8,12],[-12,11],[-1,30],[-15,-8],[-10,-15],[-11,22],[-11,8],[-11,34],[-17,27],[-9,32],[-6,7],[-7,27],[4,21],[-7,39],[-7,16],[0,20],[-16,17],[0,30],[-9,9],[3,37],[-15,22],[2,9],[-11,27],[-20,-1],[-23,18],[-14,21],[32,6],[17,-8],[-6,11],[-3,30],[-10,14],[-13,5],[-7,45],[2,36],[-9,1],[-2,27],[-8,41],[-7,6],[-10,28],[5,36],[-3,24],[7,18],[14,11],[9,19],[10,-1],[23,20],[-8,22],[11,14],[-7,17],[14,7],[2,12],[57,4],[17,-2],[31,16],[28,6],[3,16],[-4,12],[0,41],[-7,20],[10,18],[46,-55],[11,22],[-1,19]],[[7630,5411],[29,-3],[21,-46],[9,-31],[-12,-10],[-6,-19],[14,-34],[-18,-24],[9,-15],[16,-54],[38,-42],[12,5],[20,28],[3,30],[-9,13],[5,34],[25,14],[-20,41],[-3,21],[-14,29],[2,13],[-6,22],[12,7],[-18,22],[0,18],[6,17],[20,-5],[7,-20],[13,-8],[5,12],[16,-22],[2,5],[20,-13],[10,6],[9,16],[10,-10],[5,12],[13,-18],[31,-1],[15,7],[9,-16],[-1,-18],[19,-16],[6,-38],[11,17],[19,14],[-9,20],[13,12],[13,-2],[-1,17],[14,3],[9,23],[-8,37],[20,4],[10,14],[-1,-46],[7,-3],[34,24],[7,-11],[9,6],[16,-34],[25,13],[10,-45],[-1,-18],[7,-10],[22,16],[10,0],[5,-17],[8,-7],[18,5],[21,15],[21,9],[34,-2],[1,-23],[12,-1]],[[8310,5350],[-14,-4],[-5,-27],[6,-6],[-3,-22],[-16,4],[-4,-23],[12,-11],[-12,-9],[3,-13],[12,1],[-13,-38],[-3,-35],[8,-11],[-11,-15],[8,-10],[7,-27],[7,-5],[-8,-22],[9,-2],[-5,-11],[3,-16],[11,-25],[3,-24],[-4,-14],[8,-10],[3,-20],[-9,-25],[4,-14],[-8,-8],[6,-26],[-6,-6],[19,-4],[-3,-41],[-23,-10],[8,-20],[-8,-14],[6,-21],[1,-26],[-5,-10],[11,-4],[4,-39],[-9,-1],[22,-38],[19,10],[-3,-42],[-6,-8],[8,-12],[0,-22],[16,-19],[-6,-23],[6,-1],[-3,-17],[6,-18],[-10,-10],[2,-21],[9,-30],[-8,-45],[9,-23],[1,-15],[-15,-10],[-16,-33],[-3,8],[-18,-8],[-10,11],[-26,-37],[5,-26],[29,-41],[-4,-7],[19,-8],[4,12],[6,-24],[10,19],[1,-21],[-7,-6],[11,-5],[-4,-11],[11,-21],[-3,-24],[3,-30],[-4,-19],[2,-25],[9,2],[6,-32],[13,-27],[23,-13]],[[6480,4697],[-6,9],[-13,37],[4,27],[-7,15],[2,32],[13,24],[0,30],[-8,15],[-2,39],[8,23],[11,6],[-2,26],[-6,19],[6,13],[-3,17],[8,21],[20,18],[22,31],[-3,30],[13,32],[-5,13],[-3,38]],[[6529,5212],[19,-14],[25,16],[22,-5],[15,-26],[21,-2],[8,-9],[13,5],[23,0],[-1,10],[15,28],[18,6],[28,28],[6,28],[16,17],[17,-5],[13,6],[0,9],[23,20],[14,-10],[16,14],[7,-16],[24,-2],[10,5],[-2,-12],[9,-8],[22,-7],[21,-14],[27,2],[28,30],[24,-8],[17,-19],[21,-17],[6,2],[4,27],[14,16],[0,21],[-7,13],[15,9],[6,13],[10,-1],[11,13],[17,-15],[14,-19],[18,-3],[33,-13],[14,-15],[12,17],[-6,40],[7,7],[21,-12],[25,-20],[10,23],[7,6],[-12,7],[8,29],[-23,6],[5,9],[-6,18],[7,4],[44,45],[0,19],[7,8],[8,-19],[16,0],[-1,16],[10,19],[6,1],[21,-22],[10,-2],[15,11],[13,-1],[-8,31],[1,19],[7,-9],[19,0],[7,-10],[22,13],[6,-27],[7,-8],[-8,-18],[4,-14],[13,2],[16,-8],[-3,-25],[6,-7],[26,10],[-2,38],[3,24],[13,0],[-1,10],[31,1],[-2,-6],[32,-16],[10,-50],[15,-9],[-1,-12],[14,-3]],[[7634,5445],[1,-17],[-5,-17]],[[2270,4948],[0,-22],[5,-5],[-28,-17],[-13,-24],[11,-8],[4,-15],[29,-45],[21,1],[12,-17],[17,-2],[-5,-17],[9,-9],[8,8],[2,-65],[-9,-9],[11,-22],[1,-14],[23,-3],[22,24],[21,-28],[3,-13],[-8,-33],[-8,-5],[-26,-35],[-13,-4],[-7,-12],[-15,-9],[-8,-16],[-1,-30],[4,-10],[0,-29],[-20,-25],[-14,-5],[-11,-20]],[[1291,3381],[-5,6],[-45,22],[-5,19],[-22,19],[-9,17],[-8,-23],[-27,16],[-10,-9],[-17,22],[-55,23],[-17,-28],[-26,28],[-29,22],[-5,-5],[-17,32],[6,22],[-18,24],[-2,21],[-9,25],[2,28],[-8,9],[-10,-12],[-5,12],[-13,-20],[5,-8],[-10,-16],[-17,0],[-34,-19],[-16,47],[-11,-8],[-10,4],[3,35],[-50,-17],[-8,37],[-11,1],[-17,33],[-23,21],[-10,17],[-3,23],[-18,3],[5,12],[-5,21],[-8,11],[-3,21],[-21,-1],[-23,16],[-15,16],[11,16],[-3,14],[9,2],[-3,18],[-6,-1],[-7,22],[-35,33],[-65,0],[0,17],[6,6],[-9,20],[40,33],[23,40],[5,4],[-14,31],[3,4],[-12,30],[3,5],[-20,42],[-25,-11],[-6,65],[14,21],[10,48],[17,27],[-5,31],[3,22],[-7,11],[5,20],[1,89],[6,23],[9,2],[7,55],[-42,24],[-10,-68],[-44,3],[-21,-10],[-13,-1],[-3,21],[-17,80],[-20,-8],[-5,31],[-8,8],[11,37],[-51,75],[-14,-5],[-5,22],[-14,-5],[-7,31],[4,2],[-9,55],[-24,-9],[3,-13],[-36,-17],[-15,39],[-19,92],[-38,37],[-44,-11],[-57,70],[6,21],[-18,62],[6,25],[-39,53],[-7,30],[-31,25],[-9,23],[20,20],[-17,-3],[-3,21],[34,56],[13,10],[4,-15],[45,42],[14,-36],[9,12],[18,-12],[4,11],[30,-27],[19,-7],[15,2],[15,20],[22,36],[3,18],[-5,7],[10,20],[22,-18],[28,-10],[48,-58],[14,-7],[27,-43],[9,1],[7,12],[5,32],[14,7],[22,-12],[17,32]],[[465,5469],[14,1],[2,-23],[14,-12],[35,4],[13,-12],[1,-24],[5,-11],[16,-6],[6,-30],[31,-37],[29,-3],[5,-12],[23,2],[28,-26],[6,4],[3,-26],[7,-22],[15,-31],[37,1],[5,10],[34,-27],[2,14],[9,-17],[26,24],[21,-2],[1,-29],[4,1],[0,-30],[9,0],[1,-27],[28,-47],[11,10],[15,27],[7,-4],[5,13],[-8,9],[12,32],[15,-12],[-2,-19],[20,-27],[23,-22],[36,-20],[13,-2],[8,15],[6,43],[18,15],[15,5],[11,-5],[13,4],[17,-11],[9,-34],[8,-19],[15,0],[3,38],[15,23],[33,5],[17,14],[16,42],[9,10],[5,18],[13,20],[19,5],[13,20],[19,-1],[15,-50],[4,-38],[-9,-15],[-4,-18],[28,-11],[5,-22],[8,13],[33,-15],[0,-9],[28,-17],[-2,-10],[9,-11],[10,3],[4,-10],[-9,-16],[8,-8],[-4,-24],[17,-1],[18,-35],[-3,-33],[5,-18],[26,21],[-2,34],[25,49],[-1,13],[12,16],[5,-28],[9,-18],[15,6],[24,-11],[-6,-15],[5,-11],[31,-1],[5,7],[0,29],[22,22],[10,-7],[6,-16],[7,-2],[21,32],[16,-24],[9,0],[26,31],[8,41],[13,6],[18,-4],[16,25],[20,-16],[14,13],[5,-24],[-6,-12],[4,-18],[30,-10],[5,4],[8,-14],[22,-3],[16,-12],[3,-12],[19,-15],[14,-2],[12,-12],[-1,-17],[5,-23],[13,20],[12,-10],[7,11],[12,3],[9,-11],[22,-3],[8,-18],[30,50],[-8,22],[12,11],[7,-9],[21,-5],[10,-15],[24,-11],[13,31],[6,50],[27,3],[4,-17],[-2,-38],[15,-5],[6,-14],[28,-28],[19,-14]],[[3562,3974],[17,1],[17,17],[0,21],[-10,15],[-5,40],[2,24],[-15,32],[-1,17],[-27,43],[5,7],[3,27],[12,22],[14,-3],[10,29],[-17,25],[-4,32],[13,8],[-1,18],[-18,36],[-14,16],[-19,14],[-5,11],[8,18],[12,13],[-18,15],[16,55],[10,25],[12,-5],[11,10],[2,14],[20,37],[5,-8],[4,29],[-15,4],[-7,18],[-9,0],[-10,16],[10,14],[3,22],[10,13],[21,8],[7,12],[23,17],[21,-9],[5,-8],[14,31],[-5,25],[6,18],[0,37],[12,25],[-3,15],[-17,14],[9,26],[-9,23],[28,-2],[34,21],[16,0],[11,-9],[12,31],[9,9],[3,21],[29,19],[-7,45],[12,14],[-8,16],[7,12],[-9,3],[-10,19],[22,42],[11,7],[11,19],[21,-10],[5,12],[26,-8],[25,4],[-2,-18],[14,-7],[18,-29],[-1,-12],[7,-22],[8,7],[-4,19],[23,23],[-3,15],[-12,15],[18,5],[11,-4],[5,11],[-6,22],[15,37],[13,13],[-4,24],[12,11],[2,11],[18,5],[6,33],[14,29],[21,19],[24,-7],[23,17],[17,20],[21,7],[7,10],[-1,15],[-8,17],[-14,4],[-7,11],[3,33],[15,23],[-9,23],[17,19],[45,33]],[[4221,5647],[2,16],[18,11],[33,0],[7,-7],[29,-1],[15,4],[26,-22],[14,20],[10,2],[10,15],[20,7],[6,-8],[25,4],[35,-8],[7,-20],[12,12],[14,-9],[13,3],[3,19],[24,-7],[6,12],[11,-15],[12,-1],[7,-13],[27,8],[4,16],[9,4],[0,14],[8,17],[29,7],[-1,-17],[5,-19],[-2,-16],[6,-18],[-13,-20],[8,-21],[7,-3],[10,-25],[-7,-7],[-1,-22],[5,-12],[-2,-30],[-7,-25],[6,-31],[-1,-24],[-6,-12],[4,-27],[-6,-12],[4,-9],[-4,-34],[26,-43],[20,-11],[6,16],[27,13],[6,-12],[15,4],[10,19],[-3,12],[27,-10],[4,-7],[17,4],[5,11],[18,15],[27,8],[29,-5],[7,-10],[-1,-23],[24,-28],[23,-2]],[[5489,5374],[32,17],[4,22],[18,50],[-4,25],[8,19],[-3,10],[10,11],[25,11],[-2,20],[13,12],[20,4],[6,7],[19,51],[11,12],[21,0],[52,42],[18,49],[15,-7],[11,5],[17,-30],[13,-15],[-16,-26],[19,-22],[5,-27],[15,-9],[-4,-10],[10,-11],[22,-45],[7,-22],[-8,-10],[10,-10],[6,-20],[10,-9],[12,-27],[10,-6],[3,-27],[6,-19],[21,-8],[12,10],[12,-9],[28,14],[3,8],[13,1],[14,-7],[42,15],[8,-18],[15,8],[15,-2],[13,21],[2,38],[6,16],[17,-9],[17,1],[22,-7],[-3,7],[10,11],[21,-7],[9,19],[12,2],[24,-20],[14,-7],[5,22],[-1,30],[11,5],[14,-12],[12,6],[7,42],[11,10],[20,1],[15,19],[-3,32],[-7,11],[12,6],[0,19]],[[6343,5657],[33,-9],[12,-9],[19,-4],[7,-31],[9,-19],[3,-30],[-9,-12],[-2,-28],[17,-42],[1,-24],[-10,-54],[9,-25],[9,-2],[12,-20],[15,-16],[10,-4],[18,11],[17,-5],[13,-37],[-7,-7],[-4,-22],[17,-35],[-3,-21]],[[2270,4948],[9,33],[15,27],[-7,17],[-23,6],[-8,-9],[-30,9],[-11,26],[-21,23],[0,30],[7,9],[42,-5],[6,29],[6,2],[11,-14],[16,23],[16,-3],[3,36],[-13,12],[1,20],[8,10],[-7,33],[2,23],[-7,10],[5,21],[-13,17],[-7,1],[4,18],[20,1],[13,22],[3,16],[10,13],[5,32],[27,4],[8,14],[-6,17],[-12,13],[-18,8],[-11,24],[-2,19],[-12,36],[9,19],[11,7],[14,28],[18,7],[3,12],[24,-49],[9,-3],[8,12],[19,-6],[13,7],[1,15],[17,4],[8,-9],[21,-4],[17,7],[16,-8],[24,12],[4,11],[2,36],[-5,29],[17,40],[-3,6],[10,19],[2,26],[-6,26],[20,5],[7,8],[23,12],[5,14],[15,15],[4,15]],[[2626,5884],[30,-6],[14,-24],[14,-4],[10,-24],[42,8],[13,-12],[18,13],[46,3],[13,-19],[-1,-10],[7,-35],[23,-37],[0,-10],[-16,-33],[8,-29],[11,-9],[5,-25],[9,-12],[3,-26],[9,1],[10,-14],[11,5],[23,-11],[20,5],[8,-6],[15,-25],[-1,-18],[8,4],[12,-11],[4,-13],[-5,-12],[10,-66],[-6,-6],[-18,17],[-19,-12],[15,-20],[-4,-13],[6,-33],[7,-7],[8,-25],[-3,-19],[-9,-12],[9,-7],[0,-39],[16,-18],[0,-17],[8,3],[10,-10],[28,6],[15,-13],[0,-12],[17,-4],[-1,-11],[13,-1],[17,23],[20,-6],[-10,-35],[4,-15],[18,-22],[-1,-29],[17,-22],[4,-36],[18,-64],[16,-7],[7,-14],[12,3],[33,-76],[-1,-37],[-5,-6],[-3,-30],[3,-15],[-4,-36],[18,-18],[1,-42],[11,-16],[-5,-11],[8,-24],[23,-11],[4,-35],[-7,-14],[-5,-47],[-8,-24],[10,-29],[21,-15],[19,-20],[13,-28],[-16,-16],[-9,-23],[-1,-14],[-13,-16],[10,-12],[0,-11],[16,0],[20,-15],[-7,-21],[4,-12],[-7,-20],[6,-22],[20,-6],[10,-13],[25,1],[8,-12],[9,7],[12,-5],[0,-24],[11,-33],[21,3],[17,-26],[11,-24],[14,-7],[4,-38],[11,-8],[10,-24],[-5,-11],[6,-13],[-1,-29]],[[3926,6067],[0,-9],[18,4],[6,-5],[16,17],[10,20],[-5,9],[8,11],[15,-6],[0,-28],[-7,-9],[2,-20],[-14,-14],[-3,-35],[5,-10],[-27,-38],[1,-11],[12,-7],[-3,-13],[8,-6],[7,-19],[19,-17],[11,-16],[11,-2],[13,-16],[11,-3],[18,6],[13,-8],[17,6],[7,-8],[2,-19],[11,-22],[-4,-19],[3,-20],[14,-9],[4,-14],[19,-11],[4,7],[18,-26],[-4,-18],[20,4],[9,-7],[15,-27],[15,-12]],[[2626,5884],[-23,23],[-14,-1],[-13,12],[0,16],[-17,18]],[[2559,5952],[-7,21],[0,23],[-7,16],[-3,37],[4,14],[16,11],[7,18],[-14,41],[0,16],[-7,15],[6,21],[-3,22],[2,31],[-3,8],[16,24],[10,-4],[16,27],[5,-13],[7,20],[-5,8],[-18,0],[-9,11],[-1,29],[24,25],[15,24],[15,0],[5,-18],[25,-16],[18,9],[5,-21],[14,-18]],[[2692,6333],[1,-11],[19,-27],[29,0],[10,-14],[34,-2],[19,16],[15,19],[26,0],[9,-12],[19,0],[6,9],[14,2],[25,-24],[8,-22],[3,-38],[6,-33],[18,-11],[-9,-40],[6,-9],[24,-4],[25,6],[-1,17],[6,25],[18,-4],[14,8],[8,16],[18,14],[15,0],[14,7],[4,-34],[30,-8],[8,-6],[15,2],[7,17],[3,-8],[19,6],[5,17],[19,21],[16,1],[8,16],[19,3],[11,20],[20,26],[14,8],[22,-8],[8,-12],[23,-6],[27,-37],[8,-2],[4,-19],[13,-10],[14,-27],[20,8],[16,-19],[12,-8],[18,2],[15,19],[13,9],[17,-4],[4,-13],[16,-12],[6,-24],[-8,-25],[-16,-12],[-8,-26],[2,-25],[-7,-28],[12,-18],[20,5],[25,-23],[15,1],[10,-6],[19,18],[-1,19],[-11,-8],[-11,12],[-3,24],[25,-7],[-9,27],[11,24],[26,17],[24,-11],[16,5],[6,9],[14,-1],[9,8],[10,-7],[15,2],[10,10],[14,4],[15,-8],[5,-30],[28,-12],[25,12],[16,-5],[10,7],[45,1],[16,13],[12,-38]],[[465,5469],[11,12],[10,47],[11,10],[-8,9],[2,24],[37,-6],[-14,99],[28,54],[15,-6],[88,31],[18,-34],[35,-21],[2,32],[23,6],[6,-31],[9,-6],[31,-6],[22,5],[14,10],[13,-40],[31,-11],[5,23],[9,-4],[3,10],[23,18],[12,79],[32,7],[2,-12],[24,-3],[11,13],[-8,31],[5,11],[-1,26],[14,7],[11,19],[-3,50],[9,70],[11,-4],[3,20],[7,6],[53,-15],[8,-8],[14,8],[-7,14],[9,28],[14,29],[7,24],[-23,54],[-23,1],[-15,55],[17,71],[-3,12],[17,8],[4,17],[12,18],[-2,8],[19,41],[-15,6],[-6,10],[14,58],[16,29],[24,-2],[14,17],[14,-11],[2,-9],[31,-15],[7,44],[5,9],[22,11]],[[1247,6526],[20,3],[27,-3],[7,8],[16,-1],[5,-21],[-3,-16],[30,-21],[14,17],[10,-17],[1,21],[11,26],[42,-13],[19,11],[15,32],[48,2],[7,-11],[15,-1],[5,-8],[37,17],[9,-1],[25,-19],[27,4],[19,13],[14,15],[13,0],[12,8],[6,16],[26,-14],[13,-14],[4,-19],[-17,-27],[-13,-30],[31,-2],[3,-12],[33,-8],[9,-9],[14,9],[23,2],[13,7],[7,21],[11,14],[4,25],[5,0],[0,-22],[25,-16],[5,5],[1,-26],[35,-5],[7,-20],[16,2],[4,-25],[18,-3],[27,6],[10,-2],[8,-12],[-1,-22],[-8,-21],[-1,-17],[10,-24],[6,-29],[-3,-23],[5,-15],[17,-26],[15,-33],[7,-28],[9,13],[26,-21],[26,7],[9,-9],[10,-25],[12,9],[8,18],[8,-5],[16,3],[20,-4],[16,-12],[4,-31],[1,-49],[22,-38],[13,-17],[7,-21],[14,-16],[47,5],[12,-21],[15,-11],[6,5],[2,28],[5,16],[17,-2],[30,-21],[30,5],[17,-4],[23,-12],[30,1],[10,-15],[27,2]],[[6343,5657],[3,20],[-13,22],[1,20],[10,8],[11,37],[6,6],[5,45],[10,30],[-22,21],[-31,-6],[-10,-17],[-2,-17],[-11,-25],[-22,-8],[-46,9],[-9,31],[7,25],[8,14],[0,27],[6,27],[13,18],[-9,11],[0,14],[13,21],[-25,6],[-11,-5],[-19,18],[-16,9],[-19,-2],[-9,-10],[-21,-4],[-16,13],[-57,25],[-16,31],[19,14],[5,27],[13,5],[-12,12],[6,21],[-11,11],[15,22],[21,-2],[32,9],[4,35],[-9,24],[-20,21],[-12,25],[1,21],[-5,14],[0,26],[-19,38],[-17,25],[-7,29],[4,34],[14,14],[1,18],[-6,12],[3,14],[-17,39],[-10,10],[-4,17]],[[6041,6606],[7,13],[17,16],[7,-13],[15,3],[29,-3],[17,13],[10,-16],[-1,-29],[8,-16],[-1,-35],[23,-23],[19,21],[26,4],[8,-28],[9,-8],[8,11],[26,14],[13,-3],[12,9],[-2,14],[6,41],[13,6],[12,27],[10,1],[12,12],[-1,-15],[22,-33],[9,-33],[1,-21],[9,-27],[17,11],[18,0],[16,-7],[-1,16],[34,-12],[11,5],[10,23],[19,26],[48,-1],[-2,14],[22,3],[9,18],[17,14],[19,0],[12,-13],[11,-27],[14,-15],[7,6],[3,18],[17,17],[16,35],[16,10],[2,8],[23,10],[12,17],[15,10],[11,19],[-1,42],[-5,16],[18,9],[49,-11],[3,37],[5,1],[13,-26],[6,-23],[9,-17],[14,-51],[11,3],[10,14],[9,0],[11,20],[-8,22],[12,8],[-6,13],[10,7],[-6,11],[12,13],[10,-7],[8,11],[-1,51],[14,2],[9,16],[0,36],[41,-5],[-5,-13],[10,-1],[1,-22],[-8,-8],[1,-16],[-16,2],[2,-10],[19,-5],[-6,-12],[6,-11],[10,0],[2,-17],[4,17],[8,4],[12,-31],[-2,-30],[19,-4],[19,18],[22,6],[5,7],[36,3],[4,6],[8,-29],[9,0],[12,13],[32,6],[15,-42],[13,-3],[18,11],[-4,-25],[11,-10],[13,14],[-1,12],[22,3],[2,21],[10,5]],[[7330,6764],[5,-16],[19,-20],[12,-7],[13,-22],[55,-40],[18,-28],[1,-31],[-7,-14],[-12,-7],[20,-29],[2,-21],[-7,-14],[-18,-17],[-16,-28],[12,-16],[7,-18],[17,-23],[6,-23],[12,-5],[4,-25],[10,-34],[4,-1],[17,-49],[8,-8],[2,-20],[15,-32],[-2,-20],[23,-78],[10,-21],[10,-62],[10,-22],[11,-8],[7,-18],[2,-56],[9,-32],[4,-26],[7,-13],[6,-26],[-19,-25],[1,-20],[6,-9],[-5,-24],[4,-28],[8,-22],[-3,-13],[18,-145],[18,-1],[3,-17],[-4,-27],[-19,-58]],[[7330,6764],[4,10],[14,9],[-5,65],[3,24],[13,0],[-13,52],[2,33],[-4,14],[-25,37],[11,20]],[[7330,7028],[25,-29],[26,8],[8,8],[7,-10],[27,-1],[13,4],[5,-21],[8,-9],[22,17],[-1,22],[34,16],[2,-3],[27,12],[16,-18],[5,-18],[29,10],[6,-17],[26,11],[12,-31],[15,-2],[1,13],[-6,26],[11,1],[22,-8],[16,13],[-11,20],[1,30],[-4,19],[5,10],[10,-12],[20,-50],[7,-29],[14,16],[17,7],[4,8],[25,6],[28,23],[-15,41],[-14,8],[3,28],[-7,10],[-6,28],[10,20],[2,21],[11,21],[11,-20],[18,-2],[35,-58],[16,-19],[16,-47],[9,4],[15,-38],[7,-26],[16,-7],[6,9],[-2,19],[-7,13],[1,48],[7,11],[43,-11],[7,-14],[-5,-6],[1,-44],[4,-7],[-5,-22],[12,-12],[-3,-24],[13,-1],[2,-9],[11,1],[20,-14],[2,-10],[29,-20],[14,-22],[18,-10],[8,-20],[16,4],[-15,33],[6,13],[-19,26],[22,11],[3,-12],[19,5],[22,0],[11,-40],[13,9],[12,-11],[14,-1],[14,12],[28,6],[13,-10],[6,12],[16,-4],[16,5]],[[8302,6947],[-1,-54],[12,1],[-1,-19],[11,-25],[19,-6],[-5,-10],[13,-22],[17,-14],[-17,0],[7,-13],[13,-9],[2,-27],[-9,-6],[12,-39],[8,4],[3,-14],[-8,-12],[15,-4],[0,-12],[10,-20],[-8,-13],[12,-15],[-7,-15],[7,-9],[7,13],[3,-28],[8,-4],[-2,17],[7,-7],[4,-22],[-6,-3],[3,-36],[9,-11],[-5,-38],[7,0],[4,-36],[-7,-5],[6,-10],[-8,-5],[-2,-20],[-10,-16],[7,-11],[-16,1],[10,-36],[3,-27],[-9,5],[-12,-37],[16,-19],[-5,-15],[-13,4],[10,-23],[-7,2],[-7,-17],[14,-21],[6,1],[3,-23],[-8,-10],[12,-9],[5,8],[4,-18],[9,-8],[-8,-6],[12,-4],[0,-9],[-17,-12],[3,-13],[14,1],[5,-18],[-6,-12],[4,-12],[-9,-26],[-19,1],[3,-33],[8,-13],[-7,-11],[-13,4],[-15,-30],[-13,-17],[7,-28],[-14,-4],[6,-11],[-15,6],[13,-22],[3,-17],[-10,6],[-4,-9],[10,-21],[16,-8],[-12,-31],[-21,-14],[10,-12],[-15,-7],[4,12],[-8,1],[1,-27],[-14,6],[-8,12],[2,-29],[-8,4],[4,12],[-11,-8],[-2,-40],[-9,-5],[4,-11],[10,3],[7,-11],[-12,-3],[-19,-26],[-7,12],[2,-28],[-6,-22],[8,-20],[-5,-11],[8,-5],[-1,14],[10,-6],[-9,-27],[3,-9],[14,9],[9,-10],[-4,-32],[-11,2],[16,-28],[-11,-21],[-7,1],[-2,-16],[6,-10],[-5,-9],[0,-57],[-10,-8],[8,-7]],[[3926,6067],[7,7],[-4,11],[2,27],[-7,12],[-9,-4],[-3,28],[6,7],[-5,13],[6,8],[-5,23],[3,16],[-9,18],[11,15],[6,28],[12,10],[12,-1],[18,-14],[14,1],[9,19],[-8,29],[13,4],[2,32],[14,19],[13,55],[-22,6],[-23,12],[-7,24],[8,7],[6,33],[27,14],[4,11],[43,6],[3,27],[18,55],[-8,21],[-23,17],[-13,0],[-11,34],[-9,13],[13,17],[26,10],[8,19],[19,2],[8,11],[1,22],[23,15],[14,0],[3,10],[11,3],[7,14],[-6,18]],[[4144,6851],[15,-6],[24,-26],[18,-10],[6,-18],[20,-6],[5,-9],[5,12],[10,-6],[-3,-24],[25,-13],[6,10],[16,-9],[19,9],[8,-5],[8,12],[2,-12],[15,-10],[14,18],[19,1],[2,19],[19,7],[3,11],[10,0],[10,-20],[9,-3],[18,35],[-1,14],[-8,8],[2,28],[15,25],[-6,18],[3,10],[15,10],[4,11],[14,-1],[-1,29],[14,-5],[11,10],[8,42],[-10,16],[-2,36],[10,1],[0,17],[17,-6],[12,4],[-8,15],[16,-1],[17,7],[-4,22],[18,40],[23,-4],[1,23],[7,-2],[18,-33],[0,-13],[9,-13],[-3,-18],[12,-10],[-3,-6],[25,-5],[14,2],[5,-13],[21,3],[8,8],[-3,11],[6,14],[10,1],[-5,15],[-15,13],[12,22],[9,57],[-2,23],[16,33],[15,6],[5,24],[11,18],[-3,20],[11,41],[29,41],[3,15],[12,11],[21,37],[26,25],[20,6],[23,-8],[7,-7],[12,5],[18,32],[27,-5],[9,5],[11,-17],[26,5],[12,15],[0,9],[12,17],[25,8]],[[5080,7569],[15,-12],[14,-21],[23,1],[8,5],[21,-14],[4,13],[9,3],[6,17],[14,6],[27,-20],[7,-25],[11,-7],[6,-16],[15,-19],[0,-9]],[[5260,7471],[-5,-38],[0,-22],[6,-19],[35,-45],[-3,-37],[7,-38],[-6,-10],[2,-58],[10,-8],[-4,-34],[5,-15],[1,-23],[-10,-18],[-2,-14],[6,-16],[-1,-26],[-5,0],[-2,-32],[-4,-5],[-10,-54],[-2,-21],[17,-14],[11,-2],[5,-15],[-6,-5],[-1,-29],[6,-33],[26,-22],[-8,-5],[4,-10],[-11,-18],[4,-35],[-2,-34],[-16,-73],[12,-36],[-7,-27],[-23,-20],[-8,-12],[-25,-20],[-11,-28],[-30,-37],[-17,-43],[-18,-25],[-2,-20],[-7,-15],[-16,-9],[-32,1],[-18,9],[-14,-12],[-8,-27],[-20,-9],[-28,-25],[-9,-24],[-4,-32],[-31,-41],[8,-1],[7,-21],[9,20],[17,-4],[9,-15],[-16,-22],[-13,-48],[-8,-1],[-7,-16],[-41,-24],[-13,-29],[8,-8],[8,-29],[12,-7],[14,-31],[7,-8],[-5,-13],[-14,1],[-33,-21],[-21,31],[-12,1],[-11,-13],[-28,8],[-10,8],[-10,-3],[-8,-20],[3,-17],[11,-15],[-1,-20],[8,-28],[24,-2],[-18,-46],[-11,-8],[0,-13],[19,-38],[11,11],[11,0],[12,-19],[26,-26],[2,-39],[20,-8],[18,-2],[14,8],[18,-17],[15,11],[26,-18],[16,12],[19,-1],[8,-7],[-3,-16],[30,-3],[10,-52],[17,-45],[11,-13],[20,-13],[16,-21]],[[5260,7471],[11,5],[12,20],[13,-1],[25,25],[3,15],[16,1],[43,-37],[11,2],[31,-26],[10,13],[-3,16],[12,15],[7,34],[18,1],[10,10],[21,4],[21,-5],[15,-27],[18,-4],[15,-21],[3,-20],[-1,-27],[9,-11],[28,5],[38,-16],[13,15],[9,23],[17,-2],[19,-11]],[[5704,7467],[19,2],[31,-22],[7,3],[28,-24],[5,-33],[32,-50],[2,-18],[-7,-9],[13,-22],[11,-32],[1,-27],[12,-34],[14,19],[30,6],[5,-8],[-1,-23],[11,-2],[7,-24],[-12,-3],[-10,9],[-1,-34],[-20,-30],[-25,8],[0,-23],[-24,-37],[-8,-23],[-11,-10],[20,-34],[-6,-38],[-12,-7],[0,-13],[11,-14],[18,-4],[20,-21],[9,4],[21,-14],[-5,-24],[-13,-11],[-12,-2],[-4,-11],[11,-31],[2,-22],[-5,-16],[4,-28],[-17,-26],[4,-17],[-16,-11],[-3,-9],[13,-19],[-4,-15],[8,-2],[33,-46],[-1,-8],[23,-32],[13,-32],[4,3],[31,-5],[9,13],[-6,30],[-18,30],[-2,13],[7,19],[9,-9],[8,13],[23,3],[24,-11],[25,0],[2,-16]],[[5704,7467],[6,12],[1,22],[5,3],[-5,27],[10,10],[0,13],[25,31],[-7,32],[9,25],[15,4],[6,19],[-3,42],[15,10],[-2,14],[8,16],[10,6],[20,-5],[30,5],[10,-5],[16,29],[4,21],[8,14],[-4,17],[-18,19],[-8,32],[-13,16],[-5,25],[-8,20],[-13,20],[7,5],[41,-10],[13,-11],[16,2],[21,-35],[16,-11],[11,-15],[5,-27],[15,-19],[23,-7],[8,22],[2,18],[14,7],[24,4],[9,13],[32,-13],[11,13],[12,1],[12,-22],[13,-11],[24,12],[23,19],[8,0],[21,23],[13,-21],[24,17],[24,-13],[7,29],[16,-9],[13,-16],[12,-4],[15,-19],[11,-3],[8,14],[3,18],[10,10],[4,-6],[22,-4],[23,12],[11,25],[66,43],[13,15],[11,-14],[26,-13],[5,-22],[14,-20],[1,-9],[26,-17],[-2,-14],[31,-41],[7,-21],[7,-1]],[[6618,7835],[7,-14],[12,-1],[8,-18],[17,-22],[-1,-13],[10,-6],[0,-11],[25,-22],[3,-14],[11,-12],[8,-21],[4,-30],[-3,-46],[10,-21],[-5,-5],[8,-15],[2,-29],[-6,-12],[0,-19],[10,-29],[10,6],[39,39],[26,-45],[21,25],[18,6],[9,-4],[15,-28],[42,-54],[11,-31],[3,-23],[14,-9],[4,12],[19,-3],[7,-23],[23,-8],[17,8],[40,28],[11,-6],[15,10],[1,40],[7,1],[1,25],[15,3],[6,-19],[12,-66],[13,-9],[9,16],[15,-2],[0,28],[11,17],[10,48],[23,10],[10,-2],[11,8],[21,-6],[16,-20],[11,-1],[21,12],[7,-8],[0,-28],[15,-17],[0,-32],[-8,-13],[11,-19],[21,-6],[14,-23],[22,-15],[-3,-26],[-22,-17],[-15,-2],[-21,27],[-3,-22],[-13,-25],[-20,-15],[2,-23],[-21,2],[-14,-15],[1,-16],[28,-17],[37,-48],[8,-40],[6,-10],[3,-22]],[[2692,6333],[9,47],[-10,10],[2,43],[-9,25],[5,23],[-22,-11],[-3,33],[-11,7],[-28,31],[-8,-7],[-20,15],[-11,-3],[-18,-31],[-25,-12],[-8,19],[-4,23],[-13,16],[28,0],[10,20],[8,2],[19,-16],[12,-1],[17,21],[11,4],[7,16],[-7,43],[-11,29],[-24,26],[-3,11],[10,32],[-5,17],[-22,10],[-7,-5],[-15,5],[-10,10],[-6,17],[5,28],[7,19],[26,8],[13,0],[9,18],[13,3],[10,41],[13,33],[8,56],[7,5],[16,31],[-1,35],[-28,7],[-17,15],[-17,30],[-17,12],[-13,0],[-18,26],[6,9],[-1,34],[15,14],[15,29],[10,9],[15,28]],[[2606,7292],[22,6],[11,-6],[17,2],[-2,-12],[24,5],[3,6],[15,-4],[19,9],[12,-11],[10,11],[13,-16],[8,7],[4,-25],[6,-12],[26,3],[15,-16],[-8,-21],[-12,2],[-3,-33],[4,-41],[8,-8],[8,5],[20,-17],[2,-37],[16,-3],[3,-13],[12,-10],[13,7],[9,-5],[17,8],[14,-10],[-8,-17],[6,-9],[15,25],[8,-10],[-6,-15],[4,-15],[9,0],[5,19],[18,20],[16,-5],[13,-17],[-10,-32],[1,-15],[-11,-13],[24,-9],[5,-11],[26,12],[18,4],[11,22],[20,9],[25,-10],[17,44],[9,8],[-11,16],[-3,51],[9,12],[5,21],[-12,21],[22,13],[-5,18],[11,-14],[-2,-26],[14,-5],[13,-20],[-6,-16],[2,-22],[9,-14],[22,4],[3,-16],[18,-5],[22,24],[12,-11],[17,19],[9,19],[-7,6],[9,7],[9,22],[12,14],[-3,18],[-9,17],[12,-1],[-1,22],[18,3],[13,10],[-14,8],[3,18],[29,-11],[5,10],[11,-5],[10,22],[9,4],[0,14],[14,13],[-7,15],[5,10],[13,2],[2,16],[-16,19],[3,27],[-18,8],[1,17],[-16,20],[-15,25],[5,8],[13,-9],[6,17],[16,-13],[19,2],[2,18],[-11,8],[4,15],[23,4],[-3,32],[-10,9],[-4,17],[2,25],[7,10],[29,1],[11,10],[17,-5],[-6,12],[15,37],[13,2],[22,-17],[11,-17],[12,15],[13,6],[9,12],[-6,26],[11,23],[-2,11],[9,9],[9,23],[14,4],[17,25],[23,16],[9,18],[11,3],[1,-16],[13,-1],[18,-10],[2,18],[-5,22],[3,24],[8,1],[16,-16],[13,-6],[26,-42],[7,0],[1,18],[-8,36],[-15,27],[12,25],[-4,10],[7,9],[-1,14],[13,4],[4,25],[13,13],[2,19]],[[3784,7998],[-1,13],[-10,11],[23,47],[19,6],[13,-4],[13,-31],[22,5],[11,-6],[16,12],[11,-2],[26,14],[25,2],[25,-11]],[[3977,8054],[-7,-30],[10,-47],[-3,-12],[-33,-29],[-4,-15],[-12,-7],[-34,30],[-21,-27],[-3,-123],[7,-25],[-1,-17],[8,-16],[-3,-20],[5,-34],[35,-47],[25,5],[11,-5],[0,21],[13,2],[19,-49],[-4,-3],[0,-27],[13,-8],[3,-20],[7,-9],[14,12],[10,-7],[19,10],[11,-4],[5,-13],[1,-23],[13,-17],[12,-28],[3,-16],[-5,-25],[-17,-30],[-3,-25],[3,-11],[-6,-15],[-13,-13],[20,-17],[-2,-19],[-11,-19],[3,-39],[9,-16],[2,-15],[-5,-21],[20,12],[1,-8],[26,-23],[-1,-19],[-17,-6],[-1,-9],[10,-12],[15,-1],[19,10],[14,-8],[0,-28],[24,-18],[4,-30],[21,-12],[-8,-8],[-20,1],[4,-15],[-6,-30],[-8,-12],[3,-50],[-21,-14],[4,-8],[-1,-23],[-11,-11],[2,-18]],[[2606,7292],[-8,6],[-3,42],[6,33],[-25,-15],[-9,8],[0,13],[-9,9],[-24,-2],[-11,13],[-27,10],[-15,15],[3,21],[-5,14],[-19,4],[-12,-9],[-19,22],[5,10],[-14,37],[14,13],[-2,11],[-18,28],[-15,9],[3,26],[-5,3],[3,20],[-4,19],[-28,1],[-10,23],[18,19],[-3,29],[11,28],[0,22],[20,4],[-3,23],[19,16],[4,10],[-6,10],[3,17],[-3,59],[-5,8],[8,36],[6,8],[24,-10],[27,27],[5,9],[-4,36]],[[2479,8027],[26,5],[10,23],[1,22],[16,5],[10,11],[13,-4],[22,30],[3,15],[10,12],[18,5],[19,-3],[8,4],[21,-2],[17,14],[18,-10],[6,-19],[7,6],[11,33],[13,10],[31,-12],[20,-17],[5,-10],[10,12],[21,-4],[-9,-45],[22,0],[-1,-22],[24,-39],[19,-12],[13,19],[11,2],[8,-10],[6,14],[12,-2],[28,-17],[7,1],[8,22],[29,31],[2,20],[15,14],[3,31],[-3,18],[-11,16]],[[2998,8194],[18,24],[26,14],[18,-7],[25,35],[0,-9],[14,0],[20,-14],[7,1],[0,-22],[27,-3],[14,-11],[27,1],[14,-16],[13,7],[17,-35],[8,-3],[11,12],[5,-7],[1,-27],[18,2],[37,-11],[18,-9],[18,-21],[20,-4],[40,1],[1,-14],[18,-10],[7,8],[22,4],[21,-6],[4,-11],[26,16],[35,8],[9,10],[17,7],[27,-15],[18,-53],[13,4],[13,-4],[11,-20],[-11,-15],[-1,-11],[19,-3],[11,4],[1,-14],[8,-6],[6,14],[9,2],[6,15],[21,-1],[17,15],[15,-3],[11,-12],[16,-3]],[[3977,8054],[11,27],[27,9],[15,45],[-2,22],[12,2],[17,19],[9,17],[10,47],[7,17],[-12,27],[4,25],[-3,19],[12,21],[20,0],[7,7],[30,12],[20,-3],[31,-13],[16,3],[8,33],[19,1],[11,28],[-1,25],[10,8],[6,20],[9,7],[2,38],[38,-19],[20,13],[13,45],[14,25],[23,-8],[8,-11],[28,-11],[13,7],[26,-20],[38,-11],[25,-11],[12,-20],[21,-8],[17,17],[33,-7],[8,8],[23,0],[7,-6],[5,-24],[38,4],[25,29],[11,6],[6,-6],[24,-4],[36,9],[8,-7],[13,4],[4,9],[-5,20],[8,16],[14,14],[17,6],[2,12],[15,-9],[0,-14],[11,-10],[28,18],[20,-9],[32,-3]],[[4951,8561],[15,-1],[33,-24],[2,-16],[13,-19],[23,-13],[-9,-25],[-10,-12],[12,-9],[7,6],[12,-45],[16,-40],[8,-4],[22,3],[9,-21],[-11,-15],[-5,-16],[-27,-21],[18,-44],[14,8],[11,-13],[-15,-21],[-14,-3],[-19,-19],[-14,2],[-1,11],[-16,0],[-8,-20],[-3,-25],[31,-43],[-1,-14],[16,-19],[14,5],[6,-16],[-8,-40],[2,-11],[15,-15],[-5,-25],[8,-32],[-3,-7],[-19,-8],[-24,-29],[8,-37],[21,-32],[16,-7],[-4,-28],[-14,-22],[-8,-24],[-9,-7],[-6,-30],[3,-18],[17,-1],[-2,-19],[10,-38],[5,-9],[-13,-35],[11,-23],[-1,-12]],[[6618,7835],[15,22],[13,4],[1,25],[12,18],[24,-4],[3,11],[-18,4],[2,27],[-5,8],[-8,-8],[-21,40],[-8,-5],[-10,19],[-12,-6],[-11,48],[5,19],[-5,27],[-10,22],[3,15],[24,15],[12,-2],[10,-43],[29,-9],[4,7],[32,-24],[13,-24],[26,-1],[5,9],[38,0],[-13,15],[0,8],[14,7],[-3,15],[-8,4],[-6,19],[-8,7],[-9,-5],[-3,17],[24,13],[14,20],[-11,32],[1,15],[11,8],[0,64]],[[6784,8288],[22,22],[-4,20],[25,-5],[11,7],[10,16],[-2,16],[-12,16],[11,6],[10,15],[8,-14],[25,-10],[20,-18],[18,11],[14,-14],[24,-14],[13,5],[18,-12],[46,3],[10,11],[33,-13],[5,12],[17,-14],[14,-1],[4,-20],[14,-35],[9,-8],[4,-18],[15,-32],[9,36],[16,2],[-2,23],[19,-7],[0,71],[-5,2],[-2,35],[7,26],[18,52],[18,2],[15,-15],[16,-37],[15,16],[8,-21],[29,-12],[28,3],[22,15],[13,19],[11,0],[-12,25],[1,22],[-6,6],[18,24],[20,-8],[6,-9],[25,23],[16,4],[34,17],[15,-2],[18,14]],[[7536,8546],[15,-16],[23,3],[2,-9],[-12,-16],[1,-16],[15,-6],[-9,-15],[15,-9],[-6,-17],[11,-15],[11,3],[1,-10],[-10,-7],[12,-16],[1,-40],[11,-8],[8,-31],[18,8],[-1,-11],[8,-12],[9,-1],[6,24],[5,-2],[-5,-25],[10,11],[13,-9],[0,22],[7,-2],[5,-27],[13,-12],[0,-9],[16,-1],[2,-11],[-6,-22],[-12,-4],[4,-16],[-9,-15],[12,-22],[4,6],[7,-15],[3,-23],[8,-2],[-4,-18],[-13,-9],[0,-43],[15,2],[-9,-16],[27,0],[-6,-41],[13,0],[-2,-20],[11,-2],[-16,-20],[-18,5],[-1,-9],[13,1],[0,-20],[12,23],[5,-9],[-7,-13],[7,-2],[10,18],[6,-10],[1,-22],[9,4],[-1,-23],[12,-5],[-1,15],[21,0],[9,-15],[1,21],[5,-1],[0,-22],[5,-5],[0,-26],[6,14],[16,-4],[-3,17],[7,6],[11,-13],[10,2],[8,-16],[1,-24],[9,3],[-2,-27],[13,-11],[1,-9],[-15,4],[14,-11],[0,-13],[-12,-5],[6,-14],[9,4],[-3,-21],[20,2],[-3,-22],[14,-2],[-8,-26],[14,-4],[-5,-32],[17,-1],[-7,-41],[16,-18],[-10,-14],[0,-10],[-16,2],[0,-13],[10,4],[5,-15],[-21,5],[3,-7],[18,-7],[16,1],[16,-9],[11,4],[11,-14],[-4,-15],[-9,17],[-14,-15],[5,-13],[28,-12],[-3,-10],[20,3],[0,-10],[11,-11],[-4,-14],[14,-11],[7,-30],[6,8],[11,-20],[7,2],[12,-14],[5,9],[23,-22],[-17,-9],[5,-9],[15,5],[-4,-17],[15,6],[11,-22],[8,8],[4,-20],[29,-12],[5,16],[10,-3],[5,-19],[6,10],[5,-25],[-14,11],[-7,-15],[18,-21],[34,-24],[15,-23],[-11,-17],[-4,-29],[13,-6],[-3,-19],[8,0],[-9,-24],[17,-12],[-10,-4],[17,-15],[-9,-24],[-18,-5],[-4,-9],[13,-23],[9,6],[9,-29],[6,-6],[-20,-21],[12,1],[-3,-9],[20,-30],[-12,-11]],[[1247,6526],[13,20],[2,11],[-14,-1],[-15,32],[-2,20],[7,13],[17,-15],[20,15],[14,-7],[8,-14],[19,26],[3,29],[20,20],[-3,40],[-15,13],[-20,26],[-9,2],[-2,14],[7,23],[19,15],[8,25],[8,43],[-4,32],[1,17],[15,6],[4,16],[20,15],[13,0],[16,13],[13,3],[7,16],[1,35],[11,3],[-7,32],[-9,17],[-1,39],[6,11],[36,1],[3,13],[10,10],[8,27],[16,-6],[9,29],[-14,7],[2,22],[8,19],[1,17],[9,5],[-10,27],[0,14],[-17,3],[-13,29],[-2,15],[37,11],[0,13],[23,25],[-4,11],[16,14],[-3,18],[13,33],[49,23],[22,-6],[-2,37],[11,15],[-1,15],[13,61],[6,14],[21,9],[10,17],[11,5],[2,46],[-2,26],[-11,6],[5,35],[5,7],[16,45],[9,3],[8,15],[-1,16],[-7,7],[12,40],[3,25],[28,62],[4,26],[15,30],[-2,12],[16,5],[9,13],[14,-7],[19,8],[7,-10],[14,-3],[13,37],[12,44],[-6,20],[6,10],[-10,32],[7,19],[-12,7],[-15,62],[7,41],[11,38],[23,43],[16,-23],[11,19],[-18,19],[26,33],[12,-10],[9,9],[8,25],[7,3],[17,31],[-1,19],[12,0],[11,-9],[20,-4],[8,6],[10,30]],[[2033,8586],[8,-11],[11,0],[22,-13],[1,-20],[8,-29],[17,-24],[13,0],[-5,-13],[6,-7],[-8,-33],[24,5],[13,-6],[5,-41],[-8,-7],[1,-20],[22,-13],[20,-4],[23,-27],[-16,-12],[9,-29],[-1,-25],[9,-39],[5,4],[6,-25],[17,9],[17,-6],[15,11],[0,-7],[18,-6],[6,-14],[13,14],[9,0],[20,16],[18,-4],[7,-10],[9,9],[18,-23],[-3,-16],[4,-20],[8,-1],[6,-14],[18,5],[16,-20],[7,-43],[16,-25],[-1,-11],[15,-21],[8,7]],[[4951,8561],[26,36],[10,7],[34,36],[13,0],[8,8],[21,7],[4,14],[-4,24],[-16,13],[-14,3],[-9,21],[-21,19],[-21,33],[-23,15],[0,15],[-9,11],[2,22]],[[4952,8845],[38,1],[13,-9],[13,19],[19,-5],[16,-14],[16,45],[8,-12],[56,32],[1,29],[34,50],[17,-3],[6,12],[-5,27],[12,11],[4,29],[22,26],[-2,18],[7,13],[15,11],[4,29],[-3,11],[7,31],[9,8],[16,1],[6,-8],[15,2],[41,45],[16,-2],[78,17],[101,24],[102,13],[36,22],[37,1],[26,-11],[14,4],[11,-9],[26,9],[5,-9],[39,-5],[46,31],[8,21],[12,8],[25,7],[20,-16],[12,-4],[16,7],[9,28],[27,-3],[12,-11],[19,7],[96,30],[42,-21]],[[6172,9382],[19,-12],[-9,-17],[20,-22],[-6,-30],[3,-20],[19,-6],[4,-11],[11,9],[8,-16],[20,-4],[-2,-20],[9,-5],[-10,-16],[2,-16],[13,-3],[2,-17],[28,24],[5,12],[21,-31],[11,1],[4,-14],[10,-8],[-2,-13],[13,-28],[8,17],[4,-17],[10,-3],[7,-13],[-12,-26],[19,-22],[1,-25],[13,-18],[12,-28],[6,0],[31,-53],[13,-10],[6,6],[13,-17],[0,-10],[-17,-24],[7,-22],[7,-1],[3,-17],[14,2],[-2,-13],[20,6],[3,-15],[9,7],[8,-15],[-3,-19],[8,-14],[8,4],[19,-36],[-7,-17],[10,-16],[-3,-6],[19,-8],[-2,-11],[19,-6],[-2,-10],[22,2],[7,-15],[-12,-2],[8,-19],[-7,-25],[12,-4],[5,-22],[-3,-15],[-13,-3],[9,-23],[-3,-15],[18,-9],[-4,-6],[9,-18],[-1,-23],[15,-28],[0,-16],[28,-6],[0,-26],[-18,-9],[-23,-5],[-16,-14],[12,-26],[10,10],[20,-21],[-2,-30],[5,-13],[-6,-10],[4,-16],[8,-3],[7,11],[17,1],[28,18],[17,-16],[9,-2],[8,17]],[[2998,8194],[-1,16],[-22,19],[-19,-12],[-12,-1],[-6,-12],[-16,-5],[-6,-9],[-13,0],[-16,18],[-28,13],[-4,32],[2,18],[11,15],[-10,34],[7,5],[26,-16],[14,24],[23,-12],[15,7],[-3,8],[0,51],[7,14],[-1,35],[5,13],[0,23],[12,33],[23,24],[28,44],[8,23],[22,24],[9,-28],[22,-46],[8,-12],[23,-18],[21,2],[30,-48],[13,-3],[19,5],[12,14],[-2,22],[-8,9],[5,8],[3,47],[-7,22],[6,22],[0,18],[9,31],[9,0],[15,13],[3,-10],[12,3],[3,16],[15,7],[6,21],[17,3],[2,11],[15,21],[-9,11],[-14,-10],[-3,27],[-28,32],[-13,-9],[-18,8],[-14,13],[2,13],[-7,7],[-14,-11],[-12,8],[-15,-6],[-10,4],[-2,31],[-8,18],[16,26],[-4,7],[18,27],[0,38],[21,8],[13,-23],[27,-3],[32,-16],[14,-2],[19,11],[13,-11],[19,-4],[7,-15],[15,5],[14,-5],[7,-11],[12,7],[17,33],[33,15],[10,16],[18,2],[3,12],[21,4],[3,24],[14,25],[-1,18],[13,8],[10,23],[12,4],[1,-13],[23,17],[16,31],[-8,9],[-8,31],[-15,26],[-21,0],[-14,35],[-1,24],[-7,4],[-9,30],[-13,-6],[-10,4],[-45,43],[-2,17]],[[3422,9361],[5,25],[18,32],[8,52],[14,-22],[9,0],[18,-14],[19,2],[7,10],[9,-4],[17,4],[6,-10],[11,0],[11,-12],[2,-12],[20,-16],[28,7],[21,13],[4,-12],[8,12],[33,6],[9,-8],[14,4],[17,-20],[29,-7],[0,-13],[16,-19],[-1,-22],[10,-17],[1,-15],[22,-23],[17,23],[10,-1],[26,11],[9,-4],[19,5],[7,12],[2,18],[8,7],[8,-6],[10,12],[6,-17],[17,3],[14,14],[15,-17],[9,-22],[16,8],[19,0],[6,-12],[29,-22],[1,-15],[14,-33],[20,1],[8,-7],[12,10],[13,-4],[4,11],[14,-10],[18,0],[18,-20],[7,-20],[9,-2],[35,24],[19,-3],[21,14],[5,10],[23,19],[10,-17],[16,-6],[31,23],[4,30],[9,28],[19,15],[6,-1],[21,24],[16,-16],[21,0],[33,-24],[12,-1],[15,21],[27,-6],[11,21],[21,-7],[20,-43],[9,14],[14,0],[9,-25],[-3,-12],[7,-21],[17,-12],[1,-18],[8,-4],[14,-27],[-9,-42],[8,-29],[15,-15],[17,-9],[3,-26],[15,-2],[14,11],[22,-31],[5,16],[21,0],[6,-30],[11,4],[35,-10],[-6,-31],[15,-26],[2,-32],[14,-9],[4,-20],[24,-28],[5,-35],[4,-5],[-4,-21],[27,2],[41,8]],[[2033,8586],[10,51],[4,8],[4,41],[9,-3],[12,18],[3,40],[-3,5],[9,23],[24,3],[7,19],[-1,29],[5,30],[23,-3],[22,25],[11,4],[4,25],[-4,23],[7,3],[12,-10],[12,-20],[11,-9],[31,-8],[10,6],[16,-3],[1,-9],[20,-2],[-4,28],[6,16],[8,61],[8,28],[20,4],[15,13],[8,-11],[54,-51],[11,-20],[65,-1],[4,11],[13,-2],[11,9],[9,-3],[19,9],[7,10],[16,7],[15,58],[9,12],[3,23],[12,9],[28,-9],[17,17],[12,2],[1,19],[-5,23],[-11,9],[6,25],[-11,15],[7,16],[20,2],[10,-6],[42,40],[17,-2],[10,25],[9,10],[8,29],[12,14],[1,13],[26,14],[21,4],[15,19],[-5,51],[-5,17],[-13,5],[-2,23],[6,13],[18,-5],[19,-19],[0,8],[16,-3],[-1,-7],[20,-12],[19,-24],[11,3],[7,18],[27,6],[10,10],[27,-5],[4,18],[-5,6],[16,30],[5,17],[-12,14],[15,20],[-6,27],[7,5],[10,27],[-10,9],[17,21],[18,9],[3,25],[17,8],[1,11],[11,0],[10,-19],[3,-29],[10,-5],[50,-8],[6,19],[17,-1],[3,-34],[11,-5],[12,-20],[-17,-30],[12,-26],[16,-10],[13,5],[12,-19],[8,6],[-5,-31],[11,-13],[10,6],[8,-14],[49,-32],[1,-15],[14,-12],[16,7],[4,-15],[25,-19],[20,-1],[15,-13],[7,2]],[[6172,9382],[18,8],[9,12],[11,-8],[35,14],[15,9],[16,28],[9,46],[7,51],[43,42],[14,11],[8,19],[7,31],[5,38],[12,33],[20,32],[12,9],[7,15],[-7,36],[5,16],[17,-1],[2,17],[9,-13],[9,10],[4,17],[14,-4],[-7,-15],[9,-5],[17,5],[20,26],[12,-17],[7,8],[-5,16],[13,-2],[13,9],[-3,14],[15,12],[13,-11],[17,6],[13,-13],[14,4],[2,-8],[24,15],[0,19],[23,-13],[-3,21],[3,20],[17,18],[8,-17],[26,1],[-6,23],[17,-3],[-1,22],[10,4],[5,-17],[7,0],[12,24],[5,-13],[-2,-22],[16,1],[13,13],[4,19],[9,1],[3,-21],[21,-18],[5,11],[-4,16],[16,-10],[-10,-18],[37,6],[13,-10],[6,15],[10,-3],[13,13],[7,-15],[13,-9],[2,-30],[11,-6],[8,14],[10,-5],[4,-26],[27,-37],[25,-1],[-7,-14],[-9,-1],[0,-15],[15,-16],[13,8],[-8,30],[17,6],[15,-9],[7,-25],[-19,-35],[16,-17],[21,4],[19,-10],[5,-23],[-16,-5],[-18,17],[-7,-16],[6,-22],[12,-11],[13,0],[20,-16],[8,5],[10,26],[12,3],[-5,-27],[13,11],[4,-6],[-6,-27],[8,-21],[-2,-12],[-13,-24],[17,-17],[4,-27],[17,-13],[19,-25],[3,-30],[24,-6],[3,-7],[-16,-21],[-2,-27],[12,-1],[13,16],[16,-7],[-10,-18],[1,-18],[13,-8],[33,8],[-7,-17],[-6,-34],[-13,-10],[21,-20],[18,-23],[-29,-55],[52,-42],[9,-112],[17,-19],[25,-14],[-1,-10],[-13,-10],[-12,14],[-9,-17],[7,-19],[14,4],[7,-9],[-11,-12],[0,-17],[20,-14],[2,-28],[13,-6],[4,-37],[13,9],[5,-20],[-7,-6],[10,-7],[7,10],[3,-12],[-13,-8],[-4,-24],[14,-9],[-3,-13],[-14,13],[-11,-5],[-1,14],[-8,-4],[-10,-26],[14,-11],[10,-31],[8,4],[-8,-25],[8,-13],[15,-5],[0,-39],[13,-3],[7,-18],[1,-17],[23,-40],[22,-10],[6,-10],[9,-41],[21,-18]]]} -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Populația României 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /script.js: -------------------------------------------------------------------------------- 1 | var renderer, scene, camera, raycaster, meshes = []; 2 | var mouse = new THREE.Vector2(); 3 | 4 | var counties = d3.map(); 5 | 6 | // transormation matrix 7 | var positioning; 8 | 9 | var RO_CENTER = [25.0094303, 45.9442858]; 10 | var MAX_EXTRUSION = 10; 11 | 12 | var years = [], currentYear; 13 | 14 | var numberFormatter = d3.format('0,000'); 15 | 16 | // function that maps population int to extrusion value 17 | // requires the maximum possible population 18 | var getExtrusion; 19 | 20 | // function that maps population int to luminance 21 | // requires the maximum possible population 22 | var getLuminance; 23 | 24 | function initRenderer() { 25 | renderer = new THREE.WebGLRenderer(); 26 | 27 | renderer.setSize(window.innerWidth, window.innerHeight); 28 | renderer.setClearColor(0x000000); 29 | 30 | document.body.appendChild(renderer.domElement); 31 | } 32 | 33 | function initThree() { 34 | initRenderer(); 35 | 36 | raycaster = new THREE.Raycaster(); 37 | 38 | scene = new THREE.Scene(); 39 | 40 | initCamera(); 41 | initLights(); 42 | 43 | controls = new THREE.TrackballControls(camera, renderer.domElement); 44 | controls.minDistance = 10; 45 | controls.maxDistance = 50; 46 | 47 | animate(); 48 | } 49 | 50 | function initCamera() { 51 | camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000); 52 | camera.position.set(-8.278324114488553, 23.715105536749885, 5.334970045945842); 53 | camera.up.set(-0.3079731382492934, 0.9436692395156481, -0.12099963846565401); 54 | 55 | // restoreCameraOrientation(camera); 56 | } 57 | 58 | function initLights() { 59 | var pointLight = new THREE.PointLight(0xFFFFFF); 60 | pointLight.position.set(-800, 800, 800); 61 | scene.add(pointLight); 62 | 63 | var pointLight2 = new THREE.PointLight(0xFFFFFF); 64 | pointLight2.position.set(800, 800, 800); 65 | scene.add(pointLight2); 66 | 67 | var pointLight3 = new THREE.PointLight(0xFFFFFF); 68 | pointLight3.position.set(0, 800, -800); 69 | scene.add(pointLight3); 70 | } 71 | 72 | function initLine() { 73 | var material = new THREE.LineBasicMaterial({ 74 | color: 0x0000ff 75 | }); 76 | 77 | var geometry = new THREE.Geometry(); 78 | geometry.vertices.push( 79 | new THREE.Vector3( 0, 0, 0 ), 80 | new THREE.Vector3( 0, 100, 0 ) 81 | ); 82 | 83 | var line = new THREE.Line( geometry, material ); 84 | scene.add( line ); 85 | } 86 | 87 | function updateInfoBox() { 88 | raycaster.setFromCamera( mouse, camera ); 89 | 90 | var intersects = raycaster.intersectObjects(scene.children); 91 | 92 | var html = ''; 93 | 94 | for (var i=0; i max_population) { 263 | max_population = value; 264 | } 265 | }); 266 | 267 | counties.set(countyCode, datum); 268 | }); 269 | 270 | return max_population; 271 | } 272 | 273 | initThree(); 274 | initPositioningTransform(); 275 | // initLine(); 276 | 277 | var YearButtons = React.createClass({ 278 | getYearFromHash: function() { 279 | var re = new RegExp('#/an/(\\d{4})'); 280 | var match = window.location.hash.match(re); 281 | var currentYear; 282 | 283 | if (match) { 284 | currentYear = +match[1]; 285 | if (this.props.years.indexOf(currentYear) > -1) { 286 | return currentYear; 287 | } 288 | } 289 | 290 | return false; 291 | }, 292 | 293 | getInitialState: function() { 294 | var currentYear = this.getYearFromHash(); 295 | 296 | if (!currentYear) { 297 | currentYear = this.props.years[0]; 298 | } 299 | 300 | return {currentYear: currentYear}; 301 | }, 302 | 303 | componentDidMount: function() { 304 | window.addEventListener('hashchange', this.onHashChange); 305 | }, 306 | 307 | componentWillUnmount: function() { 308 | window.removeEventListener('hashchange', this.onHashChange); 309 | }, 310 | 311 | onHashChange: function(year) { 312 | var year = this.getYearFromHash(); 313 | 314 | if (year) { 315 | this.setState({currentYear: year}); 316 | } 317 | }, 318 | 319 | render: function() { 320 | var self = this; 321 | 322 | currentYear = self.state.currentYear; // used by infobox 323 | updateMeshes(this.state.currentYear); 324 | 325 | function createButton(year) { 326 | var classes = classNames({ 327 | 'btn': true, 328 | 'btn-default': true, 329 | 'active': year == self.state.currentYear 330 | }); 331 | 332 | return {year}; 333 | } 334 | 335 | return
{self.props.years.map(createButton)}
; 336 | } 337 | }); 338 | 339 | loadData(dataSources, function(results) { 340 | years = extractYears(results.recensaminte); 341 | var max_population = prepareCensusData(results.recensaminte, results.id_judete); 342 | 343 | getExtrusion = d3.scale.linear().domain([0, max_population]).range([0, MAX_EXTRUSION]); 344 | getLuminance = d3.scale.linear().domain([0, max_population]); 345 | 346 | var judete = results.judete; 347 | 348 | var features = topojson.feature(judete, judete.objects['romania-counties-geojson']).features; 349 | initGeometry(features); 350 | 351 | React.render(, document.getElementById('container')); 352 | }); 353 | 354 | document.addEventListener('mousemove', onDocumentMouseMove); 355 | window.addEventListener('resize', onWindowResize); 356 | window.addEventListener('beforeunload', saveCameraOrientation); 357 | -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | } 5 | 6 | #infobox { 7 | position: absolute; 8 | top: 0; 9 | right: 6px; 10 | color: white; 11 | opacity: 0.7; 12 | } 13 | 14 | #current-year { 15 | position: absolute; 16 | top: 6px; 17 | left: 6px; 18 | } 19 | 20 | /* retina screens */ 21 | @media 22 | (-webkit-min-device-pixel-ratio: 2), 23 | (min-resolution: 192dpi) { 24 | #infobox { 25 | font-size: 42px; 26 | } 27 | 28 | #current-year .btn { 29 | font-size: 28px; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /vendor/TrackballControls.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Eberhard Graether / http://egraether.com/ 3 | * @author Mark Lundin / http://mark-lundin.com 4 | */ 5 | 6 | THREE.TrackballControls = function ( object, domElement ) { 7 | 8 | var _this = this; 9 | var STATE = { NONE: -1, ROTATE: 0, ZOOM: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_ZOOM_PAN: 4 }; 10 | 11 | this.object = object; 12 | this.domElement = ( domElement !== undefined ) ? domElement : document; 13 | 14 | // API 15 | 16 | this.enabled = true; 17 | 18 | this.screen = { left: 0, top: 0, width: 0, height: 0 }; 19 | 20 | this.rotateSpeed = 1.0; 21 | this.zoomSpeed = 1.2; 22 | this.panSpeed = 0.3; 23 | 24 | this.noRotate = false; 25 | this.noZoom = false; 26 | this.noPan = false; 27 | this.noRoll = false; 28 | 29 | this.staticMoving = false; 30 | this.dynamicDampingFactor = 0.2; 31 | 32 | this.minDistance = 0; 33 | this.maxDistance = Infinity; 34 | 35 | this.keys = [ 65 /*A*/, 83 /*S*/, 68 /*D*/ ]; 36 | 37 | // internals 38 | 39 | this.target = new THREE.Vector3(); 40 | 41 | var EPS = 0.000001; 42 | 43 | var lastPosition = new THREE.Vector3(); 44 | 45 | var _state = STATE.NONE, 46 | _prevState = STATE.NONE, 47 | 48 | _eye = new THREE.Vector3(), 49 | 50 | _rotateStart = new THREE.Vector3(), 51 | _rotateEnd = new THREE.Vector3(), 52 | 53 | _zoomStart = new THREE.Vector2(), 54 | _zoomEnd = new THREE.Vector2(), 55 | 56 | _touchZoomDistanceStart = 0, 57 | _touchZoomDistanceEnd = 0, 58 | 59 | _panStart = new THREE.Vector2(), 60 | _panEnd = new THREE.Vector2(); 61 | 62 | // for reset 63 | 64 | this.target0 = this.target.clone(); 65 | this.position0 = this.object.position.clone(); 66 | this.up0 = this.object.up.clone(); 67 | 68 | // events 69 | 70 | var changeEvent = { type: 'change' }; 71 | var startEvent = { type: 'start'}; 72 | var endEvent = { type: 'end'}; 73 | 74 | 75 | // methods 76 | 77 | this.handleResize = function () { 78 | 79 | if ( this.domElement === document ) { 80 | 81 | this.screen.left = 0; 82 | this.screen.top = 0; 83 | this.screen.width = window.innerWidth; 84 | this.screen.height = window.innerHeight; 85 | 86 | } else { 87 | 88 | var box = this.domElement.getBoundingClientRect(); 89 | // adjustments come from similar code in the jquery offset() function 90 | var d = this.domElement.ownerDocument.documentElement; 91 | this.screen.left = box.left + window.pageXOffset - d.clientLeft; 92 | this.screen.top = box.top + window.pageYOffset - d.clientTop; 93 | this.screen.width = box.width; 94 | this.screen.height = box.height; 95 | 96 | } 97 | 98 | }; 99 | 100 | this.handleEvent = function ( event ) { 101 | 102 | if ( typeof this[ event.type ] == 'function' ) { 103 | 104 | this[ event.type ]( event ); 105 | 106 | } 107 | 108 | }; 109 | 110 | var getMouseOnScreen = ( function () { 111 | 112 | var vector = new THREE.Vector2(); 113 | 114 | return function ( pageX, pageY ) { 115 | 116 | vector.set( 117 | ( pageX - _this.screen.left ) / _this.screen.width, 118 | ( pageY - _this.screen.top ) / _this.screen.height 119 | ); 120 | 121 | return vector; 122 | 123 | }; 124 | 125 | }() ); 126 | 127 | var getMouseProjectionOnBall = ( function () { 128 | 129 | var vector = new THREE.Vector3(); 130 | var objectUp = new THREE.Vector3(); 131 | var mouseOnBall = new THREE.Vector3(); 132 | 133 | return function ( pageX, pageY ) { 134 | 135 | mouseOnBall.set( 136 | ( pageX - _this.screen.width * 0.5 - _this.screen.left ) / (_this.screen.width*.5), 137 | ( _this.screen.height * 0.5 + _this.screen.top - pageY ) / (_this.screen.height*.5), 138 | 0.0 139 | ); 140 | 141 | var length = mouseOnBall.length(); 142 | 143 | if ( _this.noRoll ) { 144 | 145 | if ( length < Math.SQRT1_2 ) { 146 | 147 | mouseOnBall.z = Math.sqrt( 1.0 - length*length ); 148 | 149 | } else { 150 | 151 | mouseOnBall.z = .5 / length; 152 | 153 | } 154 | 155 | } else if ( length > 1.0 ) { 156 | 157 | mouseOnBall.normalize(); 158 | 159 | } else { 160 | 161 | mouseOnBall.z = Math.sqrt( 1.0 - length * length ); 162 | 163 | } 164 | 165 | _eye.copy( _this.object.position ).sub( _this.target ); 166 | 167 | vector.copy( _this.object.up ).setLength( mouseOnBall.y ) 168 | vector.add( objectUp.copy( _this.object.up ).cross( _eye ).setLength( mouseOnBall.x ) ); 169 | vector.add( _eye.setLength( mouseOnBall.z ) ); 170 | 171 | return vector; 172 | 173 | }; 174 | 175 | }() ); 176 | 177 | this.rotateCamera = (function(){ 178 | 179 | var axis = new THREE.Vector3(), 180 | quaternion = new THREE.Quaternion(); 181 | 182 | 183 | return function () { 184 | 185 | var angle = Math.acos( _rotateStart.dot( _rotateEnd ) / _rotateStart.length() / _rotateEnd.length() ); 186 | 187 | if ( angle ) { 188 | 189 | axis.crossVectors( _rotateStart, _rotateEnd ).normalize(); 190 | 191 | angle *= _this.rotateSpeed; 192 | 193 | quaternion.setFromAxisAngle( axis, -angle ); 194 | 195 | _eye.applyQuaternion( quaternion ); 196 | _this.object.up.applyQuaternion( quaternion ); 197 | 198 | _rotateEnd.applyQuaternion( quaternion ); 199 | 200 | if ( _this.staticMoving ) { 201 | 202 | _rotateStart.copy( _rotateEnd ); 203 | 204 | } else { 205 | 206 | quaternion.setFromAxisAngle( axis, angle * ( _this.dynamicDampingFactor - 1.0 ) ); 207 | _rotateStart.applyQuaternion( quaternion ); 208 | 209 | } 210 | 211 | } 212 | } 213 | 214 | }()); 215 | 216 | this.zoomCamera = function () { 217 | 218 | if ( _state === STATE.TOUCH_ZOOM_PAN ) { 219 | 220 | var factor = _touchZoomDistanceStart / _touchZoomDistanceEnd; 221 | _touchZoomDistanceStart = _touchZoomDistanceEnd; 222 | _eye.multiplyScalar( factor ); 223 | 224 | } else { 225 | 226 | var factor = 1.0 + ( _zoomEnd.y - _zoomStart.y ) * _this.zoomSpeed; 227 | 228 | if ( factor !== 1.0 && factor > 0.0 ) { 229 | 230 | _eye.multiplyScalar( factor ); 231 | 232 | if ( _this.staticMoving ) { 233 | 234 | _zoomStart.copy( _zoomEnd ); 235 | 236 | } else { 237 | 238 | _zoomStart.y += ( _zoomEnd.y - _zoomStart.y ) * this.dynamicDampingFactor; 239 | 240 | } 241 | 242 | } 243 | 244 | } 245 | 246 | }; 247 | 248 | this.panCamera = (function(){ 249 | 250 | var mouseChange = new THREE.Vector2(), 251 | objectUp = new THREE.Vector3(), 252 | pan = new THREE.Vector3(); 253 | 254 | return function () { 255 | 256 | mouseChange.copy( _panEnd ).sub( _panStart ); 257 | 258 | if ( mouseChange.lengthSq() ) { 259 | 260 | mouseChange.multiplyScalar( _eye.length() * _this.panSpeed ); 261 | 262 | pan.copy( _eye ).cross( _this.object.up ).setLength( mouseChange.x ); 263 | pan.add( objectUp.copy( _this.object.up ).setLength( mouseChange.y ) ); 264 | 265 | _this.object.position.add( pan ); 266 | _this.target.add( pan ); 267 | 268 | if ( _this.staticMoving ) { 269 | 270 | _panStart.copy( _panEnd ); 271 | 272 | } else { 273 | 274 | _panStart.add( mouseChange.subVectors( _panEnd, _panStart ).multiplyScalar( _this.dynamicDampingFactor ) ); 275 | 276 | } 277 | 278 | } 279 | } 280 | 281 | }()); 282 | 283 | this.checkDistances = function () { 284 | 285 | if ( !_this.noZoom || !_this.noPan ) { 286 | 287 | if ( _eye.lengthSq() > _this.maxDistance * _this.maxDistance ) { 288 | 289 | _this.object.position.addVectors( _this.target, _eye.setLength( _this.maxDistance ) ); 290 | 291 | } 292 | 293 | if ( _eye.lengthSq() < _this.minDistance * _this.minDistance ) { 294 | 295 | _this.object.position.addVectors( _this.target, _eye.setLength( _this.minDistance ) ); 296 | 297 | } 298 | 299 | } 300 | 301 | }; 302 | 303 | this.update = function () { 304 | 305 | _eye.subVectors( _this.object.position, _this.target ); 306 | 307 | if ( !_this.noRotate ) { 308 | 309 | _this.rotateCamera(); 310 | 311 | } 312 | 313 | if ( !_this.noZoom ) { 314 | 315 | _this.zoomCamera(); 316 | 317 | } 318 | 319 | if ( !_this.noPan ) { 320 | 321 | _this.panCamera(); 322 | 323 | } 324 | 325 | _this.object.position.addVectors( _this.target, _eye ); 326 | 327 | _this.checkDistances(); 328 | 329 | _this.object.lookAt( _this.target ); 330 | 331 | if ( lastPosition.distanceToSquared( _this.object.position ) > EPS ) { 332 | 333 | _this.dispatchEvent( changeEvent ); 334 | 335 | lastPosition.copy( _this.object.position ); 336 | 337 | } 338 | 339 | }; 340 | 341 | this.reset = function () { 342 | 343 | _state = STATE.NONE; 344 | _prevState = STATE.NONE; 345 | 346 | _this.target.copy( _this.target0 ); 347 | _this.object.position.copy( _this.position0 ); 348 | _this.object.up.copy( _this.up0 ); 349 | 350 | _eye.subVectors( _this.object.position, _this.target ); 351 | 352 | _this.object.lookAt( _this.target ); 353 | 354 | _this.dispatchEvent( changeEvent ); 355 | 356 | lastPosition.copy( _this.object.position ); 357 | 358 | }; 359 | 360 | // listeners 361 | 362 | function keydown( event ) { 363 | 364 | if ( _this.enabled === false ) return; 365 | 366 | window.removeEventListener( 'keydown', keydown ); 367 | 368 | _prevState = _state; 369 | 370 | if ( _state !== STATE.NONE ) { 371 | 372 | return; 373 | 374 | } else if ( event.keyCode === _this.keys[ STATE.ROTATE ] && !_this.noRotate ) { 375 | 376 | _state = STATE.ROTATE; 377 | 378 | } else if ( event.keyCode === _this.keys[ STATE.ZOOM ] && !_this.noZoom ) { 379 | 380 | _state = STATE.ZOOM; 381 | 382 | } else if ( event.keyCode === _this.keys[ STATE.PAN ] && !_this.noPan ) { 383 | 384 | _state = STATE.PAN; 385 | 386 | } 387 | 388 | } 389 | 390 | function keyup( event ) { 391 | 392 | if ( _this.enabled === false ) return; 393 | 394 | _state = _prevState; 395 | 396 | window.addEventListener( 'keydown', keydown, false ); 397 | 398 | } 399 | 400 | function mousedown( event ) { 401 | 402 | if ( _this.enabled === false ) return; 403 | 404 | event.preventDefault(); 405 | event.stopPropagation(); 406 | 407 | if ( _state === STATE.NONE ) { 408 | 409 | _state = event.button; 410 | 411 | } 412 | 413 | if ( _state === STATE.ROTATE && !_this.noRotate ) { 414 | 415 | _rotateStart.copy( getMouseProjectionOnBall( event.pageX, event.pageY ) ); 416 | _rotateEnd.copy( _rotateStart ); 417 | 418 | } else if ( _state === STATE.ZOOM && !_this.noZoom ) { 419 | 420 | _zoomStart.copy( getMouseOnScreen( event.pageX, event.pageY ) ); 421 | _zoomEnd.copy(_zoomStart); 422 | 423 | } else if ( _state === STATE.PAN && !_this.noPan ) { 424 | 425 | _panStart.copy( getMouseOnScreen( event.pageX, event.pageY ) ); 426 | _panEnd.copy(_panStart) 427 | 428 | } 429 | 430 | document.addEventListener( 'mousemove', mousemove, false ); 431 | document.addEventListener( 'mouseup', mouseup, false ); 432 | 433 | _this.dispatchEvent( startEvent ); 434 | 435 | } 436 | 437 | function mousemove( event ) { 438 | 439 | if ( _this.enabled === false ) return; 440 | 441 | event.preventDefault(); 442 | event.stopPropagation(); 443 | 444 | if ( _state === STATE.ROTATE && !_this.noRotate ) { 445 | 446 | _rotateEnd.copy( getMouseProjectionOnBall( event.pageX, event.pageY ) ); 447 | 448 | } else if ( _state === STATE.ZOOM && !_this.noZoom ) { 449 | 450 | _zoomEnd.copy( getMouseOnScreen( event.pageX, event.pageY ) ); 451 | 452 | } else if ( _state === STATE.PAN && !_this.noPan ) { 453 | 454 | _panEnd.copy( getMouseOnScreen( event.pageX, event.pageY ) ); 455 | 456 | } 457 | 458 | } 459 | 460 | function mouseup( event ) { 461 | 462 | if ( _this.enabled === false ) return; 463 | 464 | event.preventDefault(); 465 | event.stopPropagation(); 466 | 467 | _state = STATE.NONE; 468 | 469 | document.removeEventListener( 'mousemove', mousemove ); 470 | document.removeEventListener( 'mouseup', mouseup ); 471 | _this.dispatchEvent( endEvent ); 472 | 473 | } 474 | 475 | function mousewheel( event ) { 476 | 477 | if ( _this.enabled === false ) return; 478 | 479 | event.preventDefault(); 480 | event.stopPropagation(); 481 | 482 | var delta = 0; 483 | 484 | if ( event.wheelDelta ) { // WebKit / Opera / Explorer 9 485 | 486 | delta = event.wheelDelta / 40; 487 | 488 | } else if ( event.detail ) { // Firefox 489 | 490 | delta = - event.detail / 3; 491 | 492 | } 493 | 494 | _zoomStart.y += delta * 0.01; 495 | _this.dispatchEvent( startEvent ); 496 | _this.dispatchEvent( endEvent ); 497 | 498 | } 499 | 500 | function touchstart( event ) { 501 | 502 | if ( _this.enabled === false ) return; 503 | 504 | switch ( event.touches.length ) { 505 | 506 | case 1: 507 | _state = STATE.TOUCH_ROTATE; 508 | _rotateStart.copy( getMouseProjectionOnBall( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ) ); 509 | _rotateEnd.copy( _rotateStart ); 510 | break; 511 | 512 | case 2: 513 | _state = STATE.TOUCH_ZOOM_PAN; 514 | var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; 515 | var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; 516 | _touchZoomDistanceEnd = _touchZoomDistanceStart = Math.sqrt( dx * dx + dy * dy ); 517 | 518 | var x = ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ) / 2; 519 | var y = ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ) / 2; 520 | _panStart.copy( getMouseOnScreen( x, y ) ); 521 | _panEnd.copy( _panStart ); 522 | break; 523 | 524 | default: 525 | _state = STATE.NONE; 526 | 527 | } 528 | _this.dispatchEvent( startEvent ); 529 | 530 | 531 | } 532 | 533 | function touchmove( event ) { 534 | 535 | if ( _this.enabled === false ) return; 536 | 537 | event.preventDefault(); 538 | event.stopPropagation(); 539 | 540 | switch ( event.touches.length ) { 541 | 542 | case 1: 543 | _rotateEnd.copy( getMouseProjectionOnBall( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ) ); 544 | break; 545 | 546 | case 2: 547 | var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; 548 | var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; 549 | _touchZoomDistanceEnd = Math.sqrt( dx * dx + dy * dy ); 550 | 551 | var x = ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ) / 2; 552 | var y = ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ) / 2; 553 | _panEnd.copy( getMouseOnScreen( x, y ) ); 554 | break; 555 | 556 | default: 557 | _state = STATE.NONE; 558 | 559 | } 560 | 561 | } 562 | 563 | function touchend( event ) { 564 | 565 | if ( _this.enabled === false ) return; 566 | 567 | switch ( event.touches.length ) { 568 | 569 | case 1: 570 | _rotateEnd.copy( getMouseProjectionOnBall( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ) ); 571 | _rotateStart.copy( _rotateEnd ); 572 | break; 573 | 574 | case 2: 575 | _touchZoomDistanceStart = _touchZoomDistanceEnd = 0; 576 | 577 | var x = ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX ) / 2; 578 | var y = ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY ) / 2; 579 | _panEnd.copy( getMouseOnScreen( x, y ) ); 580 | _panStart.copy( _panEnd ); 581 | break; 582 | 583 | } 584 | 585 | _state = STATE.NONE; 586 | _this.dispatchEvent( endEvent ); 587 | 588 | } 589 | 590 | this.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false ); 591 | 592 | this.domElement.addEventListener( 'mousedown', mousedown, false ); 593 | 594 | this.domElement.addEventListener( 'mousewheel', mousewheel, false ); 595 | this.domElement.addEventListener( 'DOMMouseScroll', mousewheel, false ); // firefox 596 | 597 | this.domElement.addEventListener( 'touchstart', touchstart, false ); 598 | this.domElement.addEventListener( 'touchend', touchend, false ); 599 | this.domElement.addEventListener( 'touchmove', touchmove, false ); 600 | 601 | window.addEventListener( 'keydown', keydown, false ); 602 | window.addEventListener( 'keyup', keyup, false ); 603 | 604 | this.handleResize(); 605 | 606 | // force an update at start 607 | this.update(); 608 | 609 | }; 610 | 611 | THREE.TrackballControls.prototype = Object.create( THREE.EventDispatcher.prototype ); 612 | THREE.TrackballControls.prototype.constructor = THREE.TrackballControls; 613 | -------------------------------------------------------------------------------- /vendor/classNames.js: -------------------------------------------------------------------------------- 1 | function classNames() { 2 | var args = arguments; 3 | var classes = []; 4 | 5 | for (var i = 0; i < args.length; i++) { 6 | var arg = args[i]; 7 | if (!arg) { 8 | continue; 9 | } 10 | 11 | if ('string' === typeof arg || 'number' === typeof arg) { 12 | classes.push(arg); 13 | } else if ('object' === typeof arg) { 14 | for (var key in arg) { 15 | if (!arg.hasOwnProperty(key) || !arg[key]) { 16 | continue; 17 | } 18 | classes.push(key); 19 | } 20 | } 21 | } 22 | return classes.join(' '); 23 | } 24 | 25 | // safely export classNames in case the script is included directly on a page 26 | if (typeof module !== 'undefined' && module.exports) { 27 | module.exports = classNames; 28 | } 29 | -------------------------------------------------------------------------------- /vendor/d3-threeD.js: -------------------------------------------------------------------------------- 1 | /* This Source Code Form is subject to the terms of the Mozilla Public 2 | * License, v. 2.0. If a copy of the MPL was not distributed with this file, 3 | * You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 | 5 | 6 | function d3threeD(exports) { 7 | 8 | const DEGS_TO_RADS = Math.PI / 180, 9 | UNIT_SIZE = 100; 10 | 11 | const DIGIT_0 = 48, DIGIT_9 = 57, COMMA = 44, SPACE = 32, PERIOD = 46, 12 | MINUS = 45; 13 | function transformSVGPath(pathStr) { 14 | var path = new THREE.Shape(); 15 | 16 | var idx = 1, len = pathStr.length, activeCmd, 17 | x = 0, y = 0, nx = 0, ny = 0, firstX = null, firstY = null, 18 | x1 = 0, x2 = 0, y1 = 0, y2 = 0, 19 | rx = 0, ry = 0, xar = 0, laf = 0, sf = 0, cx, cy; 20 | 21 | function eatNum() { 22 | var sidx, c, isFloat = false, s; 23 | // eat delims 24 | while (idx < len) { 25 | c = pathStr.charCodeAt(idx); 26 | if (c !== COMMA && c !== SPACE) 27 | break; 28 | idx++; 29 | } 30 | if (c === MINUS) 31 | sidx = idx++; 32 | else 33 | sidx = idx; 34 | // eat number 35 | while (idx < len) { 36 | c = pathStr.charCodeAt(idx); 37 | if (DIGIT_0 <= c && c <= DIGIT_9) { 38 | idx++; 39 | continue; 40 | } 41 | else if (c === PERIOD) { 42 | idx++; 43 | isFloat = true; 44 | continue; 45 | } 46 | 47 | s = pathStr.substring(sidx, idx); 48 | return isFloat ? parseFloat(s) : parseInt(s); 49 | } 50 | 51 | s = pathStr.substring(sidx); 52 | return isFloat ? parseFloat(s) : parseInt(s); 53 | } 54 | 55 | function nextIsNum() { 56 | var c; 57 | // do permanently eat any delims... 58 | while (idx < len) { 59 | c = pathStr.charCodeAt(idx); 60 | if (c !== COMMA && c !== SPACE) 61 | break; 62 | idx++; 63 | } 64 | c = pathStr.charCodeAt(idx); 65 | return (c === MINUS || (DIGIT_0 <= c && c <= DIGIT_9)); 66 | } 67 | 68 | var canRepeat; 69 | activeCmd = pathStr[0]; 70 | while (idx <= len) { 71 | canRepeat = true; 72 | switch (activeCmd) { 73 | // moveto commands, become lineto's if repeated 74 | case 'M': 75 | x = eatNum(); 76 | y = eatNum(); 77 | path.moveTo(x, y); 78 | activeCmd = 'L'; 79 | break; 80 | case 'm': 81 | x += eatNum(); 82 | y += eatNum(); 83 | path.moveTo(x, y); 84 | activeCmd = 'l'; 85 | break; 86 | case 'Z': 87 | case 'z': 88 | canRepeat = false; 89 | if (x !== firstX || y !== firstY) 90 | path.lineTo(firstX, firstY); 91 | break; 92 | // - lines! 93 | case 'L': 94 | case 'H': 95 | case 'V': 96 | nx = (activeCmd === 'V') ? x : eatNum(); 97 | ny = (activeCmd === 'H') ? y : eatNum(); 98 | path.lineTo(nx, ny); 99 | x = nx; 100 | y = ny; 101 | break; 102 | case 'l': 103 | case 'h': 104 | case 'v': 105 | nx = (activeCmd === 'v') ? x : (x + eatNum()); 106 | ny = (activeCmd === 'h') ? y : (y + eatNum()); 107 | path.lineTo(nx, ny); 108 | x = nx; 109 | y = ny; 110 | break; 111 | // - cubic bezier 112 | case 'C': 113 | x1 = eatNum(); y1 = eatNum(); 114 | case 'S': 115 | if (activeCmd === 'S') { 116 | x1 = 2 * x - x2; y1 = 2 * y - y2; 117 | } 118 | x2 = eatNum(); 119 | y2 = eatNum(); 120 | nx = eatNum(); 121 | ny = eatNum(); 122 | path.bezierCurveTo(x1, y1, x2, y2, nx, ny); 123 | x = nx; y = ny; 124 | break; 125 | case 'c': 126 | x1 = x + eatNum(); 127 | y1 = y + eatNum(); 128 | case 's': 129 | if (activeCmd === 's') { 130 | x1 = 2 * x - x2; 131 | y1 = 2 * y - y2; 132 | } 133 | x2 = x + eatNum(); 134 | y2 = y + eatNum(); 135 | nx = x + eatNum(); 136 | ny = y + eatNum(); 137 | path.bezierCurveTo(x1, y1, x2, y2, nx, ny); 138 | x = nx; y = ny; 139 | break; 140 | // - quadratic bezier 141 | case 'Q': 142 | x1 = eatNum(); y1 = eatNum(); 143 | case 'T': 144 | if (activeCmd === 'T') { 145 | x1 = 2 * x - x1; 146 | y1 = 2 * y - y1; 147 | } 148 | nx = eatNum(); 149 | ny = eatNum(); 150 | path.quadraticCurveTo(x1, y1, nx, ny); 151 | x = nx; 152 | y = ny; 153 | break; 154 | case 'q': 155 | x1 = x + eatNum(); 156 | y1 = y + eatNum(); 157 | case 't': 158 | if (activeCmd === 't') { 159 | x1 = 2 * x - x1; 160 | y1 = 2 * y - y1; 161 | } 162 | nx = x + eatNum(); 163 | ny = y + eatNum(); 164 | path.quadraticCurveTo(x1, y1, nx, ny); 165 | x = nx; y = ny; 166 | break; 167 | // - elliptical arc 168 | case 'A': 169 | rx = eatNum(); 170 | ry = eatNum(); 171 | xar = eatNum() * DEGS_TO_RADS; 172 | laf = eatNum(); 173 | sf = eatNum(); 174 | nx = eatNum(); 175 | ny = eatNum(); 176 | if (rx !== ry) { 177 | console.warn("Forcing elliptical arc to be a circular one :(", 178 | rx, ry); 179 | } 180 | // SVG implementation notes does all the math for us! woo! 181 | // http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes 182 | // step1, using x1 as x1' 183 | x1 = Math.cos(xar) * (x - nx) / 2 + Math.sin(xar) * (y - ny) / 2; 184 | y1 = -Math.sin(xar) * (x - nx) / 2 + Math.cos(xar) * (y - ny) / 2; 185 | // step 2, using x2 as cx' 186 | var norm = Math.sqrt( 187 | (rx*rx * ry*ry - rx*rx * y1*y1 - ry*ry * x1*x1) / 188 | (rx*rx * y1*y1 + ry*ry * x1*x1)); 189 | if (laf === sf) 190 | norm = -norm; 191 | x2 = norm * rx * y1 / ry; 192 | y2 = norm * -ry * x1 / rx; 193 | // step 3 194 | cx = Math.cos(xar) * x2 - Math.sin(xar) * y2 + (x + nx) / 2; 195 | cy = Math.sin(xar) * x2 + Math.cos(xar) * y2 + (y + ny) / 2; 196 | 197 | var u = new THREE.Vector2(1, 0), 198 | v = new THREE.Vector2((x1 - x2) / rx, 199 | (y1 - y2) / ry); 200 | var startAng = Math.acos(u.dot(v) / u.length() / v.length()); 201 | if (u.x * v.y - u.y * v.x < 0) 202 | startAng = -startAng; 203 | 204 | // we can reuse 'v' from start angle as our 'u' for delta angle 205 | u.x = (-x1 - x2) / rx; 206 | u.y = (-y1 - y2) / ry; 207 | 208 | var deltaAng = Math.acos(v.dot(u) / v.length() / u.length()); 209 | // This normalization ends up making our curves fail to triangulate... 210 | if (v.x * u.y - v.y * u.x < 0) 211 | deltaAng = -deltaAng; 212 | if (!sf && deltaAng > 0) 213 | deltaAng -= Math.PI * 2; 214 | if (sf && deltaAng < 0) 215 | deltaAng += Math.PI * 2; 216 | 217 | path.absarc(cx, cy, rx, startAng, startAng + deltaAng, sf); 218 | x = nx; 219 | y = ny; 220 | break; 221 | default: 222 | throw new Error("weird path command: " + activeCmd); 223 | } 224 | if (firstX === null) { 225 | firstX = x; 226 | firstY = y; 227 | } 228 | // just reissue the command 229 | if (canRepeat && nextIsNum()) 230 | continue; 231 | activeCmd = pathStr[idx++]; 232 | } 233 | 234 | return path; 235 | } 236 | 237 | function applySVGTransform(obj, tstr) { 238 | var idx = tstr.indexOf('('), len = tstr.length, 239 | cmd = tstr.substring(0, idx++); 240 | function eatNum() { 241 | var sidx, c, isFloat = false, s; 242 | // eat delims 243 | while (idx < len) { 244 | c = tstr.charCodeAt(idx); 245 | if (c !== COMMA && c !== SPACE) 246 | break; 247 | idx++; 248 | } 249 | if (c === MINUS) 250 | sidx = idx++; 251 | else 252 | sidx = idx; 253 | // eat number 254 | while (idx < len) { 255 | c = tstr.charCodeAt(idx); 256 | if (DIGIT_0 <= c && c <= DIGIT_9) { 257 | idx++; 258 | continue; 259 | } 260 | else if (c === PERIOD) { 261 | idx++; 262 | isFloat = true; 263 | continue; 264 | } 265 | 266 | s = tstr.substring(sidx, idx); 267 | return isFloat ? parseFloat(s) : parseInt(s); 268 | } 269 | 270 | s = tstr.substring(sidx); 271 | return isFloat ? parseFloat(s) : parseInt(s); 272 | } 273 | switch (cmd) { 274 | case 'translate': 275 | obj.position.x = Math.floor(eatNum() * UNIT_SIZE); 276 | obj.position.y = Math.floor(eatNum() * UNIT_SIZE); 277 | //console.log("translated:", obj.position.x, obj.position.y); 278 | break; 279 | case 'scale': 280 | obj.scale.x = Math.floor(eatNum() * UNIT_SIZE); 281 | obj.scale.y = Math.floor(eatNum() * UNIT_SIZE); 282 | break; 283 | default: 284 | console.warn("don't understand transform", tstr); 285 | break; 286 | } 287 | } 288 | 289 | function wrap_setAttribute(name, value) { 290 | } 291 | function wrap_setAttributeNS(namespace, name, value) { 292 | } 293 | 294 | var extrudeDefaults = { 295 | amount: 1, 296 | bevelEnabled: false, 297 | material: 0, 298 | extrudeMaterial: 0, 299 | }; 300 | 301 | function commonSetAttribute(name, value) { 302 | switch (name) { 303 | case 'x': 304 | this.position.x = Math.floor(value * UNIT_SIZE); 305 | break; 306 | 307 | case 'y': 308 | this.position.y = Math.floor(value * UNIT_SIZE); 309 | break; 310 | 311 | case 'class': 312 | this.clazz = value; 313 | break; 314 | 315 | case 'stroke': 316 | case 'fill': 317 | if (typeof(value) !== 'string') 318 | value = value.toString(); 319 | this.material.color.setHex(parseInt(value.substring(1), 16)); 320 | break; 321 | 322 | case 'transform': 323 | applySVGTransform(this, value); 324 | break; 325 | 326 | case 'd': 327 | var shape = transformSVGPath(value), 328 | geom = shape.extrude(extrudeDefaults); 329 | this.geometry = geom; 330 | this.geometry.boundingSphere = {radius: 3 * UNIT_SIZE}; 331 | this.scale.set(UNIT_SIZE, UNIT_SIZE, UNIT_SIZE); 332 | 333 | break; 334 | 335 | default: 336 | throw new Error("no setter for: " + name); 337 | } 338 | } 339 | function commonSetAttributeNS(namespace, name, value) { 340 | this.setAttribute(name, value); 341 | } 342 | 343 | function Group(parentThing) { 344 | THREE.Object3D.call(this); 345 | 346 | this.d3class = ''; 347 | 348 | parentThing.add(this); 349 | }; 350 | Group.prototype = new THREE.Object3D(); 351 | Group.prototype.constructor = Group; 352 | Group.prototype.d3tag = 'g'; 353 | Group.prototype.setAttribute = commonSetAttribute; 354 | Group.prototype.setAttributeNS = commonSetAttributeNS; 355 | 356 | function fabGroup() { 357 | return new Group(this); 358 | } 359 | 360 | function Mesh(parentThing, tag, geometry, material) { 361 | THREE.Mesh.call(this, geometry, material); 362 | 363 | this.d3tag = tag; 364 | this.d3class = ''; 365 | 366 | parentThing.add(this); 367 | } 368 | Mesh.prototype = new THREE.Mesh(); 369 | Mesh.prototype.constructor = Mesh; 370 | Mesh.prototype.setAttribute = commonSetAttribute; 371 | Mesh.prototype.setAttributeNS = commonSetAttributeNS; 372 | 373 | 374 | const SPHERE_SEGS = 16, SPHERE_RINGS = 16, 375 | DEFAULT_COLOR = 0xcc0000; 376 | 377 | var sharedSphereGeom = null, 378 | sharedCubeGeom = null; 379 | 380 | function fabSphere() { 381 | if (!sharedSphereGeom) 382 | sharedSphereGeom = new THREE.SphereGeometry( 383 | UNIT_SIZE / 2, SPHERE_SEGS, SPHERE_RINGS); 384 | var material = new THREE.MeshLambertMaterial({ 385 | color: DEFAULT_COLOR, 386 | }); 387 | return new Mesh(this, 'sphere', sharedSphereGeom, material); 388 | } 389 | 390 | function fabCube() { 391 | if (!sharedCubeGeom) 392 | sharedCubeGeom = new THREE.CubeGeometry(UNIT_SIZE, UNIT_SIZE, UNIT_SIZE); 393 | var material = new THREE.MeshLambertMaterial({ 394 | color: DEFAULT_COLOR, 395 | }); 396 | return new Mesh(this, 'cube', sharedCubeGeom, material); 397 | } 398 | 399 | function fabPath() { 400 | // start with a cube that we will replace with the path once it gets created 401 | if (!sharedCubeGeom) 402 | sharedCubeGeom = new THREE.CubeGeometry(UNIT_SIZE, UNIT_SIZE, UNIT_SIZE); 403 | var material = new THREE.MeshLambertMaterial({ 404 | color: DEFAULT_COLOR, 405 | }); 406 | return new Mesh(this, 'path', sharedCubeGeom, material); 407 | } 408 | 409 | function Scene() { 410 | THREE.Scene.call(this); 411 | this.renderer = null; 412 | this.camera = null; 413 | this.controls = null; 414 | this._d3_width = null; 415 | this._d3_height = null; 416 | } 417 | Scene.prototype = new THREE.Scene(); 418 | Scene.prototype.constructor = Scene; 419 | Scene.prototype._setBounds = function() { 420 | this.renderer.setSize(this._d3_width, this._d3_height); 421 | var aspect = this.camera.aspect; 422 | this.camera.position.set( 423 | this._d3_width * UNIT_SIZE / 2, 424 | this._d3_height * UNIT_SIZE / 2, 425 | Math.max(this._d3_width * UNIT_SIZE / Math.sqrt(2), 426 | this._d3_height * UNIT_SIZE / Math.sqrt(2))); 427 | this.controls.target.set(this.camera.position.x, this.camera.position.y, 0); 428 | console.log("camera:", this.camera.position.x, this.camera.position.y, 429 | this.camera.position.z); 430 | 431 | 432 | 433 | //this.camera.position.z = 1000; 434 | }; 435 | Scene.prototype.setAttribute = function(name, value) { 436 | switch (name) { 437 | case 'width': 438 | this._d3_width = value; 439 | if (this._d3_height) 440 | this._setBounds(); 441 | break; 442 | case 'height': 443 | this._d3_height = value; 444 | if (this._d3_width) 445 | this._setBounds(); 446 | break; 447 | } 448 | }; 449 | 450 | function fabVis() { 451 | var camera, scene, controls, renderer; 452 | 453 | // - scene 454 | scene = new Scene(); 455 | 456 | // - camera 457 | camera = scene.camera = new THREE.PerspectiveCamera( 458 | 75, 459 | window.innerWidth / window.innerHeight, 460 | 1, 100000); 461 | /* 462 | camera = scene.camera = new THREE.OrthographicCamera( 463 | window.innerWidth / -2, window.innerWidth / 2, 464 | window.innerHeight / 2, window.innerHeight / -2, 465 | 1, 50000); 466 | */ 467 | scene.add(camera); 468 | 469 | // - controls 470 | // from misc_camera_trackball.html example 471 | controls = scene.controls = new THREE.TrackballControls(camera); 472 | controls.rotateSpeed = 1.0; 473 | controls.zoomSpeed = 1.2; 474 | controls.panSpeed = 0.8; 475 | 476 | controls.noZoom = false; 477 | controls.noPan = false; 478 | 479 | controls.staticMoving = true; 480 | controls.dynamicDampingFactor = 0.3; 481 | 482 | controls.keys = [65, 83, 68]; 483 | 484 | controls.addEventListener('change', render); 485 | 486 | // - light 487 | /* 488 | var pointLight = new THREE.PointLight(0xFFFFFF); 489 | pointLight.position.set(10, 50, 130); 490 | scene.add(pointLight); 491 | */ 492 | 493 | var spotlight = new THREE.SpotLight(0xffffff); 494 | spotlight.position.set(-50000, 50000, 100000); 495 | scene.add(spotlight); 496 | 497 | var backlight = new THREE.SpotLight(0x888888); 498 | backlight.position.set(50000, -50000, -100000); 499 | scene.add(backlight); 500 | 501 | /* 502 | var ambientLight = new THREE.AmbientLight(0x888888); 503 | scene.add(ambientLight); 504 | */ 505 | 506 | function helperPlanes(maxBound) { 507 | var geom = new THREE.PlaneGeometry(maxBound, maxBound, 4, 4); 508 | for (var i = 0; i < 4; i++) { 509 | var color, cx, cy; 510 | switch (i) { 511 | case 0: 512 | color = 0xff0000; 513 | cx = maxBound / 2; 514 | cy = maxBound / 2; 515 | break; 516 | case 1: 517 | color = 0x00ff00; 518 | cx = maxBound / 2; 519 | cy = -maxBound / 2; 520 | break; 521 | case 2: 522 | color = 0x0000ff; 523 | cx = -maxBound / 2; 524 | cy = -maxBound / 2; 525 | break; 526 | case 3: 527 | color = 0xffff00; 528 | cx = -maxBound / 2; 529 | cy = maxBound / 2; 530 | break; 531 | } 532 | var material = new THREE.MeshLambertMaterial({ color: color }); 533 | var mesh = new THREE.Mesh(geom, material); 534 | mesh.position.set(cx, cy, -1); 535 | scene.add(mesh); 536 | } 537 | } 538 | //helperPlanes(UNIT_SIZE * 225); 539 | 540 | // - renderer 541 | renderer = scene.renderer = new THREE.WebGLRenderer({ 542 | // too slow... 543 | //antialias: true, 544 | }); 545 | this.appendChild( renderer.domElement ); 546 | 547 | // - stats 548 | var stats = new Stats(); 549 | stats.domElement.style.position = 'absolute'; 550 | stats.domElement.style.top = '0px'; 551 | stats.domElement.style.zIndex = 100; 552 | this.appendChild( stats.domElement ); 553 | 554 | function animate() { 555 | requestAnimationFrame(animate, renderer.domElement); 556 | controls.update(); 557 | } 558 | 559 | function render() { 560 | renderer.render(scene, camera); 561 | stats.update(); 562 | } 563 | 564 | animate(); 565 | 566 | return scene; 567 | }; 568 | 569 | 570 | d3.selection.prototype.append3d = function(name) { 571 | var append; 572 | switch (name) { 573 | case 'svg': 574 | append = fabVis; 575 | break; 576 | 577 | case 'g': 578 | append = fabGroup; 579 | break; 580 | 581 | case 'path': 582 | append = fabPath; 583 | break; 584 | 585 | case 'text': 586 | case 'line': 587 | case 'rect': 588 | throw new Error("Did not implement: " + name); 589 | break; 590 | 591 | case 'sphere': 592 | append = fabSphere; 593 | break; 594 | } 595 | 596 | return this.select(append); 597 | }; 598 | d3.selection.enter.prototype.append3d = d3.selection.prototype.append3d; 599 | 600 | function select3d_selector(constraint) { 601 | var tagCheck = null, classCheck = null, 602 | idxPeriod = constraint.indexOf('.'); 603 | if (idxPeriod === -1) { 604 | tagCheck = constraint; 605 | } 606 | else if (idxPeriod === 0) { 607 | classCheck = constraint.substring(1); 608 | } 609 | else { 610 | tagCheck = constraint.substring(0, idxPeriod); 611 | classCheck = constraint.substring(idxPeriod + 1); 612 | } 613 | return function() { 614 | var results = []; 615 | for (var i = 0; i < this.children.length; i++) { 616 | var kid = this.children[i]; 617 | if ((!tagCheck || kid.d3tag === tagCheck) && 618 | (!classCheck || kid.d3class === classCheck)) 619 | results.push(kid); 620 | } 621 | return results; 622 | }; 623 | } 624 | 625 | d3.selection.prototype.select3d = function(constraint) { 626 | return this.select(select3d_selector(constraint)); 627 | }; 628 | d3.selection.prototype.selectAll3d = function(constraint) { 629 | return this.selectAll(select3d_selector(constraint)); 630 | }; 631 | 632 | window.transformSVGPath = transformSVGPath; 633 | } 634 | 635 | var $d3g = {}; 636 | d3threeD($d3g); 637 | -------------------------------------------------------------------------------- /vendor/topojson.js: -------------------------------------------------------------------------------- 1 | !function() { 2 | var topojson = { 3 | version: "1.6.18", 4 | mesh: function(topology) { return object(topology, meshArcs.apply(this, arguments)); }, 5 | meshArcs: meshArcs, 6 | merge: function(topology) { return object(topology, mergeArcs.apply(this, arguments)); }, 7 | mergeArcs: mergeArcs, 8 | feature: featureOrCollection, 9 | neighbors: neighbors, 10 | presimplify: presimplify 11 | }; 12 | 13 | function stitchArcs(topology, arcs) { 14 | var stitchedArcs = {}, 15 | fragmentByStart = {}, 16 | fragmentByEnd = {}, 17 | fragments = [], 18 | emptyIndex = -1; 19 | 20 | // Stitch empty arcs first, since they may be subsumed by other arcs. 21 | arcs.forEach(function(i, j) { 22 | var arc = topology.arcs[i < 0 ? ~i : i], t; 23 | if (arc.length < 3 && !arc[1][0] && !arc[1][1]) { 24 | t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t; 25 | } 26 | }); 27 | 28 | arcs.forEach(function(i) { 29 | var e = ends(i), 30 | start = e[0], 31 | end = e[1], 32 | f, g; 33 | 34 | if (f = fragmentByEnd[start]) { 35 | delete fragmentByEnd[f.end]; 36 | f.push(i); 37 | f.end = end; 38 | if (g = fragmentByStart[end]) { 39 | delete fragmentByStart[g.start]; 40 | var fg = g === f ? f : f.concat(g); 41 | fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg; 42 | } else { 43 | fragmentByStart[f.start] = fragmentByEnd[f.end] = f; 44 | } 45 | } else if (f = fragmentByStart[end]) { 46 | delete fragmentByStart[f.start]; 47 | f.unshift(i); 48 | f.start = start; 49 | if (g = fragmentByEnd[start]) { 50 | delete fragmentByEnd[g.end]; 51 | var gf = g === f ? f : g.concat(f); 52 | fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf; 53 | } else { 54 | fragmentByStart[f.start] = fragmentByEnd[f.end] = f; 55 | } 56 | } else { 57 | f = [i]; 58 | fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f; 59 | } 60 | }); 61 | 62 | function ends(i) { 63 | var arc = topology.arcs[i < 0 ? ~i : i], p0 = arc[0], p1; 64 | if (topology.transform) p1 = [0, 0], arc.forEach(function(dp) { p1[0] += dp[0], p1[1] += dp[1]; }); 65 | else p1 = arc[arc.length - 1]; 66 | return i < 0 ? [p1, p0] : [p0, p1]; 67 | } 68 | 69 | function flush(fragmentByEnd, fragmentByStart) { 70 | for (var k in fragmentByEnd) { 71 | var f = fragmentByEnd[k]; 72 | delete fragmentByStart[f.start]; 73 | delete f.start; 74 | delete f.end; 75 | f.forEach(function(i) { stitchedArcs[i < 0 ? ~i : i] = 1; }); 76 | fragments.push(f); 77 | } 78 | } 79 | 80 | flush(fragmentByEnd, fragmentByStart); 81 | flush(fragmentByStart, fragmentByEnd); 82 | arcs.forEach(function(i) { if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([i]); }); 83 | 84 | return fragments; 85 | } 86 | 87 | function meshArcs(topology, o, filter) { 88 | var arcs = []; 89 | 90 | if (arguments.length > 1) { 91 | var geomsByArc = [], 92 | geom; 93 | 94 | function arc(i) { 95 | var j = i < 0 ? ~i : i; 96 | (geomsByArc[j] || (geomsByArc[j] = [])).push({i: i, g: geom}); 97 | } 98 | 99 | function line(arcs) { 100 | arcs.forEach(arc); 101 | } 102 | 103 | function polygon(arcs) { 104 | arcs.forEach(line); 105 | } 106 | 107 | function geometry(o) { 108 | if (o.type === "GeometryCollection") o.geometries.forEach(geometry); 109 | else if (o.type in geometryType) geom = o, geometryType[o.type](o.arcs); 110 | } 111 | 112 | var geometryType = { 113 | LineString: line, 114 | MultiLineString: polygon, 115 | Polygon: polygon, 116 | MultiPolygon: function(arcs) { arcs.forEach(polygon); } 117 | }; 118 | 119 | geometry(o); 120 | 121 | geomsByArc.forEach(arguments.length < 3 122 | ? function(geoms) { arcs.push(geoms[0].i); } 123 | : function(geoms) { if (filter(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i); }); 124 | } else { 125 | for (var i = 0, n = topology.arcs.length; i < n; ++i) arcs.push(i); 126 | } 127 | 128 | return {type: "MultiLineString", arcs: stitchArcs(topology, arcs)}; 129 | } 130 | 131 | function mergeArcs(topology, objects) { 132 | var polygonsByArc = {}, 133 | polygons = [], 134 | components = []; 135 | 136 | objects.forEach(function(o) { 137 | if (o.type === "Polygon") register(o.arcs); 138 | else if (o.type === "MultiPolygon") o.arcs.forEach(register); 139 | }); 140 | 141 | function register(polygon) { 142 | polygon.forEach(function(ring) { 143 | ring.forEach(function(arc) { 144 | (polygonsByArc[arc = arc < 0 ? ~arc : arc] || (polygonsByArc[arc] = [])).push(polygon); 145 | }); 146 | }); 147 | polygons.push(polygon); 148 | } 149 | 150 | function exterior(ring) { 151 | return cartesianRingArea(object(topology, {type: "Polygon", arcs: [ring]}).coordinates[0]) > 0; // TODO allow spherical? 152 | } 153 | 154 | polygons.forEach(function(polygon) { 155 | if (!polygon._) { 156 | var component = [], 157 | neighbors = [polygon]; 158 | polygon._ = 1; 159 | components.push(component); 160 | while (polygon = neighbors.pop()) { 161 | component.push(polygon); 162 | polygon.forEach(function(ring) { 163 | ring.forEach(function(arc) { 164 | polygonsByArc[arc < 0 ? ~arc : arc].forEach(function(polygon) { 165 | if (!polygon._) { 166 | polygon._ = 1; 167 | neighbors.push(polygon); 168 | } 169 | }); 170 | }); 171 | }); 172 | } 173 | } 174 | }); 175 | 176 | polygons.forEach(function(polygon) { 177 | delete polygon._; 178 | }); 179 | 180 | return { 181 | type: "MultiPolygon", 182 | arcs: components.map(function(polygons) { 183 | var arcs = []; 184 | 185 | // Extract the exterior (unique) arcs. 186 | polygons.forEach(function(polygon) { 187 | polygon.forEach(function(ring) { 188 | ring.forEach(function(arc) { 189 | if (polygonsByArc[arc < 0 ? ~arc : arc].length < 2) { 190 | arcs.push(arc); 191 | } 192 | }); 193 | }); 194 | }); 195 | 196 | // Stitch the arcs into one or more rings. 197 | arcs = stitchArcs(topology, arcs); 198 | 199 | // If more than one ring is returned, 200 | // at most one of these rings can be the exterior; 201 | // this exterior ring has the same winding order 202 | // as any exterior ring in the original polygons. 203 | if ((n = arcs.length) > 1) { 204 | var sgn = exterior(polygons[0][0]); 205 | for (var i = 0, t; i < n; ++i) { 206 | if (sgn === exterior(arcs[i])) { 207 | t = arcs[0], arcs[0] = arcs[i], arcs[i] = t; 208 | break; 209 | } 210 | } 211 | } 212 | 213 | return arcs; 214 | }) 215 | }; 216 | } 217 | 218 | function featureOrCollection(topology, o) { 219 | return o.type === "GeometryCollection" ? { 220 | type: "FeatureCollection", 221 | features: o.geometries.map(function(o) { return feature(topology, o); }) 222 | } : feature(topology, o); 223 | } 224 | 225 | function feature(topology, o) { 226 | var f = { 227 | type: "Feature", 228 | id: o.id, 229 | properties: o.properties || {}, 230 | geometry: object(topology, o) 231 | }; 232 | if (o.id == null) delete f.id; 233 | return f; 234 | } 235 | 236 | function object(topology, o) { 237 | var absolute = transformAbsolute(topology.transform), 238 | arcs = topology.arcs; 239 | 240 | function arc(i, points) { 241 | if (points.length) points.pop(); 242 | for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length, p; k < n; ++k) { 243 | points.push(p = a[k].slice()); 244 | absolute(p, k); 245 | } 246 | if (i < 0) reverse(points, n); 247 | } 248 | 249 | function point(p) { 250 | p = p.slice(); 251 | absolute(p, 0); 252 | return p; 253 | } 254 | 255 | function line(arcs) { 256 | var points = []; 257 | for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points); 258 | if (points.length < 2) points.push(points[0].slice()); 259 | return points; 260 | } 261 | 262 | function ring(arcs) { 263 | var points = line(arcs); 264 | while (points.length < 4) points.push(points[0].slice()); 265 | return points; 266 | } 267 | 268 | function polygon(arcs) { 269 | return arcs.map(ring); 270 | } 271 | 272 | function geometry(o) { 273 | var t = o.type; 274 | return t === "GeometryCollection" ? {type: t, geometries: o.geometries.map(geometry)} 275 | : t in geometryType ? {type: t, coordinates: geometryType[t](o)} 276 | : null; 277 | } 278 | 279 | var geometryType = { 280 | Point: function(o) { return point(o.coordinates); }, 281 | MultiPoint: function(o) { return o.coordinates.map(point); }, 282 | LineString: function(o) { return line(o.arcs); }, 283 | MultiLineString: function(o) { return o.arcs.map(line); }, 284 | Polygon: function(o) { return polygon(o.arcs); }, 285 | MultiPolygon: function(o) { return o.arcs.map(polygon); } 286 | }; 287 | 288 | return geometry(o); 289 | } 290 | 291 | function reverse(array, n) { 292 | var t, j = array.length, i = j - n; while (i < --j) t = array[i], array[i++] = array[j], array[j] = t; 293 | } 294 | 295 | function bisect(a, x) { 296 | var lo = 0, hi = a.length; 297 | while (lo < hi) { 298 | var mid = lo + hi >>> 1; 299 | if (a[mid] < x) lo = mid + 1; 300 | else hi = mid; 301 | } 302 | return lo; 303 | } 304 | 305 | function neighbors(objects) { 306 | var indexesByArc = {}, // arc index -> array of object indexes 307 | neighbors = objects.map(function() { return []; }); 308 | 309 | function line(arcs, i) { 310 | arcs.forEach(function(a) { 311 | if (a < 0) a = ~a; 312 | var o = indexesByArc[a]; 313 | if (o) o.push(i); 314 | else indexesByArc[a] = [i]; 315 | }); 316 | } 317 | 318 | function polygon(arcs, i) { 319 | arcs.forEach(function(arc) { line(arc, i); }); 320 | } 321 | 322 | function geometry(o, i) { 323 | if (o.type === "GeometryCollection") o.geometries.forEach(function(o) { geometry(o, i); }); 324 | else if (o.type in geometryType) geometryType[o.type](o.arcs, i); 325 | } 326 | 327 | var geometryType = { 328 | LineString: line, 329 | MultiLineString: polygon, 330 | Polygon: polygon, 331 | MultiPolygon: function(arcs, i) { arcs.forEach(function(arc) { polygon(arc, i); }); } 332 | }; 333 | 334 | objects.forEach(geometry); 335 | 336 | for (var i in indexesByArc) { 337 | for (var indexes = indexesByArc[i], m = indexes.length, j = 0; j < m; ++j) { 338 | for (var k = j + 1; k < m; ++k) { 339 | var ij = indexes[j], ik = indexes[k], n; 340 | if ((n = neighbors[ij])[i = bisect(n, ik)] !== ik) n.splice(i, 0, ik); 341 | if ((n = neighbors[ik])[i = bisect(n, ij)] !== ij) n.splice(i, 0, ij); 342 | } 343 | } 344 | } 345 | 346 | return neighbors; 347 | } 348 | 349 | function presimplify(topology, triangleArea) { 350 | var absolute = transformAbsolute(topology.transform), 351 | relative = transformRelative(topology.transform), 352 | heap = minAreaHeap(); 353 | 354 | if (!triangleArea) triangleArea = cartesianTriangleArea; 355 | 356 | topology.arcs.forEach(function(arc) { 357 | var triangles = [], 358 | maxArea = 0, 359 | triangle; 360 | 361 | // To store each point’s effective area, we create a new array rather than 362 | // extending the passed-in point to workaround a Chrome/V8 bug (getting 363 | // stuck in smi mode). For midpoints, the initial effective area of 364 | // Infinity will be computed in the next step. 365 | for (var i = 0, n = arc.length, p; i < n; ++i) { 366 | p = arc[i]; 367 | absolute(arc[i] = [p[0], p[1], Infinity], i); 368 | } 369 | 370 | for (var i = 1, n = arc.length - 1; i < n; ++i) { 371 | triangle = arc.slice(i - 1, i + 2); 372 | triangle[1][2] = triangleArea(triangle); 373 | triangles.push(triangle); 374 | heap.push(triangle); 375 | } 376 | 377 | for (var i = 0, n = triangles.length; i < n; ++i) { 378 | triangle = triangles[i]; 379 | triangle.previous = triangles[i - 1]; 380 | triangle.next = triangles[i + 1]; 381 | } 382 | 383 | while (triangle = heap.pop()) { 384 | var previous = triangle.previous, 385 | next = triangle.next; 386 | 387 | // If the area of the current point is less than that of the previous point 388 | // to be eliminated, use the latter's area instead. This ensures that the 389 | // current point cannot be eliminated without eliminating previously- 390 | // eliminated points. 391 | if (triangle[1][2] < maxArea) triangle[1][2] = maxArea; 392 | else maxArea = triangle[1][2]; 393 | 394 | if (previous) { 395 | previous.next = next; 396 | previous[2] = triangle[2]; 397 | update(previous); 398 | } 399 | 400 | if (next) { 401 | next.previous = previous; 402 | next[0] = triangle[0]; 403 | update(next); 404 | } 405 | } 406 | 407 | arc.forEach(relative); 408 | }); 409 | 410 | function update(triangle) { 411 | heap.remove(triangle); 412 | triangle[1][2] = triangleArea(triangle); 413 | heap.push(triangle); 414 | } 415 | 416 | return topology; 417 | }; 418 | 419 | function cartesianRingArea(ring) { 420 | var i = -1, 421 | n = ring.length, 422 | a, 423 | b = ring[n - 1], 424 | area = 0; 425 | 426 | while (++i < n) { 427 | a = b; 428 | b = ring[i]; 429 | area += a[0] * b[1] - a[1] * b[0]; 430 | } 431 | 432 | return area * .5; 433 | } 434 | 435 | function cartesianTriangleArea(triangle) { 436 | var a = triangle[0], b = triangle[1], c = triangle[2]; 437 | return Math.abs((a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1])); 438 | } 439 | 440 | function compareArea(a, b) { 441 | return a[1][2] - b[1][2]; 442 | } 443 | 444 | function minAreaHeap() { 445 | var heap = {}, 446 | array = [], 447 | size = 0; 448 | 449 | heap.push = function(object) { 450 | up(array[object._ = size] = object, size++); 451 | return size; 452 | }; 453 | 454 | heap.pop = function() { 455 | if (size <= 0) return; 456 | var removed = array[0], object; 457 | if (--size > 0) object = array[size], down(array[object._ = 0] = object, 0); 458 | return removed; 459 | }; 460 | 461 | heap.remove = function(removed) { 462 | var i = removed._, object; 463 | if (array[i] !== removed) return; // invalid request 464 | if (i !== --size) object = array[size], (compareArea(object, removed) < 0 ? up : down)(array[object._ = i] = object, i); 465 | return i; 466 | }; 467 | 468 | function up(object, i) { 469 | while (i > 0) { 470 | var j = ((i + 1) >> 1) - 1, 471 | parent = array[j]; 472 | if (compareArea(object, parent) >= 0) break; 473 | array[parent._ = i] = parent; 474 | array[object._ = i = j] = object; 475 | } 476 | } 477 | 478 | function down(object, i) { 479 | while (true) { 480 | var r = (i + 1) << 1, 481 | l = r - 1, 482 | j = i, 483 | child = array[j]; 484 | if (l < size && compareArea(array[l], child) < 0) child = array[j = l]; 485 | if (r < size && compareArea(array[r], child) < 0) child = array[j = r]; 486 | if (j === i) break; 487 | array[child._ = i] = child; 488 | array[object._ = i = j] = object; 489 | } 490 | } 491 | 492 | return heap; 493 | } 494 | 495 | function transformAbsolute(transform) { 496 | if (!transform) return noop; 497 | var x0, 498 | y0, 499 | kx = transform.scale[0], 500 | ky = transform.scale[1], 501 | dx = transform.translate[0], 502 | dy = transform.translate[1]; 503 | return function(point, i) { 504 | if (!i) x0 = y0 = 0; 505 | point[0] = (x0 += point[0]) * kx + dx; 506 | point[1] = (y0 += point[1]) * ky + dy; 507 | }; 508 | } 509 | 510 | function transformRelative(transform) { 511 | if (!transform) return noop; 512 | var x0, 513 | y0, 514 | kx = transform.scale[0], 515 | ky = transform.scale[1], 516 | dx = transform.translate[0], 517 | dy = transform.translate[1]; 518 | return function(point, i) { 519 | if (!i) x0 = y0 = 0; 520 | var x1 = (point[0] - dx) / kx | 0, 521 | y1 = (point[1] - dy) / ky | 0; 522 | point[0] = x1 - x0; 523 | point[1] = y1 - y0; 524 | x0 = x1; 525 | y0 = y1; 526 | }; 527 | } 528 | 529 | function noop() {} 530 | 531 | if (typeof define === "function" && define.amd) define(topojson); 532 | else if (typeof module === "object" && module.exports) module.exports = topojson; 533 | else this.topojson = topojson; 534 | }(); 535 | --------------------------------------------------------------------------------