├── .gitmodules ├── fonts └── daniel │ ├── daniel.ttf │ ├── danielbd.ttf │ ├── danielbk.ttf │ ├── Daniel Midgley.txt │ └── daniel_700.font.js ├── .gitignore ├── src ├── copyright.js ├── jquery-plugin.js ├── grammar.ebnf ├── grammar.jison ├── diagram.js └── sequence-diagram.js ├── package.json ├── test ├── qunit.html ├── test.html ├── canvg.html ├── qunit.min.css ├── grammar-tests.js ├── underscore-min.js ├── lodash.min.js └── qunit.min.js ├── Makefile ├── LICENCE └── README.md /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "_site"] 2 | path = _site 3 | url = git@github.com:bramp/js-sequence-diagrams.git 4 | -------------------------------------------------------------------------------- /fonts/daniel/daniel.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/magnars/js-sequence-diagrams/master/fonts/daniel/daniel.ttf -------------------------------------------------------------------------------- /fonts/daniel/danielbd.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/magnars/js-sequence-diagrams/master/fonts/daniel/danielbd.ttf -------------------------------------------------------------------------------- /fonts/daniel/danielbk.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/magnars/js-sequence-diagrams/master/fonts/daniel/danielbk.ttf -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | grammar.js 2 | diagram-grammar.js 3 | sequence-diagram.js 4 | sequence-diagram-min.js 5 | sequence-diagram-min.js.map 6 | node_modules 7 | build/ 8 | -------------------------------------------------------------------------------- /src/copyright.js: -------------------------------------------------------------------------------- 1 | /** js sequence diagrams 1.0.4 2 | * http://bramp.github.io/js-sequence-diagrams/ 3 | * (c) 2012-2013 Andrew Brampton (bramp.net) 4 | * @license Simplified BSD license. 5 | */ 6 | -------------------------------------------------------------------------------- /src/jquery-plugin.js: -------------------------------------------------------------------------------- 1 | /** js sequence diagrams 2 | * http://bramp.github.io/js-sequence-diagrams/ 3 | * (c) 2012-2013 Andrew Brampton (bramp.net) 4 | * Simplified BSD license. 5 | */ 6 | if (typeof jQuery != 'undefined') { 7 | (function( $ ) { 8 | $.fn.sequenceDiagram = function( options ) { 9 | return this.each(function() { 10 | var $this = $(this); 11 | var diagram = Diagram.parse($this.text()); 12 | $this.html(''); 13 | diagram.drawSVG(this, options); 14 | }); 15 | }; 16 | })( jQuery ); 17 | } -------------------------------------------------------------------------------- /src/grammar.ebnf: -------------------------------------------------------------------------------- 1 | /** js sequence diagrams 2 | * http://bramp.github.io/js-sequence-diagrams/ 3 | * (c) 2012-2013 Andrew Brampton (bramp.net) 4 | * Simplified BSD license. 5 | * 6 | * EBNF version of the grammar for diagraming purposes only 7 | */ 8 | document ::= statement* 9 | 10 | statement ::= 11 | ( 'title' ':' message 12 | | 'participant' actor 13 | | 'note' ('left of' | 'right of' | 'over') actor ':' message 14 | | actor ( '-' | '--' ) ( '>' | '>>' )? actor ':' message 15 | ) 16 | 17 | /* 18 | message ::= [^\n]+ 19 | 20 | actor ::= [^\->:\n,]+ 21 | */ -------------------------------------------------------------------------------- /fonts/daniel/Daniel Midgley.txt: -------------------------------------------------------------------------------- 1 | Thanks for downloading the Daniel font! 2 | 3 | It’s free for you to use for any purpose, commercial or not. 4 | 5 | You can share this font with anyone, as long as this notice is included. 6 | 7 | Please do not distribute modified copies. 8 | 9 | Visit the Page of Fontery 10 | 11 | http://goodreasonblog.blogspot.com/p/fontery.html 12 | 13 | Here’s where you can 14 | - download more of my fonts 15 | - send me an email 16 | - report problems or suggestions 17 | - express your gratitude in the form of donations to keep the fonts coming. 18 | 19 | Be sure to let me know if you use one of my fonts in an interesting, creative, or beautiful way. I may feature your work on the blog. 20 | 21 | This font may not be appropriate for your purposes. It comes with no guarantees of any kind. While I’ve tested this font, and it seems to work well, I accept no responsibility for any unintended consequences of its use. -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js-sequence-diagrams", 3 | "author": "Andrew Brampton (bramp.net)", 4 | "homepage": "http://bramp.github.io/js-sequence-diagrams/", 5 | "filename": "sequence-diagram-min.js", 6 | "version": "1.0.3", 7 | "description": "Generates UML sequence diagrams from simple text", 8 | "license": "BSD", 9 | "readmeFilename": "README.md", 10 | "directories": { 11 | "test": "test" 12 | }, 13 | "dependencies": { 14 | "underscore": "~1.4.x", 15 | "raphael": "~2.1.x" 16 | }, 17 | "devDependencies": { 18 | "//" : "Others include jspp", 19 | "jison": "0.4.6", 20 | "jshint": "~2.0.x", 21 | "uglify-js": "~2.3.x" 22 | }, 23 | "scripts": { 24 | "test": "make test" 25 | }, 26 | "repository": { 27 | "type": "git", 28 | "url": "git://github.com/bramp/js-sequence-diagrams.git" 29 | }, 30 | "keywords": [ 31 | "uml", 32 | "sequence", 33 | "diagram" 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /test/qunit.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | QUnit Test Suite 6 | 7 | 11 | 12 | 13 | 14 | 15 | 16 | 23 | 24 | 25 | 26 |
27 |
28 | 29 | 30 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY : all test clean lint 2 | 3 | all: node_modules lint build/sequence-diagram-min.js 4 | 5 | node_modules: package.json 6 | # 7 | # NPM Update needed. 8 | # 9 | npm update 10 | 11 | clean: 12 | rm build/* 13 | 14 | lint: 15 | jshint src/*.js 16 | jshint test/grammar-tests.js 17 | 18 | build/grammar.js: src/grammar.jison 19 | jison $< -o $@ 20 | 21 | build/diagram-grammar.js: src/diagram.js build/grammar.js 22 | # 23 | # Compiling grammar 24 | # 25 | jspp $< > $@ 26 | 27 | build/sequence-diagram-min.js build/sequence-diagram-min.js.map: src/copyright.js build/diagram-grammar.js src/jquery-plugin.js fonts/daniel/daniel_700.font.js src/sequence-diagram.js 28 | # 29 | # Please ignore the warnings below (these are in combined js code) 30 | # 31 | uglifyjs \ 32 | src/copyright.js \ 33 | build/diagram-grammar.js src/jquery-plugin.js fonts/daniel/daniel_700.font.js \ 34 | src/sequence-diagram.js \ 35 | -o build/sequence-diagram-min.js \ 36 | -c --comments \ 37 | --source-map build/sequence-diagram-min.js.map 38 | 39 | # 40 | # Copy minified file to site 41 | # 42 | cp build/sequence-diagram-min.js* _site/ 43 | -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012-2013, Andrew Brampton 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | 1. Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 2. Redistributions in binary form must reproduce the above copyright notice, 10 | this list of conditions and the following disclaimer in the documentation 11 | and/or other materials provided with the distribution. 12 | 13 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 14 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 17 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 20 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 22 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 | -------------------------------------------------------------------------------- /test/test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 37 | 38 | 39 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /test/canvg.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 18 | 19 |
20 | SVG: 21 |
22 |
23 | 24 |
25 | Canvas: 26 | 27 |
28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /src/grammar.jison: -------------------------------------------------------------------------------- 1 | /** js sequence diagrams 2 | * http://bramp.github.io/js-sequence-diagrams/ 3 | * (c) 2012-2013 Andrew Brampton (bramp.net) 4 | * Simplified BSD license. 5 | */ 6 | %lex 7 | 8 | %options case-insensitive 9 | 10 | %{ 11 | // Pre-lexer code can go here 12 | %} 13 | 14 | %% 15 | 16 | [\n]+ return 'NL'; 17 | \s+ /* skip whitespace */ 18 | \#[^\n]* /* skip comments */ 19 | "participant" return 'participant'; 20 | "left of" return 'left_of'; 21 | "right of" return 'right_of'; 22 | "over" return 'over'; 23 | "note" return 'note'; 24 | "title" return 'title'; 25 | "," return ','; 26 | [^\->:\n,]+ return 'ACTOR'; 27 | "--" return 'DOTLINE'; 28 | "-" return 'LINE'; 29 | ">>" return 'OPENARROW'; 30 | ">" return 'ARROW'; 31 | :[^#\n]+ return 'MESSAGE'; 32 | <> return 'EOF'; 33 | . return 'INVALID'; 34 | 35 | /lex 36 | 37 | %start start 38 | 39 | %% /* language grammar */ 40 | 41 | start 42 | : document 'EOF' { return yy; } 43 | ; 44 | 45 | document 46 | : /* empty */ 47 | | document line 48 | ; 49 | 50 | line 51 | : statement { } 52 | | 'NL' 53 | ; 54 | 55 | statement 56 | : 'participant' actor { $2; } 57 | | signal { yy.addSignal($1); } 58 | | note_statement { yy.addSignal($1); } 59 | | 'title' message { yy.setTitle($2); } 60 | ; 61 | 62 | note_statement 63 | : 'note' placement actor message { $$ = new Diagram.Note($3, $2, $4); } 64 | | 'note' 'over' actor_pair message { $$ = new Diagram.Note($3, Diagram.PLACEMENT.OVER, $4); } 65 | ; 66 | 67 | actor_pair 68 | : actor { $$ = $1; } 69 | | actor ',' actor { $$ = [$1, $3]; } 70 | ; 71 | 72 | placement 73 | : 'left_of' { $$ = Diagram.PLACEMENT.LEFTOF; } 74 | | 'right_of' { $$ = Diagram.PLACEMENT.RIGHTOF; } 75 | ; 76 | 77 | signal 78 | : actor signaltype actor message 79 | { $$ = new Diagram.Signal($1, $2, $3, $4); } 80 | ; 81 | 82 | actor 83 | : ACTOR { $$ = yy.getActor($1); } 84 | ; 85 | 86 | signaltype 87 | : linetype arrowtype { $$ = $1 | ($2 << 2); } 88 | | linetype { $$ = $1; } 89 | ; 90 | 91 | linetype 92 | : LINE { $$ = Diagram.LINETYPE.SOLID; } 93 | | DOTLINE { $$ = Diagram.LINETYPE.DOTTED; } 94 | ; 95 | 96 | arrowtype 97 | : ARROW { $$ = Diagram.ARROWTYPE.FILLED; } 98 | | OPENARROW { $$ = Diagram.ARROWTYPE.OPEN; } 99 | ; 100 | 101 | message 102 | : MESSAGE { $$ = $1.substring(1).trim().replace(/\\n/gm, "\n"); } 103 | ; 104 | 105 | 106 | %% 107 | -------------------------------------------------------------------------------- /src/diagram.js: -------------------------------------------------------------------------------- 1 | /** js sequence diagrams 2 | * http://bramp.github.io/js-sequence-diagrams/ 3 | * (c) 2012-2013 Andrew Brampton (bramp.net) 4 | * Simplified BSD license. 5 | */ 6 | (function () { 7 | "use strict"; 8 | /*global grammar _ */ 9 | 10 | function Diagram() { 11 | this.title = undefined; 12 | this.actors = []; 13 | this.signals = []; 14 | } 15 | 16 | Diagram.prototype.getActor = function(alias) { 17 | var s = /^(.+) as (\S+)$/i.exec(alias.trim()); 18 | if (s) { 19 | name = s[1].trim(); 20 | alias = s[2].trim(); 21 | } else { 22 | name = alias.trim(); 23 | } 24 | 25 | name = name.replace(/\\n/gm, "\n"); 26 | 27 | var i, actors = this.actors; 28 | for (i in actors) { 29 | if (actors[i].alias == alias) 30 | return actors[i]; 31 | } 32 | i = actors.push( new Diagram.Actor(alias, name, actors.length) ); 33 | return actors[ i - 1 ]; 34 | }; 35 | 36 | Diagram.prototype.setTitle = function(title) { 37 | this.title = title; 38 | }; 39 | 40 | Diagram.prototype.addSignal = function(signal) { 41 | this.signals.push( signal ); 42 | }; 43 | 44 | Diagram.Actor = function(alias, name, index) { 45 | this.alias = alias; 46 | this.name = name; 47 | this.index = index; 48 | }; 49 | 50 | Diagram.Signal = function(actorA, signaltype, actorB, message) { 51 | this.type = "Signal"; 52 | this.actorA = actorA; 53 | this.actorB = actorB; 54 | this.linetype = signaltype & 3; 55 | this.arrowtype = (signaltype >> 2) & 3; 56 | this.message = message; 57 | }; 58 | 59 | Diagram.Signal.prototype.isSelf = function() { 60 | return this.actorA.index == this.actorB.index; 61 | }; 62 | 63 | Diagram.Note = function(actor, placement, message) { 64 | this.type = "Note"; 65 | this.actor = actor; 66 | this.placement = placement; 67 | this.message = message; 68 | 69 | if (this.hasManyActors() && actor[0] == actor[1]) { 70 | throw new Error("Note should be over two different actors"); 71 | } 72 | }; 73 | 74 | Diagram.Note.prototype.hasManyActors = function() { 75 | return _.isArray(this.actor); 76 | }; 77 | 78 | Diagram.LINETYPE = { 79 | SOLID : 0, 80 | DOTTED : 1 81 | }; 82 | 83 | Diagram.ARROWTYPE = { 84 | FILLED : 0, 85 | OPEN : 1 86 | }; 87 | 88 | Diagram.PLACEMENT = { 89 | LEFTOF : 0, 90 | RIGHTOF : 1, 91 | OVER : 2 92 | }; 93 | 94 | /** The following is included by jspp */ 95 | /*> ../build/grammar.js */ 96 | 97 | /** 98 | * jison doesn't have a good exception, so we make one 99 | */ 100 | function ParseError(message, hash) { 101 | _.extend(this, hash); 102 | 103 | this.name = "ParseError"; 104 | this.message = (message || ""); 105 | } 106 | ParseError.prototype = new Error(); 107 | Diagram.ParseError = ParseError; 108 | 109 | grammar.parseError = function(message, hash) { 110 | throw new ParseError(message, hash); 111 | }; 112 | 113 | Diagram.parse = function(input) { 114 | grammar.yy = new Diagram(); 115 | 116 | return grammar.parse(input); 117 | }; 118 | 119 | // Expose this class externally 120 | this.Diagram = Diagram; 121 | 122 | }).call(this); -------------------------------------------------------------------------------- /test/qunit.min.css: -------------------------------------------------------------------------------- 1 | #qunit-tests,#qunit-header,#qunit-banner,#qunit-testrunner-toolbar,#qunit-userAgent,#qunit-testresult{font-family:"Helvetica Neue Light",HelveticaNeue-Light,"Helvetica Neue",Calibri,Helvetica,Arial,sans-serif}#qunit-testrunner-toolbar,#qunit-userAgent,#qunit-testresult,#qunit-tests li{font-size:small}#qunit-tests{font-size:smaller}#qunit-tests,#qunit-header,#qunit-banner,#qunit-userAgent,#qunit-testresult,#qunit-modulefilter{margin:0;padding:0}#qunit-header{padding:.5em 0 .5em 1em;color:#8699a4;background-color:#0d3349;font-size:1.5em;line-height:1em;font-weight:400;border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;-webkit-border-top-right-radius:5px;-webkit-border-top-left-radius:5px}#qunit-header a{text-decoration:none;color:#c2ccd1}#qunit-header a:hover,#qunit-header a:focus{color:#fff}#qunit-testrunner-toolbar label{display:inline-block;padding:0 .5em 0 .1em}#qunit-banner{height:5px}#qunit-testrunner-toolbar{padding:.5em 0 .5em 2em;color:#5E740B;background-color:#eee;overflow:hidden}#qunit-userAgent{padding:.5em 0 .5em 2.5em;background-color:#2b81af;color:#fff;text-shadow:rgba(0,0,0,.5) 2px 2px 1px}#qunit-modulefilter-container{float:right}#qunit-tests{list-style-position:inside}#qunit-tests li{padding:.4em .5em .4em 2.5em;border-bottom:1px solid #fff;list-style-position:inside}#qunit-tests.hidepass li.pass,#qunit-tests.hidepass li.running{display:none}#qunit-tests li strong{cursor:pointer}#qunit-tests li a{padding:.5em;color:#c2ccd1;text-decoration:none}#qunit-tests li a:hover,#qunit-tests li a:focus{color:#000}#qunit-tests li .runtime{float:right;font-size:smaller}.qunit-assert-list{margin-top:.5em;padding:.5em;background-color:#fff;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.qunit-collapsed{display:none}#qunit-tests table{border-collapse:collapse;margin-top:.2em}#qunit-tests th{text-align:right;vertical-align:top;padding:0 .5em 0 0}#qunit-tests td{vertical-align:top}#qunit-tests pre{margin:0;white-space:pre-wrap;word-wrap:break-word}#qunit-tests del{background-color:#e0f2be;color:#374e0c;text-decoration:none}#qunit-tests ins{background-color:#ffcaca;color:#500;text-decoration:none}#qunit-tests b.counts{color:#000}#qunit-tests b.passed{color:#5E740B}#qunit-tests b.failed{color:#710909}#qunit-tests li li{padding:5px;background-color:#fff;border-bottom:0;list-style-position:inside}#qunit-tests li li.pass{color:#3c510c;background-color:#fff;border-left:10px solid #C6E746}#qunit-tests .pass{color:#528CE0;background-color:#D2E0E6}#qunit-tests .pass .test-name{color:#366097}#qunit-tests .pass .test-actual,#qunit-tests .pass .test-expected{color:#999}#qunit-banner.qunit-pass{background-color:#C6E746}#qunit-tests li li.fail{color:#710909;background-color:#fff;border-left:10px solid #EE5757;white-space:pre}#qunit-tests>li:last-child{border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;-webkit-border-bottom-right-radius:5px;-webkit-border-bottom-left-radius:5px}#qunit-tests .fail{color:#000;background-color:#EE5757}#qunit-tests .fail .test-name,#qunit-tests .fail .module-name{color:#000}#qunit-tests .fail .test-actual{color:#EE5757}#qunit-tests .fail .test-expected{color:green}#qunit-banner.qunit-fail{background-color:#EE5757}#qunit-testresult{padding:.5em .5em .5em 2.5em;color:#2b81af;background-color:#D2E0E6;border-bottom:1px solid #fff}#qunit-testresult .module-name{font-weight:700}#qunit-fixture{position:absolute;top:-10000px;left:-10000px;width:1000px;height:1000px} -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | JS Sequence Diagrams 2 | ============================================= 3 | **Generates UML sequence diagrams from simple text** 4 | 5 | 6 | by [Andrew Brampton](http://bramp.net) 2012-2013 7 | 8 | 9 | Example 10 | ------- 11 | We turn 12 | 13 | Alice->Bob: Hello Bob, how are you? 14 | Note right of Bob: Bob thinks 15 | Bob-->Alice: I am good thanks! 16 | 17 | into 18 | 19 | ![Sample generated UML diagram](http://bramp.github.io/js-sequence-diagrams/images/sample.svg) 20 | 21 | Requirements 22 | ------------ 23 | You will need [underscore.js](http://underscorejs.org/) and [Raphaël](http://raphaeljs.com/) 24 | 25 | Usage 26 | ----- 27 | 28 | On your page you need to include both underscore and raphael like so: 29 | 30 | ```html 31 | 32 | 33 | ``` 34 | 35 | and then 36 | 37 | ```html 38 |
Diagram will be placed here
39 | 40 | 44 | ``` 45 | 46 | or use jQuery to do all the work: 47 | ```html 48 |
A->B: Message
; 49 | ; 52 | ``` 53 | 54 | Build requirements 55 | ------------------ 56 | ```bash 57 | # JavaScript Preprocessor 58 | sudo gem install jspp 59 | 60 | ## UglifyJS 2 61 | sudo npm install uglify-js -g 62 | 63 | ## Jison 64 | sudo npm install jison -g 65 | 66 | ## JSHint (for linting) 67 | sudo npm install jshint -g 68 | 69 | ## Then to build, just run: 70 | make 71 | ``` 72 | 73 | How to release 74 | -------------- 75 | * Make sure all changes checked in 76 | * Bump version in src/copyright.js 77 | * ``make clean`` 78 | * ``make`` 79 | * ``git add src/copyright.js build/sequence-diagram-min.js build/sequence-diagram-min.js.map`` 80 | * ``git commit`` 81 | * ``git push origin master`` 82 | * ``git tag -a v1.x.x -m v1.x.x`` 83 | * ``git push origin v1.x.x`` 84 | 85 | TODO 86 | ---- 87 | * Other themes 88 | * Rethink the use of Raphael. Due to its support of VML (which I don't care about), it makes many things harder. For example, font support, css styling, etc. Perhaps draw the SVG by hand, or find a small helper 89 | library 90 | 91 | Contributors 92 | ------------ 93 | 94 | via [GitHub](https://github.com/bramp/js-sequence-diagrams/graphs/contributors) 95 | 96 | Thanks 97 | ------ 98 | This project makes use of Jison, Raphaël, underscore.js, and the Daniel font (which is free to use for any purpose). 99 | 100 | Many thanks to [Web Sequence Diagrams](http://www.websequencediagrams.com/) which greatly inspired this project, and forms the basis for the syntax. 101 | 102 | Related 103 | ------- 104 | 105 | * [Web Sequence Diagrams](http://www.websequencediagrams.com/) Server side version with a commerical offering 106 | * [flowchart.js](http://adrai.github.io/flowchart.js/) A similar project that draws flow charts in the browser 107 | 108 | Licence (Simplified BSD License) 109 | ------- 110 | 111 | Copyright (c) 2012-2013, Andrew Brampton 112 | All rights reserved. 113 | 114 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 115 | 116 | - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 117 | - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 118 | 119 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 120 | -------------------------------------------------------------------------------- /test/grammar-tests.js: -------------------------------------------------------------------------------- 1 | function assertSingleActor(d, actor) { 2 | 3 | equal(d.actors.length, 1, "Correct actors count"); 4 | 5 | var a = d.actors[0]; 6 | equal(a.name, actor, "Actors A's name"); 7 | //equal(a.name, "A", "Actors A"); 8 | } 9 | 10 | function assertSingleArrow(d, arrowtype, linetype) { 11 | 12 | equal(d.actors.length, 2, "Correct actors count"); 13 | 14 | var a = d.actors[0]; 15 | var b = d.actors[1]; 16 | equal(a.name, "A", "Actors A"); 17 | equal(b.name, "B", "Actors B"); 18 | 19 | equal(d.signals.length, 1, "Correct signals count"); 20 | equal(d.signals[0].type, "Signal", "Correct signal type"); 21 | equal(d.signals[0].actorA, a, "Actors A"); 22 | equal(d.signals[0].actorB, b, "Actors B"); 23 | 24 | equal(d.signals[0].message, "Title", "Signal message"); 25 | 26 | equal(d.signals[0].arrowtype, arrowtype, "Arrowhead type"); 27 | equal(d.signals[0].linetype, linetype, "Line type"); 28 | } 29 | 30 | function assertSingleNote(d, placement, actors) { 31 | 32 | equal(d.signals.length, 1, "Correct notes count"); 33 | 34 | var note = d.signals[0]; 35 | equal(note.type, "Note", "Correct signal type"); 36 | equal(note.placement, placement, "Correct signal placement"); 37 | equal(note.message, "Title", "Correct signal message"); 38 | 39 | if (_.isArray(actors)) { 40 | equal(_.isArray(d.actors), true, "Correct actors array"); 41 | equal(d.actors.length, actors.length, "Correct actors count"); 42 | 43 | equal(note.actor.length, actors.length, "Correct note actors"); 44 | for (var i = 0; i < actors.length; i++) { 45 | equal(d.actors[i].name, actors[i], "Correct actor"); 46 | equal(note.actor[i].name, actors[i], "Correct note actor"); 47 | } 48 | 49 | } else { 50 | equal(d.actors.length, 1, "Correct actors count"); 51 | equal(note.actor.name, actors, "Correct note actor"); 52 | } 53 | } 54 | 55 | function assertEmptyDocument(d) { 56 | equal(d.title, undefined, "No title"); 57 | equal(d.actors.length, 0, "Zero actors"); 58 | equal(d.signals.length, 0, "Zero signals"); 59 | } 60 | 61 | 62 | var LINETYPE = Diagram.LINETYPE; 63 | var ARROWTYPE = Diagram.ARROWTYPE; 64 | var PLACEMENT = Diagram.PLACEMENT; 65 | 66 | function regextest(regex, string) { 67 | console.log(string, regex.exec(string)); 68 | } 69 | 70 | /* 71 | test("Regex Tests", function() { 72 | // These are here to debug regex problems with unicode 73 | //var r = /[^\->:\n,]+\b/; 74 | var r = /[^\->:\n,]+/; 75 | regextest(r, "blah"); 76 | regextest(r, "bl:ah"); 77 | regextest(r, "中国"); 78 | regextest(r, " 中国 "); 79 | 80 | regextest(/^(.+) as (\S+)\s*$/i, "blah"); 81 | regextest(/^(.+) as (\S+)\s*$/i, " as as as b"); 82 | }); 83 | */ 84 | 85 | test( "Solid Arrow", function() { 86 | var d = Diagram.parse("A->B: Title"); 87 | assertSingleArrow(d, ARROWTYPE.FILLED, LINETYPE.SOLID); 88 | }); 89 | 90 | test( "Dashed Arrow", function() { 91 | var d = Diagram.parse("A-->B: Title"); 92 | assertSingleArrow(d, ARROWTYPE.FILLED, LINETYPE.DOTTED); 93 | }); 94 | 95 | test( "Solid Open Arrow", function() { 96 | var d = Diagram.parse("A->>B: Title"); 97 | assertSingleArrow(d, ARROWTYPE.OPEN, LINETYPE.SOLID); 98 | }); 99 | 100 | test( "Dashed Open Arrow", function() { 101 | var d = Diagram.parse("A-->>B: Title"); 102 | assertSingleArrow(d, ARROWTYPE.OPEN, LINETYPE.DOTTED); 103 | }); 104 | 105 | test( "Titles", function() { 106 | equal(Diagram.parse("Title: title").title, "title", "Title"); 107 | equal(Diagram.parse("Title: line1\\nline2").title, "line1\nline2", "Multiline Title"); 108 | }); 109 | 110 | test( "Unicode", function() { 111 | equal(Diagram.parse("Title: 中国").title, "中国", "Unicode Title"); 112 | assertEmptyDocument(Diagram.parse("# 中国")); 113 | assertSingleActor(Diagram.parse("Participant 中国"), "中国"); 114 | assertSingleActor(Diagram.parse("Participant 中国 as alias"), "中国"); 115 | assertSingleActor(Diagram.parse("中国->中国: Title"), "中国"); 116 | }); 117 | 118 | test( "Empty documents", function() { 119 | assertEmptyDocument(Diagram.parse("")); 120 | assertEmptyDocument(Diagram.parse(" \t\n")); 121 | }); 122 | 123 | test( "Whitespace", function() { 124 | assertSingleArrow(Diagram.parse(" A - > B : Title "), ARROWTYPE.FILLED, LINETYPE.SOLID); 125 | assertSingleArrow(Diagram.parse("\n\nA->B: Title\n\n"), ARROWTYPE.FILLED, LINETYPE.SOLID); 126 | }); 127 | 128 | test( "Comments", function() { 129 | assertEmptyDocument(Diagram.parse("#")); 130 | assertEmptyDocument(Diagram.parse("# comment")); 131 | assertEmptyDocument(Diagram.parse(" # comment")); 132 | assertEmptyDocument(Diagram.parse("# A->B: Title")); 133 | assertSingleArrow(Diagram.parse("A->B: Title # comment"), 0, 0); 134 | 135 | equal(Diagram.parse("Title: title # comment").title, "title"); 136 | //assertEmptyDocument(Diagram.parse("participant A # comment")); 137 | assertSingleNote(Diagram.parse("note left of A: Title # comment"), PLACEMENT.LEFTOF, 'A'); 138 | }); 139 | 140 | test( "Notes", function() { 141 | assertSingleNote(Diagram.parse("Note left of A: Title"), PLACEMENT.LEFTOF, 'A'); 142 | assertSingleNote(Diagram.parse("Note right of A: Title"), PLACEMENT.RIGHTOF, 'A'); 143 | assertSingleNote(Diagram.parse("Note over A: Title"), PLACEMENT.OVER, 'A'); 144 | assertSingleNote(Diagram.parse("Note over A,B: Title"), PLACEMENT.OVER, ['A', 'B']); 145 | }); 146 | 147 | 148 | test( "Participants", function() { 149 | assertSingleActor(Diagram.parse("Participant Bob"), "Bob"); 150 | assertSingleActor(Diagram.parse("Participant Name with spaces"), "Name with spaces"); 151 | assertSingleActor(Diagram.parse("Participant Name with spaces as alias"), "Name with spaces"); 152 | assertSingleActor(Diagram.parse("Participant Name with 'as' in it"), "Name with 'as' in it"); 153 | assertSingleActor(Diagram.parse("Participant Bob \\n with newline"), "Bob \n with newline"); 154 | assertSingleActor(Diagram.parse("Participant Bob \\n with newline as alias"), "Bob \n with newline"); 155 | assertSingleActor(Diagram.parse("Participant Object"), "Object"); 156 | }); 157 | 158 | -------------------------------------------------------------------------------- /test/underscore-min.js: -------------------------------------------------------------------------------- 1 | // Underscore.js 1.4.2 2 | // http://underscorejs.org 3 | // (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. 4 | // Underscore may be freely distributed under the MIT license. 5 | (function(){var e=this,t=e._,n={},r=Array.prototype,i=Object.prototype,s=Function.prototype,o=r.push,u=r.slice,a=r.concat,f=r.unshift,l=i.toString,c=i.hasOwnProperty,h=r.forEach,p=r.map,d=r.reduce,v=r.reduceRight,m=r.filter,g=r.every,y=r.some,b=r.indexOf,w=r.lastIndexOf,E=Array.isArray,S=Object.keys,x=s.bind,T=function(e){if(e instanceof T)return e;if(!(this instanceof T))return new T(e);this._wrapped=e};typeof exports!="undefined"?(typeof module!="undefined"&&module.exports&&(exports=module.exports=T),exports._=T):e._=T,T.VERSION="1.4.2";var N=T.each=T.forEach=function(e,t,r){if(e==null)return;if(h&&e.forEach===h)e.forEach(t,r);else if(e.length===+e.length){for(var i=0,s=e.length;i2;e==null&&(e=[]);if(d&&e.reduce===d)return r&&(t=T.bind(t,r)),i?e.reduce(t,n):e.reduce(t);N(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError("Reduce of empty array with no initial value");return n},T.reduceRight=T.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(v&&e.reduceRight===v)return r&&(t=T.bind(t,r)),arguments.length>2?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=T.keys(e);s=o.length}N(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError("Reduce of empty array with no initial value");return n},T.find=T.detect=function(e,t,n){var r;return C(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},T.filter=T.select=function(e,t,n){var r=[];return e==null?r:m&&e.filter===m?e.filter(t,n):(N(e,function(e,i,s){t.call(n,e,i,s)&&(r[r.length]=e)}),r)},T.reject=function(e,t,n){var r=[];return e==null?r:(N(e,function(e,i,s){t.call(n,e,i,s)||(r[r.length]=e)}),r)},T.every=T.all=function(e,t,r){t||(t=T.identity);var i=!0;return e==null?i:g&&e.every===g?e.every(t,r):(N(e,function(e,s,o){if(!(i=i&&t.call(r,e,s,o)))return n}),!!i)};var C=T.some=T.any=function(e,t,r){t||(t=T.identity);var i=!1;return e==null?i:y&&e.some===y?e.some(t,r):(N(e,function(e,s,o){if(i||(i=t.call(r,e,s,o)))return n}),!!i)};T.contains=T.include=function(e,t){var n=!1;return e==null?n:b&&e.indexOf===b?e.indexOf(t)!=-1:(n=C(e,function(e){return e===t}),n)},T.invoke=function(e,t){var n=u.call(arguments,2);return T.map(e,function(e){return(T.isFunction(t)?t:e[t]).apply(e,n)})},T.pluck=function(e,t){return T.map(e,function(e){return e[t]})},T.where=function(e,t){return T.isEmpty(t)?[]:T.filter(e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},T.max=function(e,t,n){if(!t&&T.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&T.isEmpty(e))return-Infinity;var r={computed:-Infinity};return N(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>=r.computed&&(r={value:e,computed:o})}),r.value},T.min=function(e,t,n){if(!t&&T.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&T.isEmpty(e))return Infinity;var r={computed:Infinity};return N(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;or||n===void 0)return 1;if(n>>1;n.call(r,e[u])=0})})},T.difference=function(e){var t=a.apply(r,u.call(arguments,1));return T.filter(e,function(e){return!T.contains(t,e)})},T.zip=function(){var e=u.call(arguments),t=T.max(T.pluck(e,"length")),n=new Array(t);for(var r=0;r=0;n--)t=[e[n].apply(this,t)];return t[0]}},T.after=function(e,t){return e<=0?t():function(){if(--e<1)return t.apply(this,arguments)}},T.keys=S||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)T.has(e,n)&&(t[t.length]=n);return t},T.values=function(e){var t=[];for(var n in e)T.has(e,n)&&t.push(e[n]);return t},T.pairs=function(e){var t=[];for(var n in e)T.has(e,n)&&t.push([n,e[n]]);return t},T.invert=function(e){var t={};for(var n in e)T.has(e,n)&&(t[e[n]]=n);return t},T.functions=T.methods=function(e){var t=[];for(var n in e)T.isFunction(e[n])&&t.push(n);return t.sort()},T.extend=function(e){return N(u.call(arguments,1),function(t){for(var n in t)e[n]=t[n]}),e},T.pick=function(e){var t={},n=a.apply(r,u.call(arguments,1));return N(n,function(n){n in e&&(t[n]=e[n])}),t},T.omit=function(e){var t={},n=a.apply(r,u.call(arguments,1));for(var i in e)T.contains(n,i)||(t[i]=e[i]);return t},T.defaults=function(e){return N(u.call(arguments,1),function(t){for(var n in t)e[n]==null&&(e[n]=t[n])}),e},T.clone=function(e){return T.isObject(e)?T.isArray(e)?e.slice():T.extend({},e):e},T.tap=function(e,t){return t(e),e};var M=function(e,t,n,r){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return e===t;e instanceof T&&(e=e._wrapped),t instanceof T&&(t=t._wrapped);var i=l.call(e);if(i!=l.call(t))return!1;switch(i){case"[object String]":return e==String(t);case"[object Number]":return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object RegExp]":return e.source==t.source&&e.global==t.global&&e.multiline==t.multiline&&e.ignoreCase==t.ignoreCase}if(typeof e!="object"||typeof t!="object")return!1;var s=n.length;while(s--)if(n[s]==e)return r[s]==t;n.push(e),r.push(t);var o=0,u=!0;if(i=="[object Array]"){o=e.length,u=o==t.length;if(u)while(o--)if(!(u=M(e[o],t[o],n,r)))break}else{var a=e.constructor,f=t.constructor;if(a!==f&&!(T.isFunction(a)&&a instanceof a&&T.isFunction(f)&&f instanceof f))return!1;for(var c in e)if(T.has(e,c)){o++;if(!(u=T.has(t,c)&&M(e[c],t[c],n,r)))break}if(u){for(c in t)if(T.has(t,c)&&!(o--))break;u=!o}}return n.pop(),r.pop(),u};T.isEqual=function(e,t){return M(e,t,[],[])},T.isEmpty=function(e){if(e==null)return!0;if(T.isArray(e)||T.isString(e))return e.length===0;for(var t in e)if(T.has(e,t))return!1;return!0},T.isElement=function(e){return!!e&&e.nodeType===1},T.isArray=E||function(e){return l.call(e)=="[object Array]"},T.isObject=function(e){return e===Object(e)},N(["Arguments","Function","String","Number","Date","RegExp"],function(e){T["is"+e]=function(t){return l.call(t)=="[object "+e+"]"}}),T.isArguments(arguments)||(T.isArguments=function(e){return!!e&&!!T.has(e,"callee")}),typeof /./!="function"&&(T.isFunction=function(e){return typeof e=="function"}),T.isFinite=function(e){return T.isNumber(e)&&isFinite(e)},T.isNaN=function(e){return T.isNumber(e)&&e!=+e},T.isBoolean=function(e){return e===!0||e===!1||l.call(e)=="[object Boolean]"},T.isNull=function(e){return e===null},T.isUndefined=function(e){return e===void 0},T.has=function(e,t){return c.call(e,t)},T.noConflict=function(){return e._=t,this},T.identity=function(e){return e},T.times=function(e,t,n){for(var r=0;r":">",'"':""","'":"'","/":"/"}};_.unescape=T.invert(_.escape);var D={escape:new RegExp("["+T.keys(_.escape).join("")+"]","g"),unescape:new RegExp("("+T.keys(_.unescape).join("|")+")","g")};T.each(["escape","unescape"],function(e){T[e]=function(t){return t==null?"":(""+t).replace(D[e],function(t){return _[e][t]})}}),T.result=function(e,t){if(e==null)return null;var n=e[t];return T.isFunction(n)?n.call(e):n},T.mixin=function(e){N(T.functions(e),function(t){var n=T[t]=e[t];T.prototype[t]=function(){var e=[this._wrapped];return o.apply(e,arguments),F.call(this,n.apply(T,e))}})};var P=0;T.uniqueId=function(e){var t=P++;return e?e+t:t},T.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var H=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},j=/\\|'|\r|\n|\t|\u2028|\u2029/g;T.template=function(e,t,n){n=T.defaults({},n,T.templateSettings);var r=new RegExp([(n.escape||H).source,(n.interpolate||H).source,(n.evaluate||H).source].join("|")+"|$","g"),i=0,s="__p+='";e.replace(r,function(t,n,r,o,u){s+=e.slice(i,u).replace(j,function(e){return"\\"+B[e]}),s+=n?"'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'":r?"'+\n((__t=("+r+"))==null?'':__t)+\n'":o?"';\n"+o+"\n__p+='":"",i=u+t.length}),s+="';\n",n.variable||(s="with(obj||{}){\n"+s+"}\n"),s="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+s+"return __p;\n";try{var o=new Function(n.variable||"obj","_",s)}catch(u){throw u.source=s,u}if(t)return o(t,T);var a=function(e){return o.call(this,e,T)};return a.source="function("+(n.variable||"obj")+"){\n"+s+"}",a},T.chain=function(e){return T(e).chain()};var F=function(e){return this._chain?T(e).chain():e};T.mixin(T),N(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=r[e];T.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],F.call(this,n)}}),N(["concat","join","slice"],function(e){var t=r[e];T.prototype[e]=function(){return F.call(this,t.apply(this._wrapped,arguments))}}),T.extend(T.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this); -------------------------------------------------------------------------------- /test/lodash.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Lo-Dash 1.0.1 (Custom Build) lodash.com/license 4 | * Build: `lodash modern -o ./dist/lodash.js` 5 | * Underscore.js 1.4.4 underscorejs.org/LICENSE 6 | */ 7 | ;(function(n,t){function r(n){if(!n||typeof n!="object")return W;var t=n.valueOf,r=typeof t=="function"&&(r=bt(t))&&bt(r);if(r)n=n==r||bt(n)==r&&!h(n);else{var e=W;!n||typeof n!="object"||h(n)?n=e:(t=n.constructor,!j(t)||t instanceof t?(Yt(n,function(n,t){e=t}),n=e===W||jt.call(n,e)):n=e)}return n}function e(n){return n&&typeof n=="object"&&n.__wrapped__?n:this instanceof e?(this.__wrapped__=n,void 0):new e(n)}function u(n,t,r){t||(t=0);var e=n.length,u=e-t>=(r||ut);if(u){var o={};for(r=t-1;++rt||typeof n=="undefined")return 1;if(nr?0:r);++er?Nt(0,u+r):r)||0,typeof u=="number"?o=-1<(A(n)?n.indexOf(t,r):z(n,t,r)):Xt(n,function(n){return++eu&&(u=f)}}else t=!t&&A(n)?o:a(t,r),Xt(n,function(n,r,o){r=t(n,r,o),r>e&&(e=r,u=n)});return u}function D(n,t,r,e){var u=3>arguments.length;if(t=a(t,e,4),nr(n)){var o=-1,i=n.length;for(u&&(r=n[++o]);++oarguments.length;if(typeof u!="number")var i=tr(n),u=i.length;return t=a(t,e,4),$(n,function(e,f,a){f=i?i[--u]:--u,r=o?(o=W,n[f]):t(r,n[f],f,a)}),r}function T(n,t,r){var e;if(t=a(t,r),nr(n)){r=-1;for(var u=n.length;++rr?Nt(0,u+r):r||0)-1;else if(r)return e=C(n,t),n[e]===t?e:-1;for(;++e>>1,r(n[e])z(f,p))&&((r||c)&&f.push(p),i.push(e))}return i}function U(n,t){return Kt||At&&2/g,gt=/($^)/,ht=/[&<>"']/g,yt=/['\n\r\t\u2028\u2029\\]/g,mt=Math.ceil,dt=nt.concat,_t=Math.floor,bt=pt.test(bt=Object.getPrototypeOf)&&bt,jt=tt.hasOwnProperty,wt=nt.push,xt=tt.toString,At=pt.test(At=v.bind)&&At,Ot=pt.test(Ot=Array.isArray)&&Ot,Et=n.isFinite,St=n.isNaN,kt=pt.test(kt=Object.keys)&&kt,Nt=Math.max,Rt=Math.min,$t=Math.random,Ft="[object Arguments]",qt="[object Array]",Dt="[object Boolean]",It="[object Date]",Tt="[object Number]",Bt="[object Object]",Mt="[object RegExp]",zt="[object String]",Pt=!!n.attachEvent,Ct=At&&!/\n|true/.test(At+Pt),Kt=At&&!Ct,Ut=kt&&(Pt||Ct),Vt={"[object Function]":W}; 23 | Vt[Ft]=Vt[qt]=Vt[Dt]=Vt[It]=Vt[Tt]=Vt[Bt]=Vt[Mt]=Vt[zt]=L;var Gt={};Gt[qt]=Array,Gt[Dt]=Boolean,Gt[It]=Date,Gt[Bt]=Object,Gt[Tt]=Number,Gt[Mt]=RegExp,Gt[zt]=String;var Ht={"boolean":W,"function":L,object:L,number:W,string:W,undefined:W},Jt={"\\":"\\","'":"'","\n":"n","\r":"r"," ":"t","\u2028":"u2028","\u2029":"u2029"};e.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:vt,variable:"",imports:{_:e}};var Lt={a:"q,w,h",l:"var a=arguments,b=0,c=typeof h=='number'?2:a.length;while(++b":">",'"':""","'":"'"},er=_(rr),ur=c(Lt,{l:Lt.l.replace(";",";if(c>3&&typeof a[c-2]=='function'){var d=f(a[--c-1],a[c--],2);}else if(c>2&&typeof a[c-1]=='function'){d=a[--c];}"),h:"u[j]=d?d(u[j],n[j]):n[j]"}),or=c(Lt);j(/x/)&&(j=function(n){return n instanceof Function||"[object Function]"==xt.call(n)}),Ct&&Y&&typeof setImmediate=="function"&&(V=U(setImmediate,n)),e.after=function(n,t){return 1>n?t():function(){return 1>--n?t.apply(this,arguments):void 0 25 | }},e.assign=ur,e.at=function(n){for(var t=-1,r=dt.apply(nt,v(arguments,1)),e=r.length,u=Array(e);++tz(c,l)){f&&c.push(l);for(var s=r;--s;)if(!(e[s]||(e[s]=u(t[s],0,100)))(l))continue n;a.push(l)}}return a},e.invert=_,e.invoke=function(n,t){var r=v(arguments,2),e=-1,u=typeof t=="function",o=n?n.length:0,i=Array(typeof o=="number"?o:0);return $(n,function(n){i[++e]=(u?t:n[t]).apply(n,r)}),i},e.keys=tr,e.map=F,e.max=q,e.memoize=function(n,t){var r={};return function(){var e=(t?t.apply(this,arguments):arguments[0])+""; 29 | return jt.call(r,e)?r[e]:r[e]=n.apply(this,arguments)}},e.merge=O,e.min=function(n,t,r){var e=1/0,u=e;if(!t&&nr(n)){r=-1;for(var i=n.length;++rz(o,r,1))&&(u[r]=n) 30 | }),u},e.once=function(n){var t,r;return function(){return t?r:(t=L,r=n.apply(this,arguments),n=Q,r)}},e.pairs=function(n){for(var t=-1,r=tr(n),e=r.length,u=Array(e);++tr?Nt(0,e+r):Rt(r,e-1))+1);e--;)if(n[e]===t)return e;return-1},e.mixin=H,e.noConflict=function(){return n._=ot,this},e.random=function(n,t){return n==Q&&t==Q&&(t=1),n=+n||0,t==Q&&(t=n,n=0),n+_t($t()*((+t||0)-n+1)) 36 | },e.reduce=D,e.reduceRight=I,e.result=function(n,r){var e=n?n[r]:t;return j(e)?n[r]():e},e.size=function(n){var t=n?n.length:0;return typeof t=="number"?t:tr(n).length},e.some=T,e.sortedIndex=C,e.template=function(n,r,u){var o=e.templateSettings;n||(n=""),u=or({},u,o);var i,f=or({},u.imports,o.imports),o=tr(f),f=E(f),a=0,c=u.interpolate||gt,p="__p+='";n.replace(RegExp((u.escape||gt).source+"|"+c.source+"|"+(c===vt?st:gt).source+"|"+(u.evaluate||gt).source+"|$","g"),function(t,r,e,u,o,f){return e||(e=u),p+=n.slice(a,f).replace(yt,l),r&&(p+="'+__e("+r+")+'"),o&&(i=L,p+="';"+o+";__p+='"),e&&(p+="'+((__t=("+e+"))==null?'':__t)+'"),a=f+t.length,t 37 | }),p+="';\n",c=u=u.variable,c||(u="obj",p="with("+u+"){"+p+"}"),p=(i?p.replace(ft,""):p).replace(at,"$1").replace(ct,"$1;"),p="function("+u+"){"+(c?"":u+"||("+u+"={});")+"var __t,__p='',__e=_.escape"+(i?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+p+"return __p}";try{var s=Function(o,"return "+p).apply(t,f)}catch(v){throw v.source=p,v}return r?s(r):(s.source=p,s)},e.unescape=function(n){return n==Q?"":(n+"").replace(it,g)},e.uniqueId=function(n){var t=++rt;return(n==Q?"":n+"")+t 38 | },e.all=k,e.any=T,e.detect=R,e.foldl=D,e.foldr=I,e.include=S,e.inject=D,Zt(e,function(n,t){e.prototype[t]||(e.prototype[t]=function(){var t=[this.__wrapped__];return wt.apply(t,arguments),n.apply(e,t)})}),e.first=B,e.last=function(n,t,r){if(n){var e=0,u=n.length;if(typeof t!="number"&&t!=Q){var o=u;for(t=a(t,r);o--&&t(n[o],o,n);)e++}else if(e=t,e==Q||r)return n[u-1];return v(n,Nt(0,u-e))}},e.take=B,e.head=B,Zt(e,function(n,t){e.prototype[t]||(e.prototype[t]=function(t,r){var u=n(this.__wrapped__,t,r); 39 | return t==Q||r&&typeof t!="function"?u:new e(u)})}),e.VERSION="1.0.1",e.prototype.toString=function(){return this.__wrapped__+""},e.prototype.value=J,e.prototype.valueOf=J,Xt(["join","pop","shift"],function(n){var t=nt[n];e.prototype[n]=function(){return t.apply(this.__wrapped__,arguments)}}),Xt(["push","reverse","sort","unshift"],function(n){var t=nt[n];e.prototype[n]=function(){return t.apply(this.__wrapped__,arguments),this}}),Xt(["concat","slice","splice"],function(n){var t=nt[n];e.prototype[n]=function(){return new e(t.apply(this.__wrapped__,arguments)) 40 | }}),typeof define=="function"&&typeof define.amd=="object"&&define.amd?(n._=e,define(function(){return e})):X?Y?(Y.exports=e)._=e:X._=e:n._=e})(this); -------------------------------------------------------------------------------- /src/sequence-diagram.js: -------------------------------------------------------------------------------- 1 | /** js sequence diagrams 2 | * http://bramp.github.io/js-sequence-diagrams/ 3 | * (c) 2012-2013 Andrew Brampton (bramp.net) 4 | * Simplified BSD license. 5 | */ 6 | (function () { 7 | "use strict"; 8 | /*global Diagram, Raphael, _ */ 9 | 10 | // Following the CSS convention 11 | // Margin is the gap outside the box 12 | // Padding is the gap inside the box 13 | // Each object has x/y/width/height properties 14 | // The x/y should be top left corner 15 | // width/height is with both margin and padding 16 | 17 | // TODO 18 | // Image width is wrong, when there is a note in the right hand col 19 | // Title box could look better 20 | // Note box could look better 21 | 22 | var DIAGRAM_MARGIN = 10; 23 | 24 | var ACTOR_MARGIN = 10; // Margin around a actor 25 | var ACTOR_PADDING = 10; // Padding inside a actor 26 | 27 | var SIGNAL_MARGIN = 5; // Margin around a signal 28 | var SIGNAL_PADDING = 5; // Padding inside a signal 29 | 30 | var NOTE_MARGIN = 10; // Margin around a note 31 | var NOTE_PADDING = 5; // Padding inside a note 32 | var NOTE_OVERLAP = 15; // Overlap when using a "note over A,B" 33 | 34 | var TITLE_MARGIN = 0; 35 | var TITLE_PADDING = 5; 36 | 37 | var SELF_SIGNAL_WIDTH = 20; // How far out a self signal goes 38 | 39 | var PLACEMENT = Diagram.PLACEMENT; 40 | var LINETYPE = Diagram.LINETYPE; 41 | var ARROWTYPE = Diagram.ARROWTYPE; 42 | 43 | var LINE = { 44 | 'stroke': '#000', 45 | 'stroke-width': 2 46 | }; 47 | 48 | var RECT = { 49 | 'fill': "#fff" 50 | }; 51 | 52 | function AssertException(message) { this.message = message; } 53 | AssertException.prototype.toString = function () { 54 | return 'AssertException: ' + this.message; 55 | }; 56 | 57 | function assert(exp, message) { 58 | if (!exp) { 59 | throw new AssertException(message); 60 | } 61 | } 62 | 63 | if (!String.prototype.trim) { 64 | String.prototype.trim=function() { 65 | return this.replace(/^\s+|\s+$/g, ''); 66 | }; 67 | } 68 | 69 | /****************** 70 | * Drawing extras 71 | ******************/ 72 | 73 | function getCenterX(box) { 74 | return box.x + box.width / 2; 75 | } 76 | 77 | function getCenterY(box) { 78 | return box.y + box.height / 2; 79 | } 80 | 81 | /****************** 82 | * Raphaël extras 83 | ******************/ 84 | 85 | Raphael.fn.line = function(x1, y1, x2, y2) { 86 | assert(_.all([x1,x2,y1,y2], _.isFinite), "x1,x2,y1,y2 must be numeric"); 87 | return this.path("M{0},{1} L{2},{3}", x1, y1, x2, y2); 88 | }; 89 | 90 | Raphael.fn.wobble = function(x1, y1, x2, y2) { 91 | assert(_.all([x1,x2,y1,y2], _.isFinite), "x1,x2,y1,y2 must be numeric"); 92 | 93 | var wobble = Math.sqrt( (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) / 25; 94 | 95 | // Distance along line 96 | var r1 = Math.random(); 97 | var r2 = Math.random(); 98 | 99 | var xfactor = Math.random() > 0.5 ? wobble : -wobble; 100 | var yfactor = Math.random() > 0.5 ? wobble : -wobble; 101 | 102 | var p1 = { 103 | x: (x2 - x1) * r1 + x1 + xfactor, 104 | y: (y2 - y1) * r1 + y1 + yfactor 105 | }; 106 | 107 | var p2 = { 108 | x: (x2 - x1) * r2 + x1 - xfactor, 109 | y: (y2 - y1) * r2 + y1 - yfactor 110 | }; 111 | 112 | return "C" + p1.x + "," + p1.y + 113 | " " + p2.x + "," + p2.y + 114 | " " + x2 + "," + y2; 115 | }; 116 | 117 | /** 118 | * Returns the text's bounding box 119 | */ 120 | Raphael.fn.text_bbox = function (text, font) { 121 | var p; 122 | if (font._obj) { 123 | p = this.print_center(0, 0, text, font._obj, font['font-size']); 124 | } else { 125 | p = this.text(0, 0, text); 126 | p.attr(font); 127 | } 128 | 129 | var bb = p.getBBox(); 130 | p.remove(); 131 | 132 | return bb; 133 | }; 134 | 135 | /** 136 | * Draws a wobbly (hand drawn) rect 137 | */ 138 | Raphael.fn.handRect = function (x, y, w, h) { 139 | assert(_.all([x, y, w, h], _.isFinite), "x, y, w, h must be numeric"); 140 | return this.path("M" + x + "," + y + 141 | this.wobble(x, y, x + w, y) + 142 | this.wobble(x + w, y, x + w, y + h) + 143 | this.wobble(x + w, y + h, x, y + h) + 144 | this.wobble(x, y + h, x, y)) 145 | .attr(RECT); 146 | }; 147 | 148 | /** 149 | * Draws a wobbly (hand drawn) line 150 | */ 151 | Raphael.fn.handLine = function (x1, y1, x2, y2) { 152 | assert(_.all([x1,x2,y1,y2], _.isFinite), "x1,x2,y1,y2 must be numeric"); 153 | return this.path("M" + x1 + "," + y1 + this.wobble(x1, y1, x2, y2)); 154 | }; 155 | 156 | /** 157 | * Prints, but aligns text in a similar way to text(...) 158 | */ 159 | Raphael.fn.print_center = function(x, y, string, font, size, letter_spacing) { 160 | var path = this.print(x, y, string, font, size, 'baseline', letter_spacing); 161 | var bb = path.getBBox(); 162 | 163 | // Translate the text so it's centered. 164 | var dx = (x - bb.x) - bb.width / 2; 165 | var dy = (y - bb.y) - bb.height / 2; 166 | 167 | // Due to an issue in Raphael 2.1.0 (that seems to be fixed later) 168 | // we remap the path itself, instead of using a transformation matrix 169 | var m = new Raphael.matrix(); 170 | m.translate(dx, dy); 171 | return path.attr('path', Raphael.mapPath(path.attr('path'), m)); 172 | 173 | // otherwise we would do this: 174 | //return path.transform("t" + dx + "," + dy); 175 | }; 176 | 177 | /****************** 178 | * BaseTheme 179 | ******************/ 180 | 181 | var BaseTheme = function(diagram) { 182 | this.init(diagram); 183 | }; 184 | 185 | _.extend(BaseTheme.prototype, { 186 | init : function(diagram) { 187 | this.diagram = diagram; 188 | this._paper = undefined; 189 | this._font = undefined; 190 | 191 | this._title = undefined; // hack - This should be somewhere better 192 | 193 | this._actors_height = 0; 194 | this._signals_height = 0; 195 | 196 | var a = this.arrow_types = {}; 197 | a[ARROWTYPE.FILLED] = 'block'; 198 | a[ARROWTYPE.OPEN] = 'open'; 199 | 200 | var l = this.line_types = {}; 201 | l[LINETYPE.SOLID] = ''; 202 | l[LINETYPE.DOTTED] = '-'; 203 | }, 204 | 205 | init_paper : function(container) { 206 | this._paper = new Raphael(container, 320, 200); 207 | }, 208 | 209 | init_font : function() {}, 210 | 211 | draw_line : function(x1, y1, x2, y2) { 212 | return this._paper.line(x1, y1, x2, y2); 213 | }, 214 | 215 | draw_rect : function(x, y, w, h) { 216 | return this._paper.rect(x, y, w, h); 217 | }, 218 | 219 | draw : function(container) { 220 | var diagram = this.diagram; 221 | this.init_paper(container); 222 | this.init_font(); 223 | 224 | this.layout(); 225 | 226 | var title_height = this._title ? this._title.height : 0; 227 | 228 | this._paper.setStart(); 229 | this._paper.setSize(diagram.width, diagram.height); 230 | 231 | var y = DIAGRAM_MARGIN + title_height; 232 | 233 | this.draw_title(); 234 | this.draw_actors(y); 235 | this.draw_signals(y + this._actors_height); 236 | 237 | this._paper.setFinish(); 238 | }, 239 | 240 | layout : function() { 241 | // Local copies 242 | var diagram = this.diagram; 243 | var paper = this._paper; 244 | var font = this._font; 245 | var actors = diagram.actors; 246 | var signals = diagram.signals; 247 | 248 | diagram.width = 0; // min width 249 | diagram.height = 0; // min width 250 | 251 | // Setup some layout stuff 252 | if (diagram.title) { 253 | var title = this._title = {}; 254 | var bb = paper.text_bbox(diagram.title, font); 255 | title.text_bb = bb; 256 | title.message = diagram.title; 257 | 258 | title.width = bb.width + (TITLE_PADDING + TITLE_MARGIN) * 2; 259 | title.height = bb.height + (TITLE_PADDING + TITLE_MARGIN) * 2; 260 | title.x = DIAGRAM_MARGIN; 261 | title.y = DIAGRAM_MARGIN; 262 | 263 | diagram.width += title.width; 264 | diagram.height += title.height; 265 | } 266 | 267 | _.each(actors, function(a) { 268 | var bb = paper.text_bbox(a.name, font); 269 | a.text_bb = bb; 270 | 271 | //var bb = t.attr("text", a.name).getBBox(); 272 | a.x = 0; a.y = 0; 273 | a.width = bb.width + (ACTOR_PADDING + ACTOR_MARGIN) * 2; 274 | a.height = bb.height + (ACTOR_PADDING + ACTOR_MARGIN) * 2; 275 | 276 | a.distances = []; 277 | a.padding_right = 0; 278 | this._actors_height = Math.max(a.height, this._actors_height); 279 | }, this); 280 | 281 | function actor_ensure_distance(a, b, d) { 282 | assert(a < b, "a must be less than or equal to b"); 283 | 284 | if (a < 0) { 285 | // Ensure b has left margin 286 | b = actors[b]; 287 | b.x = Math.max(d - b.width / 2, b.x); 288 | } else if (b >= actors.length) { 289 | // Ensure a has right margin 290 | a = actors[a]; 291 | a.padding_right = Math.max(d, a.padding_right); 292 | } else { 293 | a = actors[a]; 294 | a.distances[b] = Math.max(d, a.distances[b] ? a.distances[b] : 0); 295 | } 296 | } 297 | 298 | _.each(signals, function(s) { 299 | var a, b; // Indexes of the left and right actors involved 300 | 301 | var bb = paper.text_bbox(s.message, font); 302 | 303 | //var bb = t.attr("text", s.message).getBBox(); 304 | s.text_bb = bb; 305 | s.width = bb.width; 306 | s.height = bb.height; 307 | 308 | var extra_width = 0; 309 | 310 | if (s.type == "Signal") { 311 | 312 | s.width += (SIGNAL_MARGIN + SIGNAL_PADDING) * 2; 313 | s.height += (SIGNAL_MARGIN + SIGNAL_PADDING) * 2; 314 | 315 | if (s.isSelf()) { 316 | a = s.actorA.index; 317 | b = a + 1; 318 | s.width += SELF_SIGNAL_WIDTH; 319 | } else { 320 | a = Math.min(s.actorA.index, s.actorB.index); 321 | b = Math.max(s.actorA.index, s.actorB.index); 322 | } 323 | 324 | } else if (s.type == "Note") { 325 | s.width += (NOTE_MARGIN + NOTE_PADDING) * 2; 326 | s.height += (NOTE_MARGIN + NOTE_PADDING) * 2; 327 | 328 | // HACK lets include the actor's padding 329 | extra_width = 2 * ACTOR_MARGIN; 330 | 331 | if (s.placement == PLACEMENT.LEFTOF) { 332 | b = s.actor.index; 333 | a = b - 1; 334 | } else if (s.placement == PLACEMENT.RIGHTOF) { 335 | a = s.actor.index; 336 | b = a + 1; 337 | } else if (s.placement == PLACEMENT.OVER && s.hasManyActors()) { 338 | // Over multiple actors 339 | a = Math.min(s.actor[0].index, s.actor[1].index); 340 | b = Math.max(s.actor[0].index, s.actor[1].index); 341 | 342 | // We don't need our padding, and we want to overlap 343 | extra_width = - (NOTE_PADDING * 2 + NOTE_OVERLAP * 2); 344 | 345 | } else if (s.placement == PLACEMENT.OVER) { 346 | // Over single actor 347 | a = s.actor.index; 348 | actor_ensure_distance(a - 1, a, s.width / 2); 349 | actor_ensure_distance(a, a + 1, s.width / 2); 350 | this._signals_height += s.height; 351 | 352 | return; // Bail out early 353 | } 354 | } else { 355 | throw new Error("Unhandled signal type:" + s.type); 356 | } 357 | 358 | actor_ensure_distance(a, b, s.width + extra_width); 359 | this._signals_height += s.height; 360 | }, this); 361 | 362 | // Re-jig the positions 363 | var actors_x = 0; 364 | _.each(actors, function(a) { 365 | a.x = Math.max(actors_x, a.x); 366 | 367 | // TODO This only works if we loop in sequence, 0, 1, 2, etc 368 | _.each(a.distances, function(distance, b) { 369 | // lodash (and possibly others) do not like sparse arrays 370 | // so sometimes they return undefined 371 | if (typeof distance == "undefined") 372 | return; 373 | 374 | b = actors[b]; 375 | distance = Math.max(distance, a.width / 2, b.width / 2); 376 | b.x = Math.max(b.x, a.x + a.width/2 + distance - b.width/2); 377 | }); 378 | 379 | actors_x = a.x + a.width + a.padding_right; 380 | }, this); 381 | 382 | diagram.width = Math.max(actors_x, diagram.width); 383 | 384 | // TODO Refactor a little 385 | diagram.width += 2 * DIAGRAM_MARGIN; 386 | diagram.height += 2 * DIAGRAM_MARGIN + 2 * this._actors_height + this._signals_height; 387 | 388 | return this; 389 | }, 390 | 391 | draw_title : function() { 392 | var title = this._title; 393 | if (title) 394 | this.draw_text_box(title, title.message, TITLE_MARGIN, TITLE_PADDING, this._font); 395 | }, 396 | 397 | draw_actors : function(offsetY) { 398 | var y = offsetY; 399 | _.each(this.diagram.actors, function(a) { 400 | // Top box 401 | this.draw_actor(a, y, this._actors_height); 402 | 403 | // Bottom box 404 | this.draw_actor(a, y + this._actors_height + this._signals_height, this._actors_height); 405 | 406 | // Veritical line 407 | var aX = getCenterX(a); 408 | var line = this.draw_line( 409 | aX, y + this._actors_height - ACTOR_MARGIN, 410 | aX, y + this._actors_height + ACTOR_MARGIN + this._signals_height); 411 | line.attr(LINE); 412 | }, this); 413 | }, 414 | 415 | draw_actor : function (actor, offsetY, height) { 416 | actor.y = offsetY; 417 | actor.height = height; 418 | this.draw_text_box(actor, actor.name, ACTOR_MARGIN, ACTOR_PADDING, this._font); 419 | }, 420 | 421 | draw_signals : function (offsetY) { 422 | var y = offsetY; 423 | _.each(this.diagram.signals, function(s) { 424 | if (s.type == "Signal") { 425 | if (s.isSelf()) { 426 | this.draw_self_signal(s, y); 427 | } else { 428 | this.draw_signal(s, y); 429 | } 430 | 431 | } else if (s.type == "Note") { 432 | this.draw_note(s, y); 433 | } 434 | 435 | y += s.height; 436 | }, this); 437 | }, 438 | 439 | draw_self_signal : function(signal, offsetY) { 440 | assert(signal.isSelf(), "signal must be a self signal"); 441 | 442 | var text_bb = signal.text_bb; 443 | var aX = getCenterX(signal.actorA); 444 | 445 | var x = aX + SELF_SIGNAL_WIDTH + SIGNAL_PADDING - text_bb.x; 446 | var y = offsetY + signal.height / 2; 447 | 448 | this.draw_text(x, y, signal.message, this._font); 449 | 450 | var attr = _.extend({}, LINE, { 451 | 'stroke-dasharray': this.line_types[signal.linetype] 452 | }); 453 | 454 | var y1 = offsetY + SIGNAL_MARGIN; 455 | var y2 = y1 + signal.height - SIGNAL_MARGIN; 456 | 457 | // Draw three lines, the last one with a arrow 458 | var line; 459 | line = this.draw_line(aX, y1, aX + SELF_SIGNAL_WIDTH, y1); 460 | line.attr(attr); 461 | 462 | line = this.draw_line(aX + SELF_SIGNAL_WIDTH, y1, aX + SELF_SIGNAL_WIDTH, y2); 463 | line.attr(attr); 464 | 465 | line = this.draw_line(aX + SELF_SIGNAL_WIDTH, y2, aX, y2); 466 | attr['arrow-end'] = this.arrow_types[signal.arrowtype] + '-wide-long'; 467 | line.attr(attr); 468 | }, 469 | 470 | draw_signal : function (signal, offsetY) { 471 | var aX = getCenterX( signal.actorA ); 472 | var bX = getCenterX( signal.actorB ); 473 | 474 | // Mid point between actors 475 | var x = (bX - aX) / 2 + aX; 476 | var y = offsetY + SIGNAL_MARGIN + 2*SIGNAL_PADDING; 477 | 478 | // Draw the text in the middle of the signal 479 | this.draw_text(x, y, signal.message, this._font); 480 | 481 | // Draw the line along the bottom of the signal 482 | y = offsetY + signal.height - SIGNAL_MARGIN - SIGNAL_PADDING; 483 | var line = this.draw_line(aX, y, bX, y); 484 | line.attr(LINE); 485 | line.attr({ 486 | 'arrow-end': this.arrow_types[signal.arrowtype] + '-wide-long', 487 | 'stroke-dasharray': this.line_types[signal.linetype] 488 | }); 489 | 490 | //var ARROW_SIZE = 16; 491 | //var dir = this.actorA.x < this.actorB.x ? 1 : -1; 492 | //draw_arrowhead(bX, offsetY, ARROW_SIZE, dir); 493 | }, 494 | 495 | draw_note : function (note, offsetY) { 496 | note.y = offsetY; 497 | var actorA = note.hasManyActors() ? note.actor[0] : note.actor; 498 | var aX = getCenterX( actorA ); 499 | switch (note.placement) { 500 | case PLACEMENT.RIGHTOF: 501 | note.x = aX + ACTOR_MARGIN; 502 | break; 503 | case PLACEMENT.LEFTOF: 504 | note.x = aX - ACTOR_MARGIN - note.width; 505 | break; 506 | case PLACEMENT.OVER: 507 | if (note.hasManyActors()) { 508 | var bX = getCenterX( note.actor[1] ); 509 | var overlap = NOTE_OVERLAP + NOTE_PADDING; 510 | note.x = aX - overlap; 511 | note.width = (bX + overlap) - note.x; 512 | } else { 513 | note.x = aX - note.width / 2; 514 | } 515 | break; 516 | default: 517 | throw new Error("Unhandled note placement:" + note.placement); 518 | } 519 | 520 | this.draw_text_box(note, note.message, NOTE_MARGIN, NOTE_PADDING, this._font); 521 | }, 522 | 523 | /** 524 | * Draws text with a white background 525 | * x,y (int) x,y center point for this text 526 | * TODO Horz center the text when it's multi-line print 527 | */ 528 | draw_text : function (x, y, text, font) { 529 | var paper = this._paper; 530 | var f = font || {}; 531 | var t; 532 | if (f._obj) { 533 | t = paper.print_center(x, y, text, f._obj, f['font-size']); 534 | } else { 535 | t = paper.text(x, y, text); 536 | t.attr(f); 537 | } 538 | // draw a rect behind it 539 | var bb = t.getBBox(); 540 | var r = paper.rect(bb.x, bb.y, bb.width, bb.height); 541 | r.attr({'fill': "#fff", 'stroke': 'none'}); 542 | 543 | t.toFront(); 544 | }, 545 | 546 | draw_text_box : function (box, text, margin, padding, font) { 547 | var x = box.x + margin; 548 | var y = box.y + margin; 549 | var w = box.width - 2 * margin; 550 | var h = box.height - 2 * margin; 551 | 552 | // Draw inner box 553 | var rect = this.draw_rect(x, y, w, h); 554 | rect.attr(LINE); 555 | 556 | // Draw text (in the center) 557 | x = getCenterX(box); 558 | y = getCenterY(box); 559 | 560 | this.draw_text(x, y, text, font); 561 | } 562 | 563 | /** 564 | * Draws a arrow head 565 | * direction must be -1 for left, or 1 for right 566 | */ 567 | //function draw_arrowhead(x, y, size, direction) { 568 | // var dx = (size/2) * direction; 569 | // var dy = (size/2); 570 | // 571 | // y -= dy; x -= dx; 572 | // var p = this._paper.path("M" + x + "," + y + "v" + size + "l" + dx + ",-" + (size/2) + "Z"); 573 | //} 574 | }); 575 | 576 | /****************** 577 | * RaphaelTheme 578 | ******************/ 579 | 580 | var RaphaelTheme = function(diagram) { 581 | this.init(diagram); 582 | }; 583 | 584 | _.extend(RaphaelTheme.prototype, BaseTheme.prototype, { 585 | 586 | init_font : function() { 587 | this._font = { 588 | 'font-size': 16, 589 | 'font-family': 'Andale Mono, monospace' 590 | }; 591 | } 592 | 593 | }); 594 | 595 | /****************** 596 | * HandRaphaelTheme 597 | ******************/ 598 | 599 | var HandRaphaelTheme = function(diagram) { 600 | this.init(diagram); 601 | }; 602 | 603 | // Take the standard RaphaelTheme and make all the lines wobbly 604 | _.extend(HandRaphaelTheme.prototype, BaseTheme.prototype, { 605 | init_font : function() { 606 | this._font = { 607 | 'font-size': 16, 608 | 'font-family': 'daniel' 609 | }; 610 | 611 | this._font._obj = this._paper.getFont('daniel'); 612 | }, 613 | 614 | draw_line : function(x1, y1, x2, y2) { 615 | return this._paper.handLine(x1, y1, x2, y2); 616 | }, 617 | 618 | draw_rect : function(x, y, w, h) { 619 | return this._paper.handRect(x, y, w, h); 620 | } 621 | }); 622 | 623 | var themes = { 624 | simple : RaphaelTheme, 625 | hand : HandRaphaelTheme 626 | }; 627 | 628 | Diagram.prototype.drawSVG = function (container, options) { 629 | var default_options = { 630 | theme: 'hand' 631 | }; 632 | 633 | options = _.defaults(options || {}, default_options); 634 | 635 | if (!(options.theme in themes)) 636 | throw new Error("Unsupported theme: " + options.theme); 637 | 638 | var drawing = new themes[options.theme](this); 639 | drawing.draw(container); 640 | 641 | }; // end of drawSVG 642 | 643 | }()); 644 | -------------------------------------------------------------------------------- /test/qunit.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * QUnit v1.11.0 - A JavaScript Unit Testing Framework 3 | * 4 | * http://qunitjs.com 5 | * 6 | * Copyright 2012 jQuery Foundation and other contributors 7 | * Released under the MIT license. 8 | * http://jquery.org/license 9 | */ 10 | (function(window){var QUnit,assert,config,onErrorFnPrev,testId=0,fileName=(sourceFromStacktrace(0)||"").replace(/(:\d+)+\)?/,"").replace(/.+\//,""),toString=Object.prototype.toString,hasOwn=Object.prototype.hasOwnProperty,Date=window.Date,defined={setTimeout:typeof window.setTimeout!=="undefined",sessionStorage:function(){var x="qunit-test-string";try{sessionStorage.setItem(x,x);sessionStorage.removeItem(x);return true}catch(e){return false}}()},errorString=function(error){var name,message,errorString=error.toString();if(errorString.substring(0,7)==="[object"){name=error.name?error.name.toString():"Error";message=error.message?error.message.toString():"";if(name&&message){return name+": "+message}else if(name){return name}else if(message){return message}else{return"Error"}}else{return errorString}},objectValues=function(obj){var key,val,vals=QUnit.is("array",obj)?[]:{};for(key in obj){if(hasOwn.call(obj,key)){val=obj[key];vals[key]=val===Object(val)?objectValues(val):val}}return vals};function Test(settings){extend(this,settings);this.assertions=[];this.testNumber=++Test.count}Test.count=0;Test.prototype={init:function(){var a,b,li,tests=id("qunit-tests");if(tests){b=document.createElement("strong");b.innerHTML=this.nameHtml;a=document.createElement("a");a.innerHTML="Rerun";a.href=QUnit.url({testNumber:this.testNumber});li=document.createElement("li");li.appendChild(b);li.appendChild(a);li.className="running";li.id=this.id="qunit-test-output"+testId++;tests.appendChild(li)}},setup:function(){if(this.module!==config.previousModule){if(config.previousModule){runLoggingCallbacks("moduleDone",QUnit,{name:config.previousModule,failed:config.moduleStats.bad,passed:config.moduleStats.all-config.moduleStats.bad,total:config.moduleStats.all})}config.previousModule=this.module;config.moduleStats={all:0,bad:0};runLoggingCallbacks("moduleStart",QUnit,{name:this.module})}else if(config.autorun){runLoggingCallbacks("moduleStart",QUnit,{name:this.module})}config.current=this;this.testEnvironment=extend({setup:function(){},teardown:function(){}},this.moduleTestEnvironment);this.started=+new Date;runLoggingCallbacks("testStart",QUnit,{name:this.testName,module:this.module});QUnit.current_testEnvironment=this.testEnvironment;if(!config.pollution){saveGlobal()}if(config.notrycatch){this.testEnvironment.setup.call(this.testEnvironment);return}try{this.testEnvironment.setup.call(this.testEnvironment)}catch(e){QUnit.pushFailure("Setup failed on "+this.testName+": "+(e.message||e),extractStacktrace(e,1))}},run:function(){config.current=this;var running=id("qunit-testresult");if(running){running.innerHTML="Running:
"+this.nameHtml}if(this.async){QUnit.stop()}this.callbackStarted=+new Date;if(config.notrycatch){this.callback.call(this.testEnvironment,QUnit.assert);this.callbackRuntime=+new Date-this.callbackStarted;return}try{this.callback.call(this.testEnvironment,QUnit.assert);this.callbackRuntime=+new Date-this.callbackStarted}catch(e){this.callbackRuntime=+new Date-this.callbackStarted;QUnit.pushFailure("Died on test #"+(this.assertions.length+1)+" "+this.stack+": "+(e.message||e),extractStacktrace(e,0));saveGlobal();if(config.blocking){QUnit.start()}}},teardown:function(){config.current=this;if(config.notrycatch){if(typeof this.callbackRuntime==="undefined"){this.callbackRuntime=+new Date-this.callbackStarted}this.testEnvironment.teardown.call(this.testEnvironment);return}else{try{this.testEnvironment.teardown.call(this.testEnvironment)}catch(e){QUnit.pushFailure("Teardown failed on "+this.testName+": "+(e.message||e),extractStacktrace(e,1))}}checkPollution()},finish:function(){config.current=this;if(config.requireExpects&&this.expected===null){QUnit.pushFailure("Expected number of assertions to be defined, but expect() was not called.",this.stack)}else if(this.expected!==null&&this.expected!==this.assertions.length){QUnit.pushFailure("Expected "+this.expected+" assertions, but "+this.assertions.length+" were run",this.stack)}else if(this.expected===null&&!this.assertions.length){QUnit.pushFailure("Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.",this.stack)}var i,assertion,a,b,time,li,ol,test=this,good=0,bad=0,tests=id("qunit-tests");this.runtime=+new Date-this.started;config.stats.all+=this.assertions.length;config.moduleStats.all+=this.assertions.length;if(tests){ol=document.createElement("ol");ol.className="qunit-assert-list";for(i=0;i("+bad+", "+good+", "+this.assertions.length+")";addEvent(b,"click",function(){var next=b.parentNode.lastChild,collapsed=hasClass(next,"qunit-collapsed");(collapsed?removeClass:addClass)(next,"qunit-collapsed")});addEvent(b,"dblclick",function(e){var target=e&&e.target?e.target:window.event.srcElement;if(target.nodeName.toLowerCase()==="span"||target.nodeName.toLowerCase()==="b"){target=target.parentNode}if(window.location&&target.nodeName.toLowerCase()==="strong"){window.location=QUnit.url({testNumber:test.testNumber})}});time=document.createElement("span");time.className="runtime";time.innerHTML=this.runtime+" ms";li=id(this.id);li.className=bad?"fail":"pass";li.removeChild(li.firstChild);a=li.firstChild;li.appendChild(b);li.appendChild(a);li.appendChild(time);li.appendChild(ol)}else{for(i=0;i";if(arguments.length===2){callback=expected;expected=null}if(config.currentModule){nameHtml=""+escapeText(config.currentModule)+": "+nameHtml}test=new Test({nameHtml:nameHtml,testName:testName,expected:expected,async:async,callback:callback,module:config.currentModule,moduleTestEnvironment:config.currentModuleTestEnvironment,stack:sourceFromStacktrace(2)});if(!validTest(test)){return}test.queue()},expect:function(asserts){if(arguments.length===1){config.current.expected=asserts}else{return config.current.expected}},start:function(count){if(config.semaphore===undefined){QUnit.begin(function(){setTimeout(function(){QUnit.start(count)})});return}config.semaphore-=count||1;if(config.semaphore>0){return}if(config.semaphore<0){config.semaphore=0;QUnit.pushFailure("Called start() while already started (QUnit.config.semaphore was 0 already)",null,sourceFromStacktrace(2));return}if(defined.setTimeout){window.setTimeout(function(){if(config.semaphore>0){return}if(config.timeout){clearTimeout(config.timeout)}config.blocking=false;process(true)},13)}else{config.blocking=false;process(true)}},stop:function(count){config.semaphore+=count||1;config.blocking=true;if(config.testTimeout&&defined.setTimeout){clearTimeout(config.timeout);config.timeout=window.setTimeout(function(){QUnit.ok(false,"Test timed out");config.semaphore=1;QUnit.start()},config.testTimeout)}}};assert={ok:function(result,msg){if(!config.current){throw new Error("ok() assertion outside test context, was "+sourceFromStacktrace(2))}result=!!result;var source,details={module:config.current.module,name:config.current.testName,result:result,message:msg};msg=escapeText(msg||(result?"okay":"failed"));msg=""+msg+"";if(!result){source=sourceFromStacktrace(2);if(source){details.source=source;msg+="
Source:
"+escapeText(source)+"
"}}runLoggingCallbacks("log",QUnit,details);config.current.assertions.push({result:result,message:msg})},equal:function(actual,expected,message){QUnit.push(expected==actual,actual,expected,message)},notEqual:function(actual,expected,message){QUnit.push(expected!=actual,actual,expected,message)},propEqual:function(actual,expected,message){actual=objectValues(actual);expected=objectValues(expected);QUnit.push(QUnit.equiv(actual,expected),actual,expected,message)},notPropEqual:function(actual,expected,message){actual=objectValues(actual);expected=objectValues(expected);QUnit.push(!QUnit.equiv(actual,expected),actual,expected,message)},deepEqual:function(actual,expected,message){QUnit.push(QUnit.equiv(actual,expected),actual,expected,message)},notDeepEqual:function(actual,expected,message){QUnit.push(!QUnit.equiv(actual,expected),actual,expected,message)},strictEqual:function(actual,expected,message){QUnit.push(expected===actual,actual,expected,message)},notStrictEqual:function(actual,expected,message){QUnit.push(expected!==actual,actual,expected,message)},"throws":function(block,expected,message){var actual,expectedOutput=expected,ok=false;if(typeof expected==="string"){message=expected;expected=null}config.current.ignoreGlobalErrors=true;try{block.call(config.current.testEnvironment)}catch(e){actual=e}config.current.ignoreGlobalErrors=false;if(actual){if(!expected){ok=true;expectedOutput=null}else if(QUnit.objectType(expected)==="regexp"){ok=expected.test(errorString(actual))}else if(actual instanceof expected){ok=true}else if(expected.call({},actual)===true){expectedOutput=null;ok=true}QUnit.push(ok,actual,expectedOutput,message)}else{QUnit.pushFailure(message,null,"No exception was thrown.")}}};extend(QUnit,assert);QUnit.raises=assert["throws"];QUnit.equals=function(){QUnit.push(false,false,false,"QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead")};QUnit.same=function(){QUnit.push(false,false,false,"QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead")};(function(){function F(){}F.prototype=QUnit;QUnit=new F;QUnit.constructor=F})();config={queue:[],blocking:true,hidepassed:false,reorder:true,altertitle:true,requireExpects:false,urlConfig:[{id:"noglobals",label:"Check for Globals",tooltip:"Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings."},{id:"notrycatch",label:"No try-catch",tooltip:"Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings."}],modules:{},begin:[],done:[],log:[],testStart:[],testDone:[],moduleStart:[],moduleDone:[]};if(typeof exports==="undefined"){extend(window,QUnit);window.QUnit=QUnit}(function(){var i,location=window.location||{search:"",protocol:"file:"},params=location.search.slice(1).split("&"),length=params.length,urlParams={},current;if(params[0]){for(i=0;i"+escapeText(document.title)+""+"

"+"
"+"

"+"
    "}tests=id("qunit-tests");banner=id("qunit-banner");result=id("qunit-testresult");if(tests){tests.innerHTML=""}if(banner){banner.className=""}if(result){result.parentNode.removeChild(result)}if(tests){result=document.createElement("p");result.id="qunit-testresult";result.className="result";tests.parentNode.insertBefore(result,tests);result.innerHTML="Running...
     "}},reset:function(){var fixture=id("qunit-fixture");if(fixture){fixture.innerHTML=config.fixture}},triggerEvent:function(elem,type,event){if(document.createEvent){event=document.createEvent("MouseEvents");event.initMouseEvent(type,true,true,elem.ownerDocument.defaultView,0,0,0,0,0,false,false,false,false,0,null);elem.dispatchEvent(event)}else if(elem.fireEvent){elem.fireEvent("on"+type)}},is:function(type,obj){return QUnit.objectType(obj)===type},objectType:function(obj){if(typeof obj==="undefined"){return"undefined"}if(obj===null){return"null"}var match=toString.call(obj).match(/^\[object\s(.*)\]$/),type=match&&match[1]||"";switch(type){case"Number":if(isNaN(obj)){return"nan"}return"number";case"String":case"Boolean":case"Array":case"Date":case"RegExp":case"Function":return type.toLowerCase()}if(typeof obj==="object"){return"object"}return undefined},push:function(result,actual,expected,message){if(!config.current){throw new Error("assertion outside test context, was "+sourceFromStacktrace())}var output,source,details={module:config.current.module,name:config.current.testName,result:result,message:message,actual:actual,expected:expected};message=escapeText(message)||(result?"okay":"failed");message=""+message+"";output=message;if(!result){expected=escapeText(QUnit.jsDump.parse(expected));actual=escapeText(QUnit.jsDump.parse(actual));output+="";if(actual!==expected){output+="";output+=""}source=sourceFromStacktrace();if(source){details.source=source;output+=""}output+="
    Expected:
    "+expected+"
    Result:
    "+actual+"
    Diff:
    "+QUnit.diff(expected,actual)+"
    Source:
    "+escapeText(source)+"
    "}runLoggingCallbacks("log",QUnit,details);config.current.assertions.push({result:!!result,message:output})},pushFailure:function(message,source,actual){if(!config.current){throw new Error("pushFailure() assertion outside test context, was "+sourceFromStacktrace(2))}var output,details={module:config.current.module,name:config.current.testName,result:false,message:message};message=escapeText(message)||"error";message=""+message+"";output=message;output+="";if(actual){output+=""}if(source){details.source=source;output+=""}output+="
    Result:
    "+escapeText(actual)+"
    Source:
    "+escapeText(source)+"
    ";runLoggingCallbacks("log",QUnit,details);config.current.assertions.push({result:false,message:output})},url:function(params){params=extend(extend({},QUnit.urlParams),params);var key,querystring="?";for(key in params){if(!hasOwn.call(params,key)){continue}querystring+=encodeURIComponent(key)+"="+encodeURIComponent(params[key])+"&"}return window.location.protocol+"//"+window.location.host+window.location.pathname+querystring.slice(0,-1)},extend:extend,id:id,addEvent:addEvent});extend(QUnit.constructor.prototype,{begin:registerLoggingCallback("begin"),done:registerLoggingCallback("done"),log:registerLoggingCallback("log"),testStart:registerLoggingCallback("testStart"),testDone:registerLoggingCallback("testDone"),moduleStart:registerLoggingCallback("moduleStart"),moduleDone:registerLoggingCallback("moduleDone")});if(typeof document==="undefined"||document.readyState==="complete"){config.autorun=true}QUnit.load=function(){runLoggingCallbacks("begin",QUnit,{});var banner,filter,i,label,len,main,ol,toolbar,userAgent,val,urlConfigCheckboxesContainer,urlConfigCheckboxes,moduleFilter,numModules=0,moduleFilterHtml="",urlConfigHtml="",oldconfig=extend({},config);QUnit.init();extend(config,oldconfig);config.blocking=false;len=config.urlConfig.length;for(i=0;i"}moduleFilterHtml+="";userAgent=id("qunit-userAgent");if(userAgent){userAgent.innerHTML=navigator.userAgent}banner=id("qunit-header");if(banner){banner.innerHTML=""+banner.innerHTML+" "}toolbar=id("qunit-testrunner-toolbar");if(toolbar){filter=document.createElement("input");filter.type="checkbox";filter.id="qunit-filter-pass";addEvent(filter,"click",function(){var tmp,ol=document.getElementById("qunit-tests");if(filter.checked){ol.className=ol.className+" hidepass"}else{tmp=" "+ol.className.replace(/[\n\t\r]/g," ")+" ";ol.className=tmp.replace(/ hidepass /," ")}if(defined.sessionStorage){if(filter.checked){sessionStorage.setItem("qunit-filter-passed-tests","true")}else{sessionStorage.removeItem("qunit-filter-passed-tests")}}});if(config.hidepassed||defined.sessionStorage&&sessionStorage.getItem("qunit-filter-passed-tests")){filter.checked=true;ol=document.getElementById("qunit-tests");ol.className=ol.className+" hidepass"}toolbar.appendChild(filter);label=document.createElement("label");label.setAttribute("for","qunit-filter-pass");label.setAttribute("title","Only show tests and assertons that fail. Stored in sessionStorage.");label.innerHTML="Hide passed tests";toolbar.appendChild(label);urlConfigCheckboxesContainer=document.createElement("span");urlConfigCheckboxesContainer.innerHTML=urlConfigHtml;urlConfigCheckboxes=urlConfigCheckboxesContainer.getElementsByTagName("input");addEvents(urlConfigCheckboxes,"click",function(event){var params={},target=event.target||event.srcElement;params[target.name]=target.checked?true:undefined;window.location=QUnit.url(params)});toolbar.appendChild(urlConfigCheckboxesContainer);if(numModules>1){moduleFilter=document.createElement("span");moduleFilter.setAttribute("id","qunit-modulefilter-container");moduleFilter.innerHTML=moduleFilterHtml;addEvent(moduleFilter.lastChild,"change",function(){var selectBox=moduleFilter.getElementsByTagName("select")[0],selectedModule=decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);window.location=QUnit.url({module:selectedModule===""?undefined:selectedModule})});toolbar.appendChild(moduleFilter)}}main=id("qunit-fixture");if(main){config.fixture=main.innerHTML}if(config.autostart){QUnit.start()}};addEvent(window,"load",QUnit.load);onErrorFnPrev=window.onerror;window.onerror=function(error,filePath,linerNr){var ret=false;if(onErrorFnPrev){ret=onErrorFnPrev(error,filePath,linerNr)}if(ret!==true){if(QUnit.config.current){if(QUnit.config.current.ignoreGlobalErrors){return true}QUnit.pushFailure(error,filePath+":"+linerNr)}else{QUnit.test("global failure",extend(function(){QUnit.pushFailure(error,filePath+":"+linerNr)},{validTest:validTest}))}return false}return ret};function done(){config.autorun=true;if(config.currentModule){runLoggingCallbacks("moduleDone",QUnit,{name:config.currentModule,failed:config.moduleStats.bad,passed:config.moduleStats.all-config.moduleStats.bad,total:config.moduleStats.all})}var i,key,banner=id("qunit-banner"),tests=id("qunit-tests"),runtime=+new Date-config.started,passed=config.stats.all-config.stats.bad,html=["Tests completed in ",runtime," milliseconds.
    ","",passed," assertions of ",config.stats.all," passed, ",config.stats.bad," failed."].join("");if(banner){banner.className=config.stats.bad?"qunit-fail":"qunit-pass"}if(tests){id("qunit-testresult").innerHTML=html}if(config.altertitle&&typeof document!=="undefined"&&document.title){document.title=[config.stats.bad?"✖":"✔",document.title.replace(/^[\u2714\u2716] /i,"")].join(" ")}if(config.reorder&&defined.sessionStorage&&config.stats.bad===0){for(i=0;i&]/g,function(s){switch(s){case"'":return"'";case'"':return""";case"<":return"<";case">":return">";case"&":return"&"}})}function synchronize(callback,last){config.queue.push(callback);if(config.autorun&&!config.blocking){process(last)}}function process(last){function next(){process(last)}var start=(new Date).getTime();config.depth=config.depth?config.depth+1:1;while(config.queue.length&&!config.blocking){if(!defined.setTimeout||config.updateRate<=0||(new Date).getTime()-start0){QUnit.pushFailure("Introduced global variable(s): "+newGlobals.join(", "))}deletedGlobals=diff(old,config.pollution);if(deletedGlobals.length>0){QUnit.pushFailure("Deleted global variable(s): "+deletedGlobals.join(", "))}}function diff(a,b){var i,j,result=a.slice();for(i=0;i-1}function addClass(elem,name){if(!hasClass(elem,name)){elem.className+=(elem.className?" ":"")+name}}function removeClass(elem,name){var set=" "+elem.className+" ";while(set.indexOf(" "+name+" ")>-1){set=set.replace(" "+name+" "," ")}elem.className=window.jQuery?jQuery.trim(set):set.trim?set.trim():set}function id(name){return!!(typeof document!=="undefined"&&document&&document.getElementById)&&document.getElementById(name)}function registerLoggingCallback(key){return function(callback){config[key].push(callback)}}function runLoggingCallbacks(key,scope,args){var i,callbacks;if(QUnit.hasOwnProperty(key)){QUnit[key].call(scope,args)}else{callbacks=config[key];for(i=0;i":"\n":this.HTML?" ":" "},indent:function(extra){if(!this.multiline){return""}var chr=this.indentChar;if(this.HTML){chr=chr.replace(/\t/g," ").replace(/ /g," ")}return new Array(this._depth_+(extra||0)).join(chr)},up:function(a){this._depth_+=a||1},down:function(a){this._depth_-=a||1},setParser:function(name,parser){this.parsers[name]=parser},quote:quote,literal:literal,join:join,_depth_:1,parsers:{window:"[Window]",document:"[Document]",error:function(error){return'Error("'+error.message+'")'},unknown:"[Unknown]","null":"null",undefined:"undefined","function":function(fn){var ret="function",name="name"in fn?fn.name:(reName.exec(fn)||[])[1];if(name){ret+=" "+name}ret+="( ";ret=[ret,QUnit.jsDump.parse(fn,"functionArgs"),"){"].join("");return join(ret,QUnit.jsDump.parse(fn,"functionCode"),"}")},array:array,nodelist:array,arguments:array,object:function(map,stack){var ret=[],keys,key,val,i;QUnit.jsDump.up();keys=[];for(key in map){keys.push(key)}keys.sort();for(i=0;i",tag=node.nodeName.toLowerCase(),ret=open+tag,attrs=node.attributes;if(attrs){for(i=0,len=attrs.length;i0;i--){if(n[i].text!=null&&n[i-1].text==null&&n[i].row>0&&o[n[i].row-1].text==null&&n[i-1]==o[n[i].row-1]){n[i-1]={text:n[i-1],row:n[i].row-1};o[n[i].row-1]={text:o[n[i].row-1],row:i-1}}}return{o:o,n:n}}return function(o,n){o=o.replace(/\s+$/,"");n=n.replace(/\s+$/,"");var i,pre,str="",out=diff(o===""?[]:o.split(/\s+/),n===""?[]:n.split(/\s+/)),oSpace=o.match(/\s+/g),nSpace=n.match(/\s+/g);if(oSpace==null){oSpace=[" "]}else{oSpace.push(" ")}if(nSpace==null){nSpace=[" "]}else{nSpace.push(" ")}if(out.n.length===0){for(i=0;i"+out.o[i]+oSpace[i]+""}}else{if(out.n[0].text==null){for(n=0;n"+out.o[n]+oSpace[n]+""}}for(i=0;i"+out.n[i]+nSpace[i]+""}else{pre="";for(n=out.n[i].row+1;n"+out.o[n]+oSpace[n]+""}str+=" "+out.n[i].text+nSpace[i]+pre}}}return str}}();if(typeof exports!=="undefined"){extend(exports,QUnit)}})(function(){return this}.call()); -------------------------------------------------------------------------------- /fonts/daniel/daniel_700.font.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * The following copyright notice may not be removed under any circumstances. 3 | * 4 | * Copyright: 5 | * Generated by Fontographer 4.0 6 | */ 7 | Raphael.registerFont({"w":209,"face":{"font-family":"daniel","font-weight":700,"font-stretch":"normal","units-per-em":"360","panose-1":"2 11 8 0 0 0 0 0 0 0","ascent":"288","descent":"-72","x-height":"7","bbox":"-92.0373 -310.134 632 184.967","underline-thickness":"3.51562","underline-position":"-21.6211","unicode-range":"U+0009-U+F002"},"glyphs":{" ":{"w":179},"\t":{"w":179},"!":{"d":"66,-306v9,3,18,11,19,24v-18,73,-20,111,-37,194v0,10,2,34,-12,34v-12,0,-18,-9,-18,-28v0,-85,23,-136,38,-214v1,-7,4,-10,10,-10xm25,-30v15,-1,28,34,5,35v-11,-1,-38,-36,-5,-35","w":115},"\"":{"d":"91,-214v-32,3,-25,-40,-20,-68v3,-16,7,-25,12,-27v35,13,14,56,8,95xm8,-231v4,-31,1,-40,18,-75v37,7,11,51,11,79v-3,3,-4,8,-5,13v-17,4,-16,-10,-24,-17","w":117},"#":{"d":"271,-64v-30,26,-96,-7,-102,51v-6,2,-13,2,-24,-2v-2,-11,10,-21,2,-28v-14,5,-48,0,-48,22v0,23,-11,14,-29,10v-7,-6,6,-19,-1,-24r-32,4v-19,-8,-15,-24,5,-28r33,-6v4,0,24,-23,11,-27v-26,0,-63,14,-74,-10v3,-1,9,-17,16,-10v15,-8,81,4,89,-30v8,-14,16,-34,24,-38v23,9,24,38,5,49v37,24,55,-38,72,-43v19,10,20,23,-1,45v2,8,23,1,29,4v3,3,6,6,10,11v-14,13,-20,12,-45,12v-17,0,-16,17,-19,29v18,-7,49,3,67,-2v4,0,8,4,12,11xm161,-104v-30,-1,-44,10,-44,37v14,1,24,0,40,-5v0,-1,3,-10,8,-26v0,-4,-1,-6,-4,-6","w":285},"$":{"d":"164,-257v29,4,1,42,-3,50v5,5,38,13,41,24v8,4,6,15,-2,21v-18,3,-36,-17,-49,-17v-17,1,-31,40,-28,48v5,4,8,8,9,10v13,1,35,37,28,44v-10,21,-36,20,-65,28v-10,10,-12,40,-17,51v-9,-3,-28,1,-18,-17v0,-13,5,-24,-1,-35v-18,1,-59,-10,-42,-29v21,0,56,16,55,-16v5,-4,9,-18,9,-26v-14,-15,-55,-41,-53,-65v2,-33,56,-19,98,-26v10,-14,31,-43,38,-45xm93,-152v11,-10,15,-15,14,-29v-17,-3,-37,1,-43,6v10,12,20,19,29,23xm111,-103v-8,1,-11,12,-10,22v10,0,28,2,27,-8v0,-4,-13,-15,-17,-14","w":225},"%":{"d":"181,-96v24,-7,67,-13,104,1v14,18,21,19,22,44v-13,43,-99,61,-146,36v-9,-9,-22,-11,-32,-29v0,-27,24,-53,52,-52xm139,-185v-9,68,-138,73,-131,-5v0,-3,3,-9,9,-17v13,1,27,1,17,-16v5,-39,63,0,93,-6v36,1,80,-9,102,11v15,32,12,32,-8,56v-16,21,-103,78,-152,125r-14,28v-23,11,-25,-7,-29,-20v34,-71,133,-98,171,-162v-13,-12,-52,-5,-61,1v0,1,1,3,3,5xm38,-190v0,34,55,29,70,8v0,-14,-20,-11,-32,-14v-14,-3,-24,-9,-40,-10v1,0,5,11,2,16xm172,-53v12,27,90,18,102,-5v-18,-7,-32,-10,-40,-10v-29,3,-57,-4,-62,15","w":308},"&":{"d":"145,-82v17,-8,47,-15,71,-26v13,2,25,12,9,23v-23,7,-40,16,-53,27r0,6v13,8,30,21,36,38v0,8,-4,12,-11,12v-19,0,-43,-39,-59,-44v-30,12,-65,29,-97,32v-32,3,-45,-41,-23,-63v21,-20,52,-26,70,-48v-4,-31,-12,-47,9,-73v13,-16,20,-29,23,-39v15,-15,32,-22,51,-22v30,9,62,64,32,96v-2,3,-47,42,-69,48v-15,8,-11,9,0,22v6,7,10,11,11,11xm114,-138v25,-13,62,-38,74,-62v0,-9,-10,-31,-20,-29v-28,7,-60,42,-60,75v0,10,2,15,6,16xm99,-91v-18,10,-54,18,-59,45v26,5,61,-12,77,-22v-1,-5,-13,-23,-18,-23","w":253},"'":{"d":"36,-182v-36,7,-34,-61,-17,-80v15,1,21,19,21,20r-1,-1v0,0,-1,12,-5,35v1,5,3,17,2,26","w":63},"(":{"d":"130,-306v13,2,23,43,-1,43v-49,43,-77,77,-90,148v5,49,27,67,64,101v4,14,5,6,2,19r-15,0v-35,-17,-79,-58,-79,-120v0,-58,66,-176,119,-191","w":120},")":{"d":"108,-138v-2,73,-48,120,-98,153v-17,-5,-16,-20,-6,-31v52,-64,73,-62,74,-135v1,-42,-40,-98,-58,-128v0,-5,-1,-12,-2,-22v18,-18,25,0,42,27v25,39,50,66,48,136","w":120},"*":{"d":"121,-271v15,-5,36,-8,40,9v-5,10,-31,19,-47,31v0,11,34,43,14,53v-18,8,-24,-24,-34,-20v-4,10,-4,19,-12,41v-25,7,-15,-30,-17,-47v-13,-1,-17,9,-46,30r-10,0v-20,-32,37,-43,54,-64v-10,-11,-36,-33,-16,-51v3,0,14,8,33,24v8,-10,26,-39,32,-42v14,7,15,23,9,36","w":177},"+":{"d":"163,-64v-7,22,-65,2,-77,21v-2,10,-6,21,-11,35v-20,4,-21,-12,-19,-29v3,-23,-44,6,-39,-27v-8,-22,36,-8,49,-18v8,-13,6,-36,24,-40v19,-4,14,32,11,39v18,3,19,2,54,8v2,1,5,5,8,11","w":170},",":{"d":"25,63v-26,21,-48,-2,-22,-24v14,-12,35,-40,35,-69v3,-2,3,-11,12,-9v35,17,5,88,-25,102","w":97},"-":{"d":"57,-94v19,4,55,-5,54,17v-15,23,-54,20,-91,15v-4,2,-13,-10,-11,-16v-1,-22,28,-15,48,-16","w":124},".":{"d":"40,-48v21,20,21,44,-4,44v-33,0,-26,-24,-10,-44r14,0","w":67},"\/":{"d":"21,20v-22,-45,21,-95,41,-126v38,-57,115,-158,193,-201v2,0,4,3,7,11v11,29,-15,34,-25,55v-81,56,-189,208,-197,261r-19,0","w":275},"0":{"d":"78,-237v70,-47,269,-41,270,59v0,34,-11,53,-29,76v-13,35,-30,32,-85,64v-6,2,-10,6,-7,8v-73,14,-98,38,-173,1v-7,-13,-52,-48,-46,-88v9,-57,27,-75,70,-120xm123,-38v100,0,202,-46,195,-153v-32,-55,-144,-73,-211,-35v-16,34,-68,54,-53,108v6,25,1,22,-3,39v6,24,41,41,72,41","w":353},"1":{"d":"39,-208v0,-14,6,-59,29,-39v3,4,6,13,10,24r-22,128r8,87v-4,6,-9,3,-16,2v-44,-38,-9,-137,-9,-202","w":93},"2":{"d":"88,-35v47,-10,119,-24,168,-9v0,12,-23,13,-35,16v1,1,3,1,5,1v-74,8,-118,23,-194,23v-14,0,-20,-13,-21,-28v55,-40,83,-61,123,-104v26,-13,65,-67,71,-102v-1,-9,-11,-16,-22,-16v-20,-1,-120,29,-156,49v-10,-2,-30,-20,-10,-28v50,-21,111,-51,178,-48v25,10,44,22,36,39v12,30,-19,64,-34,83v-39,48,-37,39,-115,109v0,5,-3,8,-8,11v4,3,8,4,14,4","w":265},"3":{"d":"188,-282v34,-10,74,25,47,51v-19,32,-55,50,-92,70v28,14,116,25,108,70v8,14,-49,40,-63,48v-29,9,-130,22,-168,42v-6,-5,-19,-7,-12,-22v56,-36,175,-21,210,-76v-9,-20,-88,-42,-97,-33v-20,-1,-41,2,-56,-7r5,-21v56,-25,103,-36,137,-78v1,-1,2,-5,4,-11v-15,-14,-56,7,-79,0v-10,9,-73,22,-92,31v-11,-4,-28,-23,-13,-30v50,-22,96,-26,154,-37v0,-1,8,3,7,3","w":260},"4":{"d":"79,-249v-7,17,-29,75,-33,96v0,6,3,8,8,8v43,-2,111,6,141,-6v17,-47,20,-100,63,-148v9,4,16,7,21,10v-17,31,-44,95,-51,141v7,4,24,-4,23,10v-1,16,-29,12,-31,23v-10,22,-9,69,-7,103v-3,2,-7,5,-10,9v-47,-11,-23,-74,-16,-114v0,-4,-2,-6,-7,-6v-65,2,-89,13,-162,4v-22,-22,-2,-53,5,-76v16,-15,17,-57,35,-70v6,-1,21,11,21,16","w":267},"5":{"d":"185,-272v30,7,45,-8,53,18v1,16,-17,18,-34,14v0,0,-95,-11,-129,1v-6,9,-24,33,-29,54v76,10,171,5,214,47v11,11,22,30,5,52v-14,12,-30,14,-34,27v-26,11,-141,63,-157,60v-16,-2,-25,-19,-4,-27v48,-18,128,-39,170,-86v4,-14,-65,-41,-85,-41r-92,0v-10,-4,-66,-1,-57,-23v0,-23,23,-51,35,-83v11,-28,133,-10,144,-13","w":284},"6":{"d":"70,-64v9,-51,63,-74,123,-71v43,2,109,3,111,41r-25,47v0,1,1,2,2,3v-5,0,-39,10,-41,20v-15,3,-22,4,-22,11v-39,1,-77,20,-119,13v-42,-7,-35,-9,-77,-46v-56,-118,94,-201,176,-229v7,0,21,8,20,15v-2,17,-23,15,-43,24v-69,31,-119,72,-134,145v-5,25,36,68,78,64v59,-6,128,-18,153,-61v-7,-14,-13,-9,-32,-21v-67,-15,-118,-5,-150,43r0,12v-13,4,-17,-3,-20,-10","w":310},"7":{"d":"37,-228v33,-14,173,-17,181,-19v28,-1,24,31,9,45v-17,15,-45,49,-59,69v-17,26,-55,67,-61,113v-10,13,-9,14,-14,20v-33,-13,-20,-25,-11,-53v16,-48,73,-115,109,-156v2,-7,5,-14,-10,-12v-26,4,-54,6,-76,13v-23,-5,-83,31,-94,-9v2,-8,18,-19,26,-11","w":245},"8":{"d":"57,-236v40,-50,166,-51,213,-10v22,28,10,63,-22,78r-35,17v8,5,54,24,53,44v-5,14,-4,33,-18,42v-13,13,-35,18,-44,34v-60,27,-190,49,-194,-42v7,-41,17,-54,59,-70r0,-4v-32,-9,-73,-62,-26,-85v4,0,8,-2,14,-4xm142,-160v24,-2,160,-31,99,-72v-28,-18,-108,-33,-146,-5v-16,12,-28,30,-33,59v24,12,37,20,80,18xm41,-62v30,65,189,6,199,-37v3,-14,-60,-30,-74,-30v-70,0,-118,10,-125,67","w":290},"9":{"d":"11,-192v15,-49,119,-61,161,-23v16,15,27,55,11,79v-20,62,-51,79,-96,118v-10,4,-45,27,-50,6v9,-15,66,-52,98,-99v-7,-7,-8,-3,-25,0v-49,-11,-96,-25,-99,-81xm145,-131v7,-5,13,-34,13,-41v-2,-51,-104,-38,-114,-6v-2,10,37,35,46,35v23,1,43,-1,55,12","w":198},":":{"d":"39,-125v15,-8,40,-1,40,15v0,15,-6,22,-19,22v-13,0,-29,-21,-21,-37xm66,-17v-8,27,-51,19,-46,-8v-1,-6,8,-22,14,-20v29,0,30,6,32,28","w":95},";":{"d":"56,-93v2,-30,37,-22,40,2v0,2,-1,7,-3,15v-13,8,-15,6,-27,4xm64,-44v11,-11,30,-4,32,14v-21,39,-63,71,-92,85v-5,0,-11,-2,-18,-8v11,-23,36,-36,50,-61v11,-7,19,-20,28,-30","w":107},"<":{"d":"166,-202v12,0,29,15,24,29v0,4,-119,64,-120,73v15,21,89,64,91,86v2,29,-18,12,-30,15v-27,-29,-59,-54,-95,-75v-18,-10,-25,-13,-24,-41","w":176},"=":{"d":"125,-121v18,7,55,-9,69,14v0,17,-45,26,-135,26v-18,0,-27,-7,-27,-21v-1,-37,60,-5,93,-19xm138,-71v20,0,48,-1,50,16v-13,24,-86,32,-131,29v-29,-2,-43,-10,-43,-24v-7,-23,36,-14,39,-17v27,6,57,-4,85,-4","w":196},">":{"d":"4,-14v20,-48,77,-59,118,-94v-16,-19,-58,-52,-81,-75v-11,-7,-15,-38,-1,-40v33,16,83,71,121,105v26,23,-6,35,-41,53v-29,16,-56,28,-73,54v-21,15,-16,20,-34,15v-3,0,-9,-16,-9,-18","w":174},"?":{"d":"105,-291v57,-13,107,-4,107,39v0,67,-136,85,-155,137v-1,6,10,23,-4,23v-23,1,-33,-35,-23,-57v31,-41,124,-60,149,-103v-8,-21,-72,-5,-88,-1v-23,6,-59,39,-71,8v0,0,-1,0,1,-17v10,-4,45,-20,84,-29xm80,-25v-6,4,-8,39,-24,22v-24,3,-22,-21,-13,-35v17,-7,29,5,37,13","w":216},"@":{"d":"218,-207v23,8,42,14,47,37v44,68,-27,137,-87,85r1,0v0,2,-59,19,-61,17v-35,0,-42,-47,-17,-68r0,-4v-19,-1,-45,37,-49,40v-37,76,58,72,121,62v11,-2,34,-13,36,3v-14,31,-69,31,-114,33v-51,2,-99,-41,-80,-92v2,-30,22,-40,42,-63v35,-20,91,-53,161,-50xm217,-101v23,0,35,-19,35,-41v0,-43,-75,-41,-102,-19v36,3,55,16,62,41v-6,5,-6,19,5,19xm127,-110v8,5,51,-15,28,-16v-4,0,-25,4,-28,16","w":291},"A":{"d":"97,-81v-23,-10,-39,38,-52,60v-8,6,-8,6,-22,18v-22,-7,-23,-37,-4,-49v7,-8,11,-15,15,-23r-1,1v-14,-26,23,-29,31,-40v1,-1,15,-29,26,-36v17,-31,39,-58,54,-92v16,-20,20,-51,41,-66v29,5,34,62,45,92v9,64,21,103,49,155v-3,25,-44,11,-54,0v-34,-12,-97,-29,-128,-20xm107,-118v20,6,80,10,111,17v6,-7,-4,-15,-7,-24v-11,-28,-9,-92,-30,-117v-9,9,-19,44,-34,55v-9,23,-27,40,-40,69","w":294},"B":{"d":"256,-179v41,10,115,34,91,91v-6,3,-14,12,-19,20v-37,19,-50,34,-63,25v-9,10,-12,11,-34,13r3,-3v-4,-4,-12,-4,-18,0v0,0,2,2,5,4v-21,14,-26,6,-44,15v-4,0,-7,-2,-8,-5v-6,11,-20,-5,-18,11v-36,4,-91,35,-114,4v-7,-62,-10,-138,4,-199v-1,-19,-37,2,-37,-27v0,-8,2,-13,6,-15v68,-31,231,-92,311,-39v8,12,12,20,12,25v-8,42,-32,49,-77,80xm79,-160v72,-17,135,-39,184,-70v20,-13,31,-23,31,-27v1,-6,-30,-13,-38,-12v-54,0,-116,13,-186,41v11,21,1,48,9,68xm262,-43v0,-4,3,-6,-4,-5v0,1,1,2,4,5xm211,-140v-34,7,-94,24,-139,15v-6,20,-4,56,-4,82v0,29,43,1,56,2v48,-11,108,-25,154,-48v20,-10,32,-17,32,-25v0,-18,-33,-26,-99,-26xm195,-20v6,1,6,-2,5,-7v-3,2,-7,2,-5,7","w":364},"C":{"d":"51,-114v-12,75,96,76,166,71r145,-10v9,2,9,5,9,18v-37,18,-85,28,-109,22v-18,10,-47,10,-71,10v-29,0,-68,1,-105,-11v-6,-1,-10,-3,-10,-8v-33,-13,-48,-33,-66,-59v-19,-114,146,-150,224,-177v35,0,88,-31,99,7v-1,29,-49,14,-76,28v-55,8,-115,35,-175,71v-13,8,-23,21,-31,38","w":376},"D":{"d":"312,-78v-2,1,-3,7,-10,5v6,-3,10,-4,10,-5xm4,-252v2,-27,83,-38,106,-39v130,-7,267,1,291,109v0,0,-2,8,-3,25v-5,9,-4,28,-23,34v-4,4,-2,5,-7,0v-3,3,-15,7,-5,10v0,0,-10,14,-13,2v-11,1,-8,5,-20,14v1,2,7,3,9,1v-4,13,-22,13,-11,4v0,-3,1,-6,-3,-5v-40,29,-103,38,-141,65v10,6,22,-7,34,-3v-41,20,-127,44,-171,46v-21,1,-47,-33,-11,-39v15,-2,43,-6,56,-11v-16,-101,-5,-130,9,-207v2,0,4,-1,6,-3v-16,-17,-91,38,-103,-3xm297,-69v-7,3,-17,8,-25,7v1,1,3,2,5,2v-4,2,-11,5,-23,9v4,-11,30,-21,43,-18xm240,-51v10,0,12,2,0,6r0,-6xm220,-36v-1,-3,4,-6,6,-3v0,1,-2,1,-6,3xm125,-48v16,6,137,-46,155,-53v29,-18,101,-44,82,-93v-21,-53,-84,-61,-168,-67v-20,7,-50,3,-77,8v33,54,-12,132,8,205xm159,-22v-4,-1,-15,-5,-15,2v7,-1,12,-2,15,-2","w":381},"E":{"d":"45,-219v-19,-36,34,-41,63,-36v44,-10,133,-8,194,-15v3,2,38,11,52,15v-73,19,-171,21,-246,38v-9,11,-16,32,-20,61v35,11,133,-6,183,3v1,6,2,7,3,14v-46,24,-118,16,-193,27v-15,13,-22,52,-22,66v60,1,121,-20,188,-20v22,10,53,-7,74,5v16,29,-23,26,-43,32v-73,4,-139,13,-216,27r-52,-10v-4,-22,23,-69,26,-98v-3,0,-10,-15,-12,-24v20,-12,34,-23,35,-67v2,-1,5,-5,5,-7v0,-4,-14,-11,-19,-11","w":353},"F":{"d":"270,-258v13,2,59,6,48,34v-78,-3,-143,1,-212,22v-10,16,-21,43,-24,69r145,-9v8,3,29,-3,16,21v-14,-1,-59,13,-60,7v-12,13,-67,18,-108,21v-2,1,-4,3,-7,6v-2,23,-8,43,-7,69v1,28,-30,11,-40,5r10,-80r-26,-14v5,-10,10,-33,28,-25v21,-3,15,-46,26,-59v-1,-3,-32,-13,-28,-24v2,-22,45,-16,59,-30v47,4,99,-14,151,-9v5,-3,25,-3,29,-4","w":236},"G":{"d":"311,-168v53,0,94,57,74,110v-31,37,-71,34,-136,52v-13,-7,-41,10,-57,7v-73,-1,-122,-17,-162,-59v-49,-51,-24,-80,5,-130v35,-61,138,-93,214,-106v16,4,42,-1,40,21v-5,40,-39,2,-73,21v-76,19,-162,65,-177,142v28,103,237,76,312,29v2,-3,3,-7,3,-13v-10,-35,-37,-43,-87,-45v-16,-13,-53,-9,-78,1v-4,-3,-5,-7,-5,-11v17,-29,73,-17,108,-24v12,4,18,5,19,5","w":391},"H":{"d":"300,-268v18,12,19,32,4,51v-35,44,-34,140,-46,217v-1,5,-5,13,-11,12v-6,1,-19,-14,-18,-27r7,-106v-28,7,-76,22,-116,14v-18,2,-36,6,-55,3v-43,-8,-14,53,-33,75v-29,1,-26,-67,-21,-97v5,-31,28,-73,43,-98v2,2,7,3,14,3v13,33,-11,48,-13,78v61,4,118,2,176,2v8,0,13,-6,15,-20v4,-47,21,-87,54,-107","w":288},"I":{"d":"63,-266v34,10,-4,105,-8,128r-24,126v-2,2,-3,1,-9,6v-12,-10,-12,-15,-12,-47v0,-93,9,-156,28,-188v10,-17,19,-25,25,-25","w":79},"J":{"d":"235,-291v26,11,31,104,31,142v0,37,-2,95,-32,126v-33,34,-121,26,-167,1v-18,-11,-54,-29,-59,-59v0,-3,5,-15,16,-14v31,36,90,57,162,51v63,-30,56,-148,32,-226v-1,-16,11,-13,17,-21","w":282},"K":{"d":"212,-219v17,-5,80,-60,80,-19v0,9,-2,14,-5,16r-132,78v-34,23,-54,32,-21,50v39,21,74,23,124,41v5,2,7,5,7,9v-4,24,-55,15,-79,8v-67,-19,-98,-36,-116,-83v9,-24,38,-35,66,-61v7,-4,49,-30,76,-39xm47,-194v11,-20,11,-45,31,-55v2,2,4,3,6,0v29,39,-21,96,-18,128v-17,24,-15,62,-29,113v-4,3,-10,7,-19,11v-12,-13,-10,-28,-8,-53v3,-31,17,-79,37,-144","w":270},"L":{"d":"84,-43v58,0,179,-27,242,-4v3,17,-29,24,-40,26v-85,-4,-202,46,-268,3v-24,-16,-2,-33,-4,-57v26,-76,38,-108,86,-191v14,-7,26,-50,45,-32v6,22,5,31,-12,46v-20,39,-50,82,-67,142v-7,6,-19,46,-19,54v0,9,12,13,37,13","w":331},"M":{"d":"174,-236v-1,52,-11,92,-7,143v10,5,15,-12,22,-18v42,-55,90,-130,136,-174r15,-18v42,2,32,53,11,80v-12,58,-54,143,-34,210v0,3,-3,12,-9,10v-31,-5,-32,-57,-27,-92v4,-27,12,-58,25,-93v-5,-10,5,-19,6,-30v-46,44,-66,110,-129,172v-11,10,-18,15,-22,15v-34,6,-28,-103,-28,-152v-28,22,-65,119,-96,170v-9,15,-34,3,-31,-19v30,-64,91,-177,139,-229v12,-1,29,13,29,25","w":343},"N":{"d":"248,-20v-3,17,-37,18,-43,3v-24,-35,-53,-145,-80,-203v-32,40,-55,120,-92,174v-13,3,-26,-13,-27,-22r87,-171v4,-13,20,-57,42,-32v42,48,46,139,82,198v29,-45,46,-88,65,-153v12,-19,23,-42,38,-60v27,-1,14,18,4,44v-6,46,-32,68,-37,121v-15,29,-33,69,-39,101","w":307},"O":{"d":"240,-268v85,1,163,29,150,125v13,7,-12,18,-5,26v-23,63,-133,112,-228,124v-80,-16,-171,-56,-148,-153v11,-47,20,-43,53,-83v17,-9,39,-22,73,-29v45,-10,81,-10,105,-10xm363,-156v16,-51,-62,-85,-111,-79v-25,-11,-50,8,-81,0v-15,10,-70,16,-85,31v6,20,-27,24,-39,45v-42,75,40,128,115,128v56,0,209,-71,201,-125","w":383},"P":{"d":"70,-225v-7,-12,-36,16,-49,19v-4,0,-9,-5,-14,-17v21,-47,114,-55,172,-59v41,-3,132,33,99,87v-21,34,-72,59,-144,80v-2,16,-79,3,-74,46v3,25,-5,47,-10,68v-22,-1,-23,-29,-22,-56v2,-25,-20,-32,-8,-50v21,-5,10,-35,25,-57v6,-28,14,-48,25,-61xm71,-229v47,14,-2,50,-1,99v41,-3,113,-37,173,-76v5,-9,8,-14,8,-15v-28,-47,-125,-29,-180,-8","w":252},"Q":{"d":"374,-217v20,59,-11,127,-48,156r30,38v-1,6,-8,16,-14,9v-3,0,-19,-9,-47,-26v-72,35,-173,75,-236,12v-70,-40,-67,-213,26,-217r8,5v24,-20,72,-48,112,-38v21,-4,22,-1,50,-2v66,-2,94,20,119,63xm296,-88v13,5,61,-49,63,-84v4,-62,-54,-78,-119,-76v-14,-6,-49,5,-71,3v-42,16,-89,41,-93,94v-9,11,1,25,-7,38v-12,-19,-7,-67,-1,-88v-56,30,-37,137,19,155v27,17,92,19,119,0v12,-2,29,-9,52,-20v2,-2,3,-3,3,-6v-11,-12,-46,-27,-54,-56v0,-13,3,-19,9,-19v18,1,60,52,80,59","w":379},"R":{"d":"100,-275v96,-23,196,-10,208,78v-3,18,-17,52,-49,62v-14,20,-54,23,-79,40v-2,0,-14,2,-36,6v-40,8,-30,14,-3,33v37,27,52,30,118,55v16,6,31,23,12,27v-58,-2,-104,-29,-143,-61v-14,-3,-16,-15,-39,-27v-23,-19,-28,-12,-15,-38v63,-19,111,-15,163,-53v27,-20,43,-36,43,-49v0,-64,-120,-62,-173,-38v-9,4,-38,9,-40,18v-10,32,-16,70,-13,116v-10,21,-8,47,-6,75v2,31,-9,29,-27,22v-9,-55,5,-140,15,-190v-8,-6,-24,10,-24,-11v0,-34,16,-34,42,-55v2,-1,17,-4,46,-10","w":297},"S":{"d":"13,-3v-7,-3,-22,-18,-5,-22v68,-15,119,-32,154,-45v51,-19,39,-34,3,-53v-46,-25,-82,-30,-121,-64v-33,-29,-50,-35,-25,-58v37,-20,119,-29,181,-29v29,0,44,6,44,18v-9,26,-62,6,-104,14v-17,2,-72,6,-92,16v37,53,132,58,180,111v8,9,11,20,11,30v-4,17,-23,35,-42,34v-21,16,-17,1,-49,17v-14,7,-41,9,-56,20v-25,-3,-49,10,-79,11","w":234},"T":{"d":"141,-3v-36,-6,1,-49,-3,-79v10,-19,6,-35,15,-64r26,-85v-51,-9,-100,10,-141,14v-16,2,-30,-26,-11,-32v26,-8,143,-8,179,-19r12,6v67,-2,142,-1,200,-1v8,0,14,3,19,10v-18,16,-74,3,-103,14v-48,-4,-60,4,-113,7v-42,22,-36,130,-58,187v1,12,-9,44,-22,42","w":277},"U":{"d":"365,-262v13,56,-22,104,-36,141v-19,22,-30,38,-57,56v-4,18,-60,35,-78,50v-53,28,-142,0,-161,-34v-31,-56,-37,-108,-11,-164v17,-33,29,-50,48,-29v-2,2,-3,7,-4,13v-44,36,-38,149,7,174v30,26,55,19,102,4v56,-17,66,-34,120,-76v12,-24,56,-68,46,-122r0,-16v0,1,-1,3,-1,6v4,-13,11,-10,25,-3","w":368},"V":{"d":"246,-258v21,-22,31,-26,44,-8v1,1,-12,22,-28,35v-15,25,-41,38,-56,69v-13,15,-20,31,-28,57v-15,13,-11,29,-27,72v3,21,-5,24,-27,27v-33,-45,-54,-118,-84,-167v-5,-26,-18,-50,-25,-76v-3,-12,24,-8,29,-5v8,13,18,52,26,70r52,115v9,-2,4,-9,10,-21r25,-47v25,-44,46,-76,89,-121","w":234},"W":{"d":"31,-213v16,46,17,106,41,151v31,-35,49,-89,76,-127v30,-15,39,27,52,56v10,22,21,48,35,67v2,0,4,-1,5,-3v16,-28,50,-76,79,-121v14,-21,40,-63,64,-83r5,8v-30,58,-76,110,-97,173v-18,28,-25,37,-33,63v-11,1,-16,25,-30,15v-21,-31,-44,-89,-62,-131v0,-2,-1,-3,-5,-5v-17,11,-16,36,-31,50v-20,33,-20,84,-68,94v-24,-19,-23,-81,-39,-111v-1,-15,-29,-94,-10,-108v9,2,12,5,18,12","w":331},"X":{"d":"143,-183v43,-25,69,-36,126,-62v22,-10,86,-10,56,21v-51,3,-158,61,-154,64v10,15,41,30,50,52v27,17,46,60,70,82v9,14,-6,30,-24,20v-35,-43,-75,-100,-116,-132v-48,13,-100,47,-118,94v-1,49,-26,34,-27,4v-1,-26,13,-27,17,-48v22,-27,68,-55,90,-77v-9,-12,-60,-39,-79,-57v-6,-10,-6,-25,12,-25","w":312},"Y":{"d":"216,-240v19,-14,42,10,22,26v-54,66,-121,109,-156,197v-8,21,-11,15,-30,4v3,-37,27,-61,33,-76v12,-12,15,-19,32,-42v-8,-6,-40,5,-45,5v-48,-6,-69,-65,-56,-113v14,0,13,-1,24,7v2,33,12,75,42,73v36,-2,102,-57,134,-81","w":189},"Z":{"d":"60,-255v66,12,200,-34,240,21v-13,42,-63,62,-98,89v-19,15,-47,33,-82,55v-25,16,-47,32,-66,47v58,24,129,-6,208,-6v23,0,36,12,13,19v-33,2,-53,5,-86,10v-32,18,-88,15,-135,15v-9,-1,-55,-1,-48,-29v1,-24,30,-24,40,-41v64,-50,151,-86,208,-147v-38,-17,-155,12,-198,-4v0,0,-11,-33,4,-29","w":310},"[":{"d":"72,-258r-15,250v30,4,55,-3,80,-6v7,-1,8,17,9,23v-28,15,-73,23,-121,21v-7,0,-10,-6,-10,-17v0,-60,25,-193,22,-288v0,-16,13,-20,33,-19v9,-3,34,-12,51,-12v16,0,15,16,19,29v-16,7,-48,10,-68,19","w":151},"\\":{"d":"21,38v-20,-21,9,-72,13,-90v44,-78,113,-189,200,-253v2,0,5,4,7,12v11,31,-13,36,-24,58v-74,61,-174,219,-180,273r-16,0","w":257},"]":{"d":"133,-258v-23,-13,-84,6,-85,-32v0,-10,5,-15,14,-15v0,0,30,2,90,7v10,1,15,13,15,36v2,7,-8,59,-13,112r-11,125v-9,48,9,90,-59,71v-20,-4,-39,-1,-59,-4v-5,-10,-25,-12,-14,-30v8,-3,61,-13,78,-8v14,1,8,-7,10,-17v15,-69,21,-166,34,-245","w":171},"^":{"d":"68,-306v20,15,47,36,58,60v-1,4,0,7,-9,7v-26,0,-47,-38,-49,-32v-15,9,-41,50,-54,30v-2,-31,17,-23,33,-51v8,-9,15,-14,21,-14","w":135},"_":{"d":"11,15v-8,33,18,45,50,34r205,2r197,-5v11,-5,14,-9,7,-28v-95,-21,-258,-10,-376,-10v-25,0,-72,-3,-83,7","w":485},"`":{"d":"75,-264v16,8,56,14,39,43v-30,-8,-65,-23,-105,-44v-1,-3,-3,-28,5,-25v16,5,44,17,61,26","w":129},"a":{"d":"124,-56v10,4,59,41,65,50v1,7,-6,17,-12,17r-60,-30v-22,2,-42,21,-65,19v-33,4,-68,-67,-15,-81v41,-27,96,-39,110,9v0,6,-4,12,-11,16v-33,-25,-67,-5,-88,12v10,16,61,-18,76,-12","w":196},"b":{"d":"80,-140v69,1,123,0,134,52v5,26,-71,71,-97,70v-11,11,-88,22,-94,22v-11,-3,-26,-18,-6,-24v19,-5,-2,-19,-1,-35v1,-18,11,-36,-5,-47v-6,-17,-6,-21,14,-32v6,-45,18,-89,28,-124v2,-7,8,-12,17,-15v5,3,10,11,16,28v-12,27,-13,63,-23,96v0,6,6,9,17,9xm87,-107v-40,-9,-31,31,-39,54v8,15,0,25,12,22v30,-8,60,-18,88,-32v39,-18,49,-33,-1,-42v-20,-4,-45,-7,-60,-2","w":217},"c":{"d":"128,-123v29,-7,37,29,12,33v-27,-4,-40,6,-79,25v-8,4,-13,11,-16,22v30,32,91,3,134,11v5,13,-8,26,-22,19v-51,25,-139,28,-150,-30v6,-50,69,-82,121,-80","w":194},"d":{"d":"224,-201v0,-35,-17,-111,24,-94v7,86,-2,119,0,197v-4,2,-8,21,-18,16v-62,-7,-154,-8,-185,29v6,17,28,26,51,26v16,0,100,-15,132,-18v7,5,-6,20,-10,22v-24,8,-122,42,-163,25v-32,-5,-62,-53,-36,-80v35,-37,118,-46,198,-43v1,-22,7,-49,7,-80","w":265},"e":{"d":"4,-57v0,-58,51,-71,110,-74v33,-1,45,16,59,35v1,14,2,39,-7,42v-24,-2,-73,13,-99,11v-2,2,-2,3,-2,3v0,3,12,8,37,15v21,0,69,9,31,22v-9,14,-34,6,-56,6v-27,-5,-73,-28,-73,-60xm123,-102v-22,2,-68,5,-65,26v24,-2,66,5,79,-6v-5,-13,-1,-13,-14,-20","w":182},"f":{"d":"6,-59v6,-29,53,-4,53,-43v0,-64,29,-118,84,-150v45,-25,167,-24,155,51v-1,2,-7,6,0,6r-10,2v-45,-58,-165,-39,-186,39v-7,26,-11,42,-9,62v44,8,95,-21,135,-7v-12,25,-39,21,-76,30v-19,5,-18,7,-54,19v-2,8,15,32,17,35v-6,25,-26,26,-40,-5r-15,-24v-41,10,-44,12,-54,-15","w":234},"g":{"d":"132,-97v30,27,21,75,30,117v-12,31,-11,66,-36,103v-32,46,-105,83,-167,39v-31,-21,-49,-29,-51,-75v-2,-37,77,-50,121,-57v37,-6,68,-10,95,-11v7,-6,3,-32,4,-46v0,0,-1,1,-1,2v0,-18,-5,-31,-14,-45v-44,5,-79,20,-94,-18v3,-54,73,-54,125,-50v12,7,12,13,4,25v-30,-11,-76,8,-90,20v23,3,50,-16,74,-4xm-34,121v60,53,168,1,159,-86v-47,-7,-93,24,-142,30v-12,7,-45,19,-42,29v0,10,8,19,25,27","w":188},"h":{"d":"100,-310v11,-2,10,19,11,20v-11,52,-40,133,-53,189v-6,30,-9,37,-9,47v27,0,113,-34,143,-34v42,0,31,47,39,79v0,4,-5,17,-16,16v4,2,11,3,4,6v-24,-1,-28,-34,-25,-64v-1,-1,-2,-3,-5,-5v-51,0,-110,38,-162,51v-9,1,-15,-15,-16,-23v17,-89,39,-141,71,-264v0,-9,6,-19,18,-18","w":251},"i":{"d":"62,-209v7,18,9,23,-5,38v-23,-6,-21,-18,-11,-36v2,0,8,-1,16,-2xm34,-7v-18,-21,-8,-73,-1,-106v7,-10,20,-8,23,6v-1,36,7,72,-2,104v-8,2,-8,0,-20,-4","w":80},"j":{"d":"88,-191v5,28,-18,40,-28,21v0,-20,12,-29,28,-21xm82,-99v28,-1,16,35,16,61v0,60,-19,150,-35,202v-12,8,-19,31,-35,16v-32,-7,-43,-19,-56,-44r2,-17v11,4,49,45,61,18v10,-55,27,-107,30,-171v0,-16,0,-59,17,-65","w":120},"k":{"d":"59,-66v33,26,114,37,155,62v8,-4,22,-2,19,-17v0,-4,-12,-11,-30,-24v-36,-25,-54,-22,-99,-33v14,-21,119,-13,103,-63r-16,-7r-123,47r25,-93v-3,-15,16,-49,18,-81v1,-15,-21,-14,-25,-3v-31,82,-49,168,-75,257v2,2,22,30,27,10v2,-5,4,-9,9,-11v4,-16,4,-15,12,-44","w":236},"l":{"d":"66,-300v21,-6,37,23,30,55v-10,51,-28,135,-28,208v0,11,6,36,-13,37v-29,-5,-30,-48,-25,-83r28,-177v-6,-17,1,-29,8,-40","w":102},"m":{"d":"348,-59v-2,21,0,57,3,73v-17,3,-30,-1,-32,-16v-8,-7,-5,-44,-13,-70v-35,3,-82,49,-111,70v-12,8,-40,4,-39,-15r2,-56v-1,-13,4,-28,-8,-29v-35,8,-79,72,-115,87v-6,2,-20,-18,-21,-22v1,-20,14,-105,39,-64r8,15v17,-14,72,-56,93,-54v27,3,49,40,43,80v24,-2,66,-55,124,-53v11,14,28,23,27,54","w":368},"n":{"d":"121,-136v37,6,62,54,62,111v0,32,-16,25,-31,17v-18,-30,-5,-45,-22,-85v-37,-13,-71,55,-92,65v-20,-3,-39,-39,-21,-62v2,-12,3,-15,11,-30v12,-8,20,11,29,12","w":194},"o":{"d":"108,-139v52,-24,104,18,104,63v0,59,-66,67,-114,83v-52,-2,-115,-50,-80,-105v23,-18,52,-35,90,-41xm45,-60v16,54,125,16,131,-23v-12,-59,-129,-8,-131,23","w":217},"p":{"d":"82,14v-10,12,-8,117,-24,142v-15,2,-19,0,-29,-13v0,-76,9,-113,22,-192v14,-27,35,-6,37,13v0,8,-3,21,-7,38v2,2,3,2,4,2v26,-9,116,-33,126,-72v-7,-17,-24,-33,-49,-31v-40,3,-116,13,-116,47v-5,7,-2,17,-16,20v-17,-12,-18,-20,-12,-38v8,-25,74,-61,110,-59v55,-15,113,15,118,70v-15,52,-84,79,-146,83v-5,0,-11,-4,-18,-10","w":251},"q":{"d":"144,-147v27,-8,89,-3,97,31v-9,29,-42,-4,-73,1v-32,6,-118,20,-111,49v0,7,13,13,21,13v21,0,78,-24,104,-34v2,0,9,8,22,21v1,1,1,2,1,5v-27,90,-22,70,-43,203v11,15,-15,54,-33,33v-6,-8,-10,-20,-3,-28v1,-72,5,-114,15,-172v-35,3,-35,10,-59,8v-41,-4,-98,-41,-56,-85v33,-34,59,-27,118,-45","w":248},"r":{"d":"242,-117v2,22,5,10,-14,23v-73,-7,-166,-23,-174,56v-8,6,-3,20,-8,36v-29,10,-40,-9,-33,-46v6,-31,7,-69,32,-55v58,-37,66,-42,175,-19v3,5,15,4,22,5","w":229},"s":{"d":"154,-151v19,1,27,24,13,32v-4,1,-22,4,-53,7v-16,8,-22,-2,-39,9v23,21,89,16,96,62v-13,24,-85,35,-124,42v-9,-3,-18,-3,-27,0v-6,-4,-21,-16,-8,-25v30,-6,83,-13,102,-24v-17,-16,-80,-33,-97,-48v-3,-2,-4,-7,-4,-15v-6,-6,3,-13,15,-18v22,-9,94,-23,126,-22","w":188},"t":{"d":"85,-150v10,-41,35,-126,65,-134v4,1,24,19,11,36v-17,22,-29,57,-36,104v26,8,50,-7,73,5v14,0,22,3,22,9v-1,19,-44,18,-57,23v-10,1,-46,0,-54,10v-10,24,-4,67,-20,98v-21,-3,-26,1,-26,-20v0,-9,2,-36,8,-81v-15,-13,-81,9,-77,-27v4,-38,71,6,91,-23","w":194},"u":{"d":"207,-136v-1,-2,11,-14,14,-13v6,0,10,7,10,22v-3,40,-23,56,-40,82v-13,19,-62,43,-93,43v-67,-2,-111,-75,-71,-133v26,-3,21,29,19,49v-1,27,26,44,57,42v41,-2,93,-55,104,-92","w":242},"v":{"d":"24,-127r52,71v42,-16,70,-54,124,-65v5,4,8,7,8,11v-8,19,-4,8,-33,32v0,1,-1,3,-1,5v-61,45,-93,68,-97,68v-40,-15,-50,-72,-68,-100v6,-14,10,-22,15,-22","w":214},"w":{"d":"15,-139v38,-2,27,57,45,86v30,2,67,-66,101,-78v26,6,36,69,60,78v47,-35,51,-54,119,-104v3,0,7,-2,15,-4v19,23,-9,28,-21,49v-33,28,-68,90,-107,109v-10,6,-52,-47,-72,-71v-20,17,-85,74,-97,73v-38,7,-41,-98,-52,-122v0,-1,3,-7,9,-16","w":325},"x":{"d":"95,-124v22,-13,78,-32,99,-31v16,0,23,6,23,18v0,22,-17,11,-49,21v-3,0,-45,20,-42,24v0,1,2,4,8,10v20,24,49,41,44,80v-35,3,-27,-9,-60,-44v-40,-43,-37,-26,-79,9v-1,1,-2,3,-3,8v-12,8,-28,10,-27,-11v-6,-8,45,-65,48,-65v-17,-21,-61,-52,-24,-68v9,0,48,37,62,49","w":223},"y":{"d":"44,-65v22,33,70,4,99,-8v5,-4,28,-15,41,-31r17,0v25,47,-26,70,-40,114v-5,4,-9,8,-10,21v-16,12,-11,33,-27,51v-5,18,-12,43,-23,71v-1,-1,-2,34,-18,29v-12,1,-22,-12,-22,-23v20,-70,24,-65,68,-177v-47,16,-111,8,-116,-39v-11,-13,-7,-62,8,-62v18,0,22,26,23,54","w":216},"z":{"d":"189,-43v9,-1,46,-6,41,12v0,7,-5,13,-15,14v-45,6,-148,24,-181,13v0,-3,-5,-8,-14,-15v5,-44,66,-46,90,-85v-15,-18,-84,21,-84,-14v0,-10,5,-17,14,-18v33,-3,79,-13,109,-3v4,-2,14,11,12,15v0,23,-26,51,-78,84v28,10,73,-3,106,-3","w":244},"{":{"d":"94,-303v27,-9,90,-14,79,26v-20,17,-55,-5,-87,13v-4,1,-6,4,-6,8v33,42,31,44,7,85v-6,10,-13,16,-13,13v5,6,17,17,15,31r-33,78v7,35,28,49,57,63r49,0v7,42,-51,41,-86,20v-43,-13,-51,-51,-56,-89v-2,-25,25,-54,27,-71v-3,-4,-46,-5,-41,-21v2,-10,-3,-29,11,-25v2,0,51,-17,52,-38v4,-3,-25,-23,-25,-49v0,-41,8,-30,50,-44","w":179},"|":{"d":"30,-308v26,5,14,50,15,80v5,78,-8,153,-3,225v-2,15,-1,31,-11,36v-8,-3,-25,-22,-25,-32r9,-183v0,-40,0,-78,1,-112v0,-4,9,-15,14,-14","w":63},"}":{"d":"47,-298v34,-17,118,-18,112,36v6,25,-76,98,-69,103v4,16,39,7,44,28v7,34,-34,17,-37,39v8,29,49,83,23,123v-15,23,-43,26,-73,46v-34,8,-43,11,-49,-17v1,-15,30,-15,33,-20v24,-12,70,-27,55,-61v-14,-33,-37,-68,-19,-103v-46,-50,46,-100,60,-141v-10,-16,-68,6,-77,-12","w":143},"~":{"d":"7,-254v2,-6,59,-50,67,-46v11,-1,35,19,46,26v5,0,27,-10,66,-31v21,8,-1,25,-7,38v-27,21,-48,31,-65,31v-24,-11,-37,-39,-65,-9v-7,7,-26,36,-42,11v3,-5,-3,-17,0,-20","w":199},"\u00c4":{"d":"161,-217v20,53,23,124,54,170v-2,20,-34,9,-42,0v-27,-12,-78,-18,-101,-18v-26,6,-29,51,-54,63v-18,-4,-19,-30,-3,-38v5,-9,15,-16,8,-29v1,-12,23,-9,26,-19v6,-10,11,-20,20,-27r70,-121v12,-4,16,4,22,19xm82,-91v17,3,62,7,86,13v-13,-33,-13,-80,-29,-109v-15,30,-38,63,-57,96xm187,-259v0,8,-4,13,-12,13v-18,0,-21,-20,-16,-34v18,-1,28,2,28,21xm90,-284v7,3,28,11,28,18v0,9,-9,18,-18,17v-17,0,-25,-24,-10,-35"},"\u00c5":{"d":"161,-217v20,53,23,124,54,170v-2,20,-34,9,-42,0v-27,-12,-78,-18,-101,-18v-26,6,-29,51,-54,63v-18,-4,-19,-30,-3,-38v5,-9,15,-16,8,-29v1,-12,23,-9,26,-19v6,-10,11,-20,20,-27r70,-121v12,-4,16,4,22,19xm82,-91v17,3,62,7,86,13v-13,-33,-13,-80,-29,-109v-15,30,-38,63,-57,96xm112,-239v-31,-17,-9,-61,29,-56v12,2,22,3,33,12v24,39,-30,62,-62,44xm119,-262v2,14,41,8,41,-4v0,-4,-8,-6,-24,-9v-10,-2,-17,10,-17,13"},"\u00c7":{"d":"48,-108v-12,70,90,71,159,67r138,-9v9,-1,7,9,7,17v-37,16,-80,27,-103,21v-14,9,-40,3,-67,9v-30,0,-64,1,-100,-10v-6,-1,-10,-4,-10,-8v-32,-12,-46,-31,-63,-56v-16,-61,47,-103,83,-121v82,-42,118,-45,200,-60v21,-4,36,34,11,37v-90,11,-148,31,-225,77v-12,8,-23,20,-30,36xm172,18v29,4,47,14,53,35v-2,7,-14,31,-27,31v-28,7,-55,9,-84,14v-18,-5,-13,-32,7,-32v21,0,55,-5,69,-13v-16,-14,-63,10,-50,-35v9,-10,1,-27,23,-29v7,8,11,16,9,29","w":331},"\u00c9":{"d":"49,-160v1,-4,-10,-9,-15,-8v-15,-35,32,-30,57,-31r142,-8v2,1,30,7,40,10v-52,16,-133,17,-190,30v-7,9,-12,24,-15,47v26,10,102,-6,141,3v1,3,1,6,2,10v-36,18,-92,12,-149,21v-11,9,-16,41,-16,51v55,-1,111,-21,168,-13v15,-8,48,1,31,18v-53,16,-130,13,-198,29r-39,-8v-4,-19,17,-53,20,-76v-1,0,-7,-11,-9,-18v18,-7,22,-28,30,-57xm133,-248v27,-11,48,-32,59,-14v3,11,-79,52,-88,53v-14,1,-16,-11,-12,-21v10,-4,23,-11,41,-18","w":252},"\u00d1":{"d":"224,-182v1,-17,15,-24,22,-38v20,0,13,10,3,33v-3,36,-25,52,-28,94v-10,24,-30,55,-29,82r-19,7v-32,-8,-36,-70,-58,-111v-2,-23,-7,-27,-19,-54v-28,36,-41,93,-71,133v-9,5,-20,-9,-20,-17r73,-149v9,-24,31,-5,36,7v19,41,31,98,53,139v22,-35,34,-69,50,-118v2,-3,3,-3,7,-8xm203,-257v22,-8,41,-24,65,-26v3,11,-8,9,-7,21v-26,20,-46,31,-59,31v-2,3,-49,-27,-49,-29v-11,0,-32,31,-46,32v-11,-2,-12,-21,-4,-23v4,-6,28,-30,48,-34v17,-4,43,28,52,28","w":219},"\u00d6":{"d":"62,-184v78,-31,249,-50,238,74v-6,65,-102,105,-179,115v-77,-7,-152,-71,-101,-149v2,-5,24,-33,42,-40xm279,-120v14,-38,-47,-64,-85,-61v-20,-9,-41,7,-62,0v-11,7,-54,12,-66,24v0,20,-51,35,-38,66v-1,43,50,67,96,67v44,0,162,-55,155,-96xm197,-229v0,8,-4,13,-12,13v-17,0,-19,-19,-16,-34v18,-1,29,1,28,21xm101,-254v7,3,28,9,27,18v1,8,-8,17,-17,17v-18,0,-26,-24,-10,-35","w":273},"\u00dc":{"d":"281,-202v6,67,-30,121,-71,152v-3,14,-47,26,-60,39v-41,20,-110,1,-125,-26v-24,-44,-28,-84,-8,-127v12,-26,23,-38,37,-22v-2,2,-3,5,-3,10v-34,26,-29,116,5,134v22,32,86,-1,109,-8v38,-28,104,-64,97,-149v2,-10,7,-8,19,-3xm197,-227v0,8,-4,13,-12,13v-18,0,-21,-20,-16,-34v18,-1,28,2,28,21xm101,-252v7,3,27,10,27,18v0,8,-9,18,-18,17v-18,-1,-24,-25,-9,-35","w":262},"\u00e1":{"d":"118,-53v10,4,55,41,62,47v0,7,-5,16,-12,16r-57,-28v-20,3,-40,19,-61,18v-10,2,-43,-17,-42,-36v0,-14,7,-40,27,-41v39,-26,92,-36,104,9v0,6,-2,11,-9,15v-32,-24,-64,-6,-84,11v8,15,58,-17,72,-11xm32,-117v24,-3,85,-55,101,-32v3,11,-80,53,-89,53v-13,2,-14,-10,-12,-21","w":173},"\u00e0":{"d":"118,-53v10,4,55,41,62,47v0,7,-5,16,-12,16r-57,-28v-20,3,-40,19,-61,18v-10,2,-43,-17,-42,-36v0,-14,7,-40,27,-41v39,-26,92,-36,104,9v0,6,-2,11,-9,15v-32,-24,-64,-6,-84,11v8,15,58,-17,72,-11xm99,-137v7,6,56,14,37,40v-28,-7,-62,-21,-100,-41v-2,-3,-2,-26,5,-23v16,4,42,17,58,24","w":173},"\u00e2":{"d":"118,-53v10,4,55,41,62,47v0,7,-5,16,-12,16r-57,-28v-20,3,-40,19,-61,18v-10,2,-43,-17,-42,-36v0,-14,7,-40,27,-41v39,-26,92,-36,104,9v0,6,-2,11,-9,15v-32,-24,-64,-6,-84,11v8,15,58,-17,72,-11xm147,-97v-27,-6,-39,-26,-60,-37v-21,7,-38,46,-65,23v-2,-5,-3,-10,-4,-14v18,-4,43,-31,61,-42v28,5,40,21,62,36v12,8,18,17,18,25v0,6,-4,9,-12,9","w":173},"\u00e4":{"d":"118,-53v10,4,55,41,62,47v0,7,-5,16,-12,16r-57,-28v-20,3,-40,19,-61,18v-32,5,-66,-64,-15,-77v39,-26,92,-36,104,9v0,6,-3,11,-9,15v-32,-24,-64,-6,-84,11v8,15,58,-17,72,-11xm142,-119v0,8,-4,13,-12,13v-18,0,-21,-20,-16,-34v18,-1,28,2,28,21xm46,-144v7,3,28,9,27,18v1,8,-9,18,-18,17v-18,-1,-25,-25,-9,-35","w":173},"\u00e3":{"d":"118,-53v10,4,55,41,62,47v0,7,-5,16,-12,16r-57,-28v-20,3,-40,19,-61,18v-10,2,-43,-17,-42,-36v0,-14,7,-40,27,-41v39,-26,92,-36,104,9v0,6,-2,11,-9,15v-32,-24,-64,-6,-84,11v8,15,58,-17,72,-11xm114,-136v22,-8,41,-24,64,-26v3,11,-7,10,-7,21v-26,20,-45,30,-58,30v-3,3,-49,-26,-49,-28v-10,-1,-32,35,-51,31v-12,-32,8,-29,32,-51v24,-21,54,20,69,23","w":173},"\u00e5":{"d":"118,-53v10,4,55,41,62,47v0,7,-5,16,-12,16r-57,-28v-20,3,-40,19,-61,18v-10,2,-43,-17,-42,-36v0,-14,7,-40,27,-41v39,-26,92,-36,104,9v0,6,-2,11,-9,15v-32,-24,-64,-6,-84,11v8,15,58,-17,72,-11xm54,-101v-37,-20,-9,-71,34,-65v13,1,25,3,38,13v27,45,-34,73,-72,52xm61,-128v4,20,48,7,49,-5v0,-5,-9,-7,-28,-10v-12,-2,-21,11,-21,15","w":173},"\u00e7":{"d":"108,-118v30,-6,56,21,25,33v-24,-6,-39,5,-75,23v-7,4,-12,12,-15,22v31,28,86,3,128,9v3,28,-29,16,-44,28v-53,15,-106,10,-120,-37v0,-48,62,-70,101,-78xm92,18v23,4,45,12,48,32v-2,6,-12,28,-25,28v-24,6,-50,10,-77,13v-16,-4,-11,-28,7,-29v17,-1,51,-4,63,-12v-14,-15,-57,10,-46,-32v9,-8,0,-25,21,-26v6,6,12,14,9,26","w":171},"\u00e9":{"d":"108,-124v42,-3,70,39,50,73v-22,-1,-70,12,-94,10v-1,1,-2,3,-2,3v0,3,12,7,35,14v18,0,64,7,30,21v-10,14,-31,6,-53,6v-26,-7,-70,-26,-70,-58v0,-54,48,-65,104,-69xm130,-78v-2,-35,-66,-13,-77,3v16,6,62,6,77,-3xm76,-169v26,-11,48,-32,59,-14v3,10,-80,53,-89,53v-14,1,-14,-10,-12,-21v15,-7,16,-7,42,-18","w":161},"\u00e8":{"d":"108,-124v42,-3,70,39,50,73v-22,-1,-70,12,-94,10v-1,1,-2,3,-2,3v0,3,12,7,35,14v18,0,64,7,30,21v-10,14,-31,6,-53,6v-26,-7,-70,-26,-70,-58v0,-54,48,-65,104,-69xm130,-78v-2,-35,-66,-13,-77,3v16,6,62,6,77,-3xm95,-166v7,6,54,14,37,40v-28,-7,-62,-21,-100,-41v-3,-3,-3,-26,5,-24v16,5,42,18,58,25","w":161},"\u00ea":{"d":"108,-124v42,-3,70,39,50,73v-22,-1,-70,12,-94,10v-1,1,-2,3,-2,3v0,3,12,7,35,14v18,0,64,7,30,21v-10,14,-31,6,-53,6v-26,-7,-70,-26,-70,-58v0,-54,48,-65,104,-69xm130,-78v-2,-35,-66,-13,-77,3v16,6,62,6,77,-3xm145,-129v-27,-6,-39,-26,-60,-37v-8,0,-10,4,-14,10v-11,15,-51,34,-56,0v17,-4,44,-32,61,-43v28,5,41,21,63,36v12,8,17,17,17,25v0,6,-3,9,-11,9","w":161},"\u00eb":{"d":"108,-124v42,-3,70,39,50,73v-22,-1,-70,12,-94,10r-3,3v0,3,12,7,36,14v18,0,64,7,30,21v-10,14,-31,6,-53,6v-26,-7,-67,-27,-71,-58v7,-52,48,-65,105,-69xm130,-78v-2,-35,-66,-13,-77,3v16,6,62,6,77,-3xm140,-144v0,8,-4,12,-12,12v-18,0,-19,-19,-16,-33v18,-1,29,1,28,21xm44,-169v7,3,28,9,28,17v0,9,-9,18,-18,18v-18,0,-25,-24,-10,-35","w":161},"\u00ed":{"d":"59,-98v20,4,15,53,10,95v-6,1,-11,2,-19,-4v1,-7,-12,-18,-10,-24v4,-22,-4,-65,19,-67xm50,-139v27,-11,49,-32,59,-14v3,11,-80,53,-89,53v-14,1,-14,-12,-11,-22v15,-7,14,-6,41,-17","w":105},"\u00ec":{"d":"57,-98v22,5,13,50,11,95v-7,1,-11,2,-20,-4v1,-7,-12,-18,-10,-24v4,-22,-2,-64,19,-67xm70,-139v14,10,54,14,37,41v-28,-7,-61,-22,-99,-42v-3,-2,-3,-25,5,-23v15,5,41,17,57,24","w":109},"\u00ee":{"d":"72,-98v20,5,12,51,10,95v-6,2,-13,1,-20,-4v1,-8,-12,-18,-10,-24v4,-22,-3,-65,20,-67xm134,-94v-26,-7,-39,-25,-60,-37v-7,0,-9,4,-13,10v-14,15,-51,34,-56,-1v18,-4,45,-33,61,-43v27,6,40,22,62,37v12,8,18,17,18,25v0,6,-4,9,-12,9","w":143},"\u00ef":{"d":"55,-97v19,5,15,53,10,95v-17,5,-26,-14,-30,-28v6,-20,-3,-65,20,-67xm110,-118v0,8,-4,13,-12,13v-17,0,-19,-19,-16,-34v18,-1,29,1,28,21xm14,-143v6,3,28,8,28,17v0,9,-9,18,-18,18v-18,0,-25,-24,-10,-35","w":107},"\u00f1":{"d":"115,-129v34,6,59,50,59,105v0,31,-15,24,-30,17v-15,-29,-5,-42,-20,-81v-35,-13,-68,52,-88,61v-20,-4,-38,-36,-19,-59v0,-12,3,-14,10,-28v11,-8,18,11,27,12xm117,-166v22,-7,41,-23,64,-26v3,11,-7,10,-7,21v-26,20,-45,30,-58,30v-3,3,-49,-26,-49,-28v-10,-1,-32,35,-51,31v-5,-12,-8,-16,0,-23v4,-6,28,-29,48,-33v17,-3,43,28,53,28","w":171},"\u00f3":{"d":"102,-132v50,-20,99,16,99,60v0,54,-60,64,-108,79v-50,-2,-110,-48,-76,-100v22,-17,49,-33,85,-39xm136,-104v-34,0,-91,27,-94,47v16,51,125,16,125,-22v0,-17,-10,-25,-31,-25xm49,-154v24,-3,85,-55,101,-32v3,11,-80,53,-89,53v-14,0,-13,-8,-12,-21","w":191},"\u00f2":{"d":"102,-132v50,-20,99,16,99,60v0,54,-60,64,-108,79v-50,-2,-110,-48,-76,-100v22,-17,49,-33,85,-39xm136,-104v-34,0,-91,27,-94,47v16,51,125,16,125,-22v0,-17,-10,-25,-31,-25xm115,-181v14,10,51,13,37,40v-28,-7,-62,-21,-100,-41v-3,-2,-3,-26,5,-23v16,5,42,17,58,24","w":191},"\u00f4":{"d":"102,-132v50,-20,99,16,99,60v0,54,-60,64,-108,79v-50,-2,-110,-48,-76,-100v22,-17,49,-33,85,-39xm136,-104v-34,0,-91,27,-94,47v16,51,125,16,125,-22v0,-17,-10,-25,-31,-25xm110,-177v-22,6,-38,45,-65,22v-2,-4,-3,-9,-4,-13v18,-4,43,-32,61,-43v27,6,40,21,62,36v12,9,18,17,18,25v1,11,-15,10,-23,7","w":191},"\u00f6":{"d":"102,-132v50,-20,99,16,99,60v0,54,-60,64,-108,79v-50,-2,-110,-48,-76,-100v22,-17,49,-33,85,-39xm136,-104v-34,0,-91,27,-94,47v16,51,125,16,125,-22v0,-17,-10,-25,-31,-25xm161,-160v0,8,-4,13,-12,13v-17,0,-19,-19,-16,-34v18,-1,29,1,28,21xm65,-185v7,3,28,9,28,18v0,7,-9,18,-18,17v-18,1,-25,-24,-10,-35","w":191},"\u00f5":{"d":"102,-132v50,-20,99,16,99,60v0,54,-60,64,-108,79v-50,-2,-110,-48,-76,-100v22,-17,49,-33,85,-39xm136,-104v-34,0,-91,27,-94,47v16,51,125,16,125,-22v0,-17,-10,-25,-31,-25xm58,-199v26,-21,54,18,69,22v4,0,15,-5,34,-13v22,-9,21,-16,31,-13v3,11,-9,9,-7,22v-26,20,-46,30,-59,30v-2,4,-49,-28,-49,-29v-11,0,-32,31,-46,32v-12,-3,-13,-21,-4,-23v4,-6,14,-15,31,-28","w":191},"\u00fa":{"d":"196,-129v-1,-4,12,-13,15,-13v6,0,8,7,8,21v0,24,-7,25,-13,45v-7,7,-14,21,-24,29v-9,24,-61,45,-89,45v-63,0,-105,-72,-67,-126v24,-3,19,27,18,46v-1,26,23,42,54,40v38,-3,88,-51,98,-87xm106,-174v26,-11,48,-32,59,-14v3,11,-81,53,-89,54v-13,1,-15,-12,-11,-22v15,-7,14,-7,41,-18","w":213},"\u00f9":{"d":"196,-129v-1,-4,12,-13,15,-13v6,0,8,7,8,21v0,24,-7,25,-13,45v-7,7,-14,21,-24,29v-9,24,-61,45,-89,45v-63,0,-105,-72,-67,-126v24,-3,19,27,18,46v-1,26,23,42,54,40v38,-3,88,-51,98,-87xm126,-166v7,6,56,14,37,40v-28,-7,-62,-22,-100,-42v-2,-3,-2,-26,5,-23v16,4,42,18,58,25","w":213},"\u00fb":{"d":"196,-129v-1,-4,12,-13,15,-13v6,0,8,7,8,21v0,24,-7,25,-13,45v-7,7,-14,21,-24,29v-9,24,-61,45,-89,45v-63,0,-105,-72,-67,-126v24,-3,19,27,18,46v-1,26,23,42,54,40v38,-3,88,-51,98,-87xm172,-143v-27,-6,-39,-26,-60,-37v-8,0,-10,4,-14,10v-11,15,-49,35,-56,0v17,-4,44,-32,61,-43v27,6,41,21,63,36v12,9,17,17,17,25v0,6,-3,9,-11,9","w":213},"\u00fc":{"d":"196,-129v-1,-4,12,-13,15,-13v6,0,8,7,8,21v0,24,-7,25,-13,45v-7,7,-14,21,-24,29v-9,24,-61,45,-89,45v-63,0,-105,-72,-67,-126v24,-3,19,27,18,46v-1,26,23,42,54,40v38,-3,88,-51,98,-87xm168,-161v0,8,-3,13,-11,13v-17,0,-20,-19,-17,-34v18,-1,29,1,28,21xm72,-186v7,3,29,9,28,18v0,7,-9,18,-18,17v-18,1,-25,-24,-10,-35","w":213},"\u2020":{"d":"22,-286v15,6,5,-20,19,-19v9,-3,15,21,17,22v6,1,12,3,20,6v3,10,5,16,-9,16v-34,-10,-6,51,-34,52v-20,-7,11,-47,-15,-49v-14,3,-25,-5,-17,-24v7,-2,14,-4,19,-4","w":77},"\u00b0":{"d":"106,-268v0,36,-35,38,-51,46v-48,5,-60,-58,-25,-78v33,-11,76,-9,76,32xm38,-257v16,7,39,2,38,-17v-13,-9,-28,-1,-32,11v-5,3,-7,0,-6,6","w":114},"\u00a2":{"d":"105,-188v13,-12,14,-18,26,-15v7,23,7,15,-3,49v6,0,18,14,17,20v-3,5,-12,19,-26,13v-14,1,-14,5,-16,21v10,10,46,-13,38,18v-9,17,-23,16,-54,20v-17,16,-4,55,-29,60v-37,-10,19,-64,-24,-71v-20,-10,-37,-47,-6,-62v23,-20,73,-4,77,-53xm65,-101v4,-9,7,-8,3,-13v-14,4,-22,10,-3,13","w":154},"\u00a3":{"d":"153,-170v3,22,62,0,49,39v-18,6,-31,12,-58,9v-12,-1,-17,30,-23,39v19,26,50,56,91,35v9,-2,27,-13,27,4v0,27,-27,39,-58,42v-32,-5,-59,-19,-78,-39v-6,1,-35,44,-57,39v-25,0,-37,-15,-37,-46v0,-41,43,-53,73,-50v4,1,12,-18,12,-21v-7,-15,-49,0,-44,-30v-2,-31,31,-16,60,-19v16,-30,25,-119,93,-113v16,2,75,16,50,44v-4,5,-7,7,-12,8v-18,-12,-32,-18,-41,-18v-35,-1,-38,52,-47,77xm43,-45v4,5,12,-2,11,-9v-1,2,-12,1,-11,9","w":242},"\u00a7":{"d":"141,-115v12,10,29,36,28,56v-4,68,-129,69,-152,16v-1,-12,-10,-22,8,-23v17,3,47,21,67,23v16,1,40,-8,38,-21v-8,-49,-119,-30,-117,-85v1,-28,15,-45,-3,-64v-1,-53,55,-61,103,-62v15,-5,6,-5,20,-2v16,17,23,27,23,30v-1,26,-29,7,-45,7v-21,0,-51,2,-62,17v19,14,87,8,97,43v18,14,16,57,-5,65xm64,-147r57,17v10,-28,-22,-43,-47,-44v-25,-1,-35,19,-10,27","w":174},"\u2022":{"d":"130,-114v0,47,-124,54,-120,-8r6,-31v44,-28,64,-34,104,0v8,6,10,20,10,39","w":139},"\u00b6":{"d":"121,-237v21,-9,44,-13,63,-1v-1,7,5,6,7,11r-4,190v-2,33,4,39,-15,40v-16,1,-10,-20,-10,-33r4,-161v0,-17,-1,-34,-16,-25v2,10,1,23,1,35v-9,46,-6,75,-15,156v-3,4,-7,5,-12,5v-17,-10,-3,-89,-10,-115v-43,14,-98,10,-101,-29v-4,-53,59,-63,104,-75v3,1,4,2,4,2xm95,-204v2,9,-30,50,1,50v35,0,23,-13,29,-43v0,-1,-2,-7,-4,-15v-12,-1,-14,2,-26,8","w":206},"\u00df":{"d":"33,10v-29,4,-28,-32,-16,-70v18,-58,17,-137,56,-176v12,-24,46,-58,82,-43v20,8,47,24,47,54v0,30,-62,59,-67,90v33,23,56,33,63,63v-18,21,-22,36,-48,54v-24,17,-27,41,-53,16v-2,-19,7,-35,24,-42v15,-13,26,-22,34,-40v-13,-17,-78,-29,-56,-70v-3,-27,64,-54,66,-86v-8,-25,-41,-4,-52,8v-29,30,-47,83,-51,141v-17,25,-8,71,-29,101"},"\u00ae":{"d":"75,-194v78,-29,116,9,130,84v-2,42,-22,47,-57,67v-74,20,-161,-19,-129,-110v6,-18,29,-34,57,-40xm46,-86v51,36,84,21,129,-15v7,-15,0,-39,-10,-49v-13,-37,-49,-26,-86,-18v-28,7,-49,46,-33,82xm72,-123v-5,-43,68,-57,75,-14v-17,26,-18,17,3,32v2,25,-25,18,-45,7r-4,-4v-1,8,-3,20,-12,24v-10,-3,-21,-34,-17,-45xm112,-135v-10,-1,-20,13,-9,14v6,-6,9,-11,9,-14","w":217},"\u00a9":{"d":"102,-29v-74,5,-124,-84,-70,-140v22,-22,53,-35,97,-38v46,-4,88,49,74,100v0,44,-51,75,-101,78xm96,-66v42,-3,75,-23,75,-69v0,-23,-4,-38,-44,-38v-16,0,-33,6,-49,20v36,-4,55,-12,62,20v-5,16,-49,1,-50,21v10,15,53,-14,54,11v0,18,-14,27,-42,27v-22,1,-46,-11,-46,-31v0,-25,7,-39,20,-44v-1,-1,-2,-2,-3,-2v-51,22,-32,89,23,85","w":217},"\u2122":{"d":"213,-307v28,9,11,49,7,75v-1,4,-4,6,-11,6v-7,1,-11,-14,-11,-34v-14,-6,-34,34,-46,28v-2,0,-10,-9,-24,-27v-10,7,-3,36,-27,31v-15,-24,-3,-27,1,-48v-6,-7,-27,-1,-31,3v-3,14,-7,30,-11,51v-5,10,-29,9,-24,-12v-5,-8,1,-18,3,-35v-13,6,-33,2,-29,-18v20,-17,64,-17,100,-19v28,-1,29,30,45,39v11,-6,35,-32,58,-40","w":239},"\u00b4":{"d":"52,-284v29,-11,50,-34,62,-14v3,12,-86,54,-94,56v-14,0,-16,-12,-12,-23v11,-5,25,-11,44,-19","w":120},"\u00a8":{"d":"124,-259v0,9,-4,13,-12,13v-18,0,-22,-21,-17,-35v19,-1,30,1,29,22xm23,-285v7,2,30,9,29,18v1,10,-9,19,-18,19v-19,0,-28,-26,-11,-37","w":136},"\u2260":{"d":"48,-130v29,11,49,-57,60,-50v25,6,7,27,-1,46v22,5,29,7,21,22v-18,2,-48,-1,-50,15v9,8,53,-7,54,10v-4,22,-46,20,-72,24v-7,13,-18,32,-34,57v-8,6,-15,-3,-13,-14v-1,-9,15,-39,14,-45v-30,5,-24,-17,-13,-25v12,-1,36,4,29,-13v-14,0,-47,6,-36,-12v0,-18,27,-13,41,-15","w":140},"\u00c6":{"d":"335,-259v0,30,-102,12,-122,34v10,21,2,79,16,100v24,-6,59,-13,86,-16v23,-2,32,21,13,26r-103,29v-3,22,-4,38,8,43v28,-5,60,-6,86,-14v5,-1,14,7,14,11v6,16,-90,40,-107,40v-29,0,-39,-19,-32,-46v-2,-4,0,-26,-9,-28v-29,2,-58,6,-88,6v-31,0,-40,74,-82,73v-18,-23,4,-37,12,-50v40,-65,112,-126,165,-207v20,-17,69,-11,112,-13v21,0,31,4,31,12xm123,-111v28,1,44,-2,67,-10v-4,-22,5,-49,-7,-65v-3,6,-65,61,-60,75","w":348},"\u00d8":{"d":"76,-211v41,-13,100,-22,140,-3v26,-19,40,-29,44,-29v10,0,15,7,15,20v0,15,-23,23,-30,35v23,39,29,114,-21,139v-36,19,-102,35,-147,18v-14,-5,-29,29,-46,35v-25,-13,-19,-24,3,-56v-9,-17,-28,-27,-28,-60v0,-38,23,-72,70,-99xm107,-66v55,15,125,-12,123,-70v0,-16,-5,-25,-13,-29r-110,95r0,4xm39,-108v-1,3,17,31,22,27v8,-6,109,-90,123,-106v-15,-11,-43,1,-63,2v-33,10,-80,35,-82,77","w":270},"\u221e":{"d":"322,-72v-4,22,-54,41,-76,41v-43,0,-83,-17,-114,-35v-46,19,-125,53,-128,-18v-1,-14,10,-22,13,-35v29,-10,62,-31,97,-4v37,28,47,5,75,-8v40,-19,73,-10,114,1v13,1,18,55,19,58xm228,-69v15,0,62,-12,61,-25v-19,-23,-89,-10,-105,11v0,2,1,4,2,4v28,6,42,10,42,10xm75,-102v-13,2,-41,4,-44,19v0,4,3,7,10,7v21,0,40,-6,54,-17v-9,-6,-16,-9,-20,-9","w":330},"\u00b1":{"d":"93,-163v-7,46,76,-4,46,47v-14,6,-27,13,-38,8v-24,2,-14,28,-28,44r-14,0v-7,-12,-5,-15,-7,-33v-12,-7,-41,-1,-37,-24v2,-11,23,-17,36,-14r28,-38v4,0,9,4,14,10xm113,-27v-12,18,-58,27,-85,24v-16,2,-22,-23,-13,-36v28,-7,85,-11,98,12","w":151},"\u2264":{"d":"73,-109v10,15,87,16,87,42v0,11,-5,16,-13,16v-36,-11,-69,-24,-109,-31v-18,-8,-18,-13,-9,-36v59,-56,93,-83,101,-83v16,0,18,17,14,28v-27,24,-42,35,-71,64xm10,-29v35,-12,117,-26,148,-3v1,2,-5,19,-8,18r-124,15v-16,2,-26,-18,-16,-30","w":168},"\u2265":{"d":"115,-174v20,7,53,36,20,57v-19,11,-91,68,-82,59v-18,3,-25,-22,-13,-31v15,-10,14,-10,70,-51r-50,-37v-5,-4,-5,-27,4,-28v16,7,40,17,51,31xm14,-32v33,-10,86,-14,127,-10v12,12,5,23,-11,27v-49,9,-82,13,-99,13v-22,0,-24,-16,-17,-30","w":163},"\u00a5":{"d":"31,-248v30,-3,64,64,74,59v37,-22,77,-65,107,-82v20,-11,34,18,21,32v-28,19,-52,38,-70,57v-18,8,-40,21,-35,60v2,19,39,7,64,7v25,0,16,21,2,27v-36,16,-46,8,-68,18v6,11,101,-20,66,24v-21,11,-42,12,-75,20v-2,1,-5,6,-10,18v-8,3,-11,10,-24,8v-7,-17,-2,-18,-9,-26v-13,5,-39,3,-53,-2v-10,-17,-7,-27,0,-34v23,-1,45,1,64,-5v-11,-7,-28,-4,-64,-6v-13,-8,-15,-24,-6,-35v33,-2,102,9,76,-37v-14,-14,-33,-38,-60,-66v-10,-10,-8,-28,0,-37","w":219},"\u00b5":{"d":"123,-114v41,0,54,-9,127,-17v12,-2,20,-6,25,-12v5,-78,43,-127,119,-138v38,-5,46,23,55,48v-5,5,2,4,2,12v-2,47,-72,81,-129,95v-17,4,-12,32,-2,39v30,-5,24,0,99,4v14,9,14,20,-1,23v-17,3,-71,-1,-85,13v1,19,18,35,-3,47v-1,-6,-10,-7,-16,-5v-3,-3,-20,-37,-29,-41v-15,8,-50,22,-49,-9v1,-19,2,-27,28,-26v24,1,13,-12,8,-30v-22,1,-64,16,-111,23v-50,7,-17,47,-17,57v0,10,-5,15,-13,15v-20,-9,-27,-30,-33,-55v-20,-17,-52,8,-85,-6v-2,-10,-13,-26,4,-29v32,-6,41,-1,65,-7v-17,-74,-4,-173,69,-180v55,-20,130,8,131,65v-11,9,-10,2,-29,-11v-33,-23,-37,-26,-76,-25v-41,13,-69,38,-67,100v0,34,4,50,13,50xm317,-152v29,-6,106,-43,106,-71v0,-23,-24,-25,-42,-17v-31,1,-74,48,-64,88","w":462},"\u2202":{"d":"456,-113v55,-37,119,-8,176,5v-19,37,-104,-5,-144,18v-5,64,-45,87,-130,87v-43,0,-70,-8,-96,-21v-54,15,-146,29,-209,10v-18,-11,-43,-26,-46,-53v-1,-9,28,-48,51,-46v55,-10,55,-8,101,-8v29,0,17,-26,23,-56v4,-19,4,-74,34,-49v4,42,-7,83,-10,124v0,4,-11,10,-34,17v-29,-1,-45,-4,-74,1v-10,2,-57,3,-52,18v30,43,132,30,190,18v2,-10,-7,-19,-5,-28v5,-36,31,-59,74,-56v27,2,71,4,70,35v-1,30,-37,41,-58,57v35,13,131,15,135,-23v2,-19,-5,-36,4,-50xm262,-85v0,3,13,28,19,25v7,0,48,-13,61,-29v-10,-17,-71,-17,-80,4","w":640},"\u2211":{"d":"235,-95v-3,-59,120,-41,160,-28v3,-2,15,-3,14,4v1,3,-16,19,-21,18r-97,4v-25,5,-18,18,-23,56v-16,14,-25,24,-36,18v-83,32,-154,29,-212,-17v-45,-68,41,-114,107,-119v50,-4,59,66,22,85v-16,8,-61,10,-79,15v36,27,185,24,165,-36xm128,-119v-23,-3,-43,4,-53,15v13,5,46,-4,53,-15","w":414},"\u220f":{"d":"243,-190v7,-18,27,-19,38,6v0,2,-5,8,-14,16v-8,-9,-27,-4,-24,-22xm221,-111v55,-7,60,22,45,64v5,23,17,47,-22,47v-35,0,-18,-40,-15,-70v-2,-19,-35,-13,-52,-18v-2,0,-13,1,-34,3v-4,0,-10,11,-13,31v-3,20,1,43,-11,54v-12,-4,-13,-5,-21,-3v-13,-13,-3,-25,-12,-41v7,-6,12,-22,10,-39v-23,-8,-79,15,-87,-21v12,-28,78,-4,101,-20r36,-96v8,-19,17,-28,27,-28v10,0,15,6,15,18v-6,32,-31,62,-38,109v25,10,47,-1,71,10","w":282},"\u03c0":{"d":"247,-240v-3,5,-14,12,-21,6v-41,5,-71,-4,-85,37v-6,7,-21,42,-25,61v28,12,104,-16,129,24v8,11,12,24,12,38v-7,17,-2,99,-40,68v-9,-23,-5,-47,-1,-73v3,-24,-40,-24,-50,-19v-4,0,-18,2,-44,6v-30,-6,-16,49,-33,58v-19,-11,-14,2,-29,-10v8,-71,20,-114,43,-170v-24,-2,-49,4,-73,7v-30,3,-32,-33,-7,-36r184,-22v17,-1,40,13,40,25","w":265},"\u222b":{"d":"62,-151v-7,-70,20,-130,63,-150v28,1,39,10,70,23v20,8,6,33,-6,35v-29,-13,-45,-20,-49,-20v-20,-4,-45,51,-43,70v8,60,5,129,5,189v0,62,-27,93,-79,93v-37,-1,-71,-14,-63,-57v21,0,79,34,91,-2v16,-3,14,-64,21,-85v-2,-31,-1,-74,-10,-96","w":156},"\u00aa":{"d":"6,-265v1,-31,58,-53,80,-22v-11,14,25,28,25,36v-2,8,-15,12,-27,10v-22,-29,-68,19,-78,-24xm52,-281v-8,1,-24,10,-9,13v11,1,24,-10,9,-13","w":117},"\u00ba":{"d":"13,-273v1,-31,56,-41,83,-18v36,8,14,48,-9,52v-35,6,-64,-5,-74,-34xm81,-269v-7,-7,-20,-11,-29,-6v5,13,13,11,29,6","w":128},"\u2126":{"d":"121,-111v9,16,43,-5,54,5v28,-4,62,8,81,-5v48,-33,166,-28,160,44v15,34,-51,53,-88,53v-34,0,-53,-21,-71,-37v-15,7,-32,-4,-28,-22v-26,-4,-93,-6,-108,8v8,17,5,37,12,54v-1,15,-18,15,-31,10v-9,-15,-20,-39,-19,-63v-20,-9,-73,15,-79,-18v4,-28,50,-11,77,-24v12,-99,36,-168,137,-178v35,5,64,20,67,57v0,13,-14,18,-20,5v-15,-35,-83,-31,-104,4v-26,20,-39,82,-40,107xm334,-45v15,2,51,-14,53,-22v-7,-20,-36,-31,-69,-29v-8,-1,-39,6,-37,14v-3,10,44,38,53,37","w":424},"\u00e6":{"d":"145,-44r33,7v2,42,-59,29,-85,16v-6,7,-35,24,-48,15v-19,2,-35,-21,-33,-37v2,-24,5,-19,28,-36v-6,-8,-45,3,-33,-21v21,-22,58,-12,85,-1v6,-5,35,-28,45,-15v20,-4,36,17,36,35v0,23,-4,21,-28,37xm111,-72v12,3,49,-16,19,-17v-5,0,-20,12,-19,17xm74,-50v-14,-4,-48,16,-19,17v4,1,19,-14,19,-17","w":184},"\u00f8":{"d":"76,-136v17,7,33,-8,51,0v9,-6,21,-13,36,-21v23,22,-13,31,3,50v11,13,4,21,14,35v-4,5,-1,14,-4,23v-14,23,-45,41,-84,39v-12,2,-29,28,-41,38v-2,-11,-34,-10,-15,-30v3,-7,5,-11,5,-11v-15,-24,-60,-54,-22,-89v23,-21,25,-32,57,-34xm102,-54v18,1,50,-19,30,-32v-12,7,-22,18,-30,32xm85,-92v-14,3,-26,8,-38,17v2,20,17,13,26,0v6,-8,12,-13,12,-17","w":188},"\u00bf":{"d":"181,-247v3,1,31,2,29,15v-4,22,-37,27,-41,4v1,-5,7,-20,12,-19xm161,-34v-45,-1,-105,19,-124,51v0,11,18,17,54,17v39,0,82,-13,112,4v-10,35,-58,31,-100,31v-47,0,-80,-10,-99,-31v-10,-56,22,-73,64,-90v8,-3,32,-9,74,-18v21,-15,7,-62,22,-92v-1,-5,-1,-11,4,-12v16,0,24,7,24,22v-8,30,-8,73,-17,111v-3,5,-7,7,-14,7","w":213},"\u00a1":{"d":"86,-197v8,16,-7,41,-24,25v-11,-11,-4,-16,-3,-29v13,0,15,-2,27,4xm46,-107v4,-8,11,-16,23,-7v19,26,-5,57,-6,87v-7,0,-5,18,-9,28v0,14,-17,52,-11,70v-2,7,-15,28,-25,12v-4,-6,-15,-7,-6,-16v2,-39,14,-96,34,-174","w":95},"\u00ac":{"d":"141,-99v47,7,103,-3,149,6v14,24,18,15,10,39v-10,34,-7,31,-26,76v-4,6,-15,8,-16,21v-4,2,-4,1,-13,5v-22,-33,-4,-33,16,-104v-5,-9,-28,-4,-38,-6r-183,4v-14,0,-41,-29,-17,-36v31,-9,82,5,118,-5","w":315},"\u221a":{"d":"364,-218v43,-21,80,-51,104,-32v-3,19,-24,21,-44,40v-41,15,-78,53,-136,78r-137,98v-20,16,-79,66,-91,68v-3,1,-25,-11,-24,-13v-4,-28,-43,-61,-30,-85v26,-15,42,19,58,32r295,-188v0,1,2,2,5,2","w":474},"\u0192":{"d":"115,-262v-23,6,-39,63,-38,96v1,3,57,2,54,16v1,22,-45,15,-51,30v3,34,12,68,10,103v14,17,-18,53,-28,63v-48,8,-89,5,-95,-37v20,-5,77,21,83,-18v17,-29,-4,-61,0,-98v0,-5,-3,-10,-7,-17v-33,4,-43,-17,-25,-37v10,-4,27,5,27,-10v0,-43,15,-77,32,-109v12,-7,16,-22,38,-20v11,1,51,35,25,55v-9,1,-16,-17,-25,-17","w":145},"\u2248":{"d":"133,-112v21,15,48,-30,78,-17v3,3,5,7,5,9v-8,30,-47,45,-76,45v-19,0,-64,-48,-90,-21r-29,20v-6,-1,-17,-16,-15,-32v24,-17,70,-42,107,-21v4,4,10,9,20,17xm138,-57v28,2,48,-25,76,-26v13,30,-21,42,-40,53v-41,24,-77,-15,-114,-23v-15,14,-46,32,-49,-1v-3,-9,27,-28,54,-30","w":223},"\u2206":{"d":"18,-1v-24,-30,8,-48,25,-71v14,-19,34,-28,40,-56v20,-35,29,-14,57,4v9,39,43,62,57,102v0,16,-34,17,-50,14v-28,2,-72,4,-129,7xm139,-47r-22,-52v-12,-5,-12,15,-24,27v-7,6,-14,16,-23,28v23,1,36,-1,69,-3","w":199},"\u00ab":{"d":"191,-64v16,6,87,37,53,63v-39,-9,-71,-28,-107,-40v-14,-13,-13,-34,10,-47v27,-15,48,-55,84,-62v9,-2,21,10,21,18r-13,21v-16,5,-44,22,-51,41v0,4,1,6,3,6xm71,-65v17,6,87,35,55,62v-39,-8,-66,-27,-108,-40v-14,-13,-13,-36,10,-46v23,-18,50,-56,84,-63v9,-2,21,10,21,18r-13,22v-20,6,-32,17,-51,37v0,3,-1,11,2,10","w":265},"\u00bb":{"d":"120,-129v9,-33,48,-10,64,5v9,20,86,52,50,86v-36,11,-66,31,-107,40v-6,-7,-9,-13,-9,-17v-2,-13,50,-46,63,-46v11,-18,-33,-42,-48,-47xm1,-128v10,-33,46,-8,64,6v8,19,86,50,51,85v-40,13,-69,30,-108,40v-6,-7,-8,-12,-8,-16v-2,-14,50,-46,63,-47v7,-13,-9,-20,-19,-30v-10,-9,-20,-15,-30,-17","w":252},"\u2026":{"d":"244,-24v-1,21,-38,32,-41,3v-2,-19,23,-22,34,-17v0,7,0,15,7,14xm113,-24v0,-22,28,-21,38,-8v5,34,-39,40,-38,8xm35,-2v-10,-2,-36,-17,-18,-29v-1,-15,17,-17,31,-6v7,17,6,33,-13,35","w":258},"\u00a0":{"w":179},"\u00c0":{"d":"161,-217v20,53,23,124,54,170v-2,20,-34,9,-42,0v-27,-12,-78,-18,-101,-18v-26,6,-29,51,-54,63v-18,-4,-19,-30,-3,-38v5,-9,15,-16,8,-29v1,-12,23,-9,26,-19v6,-10,11,-20,20,-27r70,-121v12,-4,16,4,22,19xm82,-91v17,3,62,7,86,13v-13,-33,-13,-80,-29,-109v-15,30,-38,63,-57,96xm150,-268v14,10,54,14,37,41v-28,-7,-62,-22,-100,-42v-2,-3,-2,-26,5,-23v16,4,42,17,58,24"},"\u00c3":{"d":"161,-217v20,53,23,124,54,170v-2,20,-34,9,-42,0v-27,-12,-78,-18,-101,-18v-26,6,-29,51,-54,63v-18,-4,-19,-30,-3,-38v5,-9,15,-16,8,-29v1,-12,23,-9,26,-19v6,-10,11,-20,20,-27r70,-121v12,-4,16,4,22,19xm82,-91v17,3,62,7,86,13v-13,-33,-13,-80,-29,-109v-15,30,-38,63,-57,96xm100,-285v26,-19,54,19,69,22v4,0,15,-5,34,-13v23,-9,22,-17,31,-12v3,11,-9,9,-7,21v-26,20,-46,30,-59,30v-3,3,-50,-26,-49,-29v-12,1,-31,35,-51,32v-3,-8,-5,-14,-5,-18v10,-9,16,-17,37,-33"},"\u00d5":{"d":"62,-184v78,-31,249,-50,238,74v-6,65,-102,105,-179,115v-77,-7,-152,-71,-101,-149v2,-5,24,-33,42,-40xm279,-120v14,-38,-47,-64,-85,-61v-20,-9,-41,7,-62,0v-11,7,-54,12,-66,24v0,20,-51,35,-38,66v-1,43,50,67,96,67v44,0,162,-55,155,-96xm116,-270v26,-19,54,19,69,22v4,0,15,-5,34,-13v23,-10,22,-16,31,-12v3,11,-8,9,-7,21v-45,28,-47,42,-88,16v-29,-19,-12,-20,-43,2v-8,5,-12,18,-23,15v-13,-3,-12,-20,-4,-23v4,-6,14,-15,31,-28","w":273},"\u0152":{"d":"247,-243v71,4,161,-7,245,-8v17,0,27,6,27,17v-8,27,-70,14,-104,23v-3,1,-52,0,-65,7r0,4v16,16,17,29,17,65v32,10,74,-14,99,16v-14,25,-76,17,-127,24v-17,18,-55,32,-75,51v85,0,128,-3,204,-11v15,-2,21,11,20,29v-78,24,-177,12,-270,24v-24,3,-24,-29,-48,-15v-46,7,-70,4,-105,-4v-19,-18,-42,-22,-52,-55v-10,-34,0,-47,12,-78v-18,-59,48,-78,105,-84v17,-18,103,-13,117,-5xm125,-45v76,-9,186,-43,209,-105v-26,-67,-137,-83,-217,-54v3,34,-45,25,-60,58v-41,48,5,108,68,101","w":492},"\u0153":{"d":"185,-54v25,28,107,-17,104,33v-12,12,-60,14,-87,14v0,0,1,1,2,1v-11,1,-39,-9,-50,-17v-28,17,-75,32,-114,7v-22,-14,-34,-11,-34,-41v0,-36,33,-49,48,-75v29,-16,72,-3,95,11v12,-9,48,-27,59,-26v30,0,64,15,65,40v0,7,-6,20,-20,37v-29,1,-44,11,-68,16xm226,-106v-21,-7,-41,-2,-48,13v14,1,42,-7,48,-13xm132,-87v-21,-35,-94,11,-92,24v-2,14,43,21,61,21v25,0,36,-20,31,-45","w":295},"\u2013":{"d":"6,-66v-8,-72,79,-21,146,-39v37,-10,79,7,111,0v9,8,14,13,14,17v2,26,-72,13,-99,21v-83,4,-124,21,-172,1","w":282},"\u2014":{"d":"175,-106v86,-9,201,1,286,-1v11,6,13,11,6,30v-118,15,-246,10,-377,10v-25,0,-73,3,-82,-8r-2,-26v11,-13,32,-9,52,-7v38,3,84,-5,117,2","w":485},"\u201c":{"d":"66,-261v-21,5,-37,51,-22,77v0,4,-2,6,-7,6v-31,-9,-38,-62,-12,-94v12,-15,21,-28,31,-34v16,-1,19,24,22,34v10,-11,22,-32,43,-23v-2,8,4,16,5,19v-6,11,-51,53,-29,74v-12,21,-30,5,-33,-17v-6,-13,9,-28,2,-42","w":118},"\u201d":{"d":"120,-294v12,3,30,26,19,34v2,15,-40,70,-55,66v-40,-10,10,-51,14,-64v3,-3,8,-31,22,-36xm70,-306v14,3,26,34,16,49v-19,30,-31,45,-58,59v-12,-11,-33,-17,-7,-36v13,-19,36,-27,36,-59v0,-5,9,-13,13,-13","w":148},"\u2018":{"d":"73,-262v-10,7,-41,39,-38,69v-15,13,-27,-16,-28,-28v-2,-20,51,-83,66,-83v20,0,25,41,0,42","w":95},"\u2019":{"d":"74,-300v13,31,-1,99,-44,101v-13,0,-19,-5,-19,-15v6,-10,31,-34,35,-59v2,-11,1,-32,11,-32v6,0,11,2,17,5","w":90},"\u00f7":{"d":"167,-158v-4,3,-7,9,-10,20v-23,4,-34,-8,-29,-31v14,-6,18,1,39,11xm78,-72v-53,11,-53,12,-69,-15v-1,-12,11,-17,22,-14v71,-13,151,-18,230,-24v11,1,21,16,23,28v-28,20,-90,11,-126,16v-36,5,-62,5,-80,9xm123,-40v19,-17,41,-1,41,17v0,13,-6,19,-17,19v-15,0,-29,-14,-24,-36","w":293},"\u25ca":{"d":"76,-158v48,-8,64,11,100,36v28,19,-5,39,-22,54v-15,13,-40,32,-48,49v-17,5,-12,0,-27,-16v-6,-6,-86,-31,-68,-53r2,-9v27,-23,48,-44,63,-61xm93,-65v12,-2,35,-31,41,-38v-5,-10,-16,-14,-34,-24v-12,12,-36,29,-40,44v19,11,30,18,33,18","w":199},"\u00ff":{"d":"118,85v-11,11,-11,38,-22,61v-2,-1,-2,31,-17,27v-11,0,-21,-10,-21,-22v20,-66,23,-61,64,-168v-22,1,-38,16,-58,4v-22,4,-51,-16,-51,-42v-11,-13,-7,-59,7,-58v16,1,21,24,22,51v21,33,66,5,94,-7v4,-3,26,-14,38,-29r17,0v23,44,-23,59,-34,102v-6,9,-13,9,-13,26v-15,6,-12,33,-27,48v0,2,1,4,1,7xm158,-136v0,8,-4,13,-12,13v-18,0,-21,-20,-16,-34v18,-1,29,1,28,21xm62,-161v7,3,28,9,27,18v1,8,-8,17,-17,17v-18,0,-26,-24,-10,-35","w":190},"\u0178":{"d":"176,-189v35,20,-25,54,-39,72v-26,34,-57,57,-74,104v-10,15,-4,14,-23,3r0,-10v19,-44,27,-46,50,-81v-9,-5,-24,4,-34,4v-38,0,-54,-50,-44,-87v21,-5,18,19,22,35v4,18,15,27,29,27v41,0,60,-39,113,-67xm153,-222v0,8,-3,12,-11,12v-18,0,-21,-19,-16,-33v18,-1,28,2,27,21xm57,-247v8,2,29,9,28,17v0,21,-37,24,-36,1v0,-7,2,-13,8,-18","w":135},"\u2044":{"d":"193,-305v7,6,17,31,3,41v-10,7,-12,13,-21,25v-79,56,-190,209,-197,260r-18,0v-23,-19,9,-70,15,-85v52,-83,121,-179,218,-241","w":120},"\u00a4":{"d":"308,-133r-200,16v-2,1,-6,4,-10,10v70,-2,144,-14,211,-8v3,0,8,4,13,8v-1,4,-3,9,-9,17v-57,11,-164,6,-219,25v26,32,112,25,173,25v9,0,35,2,35,19v0,9,-4,13,-12,14v-115,12,-146,23,-211,-19v-12,-4,-22,-9,-25,-27v-6,-29,-61,3,-43,-49v17,-1,36,7,42,-12v-32,7,-36,-39,-11,-40v29,14,63,-25,73,-30v52,-25,72,-44,142,-44v23,0,21,41,-1,39v-35,-3,-61,9,-102,31v2,2,5,4,8,4v18,-6,101,-9,115,-9v7,0,55,13,31,30","w":312},"\u20ac":{"d":"308,-133r-200,16v-2,1,-6,4,-10,10v70,-2,144,-14,211,-8v3,0,8,4,13,8v-1,4,-3,9,-9,17v-57,11,-164,6,-219,25v26,32,112,25,173,25v9,0,35,2,35,19v0,9,-4,13,-12,14v-115,12,-146,23,-211,-19v-12,-4,-22,-9,-25,-27v-6,-29,-61,3,-43,-49v17,-1,36,7,42,-12v-32,7,-36,-39,-11,-40v29,14,63,-25,73,-30v52,-25,72,-44,142,-44v23,0,21,41,-1,39v-35,-3,-61,9,-102,31v2,2,5,4,8,4v18,-6,101,-9,115,-9v7,0,55,13,31,30","w":312},"\u2039":{"d":"64,-107v9,17,86,17,87,43v0,11,-4,16,-13,16v-36,-11,-70,-22,-109,-31v-19,-4,-18,-14,-9,-36v59,-56,93,-84,101,-84v17,0,19,20,13,29","w":159},"\u203a":{"d":"41,-181v26,27,112,44,70,91r-82,60v-20,3,-25,-23,-13,-32r70,-51r-66,-46v-5,-6,-4,-28,5,-29v4,2,9,4,16,7","w":137},"\uf001":{"d":"74,-74v-6,-24,-70,8,-68,-27v0,-6,6,-20,20,-18v44,6,45,-9,42,-49v7,-40,26,-114,90,-104v48,-2,63,-1,90,30v11,25,4,14,2,44v-7,17,-54,9,-49,-7r8,-21v-5,-13,-22,-9,-43,-11v-56,-6,-63,45,-67,92v-2,21,5,23,22,22v37,-1,80,-9,113,-1v13,31,-9,82,-22,106v-13,10,-26,-6,-22,-25r11,-46v0,-3,-2,-6,-6,-6v-19,0,-47,3,-83,9v-6,1,-9,4,-8,11r12,59v-1,9,-11,30,-23,18v-18,-18,-15,-59,-19,-76","w":272},"\uf002":{"d":"43,-61v-21,4,-36,2,-39,-15v-4,-35,41,-8,34,-47v4,-59,12,-99,46,-124v11,-42,157,-47,149,13v1,7,-7,15,-13,15v-18,-7,-19,-26,-47,-23v-34,3,-65,6,-79,37v-12,27,-22,52,-21,91v13,9,31,-11,45,-4v32,-15,50,-6,94,-13v12,-30,19,-79,36,-133v1,-5,5,-8,12,-8v44,18,-18,106,-12,144v-9,22,-1,73,-16,104v2,28,-23,28,-37,16v1,-26,9,-48,11,-75v0,-6,-3,-9,-9,-9v-43,0,-83,8,-119,24v8,40,17,33,-7,56v-20,-9,-21,-19,-28,-49","w":283},"\u2021":{"d":"102,-284v16,2,42,-2,33,18v-7,15,-42,1,-38,30v3,3,31,1,30,11v4,15,-29,19,-36,24v-2,18,-4,24,-16,29r-25,-26v-25,7,-53,3,-42,-25v4,-10,70,0,51,-22v-17,4,-41,12,-39,-15v-5,-16,39,-18,44,-20v4,-2,7,-10,10,-24v19,-3,23,6,28,20","w":145},"\u2219":{"d":"57,-77v6,18,-7,21,-19,23v-34,6,-25,-40,-9,-43v18,-3,29,8,28,20","w":67},"\u201a":{"d":"25,63v-26,21,-48,-2,-22,-24v14,-12,35,-40,35,-69v3,-2,3,-11,12,-9v35,17,5,88,-25,102","w":97},"\u201e":{"d":"25,63v-26,21,-48,-2,-22,-24v11,-9,36,-41,35,-69v3,-2,4,-12,12,-9v36,14,5,89,-25,102xm84,64v-24,20,-45,-1,-21,-24v21,-20,32,-35,35,-69v3,-2,3,-11,12,-9v36,17,9,86,-26,102","w":135},"\u2030":{"d":"398,-131v58,-1,87,13,72,65v-1,30,-66,63,-99,65v-56,3,-99,-58,-62,-102v2,2,5,2,8,2v20,-16,51,-17,81,-30xm202,-279v33,0,94,-24,95,18v-7,31,-33,27,-54,55v-36,32,-71,74,-112,99v-18,18,-40,34,-51,58v-19,14,-25,37,-56,40v-17,2,-25,-29,-10,-40v15,-11,40,-37,52,-52r87,-72v-51,13,-100,6,-116,-27v1,-5,-6,-30,-9,-36v-3,-5,22,-41,27,-39v29,2,16,34,5,49v0,15,14,23,42,23v42,0,59,-31,28,-38v-17,-4,-53,3,-50,-23v0,-7,1,-12,4,-16v16,-9,36,4,49,5v0,0,23,-4,69,-4xm222,-118v33,-2,55,18,50,57v-29,36,-48,45,-96,50v-27,-5,-56,-17,-58,-51v13,-37,64,-43,104,-56xm335,-61v13,44,101,7,108,-31v-11,-3,-20,-4,-30,-4v-18,-1,-82,18,-78,35xm225,-244v-18,0,-29,-1,-46,3v7,15,6,28,0,43v15,-14,34,-30,46,-46xm164,-53v26,5,59,-10,76,-26v-17,-16,-49,2,-67,14v1,8,-8,6,-9,12","w":485},"\u00c2":{"d":"161,-217v20,53,23,124,54,170v-2,20,-34,9,-42,0v-27,-12,-78,-18,-101,-18v-26,6,-29,51,-54,63v-18,-4,-19,-30,-3,-38v5,-9,15,-16,8,-29v1,-12,23,-9,26,-19v6,-10,11,-20,20,-27r70,-121v12,-4,16,4,22,19xm82,-91v17,3,62,7,86,13v-13,-33,-13,-80,-29,-109v-15,30,-38,63,-57,96xm202,-219v-27,-6,-40,-26,-61,-37v-21,7,-39,46,-65,23v-2,-4,-3,-10,-4,-14v19,-4,43,-32,61,-43v27,6,40,22,62,37v12,8,18,17,18,25v0,6,-3,9,-11,9"},"\u00ca":{"d":"49,-160v1,-4,-10,-9,-15,-8v-15,-35,32,-30,57,-31r142,-8v2,1,30,7,40,10v-52,16,-133,17,-190,30v-7,9,-12,24,-15,47v26,10,102,-6,141,3v1,3,1,6,2,10v-36,18,-92,12,-149,21v-11,9,-16,41,-16,51v55,-1,111,-21,168,-13v15,-8,48,1,31,18v-53,16,-130,13,-198,29r-39,-8v-4,-19,17,-53,20,-76v-1,0,-7,-11,-9,-18v18,-7,22,-28,30,-57xm199,-211v-27,-6,-39,-26,-60,-37v-21,7,-40,47,-65,22v-2,-7,-2,-7,-4,-13v18,-5,44,-31,61,-43v27,6,41,22,62,37v12,9,18,17,18,25v0,6,-4,9,-12,9","w":252},"\u00c1":{"d":"161,-217v20,53,23,124,54,170v-2,20,-34,9,-42,0v-27,-12,-78,-18,-101,-18v-26,6,-29,51,-54,63v-18,-4,-19,-30,-3,-38v5,-9,15,-16,8,-29v1,-12,23,-9,26,-19v6,-10,11,-20,20,-27r70,-121v12,-4,16,4,22,19xm82,-91v17,3,62,7,86,13v-13,-33,-13,-80,-29,-109v-15,30,-38,63,-57,96xm84,-250v31,-5,83,-53,100,-31v0,5,-11,15,-35,28v-16,5,-51,28,-53,25v-14,1,-16,-11,-12,-22"},"\u00cb":{"d":"49,-160v1,-4,-10,-9,-15,-8v-15,-35,32,-30,57,-31r142,-8v2,1,30,7,40,10v-52,16,-133,17,-190,30v-7,9,-12,24,-15,47v26,10,102,-6,141,3v1,3,1,6,2,10v-36,18,-92,12,-149,21v-11,9,-17,41,-17,51v55,0,112,-21,169,-13v15,-8,48,1,31,18v-53,16,-130,13,-198,29r-39,-8v-3,-21,17,-53,20,-76v-1,0,-7,-11,-9,-18v18,-7,22,-28,30,-57xm191,-236v0,8,-4,13,-12,13v-17,0,-19,-19,-16,-34v18,-1,29,1,28,21xm95,-261v7,3,29,9,28,18v0,7,-9,17,-18,17v-18,0,-26,-25,-10,-35","w":252},"\u00c8":{"d":"49,-160v1,-4,-10,-9,-15,-8v-15,-35,32,-30,57,-31r142,-8v2,1,30,7,40,10v-52,16,-133,17,-190,30v-7,9,-12,24,-15,47v26,10,102,-6,141,3v1,3,1,6,2,10v-36,18,-92,12,-149,21v-11,9,-16,41,-16,51v55,-1,111,-21,168,-13v15,-8,48,1,31,18v-53,16,-130,13,-198,29r-39,-8v-4,-19,17,-53,20,-76v-1,0,-7,-11,-9,-18v18,-7,22,-28,30,-57xm184,-236v6,9,5,13,0,23v-28,-7,-62,-21,-100,-41v-3,-2,-3,-27,5,-23v34,11,60,25,95,41","w":252},"\u00cd":{"d":"26,-5v-9,-6,-9,-12,-9,-36v0,-71,7,-119,21,-144v8,-13,14,-20,19,-20v28,19,-7,89,-10,120v-2,21,-8,47,-14,76v-2,1,-2,0,-7,4xm6,-233v31,-6,83,-53,101,-31v2,11,-80,53,-89,53v-14,1,-14,-11,-12,-22","w":104},"\u00ce":{"d":"53,-9v-15,7,-16,-3,-16,-32v0,-71,7,-119,21,-144v8,-13,14,-20,19,-20v28,19,-7,89,-10,120v-2,21,-8,47,-14,76xm137,-209v-27,-6,-40,-26,-61,-37v-8,0,-9,4,-13,10v-11,13,-50,37,-56,0v18,-5,43,-32,61,-43v28,5,40,21,62,36v12,9,18,17,18,25v0,6,-4,9,-11,9","w":144},"\u00cf":{"d":"33,-5v-9,-6,-9,-12,-9,-36v0,-71,8,-119,22,-144v8,-13,14,-20,19,-20v27,20,-11,87,-10,120r-15,76v-1,1,-4,2,-7,4xm111,-222v0,8,-4,12,-12,12v-18,0,-19,-19,-16,-33v18,-1,29,1,28,21xm15,-247v8,2,29,9,28,17v0,21,-37,24,-36,1v0,-7,2,-13,8,-18","w":110},"\u00cc":{"d":"33,-5v-9,-6,-9,-12,-9,-36v0,-71,8,-119,22,-144v8,-13,14,-20,19,-20v27,20,-11,87,-10,120r-15,76v-1,1,-4,2,-7,4xm72,-247v7,6,55,15,36,40v-28,-7,-61,-21,-99,-41v-3,-2,-3,-27,5,-23v18,3,41,17,58,24","w":111},"\u00d3":{"d":"62,-184v78,-31,249,-50,238,74v-6,65,-102,105,-179,115v-77,-7,-152,-71,-101,-149v2,-5,24,-33,42,-40xm279,-120v14,-38,-47,-64,-85,-61v-20,-9,-41,7,-62,0v-11,7,-54,12,-66,24v0,20,-51,35,-38,66v-1,43,50,67,96,67v44,0,162,-55,155,-96xm142,-250v27,-11,47,-32,59,-14v2,11,-80,53,-89,53v-13,1,-15,-11,-12,-21v10,-5,24,-11,42,-18","w":273},"\u00d4":{"d":"62,-184v78,-31,249,-50,238,74v-6,65,-102,105,-179,115v-77,-7,-152,-71,-101,-149v2,-5,24,-33,42,-40xm279,-120v14,-38,-47,-64,-85,-61v-20,-9,-41,7,-62,0v-11,7,-54,12,-66,24v0,20,-51,35,-38,66v-1,43,50,67,96,67v44,0,162,-55,155,-96xm157,-282v17,18,52,34,54,63v-24,12,-52,-36,-53,-29r-42,34v-23,-4,-6,-31,5,-34v1,1,27,-37,36,-34","w":273},"\uf000":{"d":"231,-188v31,-74,91,-99,188,-116v28,1,6,39,1,51v-20,52,-100,91,-148,126v2,4,6,7,12,10v42,-42,181,-41,166,46v-1,8,-19,8,-28,5v-43,1,-168,42,-106,86v15,16,33,28,61,39v0,10,0,17,-6,22v-8,8,-35,26,-78,51v-52,7,-128,22,-154,-17v-23,-35,-99,-35,-117,-77v-29,-68,25,-149,75,-175v44,-23,89,5,135,13v14,-26,2,-39,-1,-64","w":461},"\u00d2":{"d":"62,-184v78,-31,249,-50,238,74v-6,65,-102,105,-179,115v-77,-7,-152,-71,-101,-149v2,-5,24,-33,42,-40xm279,-120v14,-38,-47,-64,-85,-61v-20,-9,-41,7,-62,0v-11,7,-54,12,-66,24v0,20,-51,35,-38,66v-1,43,50,67,96,67v44,0,162,-55,155,-96xm161,-262v14,10,52,13,37,41v-28,-7,-62,-21,-100,-41v-3,-3,-3,-26,5,-24v16,5,42,17,58,24","w":273},"\u00da":{"d":"281,-202v6,67,-30,121,-71,152v-3,14,-47,26,-60,39v-41,20,-110,1,-125,-26v-24,-44,-28,-84,-8,-127v12,-26,23,-38,37,-22v-2,2,-3,5,-3,10v-34,26,-30,116,5,134v22,32,86,-1,109,-8v38,-28,104,-64,97,-149v2,-10,7,-8,19,-3xm194,-265v3,-1,11,4,11,6v3,12,-81,52,-89,54v-14,0,-13,-9,-12,-22","w":262},"\u00db":{"d":"281,-202v6,67,-30,121,-71,152v-3,14,-47,26,-60,39v-41,20,-110,1,-125,-26v-24,-44,-28,-84,-8,-127v12,-26,23,-38,37,-22v-2,2,-3,5,-3,10v-34,26,-30,116,5,134v22,32,86,-1,109,-8v38,-28,104,-64,97,-149v2,-10,7,-8,19,-3xm150,-266v24,11,58,27,73,46v0,5,-3,6,-10,6v-28,2,-61,-30,-63,-25v-10,0,-57,40,-69,23v3,-10,-8,-15,8,-19v17,-1,34,-29,61,-31","w":262},"\u00d9":{"d":"281,-202v6,67,-30,121,-71,152v-3,14,-47,26,-60,39v-41,20,-110,1,-125,-26v-24,-44,-28,-84,-8,-127v12,-26,23,-38,37,-22v-2,2,-3,5,-3,10v-34,26,-30,116,5,134v22,32,86,-1,109,-8v38,-28,104,-64,97,-149v2,-10,7,-8,19,-3xm151,-243v14,10,54,14,37,41v-28,-7,-61,-22,-99,-42v-3,-2,-4,-25,4,-23v16,5,42,17,58,24","w":262},"\u0131":{"d":"43,-103v21,4,16,56,11,100v-7,2,-11,1,-20,-5v0,-7,-13,-18,-11,-25v4,-23,-3,-68,20,-70","w":80},"\u02c6":{"d":"144,-220v-29,0,-41,-27,-63,-39v-8,0,-11,5,-15,11v-17,12,-32,31,-54,13v-2,-5,-3,-9,-4,-14v20,-5,45,-33,64,-45v28,6,43,23,65,38v12,9,19,19,19,27v0,6,-4,9,-12,9","w":165},"\u02dc":{"d":"47,-300v26,-21,57,19,72,23v4,0,16,-5,36,-14v24,-10,22,-16,32,-13v3,12,-7,11,-7,23v-27,21,-48,32,-62,32v-3,2,-52,-27,-51,-31v-12,-2,-34,40,-54,33v-4,-13,-8,-18,1,-24v5,-7,16,-15,33,-29","w":186},"\u00af":{"d":"63,-295v28,-7,73,10,105,7v11,1,6,8,5,19v-37,21,-72,11,-136,11v-23,0,-31,-14,-27,-36v12,-15,40,0,53,-1","w":183},"\u02d8":{"d":"65,-269v20,-11,45,-31,74,-36v20,30,-42,40,-59,66v-5,6,-11,8,-18,8v-8,-3,-45,-32,-51,-54v5,-24,14,-13,34,1","w":158},"\u02d9":{"d":"23,-302v15,-13,32,1,32,18v1,22,-36,29,-39,4v0,0,3,-7,7,-22","w":70},"\u02da":{"d":"23,-225v-43,-24,-11,-85,41,-78v16,2,31,4,46,17v32,54,-41,86,-87,61xm33,-257v2,20,57,11,57,-6v0,-6,-11,-9,-33,-12v-14,-2,-24,13,-24,18","w":123},"\u00b8":{"d":"74,16v32,2,49,14,55,36v-3,7,-14,31,-29,33v-28,4,-57,11,-88,14v-19,-6,-13,-31,8,-33v20,-1,59,-5,73,-14v-17,-14,-68,8,-53,-37v9,-10,2,-28,24,-30v8,8,13,17,10,31","w":129},"\u02dd":{"d":"91,-249v15,-11,38,-53,57,-29v0,9,0,14,-3,23v-2,3,-20,22,-54,55v-5,5,-10,8,-16,8v-17,2,-6,-22,-7,-31v-1,0,-2,0,-4,1v-17,21,-29,31,-50,27v-5,-18,-3,-15,3,-27v23,-27,40,-46,48,-59v7,-12,31,3,29,9v-1,14,-3,24,-13,31v4,4,9,-1,10,-8","w":151},"\u02db":{"d":"82,-5v-8,12,-16,55,-21,75v0,4,2,7,7,7v6,0,22,-7,50,-20v8,0,12,7,12,20v-2,22,-6,14,-27,30v-15,12,-26,16,-30,16v-47,-8,-59,-14,-56,-75v8,-27,12,-54,25,-77v19,-21,35,15,40,24","w":138},"\u02c7":{"d":"39,-286v33,46,63,-4,96,-16v6,0,9,6,9,19v0,24,-49,46,-77,46v-32,0,-52,-28,-59,-48v0,-25,23,-17,31,-1","w":153},"\r":{"w":179}}}); 8 | --------------------------------------------------------------------------------