├── .gitignore ├── index.js ├── public ├── maptail-dot.png ├── maptail-marker.png ├── index.html ├── maptail.css ├── maptail.js ├── china-map.js └── global-map.js ├── dummy.js ├── dummy-extreme.js ├── package.json ├── maptail-LICENSE ├── examples ├── standalone.js └── extreme-traffic.js ├── README.md ├── other-LICENCE ├── bin └── maptail └── lib └── maptail.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dummy-log 3 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./lib/maptail') 2 | -------------------------------------------------------------------------------- /public/maptail-dot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiangwang/maptail/HEAD/public/maptail-dot.png -------------------------------------------------------------------------------- /public/maptail-marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qiangwang/maptail/HEAD/public/maptail-marker.png -------------------------------------------------------------------------------- /dummy.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs') 2 | var colors = require('colors') 3 | var file = fs.createWriteStream('dummy-log') 4 | 5 | function rand () { 6 | return Math.floor(Math.random() * 256) 7 | } 8 | 9 | var i = 0 10 | setInterval(function () { 11 | if (Math.random() * 10 < 1) file.write((i++) + 'gibb'.red + 'er'.yellow + 'ish '.green + [0,0,0,0].map(rand).join('.') + ' more'.cyan + ' gibb'.magenta + 'erish'.blue + '\r\n') 12 | else if (Math.random() * 10 > 9.8) file.write((i++) + ' more gibberish with no ip\n') 13 | }, 20) 14 | -------------------------------------------------------------------------------- /dummy-extreme.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs') 2 | var colors = require('colors') 3 | var file = fs.createWriteStream('dummy-log') 4 | 5 | function rand () { 6 | return Math.floor(Math.random() * 256) 7 | } 8 | 9 | var i = 0 10 | setInterval(function () { 11 | if (Math.random() * 10 < 5) file.write((i++) + 'gibb'.red + 'er'.yellow + 'ish '.green + [0,0,0,0].map(rand).join('.') + ' more'.cyan + ' gibb'.magenta + 'erish'.blue + '\r\n') 12 | else if (Math.random() * 10 > 9) file.write((i++) + ' more gibberish with no ip\n') 13 | }, 10) 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "George Stagas (http://stagas.com)", 3 | "name": "maptail", 4 | "description": "maptail is a realtime map view of GeoIP data", 5 | "version": "0.1.10", 6 | "repository": { 7 | "url": "git://github.com/stagas/maptail.git" 8 | }, 9 | "bin": { 10 | "maptail": "./bin/maptail" 11 | }, 12 | "main": "./index.js", 13 | "engines": { 14 | "node": "~0.6.8" 15 | }, 16 | "dependencies": { 17 | "express": "~2.5.8", 18 | "simpl": "~0.4.0", 19 | "geoip-lite": "~1.1.6" 20 | }, 21 | "devDependencies": { 22 | "colors": "*" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | maptail 11 | 12 | 13 |
14 |

用户实时访问分布

15 | 16 |
访问/分钟
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /maptail-LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012 George Stagakis 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /examples/standalone.js: -------------------------------------------------------------------------------- 1 | var colors = require('colors') 2 | var maptail = require('../') 3 | var express = require('express') 4 | var app = express.createServer() 5 | 6 | app.use(maptail.track()) 7 | app.use(maptail.static()) 8 | 9 | maptail.attach(app) 10 | 11 | app.listen(8080, 'localhost') 12 | 13 | // generate dummy data 14 | 15 | function rand () { 16 | return Math.floor(Math.random() * 256) 17 | } 18 | 19 | var all = [] 20 | var paths = [ 'home', 'articles', 'img', 'js', 'css' ] 21 | var subpaths = [ 'foo', 'bar', 'foobar' ] 22 | for (var i = paths.length; i--;) 23 | for (var n = subpaths.length; n--;) 24 | for (var x = 3; x--;) 25 | all.push('/' + paths[i] + '/' + subpaths[n] + '/' + Math.floor(Math.random() * Date.now()).toString(36).substr(0, 4)) 26 | var ips = [] 27 | for (var i = 10; i--;) { 28 | ips.push([0,0,0,0].map(rand).join('.')) 29 | } 30 | 31 | var n = 0 32 | ;(function emitRandomIP () { 33 | if (Math.random() * 10 < 3) { 34 | ips.push([0,0,0,0].map(rand).join('.')) 35 | if (ips.length > 500) ips.shift() 36 | var ip = ips[Math.floor(Math.random() * (ips.length * 0.7))] 37 | for (var i = Math.floor(Math.random() * 10) + 1; i--;) { 38 | setTimeout(function () { 39 | maptail.emit('ip' 40 | , ip 41 | , ip.white + ' ' 42 | + all[Math.floor(Math.random() * all.length)] + ' ' 43 | + 'log line '.yellow 44 | + 'log line '.red 45 | ) 46 | }, Math.floor(Math.random() * 500)) 47 | } 48 | } 49 | setTimeout(emitRandomIP, Math.floor(Math.random() * 600) + 20) 50 | }()); 51 | 52 | maptail.config.onlyLookups = true 53 | maptail.config.bufferTime = 3000 54 | -------------------------------------------------------------------------------- /examples/extreme-traffic.js: -------------------------------------------------------------------------------- 1 | var colors = require('colors') 2 | var maptail = require('../') 3 | var express = require('express') 4 | var app = express.createServer() 5 | 6 | app.use(maptail.track()) 7 | app.use(maptail.static()) 8 | 9 | maptail.attach(app) 10 | 11 | app.listen(8080, 'localhost') 12 | 13 | // generate dummy data 14 | 15 | function rand () { 16 | return Math.floor(Math.random() * 256) 17 | } 18 | 19 | var all = [] 20 | var paths = [ 'home', 'articles', 'img', 'js', 'css' ] 21 | var subpaths = [ 'foo', 'bar', 'foobar' ] 22 | for (var i = paths.length; i--;) 23 | for (var n = subpaths.length; n--;) 24 | for (var x = 3; x--;) 25 | all.push('/' + paths[i] + '/' + subpaths[n] + '/' + Math.floor(Math.random() * Date.now()).toString(36).substr(0, 4)) 26 | var ips = [] 27 | for (var i = 10; i--;) { 28 | ips.push([0,0,0,0].map(rand).join('.')) 29 | } 30 | 31 | var n = 0 32 | ;(function emitRandomIP () { 33 | if (Math.random() * 10 < 7) { 34 | ips.push([0,0,0,0].map(rand).join('.')) 35 | if (ips.length > 500) ips.shift() 36 | var ip = ips[Math.floor(Math.random() * (ips.length * 0.7))] 37 | for (var i = Math.floor(Math.random() * 10) + 1; i--;) { 38 | setTimeout(function () { 39 | maptail.emit('ip' 40 | , ip 41 | , ip.white + ' ' 42 | + all[Math.floor(Math.random() * all.length)] + ' ' 43 | + 'log line '.yellow 44 | + 'log line '.red 45 | ) 46 | }, Math.floor(Math.random() * 500)) 47 | } 48 | } 49 | setTimeout(emitRandomIP, Math.floor(Math.random() * 300) + 20) 50 | }()); 51 | 52 | maptail.config.onlyLookups = true 53 | maptail.config.bufferTime = 3000 54 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # maptail 2 | 3 | 4 | 5 | 6 | 7 | maptail is a realtime map view of GeoIP data. Attach it to your server to track visitors, tail a log, pipe to its stdin or use it as a library to build your own implementation. Just emit IP addresses to it from any source and you'll automagically get a cool map with yellow dots and stuff like that streamed in with websockets or whatever transport you'd like to use. 8 | 9 | ## Installing 10 | 11 | `npm install maptail -g` 12 | 13 | Omit the `-g` to install as a module. 14 | 15 | ## How to use 16 | 17 | ### The command line tool: 18 | 19 | `$ maptail -f nohup.out` 20 | 21 | `$ tail -f nohup.out | maptail -h my.host.com -p 3000` 22 | 23 | ### In your server: 24 | 25 | ```javascript 26 | var maptail = require('maptail') 27 | var express = require('express') 28 | var app = express.createServer() 29 | 30 | app.use(maptail.track()) 31 | app.use('/map', maptail.static()) 32 | 33 | maptail.attach(app) 34 | 35 | app.listen(8080, 'localhost') 36 | ``` 37 | 38 | Let me explain what these are doing here a bit. `maptail.track()` tracks visitors' IPs and emits them to maptail. `maptail.static()` is an `express.static()` middleware that points to our static data (maptail.html, css, etc.) 39 | 40 | `maptail.attach(app)` attaches a [simpl](https://github.com/stagas/simpl) WebSocket server which makes it possible for our frontend app to easily subscribe to the GeoIP data events sent by maptail and display them on the map. 41 | 42 | If for example you don't want to track visitors of the http server but instead you want to send IPs from another source, you can easily remove `maptail.track()` from the middleware and use `maptail.emit('ip', ipAddress[, logMessage])` to feed our map. It will take care the rest for you. 43 | 44 | ## Credits 45 | 46 | This is based on [mape](https://github.com/mape)'s [wargames](https://github.com/mape/node-wargames). 47 | 48 | [geoip-lite](https://github.com/bluesmoon/node-geoip) by [Philip Tellis](https://github.com/bluesmoon). 49 | 50 | Earlier versions used [kuno](https://github.com/kuno)'s [GeoIP](https://github.com/kuno/GeoIP) module but since it now uses a C library, I couldn't use it. 51 | 52 | [MaxMind](http://www.maxmind.com/) for their free to use GeoIP data. 53 | 54 | ## Licence 55 | 56 | maptail is MIT/X11. The rest of the components are of their respective licences. 57 | -------------------------------------------------------------------------------- /other-LICENCE: -------------------------------------------------------------------------------- 1 | There are two licenses, one for the software library, and one for the data. 2 | 3 | This product includes GeoLite data created by MaxMind, available from http://maxmind.com/ 4 | 5 | SOFTWARE LICENSE (Node JS library) 6 | 7 | The node-geoip JavaScript library is licensed under the Apache License, Version 2.0: 8 | 9 | Copyright 2011 Philip Tellis 10 | 11 | Licensed under the Apache License, Version 2.0 (the "License"); 12 | you may not use this file except in compliance with the License. 13 | You may obtain a copy of the License at 14 | 15 | http://www.apache.org/licenses/LICENSE-2.0 16 | 17 | Unless required by applicable law or agreed to in writing, software 18 | distributed under the License is distributed on an "AS IS" BASIS, 19 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 20 | See the License for the specific language governing permissions and 21 | limitations under the License. 22 | 23 | 24 | OPEN DATA LICENSE (GeoLite Country database) 25 | 26 | Copyright (c) 2008 MaxMind, Inc. All Rights Reserved. 27 | 28 | All advertising materials and documentation mentioning features or use of 29 | this database must display the following acknowledgment: 30 | "This product includes GeoLite data created by MaxMind, available from 31 | http://maxmind.com/" 32 | 33 | Redistribution and use with or without modification, are permitted provided 34 | that the following conditions are met: 35 | 1. Redistributions must retain the above copyright notice, this list of 36 | conditions and the following disclaimer in the documentation and/or other 37 | materials provided with the distribution. 38 | 2. All advertising materials and documentation mentioning features or use of 39 | this database must display the following acknowledgement: 40 | "This product includes GeoLite data created by MaxMind, available from 41 | http://maxmind.com/" 42 | 3. "MaxMind" may not be used to endorse or promote products derived from this 43 | database without specific prior written permission. 44 | 45 | THIS DATABASE IS PROVIDED BY MAXMIND, INC ``AS IS'' AND ANY 46 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 47 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 48 | DISCLAIMED. IN NO EVENT SHALL MAXMIND BE LIABLE FOR ANY 49 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 50 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 51 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 52 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 53 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 54 | DATABASE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /bin/maptail: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var help = '\nusage: maptail [-f filename] [-h host] [-p port] [options...]\n\n' 4 | + ' --maxdots ..... maximum number of dots to display on screen [50]\n' 5 | + ' --ttl ........ marker initial time to live [15]\n' 6 | + ' --maxage ..... maximum time which one is considered a visitor [300]\n' 7 | + ' --buffer .......... buffer in ms [250]' 8 | + ' --fps ............ how fast do the markers age [60]' 9 | + ' --quiet ................ don\'t proxy to stdout\n' 10 | 11 | var spawn = require('child_process').spawn 12 | var maptail = require('../') 13 | var express = require('express') 14 | 15 | var config = { 16 | host: 'localhost' 17 | , port: 8080 18 | } 19 | 20 | var arg, args = process.argv.slice(2), spawnArgs = [] 21 | while (arg = args.shift()) { 22 | if (arg == '-h' || arg == '--host') config.host = args.shift() 23 | else if (arg == '-p' || arg == '--port') config.port = parseInt(args.shift(), 10) 24 | else if (arg == '--help') console.log(help), process.exit() 25 | else if (arg == '--quiet') config.quiet = true 26 | else if (arg == '--max-dots' || arg == '--maxdots') maptail.config.maxDots = parseInt(args.shift(), 10) 27 | else if (arg == '--decay' || arg == '--ttl') maptail.config.ttl = parseInt(args.shift(), 10) 28 | else if (arg == '--max-age' || arg == '--maxage') maptail.config.maxAge = parseInt(args.shift(), 10) 29 | else if (arg == '--fps') maptail.config.fps = 1000 / parseInt(args.shift(), 10) 30 | else if (arg == '--buffer') maptail.config.bufferTime = parseInt(args.shift(), 10) 31 | else spawnArgs.push(arg) 32 | } 33 | 34 | var app = express.createServer() 35 | 36 | app.use(maptail.static()) 37 | 38 | maptail.attach(app) 39 | 40 | app.listen(config.port, config.host, function () { 41 | if (!config.quiet) console.log('* started http://' + config.host + ':' + config.port + '/') 42 | }) 43 | 44 | var tail 45 | if (~spawnArgs.indexOf('-f')) { 46 | if (!config.quiet) console.log('* tailing:', spawnArgs[spawnArgs.indexOf('-f') + 1]) 47 | tail = spawn('tail', spawnArgs).stdout 48 | } 49 | else { 50 | console.log('* tailing stdin') 51 | process.stdin.resume() 52 | tail = process.stdin 53 | } 54 | 55 | var lines = '' 56 | 57 | tail.setEncoding('utf8') 58 | tail.on('data', function (data) { 59 | if (!config.quiet) process.stdout.write(data) 60 | lines += data 61 | lines = lines.replace(/([^\r\n]+|[^\n]+)[\r\n|\n]+/g, function (m, line) { 62 | var ips = ( 63 | line.match(/(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/gm) 64 | || [] 65 | ).filter(function(ip) { 66 | return ip 67 | .split('.') 68 | .filter(function (el) { return el < 10 }) 69 | .length < 3 70 | }) 71 | if (ips.length) { 72 | ips.forEach(function (ip) { 73 | maptail.emit('ip', ip, line) 74 | }) 75 | } else { 76 | maptail.emit('ip', null, line) 77 | } 78 | return '' 79 | }) 80 | }) 81 | -------------------------------------------------------------------------------- /lib/maptail.js: -------------------------------------------------------------------------------- 1 | var EventEmitter = require('events').EventEmitter 2 | var geoip = require('geoip-lite') 3 | 4 | var maptail = exports = module.exports = new EventEmitter 5 | 6 | maptail.config = { 7 | // maximum history items 8 | historyMax: 50 9 | 10 | // maximum markers to buffer 11 | , bufferMax: 50 12 | 13 | // buffer time in milliseconds 14 | , bufferTime: 1000 15 | 16 | // markers' initial time to live in seconds 17 | , ttl: 100 // seconds 18 | 19 | // maximum dots to be displayed (this adjusts ttl automatically) 20 | , maxDots: 200 21 | 22 | // report visitors up to that age 23 | , maxAge: 240 // seconds 24 | 25 | // only emit ips with geo data 26 | , onlyLookups: false 27 | 28 | // aging repaint in fps 29 | , fps: 120 30 | } 31 | 32 | maptail.history = [] 33 | maptail.buffer = [] 34 | 35 | maptail.on('ip', function (ip, message) { 36 | var geo = ip && maptail.lookup(ip) || {} 37 | delete geo.range 38 | delete geo.region 39 | geo.ip = ip 40 | geo.date = Date.now() 41 | if (message) geo.message = message 42 | if (!maptail.config.onlyLookups || geo.ll) maptail.emit('geoip', geo) 43 | }) 44 | 45 | maptail.lookup = function (ip) { 46 | return geoip.lookup(ip) 47 | } 48 | 49 | maptail.track = function () { 50 | return function (req, res, next) { 51 | // get real ip address 52 | var ip = 53 | req.headers['ip'] 54 | || req.headers['x-forwarded-for'] 55 | || req.headers['x-real-ip'] 56 | || req.headers['x-ip'] 57 | || req.connection.remoteAddress 58 | maptail.emit('ip', ip) 59 | next() 60 | } 61 | } 62 | 63 | maptail.static = function (opts) { 64 | var express = require('express') 65 | return express.static(__dirname + '/../public') 66 | } 67 | 68 | maptail.attach = function (app) { 69 | var users = { 70 | list: [] 71 | , has: function (socket) { 72 | return !!~this.list.indexOf(socket) 73 | } 74 | , add: function (socket) { 75 | if (!this.has(socket)) this.list.push(socket) 76 | } 77 | , remove: function (socket) { 78 | var index = this.list.indexOf(socket) 79 | if (index > -1) this.list.splice(index, 1) 80 | } 81 | , forEach: function (fn) { 82 | this.list.forEach(fn) 83 | } 84 | } 85 | var simpl = require('simpl') 86 | var ws = simpl.createServer(app) 87 | ws.use(simpl.events()) 88 | ws.use(simpl.json()) 89 | ws.on('connection', function (socket) { 90 | socket.on('close', function () { 91 | users.remove(socket) 92 | }) 93 | socket.remote 94 | .on('subscribe', function (what) { 95 | if (what === 'geoip') { 96 | users.add(socket) 97 | maptail.config.dateNow = Date.now() 98 | socket.remote.emit('config', maptail.config) 99 | socket.remote.emit('geoip', maptail.history) 100 | } 101 | }) 102 | .on('unsubscribe', function (what) { 103 | if (what === 'geoip') users.remove(socket) 104 | }) 105 | }) 106 | var before = Date.now() 107 | maptail.on('geoip', function (geo) { 108 | maptail.history.push(geo) 109 | maptail.buffer.push(geo) 110 | if (maptail.history.length > maptail.config.historyMax) maptail.history.shift() 111 | if (Date.now() - before > maptail.config.bufferTime && maptail.buffer.length) { 112 | users.forEach(function (socket) { 113 | socket.remote.emit('geoip', maptail.buffer) 114 | }) 115 | maptail.buffer = [] 116 | before = Date.now() 117 | } 118 | else { 119 | if (maptail.buffer.length > maptail.config.bufferMax) maptail.buffer.shift() 120 | } 121 | }) 122 | } 123 | -------------------------------------------------------------------------------- /public/maptail.css: -------------------------------------------------------------------------------- 1 | * { 2 | -moz-box-sizing: border-box; 3 | -webkit-box-sizing: border-box; 4 | box-sizing: border-box; 5 | margin:0; 6 | padding:0; 7 | } 8 | 9 | html, body { 10 | width:100%; 11 | height:100%; 12 | max-width:100%; 13 | max-height:100%; 14 | background:#000; 15 | overflow:hidden; 16 | } 17 | 18 | #map { 19 | z-index:0; 20 | width:100%; 21 | height:100%; 22 | } 23 | 24 | #map svg { 25 | z-index:10; 26 | } 27 | 28 | #title { 29 | position:fixed; 30 | left:10px; 31 | top:10px; 32 | color: #fff; 33 | } 34 | 35 | #active { 36 | position:fixed; 37 | left:10px; 38 | top:50px; 39 | color:#fff; 40 | font-family:Verdana, Arial, Helvetica, sans-serif; 41 | font-weight:normal; 42 | font-size:16px; 43 | z-index:10; 44 | } 45 | 46 | #active-number { 47 | font-size:50px; 48 | vertical-align:middle; 49 | } 50 | 51 | #markers { 52 | z-index:20; 53 | position:absolute; 54 | left:0; 55 | top:0; 56 | } 57 | 58 | .marker { 59 | position:absolute; 60 | background:url('maptail-marker.png') top left no-repeat; 61 | width:34px; 62 | height:34px; 63 | margin-top:-12px; 64 | margin-left:-12px; 65 | } 66 | 67 | .marker .data { 68 | position:absolute; 69 | background:rgba(0,0,0,0.84); 70 | color:yellow; 71 | top:-26px; 72 | left:-32px; 73 | width:100px; 74 | display:none; 75 | font-family:Lucida Grande, Arial, Helvetica, sans-serif; 76 | font-size:9px; 77 | line-height:10px; 78 | white-space:nowrap; 79 | padding:2px 0; 80 | border-radius:4px; 81 | border:1px solid rgba(255,255,255,0.1); 82 | text-align:center; 83 | } 84 | 85 | .marker:hover, .marker.hovered { 86 | opacity:1.0 !important; 87 | } 88 | 89 | .marker:hover .data, .marker.hovered .data { 90 | display:block; 91 | z-index:10000; 92 | } 93 | 94 | #messages { 95 | position:fixed; 96 | left:0; 97 | bottom:0; 98 | padding:3px; 99 | width:100%; 100 | z-index:10; 101 | color:#777; 102 | font-family:Consolas, Courier New; 103 | font-size:12px; 104 | line-height:11px; 105 | white-space:nowrap; 106 | } 107 | 108 | #messages:hover div { 109 | opacity:1.0 !important; 110 | } 111 | 112 | #iplist { 113 | position:fixed; 114 | right:0; 115 | top:0; 116 | padding:3px; 117 | text-align:right; 118 | z-index:30; 119 | color:#666; 120 | font-family:Lucida Grande, Arial, Helvetica, sans-serif; 121 | font-size:13px; 122 | } 123 | 124 | #iplist div:hover, #iplist div:hover > *, #iplist div.hovered, #iplist div.hovered > * { 125 | color:yellow !important; 126 | } 127 | 128 | .city { 129 | color:#222; 130 | } 131 | 132 | .country { 133 | color:yellow; 134 | } 135 | 136 | #regexp { 137 | position:fixed; 138 | top:10px; 139 | left:400px; 140 | z-index:100; 141 | background:rgba(0,0,0,0.3); 142 | border:1px solid #222; 143 | padding:6px; 144 | font-family:Consolas; 145 | font-size:14px; 146 | color:yellow; 147 | } 148 | 149 | #regexp:focus { 150 | border-color:#555; 151 | } 152 | 153 | #matches { 154 | position:fixed; 155 | top:52px; 156 | left:0; 157 | padding:10px; 158 | z-index:50; 159 | font-family:Consolas, Courier New; 160 | font-size:12px; 161 | line-height:11px; 162 | } 163 | 164 | #dots { 165 | z-index:1000; 166 | } 167 | 168 | .dot { 169 | position:fixed; 170 | left:-100px; 171 | top:-100px; 172 | width:4px; 173 | height:4px; 174 | background:url(maptail-dot.png) top left no-repeat; 175 | z-index:15; 176 | } 177 | 178 | .ribbon { 179 | background-color: #000; 180 | overflow: hidden; 181 | /* top left corner */ 182 | position: fixed; 183 | right: -4em; 184 | bottom: 2.7em; 185 | /* 45 deg ccw rotation */ 186 | -moz-transform: rotate(-45deg); 187 | -webkit-transform: rotate(-45deg); 188 | /* shadow */ 189 | -moz-box-shadow: 0 0 1em #333; 190 | -webkit-box-shadow: 0 0 1em #333; 191 | z-index:1000; 192 | } 193 | .ribbon a { 194 | border: 1px solid #333; 195 | color: #555; 196 | display: block; 197 | font: 16px 'Lucida Grande', Arial, sans-serif; 198 | margin: 0.06em 0.05 0.075em 0; 199 | padding: 0.5em 3.5em 0.7em; 200 | text-align: center; 201 | text-decoration: none; 202 | /* shadow */ 203 | text-shadow: 0 0 0.5em #444; 204 | } 205 | .ribbon:hover a { 206 | color: #ff0; 207 | } 208 | -------------------------------------------------------------------------------- /public/maptail.js: -------------------------------------------------------------------------------- 1 | // config 2 | var config = { timeDiff: 0 } 3 | 4 | // visitors 5 | var visitors = 0 6 | function visitorsInc () { visitors++ } 7 | function visitorsDec () { visitors-- } 8 | 9 | // app 10 | 11 | function connect (callback) { 12 | var simpl = require('simpl') 13 | var client = simpl.createClient() 14 | client.use(simpl.events()) 15 | client.use(simpl.json()) 16 | client.on('connect', callback) 17 | } 18 | 19 | function safe (text) { 20 | return text 21 | .split('&').join('&') 22 | .split('"').join('"') 23 | .split('<').join('<') 24 | .split('>').join('>') 25 | } 26 | 27 | function ansiToHtml (text) { 28 | var colors = { 29 | 30: "#777" 30 | , 31: "red" 31 | , 32: "#0f0" 32 | , 33: "yellow" 33 | , 34: "blue" 34 | , 35: "magenta" 35 | , 36: "cyan" 36 | , 37: "#eee" 37 | , 38: "#777" 38 | , 39: "#777" 39 | } 40 | return text.replace(/\033\[(?:(\d+);)?(\d+)m/g, function (m, extra, color) { 41 | var style = 'color:' + (colors[color] || '#777') 42 | if (extra == 1) { 43 | style += ';font-weight=bold' 44 | } else if (extra == 4) { 45 | style += ';text-decoration=underline' 46 | } 47 | return '' 48 | }) 49 | } 50 | 51 | window.onload = function () { 52 | var dots = { 53 | object: document.getElementById('dots') 54 | , add: function (source, target) { 55 | if (this.list.length < this.max) { 56 | var dot = new Dot(source, target) 57 | this.object.appendChild(dot.object) 58 | this.list.push(dot) 59 | } 60 | } 61 | , max: 300 62 | , list: [] 63 | , tick: function () { 64 | var self = this 65 | var list = this.list 66 | var toRemove = [] 67 | list.forEach(function (dot) { 68 | dot.tick() 69 | dot.draw() 70 | if (Math.abs(dot.target.x - dot.x) < 3 71 | && Math.abs(dot.target.y - dot.y) < 3) { 72 | self.object.removeChild(dot.object) 73 | toRemove.push(dot) 74 | } 75 | }) 76 | toRemove.forEach(function (dot) { 77 | list.splice(list.indexOf(dot), 1) 78 | }) 79 | } 80 | , clear: function () { 81 | var self = this 82 | this.list.forEach(function (dot) { 83 | self.object.removeChild(dot.object) 84 | }) 85 | this.list = [] 86 | } 87 | } 88 | 89 | function Dot (source, target) { 90 | this.object = document.createElement('div') 91 | this.object.className = 'dot' 92 | this.target = target 93 | this.target.x += 3 94 | this.target.y += 3 95 | this.x = source.x 96 | this.y = source.y 97 | this.vx = -15 + Math.random() * 5 98 | this.vy = (Math.random() * 6) - 3 99 | } 100 | 101 | Dot.prototype.tick = function () { 102 | var dist = { x: this.target.x - this.x, y: this.target.y - this.y } 103 | this.vx += (this.vx * (0.58 + (Math.random() * 0.04))) + (dist.x * 0.00070) * Math.max(1, Math.min(9 - (Math.abs(dist.x) * 0.0011), 9) ) 104 | this.vy += (this.vy * (0.58 + (Math.random() * 0.04))) + (dist.y * 0.00070) * Math.max(1, Math.min(9 - (Math.abs(dist.y) * 0.0011), 9) ) 105 | 106 | var l = 6, vx = this.vx, vy = this.vy 107 | if (this.vx > 0 && this.vx > l) this.vx *= 0.82 , this.vy *= Math.random () * 0.05 108 | if (this.vx < 0 && this.vx < -l) this.vx *= 0.82 , this.vy *= Math.random () * 0.05 109 | if (this.vy > 0 && this.vy > l) this.vy *= 0.82 , this.vx *= Math.random () * 0.05 110 | if (this.vy < 0 && this.vy < -l) this.vy *= 0.82 , this.vx *= Math.random () * 0.05 111 | 112 | this.x += vx 113 | this.y += vy 114 | 115 | this.vx *= 0.545 116 | this.vy *= 0.545 117 | } 118 | 119 | Dot.prototype.draw = function () { 120 | this.object.style.left = Math.floor(this.x) + 'px' 121 | this.object.style.top = Math.floor(this.y) + 'px' 122 | } 123 | 124 | var map = createMap() 125 | var active = document.getElementById('active-number') 126 | var regexpInput = document.getElementById('regexp') 127 | 128 | var matches = { 129 | object: document.getElementById('matches') 130 | , list: {} 131 | , length: 0 132 | , regexp: false 133 | , maxAge: 10 134 | , recalcMaxAge: function () { 135 | if (this.length > 7) this.maxAge -= 30 136 | if (this.length < 4) this.maxAge += 40 137 | this.maxAge = Math.max(this.maxAge, 5) 138 | } 139 | , createFlyingDot: function (geo) { 140 | var marker = map.markers.list[geo.ip] 141 | if (!marker) return 142 | var source = { 143 | x: marker.ipList.object.parentNode.offsetLeft + marker.ipList.object.offsetLeft + 100 144 | , y: marker.ipList.object.parentNode.offsetTop + marker.ipList.object.offsetTop + 6 145 | } 146 | var target = map.latLongToPx(marker.latlon) 147 | target.x += map.offset.x + map.margin 148 | target.y += map.offset.y + map.margin 149 | dots.add(source, target) 150 | marker.ipList.object.classList.add('hovered') 151 | setTimeout(function () { 152 | marker.ipList.object.classList.remove('hovered') 153 | }, 700) 154 | } 155 | , destroySoon: function (key, item) { 156 | var self = this 157 | clearTimeout(item.removeTimeout) 158 | item.removeTimeout = setTimeout(function () { 159 | self.object.removeChild(item.object) 160 | delete self.list[key] 161 | self.length-- 162 | self.recalcMaxAge() 163 | }, Math.pow(self.maxAge, item.hits)) 164 | } 165 | , consider: function (geo) { 166 | var self = this 167 | var list = this.list 168 | 169 | if (!this.regexp) return this.createFlyingDot(geo) 170 | 171 | var found = false, item 172 | if (geo.message && ( 173 | (geo.message.match(this.regexp)) 174 | || (geo.country && geo.country.match(this.regexp)) 175 | || (geo.city && geo.city.match(this.regexp)) 176 | ) 177 | ) { 178 | this.createFlyingDot(geo) 179 | for (var k in this.list) { 180 | if (levenshtein(geo.message, k) <= 12) { 181 | found = true 182 | item = this.list[k] 183 | item.inc() 184 | item.set(geo) 185 | this.destroySoon(k, item) 186 | break 187 | } 188 | } 189 | if (!found) { 190 | var item = this.list[geo.message] = new HashItem(geo) 191 | this.object.appendChild(item.object) 192 | this.length++ 193 | this.recalcMaxAge() 194 | this.destroySoon(geo.message, item) 195 | } 196 | } 197 | } 198 | , clear: function () { 199 | this.object.innerHTML = '' 200 | this.list = {} 201 | this.regexp = false 202 | } 203 | } 204 | 205 | function HashItem (geo) { 206 | this.object = document.createElement('div') 207 | this.hits = 1 208 | this.set(geo) 209 | } 210 | HashItem.prototype.inc = function () { 211 | this.hits++ 212 | } 213 | HashItem.prototype.set = function (geo) { 214 | this.object.innerHTML = ansiToHtml(safe(geo.message)) 215 | this.country = geo.country 216 | this.city = geo.city 217 | } 218 | 219 | /* 220 | // calibration markers 221 | // they should land on islands 222 | // 223 | 224 | map.placeMarker({ ip: '123.123.123.1', date: Date.now(), ll: [ 35.325, 25.1306 ] }) 225 | map.placeMarker({ ip: '123.123.123.2', date: Date.now(), ll: [ 53.533778,-132.39624 ]}) 226 | map.placeMarker({ ip: '123.123.123.3', date: Date.now(), ll: [ -42.065607,146.689453 ]}) 227 | map.placeMarker({ ip: '123.123.123.4', date: Date.now(), ll: [ 23.563987,120.585938 ]}) 228 | map.placeMarker({ ip: '123.123.123.5', date: Date.now(), ll: [ -51.835778,-59.765625 ]}) 229 | map.placeMarker({ ip: '123.123.123.6', date: Date.now(), ll: [ 57.326521,-153.984375 ]}) 230 | */ 231 | 232 | var messages = { 233 | object: document.getElementById('messages') 234 | , lines: [] 235 | , freeze: 0 236 | , add: function (message) { 237 | var line = new LineItem(message) 238 | this.lines.push(line) 239 | if (!this.freeze) { 240 | this.append(line) 241 | } 242 | } 243 | , append: function (line) { 244 | this.object.appendChild(line.object) 245 | if (this.lines.length > 12) { 246 | this.object.removeChild(this.lines.shift().object) 247 | } 248 | this.lines.forEach(function (line, index) { 249 | line.object.style.opacity = (1.0 / 12) * index 250 | }) 251 | } 252 | } 253 | 254 | function LineItem (message) { 255 | this.message = message 256 | this.object = document.createElement('div') 257 | this.object.innerHTML = ansiToHtml(safe(message)) 258 | } 259 | 260 | messages.object.onmouseover = function (e) { 261 | /* no freeze or bug 262 | clearTimeout(messages.mouseoutTimeout) 263 | if (!messages.freeze) { 264 | messages.freeze = messages.lines.length - 1 265 | messages.lastLine = messages.lines[messages.freeze] 266 | } 267 | */ 268 | } 269 | messages.object.onmouseout = function (e) { 270 | /* no freeze or bug 271 | if (messages.freeze) { 272 | messages.mouseoutTimeout = setTimeout(function () { 273 | messages.lines 274 | .slice(messages.freeze) 275 | .forEach(messages.append.bind(messages)) 276 | messages.freeze = 0 277 | }, 1000) 278 | } 279 | */ 280 | } 281 | 282 | function createMap () { 283 | var map = {} 284 | map.object = document.getElementById('map') 285 | map.size = { 286 | width: 0 287 | , height: 0 288 | , original: { width: 554, height: 359 } 289 | } 290 | map.offset = { x: 0, y: 0 } 291 | map.margin = 10 292 | map.markers = { 293 | object: document.getElementById('markers') 294 | , list: {} 295 | , ipList: document.getElementById('iplist') 296 | , freeze: false 297 | , active: 0 298 | , add: function (marker) { 299 | this.list[marker.ip] = marker 300 | if (!this.freeze) { 301 | this.append(marker) 302 | } else { 303 | this.freeze.push(marker) 304 | } 305 | } 306 | , append: function (marker) { 307 | var self = this 308 | this.active++ 309 | if (this.active > config.maxDots) { 310 | config.originalttl = config.originalttl || config.ttl 311 | config.ttl -= 1 312 | config.ttl = Math.max(config.ttl, 1) 313 | } 314 | this.object.appendChild(marker.object) 315 | this.ipList.appendChild(marker.ipList.object) 316 | this.ipList.insertBefore( 317 | marker.ipList.object, this.ipList.firstChild 318 | ) 319 | marker.ipList.object.onmouseover = marker.object.onmouseover = function () { 320 | /* no freeze or bug 321 | clearTimeout(self.freezeTimeout) 322 | self.freeze = self.freeze || [] 323 | self.freezeRemove = self.freezeRemove || [] 324 | */ 325 | marker.object.classList.add('hovered') 326 | messages.object.onmouseover() 327 | } 328 | marker.ipList.object.onmouseout = marker.object.onmouseout = function () { 329 | /* no freeze or bug 330 | self.freezeTimeout = setTimeout(function () { 331 | self.freeze.forEach(self.append.bind(self)) 332 | self.freezeRemove.forEach(self.destroy.bind(self)) 333 | self.freeze = false 334 | self.freezeRemove = false 335 | }, 170) 336 | */ 337 | marker.object.classList.remove('hovered') 338 | messages.object.onmouseout() 339 | } 340 | } 341 | , remove: function (marker) { 342 | if (this.freeze) { 343 | this.freezeRemove.push(marker) 344 | } else { 345 | this.destroy(marker) 346 | } 347 | } 348 | , destroy: function (marker) { 349 | if (marker.ip in this.list) { 350 | this.active-- 351 | if (this.active < config.maxDots) { 352 | config.originalttl = config.originalttl || config.ttl 353 | config.ttl += 1 354 | config.ttl = Math.min(config.originalttl * 2, config.ttl) 355 | } 356 | try { 357 | delete this.list[marker.ip] 358 | this.object.removeChild(marker.object) 359 | this.ipList.removeChild(marker.ipList.object) 360 | } catch (e) {} 361 | } 362 | } 363 | , forEach: function (fn) { 364 | var self = this 365 | Object.keys(this.list).forEach(function (key) { 366 | fn(self.list[key]) 367 | }) 368 | } 369 | , paint: function () { 370 | this.forEach(function (marker) { 371 | marker.paint() 372 | }) 373 | } 374 | , age: function () { 375 | this.forEach(function (marker) { 376 | marker.age() 377 | }) 378 | } 379 | } 380 | map.placeMarker = function (geo) { 381 | var marker 382 | geo.date += config.timeDiff 383 | if (!(geo.ip in this.markers.list)) { 384 | visitorsInc() 385 | marker = new Marker(geo) 386 | marker.paint() 387 | this.markers.add(marker) 388 | } else { 389 | marker = this.markers.list[geo.ip] 390 | clearTimeout(marker.visitorTimeout) 391 | marker.visitorTimeout = setTimeout(visitorsDec, config.maxAge * 1000) 392 | marker.date = geo.date 393 | } 394 | } 395 | map.object.style.position = 'absolute' 396 | map.object.style.margin = map.margin + 'px' 397 | 398 | map.paper = Raphael(map.object) 399 | map.paper 400 | .path(mapVector) 401 | .attr({ 402 | stroke: "#fff" 403 | , 'stroke-width': 1.05 404 | }) 405 | 406 | function Marker (geo) { 407 | this.ip = geo.ip 408 | this.latlon = geo.ll 409 | this.date = geo.date 410 | 411 | this.object = document.createElement('div') 412 | this.object.className = 'marker' 413 | this.location = { 414 | object: document.createElement('div') 415 | } 416 | var html = 417 | '
' 418 | + '
' + geo.ip + '
' 419 | + '
' 420 | + (geo.city ? geo.city + ', ' : '') + (geo.country ? geo.country : 'unknown') 421 | + '
' 422 | + '
active 23.1s ago
' 423 | + '
' 424 | this.object.innerHTML = html 425 | this.inner = {} 426 | this.inner.ageNumber = this.object.getElementsByClassName('age-number')[0] 427 | this.inner.ageNumber.textContent = '0.0' 428 | 429 | this.ipList = { 430 | object: document.createElement('div') 431 | } 432 | this.ipList.object.className = 'ip' 433 | this.ipList.object.innerHTML = (geo.city ? '' + geo.city + ' ' : '') + this.ip + ' ' + (geo.country || '??') + '' 434 | 435 | this.visitorTimeout = setTimeout(visitorsDec, config.maxAge * 1000) 436 | } 437 | 438 | Marker.prototype.paint = function () { 439 | var coords = map.latLongToPx(this.latlon) 440 | this.object.style.left = coords.x + 'px' 441 | this.object.style.top = coords.y + 'px' 442 | } 443 | 444 | Marker.prototype.age = function () { 445 | var now = Date.now() 446 | var age = (now - this.date) / 1000 447 | this.inner.ageNumber.textContent = age.toFixed(1) 448 | if (age > config.ttl) map.markers.remove(this) 449 | else 450 | this.object.style.opacity = 1 - (age / config.ttl) 451 | } 452 | 453 | map.latLongToPx = function (latlon) { 454 | var px = latLongToPx(latlon[0], latlon[1], map.size.width, map.size.height) 455 | return { 456 | x: px.x - map.margin, 457 | y: px.y - map.margin 458 | } 459 | } 460 | 461 | function onresize () { 462 | map.viewport = { 463 | width: window.innerWidth - (map.margin * 2) 464 | , height: window.innerHeight - (map.margin * 2) 465 | } 466 | map.paper.setSize(map.viewport.width, map.viewport.height) 467 | map.paper.canvas.style.height = map.viewport.height 468 | map.paper.setViewBox(0, 0, map.size.original.width, map.size.original.height) 469 | var ratio = map.size.original.width / map.size.original.height 470 | var newRatio = map.viewport.width / map.viewport.height 471 | if (ratio > newRatio) { 472 | map.size.width = map.viewport.width 473 | map.size.height = map.viewport.width / ratio 474 | map.offset.x = 0 475 | map.offset.y = (map.viewport.height - map.size.height) / 2 476 | } else { 477 | map.size.height = map.viewport.height 478 | map.size.width = map.viewport.height * ratio 479 | map.offset.y = 0 480 | map.offset.x = (map.viewport.width - map.size.width) / 2 481 | } 482 | map.object.style.left = map.offset.x + 'px' 483 | map.object.style.top = map.offset.y + 'px' 484 | map.markers.paint() 485 | dots.clear() 486 | } 487 | 488 | onresize() 489 | var resizeTimeout 490 | window.onresize = function () { 491 | clearTimeout(resizeTimeout) 492 | resizeTimeout = setTimeout(function () { 493 | onresize() 494 | }, 200) 495 | } 496 | 497 | return map 498 | } 499 | 500 | regexpInput.onkeyup = function (e) { 501 | var val = this.value.toString().trim() 502 | if (e.which == 13) { 503 | matches.clear() 504 | if (val.length) { 505 | matches.regexp = new RegExp(val, 'igm') 506 | messages.lines.forEach(function (line) { 507 | matches.consider(line.message) 508 | }) 509 | } 510 | } 511 | } 512 | 513 | matches.regexp = regexpInput.value && new(RegExp(regexpInput.value, 'igm')) || false 514 | 515 | connect(function (client) { 516 | client.remote.on('config', function (cfg) { 517 | if (cfg.dateNow) cfg.timeDiff = Date.now() - cfg.dateNow 518 | for (var k in cfg) { config[k] = cfg[k] } 519 | }) 520 | 521 | client.remote.on('geoip', function (geos) { 522 | var nadd = config.bufferTime / geos.length, n = 0 523 | geos.forEach(function (geo) { 524 | setTimeout(function () { 525 | if (geo.ll) map.placeMarker(geo) 526 | active.textContent = visitors 527 | if (geo.message) { 528 | messages.add(geo.message) 529 | matches.consider(geo) 530 | } 531 | }, n += nadd) 532 | }) 533 | }) 534 | 535 | client.remote.emit('subscribe', 'geoip') 536 | }) 537 | 538 | ;(function tick () { 539 | map.markers.age() 540 | dots.tick() 541 | window.requestAnimFrame(tick) 542 | }()); 543 | } 544 | 545 | window.requestAnimFrame = (function () { 546 | return window.requestAnimationFrame 547 | || window.webkitRequestAnimationFrame 548 | || window.mozRequestAnimationFrame 549 | || window.oRequestAnimationFrame 550 | || window.msRequestAnimationFrame 551 | || function (callback, el) { 552 | return window.setTimeout(callback, 1000 / 60) 553 | } 554 | }()); 555 | 556 | function levenshtein (s1, s2) { 557 | // http://kevin.vanzonneveld.net 558 | // + original by: Carlos R. L. Rodrigues (http://www.jsfromhell.com) 559 | // + bugfixed by: Onno Marsman 560 | // + revised by: Andrea Giammarchi (http://webreflection.blogspot.com) 561 | // + reimplemented by: Brett Zamir (http://brett-zamir.me) 562 | // + reimplemented by: Alexander M Beedie 563 | // * example 1: levenshtein('Kevin van Zonneveld', 'Kevin van Sommeveld'); 564 | // * returns 1: 3 565 | 566 | if (s1 == s2) { 567 | return 0; 568 | } 569 | 570 | var s1_len = s1.length; 571 | var s2_len = s2.length; 572 | if (s1_len === 0) { 573 | return s2_len; 574 | } 575 | if (s2_len === 0) { 576 | return s1_len; 577 | } 578 | 579 | // BEGIN STATIC 580 | var split = false; 581 | try{ 582 | split=!('0')[0]; 583 | } catch (e){ 584 | split=true; // Earlier IE may not support access by string index 585 | } 586 | // END STATIC 587 | if (split){ 588 | s1 = s1.split(''); 589 | s2 = s2.split(''); 590 | } 591 | 592 | var v0 = new Array(s1_len+1); 593 | var v1 = new Array(s1_len+1); 594 | 595 | var s1_idx=0, s2_idx=0, cost=0; 596 | for (s1_idx=0; s1_idx latMax || lat < latMin || lng > lngMax || lng < lngMin){ 10 | return { 11 | x: 0, 12 | y: 0 13 | } 14 | } 15 | 16 | var distance = function (lat1, lon1, lat2, lon2) { 17 | var R = 6371; // km 18 | var x = (lon2-lon1) * Math.cos((lat1+lat2)/2); 19 | var y = (lat2-lat1); 20 | var d = Math.sqrt(x*x + y*y) * R; 21 | return d; 22 | } 23 | 24 | var x = (lng -lngMin) / (lngMax -lngMin) * width 25 | var y = distance(lat, 0, latMax, 0) / distance(latMin, 0, latMax, 0) * height; 26 | 27 | return { 28 | x: x, 29 | y: y 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /public/global-map.js: -------------------------------------------------------------------------------- 1 | var mapVector = 'M113.705,40.769c1.011,2.213,3.002,3.119,3.051,5.547c0.021,1.037-0.841,1.895-0.832,3.05c0.021,2.622,1.725,4.52,2.773,6.656h4.992c1.183-4.642,4.768-6.881,5.27-12.203c-0.21,2.613,0.301,4.506,0.832,6.378c-3.006,0.508-3.352,3.674-4.715,5.824c0.941,0.354,1.761,0.828,2.496,1.387c-1.071-0.055-2.043-0.011-2.773,0.277c0.083,1.673-0.409,3.921,0.832,4.437c-2.061,1.082-3.541,2.745-3.051,6.379c4.686,0.63,8.832,1.048,12.201-0.553c0.432,0.585,0.496,1.538,1.387,1.664c2.621-0.615,4.45-2.021,5.27-4.437c-0.381-1.405-2.344-1.876-2.219-3.051c0.108-1.025,3.637-1.706,1.941-4.16c1.057-0.33,2.407-0.367,3.328-0.832c1.614-3.286,0.671-9.128,2.496-12.203c1.527-0.137,2.473-0.856,3.883-1.109c1.806-2.765,2.333-5.576,4.16-8.32c2.135-3.206,5.89-5.275,7.211-8.598c0.217-0.546-0.15-1.403,0-1.941c0.857-3.081,5.607-4.416,4.437-8.875c-2.43-0.806-3.815-2.655-4.992-4.714c-3.651-0.643-5.513-3.148-8.875-3.605c-2.548-0.346-5.024,1.134-7.488,1.109c-1.218-0.012-2.387-0.832-3.328-0.832c-1.661-0.001-4.734,0.956-5.824,1.664c-1.351,0.879-1.619,2.894-2.773,4.16c-2.151,2.359-4.981,3.455-6.933,5.269c-0.169,0.663,0.348,2.012-0.277,2.219h-2.773c-3.405,2.802-3.592,12.08,1.387,13.589c2.674,0.81,5.099-0.744,7.766-1.109c2.312-0.317,4.222,0.36,6.378-0.555c-1.975,2.184-5.845,2.475-7.765,4.714c-0.814-0.665-1.659-1.3-3.051-1.386c-0.086,2.186-2.864,5.518-0.555,6.656c-0.617-0.215-1.504-0.16-1.664-0.832c1.01-2.022,0.472-4.865-0.832-6.101c-4.668,0.23-5.324-3.551-5.824-7.488c-1.099,0.102-2.658-0.254-3.328,0.277C116.6,34.42,112.922,35.364,113.705,40.769zM350.547,33.834c-0.035-1.166-1.074-1.329-1.109-2.496c1.867-1.477,2.255-6.227,0.277-8.042c-1.329,2.276-4.197,3.014-3.328,7.487h-2.219c-0.339,1.048-1.208,1.566-1.109,3.051c1.358,0.397,2.146,1.365,3.604,1.664C347.892,34.877,349.107,34.243,350.547,33.834zM348.05,36.331c-0.822,1.212-1.988,2.079-2.496,3.605c3.604,0.739,4.494-1.238,6.101-2.496c0.849,0.447,2.253,0.336,3.051,0.832c0.609-0.5,1.137-1.082,1.941-1.386c0.178-1.208-0.362-3.135,0.277-3.883c1.729,1.1,3.18-0.243,3.883-1.664c-0.283-1.566-0.928-2.771-1.109-4.438c-2.499,0.644-3.296,2.99-4.161,5.27c-1.673,0.083-2.876,0.636-4.158,1.109c-0.153,1.234-0.221,2.554-0.832,3.328C349.678,36.552,348.51,36.795,348.05,36.331zM405.458,48.811c2.643,0.971,5.395,3.997,8.598,1.941c-0.989-4.771,1.54-7.884-0.832-10.539c-0.783-0.875-2.148-0.566-2.773-1.664c-0.705-1.236-0.601-3.097,0.277-4.438c-0.884-1.983-2.26-3.473-3.329-5.268c-1.013,0.564-3.474,1.806-4.438,3.605c-0.478,0.888-0.335,2.407-0.832,3.605c-1.318,3.175-3.45,4.539-1.109,7.765C403.427,44.556,404.958,46.168,405.458,48.811zM331.965,37.718v1.941c1.522,1.018,3.538,1.453,5.27,0.277c-0.58-3.074,1.478-3.514,1.941-5.546c-0.461-0.556-0.744-1.289-1.664-1.387c-1.078,0.678-2.134,1.379-3.328,1.941c-0.457-4.875-4.727-1.291-5.546,1.11C329.318,37.038,330.581,37.439,331.965,37.718zM282.046,55.466c-0.282,0.921-1.535,0.869-1.388,2.219c0.941,4.422,2.727,7.998,6.103,9.984c0.313-5.325,2.807-8.472,3.05-13.867c0.814,0.319,1.031-1.33,1.387-0.555c-0.446,2.665,1.443,2.994,1.941,4.715c-0.409,1.162-1.282,1.861-1.387,3.328c0.787,0.6,1.985,0.788,2.772,1.387c1.732-1.04,3.119-2.427,4.16-4.16c-2.159-2.37-4.68-4.379-4.992-8.597c-1.352-0.775-2.873-1.38-3.883-2.496c-0.089-1.021,0.238-2.456-0.277-3.051c1.461,2.421,4.574,3.191,7.488,4.161c2.203-2.789,6.042-3.942,5.547-9.429c-2.468-0.768-5.037-1.435-7.211-2.496c-0.998,0.481-1.622,1.336-2.496,1.941c-0.328-1.058-1.015-1.758-1.387-2.773c-1.841,0.284-2.346,1.906-4.16,2.218c-0.173,0.843,0.356,2.389-0.277,2.773c-0.692-0.23-1.088-0.76-1.939-0.832c-0.552,0.835-0.419,2.355-1.387,2.773c-1.863-1.306-4.93-0.549-6.935,0.277C276.657,49.021,277.071,54.524,282.046,55.466zM99.562,50.752c-2.435,3.253,1.921,5.712,5.824,5.27c0.124,1.262,0.713,2.06,1.109,3.05c1.954-0.913,4.059-1.673,6.933-1.664c2.21-3.855-1.009-6.823-3.882-8.043c-0.671,1.825-0.255,4.737-1.109,6.379c-1.954-2.207-0.526-7.795-3.606-8.875c-2.498,0.097-9.461-3.917-7.765,2.496C97.761,49.965,99.09,49.929,99.562,50.752zM412.669,58.24c2.01-2.057,6.268-1.866,9.15-3.051c0-1.664,0-3.328,0.001-4.992c-1.555-2.232-4.222-6.615-6.379-3.328c-0.759,1.157-0.807,3.86-1.386,5.824C413.448,54.75,412.333,56.578,412.669,58.24zM85.695,59.349v1.941c3.708,2.433,7.891-2.622,5.269-5.546c1.721,0.149,1.778-1.366,2.496-2.219c-1.834-1.179-4.349-1.754-6.934-0.831c-0.035,1.166-1.074,1.329-1.109,2.496c1.964-0.207,3.441,0.088,5.269,1.109c-2.281,0.214-3.442,1.55-5.269,2.218c0.191-1.116-0.265-1.583-0.277-2.496c-1.291,0.095-1.83,0.943-2.773,1.387c0.189,1.012,1.052,1.352,1.387,2.218C84.579,59.641,85.161,58.811,85.695,59.349zM117.311,61.844c1.025-0.731,1.661-1.852,1.387-3.882c-2.768-0.568-5.856-0.245-7.765,0.831C112.281,60.588,115.023,60.989,117.311,61.844zM100.949,63.786c-0.239-2.508-1.032-7.558-3.605-4.438C98.052,61.321,97.886,64.168,100.949,63.786zM75.433,71.829c1.17-1.286,2.339-5.59,3.883-2.496c-1.612,0.792-2.57,2.238-3.051,4.16c0.979,0.039,1.24,0.794,2.219,0.832c0.751-3.594,2.175-6.516,4.16-8.875c-0.438-0.578-0.903-1.129-1.109-1.941c0.352-0.942,1.538-1.051,1.664-2.219c-1.363-1.887-2.849-1.732-4.161,0c-5.415-0.607-6.469,5.296-9.707,7.766c0.385,1.002,1.22,1.554,1.387,2.773C72.656,71.589,73.427,71.714,75.433,71.829zM118.698,78.762c3.086,1.432,10.814,2.805,13.589,0.277c1.424,1.754,3.172,0.389,4.992-0.277c0.235-1.707,1.185-2.698,0.832-4.992c-3.705-4.926-12.415,1.188-15.531-3.328c1.152-2.238-2.067-2.319-1.94-4.438c-4.409,0.712-4.586-2.81-8.32-2.773c-1.208,2.826,0.942,4.571,1.941,6.101c0.882-0.226,2.042-0.177,2.773-0.554C120.114,70.771,117.835,74.851,118.698,78.762zM349.161,99.84c-0.883-1.951-2.612-2.403-3.051-4.438c-1.146-5.31,1.671-8.251,3.605-11.648c1.263-2.22,2.697-5.322,4.158-6.933c3.625-3.996,9.446-5.689,12.759-7.765v-3.883c-2.69-2.733-5.644,0.488-7.211,2.774c-1.418,0.523-3.232,0.651-5.271,0.555c-3.67,1.783-4.857,6.05-8.874,7.488c1.127,4.726-3.813,6.58-1.94,9.429c-1.784,1.127-3.521,3.312-2.773,6.101C335.598,96.419,345.328,101.331,349.161,99.84zM92.628,64.896c-0.913,1.49-2.296,2.509-3.049,4.161c2.009,0.248,1.426,2.953,1.664,4.16c-2.914-0.044-2.579-3.337-4.16-4.714c-1.664-0.37-3.015-1.053-4.715-1.387c-1.394,2.488-2.347,5.417-3.605,8.042c1.353,0.773,2.962,1.291,4.16,2.219c1.199-0.002,1.095-1.308,1.941-1.664c0.004,0.828,0.721,0.943,0.832,1.664c-0.681,0.243-1.599,0.249-1.664,1.109c2.033,4.379,6.578,0.022,8.597-1.387c1.476,0.88,3.739,0.535,4.992-0.277c0.156-1.97,0.513-3.74,0.832-5.547c-1.538-1.052-3.143-2.035-4.438-3.328C93.467,67.016,93.981,65.022,92.628,64.896zM104.276,73.492c0.524,0.956,0.821,2.138,1.387,3.051h4.16c1.06-2.463,0.753-5.402,0.555-8.597c-1.364-1.502-3.089-2.643-5.824-2.774c-0.661,1.188-1.235,2.463-1.664,3.883c-0.847-1.003-1.233-2.466-2.496-3.051c-0.355,0.385-1.31,0.17-1.664,0.555c0.383,3.314,1.662,5.732,3.05,8.042C103.096,74.716,103.136,73.554,104.276,73.492zM478.396,77.375c0.654,0.085,0.516,0.963,1.386,0.832c1.405-1.83,4.188-2.284,3.883-5.824c-2.164-0.793-3.944-1.972-5.269-3.605c-0.712,0.767-0.933,2.026-1.664,2.773c-1.182-0.759-1.869-2.014-3.051-2.773c-3.503,1.666-3.426,7.24-1.387,10.261C475.334,79.49,476.354,77.922,478.396,77.375zM115.37,72.938c-3.282-0.601-3.235,2.127-4.159,3.883c1.865,0.483,3.942,2.106,5.546,1.941C117.016,76.099,116.561,74.151,115.37,72.938zM491.985,79.039c0.239-1.148,0.744-2.029,0.832-3.328c-2.64-0.78-5.102-1.738-7.488-2.773C486.271,76.249,487.435,79.337,491.985,79.039zM481.446,87.637c0.766-2.652-1.308-4.764-4.159-4.715c-0.056-0.868,0.188-2.036-0.276-2.496c-0.685-0.036-1.337-0.042-1.664,0.278c-0.131,2.087,1.438,3.435,0.277,4.992C476.947,86.96,478.951,87.544,481.446,87.637zM102.058,88.191c0.278,1.479,0.851,2.662,1.387,3.882h1.664c0.792,1.704,2.035,2.957,2.773,4.715c1.795-0.608,2.519-2.288,4.714-2.496c0.5-2.311,0.181-4.576-0.277-6.656c-0.658-0.45-1.594-0.624-2.218-1.109c3.062-1.179,0.75-7.07-1.941-3.883c-1.001-1.394-2.705-0.366-3.883,0.277c-0.267,2.024,0.332,3.181,0.832,4.438C103.55,87.094,102.897,87.735,102.058,88.191zM534.694,99.007c2.845,0.098,4.483-0.135,6.103-1.664c-0.324-2.08-1.864-2.943-4.16-3.051c0.196,2.23-2.206,1.862-2.219,3.883C534.74,98.221,534.717,98.613,534.694,99.007zM248.211,96.511c-1.022,0.449-2.55,1.587-2.219,2.496C247.072,98.515,248.035,97.906,248.211,96.511zM335.015,108.436c1.7-0.149,2.62-1.079,3.051-2.496c-0.74-0.738-1.492-1.465-2.496-1.941C334.242,105.068,333.874,106.872,335.015,108.436zM146.153,110.933c-2.296-2.958-6.102,0.353-4.437,3.882C144.523,114.85,146.177,113.73,146.153,110.933zM239.336,120.084c-1.59,0.11-1.46-1.499-1.387-3.051c-1.55,0.513-1.839,0.504-3.051-0.277c-1.659,1.787-4.056,1.566-6.378,1.387c0.017,1.219,0.267,2.671-1.109,2.496c0.307-2.618-1.113-3.509-2.773-4.16c-0.416,0.508,0.009,1.857-1.389,1.387c0.361,1.655-0.875,1.714-0.832,3.051c0.974,0.779,1.836,0.963,3.051,0.277c-0.59,1.258-2.442,1.255-2.773,2.773h2.496c-0.202,0.756,0.551,0.558,0.555,1.109c-0.298,0.718-1.003,1.031-1.109,1.941c2.524,0.25,4.875,0.672,6.656,1.664C234.547,126.389,240.282,126.577,239.336,120.084zM137.556,126.463c-2.707-2.563-6.054-4.485-7.488-8.32c-2.688,0.64-2.66,3.996-2.497,7.488c-0.252,1.042-1.705,0.884-1.664,2.219h2.219c-0.037,0.684-0.042,1.336,0.277,1.664h2.219c0.619-1.044,1.016-2.311,2.219-2.773c1.122,0.357,1.675,1.283,2.496,1.941C136.421,128.286,137.16,127.546,137.556,126.463zM131.178,132.842c2.396,0.271,3.2-1.052,3.882-2.496C133.51,129.882,131.526,131.198,131.178,132.842zM249.597,133.673c0.387-0.816,1.461-0.943,1.387-2.218c-1.351-0.242-1.839,0.379-2.773,0.554C248.18,133.057,248.753,133.501,249.597,133.673zM258.75,139.775v-2.219C256.912,137.187,257.085,139.995,258.75,139.775zM256.253,143.103c0.053-1.255-0.822-1.581-1.941-1.664C254.461,142.492,255.394,142.761,256.253,143.103zM26.624,143.38c-2.083,0.783-3.272,2.46-4.438,4.16c0.731,0.194,0.587,1.263,1.387,1.387c1.045-0.712,1.611-1.902,3.051-2.219C26.447,145.267,27.235,144.485,26.624,143.38zM137.002,151.145c0.524,0.307,1.31,0.354,1.941,0.555c0.468-0.995,0.61-1.891,0.277-3.051C137.648,148.649,136.9,149.473,137.002,151.145zM244.052,160.853c0.192,1.194,0.736,2.038,1.664,2.496c1.959-0.629,3.998-1.179,5.546-2.219c0.491-2.204-0.519-4.204,0.832-5.547c-0.249-1.137-0.848-1.925-1.387-2.773c-2.31-1.034-5.635,1.041-3.604,2.496h-2.219c-0.636,1.849-0.547,2.448,0.832,3.883C245.137,159.72,245.16,160.852,244.052,160.853zM515.004,152.532c-0.017,0.169-0.042,0.328-0.277,0.278c0.492,1.079,1.1,2.042,2.496,2.218C517.046,153.633,516.083,153.024,515.004,152.532zM473.127,153.087c-0.328-0.319-0.98-0.314-1.664-0.277c-0.43,0.402-0.244,1.419-0.277,2.218C472.383,154.931,473.03,154.284,473.127,153.087zM58.239,155.583c-1.108-0.001-1.664-0.554-2.773-0.555c-0.134,3.648,1.129,5.897,3.882,6.657C58.482,160.147,57.948,158.277,58.239,155.583zM1.387,156.693c-0.476,0.633-0.818,1.401-1.387,1.941v1.109c1.581-1.192,3.737-1.809,4.992-3.327C3.827,153.821,2.951,157.863,1.387,156.693zM527.206,159.465c0.262-1.127-1.502-0.961-1.94-0.555C525.004,160.037,526.767,159.872,527.206,159.465zM544.124,161.406c0.931,0.006,1.85,0,1.663-1.109C544.912,160.347,544.134,160.492,544.124,161.406zM538.577,162.239c0.535,0.539,1.698,0.29,1.388-0.832C539.093,161.275,538.83,161.752,538.577,162.239zM540.796,162.516c0.843-0.08,1.892,0.044,1.939-0.832C542.296,161.083,540.283,161.246,540.796,162.516zM500.583,164.18c-1.438,0.132-2.116,1.026-1.94,2.773C500.184,166.924,500.513,165.681,500.583,164.18zM493.927,172.5c-0.122,0.644-1.226,0.742-0.556,1.387C494.261,173.997,494.955,172.706,493.927,172.5zM489.767,176.66c1.231-0.248,2.122-0.836,2.496-1.941C490.88,174.815,489.932,175.346,489.767,176.66zM485.884,179.156c1.22,0.047,3.049-1.526,3.604-3.051C487.417,176.251,486.545,177.598,485.884,179.156zM215.764,190.527c0.009,0.914,0.788,1.06,1.664,1.109C217.613,190.527,216.694,190.521,215.764,190.527zM220.201,192.469c0.035,0.611,1.177,0.117,1.664,0.277C222.299,191.792,220.008,191.429,220.201,192.469zM313.384,198.569c-0.223-0.962,0.413-1.066,0.276-1.941c-1.743,0.012-2.979,0.532-4.437,0.832C309.485,199.526,311.514,198.497,313.384,198.569zM235.731,209.107c-0.853,0.164-1.962,0.072-1.941,1.109c0.252,0.58,0.818,0.846,1.664,0.832C235.231,210.087,235.867,209.982,235.731,209.107zM460.092,209.384c-0.813,0.02-1.564,0.102-1.388,1.109C459.518,210.474,460.269,210.394,460.092,209.384zM236.841,211.048v-1.109c-0.868-0.129-1.238,0.242-1.109,1.109H236.841zM138.666,212.435c0.419,0.509,1.871,0.82,2.496,0.277c-0.037,0.684-0.042,1.336,0.277,1.664c1.105,0.182,0.794-1.054,0.832-1.941C141.368,211.947,139.301,211.525,138.666,212.435zM457.874,212.158c-0.798-0.526-1.561,0.9-1.663,1.941C457.439,214.129,457.709,213.195,457.874,212.158zM141.994,214.377c0.715,1.041,1.175,2.338,2.773,2.496C144.482,215.515,143.278,213.835,141.994,214.377zM445.948,221.033c1.007-1.768,1.763-3.786,2.22-6.102c-1.729-0.705-2.588,1.846-3.606,2.774C445.13,218.709,444.81,220.599,445.948,221.033zM143.935,217.427c0.17,2.141,2.9,1.008,1.941,3.051c1.024,0.099,1.159-0.69,1.387-1.387C146.025,218.773,144.847,217.175,143.935,217.427zM144.212,221.31c-4.583-2.28-11.725-5.377-14.421-0.555c1.159,0.142,1.879-0.155,2.496-0.555c-0.233,0.323-0.366,0.744-0.277,1.387h1.941c0.454-1.123-1.468-1.275-0.555-1.941c0.296,0.26,0.086,1.023,0.832,0.832c3.116,0.028,4.638,1.649,7.211,2.219c-0.155,0.678-1.073,0.592-0.832,1.664c2.012-0.207,4.275-0.162,6.101-0.555C146.72,222.744,145.392,221.898,144.212,221.31zM146.707,222.696h1.664c-0.323-1.34,1.127-0.906,1.387-1.664c-0.009,0.746,1.396,0.746,1.387,0c-1.138-0.711-2.113-1.584-3.605-1.941c-0.312,1.33,1.058,0.977,1.386,1.664C147.502,220.717,146.838,221.44,146.707,222.696zM13.035,221.032c0.205,1.016,1.78,0.141,2.496,0v-1.109C14.411,220.005,13.367,220.164,13.035,221.032zM155.582,225.47c-1.852-1.66-4.928-2.098-8.042-2.496c0.072,0.813-0.627,0.852-0.556,1.664c0.871-0.131,1.134,0.346,1.387,0.832c-1.28,0.107-2.945-0.172-3.328,0.832c0.851,1.738,4.637,0.539,5.824,1.941c0.479-0.168-0.021-1.317,0.555-1.387c1.036,0.367,2.96-0.677,3.605,0.555C155.26,226.812,155.746,226.466,155.582,225.47zM139.497,227.135c1.453,0.025,2.497,0.461,4.16,0.277C143.836,225.544,139.107,224.314,139.497,227.135zM156.692,227.411c1.069-0.227,2.729,0.141,3.051-0.832c-0.408-0.978-1.746-1.027-3.051-1.109V227.411zM221.31,227.966c-0.214,0.19-0.722,1.653,0.277,1.387C222.203,229.237,221.853,227.831,221.31,227.966zM164.735,229.353v1.109c0.827-0.006,1.69,0.025,1.664-0.832C166.364,229.017,165.222,229.513,164.735,229.353zM167.231,232.681c0.177-1.009-0.575-1.089-1.387-1.109C165.896,232.351,166.326,232.753,167.231,232.681zM402.13,237.119c1.694,0.215,0.995-1.963,1.387-3.051h-0.832C402.425,235.009,402.313,236.099,402.13,237.119zM341.95,236.287c0.556,0.283,2.678,0.217,2.773-0.832C344.013,234.853,341.706,235.013,341.95,236.287zM153.642,235.455c-0.185,1.109,0.733,1.115,1.664,1.109C155.296,235.648,154.517,235.504,153.642,235.455zM440.679,242.665c1.562-1.49,4.163-1.939,4.16-4.992C442.81,238.537,440.883,240.89,440.679,242.665zM437.073,247.38c-2.98-0.207-2.397,3.15-5.546,2.773c-0.488,0.438-0.364,1.486-0.832,1.941c-0.599-0.233-0.946-0.717-1.94-0.555c-3.531,2.631,1.041,5.385,1.108,8.598c2.112-0.303,3.22,1.004,6.103,0.277c0.115,0.531,0.1,1.193,0.831,1.109c4.915-0.563,2.162-7.213,7.211-7.766c-0.711-1.6-2.452-2.17-2.22-4.715c1.066-0.32,1.523-1.25,2.22-1.941c-1.823-0.578-2.323-2.482-4.161-3.047C439.05,245.29,437.674,245.946,437.073,247.38zM407.677,250.429c0.019,0.813,0.1,1.565,1.108,1.387C408.767,251.003,408.686,250.253,407.677,250.429zM409.063,252.648c0.39,0.998,0.931,1.842,2.219,1.941c0.027-0.859-0.339-1.324-0.555-1.941H409.063zM118.698,254.867c-0.682,0.677,0.205,1.203,0,2.219h1.941C120.445,255.894,119.848,255.103,118.698,254.867zM466.749,255.699c-2.051-0.926-4.443-0.973-6.103-0.276c0.035,0.613,1.177,0.119,1.664,0.277c-0.033,0.799-1.182,0.483-1.109,1.387c1.322,0.343,1.796,1.533,3.052,1.941c-0.644-0.088-1.065,0.045-1.388,0.277c-0.101,1.305,1.97,0.436,1.388,2.219c3.323-0.694,7.707,1.244,9.151,4.16c-1.405-0.018-1.551,1.223-1.664,2.496c3.821-1.606,8.783,4.425,9.43-0.555c3.858-2.603,6.092,7.153,11.37,3.051c-0.574-0.627-1.536-0.867-2.495-1.109c0.059-1.42-2.033-2.66-3.052-3.883c1.092,0.351,0.825-0.655,0.832-1.387c-1.009-0.285-1.714-0.873-2.772-1.109c-1.793-4.586-8.153-4.606-12.757-6.379c-1.598,0.623-2.349,2.089-3.884,2.773C467.05,259.095,466.772,257.525,466.749,255.699zM470.076,255.976c-0.356-0.381-1.205-0.273-1.94-0.277c0.013,1.095,0.567,1.65,1.664,1.664C469.685,256.695,470.305,256.761,470.076,255.976zM412.114,255.976c-0.57,0.774-0.056,2.315,1.109,2.219c0.611-0.645-0.055-1.574-0.277-2.219H412.114zM457.874,257.917c-0.173-0.843-0.615-1.417-1.663-1.387c0.113,0.668-0.507,0.604-0.277,1.387C456.303,258.313,457.504,258.313,457.874,257.917zM453.714,257.363c-0.45-0.416-2.047-0.416-2.496,0C450.98,258.677,453.879,258.441,453.714,257.363zM486.993,258.75c0.195-0.959-0.972-0.995-1.387-0.555C485.412,259.156,486.579,259.189,486.993,258.75zM425.426,258.472v1.941c1.366,0.164,2.135-0.268,1.94-1.664C426.492,258.886,426.388,258.249,425.426,258.472zM461.479,259.304c-1.483-0.703-4.299-0.74-4.992,0.832c1.667,0.553,3.094,1.344,5.27,1.387C461.818,260.63,461.266,260.349,461.479,259.304zM455.933,259.582c-0.898,0.119-2.4-0.366-2.496,0.554c0.876,0.418,1.185,1.403,2.496,1.387C456.483,261,456.067,260.213,455.933,259.582zM466.749,262.91c-0.106,1.039-0.821,2.513-0.278,3.328c1.03-0.172,1.141-1.264,1.387-2.219C467.53,263.607,467.617,262.781,466.749,262.91zM498.087,262.91c-0.801,1.07,0.881,1.578,0.833,2.773c1.896-0.699,1.94,0.662,3.604,0.832C501.806,264.553,499.48,264.199,498.087,262.91zM461.756,267.624c1.111,0.041,1.768-1.359,1.387-1.941C462.15,265.8,461.809,266.568,461.756,267.624zM503.633,266.238c0.25,1.322,1.668,1.474,2.772,1.941C506.275,266.74,504.999,266.445,503.633,266.238zM501.692,267.07c0.27,0.875,1.212,2.123,1.941,1.664C503.363,267.857,502.422,266.611,501.692,267.07zM508.625,270.398c1.084-0.625-0.729-2.899-1.941-3.051c-0.134,1.244,0.98,1.239,1.109,2.219c-0.779-0.33-1.596-0.625-2.496-0.832c-0.201,0.848,0.283,1.01,0.276,1.664h2.496c-0.015,0.353-0.354,0.385-0.276,0.832c1.211-0.01,1.637,0.766,2.772,0.832C510.912,270.513,509.083,271.142,508.625,270.398zM446.78,270.676c-0.291-1.373-1.888-1.44-3.604-1.387C443.414,270.822,445.604,271.703,446.78,270.676zM335.293,273.171c0.465,2.684-2.767,1.67-2.221,4.438c-1.848,0.905-5.399,1.708-5.822,4.438c-0.19,1.224,1.05,2.781,0.832,4.16c-0.19,1.199-1.807,2.23-1.941,3.326c-0.488,3.969,1.938,7.477,6.378,6.102c0.839-1.951,1.389-4.539,2.219-7.211c0.816-2.621,1.128-5.686,1.941-7.764c0.354-0.903,1.259-1.246,1.387-2.219C338.312,276.587,337.503,273.73,335.293,273.171zM546.619,275.945c-0.317,1.797,1.676,1.283,3.052,1.387C549.417,276.105,547.882,276.162,546.619,275.945zM516.391,277.332c-0.51,2.173,0.939,2.386,1.109,3.883c0.871,0.133,1.084-0.397,1.664-0.555c-0.061-1.142-1.631-0.773-1.109-2.496C516.752,278.635,517.694,276.861,516.391,277.332zM534.417,281.215c0.69,0.232,1.484,0.363,2.496,0.277v-1.664C535.846,280.054,534.542,280.042,534.417,281.215zM532.476,283.434c0.524,0.492,1.832,0.201,2.772,0.277c0.062-0.217,0.008-0.549,0.277-0.555C535.374,280.744,532.495,281.496,532.476,283.434zM29.397,282.046c-0.222,1.151,1.067,1.623,1.664,1.109C30.997,282.294,30.078,282.29,29.397,282.046zM348.051,285.929c0.112,0.668-0.507,0.602-0.277,1.385h1.664C349.28,286.548,349.144,285.759,348.051,285.929zM518.055,290.365c-1.298-1.844-2.735-3.551-5.547-3.881C513.384,288.591,515.652,290.699,518.055,290.365zM345,288.978c0.904,0.073,1.335-0.328,1.387-1.109h-1.664C344.702,288.353,344.784,288.732,345,288.978zM488.38,323.369c-2.499,0.58-3.694,0.486-5.547-0.555c0.56,2.398,0.722,5.193,2.219,6.657c1.797,0.41,1.531-1.244,3.328-0.832C488.038,326.654,489.171,324.902,488.38,323.369zM540.241,331.41c1.131,0.115,1.749-0.283,1.664-1.387h-1.664V331.41zM365.8,340.285c0.075,1.5,0.237,1.652,0,3.05c1.215-0.449,3.229-0.099,3.051-1.941C366.884,341.974,367.342,340.131,365.8,340.285zM166.953,347.495c-0.41-0.32-0.698-0.32-1.109,0c0.498,1.444,2.241,1.641,3.605,2.219c0.508-1.156,2.432-0.896,2.496-2.496C170.719,346.337,167.436,345.277,166.953,347.495zM70.997,97.897c3.922-0.792,6.207-3.223,6.379-7.765c1.319-0.345,1.926-1.401,3.05-1.941c-1.927,1.585-2.945,4.081-3.604,6.931c0.381,0.636,1.382,0.652,1.664,1.387c0.042,0.69-0.436,0.859-0.555,1.387c0.875,2.73,6.114,1.096,8.042,2.773c-1.371,0.755-3.414,0.838-5.547,0.832c-0.197,3.541,2.369,5.432,5.27,4.992c-0.146,1.163,0.485,1.549,0.555,2.496c4.549-0.443,8.689-1.295,11.371-3.605c1.736,2.426,5.095,3.143,7.21,0.555c0.133-0.872-0.395-1.084-0.555-1.664c0.653,0.007,0.816-0.477,1.664-0.277v-2.773c-2.739-1.139-5.441-1.332-6.101-4.16c-0.532-2.279,0.424-4.986-1.109-7.21c0.82-1.213,1.151-2.916,1.941-4.16c-0.385-1.742-2.056-2.196-4.438-1.941c-1.055,1.441-1.182,3.811-2.219,5.27c-1.17-2.608-4.085-0.245-5.546-2.219c-1.02-0.172-1.381,1.74-1.941,1.109c0.122-0.954-0.11-1.555-0.277-2.219c-3.546-0.245-4.926-2.655-6.102-5.27c-5.226-0.699-7.561-1.3-11.37,1.109c1.739,4.142-0.216,7.874-1.387,11.371C69.03,94.132,70.14,95.888,70.997,97.897zM549.115,127.018c-0.428,0.403-0.244,1.42-0.276,2.219c1.648-0.713,2.573,0.185,3.604,0.832c0.273-0.652,1.39-0.461,1.387-1.387C552.455,127.931,551.521,126.738,549.115,127.018zM487.824,263.187c0.432,1.109,1.387,1.785,2.22,1.941c2.602,0.488,4.193-1.963,6.102-2.496c-0.019-2.754-2.084-3.463-4.16-4.16c0.195,1.285,1.627,1.332,2.218,2.219h-1.387c0.426,1.252-0.309,1.323-0.832,2.219C490.633,263.037,488.735,262.619,487.824,263.187zM531.365,317.268c0.213-1.045-0.338-1.326-0.276-2.219c-0.724-0.108-1.521-0.143-1.941-0.555c0.055-2.225-2.067-3.604-3.605-3.326c1.711,2.799,4.539,6.737,1.663,10.262c0.812,0.205,1.363,0.67,1.941,1.109c-0.785-0.047,0.23,1.709-0.555,1.664c-0.882-1.121-1.843-0.516-3.052-1.387c-1.927,5.375-8.42,6.186-9.429,12.479c0.273,0.744,1.745,0.289,2.219,0.832c-0.125,0.8-0.98,0.867-0.831,1.941c1.214,0.013,1.61-0.793,2.219-1.387c4.146,0.709,2.925-6.305,7.21-6.379c-0.845-2.485,1.602-3.395,2.219-5.268c3.261,2.072,2.059-4.911,5.547-4.438c0.229-1.125,0.661-3.201-0.276-3.883C533.046,317.127,533.13,317.608,531.365,317.268zM345,38.549c-0.315-1.349-0.999-2.329-2.22-2.773c-0.336,1.142-1.259,1.699-1.386,3.05C342.9,39.038,343.641,38.485,345,38.549zM107.604,38.826c-0.037,1.257-0.678,1.91-0.832,3.051c1.36,0.396,1.987,1.525,3.605,1.664C109.689,41.733,109.36,39.566,107.604,38.826zM99.007,76.544c1.175,0.066,1.963-0.255,2.773-0.555c-0.479-1-0.605-2.353-1.941-2.496C99.524,74.472,98.979,75.222,99.007,76.544zM226.301,102.06c-0.252-0.58-0.819-0.845-1.664-0.832c0.419-0.69,1.871-0.348,2.496-0.832c1.145-4.4-2.043-7.36-2.773-8.043c1.088-0.071,1.031,1.003,2.219,0.832c0.918-2.366-0.34-5.251-0.832-6.101c0.443-1.313,2.796-0.716,3.605-1.664c-0.004-1.383,0.348-3.121-1.109-3.051c1.635-0.676,3.09-1.532,3.328-3.605c0.043-1.36-2.713-0.465-1.109-1.941c-0.069-1.765,0.683,1.319,2.496,0.277c0.382-1.295-1.174-2.834-2.219-3.605c-0.037-1.704-0.174-2.959-0.832-3.883c-0.779-1.094-1.878-0.622-2.496-1.941c-0.085-3.461,2.502-2.074,4.714-1.664c1.921-3.455-1.632-5.615-1.941-8.32c-0.089-0.778,0.056-5.697,0.277-6.934c0.173-0.966,1.226-1.898,1.664-3.05c1.255-3.296,2.248-7.748,3.883-10.539c1.997-3.41,5.263-5.907,6.656-8.598c-1.116-3.413-3.897-5.163-7.488-6.101c-1.914,1.026-2.437,4.716-5.27,2.496c-2.121,2.408-3.206,5.853-7.21,6.378c0.194-5.175,6.612-6.108,4.438-11.925c-1.451,0.121-2.432,0.711-3.883,0.832c-0.801,0.863,0.517,3.845-1.387,3.605c-1.73-0.026-0.427-3.086-0.832-4.438h-5.269c5.136-0.27,11.624-0.722,13.866-4.714c-1.135-2.839-3.085-4.865-6.378-5.547c-0.384-3.869-3.139-5.366-5.269-7.488C213.461,1.193,208.826,0.836,204.67,0h-0.277c-3.664,2.622-8.069,4.503-12.482,6.378c-2.161,2.646-4.504,5.111-4.715,9.707c-1.418-0.431-3.088-0.61-4.714-0.832c-1.112,0.83-0.581,3.302-1.387,4.437c-1.373,0.585-2.547-2.524-4.438-2.773c-1.464-0.192-5.842,1.399-7.765,2.496c-1.987,1.134-3.005,3.594-4.16,4.438c0.464,1.868,1.703,3.674,0.277,5.269c-0.232,1.366-1.749-0.104-2.496,0c-2.679,3.145-5.753,5.895-6.656,10.816c0.435,1.323,3.585-0.072,4.438,0.832c1.856,7.468-7.349,8.253-11.648,11.371c-0.194,1.193-0.355,2.418-0.832,3.328c0.77,1.448,1.591,2.846,4.16,2.496c0.07,1.78,0.984,2.714,2.219,3.328c-1.552,0.389-2.381,1.502-3.605,2.219c0.476,1.969,5.355,2.947,2.219,4.438c1.065,1.801,3.538,2.193,4.992,3.605c2.103-1.161,4.107-2.39,6.656-1.941c2.381,0.419,3.431,3.517,5.824,3.328c-0.058,3.201,1.869,4.417,3.051,6.379c0.565,5.652,2.009,11.103,0.832,15.808c0.71,1.355,3.441,1.47,4.437,0.277c-0.143,2.084,1.846,2.036,2.219,3.605c-0.855-0.809-2.354-0.974-4.16-0.832c-0.835,2.631-1.626,7.101,1.387,7.765c1.69,0.021,3.163-1.636,3.605-1.941c0.741,1.222,0.463,2.523,0.277,4.16h-2.773c-1.839,2.757-2.398,11.093,0.555,13.035c0.405,6.99,3.631,11.16,6.378,15.808c3.021,0.307,4.676,1.98,6.656,3.328c2.055-1.736,3.476-6.114,2.496-9.152c0.278-1.851,2.511-1.744,3.05-3.605c0.417-1.438-0.663-3.267-0.277-4.715c-0.082,0.309,1.815-0.832,1.109-1.941c8.497,0.824,8.806-6.54,13.035-9.984C218.597,109.702,223.054,106.486,226.301,102.06zM221.588,97.066c1.034,0.26,0.797,1.791,1.109,2.773c2.425,1.391,0.942,0.93-1.109,0.278C221.952,98.905,220.972,97.611,221.588,97.066zM137.001,131.455c-0.167,1.647,0.192,2.767,0.555,3.882c1.415-0.433,1.224-2.473,1.664-3.882H137.001zM288.701,148.371c0.354-0.015,0.386-0.355,0.832-0.277c-0.231-1.341,0.259-1.961,0.556-2.773c-1.291-0.089-1.543,0.861-2.496,1.109C287.586,147.453,287.717,148.339,288.701,148.371zM203.564,262.63c-2.271-2.656-6.804-4.433-11.093-4.16c-0.474-2.328-3.73-3.257-6.102-2.773c0.087-0.375,0.395-0.529,0.277-1.109c-1.994-0.324-4.36,0.439-4.714,0.832c0.553-1.387,2.679-1.203,2.496-3.328c-1.23-0.525-1.867-1.644-1.664-3.605c-2.7-1.553-4.848-3.656-9.707-3.051c-2.043-1.469-2.926-4.1-6.102-4.436v-2.496c-4.183-0.523-7.329,0.047-11.093,0c-0.45-1.584-2.528-1.541-3.328-2.773c-0.979,0.408-0.748,2.025-2.219,1.941c0.199-0.73,1.641-1.052,0.832-1.941c-2.413-0.287-4.06,2.342-7.211,2.219c0.518,2.367-1.069,2.626-1.941,3.605c-1.842-2.73-4.503-1.326-7.766-0.832c-1.121-0.731-1.881-1.819-2.496-3.051c0.582-2.004,1.498-4.211,0.832-6.656c-1.963-2.15-5.712-0.66-8.32-0.832c1.176-2.891,2.449-5.686,2.773-9.43c-2.481,0.015-5.047-0.055-6.378,1.109c0.709,3.946-3.004,3.469-5.27,4.438c-3.893-1.451-6.27-7.334-4.16-12.203c-0.472-0.731-0.028-2.375-0.555-3.051c2.846-1.314,6.392-5.42,9.429-2.496c1.46-0.166,2.383,0.207,3.605,0.277c-0.028-1.502-0.907-1.631,0.277-2.496c1.6,0.758,4.687-1.224,4.715,1.387c1.103,0.086,1.393-0.641,2.496-0.555c2.597,1.564,1.676,6.644,4.16,8.32c-0.53,0.117-1.193,0.102-1.109,0.832c5.268-0.353,3.059-8.019,1.387-11.648c1.882-3.85,6.617-4.846,9.152-8.041c0.174-1.561-1.062-1.711-1.109-3.051c2.26-1.389,1.955-3.627,2.773-6.379c3.677,0.011,3.307-2.34,6.934-2.219v-1.664c-1.085-0.438-0.574,0.72-1.109,0.832c-1.598-4.464,5.545-5.967,8.042-7.211c-0.577,0.624-1.51,0.893-1.941,1.664c-0.202,1.311,0.395,1.823,0.832,2.496c2.647-2.344,7.095-2.889,9.429-5.546c0.028-1.322-1.167-1.421-1.109-2.773c-1.23-0.029-0.963,1.44-1.941,1.664c-1.557-0.078-4.295-2.458-4.437-0.555c0.005-1.206,0.092-2.495-0.277-3.328c0.784,0.229,0.719-0.39,1.387-0.277c0.016-1.034-0.28-1.754-0.555-2.496c-1.204-0.629-3.363,0.123-4.16-0.277c0.087-0.375,0.395-0.529,0.277-1.109c1.06-0.235,2.12-0.468,3.328-0.555c-0.113,1.462,1.849,3.102,4.437,2.773c-0.317-2.087-2.65-2.157-4.16-3.051c2.359,0.665,4.354,0.951,7.21,0.555c0.624-1.323,2.182-3.174,3.883-2.496c-1.336,2.455-2.152,5.429-3.883,7.488c0.283,0.365,0.272,1.023,0.555,1.387c1.872-0.413,4.122-0.235,5.824,0.277c-0.721-0.166-0.998,0.111-0.832,0.832c1.818,0.524,1.578-1.01,2.773-1.109c-0.413,0.993,0.545,1.951,1.941,1.941c0.513-0.781,0.859-1.73,1.109-2.773c-1.028-0.652-0.537-1.277-0.277-2.496c-0.497-0.704-1.702,0.657-1.941-0.555c0.706-0.033,1.075-0.403,1.109-1.109c-1.182-0.021-1.94-0.464-3.328-0.277c-0.109-1.092-0.778-1.626-1.664-1.941c2.022-2.323,0.794-4.513,1.109-7.488c-0.513-1.845-3.276-1.801-3.051-3.605c-1.917,0.067-1.757-1.941-3.883-1.664c0.295-2.052-2.032-1.481-2.219-3.051c-0.65-1.093,0.522-0.848,0.555-1.941c-1.615-3.285-3.429-6.371-4.992-9.707c-3.079,1.124-1.243,5.548-4.992,6.101c-0.806-0.766-1.824-1.319-2.496-2.218v-5.547c-0.896-0.399-2.058-0.531-3.051-0.832c-0.035-4.094-5.949-3.629-9.707-4.437c-1.438,2.833-0.448,6.015-0.277,9.707c-0.484,0.809-1.314,1.274-1.941,1.941c2.278,1.512,2.581,4.999,3.051,8.32c-1.07,1.334-2.207,2.6-4.16,3.051c0.196,2.485,0.953,4.408,1.387,6.656c-0.487,0.899-1.387,1.386-2.219,1.941c-0.113-1.189-1.973-2.083-1.664-2.773c0.529,0.119,0.697,0.598,1.387,0.555c0.091-1.016-0.308-1.541-0.555-2.219c-0.487-0.159-1.629,0.336-1.664-0.277v-4.992c-7.957,1.355-9.575-7.311-15.808-4.992c-0.47-1.564-0.748-3.32-1.109-4.992c-0.663-0.169-2.012,0.348-2.219-0.277c-0.491-4.999,1.497-10.414,6.102-11.925c-0.115-1.779-0.022-3.351,1.109-3.883h2.219c1.882-2.232,3.458-7.257,3.605-9.429c1.493-0.013,1.655,1.304,3.051,1.387c1.788-1.724,4.658-2.366,4.714-5.824c-0.393-0.901-1.845-0.742-1.664-2.218c0.683-1.443,1.511-2.742,1.109-5.27c-2.6,0.475-1.899-2.353-3.882-2.496c2.996,0.029,4.274,0.477,6.101,1.941c1.13-0.625,2.071-1.441,2.773-2.496c0.376,1.841,2.321,2.115,3.05,3.605c-0.451,0.659-0.539,1.68-0.832,2.496c0.892,0.689,1.555-0.704,2.496-0.832c0.746,2.489,3.474,2.997,3.328,6.378c-1.155,1.434-2.659,2.519-3.328,4.438c0.298,0.718,1.003,1.03,1.109,1.941c-1.288,1.048-3.456-0.192-5.269-0.277c-0.62,1.732-2.702,3.728-0.832,5.546c4.2-0.755,6.767-0.24,9.152,1.941v1.387c3.159,1.648,5.597,4.017,9.707,4.714c0.755-3.254-2.777-3.689-2.773-5.27c1.329,1.26,2.551,2.626,5.547,2.219c1.052-2.984-1.144-3.662-0.832-6.656c-1.833-1.318-4.486-2.637-3.605-5.824c2.214,1.206,2.501,4.339,4.992,5.269c0.547-1.21,0.451-3.063,2.496-2.773c0.259-1.776,1.182-2.887,1.664-4.438c-2.038-1.937-4.237-3.713-5.824-6.101c-2.541,0.229-4.436-0.186-4.438-2.496c0.223-0.701,1.142-0.707,1.664-1.109c-0.279-1.108-1.181-1.592-1.664-2.496c0.46-0.28,0.302-1.178,0.555-1.664c-2.408-3.785-4.946-7.441-9.984-8.597c-0.127-1.352,0.291-3.249-0.277-4.16c-2.206,0.626-4.253-0.045-5.546-1.109c0.817,0.048,1.716,0.746,2.226,0.272c0.207-1.779-0.323-2.82-0.277-4.438c-1.941-1.391-5.676-2.513-7.211,0c-0.243-0.68-0.249-1.599-1.109-1.664c-2.861,0.47-4.267,3.866-6.101,4.438c0.248-1.971,2.231-2.207,3.051-3.605c-0.929-1.012-3.427-0.456-4.992-0.832c-3.17,2.469-5.427,5.851-4.992,11.925c1.98,3.196,3.621,6.733,7.21,8.32c-0.645,1.944-0.094,5.083-0.277,7.488c-0.721,0.111-0.836,0.827-1.664,0.832c-0.169,0.663,0.348,2.011-0.277,2.218c-1.825-0.988-1.233-3.377-1.109-5.824c-0.785-0.695-1.098-1.861-2.219-2.219c-0.426,0.776-0.839,1.565-1.386,2.219c-0.989-1.414-1.55-3.258-3.051-4.16c0.449-0.66,0.996-1.222,1.387-1.941c-1.478-2.588-3.015-5.119-4.16-8.042c0.724-1.098,1.581-2.279,0.277-3.328c0.58-0.715,1.572-1.016,3.051-0.832c0.756-2.48,2.508-3.963,3.05-6.656c-2.517-1.039-5.768-1.89-8.875-0.832c-1.039,3.834,0.796,7.325,0.277,12.203c-1.649,1.493-2.088,4.198-2.773,6.656c0.933,2.025,2.394,3.522,4.16,4.714c-1.233,0.855-1.181,2.399-0.277,3.604c-1.208,0.733-1.641,2.242-2.496,3.328c-0.608-0.593-1.057-1.346-0.832-2.773c0.798-0.588,2.041-0.731,2.218-1.941c-1.401-1.649-2.232-3.869-4.16-4.992c-0.303,2.378-2.386,2.976-3.328,4.715c0.963,0.516,2.062,0.896,2.773,1.664c-1.111,0.368-0.487,2.471-1.387,3.05c-1.937,0.61-6.026-1.114-7.765-2.496c-1.193-0.948-1.298-2.271-2.496-2.496c-1.735-0.325-4.552,1.195-5.27,3.328c0.532,0.486,1.707,0.326,1.664,1.387c-1.268,0.69-2.127-1.117-3.328-1.387c-2.004,1.174-4.46,2.156-6.933,0.832c0.169-0.94,1.774-0.445,1.664-1.664c-0.955-1.074-1.433-2.598-3.328-3.051c-0.784-0.188-1.853,0.285-2.773,0c-2.925-0.906-4.431-4.464-7.766-3.883c-0.837,0.55-0.495,2.278-1.941,2.219c-0.265-0.843,0.594-2.812-0.554-2.773c-0.793,0.594-0.96,1.813-1.664,2.496c-1.185-2.051-1.841-4.63-4.438-5.269c-0.363,1.116-0.08,2.878-1.387,3.05c-0.788,0.049,0.335-1.814-0.832-1.386c-2.139,0.911-3.485,2.615-5.546,3.605c-0.284-0.641-1.276-0.574-2.219-0.555c-1.064,0.6-1.461,1.867-2.219,2.773c-1.707-0.567-2.893-2.637-4.992-3.051c-0.526-0.104-1.362,0.232-1.941,0c-1.083-0.434-1.794-1.924-3.051-2.219c-1.039-0.244-2.26,0.379-3.328,0.277c-2.916-0.277-6.045-2.649-9.984-1.941c-0.23-0.694-0.76-1.089-0.832-1.941c-3.548,0.681-3.865-1.867-6.379-2.219c-3.86,3.536-10.89,3.902-11.648,10.539c-1.488,0.176-2.987,0.341-4.16,0.832v2.773c3.245,1.561,4.689,4.925,6.933,7.488c-0.238,0.78-1.5,0.534-2.496,0.555v-1.387c-3.445,0.16-5.49,1.72-6.656,4.16c0.672,0.345,1.347,0.686,2.219,0.832c-1.963,4.124,4.199,2.453,6.101,3.604c0.758-0.258,1.182-0.851,1.941-1.109c-0.967,1.267,1.284,1.953,0.277,3.328c-1.657,0.007-2.66,0.668-3.328,1.664c-3.071-1.62-3.488,3.794-4.992,5.546c0.507,1.433,1.524,2.358,2.218,3.605c-0.394-0.549-3.613-0.692-3.882,0.555c0.757,0.722,1.473,1.485,3.05,1.387c0.721-0.204,0.727-1.122,1.109-1.664c0.588,0.798,0.731,2.042,1.941,2.219c1.211,0.194,1.234-0.801,2.219-0.832c0.539,1.112-0.435,2.41,0.555,3.328c2.023-0.811,3.769,0.033,4.714,1.109c0.199-0.726,0.417-1.432,1.664-1.109c-0.657,6.831-7.238,7.737-11.648,10.816c0.047,0.785,0.509,1.155,0.555,1.941c3.3-1.6,5.898-3.901,9.984-4.714c-0.114-0.669,0.506-0.603,0.277-1.387c3.358-1.819,5.732-4.622,8.043-7.488c-0.412-0.327-1.239-0.24-1.109-1.109c0.796-0.415,1.912-1.957,2.496-1.664c0.125,1.326,0.125,1.17,0,2.496c3.379,0.606,3.069-2.478,5.824-2.496c0.748-1.1,0.44-2.015,0.832-3.051c3.32,1.867,7.736,4.085,12.203,3.883c0.97,2.487,3.84,2.849,5.269,4.992c1.1,1.65,0.894,3.697,2.496,5.27c0.753,0.199-0.198-1.307,0.555-1.109c0.865,2.093,1.804,4.112,3.605,5.269c1.048-0.296-0.01-1.645,0.555-1.941c0.091,1.296,1.574,1.2,1.664,2.496c-0.604,3.493,3.533,4.585,3.883,8.043c0.082,0.729-1.076,0.218-0.832,1.109c1.419,2.002,3.516,3.324,5.547,4.714c-0.472,1.787,1.007,3.486,1.109,5.824c0.165,3.775-1.95,7.677,0,9.984c-0.378,0.545-0.264,1.584-0.554,2.219c0.706,0.682,0.991,1.781,0.832,3.328c1.903,1.166,2.407,2.74,2.496,4.992c0.939,0.91,2.296,1.402,2.219,3.328c7.011,0.014,5.377,8.674,9.984,11.092c-0.398,0.828-1.446-0.728-1.387,0.555c0.597,2.085,3.059,2.304,4.438,3.605c0.213,1.045-0.338,1.326-0.277,2.219c1.472,0.746,3.29,1.149,3.605,3.051c0.999-0.11,1.767-0.451,1.941-1.387c-2.481-1.965-2.889-4.375-4.992-7.211c-1.751-2.359-3.705-4.262-3.328-6.379c1.091-0.166,1.44,0.41,1.941,0.832c0.464,4.53,4.405,5.578,5.546,9.43c2.874,1.473,4.678,4.014,6.102,6.934c-0.233,0.599-0.719,0.945-0.555,1.941c3.569,4.012,9.133,6.03,14.976,7.766c0.758-0.257,1.183-0.851,1.941-1.109c3.416,1.945,5.833,4.89,11.093,4.992c0.466,1.475,2.189,1.694,2.773,3.051v1.941c0.664,0.168,1.265,0.398,2.219,0.277c0.789,0.728,0.543,1.05,0.832,1.941c2.755,0.018,3.95,1.596,6.933,1.387c0.133-0.875-0.851-0.629-0.555-1.664c0.799-0.507,0.867-0.451,1.941-0.277c-0.243,1.814,1.061,2.08,1.387,3.326c-0.408,2.403,1.285,5.188-1.387,5.27c-0.745,2.492-2.816,3.656-3.883,5.824v2.496c0.415,0.324,1.135,0.346,1.387,0.832c-0.85,0.352-1.459,0.946-2.219,1.387c0.273,1.455,0.97,1.756,0.555,3.328c5.08,2.421,5.14,9.298,8.32,13.312c2.223,2.804,5.73,3.178,8.043,5.824c1.311,6.908-1.255,13.664-1.109,19.412c-0.325,0.416-0.345,1.135-0.832,1.387c1.007,4.632-1.262,9.011-3.051,12.48c1.385,4.586-2.046,8.76-0.277,12.758c-2.374,1.217-0.725,4.006-1.387,5.545c-0.331,0.771-1.861,0.363-1.109,1.664c0.607,0.922,1.493-0.846,1.941,0c-0.232,0.323-0.365,0.744-0.277,1.387h-1.664c0.163,6.51,0.022,7.768,1.109,12.758c0.708,0.123,1.275,0.389,1.664,0.832c-0.741,0.774,0.259,1.369,0.277,2.219h1.387c1.902,2.961,4.795,3.24,8.042,4.715c0.36-0.688-0.619-1.346,0-1.387c2.043-0.267,4.081-0.541,4.438-2.496c-5.538-0.306-5.736-5.73-6.102-9.984c0.982,0.15,0.682-0.982,1.664-0.832c-0.149-1.072,0.495-1.353,0.277-2.496c1.241-0.608,2.017-1.68,3.328-2.219v-2.773c-2.003,0.246-2.667-0.846-3.051-2.219c0.805-1.414,3.02-1.418,3.883-2.773c-0.069-0.856-0.282-1.567-0.555-2.217c1.195-0.099,1.052-1.537,2.773-1.109v-2.773c-1.047-0.237-1.302,0.92-1.941,0.277c0.223-0.962-0.413-1.066-0.277-1.941c0.874,1.395,2.958,0.574,4.16,0c0.344-1.179,0.714-3.029,0.832-3.605c3.874-0.379,7.205-1.301,8.043-4.715c-1.175-1.375-0.42-2.973-1.941-3.883c1.639,0.672,3.745,0.025,5.546,0c3.271-4.771,8.599-7.486,8.597-15.531c2.45-3.465,7.411-4.42,11.925-5.824c0.861-4.963,3.742-7.904,2.773-14.697c2.821-3.34,7.948-6.182,5.824-12.758H203.564zM166.676,174.442c1.229,0.18,0.655,1.089,0,1.386C165.863,175.593,166.842,174.935,166.676,174.442zM147.263,172.5c-0.312,2.855-1.72,5.189-5.269,4.714c0.18,0.282,0.638,0.287,0.555,0.832c-1.868,2.472-5.301,6.236-9.152,4.16c1.688-2.377,4.486-3.513,6.934-4.438C140.105,174.565,144.937,174.072,147.263,172.5zM124.245,164.458c1.223,0.071,2.146,0.443,3.605,0.277c-0.072,0.812,0.627,0.852,0.555,1.664h1.664c-0.023,1.779,1.553,1.959,1.387,3.883c3.693,0.004,8.069-0.674,8.042,3.051c-0.259,0.203-0.42,0.504-0.555,0.832c-0.876,0.044-1.674,0.01-1.941-0.555c-1.146,1.248,0.563,4.221-1.387,4.992c-0.982-0.034-0.46-1.574-1.109-1.941c-0.63,0.202-0.829,0.834-1.109,1.387c-2.482-0.701,0.362-2.579-0.554-4.16c-0.099-0.733-1.414-0.251-1.664-0.832c-1.02,0.645-0.859,2.469-2.496,2.496c0.067,3.495,2.176,7.099-1.941,7.765c-1.485-1.233-2.067-4.571-1.109-6.656c-2.06-1.123,0.587-3.278,0.832-4.714c1.306,0.011,2.099-0.489,3.326-0.556c-0.44-1.222-2.109-0.244-2.496,0.277c-1.708-0.021-2.37-1.562-3.605-0.555c-0.321-0.41-0.321-0.699,0-1.109c-0.795,0.499-1.547,1.042-2.218,1.664c-1.58,0.192-2.304-0.47-3.883-0.277C118.568,167.84,123.264,168.007,124.245,164.458zM138.666,89.301c2.734-1.553,1.957-1.126,0.277,1.109c-1.351-0.242-1.839,0.379-2.773,0.554c0.872-1.291-0.403-2.451-0.277-3.882C136.35,88.289,137.562,88.741,138.666,89.301zM128.127,91.796c0.028-1.136,0.055-2.273-0.277-3.05c0.372-0.183,0.516-0.593,0.554-1.11c0.617,0.117,0.217,1.471,0,1.664C128.314,89.968,128.641,92.47,128.127,91.796zM147.817,329.746c-1.454-0.995,0.572-2.557,0.277-4.158C149.226,326.467,147.621,328.105,147.817,329.746zM539.958,122.022c0.416-0.324,0.679-0.801,1.388-0.832c0.686,0.329,1.028,1.005,0.831,2.218c2.108,0.481,3.139,2.039,5.547,2.219c0.357-1.491,1.465-2.232,1.109-4.437c2.166,0.131,2.505-1.563,3.883-2.219c-1.477-2.499-3.021-4.929-7.488-4.438c-5.888-6.037-10.844-13.006-23.02-12.757c-0.741,1.57-0.075,3.895,0.556,4.992c-0.854-0.206-0.532,0.762-1.386,0.555c0.304-1.598-1.86-0.728-1.941-1.941c1.109-0.37,2.195-0.763,1.941-2.496c-0.902-0.207-1.718-0.502-2.496-0.832c-0.723,0.943-1.233,2.095-2.22,2.773c-2.527-2.11-8.091,0.145-10.538-1.664c2.196-6.064-6.687-6.726-11.094-4.992c0.748-3.181-5.334-1.857-4.16-6.379c-5.552-0.364-8.693-3.138-14.697-3.05c0.875,1.703-0.674,1.19-1.664,1.664c-0.67,1.758,0.374,3.017,0.555,4.714c-3.036,0.198-6.814-1.515-8.32,0.832c-1.435-0.413-1.382-2.315-2.772-2.773c-0.947,1.734-0.716,4.646-2.496,5.547c-1.134-1.27-1.815-2.992-2.496-4.715c3.666-6.494-3.467-10.4-10.261-9.984c-0.024,1.41-0.122,2.895,0.555,3.605c-1.917,1.103-4.769-0.223-6.379-1.109c-0.274-1.086,0.613-1.611,0-2.219c-2.025,0.175-3.464-0.233-4.715-0.832c-0.767,0.62-1.693,1.08-2.772,1.387c-0.819-1.591-1.41-3.042-0.555-4.992c-1.713-0.924-3.486-0.369-3.883,1.387c0.795,0.5,1.856,0.731,2.496,1.387c-0.152,0.404,0.323,1.434-0.277,1.387c-1.531-0.503-2.645-1.424-3.883-2.219c1.476-2.233,5.632-3.972,6.379-6.933c1.483-5.889-3.113-10.075-9.707-9.429c-0.109,0.908-0.062,1.973-1.387,1.664c0.223-1.349,1.494-1.649,1.387-3.328c-1.562-0.194-3.612,0.099-4.438-0.832c1.014-0.189,1.354-1.052,2.22-1.387c-0.658-1.56-2.229-2.208-3.605-3.051c-1.867,2.662-5.366,3.694-4.992,8.598h-3.05c-0.161,0.9,0.188,1.29,0.277,1.941c-0.913,0.382-1.861,0.727-2.773,1.109c-0.136-0.875,0.499-0.979,0.277-1.941c-2.358,0.138-3.163,1.83-6.103,1.386c-3.272,4.253-13.82,5.227-10.537,13.312c-3.36,0.894-7.088,1.418-10.263,2.496c0.517,1.98,0.914,4.078,1.388,6.101c1.397-0.003,2.489,1.752,2.219,2.496c-2.229,0.433-2.459-3.427-5.824-2.773c-0.172-0.658-0.373-1.291-1.109-1.386c-1.85,0.598-0.419,2.988-2.495,3.05c0.622-2.489-0.763-5.074-2.773-5.824c-1.32,1.71,2.708,6.01-1.387,6.656c-1.133,2.385,0.021,4.446,0.832,6.379c-0.95,2.204-1.455,4.916-0.277,7.21c0.415,0.047,1.023-0.099,1.109,0.277c-1.118,1.202,0.24,3.222,0,4.714c-0.412,2.546-2.766,4.237-4.438,5.547c-0.188-0.645-0.921-0.742-1.109-1.387c2.214-1.854,4.797-3.339,4.438-7.765c-2.623-2.553,0.356-10.71-2.218-13.312c0.501-1.81,1.368-3.254,1.107-5.824c-0.694-0.507-1.825-0.577-2.218-1.387c1.153-0.738,0.148-2.272-0.277-3.051c-1.097,0.013-1.607,0.61-2.495,0.832c-1.007,2.969-1.985,5.965-2.773,9.152c-1.479,0.554-2.258,1.809-2.496,3.605c0.409,0.7,0.979,1.239,1.109,2.219c-0.068,1.227-0.569,2.02-0.556,3.328c1.267,1.084,2.673,3.377,2.496,4.992c-3.694-4.255-10.649-5.25-14.421-9.429c-0.275,0.927-1.112,1.291-1.387,2.218c1.929,1.121,3.366,2.735,4.159,4.992c-0.693,0.23-1.088,0.76-1.941,0.832c0.022-0.483-0.061-0.862-0.275-1.109c-2.064,0.71-3.039,2.507-6.38,1.941c-0.766-0.119-0.261,1.033-0.832,1.109c-0.892-0.403-0.259-2.33-0.831-3.051c-3.523,1.561-6.285,3.883-9.707,5.546c0.123,1.881,0.061,3.573-1.941,3.328c-0.386-1.092-1.316-1.641-1.941-2.496c0.47-0.641,1.415-0.804,2.496-0.832c-0.117-1.638-1.146-2.364-1.664-3.605c-1.554-0.202-2.883-0.63-4.437-0.832c-0.271,1.751,1.415,1.543,1.387,3.051c-0.619,1.662-0.379,4.296,0.832,4.992c0.167,1.091-0.409,1.44-0.832,1.941c-1.009-0.284-1.715-0.873-2.772-1.109c-1.474,1.3-2.931,2.617-4.16,4.16c0.436,0.766,0.772,1.63,1.108,2.496c-1.72-0.684-3.222-1.585-5.27-1.941c-1.995,2.497,0.946,3.457,1.387,4.992c-2.071-0.239-2.89-1.731-4.16-2.773c1.289-2.681-0.686-5.964-1.387-6.656c2.328,0.724,4.581,1.521,6.934,2.219c1.458-0.854,3.449-1.174,4.438-2.496c0.633-5.148-2.666-6.771-5.27-8.875c-2.113-1.706-4.648-2.622-6.935-2.773v-1.664c-1.417-1.769-3.637,0.616-5.269-0.832c1.083-0.395,1.822-1.135,2.219-2.218c-2.123-0.929-3.594-2.508-5.824-3.328c-0.205,0.811-0.671,1.363-1.109,1.941c0.028-1.836-1.439,0.357-1.663-0.277v-1.941c-1.652,0.012-1.739,1.589-2.773,2.219c-0.646-0.122-0.742-1.225-1.387-0.555c-1.887,1.535-3.02,3.823-6.935,3.328c-0.706,1.236-0.96,2.923-2.771,3.051c-0.165,0.574,0.343,1.821-0.277,1.941c-0.716-0.067,0.381-0.477,0-1.109c-1.985,0.233-2.628,1.81-4.16,2.496c-0.318,0.813,1.33,1.03,0.556,1.387c-1.491,0.151-2.941,1.585-2.496,2.773c1.388-0.553,2.418-1.464,4.16-1.664c-3.509,4.997-5.684,11.328-8.875,16.64c-0.323-0.233-0.743-0.365-1.387-0.277c-0.354,0.941-0.828,1.761-1.387,2.496c-3.528,1.133-6.497,5.862-4.16,10.261c-0.118,0.529-0.793,0.502-0.555,1.387c0.739,0.92,1.861,1.507,0.832,2.773c3.017,3.237,5.973,0.221,8.597-1.386c1.041,2.472,1.372,5.653,2.773,7.765c-1.511,0.045-2.462,1.869-3.605,1.387c0.229-0.974,1.784-0.619,1.387-2.219c-1.314-0.122-0.219-2.035-0.555-3.605c-3.937,0.125-6.394,5.32-3.328,8.32c-0.19,1.239-0.885,1.524,0,2.496c-0.766,0.685-1.409-0.435-2.496-0.277c0.356,1.557-1.382,1.021-2.496,1.109c-0.52,0.529-0.03,0.697,0,1.387c-2.746-0.14-2.301,5.229-6.07,4.991c0.145-0.214,0.236-0.482,0.247-0.831c-0.477,0.014-0.711-0.214-0.832-0.555c0.86-0.158,0.729-1.305,1.664-1.387c-2.39-3.064-4.336-6.572-6.101-10.261c-0.488-0.159-1.629,0.335-1.664-0.277c0.804-1.137,1.781-2.103,2.219-3.605c-0.145-0.41-0.411-0.698-0.555-1.109c-0.843-0.173-2.388,0.355-2.773-0.277c0.659-0.173,1.291-0.372,1.387-1.109c0.062-0.524-0.312-0.612-0.277-1.109h-3.605c-0.331,0.962-0.434,2.154-1.109,2.773c-0.399-0.613-0.677,0.349-0.832-0.277c0.753-0.357,0.841-1.378,0.829-2.498c-1.671,0.178-2.232,1.465-2.218,3.328c0.959-0.062,1.262,1.279,2.496,1.664c-0.537,0.447-0.875,1.927,0,2.219c-0.411,0.327-1.238,0.239-1.109,1.109c1.154,0.169,1.391,1.681,2.219,1.387c-0.599,0.594-0.142,1.549,0.277,1.941c0.875,0.136,0.979-0.499,1.941-0.277c-0.223,1.424,1.247,1.157,0.832,2.773H253.2c-0.184,0.977-0.189,1.287-0.555,2.496c0.415,0.047,1.023-0.099,1.109,0.277c-0.396,0.806-1.777,0.626-1.941,1.664c0.002,1.107,1.688,0.531,2.219,1.109c-1.122,0.911-2.08,1.987-2.773,3.328c0.529,0.119,0.697,0.598,1.387,0.555c0.763-1.344,2.288-0.612,3.328-1.941c0.416,0.324,0.679,0.801,1.387,0.832c0.72-1.579,4.014-0.582,4.99-1.904v1.626c-1.233,0.43-2.307,1.02-3.05,1.941c-1.174,0.064-0.629-1.59-2.219-1.109c-1.064,0.955,1.128,2.6-0.277,3.051c-0.895,0.248-0.39-0.904-0.832-1.109c-1.336,0.236-2.25,0.894-3.328,1.387v1.941c5-0.213,7.114,6.119,3.883,9.429c-2.169-1.031-5.433,0.387-8.597-1.109c-0.796,0.499-1.147,1.441-2.219,1.664c0.874,4.606-0.221,8.002,0.555,12.758c1.032,0.449,2.056-0.444,3.328-0.555c0.434,0.86,1.134,1.455,1.664,2.219c-1.263,0.584-1.351,2.345-1.941,3.605c-2.554,0.588-3.734,2.551-4.715,4.713c1.505,3.262-1.12,5.953-4.715,5.824c-0.098,0.155-0.186,0.311-0.278,0.467c-0.131-1.118,0.205-1.771,0.281-2.683c-1.461,0.111-1.573,1.57-1.941,2.773h1.606c-1.258,2.146-2.049,4.33-3.551,6.654c-0.894,1.385-2.079,2.006-2.219,3.051c-0.254,1.896,0.736,1.793,1.109,3.328c0.198,0.817-0.709,2.197,0.277,3.051c0.065,1.359-0.488,2.099-0.277,3.605c-0.437,0.672-0.992,1.226-1.664,1.664c0.697,1.059,1.03,2.483,0.832,4.438c0.737,0.187,1.412,0.436,1.941,0.832c0.242,2.992,3.977,2.492,3.882,5.824c3.332,1.233,5.177,5.738,9.152,5.545c0.849-0.041,1.826-1.168,2.773-1.387c1.868-0.429,3.377,0.672,5.547,0.555c3.826-0.203,9.628-5.625,11.371,0.832c1.884,0.398,3.673-0.754,4.992,0c-1.222-0.389-0.751,0.914-0.832,1.664c0.709,0.215,1.275-1.084,1.664-0.277c0.577,1.064-1.28,3.137,0,4.16c-0.559,0.736-1.033,1.557-1.387,2.496c1.97,4.203,7.593,7.473,6.656,12.758c3.717,4.537-3.438,7.014-1.94,13.59c1.069,2.455,3.188,4.891,3.883,7.764c0.628,2.602,0.35,5.457,1.387,7.766c1.462,3.258,4.464,5.277,4.714,8.875c-1.26,0.744,0.049,2.371,0,3.605c1.339-0.166,1.564,0.818,3.052,1.109c2.042-0.896,4.909-2.064,7.487-0.832c5.844-0.905,7.945-5.553,10.815-9.43c0.566-0.266,1.098-0.566,1.664-0.832c0.168-1.475,0.636-3.891,0-5.27c1.646-0.664,3.244-1.379,4.438-2.496c0.382-3.246-0.71-5.021-1.387-7.209c1.749-2.961,8.165-3.846,9.152-7.766c0.88-3.496-0.704-7.475-1.941-10.262c0.547-0.193-0.068-1.547,0.555-1.664c-0.278-1.107-1.182-1.592-1.664-2.496c4.334-11.105,18.769-13.586,19.137-27.732c-3.242,1.195-6.979,1.894-10.815,2.496c-1.153-1.029-1.323-1.736-0.832-2.773c5.223-0.602,8.15-3.499,13.034-4.438c0.479-0.168-0.021-1.317,0.555-1.387c4.143-0.48,5.775-3.469,8.875-4.992c-1.232-2.535,2.659-3.127,2.495-5.547c-0.168-2.488-3.33-2.11-4.991-3.883c0.169-0.662-0.349-2.012,0.277-2.219c-0.089,0.645,0.044,1.065,0.277,1.387c5.575,0.562,10.045,0.9,14.697,0.277c0.278,2.774,2.509,3.594,4.716,4.438c-0.685-0.037-1.338-0.041-1.664,0.277c0.461,1.982,4.496,4.785,5.823,1.664c0.145,8.545,3.934,13.445,5.823,20.246c0.872,0.236,1.171,1.047,2.219,1.109c1.285-0.935,2.703-1.734,3.328-3.328c-0.854,2.297-0.306,4.698,0.277,6.932c1.257-0.037,1.91-0.678,3.051-0.832c1.392-3.164-1.407-4.924-3.051-6.654c0.131-2.426,1.211-4.445,0.555-7.488c0.566-0.658,1.099,0.381,1.664-0.277c0.381-0.632-0.715-1.043,0-1.109c0.668,0.114,0.604-0.507,1.387-0.277c1.096-3.157,4.325-4.18,6.656-6.102c0.389-1.275,0.818-2.509,2.219-2.773c-0.165,1.99,4.646-0.711,4.991-0.832c0.081,2.231,1.888,2.737,3.052,3.883c0.632,2.34,1.98,3.937,0.832,6.656c1.128,0.072,1.881,0.521,2.772,0.832c0.752-0.821,1.283-1.862,2.496-2.219c1.903,4.094,2.025,8.299,1.109,13.59c3.921,0.516,3.146,7.205,5.269,8.596c-3.603-1.479-4.101-6.068-9.706-5.547c-0.362,2.488,1.813,2.439,2.773,3.605c0.438,1.596,1.603,2.465,2.772,3.328c2.622,4.682,5.123,9.484,10.538,11.371c-0.086,0.655-0.963,0.516-0.832,1.387c4.411,1.736,12.297,3.65,16.64,2.773c0.027,0.436-0.036,0.961,0.556,0.832c4.865,0.218,9.895-1.065,12.758-0.555c-1.244,0.235-1.71,1.248-2.219,2.219c3.308,0.786,5.522-1.853,7.211-3.605c-1.276,0.18-1.608-0.152-1.109-1.109c-1.251-0.234-1.385,0.648-2.219,0.832c-0.495,0.746,1.22,0.535,0.277,0.832c-3.423-1.99-8.767,1.342-12.759-1.109c-0.612,0.398,0.351,0.676-0.276,0.832c-1.292-0.519-1.958-0.027-3.605-0.277c-1.331-1.905-4.004-2.467-6.655-3.051c-2.301,1.604-4.878-0.935-7.211-1.109c0.766-1.267,0.751-3.316,1.941-4.16c-0.19-1.012-1.051-1.352-1.387-2.219c-0.845-0.012-1.078,0.586-1.664,0.832c-0.146-1.148-0.854-1.734-1.941-1.941c1.025-1.164-0.55-1.504-0.832-2.219c0.525-0.123,1.672,0.377,1.388-0.555c-0.663-1.555-1.445-2.992-1.109-5.547c-1.364-1.502-2.482-3.248-4.438-4.158c-0.21-1.547-1.158-2.353-1.939-3.328c0.264-2.047,0.92-3.701,1.939-4.992c0.411,0.05,0.256,0.67,0.277,1.109c2.936,0.39,3.358,3.297,5.824,4.16v1.941c2.788,0.082,4.033-3.715,7.211-4.16c1.279-7.289-2.898-9.121-5.271-12.758c0.738-1.946,2.943-3.895,5.548-3.051c0.395,1.875-1.532,1.425-1.664,2.773c0.266,3.769,4.832,1.689,4.438-1.387c0.088-0.736-1.553,0.26-1.109-0.832c0.77-1.726,4.123-0.869,4.992-2.496c1.031,0.558,2.268-1.053,4.159-0.555c3.832-1.992,4.661-6.986,8.32-9.152c0.144-1.334,0.591-2.367,0.832-3.605c-0.437-0.486-1.485-0.363-1.941-0.832c0.676-0.156,1.427-0.236,1.387-1.109c-0.658-1.973-1.822-5.473-3.883-6.932c1.037-1.705,1.942-4.18,4.715-3.328c0.089-0.652,0.438-1.041,0.277-1.941c-2.019-0.502-4.42-0.328-5.824,0.555c-0.237-1.242-1.511-1.447-1.664-2.773c0.448-0.477,1.16-0.69,2.22-0.555c0.406-1.904,2.024-2.598,3.604-3.328c-0.488,2.111-1.134,2.76-1.387,4.715c2.382-0.32,3.899-3.947,6.379-1.664c-0.366,0.835-0.896,1.507-0.832,2.773c0.839,0.455,1.491,1.096,3.051,0.832c-1.383,1.42-0.229,4.156,0,6.379c2.06-0.16,2.839-1.597,4.714-1.941c1.201-4.164-1.488-6.326-2.771-8.875c3.132-1.399,3.913-5.146,6.655-6.934c0.805,0.211,0.719,1.314,1.94,1.109c5.698-2.252,7.08-8.82,11.094-12.757c0.479-2.85-0.19-6.847,1.388-8.597c0.849,5.03-0.226,10.769,0.555,14.698c-1.876,0.831-0.311,2.37-1.109,4.715c-1.697-0.496-1.272,1.13-2.496,1.109c-0.187,1.389,0.257,2.146,0.277,3.328c0.846,0.352,1.412-0.948,1.664-0.277c-2.283,2.248-1.873,7.187-5.27,8.32c0.622-0.598-0.194-0.982-1.109-0.832c-0.965,0.699-0.961,2.367-1.664,3.328c-4.279-0.567-7.201,2.586-9.43,4.992v1.107c1.698,0.209,0.737,1.496,0.832,3.051c2.427,1.069,3.225-1.467,3.604-3.326c0.53,0.117,0.502,0.791,1.387,0.553c0.153-2.037,2.149-0.58,2.773-2.217c0.566,0.264,1.098,0.566,1.664,0.832c0.515-0.78,1.301-1.289,1.664-2.219c1.283,0.887,1.846-0.605,3.051,0c0.047-0.416-0.1-1.023,0.277-1.109c0.026,0.436-0.037,0.961,0.555,0.832c2.174-0.508,2.074-3.287,2.219-5.824c2.791-1.806,1.226-7.531,0-9.152c1.477-0.98,2.354,0.696,3.604,0.832c0.396-2.193,3.226-1.952,4.438-3.328c-0.191-0.547-1.547,0.068-1.664-0.555c0.888-0.314,1.942-0.461,1.941-1.664c-1.486-0.049-1.906,0.347-3.604,0.555c-1.121-1.097-2.589-1.849-3.051-3.605c0.64,0.085,0.309-0.801,0.831-0.832c0.828-0.062,0.943,1.024,1.664,0.277c0.125-2.868-3.141-4.725-0.555-6.934c1.105-0.274,0.836,0.829,1.94,0.555c0.031-2.364-1.396-4.947-1.94-7.488c-0.441-2.059,0.563-5.818-2.218-6.102c0.084,1.194,0.02,2.239-1.109,2.219c-0.59-0.797-1.587-1.186-1.941-2.219c-2.002-0.699-2.632,1.425-3.327,1.109c0.087-0.375,0.394-0.529,0.276-1.109c-0.973,0.048-2.078,0.229-1.664-1.109c-0.858-0.366-1.538,0.822-1.94,0c4.192-3.572,7.234-8.295,11.37-11.925c3.167-0.257,4.107,0.385,6.102-0.555c0.809,0.3,1.597,0.621,2.773,0.555c0.479-0.169-0.021-1.316,0.555-1.387c1.296,0.09,2.435,0.867,3.051,0.832c-0.717,0.355-0.533,0.911-0.277,1.664c2.129-0.552,4.545-0.817,6.934-1.109c0.218-1.235-1.488-0.546-1.386-1.664c1.509-2.87,3.716-7.254,7.765-5.824c-0.729,1.074,0.163,2.495,0.555,3.328c2.041-0.825,2.581-3.15,4.992-3.605c0.302-1.176-0.165-3.123,1.387-3.05c-1.299,0.92-1.143,3.294-1.387,5.269c-5.6,0.873-4.862,8.08-10.539,8.875c-0.296,1.036,0.69,0.79,0.555,1.664c-4.59,3.605-1.077,12.094-0.276,17.472c2.996-0.794,2.121-5.46,5.547-5.824c0.513-0.782-0.006-2.595,0.555-3.328c1.505,0.303,1.845-0.56,3.052-0.555c0.152-1.624-1.284-2.853-0.556-4.16c0.873-0.134,0.628,0.851,1.664,0.555c1.041-1.09,0.521-3.076-0.832-3.328c0.262-0.847,1.351-0.869,1.387-1.941c-0.669-0.44-1.473-0.745-2.219-1.109c0.219-0.539,1.007-1.927,1.387-1.387c-0.335,0.059-0.171,0.308-0.005,0.551c1.018-0.371,2.064-0.708,2.496-1.664c-0.145-0.41-0.41-0.699-0.555-1.109c-1.015-0.257-1.27,1.664-1.664,1.109c0.184-0.741,0.117-1.733,0.555-2.219c1.366,0.036,2.249,0.168,3.605-0.832v1.387c1.473-0.746,1.771-2.666,3.883-2.773c1.339,0.324,1.448,1.879,3.05,1.941c-0.006-0.653,0.479-0.816,0.277-1.664c3.97-1.838,7.351-8.132,13.035-5.546c2.082-2.263-0.26-6.496-1.941-8.32c1.739,0.261,2.108-0.849,3.328-1.109c-0.159-1.637,0.542-2.416,1.109-3.328C538.139,121.438,539.371,121.407,539.958,122.022zM317.82,173.61c0.314,0.052,0.154,0.278,0,0.277c-0.242,0.888,0.427,0.867,0.832,1.109c-0.341,0.583-0.767,1.081-1.108,1.664c-1.957,0.116-2.438,0.282-3.605-0.555C314.94,174.98,316.688,174.603,317.82,173.61zM305.896,176.382c2.439-1.692,2.151-1.59,4.992-0.556c-0.085,0.655-0.963,0.516-0.832,1.387c0.236,0.413,0.894,0.402,1.387,0.555c-0.625,0.621,0.019,1.389,0.277,1.941c4.951-3.826,9.582,1.35,12.203,4.715c-1.91,1.153-3.562,1.93-6.103,1.387c-2.506-0.535-3.719-2.819-6.656-2.219c-1.372,0.281-1.656,1.293-3.326,2.219c-2.77,0.328-4.646-1.594-4.438-3.328c-0.059-0.89,0.99-0.674,1.387-1.109C304.163,178.717,306.398,178.919,305.896,176.382zM276.777,153.364c0.457,0.405-0.333,1.485,0.832,1.664c2.205-0.273,1.079-2.372,4.16-1.941c0.92-0.189,0.31-1.908,1.109-2.219h1.664c1.706-2.545,0.866-7.637,4.158-8.597c-0.705-1.17,0.438-1.403,0.832-2.219c-0.769-1.172-1.598-2.285-2.496-3.328c-1.02-7.307,4.793-7.779,6.935-11.925c-2.307-2.316,1.46-6.666,4.714-3.882c0.014,2.411-2.246,4.054-3.605,5.824c-1.226,1.595-2.258,2.891-3.051,4.715c0.557,1.917,1.756,4.096,0.277,5.824c0.921,1.204,2.384,1.867,3.604,2.773c2.54-0.225,6.927-3.811,8.599-0.555c-1.789,2.555-8.294-0.957-8.875,3.051c-0.55-0.004-0.353-0.757-1.109-0.555c-0.542,0.995-1.102,1.936-0.832,3.328c1.039-0.07,1.783-0.435,2.219-1.109c0.491,0.249,0.354,1.126,1.388,0.832c-0.057,0.868,0.188,2.036-0.277,2.496c-1.587,0.2-1.051-1.723-2.496-1.664c-3.932,1.06-0.652,9.331-5.547,9.429c0.037-0.684,0.042-1.336-0.277-1.664c-2.475,0.574-4.172,1.928-6.933,2.218c-0.401-0.431-0.37-1.294-0.832-1.664c-1.455,0.301-2.373,1.14-3.328,1.941c-0.557-0.736-1.046-1.541-1.941-1.941C275.743,153.624,276.896,154.13,276.777,153.364zM308.396,203.559c-6.295,3.998-12.373-4.838-17.75-0.832c0.085,1.287-0.002,2.403-0.555,3.051c-2.067-0.336-3.339-1.466-5.27-1.941c-1.036-3.123-6.305-2.016-8.598-3.881c0.269-1.117,1.075-1.699,1.664-2.496c-0.41-0.607-0.541-1.494-1.109-1.941c0.188-0.645,0.921-0.742,1.109-1.387c-0.569-0.447-1.997-0.037-1.941-1.109c-6.176,1.278-15.354,0.077-19.136,4.438c-0.934-1.656-3.462,0.502-4.438-1.109c0.45-1.399,2.146-1.553,4.16-1.387c1.814-0.959,2.902-2.647,4.438-3.883c0.182-1.015-0.601-1.064-0.555-1.941c1.093-2.051,2.558-3.729,4.992-4.438v-2.773c0.474,0.011,0.718-0.206,0.832-0.555c1.21,0.084,1.892,0.696,2.773,1.109c1.88-0.523,3.097-1.709,4.437-2.773c0.651,0.088,1.041,0.437,1.941,0.277c0.857,5.631,8.779,5.619,8.875,11.094c-2.021,1.172-4.279-0.797-5.547,0.832c0.688,1.9,2.738,2.437,4.992,2.773c0.835-1.662,1.224-3.767,3.326-4.16c0.391-1.498-0.748-1.471-0.83-2.496c1.068,0.039,1.28,0.937,2.494,0.832c1.188-2.806-4.288-2.357-3.326-4.992c-4.062-0.286-4.859-3.832-6.103-6.934c0.448,0.078,0.479-0.261,0.832-0.277c1.15-0.226,0.139,1.71,0.832,1.941c0.938,0.106,0.437-1.228,1.664-0.832c0.604,4.019,4.471,4.774,6.933,6.934c-0.277,3.791,1.53,5.496,3.328,7.211c-1.195,1.138,0.989,2.361,1.387,3.605c1.106-0.152,0.836-0.152,1.941,0c0.057-0.797-0.071-1.41-0.555-1.664c1.2-0.803,1.967-0.391,2.772-1.664c-0.762-1.549-2.396-2.225-3.048-3.884c1.019,0.19,1.86-0.404,1.664-1.664h2.496c1.199,0.465-0.463,3.791,1.664,3.328c0.445,1.092-1.198,0.096-1.109,0.832v0.555c0.357,0.889,2.729,1.627,1.388,2.496c0.006,0.826,1.309,0.355,1.664,0.832c0.295,1.033-1.04,0.438-0.832,1.387c0.068,0.301,0.551,0.188,0.555,0.555c1.302,0.286,0.738-1.295,1.94-1.109c0.253,0.486,0.973,0.506,1.388,0.832c0.777-0.332,1.768-0.451,1.664-1.664c1.376,1.035,4.43,2.9,5.546,0.277c0.899-0.162,1.29,0.187,1.94,0.277c-0.045,3.927-1.389,6.56-2.772,9.15C310.656,205.028,309.764,204.141,308.396,203.559zM317.544,220.201c-2.543-2.172-2.975-6.455-5.27-8.875c0.279-0.177,0.955-0.168,1.941-0.277c1.354,4.377,5.887,5.576,5.823,11.371c3.412,2.875,5.955,6.617,6.38,12.48C322.383,231.078,318.146,227.457,317.544,220.201zM333.074,175.274h1.388c1.816-4.4,10.05-3.178,9.43,2.496c-0.836,0.338-3.067,0.018-4.16-0.277c-0.55,0.525-0.135,1.311,0,1.941c-0.684,0.036-1.336,0.041-1.665-0.278c0.572,0.358,1.287,2.961,3.051,3.051c0.196,1.028-0.474,1.189-0.276,2.219c1.719-2.018,3.307,0.625,3.883,2.219c-0.762,0.703-1.938,0.564-3.051,0.277c1.442,1.586,2.383,3.742,1.94,7.766c-5.07,2.217-11.468-2.605-7.211-6.934c-2.496-2.219-3.594-5.836-4.992-9.152C331.691,177.219,332.553,176.416,333.074,175.274zM339.453,216.595c0.22-1.045,0.485-2.349,0-3.328c-0.725-0.078-1.192,0.102-1.108,0.832c-1.331-1.996-2.453-4.203-4.16-5.824c0.438-0.578,1.49-0.543,1.386-1.665c3.149,1.391,4.071,6.387,8.043,6.934c1.362,0.188,2.267-0.443,3.883-0.832C345.068,214.12,343.58,217.796,339.453,216.595zM349.438,180.819c-0.238-2.239-0.32-3.679,0.555-5.269c2.013-0.39,2.797-2.008,5.269-1.941c0.47,0.607-0.412,1.641-0.832,2.218c0.037,1.072,1.125,1.094,1.387,1.941C354.946,180.013,352.566,182.53,349.438,180.819zM376.615,94.57c0.489,1.36,1.751,1.948,3.052,2.496c-0.787,0.497-2.129-0.821-3.328-0.832C376.333,95.581,376.815,95.417,376.615,94.57zM375.228,175.274c-0.733,0.652-0.618,2.154-1.109,3.05c-1.41-0.252-1.478-1.85-1.387-3.605c2.133-1.702,6.778-0.753,9.707-0.832C381.25,176.079,377.914,174.493,375.228,175.274zM428.754,82.367c0.188,0.695-1.017,1.896,0,3.051c-1.534,0.408-2.456,1.428-4.438,1.387C424.95,84.48,428.098,84.67,428.754,82.367zM426.536,160.298c-1.166,0.591-2.562,0.951-2.772,2.496c-1.685,0.597-3.699,0.789-4.715-0.555c5.724-1.301,7.317-6.732,9.706-11.371c0.247,0.123,0.496,0.244,0.555,0.555C430.178,155.089,428.085,158.132,426.536,160.298zM433.746,81.257c-0.586,0.612-0.819-0.355-1.663-0.277c0.029-0.708,0.929-0.55,1.663-0.555V81.257zM274.835,181.652c-1.928-0.217-2.55,2.721-1.386,3.883c-0.784-0.229-0.719,0.39-1.387,0.277c0.312,1.998-0.072,4.693,1.941,4.992C277.553,188.843,274.005,184.352,274.835,181.652zM263.188,188.585c0.174,0.936,0.941,1.276,1.941,1.387c0.337-0.588,1.043-0.807,1.109-1.664C265.293,187.566,264.034,188.363,263.188,188.585zM295.913,196.906v0.832c1.284,0.656,2.889,0.994,4.992,0.832c-0.007-0.654,0.478-0.816,0.277-1.664C300.169,197.185,297.518,195.994,295.913,196.906zM139.775,214.654c-0.874,1.537,0.556,3.816,1.664,3.328C141.537,216.22,141.541,214.552,139.775,214.654zM15.808,221.866c1.751,0.564,2.834,0.433,3.882,1.941c-0.837,0.766,0.205,1.998,0.555,2.496c0.852-0.35,1.983-0.42,2.219-1.387C20.812,223.761,17.667,219.24,15.808,221.866zM444.284,232.405c0.192,0.547,1.549-0.068,1.664,0.555c-1.651,1.065-0.135,2.604,0.277,3.883c1.744,0.179,1.48-1.537,1.664-2.219c1.138,1.156,3.318,0.094,4.16,2.496c-1.004-0.08-1.073,0.775-1.941,0.832c-0.119-1.268-1.168-1.607-2.496-1.664c-0.513,0.596-0.187,2.031-0.276,3.051c1.516,0.181,0.692,1.897,1.94,2.772c-0.844,0.449-1.733,0.854-1.94,1.941c0.39,0.072,0.316,0.607,0.555,0.83c1.138,0.111,2.064-1.43,2.772-0.83c0.202,0.848-0.478,0.814-0.276,1.662c1.258,0.129,1.645,1.129,3.051,1.109c2.509-1.153,3.109-6.496-0.555-6.932c-0.079,1.307-1.101,1.672-1.941,2.219c-0.615-0.645-0.245-0.744-0.555-1.387c1.915,0.342,1.916-1.226,3.328-1.386c0.025-0.939,0.46-2.715-0.277-4.16c-1.795,0.176-2.761-0.502-2.219-1.941c-1.146,0.034-1.737-0.482-3.051-0.277c-0.332-2.787,1.124-4.41,0.831-7.488c-1.134,0.891-1.936,0.691-3.327,0c-0.361,1.211-0.557,2.588-0.556,4.16c-0.395-0.109-0.468-0.334-0.832,0V232.405zM453.714,252.648c-1.819-1.789-4.384,1.994-7.488-0.001c-0.733,0.283-0.424,1.609-1.941,1.109c0.354,2.941-1.419,3.758-1.387,6.379c1.291,0.467,0.963,2.551,1.387,3.883c0.849,0.202,1.012-0.283,1.664-0.277v-3.328c0.718,0.393,1.322,0.897,1.109,2.219c1.865-0.479,0.979,1.793,2.772,1.387c0.912-2.44-1.462-3.864-1.663-6.102c0.779-0.421,1.09-1.312,2.495-1.109c-0.101-0.822-0.479-1.367-1.108-1.664c-1.026,0.438-3.48,1.832-4.438,0.555C446.318,253.019,453.564,256.38,453.714,252.648zM458.428,256.809c-0.031-0.985-1.025-1.008-0.832-2.219c1.266,0.158,1.027-1.192,1.108-2.219c-0.484-0.523-0.963,0.484-0.831-0.832C455.017,251.628,455.473,257.15,458.428,256.809zM492.818,291.475v-1.387c-3.278-0.974-3.785-4.718-6.934-5.822c-0.311-2.188-1.795-3.198-1.388-6.102c-0.959-0.522-1.178-1.782-3.051-1.387c-0.52-1.883-0.45-4.358-1.94-5.27c-2.982,1.549-0.689,8.371-3.051,10.539c-1.449,0.098-6.77-3.09-6.934-4.16c-0.331-2.164,1.919-1.521,1.664-4.16c-2.363,0.099-4.803-0.52-7.488-1.387c0.087,0.989,0.538,1.449-0.832,1.387c-0.715-0.066,0.381-0.476,0-1.109c-1.097,0.053-2.567-0.867-2.772,0.555c0.091,0.648,1.21,0.27,1.387,0.832c-1.107,1.203-2.076,2.545-3.051,3.883c-0.828-0.336-1.233-1.596-2.495-1.664c-2.554-0.139-3.762,3.513-5.547,3.605c-0.312,1.427-0.032,2.173-0.83,0.556c-1.138,0.166-2.192,1.548-1.387,2.773c-1.937,3.979-9.281,2.551-11.647,6.1c-0.375-0.086-0.53-0.394-1.109-0.277c-4.184,7.75,4.22,13.71,1.94,21.355c0.84,1.506,1.447,2.254,2.496,2.496c2.448,0.567,3.359-1.314,5.547-1.941c1.822-0.521,3.743,0.133,5.547-0.277c1.895-4.414,11.576-5.023,15.53-2.496c-0.104,1.277,2.216,2.36,1.94,4.715c2.092-0.039,2.39-3.338,3.605-3.328c-0.989,1.744-1.562,3.213-1.941,4.992c1.466,0.569,2.578,0.037,3.884-0.277c0.897,0.396,1.146,1.441,1.108,2.773c0.933,2.117,4.396,1.705,5.823,3.328c1.198-0.006,1.023-1.383,2.219-1.387c0.953,0.434,1.297,1.476,2.496,1.664c1.766-1.194,2.998-2.918,5.824-3.051c-0.193-1.58,0.469-2.305,0.277-3.883C496.266,308.463,500.037,296.545,492.818,291.475z'; 2 | 3 | var latLongToPx = function (lat, lng, width, height) { 4 | var x, y 5 | var w = width 6 | var h = height 7 | var ox = -(w * 0.0245) 8 | var oy = (h * 0.218) 9 | 10 | x = (w * (180 + lng) / 360) % w 11 | 12 | lat = lat * Math.PI / 180 13 | y = Math.log(Math.tan((lat / 2) + (Math.PI / 4))) 14 | y = (h / 2) - (w * y / (2 * Math.PI)) 15 | 16 | return { 17 | x: x + ox, 18 | y: y + oy 19 | } 20 | } 21 | --------------------------------------------------------------------------------