-</span></code><code id="L32"><span class="ln">32</span><span class="c"> <span class="s"> | </span><span class="c">// Each of the following examples create a canvas that is 320px wide by 200px high</span>
-</span></code><code id="L33"><span class="ln">33</span><span class="c"> <span class="s"> | </span><span class="c">// Canvas is created at the viewport’s <span class="d">10</span>,<span class="d">50</span> coordinate</span>
-</span></code><code id="L34"><span class="ln">34</span><span class="c"> <span class="s"> | </span><b>var</b> paper<span class="s"> = </span>Raphael(<span class="d">10</span>, <span class="d">50</span>, <span class="d">320</span>, <span class="d">200</span>);
-</span></code><code id="L35"><span class="ln">35</span><span class="c"> <span class="s"> | </span><span class="c">// Canvas is created at the top left corner of the #notepad element</span>
-</span></code><code id="L36"><span class="ln">36</span><span class="c"> <span class="s"> | </span><span class="c">// (or its top right corner <b>in</b> dir=<i>"rtl"</i> elements)</span>
-</span></code><code id="L37"><span class="ln">37</span><span class="c"> <span class="s"> | </span><b>var</b> paper<span class="s"> = </span>Raphael(document.getElementById(<i>"notepad"</i>), <span class="d">320</span>, <span class="d">200</span>);
-</span></code><code id="L38"><span class="ln">38</span><span class="c"> <span class="s"> | </span><span class="c">// Same as above</span>
-</span></code><code id="L39"><span class="ln">39</span><span class="c"> <span class="s"> | </span><b>var</b> paper<span class="s"> = </span>Raphael(<i>"notepad"</i>, <span class="d">320</span>, <span class="d">200</span>);
-</span></code><code id="L40"><span class="ln">40</span><span class="c"> <span class="s"> | </span><span class="c">// Image dump</span>
-</span></code><code id="L41"><span class="ln">41</span><span class="c"> <span class="s"> | </span><b>var</b> set<span class="s"> = </span>Raphael([<i>"notepad"</i>, <span class="d">320</span>, <span class="d">200</span>, {
-</span></code><code id="L42"><span class="ln">42</span><span class="c"> <span class="s"> | </span> type: <i>"rect"</i>,
-</span></code><code id="L43"><span class="ln">43</span><span class="c"> <span class="s"> | </span> x: <span class="d">10</span>,
-</span></code><code id="L44"><span class="ln">44</span><span class="c"> <span class="s"> | </span> y: <span class="d">10</span>,
-</span></code><code id="L45"><span class="ln">45</span><span class="c"> <span class="s"> | </span> width: <span class="d">25</span>,
-</span></code><code id="L46"><span class="ln">46</span><span class="c"> <span class="s"> | </span> height: <span class="d">25</span>,
-</span></code><code id="L47"><span class="ln">47</span><span class="c"> <span class="s"> | </span> stroke: <i>"#f00"</i>
-</span></code><code id="L48"><span class="ln">48</span><span class="c"> <span class="s"> | </span>}, {
-</span></code><code id="L49"><span class="ln">49</span><span class="c"> <span class="s"> | </span> type: <i>"text"</i>,
-</span></code><code id="L50"><span class="ln">50</span><span class="c"> <span class="s"> | </span> x: <span class="d">30</span>,
-</span></code><code id="L51"><span class="ln">51</span><span class="c"> <span class="s"> | </span> y: <span class="d">40</span>,
-</span></code><code id="L52"><span class="ln">52</span><span class="c"> <span class="s"> | </span> text: <i>"Dump"</i>
-</span></code><code id="L53"><span class="ln">53</span><span class="c"> <span class="s"> | </span>}]);
-</span></code><code id="L54"><span class="ln">54</span><span class="c"> \*/</span>
-</code><code id="L55"><span class="ln">55</span> <b>function</b> R(first) {
-</code><code id="L56"><span class="ln">56</span> <b>if</b> (R.is(first, <i>"<b>function</b>"</i>)) {
-</code><code id="L57"><span class="ln">57</span> <b>return</b> eve.on(<i>"DOMload"</i>, first);
-</code><code id="L58"><span class="ln">58</span> } <b>else</b> <b>if</b> (R.is(first, array)) {
-</code><code id="L59"><span class="ln">59</span> <b>var</b> a<span class="s"> = </span>first,
-</code><code id="L60"><span class="ln">60</span> cnv<span class="s"> = </span>create[apply](R, a.splice(<span class="d">0</span>, <span class="d">3</span><span class="s"> + </span>R.is(a[<span class="d">0</span>], nu))),
-</code><code id="L61"><span class="ln">61</span> res<span class="s"> = </span>cnv.set(),
-</code><code id="L62"><span class="ln">62</span> i<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L63"><span class="ln">63</span> ii<span class="s"> = </span>a.length,
-</code><code id="L64"><span class="ln">64</span> j;
-</code><code id="L65"><span class="ln">65</span> <b>for</b> (; i < ii; i++) {
-</code><code id="L66"><span class="ln">66</span> j<span class="s"> = </span>a[i]<span class="s"> || </span>{};
-</code><code id="L67"><span class="ln">67</span> elements[has](j.type)<span class="s"> && </span>res.push(cnv[j.type]().attr(j));
-</code><code id="L68"><span class="ln">68</span> }
-</code><code id="L69"><span class="ln">69</span> <b>return</b> res;
-</code><code id="L70"><span class="ln">70</span> }
-</code><code id="L71"><span class="ln">71</span> <b>return</b> create[apply](R, arguments);
-</code><code id="L72"><span class="ln">72</span> }
-</code><code id="L73"><span class="ln">73</span> R.version<span class="s"> = </span><i>"<span class="d">2.0</span><span class="d">.0</span>"</i>;
-</code><code id="L74"><span class="ln">74</span> <b>var</b> separator<span class="s"> = </span>/[, ]+/,
-</code><code id="L75"><span class="ln">75</span> elements<span class="s"> = </span>{circle: <span class="d">1</span>, rect: <span class="d">1</span>, path: <span class="d">1</span>, ellipse: <span class="d">1</span>, text: <span class="d">1</span>, image: <span class="d">1</span>},
-</code><code id="L76"><span class="ln">76</span> formatrg<span class="s"> = </span>/\{(\d+)\}/g,
-</code><code id="L77"><span class="ln">77</span> proto<span class="s"> = </span><i>"prototype"</i>,
-</code><code id="L78"><span class="ln">78</span> has<span class="s"> = </span><i>"hasOwnProperty"</i>,
-</code><code id="L79"><span class="ln">79</span> g<span class="s"> = </span>{
-</code><code id="L80"><span class="ln">80</span> doc: document,
-</code><code id="L81"><span class="ln">81</span> win: window
-</code><code id="L82"><span class="ln">82</span> },
-</code><code id="L83"><span class="ln">83</span> oldRaphael<span class="s"> = </span>{
-</code><code id="L84"><span class="ln">84</span> was: Object.prototype[has].call(g.win, <i>"Raphael"</i>),
-</code><code id="L85"><span class="ln">85</span> is: g.win.Raphael
-</code><code id="L86"><span class="ln">86</span> },
-</code><code id="L87"><span class="ln">87</span> Paper<span class="s"> = </span><b>function</b> () {},
-</code><code id="L88"><span class="ln">88</span> paperproto,
-</code><code id="L89"><span class="ln">89</span> appendChild<span class="s"> = </span><i>"appendChild"</i>,
-</code><code id="L90"><span class="ln">90</span> apply<span class="s"> = </span><i>"apply"</i>,
-</code><code id="L91"><span class="ln">91</span> concat<span class="s"> = </span><i>"concat"</i>,
-</code><code id="L92"><span class="ln">92</span> supportsTouch<span class="s"> = </span><i>"createTouch"</i> <b>in</b> g.doc,
-</code><code id="L93"><span class="ln">93</span> E<span class="s"> = </span><i>""</i>,
-</code><code id="L94"><span class="ln">94</span> S<span class="s"> = </span><i>" "</i>,
-</code><code id="L95"><span class="ln">95</span> Str<span class="s"> = </span>String,
-</code><code id="L96"><span class="ln">96</span> split<span class="s"> = </span><i>"split"</i>,
-</code><code id="L97"><span class="ln">97</span> events<span class="s"> = </span><i>"click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend"</i>.split(S),
-</code><code id="L98"><span class="ln">98</span> touchMap<span class="s"> = </span>{
-</code><code id="L99"><span class="ln">99</span> mousedown: <i>"touchstart"</i>,
-</code><code id="L100"><span class="ln">100</span> mousemove: <i>"touchmove"</i>,
-</code><code id="L101"><span class="ln">101</span> mouseup: <i>"touchend"</i>
-</code><code id="L102"><span class="ln">102</span> },
-</code><code id="L103"><span class="ln">103</span> lowerCase<span class="s"> = </span>Str.prototype.toLowerCase,
-</code><code id="L104"><span class="ln">104</span> math<span class="s"> = </span>Math,
-</code><code id="L105"><span class="ln">105</span> mmax<span class="s"> = </span>math.max,
-</code><code id="L106"><span class="ln">106</span> mmin<span class="s"> = </span>math.min,
-</code><code id="L107"><span class="ln">107</span> abs<span class="s"> = </span>math.abs,
-</code><code id="L108"><span class="ln">108</span> pow<span class="s"> = </span>math.pow,
-</code><code id="L109"><span class="ln">109</span> PI<span class="s"> = </span>math.PI,
-</code><code id="L110"><span class="ln">110</span> nu<span class="s"> = </span><i>"number"</i>,
-</code><code id="L111"><span class="ln">111</span> string<span class="s"> = </span><i>"string"</i>,
-</code><code id="L112"><span class="ln">112</span> array<span class="s"> = </span><i>"array"</i>,
-</code><code id="L113"><span class="ln">113</span> toString<span class="s"> = </span><i>"toString"</i>,
-</code><code id="L114"><span class="ln">114</span> fillString<span class="s"> = </span><i>"fill"</i>,
-</code><code id="L115"><span class="ln">115</span> objectToString<span class="s"> = </span>Object.prototype.toString,
-</code><code id="L116"><span class="ln">116</span> paper<span class="s"> = </span>{},
-</code><code id="L117"><span class="ln">117</span> push<span class="s"> = </span><i>"push"</i>,
-</code><code id="L118"><span class="ln">118</span> ISURL<span class="s"> = </span>/^url\([<i>'"]?([^\)]+?)['</i>"]?\)$/i,
-</code><code id="L119"><span class="ln">119</span> colourRegExp<span class="s"> = </span>/^\s*((#[a-f\d]{<span class="d">6</span>})|(#[a-f\d]{<span class="d">3</span>})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,
-</code><code id="L120"><span class="ln">120</span> isnan<span class="s"> = </span>{<i>"NaN"</i>: <span class="d">1</span>, <i>"Infinity"</i>: <span class="d">1</span>, <i>"-Infinity"</i>: <span class="d">1</span>},
-</code><code id="L121"><span class="ln">121</span> bezierrg<span class="s"> = </span>/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,
-</code><code id="L122"><span class="ln">122</span> round<span class="s"> = </span>math.round,
-</code><code id="L123"><span class="ln">123</span> setAttribute<span class="s"> = </span><i>"setAttribute"</i>,
-</code><code id="L124"><span class="ln">124</span> toFloat<span class="s"> = </span>parseFloat,
-</code><code id="L125"><span class="ln">125</span> toInt<span class="s"> = </span>parseInt,
-</code><code id="L126"><span class="ln">126</span> ms<span class="s"> = </span><i>" progid:DXImageTransform.Microsoft"</i>,
-</code><code id="L127"><span class="ln">127</span> upperCase<span class="s"> = </span>Str.prototype.toUpperCase,
-</code><code id="L128"><span class="ln">128</span> availableAttrs<span class="s"> = </span>{<i>"arrow-end"</i>: <i>"none"</i>, <i>"arrow-start"</i>: <i>"none"</i>, blur: <span class="d">0</span>, <i>"clip-rect"</i>: <i>"<span class="d">0</span> <span class="d">0</span> <span class="d">1e9</span> <span class="d">1e9</span>"</i>, cursor: <i>"<b>default</b>"</i>, cx: <span class="d">0</span>, cy: <span class="d">0</span>, fill: <i>"#fff"</i>, <i>"fill-opacity"</i>: <span class="d">1</span>, font: <i>'10px "Arial"'</i>, <i>"font-family"</i>: <i>'"Arial"'</i>, <i>"font-size"</i>: <i>"<span class="d">10</span>"</i>, <i>"font-style"</i>: <i>"normal"</i>, <i>"font-weight"</i>: <span class="d">400</span>, gradient: <span class="d">0</span>, height: <span class="d">0</span>, href: <i>"http:<span class="c">//raphaeljs.com/"</i>, opacity: <span class="d">1</span>, path: <i>"M0,<span class="d">0</span>"</i>, r: <span class="d">0</span>, rx: <span class="d">0</span>, ry: <span class="d">0</span>, src: <i>""</i>, stroke: <i>"#<span class="d">000</span>"</i>, <i>"stroke-dasharray"</i>: <i>""</i>, <i>"stroke-linecap"</i>: <i>"butt"</i>, <i>"stroke-linejoin"</i>: <i>"butt"</i>, <i>"stroke-miterlimit"</i>: <span class="d">0</span>, <i>"stroke-opacity"</i>: <span class="d">1</span>, <i>"stroke-width"</i>: <span class="d">1</span>, target: <i>"_blank"</i>, <i>"text-anchor"</i>: <i>"middle"</i>, title: <i>"Raphael"</i>, transform: <i>""</i>, width: <span class="d">0</span>, x: <span class="d">0</span>, y: <span class="d">0</span>},</span>
-</code><code id="L129"><span class="ln">129</span> availableAnimAttrs<span class="s"> = </span>{blur: nu, <i>"clip-rect"</i>: <i>"csv"</i>, cx: nu, cy: nu, fill: <i>"colour"</i>, <i>"fill-opacity"</i>: nu, <i>"font-size"</i>: nu, height: nu, opacity: nu, path: <i>"path"</i>, r: nu, rx: nu, ry: nu, stroke: <i>"colour"</i>, <i>"stroke-opacity"</i>: nu, <i>"stroke-width"</i>: nu, transform: <i>"transform"</i>, width: nu, x: nu, y: nu},
-</code><code id="L130"><span class="ln">130</span> commaSpaces<span class="s"> = </span>/\s*,\s*/,
-</code><code id="L131"><span class="ln">131</span> hsrg<span class="s"> = </span>{hs: <span class="d">1</span>, rg: <span class="d">1</span>},
-</code><code id="L132"><span class="ln">132</span> p2s<span class="s"> = </span>/,?([achlmqrstvxz]),?/gi,
-</code><code id="L133"><span class="ln">133</span> pathCommand<span class="s"> = </span>/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,
-</code><code id="L134"><span class="ln">134</span> tCommand<span class="s"> = </span>/([rstm])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,
-</code><code id="L135"><span class="ln">135</span> pathValues<span class="s"> = </span>/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,
-</code><code id="L136"><span class="ln">136</span> radial_gradient<span class="s"> = </span>/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,
-</code><code id="L137"><span class="ln">137</span> sortByKey<span class="s"> = </span><b>function</b> (a, b) {
-</code><code id="L138"><span class="ln">138</span> <b>return</b> a.key<span class="s"> - </span>b.key;
-</code><code id="L139"><span class="ln">139</span> },
-</code><code id="L140"><span class="ln">140</span> sortByNumber<span class="s"> = </span><b>function</b> (a, b) {
-</code><code id="L141"><span class="ln">141</span> <b>return</b> a<span class="s"> - </span>b;
-</code><code id="L142"><span class="ln">142</span> },
-</code><code id="L143"><span class="ln">143</span> fun<span class="s"> = </span><b>function</b> () {},
-</code><code id="L144"><span class="ln">144</span> pipe<span class="s"> = </span><b>function</b> (x) {
-</code><code id="L145"><span class="ln">145</span> <b>return</b> x;
-</code><code id="L146"><span class="ln">146</span> },
-</code><code id="L147"><span class="ln">147</span> rectPath<span class="s"> = </span><b>function</b> (x, y, w, h, r) {
-</code><code id="L148"><span class="ln">148</span> <b>if</b> (r) {
-</code><code id="L149"><span class="ln">149</span> <b>return</b> [[<i>"M"</i>, x<span class="s"> + </span>r, y], [<i>"l"</i>, w<span class="s"> - </span>r<span class="s"> * </span><span class="d">2</span>, <span class="d">0</span>], [<i>"a"</i>, r, r, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, r, r], [<i>"l"</i>, <span class="d">0</span>, h<span class="s"> - </span>r<span class="s"> * </span><span class="d">2</span>], [<i>"a"</i>, r, r, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, -r, r], [<i>"l"</i>, r<span class="s"> * </span><span class="d">2</span><span class="s"> - </span>w, <span class="d">0</span>], [<i>"a"</i>, r, r, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, -r, -r], [<i>"l"</i>, <span class="d">0</span>, r<span class="s"> * </span><span class="d">2</span><span class="s"> - </span>h], [<i>"a"</i>, r, r, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, r, -r], [<i>"z"</i>]];
-</code><code id="L150"><span class="ln">150</span> }
-</code><code id="L151"><span class="ln">151</span> <b>return</b> [[<i>"M"</i>, x, y], [<i>"l"</i>, w, <span class="d">0</span>], [<i>"l"</i>, <span class="d">0</span>, h], [<i>"l"</i>, -w, <span class="d">0</span>], [<i>"z"</i>]];
-</code><code id="L152"><span class="ln">152</span> },
-</code><code id="L153"><span class="ln">153</span> ellipsePath<span class="s"> = </span><b>function</b> (x, y, rx, ry) {
-</code><code id="L154"><span class="ln">154</span> <b>if</b> (ry<span class="s"> == </span><b>null</b>) {
-</code><code id="L155"><span class="ln">155</span> ry<span class="s"> = </span>rx;
-</code><code id="L156"><span class="ln">156</span> }
-</code><code id="L157"><span class="ln">157</span> <b>return</b> [[<i>"M"</i>, x, y], [<i>"m"</i>, <span class="d">0</span>, -ry], [<i>"a"</i>, rx, ry, <span class="d">0</span>, <span class="d">1</span>, <span class="d">1</span>, <span class="d">0</span>, <span class="d">2</span><span class="s"> * </span>ry], [<i>"a"</i>, rx, ry, <span class="d">0</span>, <span class="d">1</span>, <span class="d">1</span>, <span class="d">0</span>, -<span class="d">2</span><span class="s"> * </span>ry], [<i>"z"</i>]];
-</code><code id="L158"><span class="ln">158</span> },
-</code><code id="L159"><span class="ln">159</span> getPath<span class="s"> = </span>{
-</code><code id="L160"><span class="ln">160</span> path: <b>function</b> (el) {
-</code><code id="L161"><span class="ln">161</span> <b>return</b> el.attr(<i>"path"</i>);
-</code><code id="L162"><span class="ln">162</span> },
-</code><code id="L163"><span class="ln">163</span> circle: <b>function</b> (el) {
-</code><code id="L164"><span class="ln">164</span> <b>var</b> a<span class="s"> = </span>el.attrs;
-</code><code id="L165"><span class="ln">165</span> <b>return</b> ellipsePath(a.cx, a.cy, a.r);
-</code><code id="L166"><span class="ln">166</span> },
-</code><code id="L167"><span class="ln">167</span> ellipse: <b>function</b> (el) {
-</code><code id="L168"><span class="ln">168</span> <b>var</b> a<span class="s"> = </span>el.attrs;
-</code><code id="L169"><span class="ln">169</span> <b>return</b> ellipsePath(a.cx, a.cy, a.rx, a.ry);
-</code><code id="L170"><span class="ln">170</span> },
-</code><code id="L171"><span class="ln">171</span> rect: <b>function</b> (el) {
-</code><code id="L172"><span class="ln">172</span> <b>var</b> a<span class="s"> = </span>el.attrs;
-</code><code id="L173"><span class="ln">173</span> <b>return</b> rectPath(a.x, a.y, a.width, a.height, a.r);
-</code><code id="L174"><span class="ln">174</span> },
-</code><code id="L175"><span class="ln">175</span> image: <b>function</b> (el) {
-</code><code id="L176"><span class="ln">176</span> <b>var</b> a<span class="s"> = </span>el.attrs;
-</code><code id="L177"><span class="ln">177</span> <b>return</b> rectPath(a.x, a.y, a.width, a.height);
-</code><code id="L178"><span class="ln">178</span> },
-</code><code id="L179"><span class="ln">179</span> text: <b>function</b> (el) {
-</code><code id="L180"><span class="ln">180</span> <b>var</b> bbox<span class="s"> = </span>el._getBBox();
-</code><code id="L181"><span class="ln">181</span> <b>return</b> rectPath(bbox.x, bbox.y, bbox.width, bbox.height);
-</code><code id="L182"><span class="ln">182</span> }
-</code><code id="L183"><span class="ln">183</span> },
-</code><code id="L184"><span class="ln">184</span> mapPath<span class="s"> = </span><b>function</b> (path, matrix) {
-</code><code id="L185"><span class="ln">185</span> <b>if</b> (!matrix) {
-</code><code id="L186"><span class="ln">186</span> <b>return</b> path;
-</code><code id="L187"><span class="ln">187</span> }
-</code><code id="L188"><span class="ln">188</span> <b>var</b> x, y, i, j, pathi;
-</code><code id="L189"><span class="ln">189</span> path<span class="s"> = </span>path2curve(path);
-</code><code id="L190"><span class="ln">190</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>path.length; i < ii; i++) {
-</code><code id="L191"><span class="ln">191</span> pathi<span class="s"> = </span>path[i];
-</code><code id="L192"><span class="ln">192</span> <b>for</b> (j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>pathi.length; j < jj; j += <span class="d">2</span>) {
-</code><code id="L193"><span class="ln">193</span> x<span class="s"> = </span>matrix.x(pathi[j], pathi[j<span class="s"> + </span><span class="d">1</span>]);
-</code><code id="L194"><span class="ln">194</span> y<span class="s"> = </span>matrix.y(pathi[j], pathi[j<span class="s"> + </span><span class="d">1</span>]);
-</code><code id="L195"><span class="ln">195</span> pathi[j]<span class="s"> = </span>x;
-</code><code id="L196"><span class="ln">196</span> pathi[j<span class="s"> + </span><span class="d">1</span>]<span class="s"> = </span>y;
-</code><code id="L197"><span class="ln">197</span> }
-</code><code id="L198"><span class="ln">198</span> }
-</code><code id="L199"><span class="ln">199</span> <b>return</b> path;
-</code><code id="L200"><span class="ln">200</span> };
-</code><code id="L201"><span class="ln">201</span>
-</code><code id="L202"><span class="ln">202</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L203"><span class="ln">203</span><span class="c"> <span class="s"> * </span>Raphael.type
-</span></code><code id="L204"><span class="ln">204</span><span class="c"> [ property (string) ]
-</span></code><code id="L205"><span class="ln">205</span><span class="c"> **
-</span></code><code id="L206"><span class="ln">206</span><span class="c"> <span class="s"> * </span>Can be “SVG”, “VML” or empty, depending on browser support.
-</span></code><code id="L207"><span class="ln">207</span><span class="c"> \*/</span>
-</code><code id="L208"><span class="ln">208</span> R.type<span class="s"> = </span>(g.win.SVGAngle<span class="s"> || </span>g.doc.implementation.hasFeature(<i>"http:<span class="c">//www.w3.org/TR/SVG11/feature#BasicStructure"</i>, <i>"<span class="d">1.1</span>"</i>) ? <i>"SVG"</i> : <i>"VML"</i>);</span>
-</code><code id="L209"><span class="ln">209</span> <b>if</b> (R.type<span class="s"> == </span><i>"VML"</i>) {
-</code><code id="L210"><span class="ln">210</span> <b>var</b> d<span class="s"> = </span>g.doc.createElement(<i>"div"</i>),
-</code><code id="L211"><span class="ln">211</span> b;
-</code><code id="L212"><span class="ln">212</span> d.innerHTML<span class="s"> = </span><i>'<v:shape adj="<span class="d">1</span>"/>'</i>;
-</code><code id="L213"><span class="ln">213</span> b<span class="s"> = </span>d.firstChild;
-</code><code id="L214"><span class="ln">214</span> b.style.behavior<span class="s"> = </span><i>"url(#<b>default</b>#VML)"</i>;
-</code><code id="L215"><span class="ln">215</span> <b>if</b> (!(b<span class="s"> && </span><b>typeof</b> b.adj<span class="s"> == </span><i>"object"</i>)) {
-</code><code id="L216"><span class="ln">216</span> <b>return</b> R.type<span class="s"> = </span>E;
-</code><code id="L217"><span class="ln">217</span> }
-</code><code id="L218"><span class="ln">218</span> d<span class="s"> = </span><b>null</b>;
-</code><code id="L219"><span class="ln">219</span> }
-</code><code id="L220"><span class="ln">220</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L221"><span class="ln">221</span><span class="c"> <span class="s"> * </span>Raphael.svg
-</span></code><code id="L222"><span class="ln">222</span><span class="c"> [ property (<b>boolean</b>) ]
-</span></code><code id="L223"><span class="ln">223</span><span class="c"> **
-</span></code><code id="L224"><span class="ln">224</span><span class="c"> <span class="s"> * </span>`<b>true</b>` <b>if</b> browser supports SVG.
-</span></code><code id="L225"><span class="ln">225</span><span class="c"> \*/</span>
-</code><code id="L226"><span class="ln">226</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L227"><span class="ln">227</span><span class="c"> <span class="s"> * </span>Raphael.vml
-</span></code><code id="L228"><span class="ln">228</span><span class="c"> [ property (<b>boolean</b>) ]
-</span></code><code id="L229"><span class="ln">229</span><span class="c"> **
-</span></code><code id="L230"><span class="ln">230</span><span class="c"> <span class="s"> * </span>`<b>true</b>` <b>if</b> browser supports VML.
-</span></code><code id="L231"><span class="ln">231</span><span class="c"> \*/</span>
-</code><code id="L232"><span class="ln">232</span> R.svg<span class="s"> = </span>!(R.vml<span class="s"> = </span>R.type<span class="s"> == </span><i>"VML"</i>);
-</code><code id="L233"><span class="ln">233</span> paperproto<span class="s"> = </span>Paper.prototype<span class="s"> = </span>R.prototype;
-</code><code id="L234"><span class="ln">234</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L235"><span class="ln">235</span><span class="c"> <span class="s"> * </span>Paper.customAttributes
-</span></code><code id="L236"><span class="ln">236</span><span class="c"> [ property (object) ]
-</span></code><code id="L237"><span class="ln">237</span><span class="c"> **
-</span></code><code id="L238"><span class="ln">238</span><span class="c"> <span class="s"> * </span>If you have a set of attributes that you would like to represent
-</span></code><code id="L239"><span class="ln">239</span><span class="c"> <span class="s"> * </span>as a <b>function</b> of some number you can <b>do</b> it easily <b>with</b> custom attributes:
-</span></code><code id="L240"><span class="ln">240</span><span class="c"> > Usage
-</span></code><code id="L241"><span class="ln">241</span><span class="c"> <span class="s"> | </span>paper.customAttributes.hue<span class="s"> = </span><b>function</b> (num) {
-</span></code><code id="L242"><span class="ln">242</span><span class="c"> <span class="s"> | </span> num<span class="s"> = </span>num<span class="s"> % </span><span class="d">1</span>;
-</span></code><code id="L243"><span class="ln">243</span><span class="c"> <span class="s"> | </span> <b>return</b> {fill: <i>"hsb("</i><span class="s"> + </span>num<span class="s"> + </span><i>", <span class="d">.75</span>, <span class="d">1</span>)"</i>};
-</span></code><code id="L244"><span class="ln">244</span><span class="c"> <span class="s"> | </span>};
-</span></code><code id="L245"><span class="ln">245</span><span class="c"> <span class="s"> | </span><span class="c">// Custom attribute “hue” will change fill</span>
-</span></code><code id="L246"><span class="ln">246</span><span class="c"> <span class="s"> | </span><span class="c">// to be given hue <b>with</b> fixed saturation and brightness.</span>
-</span></code><code id="L247"><span class="ln">247</span><span class="c"> <span class="s"> | </span><span class="c">// Now you can use it like <b>this</b>:</span>
-</span></code><code id="L248"><span class="ln">248</span><span class="c"> <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.circle(<span class="d">10</span>, <span class="d">10</span>, <span class="d">10</span>).attr({hue: <span class="d">.45</span>});
-</span></code><code id="L249"><span class="ln">249</span><span class="c"> <span class="s"> | </span><span class="c">// or even like <b>this</b>:</span>
-</span></code><code id="L250"><span class="ln">250</span><span class="c"> <span class="s"> | </span>c.animate({hue: <span class="d">1</span>}, <span class="d">1e3</span>);
-</span></code><code id="L251"><span class="ln">251</span><span class="c"> <span class="s"> | </span>
-</span></code><code id="L252"><span class="ln">252</span><span class="c"> <span class="s"> | </span><span class="c">// You could also create custom attribute</span>
-</span></code><code id="L253"><span class="ln">253</span><span class="c"> <span class="s"> | </span><span class="c">// <b>with</b> multiple parameters:</span>
-</span></code><code id="L254"><span class="ln">254</span><span class="c"> <span class="s"> | </span>paper.customAttributes.hsb<span class="s"> = </span><b>function</b> (h, s, b) {
-</span></code><code id="L255"><span class="ln">255</span><span class="c"> <span class="s"> | </span> <b>return</b> {fill: <i>"hsb("</i><span class="s"> + </span>[h, s, b].join(<i>","</i>)<span class="s"> + </span><i>")"</i>};
-</span></code><code id="L256"><span class="ln">256</span><span class="c"> <span class="s"> | </span>};
-</span></code><code id="L257"><span class="ln">257</span><span class="c"> <span class="s"> | </span>c.attr({hsb: <i>"<span class="d">.5</span> <span class="d">.8</span> <span class="d">1</span>"</i>});
-</span></code><code id="L258"><span class="ln">258</span><span class="c"> <span class="s"> | </span>c.animate({hsb: <i>"<span class="d">1</span> <span class="d">0</span> <span class="d">.5</span>"</i>}, <span class="d">1e3</span>);
-</span></code><code id="L259"><span class="ln">259</span><span class="c"> \*/</span>
-</code><code id="L260"><span class="ln">260</span> paperproto.customAttributes<span class="s"> = </span>{};
-</code><code id="L261"><span class="ln">261</span> R._id<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L262"><span class="ln">262</span> R._oid<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L263"><span class="ln">263</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L264"><span class="ln">264</span><span class="c"> <span class="s"> * </span>Raphael.fn
-</span></code><code id="L265"><span class="ln">265</span><span class="c"> [ property (object) ]
-</span></code><code id="L266"><span class="ln">266</span><span class="c"> **
-</span></code><code id="L267"><span class="ln">267</span><span class="c"> <span class="s"> * </span>You can add your own method to the canvas. For example <b>if</b> you want to draw pie chart,
-</span></code><code id="L268"><span class="ln">268</span><span class="c"> <span class="s"> * </span>you can create your own pie chart <b>function</b> and ship it as a Raphaël plugin. To <b>do</b> <b>this</b>
-</span></code><code id="L269"><span class="ln">269</span><span class="c"> <span class="s"> * </span>you need to extend `Raphael.fn` object. Please note that you can create your own namespaces
-</span></code><code id="L270"><span class="ln">270</span><span class="c"> <span class="s"> * </span>inside `fn` object. Methods will be run <b>in</b> context of canvas anyway. You should alter `fn`
-</span></code><code id="L271"><span class="ln">271</span><span class="c"> <span class="s"> * </span>object before Raphaël instance was created, otherwise it will take no effect.
-</span></code><code id="L272"><span class="ln">272</span><span class="c"> > Usage
-</span></code><code id="L273"><span class="ln">273</span><span class="c"> <span class="s"> | </span>Raphael.fn.arrow<span class="s"> = </span><b>function</b> (x1, y1, x2, y2, size) {
-</span></code><code id="L274"><span class="ln">274</span><span class="c"> <span class="s"> | </span> <b>return</b> <b>this</b>.path( ... );
-</span></code><code id="L275"><span class="ln">275</span><span class="c"> <span class="s"> | </span>};
-</span></code><code id="L276"><span class="ln">276</span><span class="c"> <span class="s"> | </span><span class="c">// or create namespace</span>
-</span></code><code id="L277"><span class="ln">277</span><span class="c"> <span class="s"> | </span>Raphael.fn.mystuff<span class="s"> = </span>{
-</span></code><code id="L278"><span class="ln">278</span><span class="c"> <span class="s"> | </span> arrow: <b>function</b> () {…},
-</span></code><code id="L279"><span class="ln">279</span><span class="c"> <span class="s"> | </span> star: <b>function</b> () {…},
-</span></code><code id="L280"><span class="ln">280</span><span class="c"> <span class="s"> | </span> <span class="c">// etc…</span>
-</span></code><code id="L281"><span class="ln">281</span><span class="c"> <span class="s"> | </span>};
-</span></code><code id="L282"><span class="ln">282</span><span class="c"> <span class="s"> | </span><b>var</b> paper<span class="s"> = </span>Raphael(<span class="d">10</span>, <span class="d">10</span>, <span class="d">630</span>, <span class="d">480</span>);
-</span></code><code id="L283"><span class="ln">283</span><span class="c"> <span class="s"> | </span><span class="c">// then use it</span>
-</span></code><code id="L284"><span class="ln">284</span><span class="c"> <span class="s"> | </span>paper.arrow(<span class="d">10</span>, <span class="d">10</span>, <span class="d">30</span>, <span class="d">30</span>, <span class="d">5</span>).attr({fill: <i>"#f00"</i>});
-</span></code><code id="L285"><span class="ln">285</span><span class="c"> <span class="s"> | </span>paper.mystuff.arrow();
-</span></code><code id="L286"><span class="ln">286</span><span class="c"> <span class="s"> | </span>paper.mystuff.star();
-</span></code><code id="L287"><span class="ln">287</span><span class="c"> \*/</span>
-</code><code id="L288"><span class="ln">288</span> R.fn<span class="s"> = </span>{};
-</code><code id="L289"><span class="ln">289</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L290"><span class="ln">290</span><span class="c"> <span class="s"> * </span>Raphael.is
-</span></code><code id="L291"><span class="ln">291</span><span class="c"> [ method ]
-</span></code><code id="L292"><span class="ln">292</span><span class="c"> **
-</span></code><code id="L293"><span class="ln">293</span><span class="c"> <span class="s"> * </span>Handfull replacement <b>for</b> `<b>typeof</b>` operator.
-</span></code><code id="L294"><span class="ln">294</span><span class="c"> > Parameters
-</span></code><code id="L295"><span class="ln">295</span><span class="c"> <span class="s"> - </span>o (…) any object or primitive
-</span></code><code id="L296"><span class="ln">296</span><span class="c"> <span class="s"> - </span>type (string) name of the type, i.e. “string”, “<b>function</b>”, “number”, etc.
-</span></code><code id="L297"><span class="ln">297</span><span class="c"> <span class="s"> = </span>(<b>boolean</b>) is given value is of given type
-</span></code><code id="L298"><span class="ln">298</span><span class="c"> \*/</span>
-</code><code id="L299"><span class="ln">299</span> R.is<span class="s"> = </span><b>function</b> (o, type) {
-</code><code id="L300"><span class="ln">300</span> type<span class="s"> = </span>lowerCase.call(type);
-</code><code id="L301"><span class="ln">301</span> <b>if</b> (type<span class="s"> == </span><i>"finite"</i>) {
-</code><code id="L302"><span class="ln">302</span> <b>return</b> !isnan[has](+o);
-</code><code id="L303"><span class="ln">303</span> }
-</code><code id="L304"><span class="ln">304</span> <b>return</b> (type<span class="s"> == </span><i>"<b>null</b>"</i><span class="s"> && </span>o<span class="s"> === </span><b>null</b>) ||
-</code><code id="L305"><span class="ln">305</span> (type<span class="s"> == </span><b>typeof</b> o) ||
-</code><code id="L306"><span class="ln">306</span> (type<span class="s"> == </span><i>"object"</i><span class="s"> && </span>o<span class="s"> === </span>Object(o)) ||
-</code><code id="L307"><span class="ln">307</span> (type<span class="s"> == </span><i>"array"</i><span class="s"> && </span>Array.isArray<span class="s"> && </span>Array.isArray(o)) ||
-</code><code id="L308"><span class="ln">308</span> objectToString.call(o).slice(<span class="d">8</span>, -<span class="d">1</span>).toLowerCase()<span class="s"> == </span>type;
-</code><code id="L309"><span class="ln">309</span> };
-</code><code id="L310"><span class="ln">310</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L311"><span class="ln">311</span><span class="c"> <span class="s"> * </span>Raphael.angle
-</span></code><code id="L312"><span class="ln">312</span><span class="c"> [ method ]
-</span></code><code id="L313"><span class="ln">313</span><span class="c"> **
-</span></code><code id="L314"><span class="ln">314</span><span class="c"> <span class="s"> * </span>Returns angle between two or three points
-</span></code><code id="L315"><span class="ln">315</span><span class="c"> > Parameters
-</span></code><code id="L316"><span class="ln">316</span><span class="c"> <span class="s"> - </span>x1 (number) x coord of first point
-</span></code><code id="L317"><span class="ln">317</span><span class="c"> <span class="s"> - </span>y1 (number) y coord of first point
-</span></code><code id="L318"><span class="ln">318</span><span class="c"> <span class="s"> - </span>x2 (number) x coord of second point
-</span></code><code id="L319"><span class="ln">319</span><span class="c"> <span class="s"> - </span>y2 (number) y coord of second point
-</span></code><code id="L320"><span class="ln">320</span><span class="c"> <span class="s"> - </span>x3 (number) #optional x coord of third point
-</span></code><code id="L321"><span class="ln">321</span><span class="c"> <span class="s"> - </span>y3 (number) #optional y coord of third point
-</span></code><code id="L322"><span class="ln">322</span><span class="c"> <span class="s"> = </span>(number) angle <b>in</b> degrees.
-</span></code><code id="L323"><span class="ln">323</span><span class="c"> \*/</span>
-</code><code id="L324"><span class="ln">324</span> R.angle<span class="s"> = </span><b>function</b> (x1, y1, x2, y2, x3, y3) {
-</code><code id="L325"><span class="ln">325</span> <b>if</b> (x3<span class="s"> == </span><b>null</b>) {
-</code><code id="L326"><span class="ln">326</span> <b>var</b> x<span class="s"> = </span>x1<span class="s"> - </span>x2,
-</code><code id="L327"><span class="ln">327</span> y<span class="s"> = </span>y1<span class="s"> - </span>y2;
-</code><code id="L328"><span class="ln">328</span> <b>if</b> (!x<span class="s"> && </span>!y) {
-</code><code id="L329"><span class="ln">329</span> <b>return</b> <span class="d">0</span>;
-</code><code id="L330"><span class="ln">330</span> }
-</code><code id="L331"><span class="ln">331</span> <b>return</b> (<span class="d">180</span><span class="s"> + </span>math.atan2(-y, -x)<span class="s"> * </span><span class="d">180</span><span class="s"> / </span>PI<span class="s"> + </span><span class="d">360</span>)<span class="s"> % </span><span class="d">360</span>;
-</code><code id="L332"><span class="ln">332</span> } <b>else</b> {
-</code><code id="L333"><span class="ln">333</span> <b>return</b> R.angle(x1, y1, x3, y3)<span class="s"> - </span>R.angle(x2, y2, x3, y3);
-</code><code id="L334"><span class="ln">334</span> }
-</code><code id="L335"><span class="ln">335</span> };
-</code><code id="L336"><span class="ln">336</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L337"><span class="ln">337</span><span class="c"> <span class="s"> * </span>Raphael.rad
-</span></code><code id="L338"><span class="ln">338</span><span class="c"> [ method ]
-</span></code><code id="L339"><span class="ln">339</span><span class="c"> **
-</span></code><code id="L340"><span class="ln">340</span><span class="c"> <span class="s"> * </span>Transform angle to radians
-</span></code><code id="L341"><span class="ln">341</span><span class="c"> > Parameters
-</span></code><code id="L342"><span class="ln">342</span><span class="c"> <span class="s"> - </span>deg (number) angle <b>in</b> degrees
-</span></code><code id="L343"><span class="ln">343</span><span class="c"> <span class="s"> = </span>(number) angle <b>in</b> radians.
-</span></code><code id="L344"><span class="ln">344</span><span class="c"> \*/</span>
-</code><code id="L345"><span class="ln">345</span> R.rad<span class="s"> = </span><b>function</b> (deg) {
-</code><code id="L346"><span class="ln">346</span> <b>return</b> deg<span class="s"> % </span><span class="d">360</span><span class="s"> * </span>PI<span class="s"> / </span><span class="d">180</span>;
-</code><code id="L347"><span class="ln">347</span> };
-</code><code id="L348"><span class="ln">348</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L349"><span class="ln">349</span><span class="c"> <span class="s"> * </span>Raphael.deg
-</span></code><code id="L350"><span class="ln">350</span><span class="c"> [ method ]
-</span></code><code id="L351"><span class="ln">351</span><span class="c"> **
-</span></code><code id="L352"><span class="ln">352</span><span class="c"> <span class="s"> * </span>Transform angle to degrees
-</span></code><code id="L353"><span class="ln">353</span><span class="c"> > Parameters
-</span></code><code id="L354"><span class="ln">354</span><span class="c"> <span class="s"> - </span>deg (number) angle <b>in</b> radians
-</span></code><code id="L355"><span class="ln">355</span><span class="c"> <span class="s"> = </span>(number) angle <b>in</b> degrees.
-</span></code><code id="L356"><span class="ln">356</span><span class="c"> \*/</span>
-</code><code id="L357"><span class="ln">357</span> R.deg<span class="s"> = </span><b>function</b> (rad) {
-</code><code id="L358"><span class="ln">358</span> <b>return</b> rad<span class="s"> * </span><span class="d">180</span><span class="s"> / </span>PI<span class="s"> % </span><span class="d">360</span>;
-</code><code id="L359"><span class="ln">359</span> };
-</code><code id="L360"><span class="ln">360</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L361"><span class="ln">361</span><span class="c"> <span class="s"> * </span>Raphael.snapTo
-</span></code><code id="L362"><span class="ln">362</span><span class="c"> [ method ]
-</span></code><code id="L363"><span class="ln">363</span><span class="c"> **
-</span></code><code id="L364"><span class="ln">364</span><span class="c"> <span class="s"> * </span>Snaps given value to given grid.
-</span></code><code id="L365"><span class="ln">365</span><span class="c"> > Parameters
-</span></code><code id="L366"><span class="ln">366</span><span class="c"> <span class="s"> - </span>values (array|number) given array of values or step of the grid
-</span></code><code id="L367"><span class="ln">367</span><span class="c"> <span class="s"> - </span>value (number) value to adjust
-</span></code><code id="L368"><span class="ln">368</span><span class="c"> <span class="s"> - </span>tolerance (number) #optional tolerance <b>for</b> snapping. Default is `<span class="d">10</span>`.
-</span></code><code id="L369"><span class="ln">369</span><span class="c"> <span class="s"> = </span>(number) adjusted value.
-</span></code><code id="L370"><span class="ln">370</span><span class="c"> \*/</span>
-</code><code id="L371"><span class="ln">371</span> R.snapTo<span class="s"> = </span><b>function</b> (values, value, tolerance) {
-</code><code id="L372"><span class="ln">372</span> tolerance<span class="s"> = </span>R.is(tolerance, <i>"finite"</i>) ? tolerance : <span class="d">10</span>;
-</code><code id="L373"><span class="ln">373</span> <b>if</b> (R.is(values, array)) {
-</code><code id="L374"><span class="ln">374</span> <b>var</b> i<span class="s"> = </span>values.length;
-</code><code id="L375"><span class="ln">375</span> <b>while</b> (i--) <b>if</b> (abs(values[i]<span class="s"> - </span>value) <= tolerance) {
-</code><code id="L376"><span class="ln">376</span> <b>return</b> values[i];
-</code><code id="L377"><span class="ln">377</span> }
-</code><code id="L378"><span class="ln">378</span> } <b>else</b> {
-</code><code id="L379"><span class="ln">379</span> values<span class="s"> = </span>+values;
-</code><code id="L380"><span class="ln">380</span> <b>var</b> rem<span class="s"> = </span>value<span class="s"> % </span>values;
-</code><code id="L381"><span class="ln">381</span> <b>if</b> (rem < tolerance) {
-</code><code id="L382"><span class="ln">382</span> <b>return</b> value<span class="s"> - </span>rem;
-</code><code id="L383"><span class="ln">383</span> }
-</code><code id="L384"><span class="ln">384</span> <b>if</b> (rem > values<span class="s"> - </span>tolerance) {
-</code><code id="L385"><span class="ln">385</span> <b>return</b> value<span class="s"> - </span>rem<span class="s"> + </span>values;
-</code><code id="L386"><span class="ln">386</span> }
-</code><code id="L387"><span class="ln">387</span> }
-</code><code id="L388"><span class="ln">388</span> <b>return</b> value;
-</code><code id="L389"><span class="ln">389</span> };
-</code><code id="L390"><span class="ln">390</span>
-</code><code id="L391"><span class="ln">391</span> <b>var</b> createUUID<span class="s"> = </span>(<b>function</b> (uuidRegEx, uuidReplacer) {
-</code><code id="L392"><span class="ln">392</span> <b>return</b> <b>function</b> () {
-</code><code id="L393"><span class="ln">393</span> <b>return</b> <i>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"</i>.replace(uuidRegEx, uuidReplacer).toUpperCase();
-</code><code id="L394"><span class="ln">394</span> };
-</code><code id="L395"><span class="ln">395</span> })(/[xy]/g, <b>function</b> (c) {
-</code><code id="L396"><span class="ln">396</span> <b>var</b> r<span class="s"> = </span>math.random()<span class="s"> * </span><span class="d">16</span><span class="s"> | </span><span class="d">0</span>,
-</code><code id="L397"><span class="ln">397</span> v<span class="s"> = </span>c<span class="s"> == </span><i>"x"</i> ? r : (r<span class="s"> & </span><span class="d">3</span><span class="s"> | </span><span class="d">8</span>);
-</code><code id="L398"><span class="ln">398</span> <b>return</b> v.toString(<span class="d">16</span>);
-</code><code id="L399"><span class="ln">399</span> });
-</code><code id="L400"><span class="ln">400</span>
-</code><code id="L401"><span class="ln">401</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L402"><span class="ln">402</span><span class="c"> <span class="s"> * </span>Raphael.setWindow
-</span></code><code id="L403"><span class="ln">403</span><span class="c"> [ method ]
-</span></code><code id="L404"><span class="ln">404</span><span class="c"> **
-</span></code><code id="L405"><span class="ln">405</span><span class="c"> <span class="s"> * </span>Used when you need to draw <b>in</b> `<iframe>`. Switched window to the iframe one.
-</span></code><code id="L406"><span class="ln">406</span><span class="c"> > Parameters
-</span></code><code id="L407"><span class="ln">407</span><span class="c"> <span class="s"> - </span>newwin (window) <b>new</b> window object
-</span></code><code id="L408"><span class="ln">408</span><span class="c"> \*/</span>
-</code><code id="L409"><span class="ln">409</span> R.setWindow<span class="s"> = </span><b>function</b> (newwin) {
-</code><code id="L410"><span class="ln">410</span> eve(<i>"setWindow"</i>, R, g.win, newwin);
-</code><code id="L411"><span class="ln">411</span> g.win<span class="s"> = </span>newwin;
-</code><code id="L412"><span class="ln">412</span> g.doc<span class="s"> = </span>g.win.document;
-</code><code id="L413"><span class="ln">413</span> <b>if</b> (initWin) {
-</code><code id="L414"><span class="ln">414</span> initWin(g.win);
-</code><code id="L415"><span class="ln">415</span> }
-</code><code id="L416"><span class="ln">416</span> };
-</code><code id="L417"><span class="ln">417</span> <span class="c">// colour utilities</span>
-</code><code id="L418"><span class="ln">418</span> <b>var</b> toHex<span class="s"> = </span><b>function</b> (color) {
-</code><code id="L419"><span class="ln">419</span> <b>if</b> (R.vml) {
-</code><code id="L420"><span class="ln">420</span> <span class="c">// http://dean.edwards.name/weblog/<span class="d">2009</span>/<span class="d">10</span>/convert-any-colour-value-to-hex-<b>in</b>-msie/</span>
-</code><code id="L421"><span class="ln">421</span> <b>var</b> trim<span class="s"> = </span>/^\s+|\s+$/g;
-</code><code id="L422"><span class="ln">422</span> <b>var</b> bod;
-</code><code id="L423"><span class="ln">423</span> <b>try</b> {
-</code><code id="L424"><span class="ln">424</span> <b>var</b> docum<span class="s"> = </span><b>new</b> ActiveXObject(<i>"htmlfile"</i>);
-</code><code id="L425"><span class="ln">425</span> docum.write(<i>"<body>"</i>);
-</code><code id="L426"><span class="ln">426</span> docum.close();
-</code><code id="L427"><span class="ln">427</span> bod<span class="s"> = </span>docum.body;
-</code><code id="L428"><span class="ln">428</span> } <b>catch</b>(e) {
-</code><code id="L429"><span class="ln">429</span> bod<span class="s"> = </span>createPopup().document.body;
-</code><code id="L430"><span class="ln">430</span> }
-</code><code id="L431"><span class="ln">431</span> <b>var</b> range<span class="s"> = </span>bod.createTextRange();
-</code><code id="L432"><span class="ln">432</span> toHex<span class="s"> = </span>cacher(<b>function</b> (color) {
-</code><code id="L433"><span class="ln">433</span> <b>try</b> {
-</code><code id="L434"><span class="ln">434</span> bod.style.color<span class="s"> = </span>Str(color).replace(trim, E);
-</code><code id="L435"><span class="ln">435</span> <b>var</b> value<span class="s"> = </span>range.queryCommandValue(<i>"ForeColor"</i>);
-</code><code id="L436"><span class="ln">436</span> value<span class="s"> = </span>((value<span class="s"> & </span><span class="d">255</span>) << <span class="d">16</span>)<span class="s"> | </span>(value<span class="s"> & </span><span class="d">65280</span>)<span class="s"> | </span>((value<span class="s"> & </span><span class="d">16711680</span>) >>> <span class="d">16</span>);
-</code><code id="L437"><span class="ln">437</span> <b>return</b> <i>"#"</i><span class="s"> + </span>(<i>"<span class="d">000000</span>"</i><span class="s"> + </span>value.toString(<span class="d">16</span>)).slice(-<span class="d">6</span>);
-</code><code id="L438"><span class="ln">438</span> } <b>catch</b>(e) {
-</code><code id="L439"><span class="ln">439</span> <b>return</b> <i>"none"</i>;
-</code><code id="L440"><span class="ln">440</span> }
-</code><code id="L441"><span class="ln">441</span> });
-</code><code id="L442"><span class="ln">442</span> } <b>else</b> {
-</code><code id="L443"><span class="ln">443</span> <b>var</b> i<span class="s"> = </span>g.doc.createElement(<i>"i"</i>);
-</code><code id="L444"><span class="ln">444</span> i.title<span class="s"> = </span><i>"Rapha\xebl Colour Picker"</i>;
-</code><code id="L445"><span class="ln">445</span> i.style.display<span class="s"> = </span><i>"none"</i>;
-</code><code id="L446"><span class="ln">446</span> g.doc.body.appendChild(i);
-</code><code id="L447"><span class="ln">447</span> toHex<span class="s"> = </span>cacher(<b>function</b> (color) {
-</code><code id="L448"><span class="ln">448</span> i.style.color<span class="s"> = </span>color;
-</code><code id="L449"><span class="ln">449</span> <b>return</b> g.doc.defaultView.getComputedStyle(i, E).getPropertyValue(<i>"color"</i>);
-</code><code id="L450"><span class="ln">450</span> });
-</code><code id="L451"><span class="ln">451</span> }
-</code><code id="L452"><span class="ln">452</span> <b>return</b> toHex(color);
-</code><code id="L453"><span class="ln">453</span> },
-</code><code id="L454"><span class="ln">454</span> hsbtoString<span class="s"> = </span><b>function</b> () {
-</code><code id="L455"><span class="ln">455</span> <b>return</b> <i>"hsb("</i><span class="s"> + </span>[<b>this</b>.h, <b>this</b>.s, <b>this</b>.b]<span class="s"> + </span><i>")"</i>;
-</code><code id="L456"><span class="ln">456</span> },
-</code><code id="L457"><span class="ln">457</span> hsltoString<span class="s"> = </span><b>function</b> () {
-</code><code id="L458"><span class="ln">458</span> <b>return</b> <i>"hsl("</i><span class="s"> + </span>[<b>this</b>.h, <b>this</b>.s, <b>this</b>.l]<span class="s"> + </span><i>")"</i>;
-</code><code id="L459"><span class="ln">459</span> },
-</code><code id="L460"><span class="ln">460</span> rgbtoString<span class="s"> = </span><b>function</b> () {
-</code><code id="L461"><span class="ln">461</span> <b>return</b> <b>this</b>.hex;
-</code><code id="L462"><span class="ln">462</span> },
-</code><code id="L463"><span class="ln">463</span> prepareRGB<span class="s"> = </span><b>function</b> (r, g, b) {
-</code><code id="L464"><span class="ln">464</span> <b>if</b> (g<span class="s"> == </span><b>null</b><span class="s"> && </span>R.is(r, <i>"object"</i>)<span class="s"> && </span><i>"r"</i> <b>in</b> r<span class="s"> && </span><i>"g"</i> <b>in</b> r<span class="s"> && </span><i>"b"</i> <b>in</b> r) {
-</code><code id="L465"><span class="ln">465</span> b<span class="s"> = </span>r.b;
-</code><code id="L466"><span class="ln">466</span> g<span class="s"> = </span>r.g;
-</code><code id="L467"><span class="ln">467</span> r<span class="s"> = </span>r.r;
-</code><code id="L468"><span class="ln">468</span> }
-</code><code id="L469"><span class="ln">469</span> <b>if</b> (g<span class="s"> == </span><b>null</b><span class="s"> && </span>R.is(r, string)) {
-</code><code id="L470"><span class="ln">470</span> <b>var</b> clr<span class="s"> = </span>R.getRGB(r);
-</code><code id="L471"><span class="ln">471</span> r<span class="s"> = </span>clr.r;
-</code><code id="L472"><span class="ln">472</span> g<span class="s"> = </span>clr.g;
-</code><code id="L473"><span class="ln">473</span> b<span class="s"> = </span>clr.b;
-</code><code id="L474"><span class="ln">474</span> }
-</code><code id="L475"><span class="ln">475</span> <b>if</b> (r > <span class="d">1</span><span class="s"> || </span>g > <span class="d">1</span><span class="s"> || </span>b > <span class="d">1</span>) {
-</code><code id="L476"><span class="ln">476</span> r /= <span class="d">255</span>;
-</code><code id="L477"><span class="ln">477</span> g /= <span class="d">255</span>;
-</code><code id="L478"><span class="ln">478</span> b /= <span class="d">255</span>;
-</code><code id="L479"><span class="ln">479</span> }
-</code><code id="L480"><span class="ln">480</span>
-</code><code id="L481"><span class="ln">481</span> <b>return</b> [r, g, b];
-</code><code id="L482"><span class="ln">482</span> },
-</code><code id="L483"><span class="ln">483</span> packageRGB<span class="s"> = </span><b>function</b> (r, g, b, o) {
-</code><code id="L484"><span class="ln">484</span> r *= <span class="d">255</span>;
-</code><code id="L485"><span class="ln">485</span> g *= <span class="d">255</span>;
-</code><code id="L486"><span class="ln">486</span> b *= <span class="d">255</span>;
-</code><code id="L487"><span class="ln">487</span> <b>var</b> rgb<span class="s"> = </span>{
-</code><code id="L488"><span class="ln">488</span> r: r,
-</code><code id="L489"><span class="ln">489</span> g: g,
-</code><code id="L490"><span class="ln">490</span> b: b,
-</code><code id="L491"><span class="ln">491</span> hex: R.rgb(r, g, b),
-</code><code id="L492"><span class="ln">492</span> toString: rgbtoString
-</code><code id="L493"><span class="ln">493</span> };
-</code><code id="L494"><span class="ln">494</span> R.is(o, <i>"finite"</i>)<span class="s"> && </span>(rgb.opacity<span class="s"> = </span>o);
-</code><code id="L495"><span class="ln">495</span> <b>return</b> rgb;
-</code><code id="L496"><span class="ln">496</span> };
-</code><code id="L497"><span class="ln">497</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L498"><span class="ln">498</span><span class="c"> <span class="s"> * </span>Raphael.hsb2rgb
-</span></code><code id="L499"><span class="ln">499</span><span class="c"> [ method ]
-</span></code><code id="L500"><span class="ln">500</span><span class="c"> **
-</span></code><code id="L501"><span class="ln">501</span><span class="c"> <span class="s"> * </span>Converts HSB values to RGB object.
-</span></code><code id="L502"><span class="ln">502</span><span class="c"> > Parameters
-</span></code><code id="L503"><span class="ln">503</span><span class="c"> <span class="s"> - </span>h (number) hue
-</span></code><code id="L504"><span class="ln">504</span><span class="c"> <span class="s"> - </span>s (number) saturation
-</span></code><code id="L505"><span class="ln">505</span><span class="c"> <span class="s"> - </span>v (number) value or brightness
-</span></code><code id="L506"><span class="ln">506</span><span class="c"> <span class="s"> = </span>(object) RGB object <b>in</b> format:
-</span></code><code id="L507"><span class="ln">507</span><span class="c"> o {
-</span></code><code id="L508"><span class="ln">508</span><span class="c"> o r (number) red,
-</span></code><code id="L509"><span class="ln">509</span><span class="c"> o g (number) green,
-</span></code><code id="L510"><span class="ln">510</span><span class="c"> o b (number) blue,
-</span></code><code id="L511"><span class="ln">511</span><span class="c"> o hex (string) color <b>in</b> HTML/CSS format: #••••••
-</span></code><code id="L512"><span class="ln">512</span><span class="c"> o }
-</span></code><code id="L513"><span class="ln">513</span><span class="c"> \*/</span>
-</code><code id="L514"><span class="ln">514</span> R.hsb2rgb<span class="s"> = </span><b>function</b> (h, s, v, o) {
-</code><code id="L515"><span class="ln">515</span> <b>if</b> (<b>this</b>.is(h, <i>"object"</i>)<span class="s"> && </span><i>"h"</i> <b>in</b> h<span class="s"> && </span><i>"s"</i> <b>in</b> h<span class="s"> && </span><i>"b"</i> <b>in</b> h) {
-</code><code id="L516"><span class="ln">516</span> v<span class="s"> = </span>h.b;
-</code><code id="L517"><span class="ln">517</span> s<span class="s"> = </span>h.s;
-</code><code id="L518"><span class="ln">518</span> h<span class="s"> = </span>h.h;
-</code><code id="L519"><span class="ln">519</span> o<span class="s"> = </span>h.o;
-</code><code id="L520"><span class="ln">520</span> }
-</code><code id="L521"><span class="ln">521</span> h *= <span class="d">360</span>;
-</code><code id="L522"><span class="ln">522</span> <b>var</b> R, G, B, X, C;
-</code><code id="L523"><span class="ln">523</span> h<span class="s"> = </span>(h<span class="s"> % </span><span class="d">360</span>)<span class="s"> / </span><span class="d">60</span>;
-</code><code id="L524"><span class="ln">524</span> C<span class="s"> = </span>v<span class="s"> * </span>s;
-</code><code id="L525"><span class="ln">525</span> X<span class="s"> = </span>C<span class="s"> * </span>(<span class="d">1</span><span class="s"> - </span>abs(h<span class="s"> % </span><span class="d">2</span><span class="s"> - </span><span class="d">1</span>));
-</code><code id="L526"><span class="ln">526</span> R<span class="s"> = </span>G<span class="s"> = </span>B<span class="s"> = </span>v<span class="s"> - </span>C;
-</code><code id="L527"><span class="ln">527</span>
-</code><code id="L528"><span class="ln">528</span> h<span class="s"> = </span>~~h;
-</code><code id="L529"><span class="ln">529</span> R += [C, X, <span class="d">0</span>, <span class="d">0</span>, X, C][h];
-</code><code id="L530"><span class="ln">530</span> G += [X, C, C, X, <span class="d">0</span>, <span class="d">0</span>][h];
-</code><code id="L531"><span class="ln">531</span> B += [<span class="d">0</span>, <span class="d">0</span>, X, C, C, X][h];
-</code><code id="L532"><span class="ln">532</span> <b>return</b> packageRGB(R, G, B, o);
-</code><code id="L533"><span class="ln">533</span> };
-</code><code id="L534"><span class="ln">534</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L535"><span class="ln">535</span><span class="c"> <span class="s"> * </span>Raphael.hsl2rgb
-</span></code><code id="L536"><span class="ln">536</span><span class="c"> [ method ]
-</span></code><code id="L537"><span class="ln">537</span><span class="c"> **
-</span></code><code id="L538"><span class="ln">538</span><span class="c"> <span class="s"> * </span>Converts HSL values to RGB object.
-</span></code><code id="L539"><span class="ln">539</span><span class="c"> > Parameters
-</span></code><code id="L540"><span class="ln">540</span><span class="c"> <span class="s"> - </span>h (number) hue
-</span></code><code id="L541"><span class="ln">541</span><span class="c"> <span class="s"> - </span>s (number) saturation
-</span></code><code id="L542"><span class="ln">542</span><span class="c"> <span class="s"> - </span>l (number) luminosity
-</span></code><code id="L543"><span class="ln">543</span><span class="c"> <span class="s"> = </span>(object) RGB object <b>in</b> format:
-</span></code><code id="L544"><span class="ln">544</span><span class="c"> o {
-</span></code><code id="L545"><span class="ln">545</span><span class="c"> o r (number) red,
-</span></code><code id="L546"><span class="ln">546</span><span class="c"> o g (number) green,
-</span></code><code id="L547"><span class="ln">547</span><span class="c"> o b (number) blue,
-</span></code><code id="L548"><span class="ln">548</span><span class="c"> o hex (string) color <b>in</b> HTML/CSS format: #••••••
-</span></code><code id="L549"><span class="ln">549</span><span class="c"> o }
-</span></code><code id="L550"><span class="ln">550</span><span class="c"> \*/</span>
-</code><code id="L551"><span class="ln">551</span> R.hsl2rgb<span class="s"> = </span><b>function</b> (h, s, l, o) {
-</code><code id="L552"><span class="ln">552</span> <b>if</b> (<b>this</b>.is(h, <i>"object"</i>)<span class="s"> && </span><i>"h"</i> <b>in</b> h<span class="s"> && </span><i>"s"</i> <b>in</b> h<span class="s"> && </span><i>"l"</i> <b>in</b> h) {
-</code><code id="L553"><span class="ln">553</span> l<span class="s"> = </span>h.l;
-</code><code id="L554"><span class="ln">554</span> s<span class="s"> = </span>h.s;
-</code><code id="L555"><span class="ln">555</span> h<span class="s"> = </span>h.h;
-</code><code id="L556"><span class="ln">556</span> }
-</code><code id="L557"><span class="ln">557</span> <b>if</b> (h > <span class="d">1</span><span class="s"> || </span>s > <span class="d">1</span><span class="s"> || </span>l > <span class="d">1</span>) {
-</code><code id="L558"><span class="ln">558</span> h /= <span class="d">360</span>;
-</code><code id="L559"><span class="ln">559</span> s /= <span class="d">100</span>;
-</code><code id="L560"><span class="ln">560</span> l /= <span class="d">100</span>;
-</code><code id="L561"><span class="ln">561</span> }
-</code><code id="L562"><span class="ln">562</span> h *= <span class="d">360</span>;
-</code><code id="L563"><span class="ln">563</span> <b>var</b> R, G, B, X, C;
-</code><code id="L564"><span class="ln">564</span> h<span class="s"> = </span>(h<span class="s"> % </span><span class="d">360</span>)<span class="s"> / </span><span class="d">60</span>;
-</code><code id="L565"><span class="ln">565</span> C<span class="s"> = </span><span class="d">2</span><span class="s"> * </span>s<span class="s"> * </span>(l < <span class="d">.5</span> ? l : <span class="d">1</span><span class="s"> - </span>l);
-</code><code id="L566"><span class="ln">566</span> X<span class="s"> = </span>C<span class="s"> * </span>(<span class="d">1</span><span class="s"> - </span>abs(h<span class="s"> % </span><span class="d">2</span><span class="s"> - </span><span class="d">1</span>));
-</code><code id="L567"><span class="ln">567</span> R<span class="s"> = </span>G<span class="s"> = </span>B<span class="s"> = </span>l<span class="s"> - </span>C<span class="s"> / </span><span class="d">2</span>;
-</code><code id="L568"><span class="ln">568</span>
-</code><code id="L569"><span class="ln">569</span> h<span class="s"> = </span>~~h;
-</code><code id="L570"><span class="ln">570</span> R += [C, X, <span class="d">0</span>, <span class="d">0</span>, X, C][h];
-</code><code id="L571"><span class="ln">571</span> G += [X, C, C, X, <span class="d">0</span>, <span class="d">0</span>][h];
-</code><code id="L572"><span class="ln">572</span> B += [<span class="d">0</span>, <span class="d">0</span>, X, C, C, X][h];
-</code><code id="L573"><span class="ln">573</span> <b>return</b> packageRGB(R, G, B, o);
-</code><code id="L574"><span class="ln">574</span> };
-</code><code id="L575"><span class="ln">575</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L576"><span class="ln">576</span><span class="c"> <span class="s"> * </span>Raphael.rgb2hsb
-</span></code><code id="L577"><span class="ln">577</span><span class="c"> [ method ]
-</span></code><code id="L578"><span class="ln">578</span><span class="c"> **
-</span></code><code id="L579"><span class="ln">579</span><span class="c"> <span class="s"> * </span>Converts RGB values to HSB object.
-</span></code><code id="L580"><span class="ln">580</span><span class="c"> > Parameters
-</span></code><code id="L581"><span class="ln">581</span><span class="c"> <span class="s"> - </span>r (number) red
-</span></code><code id="L582"><span class="ln">582</span><span class="c"> <span class="s"> - </span>g (number) green
-</span></code><code id="L583"><span class="ln">583</span><span class="c"> <span class="s"> - </span>b (number) blue
-</span></code><code id="L584"><span class="ln">584</span><span class="c"> <span class="s"> = </span>(object) HSB object <b>in</b> format:
-</span></code><code id="L585"><span class="ln">585</span><span class="c"> o {
-</span></code><code id="L586"><span class="ln">586</span><span class="c"> o h (number) hue
-</span></code><code id="L587"><span class="ln">587</span><span class="c"> o s (number) saturation
-</span></code><code id="L588"><span class="ln">588</span><span class="c"> o b (number) brightness
-</span></code><code id="L589"><span class="ln">589</span><span class="c"> o }
-</span></code><code id="L590"><span class="ln">590</span><span class="c"> \*/</span>
-</code><code id="L591"><span class="ln">591</span> R.rgb2hsb<span class="s"> = </span><b>function</b> (r, g, b) {
-</code><code id="L592"><span class="ln">592</span> b<span class="s"> = </span>prepareRGB(r, g, b);
-</code><code id="L593"><span class="ln">593</span> r<span class="s"> = </span>b[<span class="d">0</span>];
-</code><code id="L594"><span class="ln">594</span> g<span class="s"> = </span>b[<span class="d">1</span>];
-</code><code id="L595"><span class="ln">595</span> b<span class="s"> = </span>b[<span class="d">2</span>];
-</code><code id="L596"><span class="ln">596</span>
-</code><code id="L597"><span class="ln">597</span> <b>var</b> H, S, V, C;
-</code><code id="L598"><span class="ln">598</span> V<span class="s"> = </span>mmax(r, g, b);
-</code><code id="L599"><span class="ln">599</span> C<span class="s"> = </span>V<span class="s"> - </span>mmin(r, g, b);
-</code><code id="L600"><span class="ln">600</span> H<span class="s"> = </span>(C<span class="s"> == </span><span class="d">0</span> ? <b>null</b> :
-</code><code id="L601"><span class="ln">601</span> V<span class="s"> == </span>r ? (g<span class="s"> - </span>b)<span class="s"> / </span>C :
-</code><code id="L602"><span class="ln">602</span> V<span class="s"> == </span>g ? (b<span class="s"> - </span>r)<span class="s"> / </span>C<span class="s"> + </span><span class="d">2</span> :
-</code><code id="L603"><span class="ln">603</span> (r<span class="s"> - </span>g)<span class="s"> / </span>C<span class="s"> + </span><span class="d">4</span>);
-</code><code id="L604"><span class="ln">604</span> H<span class="s"> = </span>(H<span class="s"> % </span><span class="d">6</span>)<span class="s"> * </span><span class="d">60</span>;
-</code><code id="L605"><span class="ln">605</span> S<span class="s"> = </span>C<span class="s"> == </span><span class="d">0</span> ? <span class="d">0</span> : C<span class="s"> / </span>V;
-</code><code id="L606"><span class="ln">606</span> <b>return</b> {h: H, s: S, b: V, toString: hsbtoString};
-</code><code id="L607"><span class="ln">607</span> };
-</code><code id="L608"><span class="ln">608</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L609"><span class="ln">609</span><span class="c"> <span class="s"> * </span>Raphael.rgb2hsl
-</span></code><code id="L610"><span class="ln">610</span><span class="c"> [ method ]
-</span></code><code id="L611"><span class="ln">611</span><span class="c"> **
-</span></code><code id="L612"><span class="ln">612</span><span class="c"> <span class="s"> * </span>Converts RGB values to HSL object.
-</span></code><code id="L613"><span class="ln">613</span><span class="c"> > Parameters
-</span></code><code id="L614"><span class="ln">614</span><span class="c"> <span class="s"> - </span>r (number) red
-</span></code><code id="L615"><span class="ln">615</span><span class="c"> <span class="s"> - </span>g (number) green
-</span></code><code id="L616"><span class="ln">616</span><span class="c"> <span class="s"> - </span>b (number) blue
-</span></code><code id="L617"><span class="ln">617</span><span class="c"> <span class="s"> = </span>(object) HSL object <b>in</b> format:
-</span></code><code id="L618"><span class="ln">618</span><span class="c"> o {
-</span></code><code id="L619"><span class="ln">619</span><span class="c"> o h (number) hue
-</span></code><code id="L620"><span class="ln">620</span><span class="c"> o s (number) saturation
-</span></code><code id="L621"><span class="ln">621</span><span class="c"> o l (number) luminosity
-</span></code><code id="L622"><span class="ln">622</span><span class="c"> o }
-</span></code><code id="L623"><span class="ln">623</span><span class="c"> \*/</span>
-</code><code id="L624"><span class="ln">624</span> R.rgb2hsl<span class="s"> = </span><b>function</b> (r, g, b) {
-</code><code id="L625"><span class="ln">625</span> b<span class="s"> = </span>prepareRGB(r, g, b);
-</code><code id="L626"><span class="ln">626</span> r<span class="s"> = </span>b[<span class="d">0</span>];
-</code><code id="L627"><span class="ln">627</span> g<span class="s"> = </span>b[<span class="d">1</span>];
-</code><code id="L628"><span class="ln">628</span> b<span class="s"> = </span>b[<span class="d">2</span>];
-</code><code id="L629"><span class="ln">629</span>
-</code><code id="L630"><span class="ln">630</span> <b>var</b> H, S, L, M, m, C;
-</code><code id="L631"><span class="ln">631</span> M<span class="s"> = </span>mmax(r, g, b);
-</code><code id="L632"><span class="ln">632</span> m<span class="s"> = </span>mmin(r, g, b);
-</code><code id="L633"><span class="ln">633</span> C<span class="s"> = </span>M<span class="s"> - </span>m;
-</code><code id="L634"><span class="ln">634</span> H<span class="s"> = </span>(C<span class="s"> == </span><span class="d">0</span> ? <b>null</b> :
-</code><code id="L635"><span class="ln">635</span> M<span class="s"> == </span>r ? (g<span class="s"> - </span>b)<span class="s"> / </span>C :
-</code><code id="L636"><span class="ln">636</span> M<span class="s"> == </span>g ? (b<span class="s"> - </span>r)<span class="s"> / </span>C<span class="s"> + </span><span class="d">2</span> :
-</code><code id="L637"><span class="ln">637</span> (r<span class="s"> - </span>g)<span class="s"> / </span>C<span class="s"> + </span><span class="d">4</span>);
-</code><code id="L638"><span class="ln">638</span> H<span class="s"> = </span>(H<span class="s"> % </span><span class="d">6</span>)<span class="s"> * </span><span class="d">60</span>;
-</code><code id="L639"><span class="ln">639</span> L<span class="s"> = </span>(M<span class="s"> + </span>m)<span class="s"> / </span><span class="d">2</span>;
-</code><code id="L640"><span class="ln">640</span> S<span class="s"> = </span>(C<span class="s"> == </span><span class="d">0</span> ? <span class="d">0</span> :
-</code><code id="L641"><span class="ln">641</span> L < <span class="d">.5</span> ? C<span class="s"> / </span>(<span class="d">2</span><span class="s"> * </span>L) :
-</code><code id="L642"><span class="ln">642</span> C<span class="s"> / </span>(<span class="d">2</span><span class="s"> - </span><span class="d">2</span><span class="s"> * </span>L));
-</code><code id="L643"><span class="ln">643</span> <b>return</b> {h: H, s: S, l: L, toString: hsltoString};
-</code><code id="L644"><span class="ln">644</span> };
-</code><code id="L645"><span class="ln">645</span> R._path2string<span class="s"> = </span><b>function</b> () {
-</code><code id="L646"><span class="ln">646</span> <b>return</b> <b>this</b>.join(<i>","</i>).replace(p2s, <i>"$<span class="d">1</span>"</i>);
-</code><code id="L647"><span class="ln">647</span> };
-</code><code id="L648"><span class="ln">648</span> <b>function</b> cacher(f, scope, postprocessor) {
-</code><code id="L649"><span class="ln">649</span> <b>function</b> newf() {
-</code><code id="L650"><span class="ln">650</span> <b>var</b> arg<span class="s"> = </span>Array.prototype.slice.call(arguments, <span class="d">0</span>),
-</code><code id="L651"><span class="ln">651</span> args<span class="s"> = </span>arg.join(<i>"\u2400"</i>),
-</code><code id="L652"><span class="ln">652</span> cache<span class="s"> = </span>newf.cache<span class="s"> = </span>newf.cache<span class="s"> || </span>{},
-</code><code id="L653"><span class="ln">653</span> count<span class="s"> = </span>newf.count<span class="s"> = </span>newf.count<span class="s"> || </span>[];
-</code><code id="L654"><span class="ln">654</span> <b>if</b> (cache[has](args)) {
-</code><code id="L655"><span class="ln">655</span> <b>return</b> postprocessor ? postprocessor(cache[args]) : cache[args];
-</code><code id="L656"><span class="ln">656</span> }
-</code><code id="L657"><span class="ln">657</span> count.length >= <span class="d">1e3</span><span class="s"> && </span><b>delete</b> cache[count.shift()];
-</code><code id="L658"><span class="ln">658</span> count.push(args);
-</code><code id="L659"><span class="ln">659</span> cache[args]<span class="s"> = </span>f[apply](scope, arg);
-</code><code id="L660"><span class="ln">660</span> <b>return</b> postprocessor ? postprocessor(cache[args]) : cache[args];
-</code><code id="L661"><span class="ln">661</span> }
-</code><code id="L662"><span class="ln">662</span> <b>return</b> newf;
-</code><code id="L663"><span class="ln">663</span> }
-</code><code id="L664"><span class="ln">664</span>
-</code><code id="L665"><span class="ln">665</span> <b>function</b> preload(src, f) {
-</code><code id="L666"><span class="ln">666</span> <b>var</b> img<span class="s"> = </span>g.doc.createElement(<i>"img"</i>);
-</code><code id="L667"><span class="ln">667</span> img.style.cssText<span class="s"> = </span><i>"position:absolute;left:-9999em;top-9999em"</i>;
-</code><code id="L668"><span class="ln">668</span> img.onload<span class="s"> = </span><b>function</b> () {
-</code><code id="L669"><span class="ln">669</span> f.call(<b>this</b>);
-</code><code id="L670"><span class="ln">670</span> <b>this</b>.onload<span class="s"> = </span><b>null</b>;
-</code><code id="L671"><span class="ln">671</span> g.doc.body.removeChild(<b>this</b>);
-</code><code id="L672"><span class="ln">672</span> };
-</code><code id="L673"><span class="ln">673</span> img.onerror<span class="s"> = </span><b>function</b> () {
-</code><code id="L674"><span class="ln">674</span> g.doc.body.removeChild(<b>this</b>);
-</code><code id="L675"><span class="ln">675</span> };
-</code><code id="L676"><span class="ln">676</span> g.doc.body.appendChild(img);
-</code><code id="L677"><span class="ln">677</span> img.src<span class="s"> = </span>src;
-</code><code id="L678"><span class="ln">678</span> }
-</code><code id="L679"><span class="ln">679</span>
-</code><code id="L680"><span class="ln">680</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L681"><span class="ln">681</span><span class="c"> <span class="s"> * </span>Raphael.getRGB
-</span></code><code id="L682"><span class="ln">682</span><span class="c"> [ method ]
-</span></code><code id="L683"><span class="ln">683</span><span class="c"> **
-</span></code><code id="L684"><span class="ln">684</span><span class="c"> <span class="s"> * </span>Parses colour string as RGB object
-</span></code><code id="L685"><span class="ln">685</span><span class="c"> > Parameters
-</span></code><code id="L686"><span class="ln">686</span><span class="c"> <span class="s"> - </span>colour (string) colour string <b>in</b> one of formats:
-</span></code><code id="L687"><span class="ln">687</span><span class="c"> <ul>
-</span></code><code id="L688"><span class="ln">688</span><span class="c"> <li>Colour name (“<samp>red</samp>”, “<samp>green</samp>”, “<samp>cornflowerblue</samp>”, etc)</li>
-</span></code><code id="L689"><span class="ln">689</span><span class="c"> <li>#••• — shortened HTML colour: (“<samp>#<span class="d">000</span></samp>”, “<samp>#fc0</samp>”, etc)</li>
-</span></code><code id="L690"><span class="ln">690</span><span class="c"> <li>#•••••• — full length HTML colour: (“<samp>#<span class="d">000000</span></samp>”, “<samp>#bd2300</samp>”)</li>
-</span></code><code id="L691"><span class="ln">691</span><span class="c"> <li>rgb(•••, •••, •••) — red, green and blue channels’ values: (“<samp>rgb(<span class="d">200</span>, <span class="d">100</span>, <span class="d">0</span>)</samp>”)</li>
-</span></code><code id="L692"><span class="ln">692</span><span class="c"> <li>rgb(•••%, •••%, •••%) — same as above, but <b>in</b> %: (“<samp>rgb(<span class="d">100</span>%, <span class="d">175</span>%, <span class="d">0</span>%)</samp>”)</li>
-</span></code><code id="L693"><span class="ln">693</span><span class="c"> <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (“<samp>hsb(<span class="d">0.5</span>, <span class="d">0.25</span>, <span class="d">1</span>)</samp>”)</li>
-</span></code><code id="L694"><span class="ln">694</span><span class="c"> <li>hsb(•••%, •••%, •••%) — same as above, but <b>in</b> %</li>
-</span></code><code id="L695"><span class="ln">695</span><span class="c"> <li>hsl(•••, •••, •••) — same as hsb</li>
-</span></code><code id="L696"><span class="ln">696</span><span class="c"> <li>hsl(•••%, •••%, •••%) — same as hsb</li>
-</span></code><code id="L697"><span class="ln">697</span><span class="c"> </ul>
-</span></code><code id="L698"><span class="ln">698</span><span class="c"> <span class="s"> = </span>(object) RGB object <b>in</b> format:
-</span></code><code id="L699"><span class="ln">699</span><span class="c"> o {
-</span></code><code id="L700"><span class="ln">700</span><span class="c"> o r (number) red,
-</span></code><code id="L701"><span class="ln">701</span><span class="c"> o g (number) green,
-</span></code><code id="L702"><span class="ln">702</span><span class="c"> o b (number) blue
-</span></code><code id="L703"><span class="ln">703</span><span class="c"> o hex (string) color <b>in</b> HTML/CSS format: #••••••,
-</span></code><code id="L704"><span class="ln">704</span><span class="c"> o error (<b>boolean</b>) <b>true</b> <b>if</b> string can’t be parsed
-</span></code><code id="L705"><span class="ln">705</span><span class="c"> o }
-</span></code><code id="L706"><span class="ln">706</span><span class="c"> \*/</span>
-</code><code id="L707"><span class="ln">707</span> R.getRGB<span class="s"> = </span>cacher(<b>function</b> (colour) {
-</code><code id="L708"><span class="ln">708</span> <b>if</b> (!colour<span class="s"> || </span>!!((colour<span class="s"> = </span>Str(colour)).indexOf(<i>"-"</i>)<span class="s"> + </span><span class="d">1</span>)) {
-</code><code id="L709"><span class="ln">709</span> <b>return</b> {r: -<span class="d">1</span>, g: -<span class="d">1</span>, b: -<span class="d">1</span>, hex: <i>"none"</i>, error: <span class="d">1</span>};
-</code><code id="L710"><span class="ln">710</span> }
-</code><code id="L711"><span class="ln">711</span> <b>if</b> (colour<span class="s"> == </span><i>"none"</i>) {
-</code><code id="L712"><span class="ln">712</span> <b>return</b> {r: -<span class="d">1</span>, g: -<span class="d">1</span>, b: -<span class="d">1</span>, hex: <i>"none"</i>};
-</code><code id="L713"><span class="ln">713</span> }
-</code><code id="L714"><span class="ln">714</span> !(hsrg[has](colour.toLowerCase().substring(<span class="d">0</span>, <span class="d">2</span>))<span class="s"> || </span>colour.charAt()<span class="s"> == </span><i>"#"</i>)<span class="s"> && </span>(colour<span class="s"> = </span>toHex(colour));
-</code><code id="L715"><span class="ln">715</span> <b>var</b> res,
-</code><code id="L716"><span class="ln">716</span> red,
-</code><code id="L717"><span class="ln">717</span> green,
-</code><code id="L718"><span class="ln">718</span> blue,
-</code><code id="L719"><span class="ln">719</span> opacity,
-</code><code id="L720"><span class="ln">720</span> t,
-</code><code id="L721"><span class="ln">721</span> values,
-</code><code id="L722"><span class="ln">722</span> rgb<span class="s"> = </span>colour.match(colourRegExp);
-</code><code id="L723"><span class="ln">723</span> <b>if</b> (rgb) {
-</code><code id="L724"><span class="ln">724</span> <b>if</b> (rgb[<span class="d">2</span>]) {
-</code><code id="L725"><span class="ln">725</span> blue<span class="s"> = </span>toInt(rgb[<span class="d">2</span>].substring(<span class="d">5</span>), <span class="d">16</span>);
-</code><code id="L726"><span class="ln">726</span> green<span class="s"> = </span>toInt(rgb[<span class="d">2</span>].substring(<span class="d">3</span>, <span class="d">5</span>), <span class="d">16</span>);
-</code><code id="L727"><span class="ln">727</span> red<span class="s"> = </span>toInt(rgb[<span class="d">2</span>].substring(<span class="d">1</span>, <span class="d">3</span>), <span class="d">16</span>);
-</code><code id="L728"><span class="ln">728</span> }
-</code><code id="L729"><span class="ln">729</span> <b>if</b> (rgb[<span class="d">3</span>]) {
-</code><code id="L730"><span class="ln">730</span> blue<span class="s"> = </span>toInt((t<span class="s"> = </span>rgb[<span class="d">3</span>].charAt(<span class="d">3</span>))<span class="s"> + </span>t, <span class="d">16</span>);
-</code><code id="L731"><span class="ln">731</span> green<span class="s"> = </span>toInt((t<span class="s"> = </span>rgb[<span class="d">3</span>].charAt(<span class="d">2</span>))<span class="s"> + </span>t, <span class="d">16</span>);
-</code><code id="L732"><span class="ln">732</span> red<span class="s"> = </span>toInt((t<span class="s"> = </span>rgb[<span class="d">3</span>].charAt(<span class="d">1</span>))<span class="s"> + </span>t, <span class="d">16</span>);
-</code><code id="L733"><span class="ln">733</span> }
-</code><code id="L734"><span class="ln">734</span> <b>if</b> (rgb[<span class="d">4</span>]) {
-</code><code id="L735"><span class="ln">735</span> values<span class="s"> = </span>rgb[<span class="d">4</span>].split(commaSpaces);
-</code><code id="L736"><span class="ln">736</span> red<span class="s"> = </span>toFloat(values[<span class="d">0</span>]);
-</code><code id="L737"><span class="ln">737</span> values[<span class="d">0</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(red *= <span class="d">2.55</span>);
-</code><code id="L738"><span class="ln">738</span> green<span class="s"> = </span>toFloat(values[<span class="d">1</span>]);
-</code><code id="L739"><span class="ln">739</span> values[<span class="d">1</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(green *= <span class="d">2.55</span>);
-</code><code id="L740"><span class="ln">740</span> blue<span class="s"> = </span>toFloat(values[<span class="d">2</span>]);
-</code><code id="L741"><span class="ln">741</span> values[<span class="d">2</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(blue *= <span class="d">2.55</span>);
-</code><code id="L742"><span class="ln">742</span> rgb[<span class="d">1</span>].toLowerCase().slice(<span class="d">0</span>, <span class="d">4</span>)<span class="s"> == </span><i>"rgba"</i><span class="s"> && </span>(opacity<span class="s"> = </span>toFloat(values[<span class="d">3</span>]));
-</code><code id="L743"><span class="ln">743</span> values[<span class="d">3</span>]<span class="s"> && </span>values[<span class="d">3</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(opacity /= <span class="d">100</span>);
-</code><code id="L744"><span class="ln">744</span> }
-</code><code id="L745"><span class="ln">745</span> <b>if</b> (rgb[<span class="d">5</span>]) {
-</code><code id="L746"><span class="ln">746</span> values<span class="s"> = </span>rgb[<span class="d">5</span>].split(commaSpaces);
-</code><code id="L747"><span class="ln">747</span> red<span class="s"> = </span>toFloat(values[<span class="d">0</span>]);
-</code><code id="L748"><span class="ln">748</span> values[<span class="d">0</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(red *= <span class="d">2.55</span>);
-</code><code id="L749"><span class="ln">749</span> green<span class="s"> = </span>toFloat(values[<span class="d">1</span>]);
-</code><code id="L750"><span class="ln">750</span> values[<span class="d">1</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(green *= <span class="d">2.55</span>);
-</code><code id="L751"><span class="ln">751</span> blue<span class="s"> = </span>toFloat(values[<span class="d">2</span>]);
-</code><code id="L752"><span class="ln">752</span> values[<span class="d">2</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(blue *= <span class="d">2.55</span>);
-</code><code id="L753"><span class="ln">753</span> (values[<span class="d">0</span>].slice(-<span class="d">3</span>)<span class="s"> == </span><i>"deg"</i><span class="s"> || </span>values[<span class="d">0</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"\xb0"</i>)<span class="s"> && </span>(red /= <span class="d">360</span>);
-</code><code id="L754"><span class="ln">754</span> rgb[<span class="d">1</span>].toLowerCase().slice(<span class="d">0</span>, <span class="d">4</span>)<span class="s"> == </span><i>"hsba"</i><span class="s"> && </span>(opacity<span class="s"> = </span>toFloat(values[<span class="d">3</span>]));
-</code><code id="L755"><span class="ln">755</span> values[<span class="d">3</span>]<span class="s"> && </span>values[<span class="d">3</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(opacity /= <span class="d">100</span>);
-</code><code id="L756"><span class="ln">756</span> <b>return</b> R.hsb2rgb(red, green, blue, opacity);
-</code><code id="L757"><span class="ln">757</span> }
-</code><code id="L758"><span class="ln">758</span> <b>if</b> (rgb[<span class="d">6</span>]) {
-</code><code id="L759"><span class="ln">759</span> values<span class="s"> = </span>rgb[<span class="d">6</span>].split(commaSpaces);
-</code><code id="L760"><span class="ln">760</span> red<span class="s"> = </span>toFloat(values[<span class="d">0</span>]);
-</code><code id="L761"><span class="ln">761</span> values[<span class="d">0</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(red *= <span class="d">2.55</span>);
-</code><code id="L762"><span class="ln">762</span> green<span class="s"> = </span>toFloat(values[<span class="d">1</span>]);
-</code><code id="L763"><span class="ln">763</span> values[<span class="d">1</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(green *= <span class="d">2.55</span>);
-</code><code id="L764"><span class="ln">764</span> blue<span class="s"> = </span>toFloat(values[<span class="d">2</span>]);
-</code><code id="L765"><span class="ln">765</span> values[<span class="d">2</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(blue *= <span class="d">2.55</span>);
-</code><code id="L766"><span class="ln">766</span> (values[<span class="d">0</span>].slice(-<span class="d">3</span>)<span class="s"> == </span><i>"deg"</i><span class="s"> || </span>values[<span class="d">0</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"\xb0"</i>)<span class="s"> && </span>(red /= <span class="d">360</span>);
-</code><code id="L767"><span class="ln">767</span> rgb[<span class="d">1</span>].toLowerCase().slice(<span class="d">0</span>, <span class="d">4</span>)<span class="s"> == </span><i>"hsla"</i><span class="s"> && </span>(opacity<span class="s"> = </span>toFloat(values[<span class="d">3</span>]));
-</code><code id="L768"><span class="ln">768</span> values[<span class="d">3</span>]<span class="s"> && </span>values[<span class="d">3</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(opacity /= <span class="d">100</span>);
-</code><code id="L769"><span class="ln">769</span> <b>return</b> R.hsl2rgb(red, green, blue, opacity);
-</code><code id="L770"><span class="ln">770</span> }
-</code><code id="L771"><span class="ln">771</span> rgb<span class="s"> = </span>{r: red, g: green, b: blue};
-</code><code id="L772"><span class="ln">772</span> rgb.hex<span class="s"> = </span><i>"#"</i><span class="s"> + </span>(<span class="d">16777216</span><span class="s"> | </span>blue<span class="s"> | </span>(green << <span class="d">8</span>)<span class="s"> | </span>(red << <span class="d">16</span>)).toString(<span class="d">16</span>).slice(<span class="d">1</span>);
-</code><code id="L773"><span class="ln">773</span> R.is(opacity, <i>"finite"</i>)<span class="s"> && </span>(rgb.opacity<span class="s"> = </span>opacity);
-</code><code id="L774"><span class="ln">774</span> <b>return</b> rgb;
-</code><code id="L775"><span class="ln">775</span> }
-</code><code id="L776"><span class="ln">776</span> <b>return</b> {r: -<span class="d">1</span>, g: -<span class="d">1</span>, b: -<span class="d">1</span>, hex: <i>"none"</i>, error: <span class="d">1</span>};
-</code><code id="L777"><span class="ln">777</span> }, R);
-</code><code id="L778"><span class="ln">778</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L779"><span class="ln">779</span><span class="c"> <span class="s"> * </span>Raphael.hsb
-</span></code><code id="L780"><span class="ln">780</span><span class="c"> [ method ]
-</span></code><code id="L781"><span class="ln">781</span><span class="c"> **
-</span></code><code id="L782"><span class="ln">782</span><span class="c"> <span class="s"> * </span>Converts HSB values to hex representation of the colour.
-</span></code><code id="L783"><span class="ln">783</span><span class="c"> > Parameters
-</span></code><code id="L784"><span class="ln">784</span><span class="c"> <span class="s"> - </span>h (number) hue
-</span></code><code id="L785"><span class="ln">785</span><span class="c"> <span class="s"> - </span>s (number) saturation
-</span></code><code id="L786"><span class="ln">786</span><span class="c"> <span class="s"> - </span>b (number) value or brightness
-</span></code><code id="L787"><span class="ln">787</span><span class="c"> <span class="s"> = </span>(string) hex representation of the colour.
-</span></code><code id="L788"><span class="ln">788</span><span class="c"> \*/</span>
-</code><code id="L789"><span class="ln">789</span> R.hsb<span class="s"> = </span>cacher(<b>function</b> (h, s, b) {
-</code><code id="L790"><span class="ln">790</span> <b>return</b> R.hsb2rgb(h, s, b).hex;
-</code><code id="L791"><span class="ln">791</span> });
-</code><code id="L792"><span class="ln">792</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L793"><span class="ln">793</span><span class="c"> <span class="s"> * </span>Raphael.hsl
-</span></code><code id="L794"><span class="ln">794</span><span class="c"> [ method ]
-</span></code><code id="L795"><span class="ln">795</span><span class="c"> **
-</span></code><code id="L796"><span class="ln">796</span><span class="c"> <span class="s"> * </span>Converts HSL values to hex representation of the colour.
-</span></code><code id="L797"><span class="ln">797</span><span class="c"> > Parameters
-</span></code><code id="L798"><span class="ln">798</span><span class="c"> <span class="s"> - </span>h (number) hue
-</span></code><code id="L799"><span class="ln">799</span><span class="c"> <span class="s"> - </span>s (number) saturation
-</span></code><code id="L800"><span class="ln">800</span><span class="c"> <span class="s"> - </span>l (number) luminosity
-</span></code><code id="L801"><span class="ln">801</span><span class="c"> <span class="s"> = </span>(string) hex representation of the colour.
-</span></code><code id="L802"><span class="ln">802</span><span class="c"> \*/</span>
-</code><code id="L803"><span class="ln">803</span> R.hsl<span class="s"> = </span>cacher(<b>function</b> (h, s, l) {
-</code><code id="L804"><span class="ln">804</span> <b>return</b> R.hsl2rgb(h, s, l).hex;
-</code><code id="L805"><span class="ln">805</span> });
-</code><code id="L806"><span class="ln">806</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L807"><span class="ln">807</span><span class="c"> <span class="s"> * </span>Raphael.rgb
-</span></code><code id="L808"><span class="ln">808</span><span class="c"> [ method ]
-</span></code><code id="L809"><span class="ln">809</span><span class="c"> **
-</span></code><code id="L810"><span class="ln">810</span><span class="c"> <span class="s"> * </span>Converts RGB values to hex representation of the colour.
-</span></code><code id="L811"><span class="ln">811</span><span class="c"> > Parameters
-</span></code><code id="L812"><span class="ln">812</span><span class="c"> <span class="s"> - </span>r (number) red
-</span></code><code id="L813"><span class="ln">813</span><span class="c"> <span class="s"> - </span>g (number) green
-</span></code><code id="L814"><span class="ln">814</span><span class="c"> <span class="s"> - </span>b (number) blue
-</span></code><code id="L815"><span class="ln">815</span><span class="c"> <span class="s"> = </span>(string) hex representation of the colour.
-</span></code><code id="L816"><span class="ln">816</span><span class="c"> \*/</span>
-</code><code id="L817"><span class="ln">817</span> R.rgb<span class="s"> = </span>cacher(<b>function</b> (r, g, b) {
-</code><code id="L818"><span class="ln">818</span> <b>return</b> <i>"#"</i><span class="s"> + </span>(<span class="d">16777216</span><span class="s"> | </span>b<span class="s"> | </span>(g << <span class="d">8</span>)<span class="s"> | </span>(r << <span class="d">16</span>)).toString(<span class="d">16</span>).slice(<span class="d">1</span>);
-</code><code id="L819"><span class="ln">819</span> });
-</code><code id="L820"><span class="ln">820</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L821"><span class="ln">821</span><span class="c"> <span class="s"> * </span>Raphael.getColor
-</span></code><code id="L822"><span class="ln">822</span><span class="c"> [ method ]
-</span></code><code id="L823"><span class="ln">823</span><span class="c"> **
-</span></code><code id="L824"><span class="ln">824</span><span class="c"> <span class="s"> * </span>On each call returns next colour <b>in</b> the spectrum. To reset it back to red call @Raphael.getColor.reset
-</span></code><code id="L825"><span class="ln">825</span><span class="c"> > Parameters
-</span></code><code id="L826"><span class="ln">826</span><span class="c"> <span class="s"> - </span>value (number) #optional brightness, <b>default</b> is `<span class="d">0.75</span>`
-</span></code><code id="L827"><span class="ln">827</span><span class="c"> <span class="s"> = </span>(string) hex representation of the colour.
-</span></code><code id="L828"><span class="ln">828</span><span class="c"> \*/</span>
-</code><code id="L829"><span class="ln">829</span> R.getColor<span class="s"> = </span><b>function</b> (value) {
-</code><code id="L830"><span class="ln">830</span> <b>var</b> start<span class="s"> = </span><b>this</b>.getColor.start<span class="s"> = </span><b>this</b>.getColor.start<span class="s"> || </span>{h: <span class="d">0</span>, s: <span class="d">1</span>, b: value<span class="s"> || </span><span class="d">.75</span>},
-</code><code id="L831"><span class="ln">831</span> rgb<span class="s"> = </span><b>this</b>.hsb2rgb(start.h, start.s, start.b);
-</code><code id="L832"><span class="ln">832</span> start.h += <span class="d">.075</span>;
-</code><code id="L833"><span class="ln">833</span> <b>if</b> (start.h > <span class="d">1</span>) {
-</code><code id="L834"><span class="ln">834</span> start.h<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L835"><span class="ln">835</span> start.s -= <span class="d">.2</span>;
-</code><code id="L836"><span class="ln">836</span> start.s <= <span class="d">0</span><span class="s"> && </span>(<b>this</b>.getColor.start<span class="s"> = </span>{h: <span class="d">0</span>, s: <span class="d">1</span>, b: start.b});
-</code><code id="L837"><span class="ln">837</span> }
-</code><code id="L838"><span class="ln">838</span> <b>return</b> rgb.hex;
-</code><code id="L839"><span class="ln">839</span> };
-</code><code id="L840"><span class="ln">840</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L841"><span class="ln">841</span><span class="c"> <span class="s"> * </span>Raphael.getColor.reset
-</span></code><code id="L842"><span class="ln">842</span><span class="c"> [ method ]
-</span></code><code id="L843"><span class="ln">843</span><span class="c"> **
-</span></code><code id="L844"><span class="ln">844</span><span class="c"> <span class="s"> * </span>Resets spectrum position <b>for</b> @Raphael.getColor back to red.
-</span></code><code id="L845"><span class="ln">845</span><span class="c"> \*/</span>
-</code><code id="L846"><span class="ln">846</span> R.getColor.reset<span class="s"> = </span><b>function</b> () {
-</code><code id="L847"><span class="ln">847</span> <b>delete</b> <b>this</b>.start;
-</code><code id="L848"><span class="ln">848</span> };
-</code><code id="L849"><span class="ln">849</span>
-</code><code id="L850"><span class="ln">850</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L851"><span class="ln">851</span><span class="c"> <span class="s"> * </span>Raphael.parsePathString
-</span></code><code id="L852"><span class="ln">852</span><span class="c"> [ method ]
-</span></code><code id="L853"><span class="ln">853</span><span class="c"> **
-</span></code><code id="L854"><span class="ln">854</span><span class="c"> <span class="s"> * </span>Utility method
-</span></code><code id="L855"><span class="ln">855</span><span class="c"> **
-</span></code><code id="L856"><span class="ln">856</span><span class="c"> <span class="s"> * </span>Parses given path string into an array of arrays of path segments.
-</span></code><code id="L857"><span class="ln">857</span><span class="c"> > Parameters
-</span></code><code id="L858"><span class="ln">858</span><span class="c"> <span class="s"> - </span>pathString (string|array) path string or array of segments (<b>in</b> the last <b>case</b> it will be returned stright away)
-</span></code><code id="L859"><span class="ln">859</span><span class="c"> <span class="s"> = </span>(array) array of segments.
-</span></code><code id="L860"><span class="ln">860</span><span class="c"> \*/</span>
-</code><code id="L861"><span class="ln">861</span> R.parsePathString<span class="s"> = </span>cacher(<b>function</b> (pathString) {
-</code><code id="L862"><span class="ln">862</span> <b>if</b> (!pathString) {
-</code><code id="L863"><span class="ln">863</span> <b>return</b> <b>null</b>;
-</code><code id="L864"><span class="ln">864</span> }
-</code><code id="L865"><span class="ln">865</span> <b>var</b> paramCounts<span class="s"> = </span>{a: <span class="d">7</span>, c: <span class="d">6</span>, h: <span class="d">1</span>, l: <span class="d">2</span>, m: <span class="d">2</span>, q: <span class="d">4</span>, s: <span class="d">4</span>, t: <span class="d">2</span>, v: <span class="d">1</span>, z: <span class="d">0</span>},
-</code><code id="L866"><span class="ln">866</span> data<span class="s"> = </span>[];
-</code><code id="L867"><span class="ln">867</span> <b>if</b> (R.is(pathString, array)<span class="s"> && </span>R.is(pathString[<span class="d">0</span>], array)) { <span class="c">// rough assumption</span>
-</code><code id="L868"><span class="ln">868</span> data<span class="s"> = </span>pathClone(pathString);
-</code><code id="L869"><span class="ln">869</span> }
-</code><code id="L870"><span class="ln">870</span> <b>if</b> (!data.length) {
-</code><code id="L871"><span class="ln">871</span> Str(pathString).replace(pathCommand, <b>function</b> (a, b, c) {
-</code><code id="L872"><span class="ln">872</span> <b>var</b> params<span class="s"> = </span>[],
-</code><code id="L873"><span class="ln">873</span> name<span class="s"> = </span>lowerCase.call(b);
-</code><code id="L874"><span class="ln">874</span> c.replace(pathValues, <b>function</b> (a, b) {
-</code><code id="L875"><span class="ln">875</span> b<span class="s"> && </span>params.push(+b);
-</code><code id="L876"><span class="ln">876</span> });
-</code><code id="L877"><span class="ln">877</span> <b>if</b> (name<span class="s"> == </span><i>"m"</i><span class="s"> && </span>params.length > <span class="d">2</span>) {
-</code><code id="L878"><span class="ln">878</span> data.push([b][concat](params.splice(<span class="d">0</span>, <span class="d">2</span>)));
-</code><code id="L879"><span class="ln">879</span> name<span class="s"> = </span><i>"l"</i>;
-</code><code id="L880"><span class="ln">880</span> b<span class="s"> = </span>b<span class="s"> == </span><i>"m"</i> ? <i>"l"</i> : <i>"L"</i>;
-</code><code id="L881"><span class="ln">881</span> }
-</code><code id="L882"><span class="ln">882</span> <b>while</b> (params.length >= paramCounts[name]) {
-</code><code id="L883"><span class="ln">883</span> data.push([b][concat](params.splice(<span class="d">0</span>, paramCounts[name])));
-</code><code id="L884"><span class="ln">884</span> <b>if</b> (!paramCounts[name]) {
-</code><code id="L885"><span class="ln">885</span> <b>break</b>;
-</code><code id="L886"><span class="ln">886</span> }
-</code><code id="L887"><span class="ln">887</span> }
-</code><code id="L888"><span class="ln">888</span> });
-</code><code id="L889"><span class="ln">889</span> }
-</code><code id="L890"><span class="ln">890</span> data.toString<span class="s"> = </span>R._path2string;
-</code><code id="L891"><span class="ln">891</span> <b>return</b> data;
-</code><code id="L892"><span class="ln">892</span> });
-</code><code id="L893"><span class="ln">893</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L894"><span class="ln">894</span><span class="c"> <span class="s"> * </span>Raphael.parseTransformString
-</span></code><code id="L895"><span class="ln">895</span><span class="c"> [ method ]
-</span></code><code id="L896"><span class="ln">896</span><span class="c"> **
-</span></code><code id="L897"><span class="ln">897</span><span class="c"> <span class="s"> * </span>Utility method
-</span></code><code id="L898"><span class="ln">898</span><span class="c"> **
-</span></code><code id="L899"><span class="ln">899</span><span class="c"> <span class="s"> * </span>Parses given path string into an array of transformations.
-</span></code><code id="L900"><span class="ln">900</span><span class="c"> > Parameters
-</span></code><code id="L901"><span class="ln">901</span><span class="c"> <span class="s"> - </span>TString (string|array) transform string or array of transformations (<b>in</b> the last <b>case</b> it will be returned stright away)
-</span></code><code id="L902"><span class="ln">902</span><span class="c"> <span class="s"> = </span>(array) array of transformations.
-</span></code><code id="L903"><span class="ln">903</span><span class="c"> \*/</span>
-</code><code id="L904"><span class="ln">904</span> R.parseTransformString<span class="s"> = </span>cacher(<b>function</b> (TString) {
-</code><code id="L905"><span class="ln">905</span> <b>if</b> (!TString) {
-</code><code id="L906"><span class="ln">906</span> <b>return</b> <b>null</b>;
-</code><code id="L907"><span class="ln">907</span> }
-</code><code id="L908"><span class="ln">908</span> <b>var</b> paramCounts<span class="s"> = </span>{r: <span class="d">3</span>, s: <span class="d">4</span>, t: <span class="d">2</span>, m: <span class="d">6</span>},
-</code><code id="L909"><span class="ln">909</span> data<span class="s"> = </span>[];
-</code><code id="L910"><span class="ln">910</span> <b>if</b> (R.is(TString, array)<span class="s"> && </span>R.is(TString[<span class="d">0</span>], array)) { <span class="c">// rough assumption</span>
-</code><code id="L911"><span class="ln">911</span> data<span class="s"> = </span>pathClone(TString);
-</code><code id="L912"><span class="ln">912</span> }
-</code><code id="L913"><span class="ln">913</span> <b>if</b> (!data.length) {
-</code><code id="L914"><span class="ln">914</span> Str(TString).replace(tCommand, <b>function</b> (a, b, c) {
-</code><code id="L915"><span class="ln">915</span> <b>var</b> params<span class="s"> = </span>[],
-</code><code id="L916"><span class="ln">916</span> name<span class="s"> = </span>lowerCase.call(b);
-</code><code id="L917"><span class="ln">917</span> c.replace(pathValues, <b>function</b> (a, b) {
-</code><code id="L918"><span class="ln">918</span> b<span class="s"> && </span>params.push(+b);
-</code><code id="L919"><span class="ln">919</span> });
-</code><code id="L920"><span class="ln">920</span> data.push([name][concat](params));
-</code><code id="L921"><span class="ln">921</span> });
-</code><code id="L922"><span class="ln">922</span> }
-</code><code id="L923"><span class="ln">923</span> data.toString<span class="s"> = </span>R._path2string;
-</code><code id="L924"><span class="ln">924</span> <b>return</b> data;
-</code><code id="L925"><span class="ln">925</span> });
-</code><code id="L926"><span class="ln">926</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L927"><span class="ln">927</span><span class="c"> <span class="s"> * </span>Raphael.findDotsAtSegment
-</span></code><code id="L928"><span class="ln">928</span><span class="c"> [ method ]
-</span></code><code id="L929"><span class="ln">929</span><span class="c"> **
-</span></code><code id="L930"><span class="ln">930</span><span class="c"> <span class="s"> * </span>Utility method
-</span></code><code id="L931"><span class="ln">931</span><span class="c"> **
-</span></code><code id="L932"><span class="ln">932</span><span class="c"> <span class="s"> * </span>Find dot coordinates on the given cubic bezier curve at the given t.
-</span></code><code id="L933"><span class="ln">933</span><span class="c"> > Parameters
-</span></code><code id="L934"><span class="ln">934</span><span class="c"> <span class="s"> - </span>p1x (number) x of the first point of the curve
-</span></code><code id="L935"><span class="ln">935</span><span class="c"> <span class="s"> - </span>p1y (number) y of the first point of the curve
-</span></code><code id="L936"><span class="ln">936</span><span class="c"> <span class="s"> - </span>c1x (number) x of the first anchor of the curve
-</span></code><code id="L937"><span class="ln">937</span><span class="c"> <span class="s"> - </span>c1y (number) y of the first anchor of the curve
-</span></code><code id="L938"><span class="ln">938</span><span class="c"> <span class="s"> - </span>c2x (number) x of the second anchor of the curve
-</span></code><code id="L939"><span class="ln">939</span><span class="c"> <span class="s"> - </span>c2y (number) y of the second anchor of the curve
-</span></code><code id="L940"><span class="ln">940</span><span class="c"> <span class="s"> - </span>p2x (number) x of the second point of the curve
-</span></code><code id="L941"><span class="ln">941</span><span class="c"> <span class="s"> - </span>p2y (number) y of the second point of the curve
-</span></code><code id="L942"><span class="ln">942</span><span class="c"> <span class="s"> - </span>t (number) position on the curve (<span class="d">0</span>.<span class="d">.1</span>)
-</span></code><code id="L943"><span class="ln">943</span><span class="c"> <span class="s"> = </span>(object) point information <b>in</b> format:
-</span></code><code id="L944"><span class="ln">944</span><span class="c"> o {
-</span></code><code id="L945"><span class="ln">945</span><span class="c"> o x: (number) x coordinate of the point
-</span></code><code id="L946"><span class="ln">946</span><span class="c"> o y: (number) y coordinate of the point
-</span></code><code id="L947"><span class="ln">947</span><span class="c"> o m: {
-</span></code><code id="L948"><span class="ln">948</span><span class="c"> o x: (number) x coordinate of the left anchor
-</span></code><code id="L949"><span class="ln">949</span><span class="c"> o y: (number) y coordinate of the left anchor
-</span></code><code id="L950"><span class="ln">950</span><span class="c"> o }
-</span></code><code id="L951"><span class="ln">951</span><span class="c"> o n: {
-</span></code><code id="L952"><span class="ln">952</span><span class="c"> o x: (number) x coordinate of the right anchor
-</span></code><code id="L953"><span class="ln">953</span><span class="c"> o y: (number) y coordinate of the right anchor
-</span></code><code id="L954"><span class="ln">954</span><span class="c"> o }
-</span></code><code id="L955"><span class="ln">955</span><span class="c"> o start: {
-</span></code><code id="L956"><span class="ln">956</span><span class="c"> o x: (number) x coordinate of the start of the curve
-</span></code><code id="L957"><span class="ln">957</span><span class="c"> o y: (number) y coordinate of the start of the curve
-</span></code><code id="L958"><span class="ln">958</span><span class="c"> o }
-</span></code><code id="L959"><span class="ln">959</span><span class="c"> o end: {
-</span></code><code id="L960"><span class="ln">960</span><span class="c"> o x: (number) x coordinate of the end of the curve
-</span></code><code id="L961"><span class="ln">961</span><span class="c"> o y: (number) y coordinate of the end of the curve
-</span></code><code id="L962"><span class="ln">962</span><span class="c"> o }
-</span></code><code id="L963"><span class="ln">963</span><span class="c"> o alpha: (number) angle of the curve derivative at the point
-</span></code><code id="L964"><span class="ln">964</span><span class="c"> o }
-</span></code><code id="L965"><span class="ln">965</span><span class="c"> \*/</span>
-</code><code id="L966"><span class="ln">966</span> R.findDotsAtSegment<span class="s"> = </span><b>function</b> (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
-</code><code id="L967"><span class="ln">967</span> <b>var</b> t1<span class="s"> = </span><span class="d">1</span><span class="s"> - </span>t,
-</code><code id="L968"><span class="ln">968</span> x<span class="s"> = </span>pow(t1, <span class="d">3</span>)<span class="s"> * </span>p1x<span class="s"> + </span>pow(t1, <span class="d">2</span>)<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>c1x<span class="s"> + </span>t1<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>t<span class="s"> * </span>c2x<span class="s"> + </span>pow(t, <span class="d">3</span>)<span class="s"> * </span>p2x,
-</code><code id="L969"><span class="ln">969</span> y<span class="s"> = </span>pow(t1, <span class="d">3</span>)<span class="s"> * </span>p1y<span class="s"> + </span>pow(t1, <span class="d">2</span>)<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>c1y<span class="s"> + </span>t1<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>t<span class="s"> * </span>c2y<span class="s"> + </span>pow(t, <span class="d">3</span>)<span class="s"> * </span>p2y,
-</code><code id="L970"><span class="ln">970</span> mx<span class="s"> = </span>p1x<span class="s"> + </span><span class="d">2</span><span class="s"> * </span>t<span class="s"> * </span>(c1x<span class="s"> - </span>p1x)<span class="s"> + </span>t<span class="s"> * </span>t<span class="s"> * </span>(c2x<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>c1x<span class="s"> + </span>p1x),
-</code><code id="L971"><span class="ln">971</span> my<span class="s"> = </span>p1y<span class="s"> + </span><span class="d">2</span><span class="s"> * </span>t<span class="s"> * </span>(c1y<span class="s"> - </span>p1y)<span class="s"> + </span>t<span class="s"> * </span>t<span class="s"> * </span>(c2y<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>c1y<span class="s"> + </span>p1y),
-</code><code id="L972"><span class="ln">972</span> nx<span class="s"> = </span>c1x<span class="s"> + </span><span class="d">2</span><span class="s"> * </span>t<span class="s"> * </span>(c2x<span class="s"> - </span>c1x)<span class="s"> + </span>t<span class="s"> * </span>t<span class="s"> * </span>(p2x<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>c2x<span class="s"> + </span>c1x),
-</code><code id="L973"><span class="ln">973</span> ny<span class="s"> = </span>c1y<span class="s"> + </span><span class="d">2</span><span class="s"> * </span>t<span class="s"> * </span>(c2y<span class="s"> - </span>c1y)<span class="s"> + </span>t<span class="s"> * </span>t<span class="s"> * </span>(p2y<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>c2y<span class="s"> + </span>c1y),
-</code><code id="L974"><span class="ln">974</span> ax<span class="s"> = </span>(<span class="d">1</span><span class="s"> - </span>t)<span class="s"> * </span>p1x<span class="s"> + </span>t<span class="s"> * </span>c1x,
-</code><code id="L975"><span class="ln">975</span> ay<span class="s"> = </span>(<span class="d">1</span><span class="s"> - </span>t)<span class="s"> * </span>p1y<span class="s"> + </span>t<span class="s"> * </span>c1y,
-</code><code id="L976"><span class="ln">976</span> cx<span class="s"> = </span>(<span class="d">1</span><span class="s"> - </span>t)<span class="s"> * </span>c2x<span class="s"> + </span>t<span class="s"> * </span>p2x,
-</code><code id="L977"><span class="ln">977</span> cy<span class="s"> = </span>(<span class="d">1</span><span class="s"> - </span>t)<span class="s"> * </span>c2y<span class="s"> + </span>t<span class="s"> * </span>p2y,
-</code><code id="L978"><span class="ln">978</span> alpha<span class="s"> = </span>(<span class="d">90</span><span class="s"> - </span>math.atan2(mx<span class="s"> - </span>nx, my<span class="s"> - </span>ny)<span class="s"> * </span><span class="d">180</span><span class="s"> / </span>PI);
-</code><code id="L979"><span class="ln">979</span> (mx > nx<span class="s"> || </span>my < ny)<span class="s"> && </span>(alpha += <span class="d">180</span>);
-</code><code id="L980"><span class="ln">980</span> <b>return</b> {x: x, y: y, m: {x: mx, y: my}, n: {x: nx, y: ny}, start: {x: ax, y: ay}, end: {x: cx, y: cy}, alpha: alpha};
-</code><code id="L981"><span class="ln">981</span> };
-</code><code id="L982"><span class="ln">982</span> <b>var</b> pathDimensions<span class="s"> = </span>cacher(<b>function</b> (path) {
-</code><code id="L983"><span class="ln">983</span> <b>if</b> (!path) {
-</code><code id="L984"><span class="ln">984</span> <b>return</b> {x: <span class="d">0</span>, y: <span class="d">0</span>, width: <span class="d">0</span>, height: <span class="d">0</span>};
-</code><code id="L985"><span class="ln">985</span> }
-</code><code id="L986"><span class="ln">986</span> path<span class="s"> = </span>path2curve(path);
-</code><code id="L987"><span class="ln">987</span> <b>var</b> x<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L988"><span class="ln">988</span> y<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L989"><span class="ln">989</span> X<span class="s"> = </span>[],
-</code><code id="L990"><span class="ln">990</span> Y<span class="s"> = </span>[],
-</code><code id="L991"><span class="ln">991</span> p;
-</code><code id="L992"><span class="ln">992</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>path.length; i < ii; i++) {
-</code><code id="L993"><span class="ln">993</span> p<span class="s"> = </span>path[i];
-</code><code id="L994"><span class="ln">994</span> <b>if</b> (p[<span class="d">0</span>]<span class="s"> == </span><i>"M"</i>) {
-</code><code id="L995"><span class="ln">995</span> x<span class="s"> = </span>p[<span class="d">1</span>];
-</code><code id="L996"><span class="ln">996</span> y<span class="s"> = </span>p[<span class="d">2</span>];
-</code><code id="L997"><span class="ln">997</span> X.push(x);
-</code><code id="L998"><span class="ln">998</span> Y.push(y);
-</code><code id="L999"><span class="ln">999</span> } <b>else</b> {
-</code><code id="L1000"><span class="ln">1000</span> <b>var</b> dim<span class="s"> = </span>curveDim(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>]);
-</code><code id="L1001"><span class="ln">1001</span> X<span class="s"> = </span>X[concat](dim.min.x, dim.max.x);
-</code><code id="L1002"><span class="ln">1002</span> Y<span class="s"> = </span>Y[concat](dim.min.y, dim.max.y);
-</code><code id="L1003"><span class="ln">1003</span> x<span class="s"> = </span>p[<span class="d">5</span>];
-</code><code id="L1004"><span class="ln">1004</span> y<span class="s"> = </span>p[<span class="d">6</span>];
-</code><code id="L1005"><span class="ln">1005</span> }
-</code><code id="L1006"><span class="ln">1006</span> }
-</code><code id="L1007"><span class="ln">1007</span> <b>var</b> xmin<span class="s"> = </span>mmin[apply](<span class="d">0</span>, X),
-</code><code id="L1008"><span class="ln">1008</span> ymin<span class="s"> = </span>mmin[apply](<span class="d">0</span>, Y);
-</code><code id="L1009"><span class="ln">1009</span> <b>return</b> {
-</code><code id="L1010"><span class="ln">1010</span> x: xmin,
-</code><code id="L1011"><span class="ln">1011</span> y: ymin,
-</code><code id="L1012"><span class="ln">1012</span> width: mmax[apply](<span class="d">0</span>, X)<span class="s"> - </span>xmin,
-</code><code id="L1013"><span class="ln">1013</span> height: mmax[apply](<span class="d">0</span>, Y)<span class="s"> - </span>ymin
-</code><code id="L1014"><span class="ln">1014</span> };
-</code><code id="L1015"><span class="ln">1015</span> }),
-</code><code id="L1016"><span class="ln">1016</span> pathClone<span class="s"> = </span><b>function</b> (pathArray) {
-</code><code id="L1017"><span class="ln">1017</span> <b>var</b> res<span class="s"> = </span>[];
-</code><code id="L1018"><span class="ln">1018</span> <b>if</b> (!R.is(pathArray, array)<span class="s"> || </span>!R.is(pathArray<span class="s"> && </span>pathArray[<span class="d">0</span>], array)) { <span class="c">// rough assumption</span>
-</code><code id="L1019"><span class="ln">1019</span> pathArray<span class="s"> = </span>R.parsePathString(pathArray);
-</code><code id="L1020"><span class="ln">1020</span> }
-</code><code id="L1021"><span class="ln">1021</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>pathArray.length; i < ii; i++) {
-</code><code id="L1022"><span class="ln">1022</span> res[i]<span class="s"> = </span>[];
-</code><code id="L1023"><span class="ln">1023</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">0</span>, jj<span class="s"> = </span>pathArray[i].length; j < jj; j++) {
-</code><code id="L1024"><span class="ln">1024</span> res[i][j]<span class="s"> = </span>pathArray[i][j];
-</code><code id="L1025"><span class="ln">1025</span> }
-</code><code id="L1026"><span class="ln">1026</span> }
-</code><code id="L1027"><span class="ln">1027</span> res.toString<span class="s"> = </span>R._path2string;
-</code><code id="L1028"><span class="ln">1028</span> <b>return</b> res;
-</code><code id="L1029"><span class="ln">1029</span> },
-</code><code id="L1030"><span class="ln">1030</span> pathToRelative<span class="s"> = </span>cacher(<b>function</b> (pathArray) {
-</code><code id="L1031"><span class="ln">1031</span> <b>if</b> (!R.is(pathArray, array)<span class="s"> || </span>!R.is(pathArray<span class="s"> && </span>pathArray[<span class="d">0</span>], array)) { <span class="c">// rough assumption</span>
-</code><code id="L1032"><span class="ln">1032</span> pathArray<span class="s"> = </span>R.parsePathString(pathArray);
-</code><code id="L1033"><span class="ln">1033</span> }
-</code><code id="L1034"><span class="ln">1034</span> <b>var</b> res<span class="s"> = </span>[],
-</code><code id="L1035"><span class="ln">1035</span> x<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L1036"><span class="ln">1036</span> y<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L1037"><span class="ln">1037</span> mx<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L1038"><span class="ln">1038</span> my<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L1039"><span class="ln">1039</span> start<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L1040"><span class="ln">1040</span> <b>if</b> (pathArray[<span class="d">0</span>][<span class="d">0</span>]<span class="s"> == </span><i>"M"</i>) {
-</code><code id="L1041"><span class="ln">1041</span> x<span class="s"> = </span>pathArray[<span class="d">0</span>][<span class="d">1</span>];
-</code><code id="L1042"><span class="ln">1042</span> y<span class="s"> = </span>pathArray[<span class="d">0</span>][<span class="d">2</span>];
-</code><code id="L1043"><span class="ln">1043</span> mx<span class="s"> = </span>x;
-</code><code id="L1044"><span class="ln">1044</span> my<span class="s"> = </span>y;
-</code><code id="L1045"><span class="ln">1045</span> start++;
-</code><code id="L1046"><span class="ln">1046</span> res.push([<i>"M"</i>, x, y]);
-</code><code id="L1047"><span class="ln">1047</span> }
-</code><code id="L1048"><span class="ln">1048</span> <b>for</b> (<b>var</b> i<span class="s"> = </span>start, ii<span class="s"> = </span>pathArray.length; i < ii; i++) {
-</code><code id="L1049"><span class="ln">1049</span> <b>var</b> r<span class="s"> = </span>res[i]<span class="s"> = </span>[],
-</code><code id="L1050"><span class="ln">1050</span> pa<span class="s"> = </span>pathArray[i];
-</code><code id="L1051"><span class="ln">1051</span> <b>if</b> (pa[<span class="d">0</span>] != lowerCase.call(pa[<span class="d">0</span>])) {
-</code><code id="L1052"><span class="ln">1052</span> r[<span class="d">0</span>]<span class="s"> = </span>lowerCase.call(pa[<span class="d">0</span>]);
-</code><code id="L1053"><span class="ln">1053</span> <b>switch</b> (r[<span class="d">0</span>]) {
-</code><code id="L1054"><span class="ln">1054</span> <b>case</b> <i>"a"</i>:
-</code><code id="L1055"><span class="ln">1055</span> r[<span class="d">1</span>]<span class="s"> = </span>pa[<span class="d">1</span>];
-</code><code id="L1056"><span class="ln">1056</span> r[<span class="d">2</span>]<span class="s"> = </span>pa[<span class="d">2</span>];
-</code><code id="L1057"><span class="ln">1057</span> r[<span class="d">3</span>]<span class="s"> = </span>pa[<span class="d">3</span>];
-</code><code id="L1058"><span class="ln">1058</span> r[<span class="d">4</span>]<span class="s"> = </span>pa[<span class="d">4</span>];
-</code><code id="L1059"><span class="ln">1059</span> r[<span class="d">5</span>]<span class="s"> = </span>pa[<span class="d">5</span>];
-</code><code id="L1060"><span class="ln">1060</span> r[<span class="d">6</span>]<span class="s"> = </span>+(pa[<span class="d">6</span>]<span class="s"> - </span>x).toFixed(<span class="d">3</span>);
-</code><code id="L1061"><span class="ln">1061</span> r[<span class="d">7</span>]<span class="s"> = </span>+(pa[<span class="d">7</span>]<span class="s"> - </span>y).toFixed(<span class="d">3</span>);
-</code><code id="L1062"><span class="ln">1062</span> <b>break</b>;
-</code><code id="L1063"><span class="ln">1063</span> <b>case</b> <i>"v"</i>:
-</code><code id="L1064"><span class="ln">1064</span> r[<span class="d">1</span>]<span class="s"> = </span>+(pa[<span class="d">1</span>]<span class="s"> - </span>y).toFixed(<span class="d">3</span>);
-</code><code id="L1065"><span class="ln">1065</span> <b>break</b>;
-</code><code id="L1066"><span class="ln">1066</span> <b>case</b> <i>"m"</i>:
-</code><code id="L1067"><span class="ln">1067</span> mx<span class="s"> = </span>pa[<span class="d">1</span>];
-</code><code id="L1068"><span class="ln">1068</span> my<span class="s"> = </span>pa[<span class="d">2</span>];
-</code><code id="L1069"><span class="ln">1069</span> <b>default</b>:
-</code><code id="L1070"><span class="ln">1070</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>pa.length; j < jj; j++) {
-</code><code id="L1071"><span class="ln">1071</span> r[j]<span class="s"> = </span>+(pa[j]<span class="s"> - </span>((j<span class="s"> % </span><span class="d">2</span>) ? x : y)).toFixed(<span class="d">3</span>);
-</code><code id="L1072"><span class="ln">1072</span> }
-</code><code id="L1073"><span class="ln">1073</span> }
-</code><code id="L1074"><span class="ln">1074</span> } <b>else</b> {
-</code><code id="L1075"><span class="ln">1075</span> r<span class="s"> = </span>res[i]<span class="s"> = </span>[];
-</code><code id="L1076"><span class="ln">1076</span> <b>if</b> (pa[<span class="d">0</span>]<span class="s"> == </span><i>"m"</i>) {
-</code><code id="L1077"><span class="ln">1077</span> mx<span class="s"> = </span>pa[<span class="d">1</span>]<span class="s"> + </span>x;
-</code><code id="L1078"><span class="ln">1078</span> my<span class="s"> = </span>pa[<span class="d">2</span>]<span class="s"> + </span>y;
-</code><code id="L1079"><span class="ln">1079</span> }
-</code><code id="L1080"><span class="ln">1080</span> <b>for</b> (<b>var</b> k<span class="s"> = </span><span class="d">0</span>, kk<span class="s"> = </span>pa.length; k < kk; k++) {
-</code><code id="L1081"><span class="ln">1081</span> res[i][k]<span class="s"> = </span>pa[k];
-</code><code id="L1082"><span class="ln">1082</span> }
-</code><code id="L1083"><span class="ln">1083</span> }
-</code><code id="L1084"><span class="ln">1084</span> <b>var</b> len<span class="s"> = </span>res[i].length;
-</code><code id="L1085"><span class="ln">1085</span> <b>switch</b> (res[i][<span class="d">0</span>]) {
-</code><code id="L1086"><span class="ln">1086</span> <b>case</b> <i>"z"</i>:
-</code><code id="L1087"><span class="ln">1087</span> x<span class="s"> = </span>mx;
-</code><code id="L1088"><span class="ln">1088</span> y<span class="s"> = </span>my;
-</code><code id="L1089"><span class="ln">1089</span> <b>break</b>;
-</code><code id="L1090"><span class="ln">1090</span> <b>case</b> <i>"h"</i>:
-</code><code id="L1091"><span class="ln">1091</span> x += +res[i][len<span class="s"> - </span><span class="d">1</span>];
-</code><code id="L1092"><span class="ln">1092</span> <b>break</b>;
-</code><code id="L1093"><span class="ln">1093</span> <b>case</b> <i>"v"</i>:
-</code><code id="L1094"><span class="ln">1094</span> y += +res[i][len<span class="s"> - </span><span class="d">1</span>];
-</code><code id="L1095"><span class="ln">1095</span> <b>break</b>;
-</code><code id="L1096"><span class="ln">1096</span> <b>default</b>:
-</code><code id="L1097"><span class="ln">1097</span> x += +res[i][len<span class="s"> - </span><span class="d">2</span>];
-</code><code id="L1098"><span class="ln">1098</span> y += +res[i][len<span class="s"> - </span><span class="d">1</span>];
-</code><code id="L1099"><span class="ln">1099</span> }
-</code><code id="L1100"><span class="ln">1100</span> }
-</code><code id="L1101"><span class="ln">1101</span> res.toString<span class="s"> = </span>R._path2string;
-</code><code id="L1102"><span class="ln">1102</span> <b>return</b> res;
-</code><code id="L1103"><span class="ln">1103</span> }, <span class="d">0</span>, pathClone),
-</code><code id="L1104"><span class="ln">1104</span> pathToAbsolute<span class="s"> = </span>cacher(<b>function</b> (pathArray) {
-</code><code id="L1105"><span class="ln">1105</span> <b>if</b> (!R.is(pathArray, array)<span class="s"> || </span>!R.is(pathArray<span class="s"> && </span>pathArray[<span class="d">0</span>], array)) { <span class="c">// rough assumption</span>
-</code><code id="L1106"><span class="ln">1106</span> pathArray<span class="s"> = </span>R.parsePathString(pathArray);
-</code><code id="L1107"><span class="ln">1107</span> }
-</code><code id="L1108"><span class="ln">1108</span> <b>var</b> res<span class="s"> = </span>[],
-</code><code id="L1109"><span class="ln">1109</span> x<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L1110"><span class="ln">1110</span> y<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L1111"><span class="ln">1111</span> mx<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L1112"><span class="ln">1112</span> my<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L1113"><span class="ln">1113</span> start<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L1114"><span class="ln">1114</span> <b>if</b> (pathArray[<span class="d">0</span>][<span class="d">0</span>]<span class="s"> == </span><i>"M"</i>) {
-</code><code id="L1115"><span class="ln">1115</span> x<span class="s"> = </span>+pathArray[<span class="d">0</span>][<span class="d">1</span>];
-</code><code id="L1116"><span class="ln">1116</span> y<span class="s"> = </span>+pathArray[<span class="d">0</span>][<span class="d">2</span>];
-</code><code id="L1117"><span class="ln">1117</span> mx<span class="s"> = </span>x;
-</code><code id="L1118"><span class="ln">1118</span> my<span class="s"> = </span>y;
-</code><code id="L1119"><span class="ln">1119</span> start++;
-</code><code id="L1120"><span class="ln">1120</span> res[<span class="d">0</span>]<span class="s"> = </span>[<i>"M"</i>, x, y];
-</code><code id="L1121"><span class="ln">1121</span> }
-</code><code id="L1122"><span class="ln">1122</span> <b>for</b> (<b>var</b> i<span class="s"> = </span>start, ii<span class="s"> = </span>pathArray.length; i < ii; i++) {
-</code><code id="L1123"><span class="ln">1123</span> <b>var</b> r<span class="s"> = </span>res[i]<span class="s"> = </span>[],
-</code><code id="L1124"><span class="ln">1124</span> pa<span class="s"> = </span>pathArray[i];
-</code><code id="L1125"><span class="ln">1125</span> <b>if</b> (pa[<span class="d">0</span>] != upperCase.call(pa[<span class="d">0</span>])) {
-</code><code id="L1126"><span class="ln">1126</span> r[<span class="d">0</span>]<span class="s"> = </span>upperCase.call(pa[<span class="d">0</span>]);
-</code><code id="L1127"><span class="ln">1127</span> <b>switch</b> (r[<span class="d">0</span>]) {
-</code><code id="L1128"><span class="ln">1128</span> <b>case</b> <i>"A"</i>:
-</code><code id="L1129"><span class="ln">1129</span> r[<span class="d">1</span>]<span class="s"> = </span>pa[<span class="d">1</span>];
-</code><code id="L1130"><span class="ln">1130</span> r[<span class="d">2</span>]<span class="s"> = </span>pa[<span class="d">2</span>];
-</code><code id="L1131"><span class="ln">1131</span> r[<span class="d">3</span>]<span class="s"> = </span>pa[<span class="d">3</span>];
-</code><code id="L1132"><span class="ln">1132</span> r[<span class="d">4</span>]<span class="s"> = </span>pa[<span class="d">4</span>];
-</code><code id="L1133"><span class="ln">1133</span> r[<span class="d">5</span>]<span class="s"> = </span>pa[<span class="d">5</span>];
-</code><code id="L1134"><span class="ln">1134</span> r[<span class="d">6</span>]<span class="s"> = </span>+(pa[<span class="d">6</span>]<span class="s"> + </span>x);
-</code><code id="L1135"><span class="ln">1135</span> r[<span class="d">7</span>]<span class="s"> = </span>+(pa[<span class="d">7</span>]<span class="s"> + </span>y);
-</code><code id="L1136"><span class="ln">1136</span> <b>break</b>;
-</code><code id="L1137"><span class="ln">1137</span> <b>case</b> <i>"V"</i>:
-</code><code id="L1138"><span class="ln">1138</span> r[<span class="d">1</span>]<span class="s"> = </span>+pa[<span class="d">1</span>]<span class="s"> + </span>y;
-</code><code id="L1139"><span class="ln">1139</span> <b>break</b>;
-</code><code id="L1140"><span class="ln">1140</span> <b>case</b> <i>"H"</i>:
-</code><code id="L1141"><span class="ln">1141</span> r[<span class="d">1</span>]<span class="s"> = </span>+pa[<span class="d">1</span>]<span class="s"> + </span>x;
-</code><code id="L1142"><span class="ln">1142</span> <b>break</b>;
-</code><code id="L1143"><span class="ln">1143</span> <b>case</b> <i>"M"</i>:
-</code><code id="L1144"><span class="ln">1144</span> mx<span class="s"> = </span>+pa[<span class="d">1</span>]<span class="s"> + </span>x;
-</code><code id="L1145"><span class="ln">1145</span> my<span class="s"> = </span>+pa[<span class="d">2</span>]<span class="s"> + </span>y;
-</code><code id="L1146"><span class="ln">1146</span> <b>default</b>:
-</code><code id="L1147"><span class="ln">1147</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>pa.length; j < jj; j++) {
-</code><code id="L1148"><span class="ln">1148</span> r[j]<span class="s"> = </span>+pa[j]<span class="s"> + </span>((j<span class="s"> % </span><span class="d">2</span>) ? x : y);
-</code><code id="L1149"><span class="ln">1149</span> }
-</code><code id="L1150"><span class="ln">1150</span> }
-</code><code id="L1151"><span class="ln">1151</span> } <b>else</b> {
-</code><code id="L1152"><span class="ln">1152</span> <b>for</b> (<b>var</b> k<span class="s"> = </span><span class="d">0</span>, kk<span class="s"> = </span>pa.length; k < kk; k++) {
-</code><code id="L1153"><span class="ln">1153</span> res[i][k]<span class="s"> = </span>pa[k];
-</code><code id="L1154"><span class="ln">1154</span> }
-</code><code id="L1155"><span class="ln">1155</span> }
-</code><code id="L1156"><span class="ln">1156</span> <b>switch</b> (r[<span class="d">0</span>]) {
-</code><code id="L1157"><span class="ln">1157</span> <b>case</b> <i>"Z"</i>:
-</code><code id="L1158"><span class="ln">1158</span> x<span class="s"> = </span>mx;
-</code><code id="L1159"><span class="ln">1159</span> y<span class="s"> = </span>my;
-</code><code id="L1160"><span class="ln">1160</span> <b>break</b>;
-</code><code id="L1161"><span class="ln">1161</span> <b>case</b> <i>"H"</i>:
-</code><code id="L1162"><span class="ln">1162</span> x<span class="s"> = </span>r[<span class="d">1</span>];
-</code><code id="L1163"><span class="ln">1163</span> <b>break</b>;
-</code><code id="L1164"><span class="ln">1164</span> <b>case</b> <i>"V"</i>:
-</code><code id="L1165"><span class="ln">1165</span> y<span class="s"> = </span>r[<span class="d">1</span>];
-</code><code id="L1166"><span class="ln">1166</span> <b>break</b>;
-</code><code id="L1167"><span class="ln">1167</span> <b>case</b> <i>"M"</i>:
-</code><code id="L1168"><span class="ln">1168</span> mx<span class="s"> = </span>res[i][res[i].length<span class="s"> - </span><span class="d">2</span>];
-</code><code id="L1169"><span class="ln">1169</span> my<span class="s"> = </span>res[i][res[i].length<span class="s"> - </span><span class="d">1</span>];
-</code><code id="L1170"><span class="ln">1170</span> <b>default</b>:
-</code><code id="L1171"><span class="ln">1171</span> x<span class="s"> = </span>res[i][res[i].length<span class="s"> - </span><span class="d">2</span>];
-</code><code id="L1172"><span class="ln">1172</span> y<span class="s"> = </span>res[i][res[i].length<span class="s"> - </span><span class="d">1</span>];
-</code><code id="L1173"><span class="ln">1173</span> }
-</code><code id="L1174"><span class="ln">1174</span> }
-</code><code id="L1175"><span class="ln">1175</span> res.toString<span class="s"> = </span>R._path2string;
-</code><code id="L1176"><span class="ln">1176</span> <b>return</b> res;
-</code><code id="L1177"><span class="ln">1177</span> }, <b>null</b>, pathClone),
-</code><code id="L1178"><span class="ln">1178</span> l2c<span class="s"> = </span><b>function</b> (x1, y1, x2, y2) {
-</code><code id="L1179"><span class="ln">1179</span> <b>return</b> [x1, y1, x2, y2, x2, y2];
-</code><code id="L1180"><span class="ln">1180</span> },
-</code><code id="L1181"><span class="ln">1181</span> q2c<span class="s"> = </span><b>function</b> (x1, y1, ax, ay, x2, y2) {
-</code><code id="L1182"><span class="ln">1182</span> <b>var</b> _13<span class="s"> = </span><span class="d">1</span><span class="s"> / </span><span class="d">3</span>,
-</code><code id="L1183"><span class="ln">1183</span> _23<span class="s"> = </span><span class="d">2</span><span class="s"> / </span><span class="d">3</span>;
-</code><code id="L1184"><span class="ln">1184</span> <b>return</b> [
-</code><code id="L1185"><span class="ln">1185</span> _13<span class="s"> * </span>x1<span class="s"> + </span>_23<span class="s"> * </span>ax,
-</code><code id="L1186"><span class="ln">1186</span> _13<span class="s"> * </span>y1<span class="s"> + </span>_23<span class="s"> * </span>ay,
-</code><code id="L1187"><span class="ln">1187</span> _13<span class="s"> * </span>x2<span class="s"> + </span>_23<span class="s"> * </span>ax,
-</code><code id="L1188"><span class="ln">1188</span> _13<span class="s"> * </span>y2<span class="s"> + </span>_23<span class="s"> * </span>ay,
-</code><code id="L1189"><span class="ln">1189</span> x2,
-</code><code id="L1190"><span class="ln">1190</span> y2
-</code><code id="L1191"><span class="ln">1191</span> ];
-</code><code id="L1192"><span class="ln">1192</span> },
-</code><code id="L1193"><span class="ln">1193</span> a2c<span class="s"> = </span><b>function</b> (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {
-</code><code id="L1194"><span class="ln">1194</span> <span class="c">// <b>for</b> more information of where <b>this</b> math came from visit:</span>
-</code><code id="L1195"><span class="ln">1195</span> <span class="c">// http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes</span>
-</code><code id="L1196"><span class="ln">1196</span> <b>var</b> _120<span class="s"> = </span>PI<span class="s"> * </span><span class="d">120</span><span class="s"> / </span><span class="d">180</span>,
-</code><code id="L1197"><span class="ln">1197</span> rad<span class="s"> = </span>PI<span class="s"> / </span><span class="d">180</span><span class="s"> * </span>(+angle<span class="s"> || </span><span class="d">0</span>),
-</code><code id="L1198"><span class="ln">1198</span> res<span class="s"> = </span>[],
-</code><code id="L1199"><span class="ln">1199</span> xy,
-</code><code id="L1200"><span class="ln">1200</span> rotate<span class="s"> = </span>cacher(<b>function</b> (x, y, rad) {
-</code><code id="L1201"><span class="ln">1201</span> <b>var</b> X<span class="s"> = </span>x<span class="s"> * </span>math.cos(rad)<span class="s"> - </span>y<span class="s"> * </span>math.sin(rad),
-</code><code id="L1202"><span class="ln">1202</span> Y<span class="s"> = </span>x<span class="s"> * </span>math.sin(rad)<span class="s"> + </span>y<span class="s"> * </span>math.cos(rad);
-</code><code id="L1203"><span class="ln">1203</span> <b>return</b> {x: X, y: Y};
-</code><code id="L1204"><span class="ln">1204</span> });
-</code><code id="L1205"><span class="ln">1205</span> <b>if</b> (!recursive) {
-</code><code id="L1206"><span class="ln">1206</span> xy<span class="s"> = </span>rotate(x1, y1, -rad);
-</code><code id="L1207"><span class="ln">1207</span> x1<span class="s"> = </span>xy.x;
-</code><code id="L1208"><span class="ln">1208</span> y1<span class="s"> = </span>xy.y;
-</code><code id="L1209"><span class="ln">1209</span> xy<span class="s"> = </span>rotate(x2, y2, -rad);
-</code><code id="L1210"><span class="ln">1210</span> x2<span class="s"> = </span>xy.x;
-</code><code id="L1211"><span class="ln">1211</span> y2<span class="s"> = </span>xy.y;
-</code><code id="L1212"><span class="ln">1212</span> <b>var</b> cos<span class="s"> = </span>math.cos(PI<span class="s"> / </span><span class="d">180</span><span class="s"> * </span>angle),
-</code><code id="L1213"><span class="ln">1213</span> sin<span class="s"> = </span>math.sin(PI<span class="s"> / </span><span class="d">180</span><span class="s"> * </span>angle),
-</code><code id="L1214"><span class="ln">1214</span> x<span class="s"> = </span>(x1<span class="s"> - </span>x2)<span class="s"> / </span><span class="d">2</span>,
-</code><code id="L1215"><span class="ln">1215</span> y<span class="s"> = </span>(y1<span class="s"> - </span>y2)<span class="s"> / </span><span class="d">2</span>;
-</code><code id="L1216"><span class="ln">1216</span> <b>var</b> h<span class="s"> = </span>(x<span class="s"> * </span>x)<span class="s"> / </span>(rx<span class="s"> * </span>rx)<span class="s"> + </span>(y<span class="s"> * </span>y)<span class="s"> / </span>(ry<span class="s"> * </span>ry);
-</code><code id="L1217"><span class="ln">1217</span> <b>if</b> (h > <span class="d">1</span>) {
-</code><code id="L1218"><span class="ln">1218</span> h<span class="s"> = </span>math.sqrt(h);
-</code><code id="L1219"><span class="ln">1219</span> rx<span class="s"> = </span>h<span class="s"> * </span>rx;
-</code><code id="L1220"><span class="ln">1220</span> ry<span class="s"> = </span>h<span class="s"> * </span>ry;
-</code><code id="L1221"><span class="ln">1221</span> }
-</code><code id="L1222"><span class="ln">1222</span> <b>var</b> rx2<span class="s"> = </span>rx<span class="s"> * </span>rx,
-</code><code id="L1223"><span class="ln">1223</span> ry2<span class="s"> = </span>ry<span class="s"> * </span>ry,
-</code><code id="L1224"><span class="ln">1224</span> k<span class="s"> = </span>(large_arc_flag<span class="s"> == </span>sweep_flag ? -<span class="d">1</span> : <span class="d">1</span>) *
-</code><code id="L1225"><span class="ln">1225</span> math.sqrt(abs((rx2<span class="s"> * </span>ry2<span class="s"> - </span>rx2<span class="s"> * </span>y<span class="s"> * </span>y<span class="s"> - </span>ry2<span class="s"> * </span>x<span class="s"> * </span>x)<span class="s"> / </span>(rx2<span class="s"> * </span>y<span class="s"> * </span>y<span class="s"> + </span>ry2<span class="s"> * </span>x<span class="s"> * </span>x))),
-</code><code id="L1226"><span class="ln">1226</span> cx<span class="s"> = </span>k<span class="s"> * </span>rx<span class="s"> * </span>y<span class="s"> / </span>ry<span class="s"> + </span>(x1<span class="s"> + </span>x2)<span class="s"> / </span><span class="d">2</span>,
-</code><code id="L1227"><span class="ln">1227</span> cy<span class="s"> = </span>k<span class="s"> * </span>-ry<span class="s"> * </span>x<span class="s"> / </span>rx<span class="s"> + </span>(y1<span class="s"> + </span>y2)<span class="s"> / </span><span class="d">2</span>,
-</code><code id="L1228"><span class="ln">1228</span> f1<span class="s"> = </span>math.asin(((y1<span class="s"> - </span>cy)<span class="s"> / </span>ry).toFixed(<span class="d">9</span>)),
-</code><code id="L1229"><span class="ln">1229</span> f2<span class="s"> = </span>math.asin(((y2<span class="s"> - </span>cy)<span class="s"> / </span>ry).toFixed(<span class="d">9</span>));
-</code><code id="L1230"><span class="ln">1230</span>
-</code><code id="L1231"><span class="ln">1231</span> f1<span class="s"> = </span>x1 < cx ? PI<span class="s"> - </span>f1 : f1;
-</code><code id="L1232"><span class="ln">1232</span> f2<span class="s"> = </span>x2 < cx ? PI<span class="s"> - </span>f2 : f2;
-</code><code id="L1233"><span class="ln">1233</span> f1 < <span class="d">0</span><span class="s"> && </span>(f1<span class="s"> = </span>PI<span class="s"> * </span><span class="d">2</span><span class="s"> + </span>f1);
-</code><code id="L1234"><span class="ln">1234</span> f2 < <span class="d">0</span><span class="s"> && </span>(f2<span class="s"> = </span>PI<span class="s"> * </span><span class="d">2</span><span class="s"> + </span>f2);
-</code><code id="L1235"><span class="ln">1235</span> <b>if</b> (sweep_flag<span class="s"> && </span>f1 > f2) {
-</code><code id="L1236"><span class="ln">1236</span> f1<span class="s"> = </span>f1<span class="s"> - </span>PI<span class="s"> * </span><span class="d">2</span>;
-</code><code id="L1237"><span class="ln">1237</span> }
-</code><code id="L1238"><span class="ln">1238</span> <b>if</b> (!sweep_flag<span class="s"> && </span>f2 > f1) {
-</code><code id="L1239"><span class="ln">1239</span> f2<span class="s"> = </span>f2<span class="s"> - </span>PI<span class="s"> * </span><span class="d">2</span>;
-</code><code id="L1240"><span class="ln">1240</span> }
-</code><code id="L1241"><span class="ln">1241</span> } <b>else</b> {
-</code><code id="L1242"><span class="ln">1242</span> f1<span class="s"> = </span>recursive[<span class="d">0</span>];
-</code><code id="L1243"><span class="ln">1243</span> f2<span class="s"> = </span>recursive[<span class="d">1</span>];
-</code><code id="L1244"><span class="ln">1244</span> cx<span class="s"> = </span>recursive[<span class="d">2</span>];
-</code><code id="L1245"><span class="ln">1245</span> cy<span class="s"> = </span>recursive[<span class="d">3</span>];
-</code><code id="L1246"><span class="ln">1246</span> }
-</code><code id="L1247"><span class="ln">1247</span> <b>var</b> df<span class="s"> = </span>f2<span class="s"> - </span>f1;
-</code><code id="L1248"><span class="ln">1248</span> <b>if</b> (abs(df) > _120) {
-</code><code id="L1249"><span class="ln">1249</span> <b>var</b> f2old<span class="s"> = </span>f2,
-</code><code id="L1250"><span class="ln">1250</span> x2old<span class="s"> = </span>x2,
-</code><code id="L1251"><span class="ln">1251</span> y2old<span class="s"> = </span>y2;
-</code><code id="L1252"><span class="ln">1252</span> f2<span class="s"> = </span>f1<span class="s"> + </span>_120<span class="s"> * </span>(sweep_flag<span class="s"> && </span>f2 > f1 ? <span class="d">1</span> : -<span class="d">1</span>);
-</code><code id="L1253"><span class="ln">1253</span> x2<span class="s"> = </span>cx<span class="s"> + </span>rx<span class="s"> * </span>math.cos(f2);
-</code><code id="L1254"><span class="ln">1254</span> y2<span class="s"> = </span>cy<span class="s"> + </span>ry<span class="s"> * </span>math.sin(f2);
-</code><code id="L1255"><span class="ln">1255</span> res<span class="s"> = </span>a2c(x2, y2, rx, ry, angle, <span class="d">0</span>, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);
-</code><code id="L1256"><span class="ln">1256</span> }
-</code><code id="L1257"><span class="ln">1257</span> df<span class="s"> = </span>f2<span class="s"> - </span>f1;
-</code><code id="L1258"><span class="ln">1258</span> <b>var</b> c1<span class="s"> = </span>math.cos(f1),
-</code><code id="L1259"><span class="ln">1259</span> s1<span class="s"> = </span>math.sin(f1),
-</code><code id="L1260"><span class="ln">1260</span> c2<span class="s"> = </span>math.cos(f2),
-</code><code id="L1261"><span class="ln">1261</span> s2<span class="s"> = </span>math.sin(f2),
-</code><code id="L1262"><span class="ln">1262</span> t<span class="s"> = </span>math.tan(df<span class="s"> / </span><span class="d">4</span>),
-</code><code id="L1263"><span class="ln">1263</span> hx<span class="s"> = </span><span class="d">4</span><span class="s"> / </span><span class="d">3</span><span class="s"> * </span>rx<span class="s"> * </span>t,
-</code><code id="L1264"><span class="ln">1264</span> hy<span class="s"> = </span><span class="d">4</span><span class="s"> / </span><span class="d">3</span><span class="s"> * </span>ry<span class="s"> * </span>t,
-</code><code id="L1265"><span class="ln">1265</span> m1<span class="s"> = </span>[x1, y1],
-</code><code id="L1266"><span class="ln">1266</span> m2<span class="s"> = </span>[x1<span class="s"> + </span>hx<span class="s"> * </span>s1, y1<span class="s"> - </span>hy<span class="s"> * </span>c1],
-</code><code id="L1267"><span class="ln">1267</span> m3<span class="s"> = </span>[x2<span class="s"> + </span>hx<span class="s"> * </span>s2, y2<span class="s"> - </span>hy<span class="s"> * </span>c2],
-</code><code id="L1268"><span class="ln">1268</span> m4<span class="s"> = </span>[x2, y2];
-</code><code id="L1269"><span class="ln">1269</span> m2[<span class="d">0</span>]<span class="s"> = </span><span class="d">2</span><span class="s"> * </span>m1[<span class="d">0</span>]<span class="s"> - </span>m2[<span class="d">0</span>];
-</code><code id="L1270"><span class="ln">1270</span> m2[<span class="d">1</span>]<span class="s"> = </span><span class="d">2</span><span class="s"> * </span>m1[<span class="d">1</span>]<span class="s"> - </span>m2[<span class="d">1</span>];
-</code><code id="L1271"><span class="ln">1271</span> <b>if</b> (recursive) {
-</code><code id="L1272"><span class="ln">1272</span> <b>return</b> [m2, m3, m4][concat](res);
-</code><code id="L1273"><span class="ln">1273</span> } <b>else</b> {
-</code><code id="L1274"><span class="ln">1274</span> res<span class="s"> = </span>[m2, m3, m4][concat](res).join().split(<i>","</i>);
-</code><code id="L1275"><span class="ln">1275</span> <b>var</b> newres<span class="s"> = </span>[];
-</code><code id="L1276"><span class="ln">1276</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>res.length; i < ii; i++) {
-</code><code id="L1277"><span class="ln">1277</span> newres[i]<span class="s"> = </span>i<span class="s"> % </span><span class="d">2</span> ? rotate(res[i<span class="s"> - </span><span class="d">1</span>], res[i], rad).y : rotate(res[i], res[i<span class="s"> + </span><span class="d">1</span>], rad).x;
-</code><code id="L1278"><span class="ln">1278</span> }
-</code><code id="L1279"><span class="ln">1279</span> <b>return</b> newres;
-</code><code id="L1280"><span class="ln">1280</span> }
-</code><code id="L1281"><span class="ln">1281</span> },
-</code><code id="L1282"><span class="ln">1282</span> findDotAtSegment<span class="s"> = </span><b>function</b> (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
-</code><code id="L1283"><span class="ln">1283</span> <b>var</b> t1<span class="s"> = </span><span class="d">1</span><span class="s"> - </span>t;
-</code><code id="L1284"><span class="ln">1284</span> <b>return</b> {
-</code><code id="L1285"><span class="ln">1285</span> x: pow(t1, <span class="d">3</span>)<span class="s"> * </span>p1x<span class="s"> + </span>pow(t1, <span class="d">2</span>)<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>c1x<span class="s"> + </span>t1<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>t<span class="s"> * </span>c2x<span class="s"> + </span>pow(t, <span class="d">3</span>)<span class="s"> * </span>p2x,
-</code><code id="L1286"><span class="ln">1286</span> y: pow(t1, <span class="d">3</span>)<span class="s"> * </span>p1y<span class="s"> + </span>pow(t1, <span class="d">2</span>)<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>c1y<span class="s"> + </span>t1<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>t<span class="s"> * </span>c2y<span class="s"> + </span>pow(t, <span class="d">3</span>)<span class="s"> * </span>p2y
-</code><code id="L1287"><span class="ln">1287</span> };
-</code><code id="L1288"><span class="ln">1288</span> },
-</code><code id="L1289"><span class="ln">1289</span> curveDim<span class="s"> = </span>cacher(<b>function</b> (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {
-</code><code id="L1290"><span class="ln">1290</span> <b>var</b> a<span class="s"> = </span>(c2x<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>c1x<span class="s"> + </span>p1x)<span class="s"> - </span>(p2x<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>c2x<span class="s"> + </span>c1x),
-</code><code id="L1291"><span class="ln">1291</span> b<span class="s"> = </span><span class="d">2</span><span class="s"> * </span>(c1x<span class="s"> - </span>p1x)<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>(c2x<span class="s"> - </span>c1x),
-</code><code id="L1292"><span class="ln">1292</span> c<span class="s"> = </span>p1x<span class="s"> - </span>c1x,
-</code><code id="L1293"><span class="ln">1293</span> t1<span class="s"> = </span>(-b<span class="s"> + </span>math.sqrt(b<span class="s"> * </span>b<span class="s"> - </span><span class="d">4</span><span class="s"> * </span>a<span class="s"> * </span>c))<span class="s"> / </span><span class="d">2</span><span class="s"> / </span>a,
-</code><code id="L1294"><span class="ln">1294</span> t2<span class="s"> = </span>(-b<span class="s"> - </span>math.sqrt(b<span class="s"> * </span>b<span class="s"> - </span><span class="d">4</span><span class="s"> * </span>a<span class="s"> * </span>c))<span class="s"> / </span><span class="d">2</span><span class="s"> / </span>a,
-</code><code id="L1295"><span class="ln">1295</span> y<span class="s"> = </span>[p1y, p2y],
-</code><code id="L1296"><span class="ln">1296</span> x<span class="s"> = </span>[p1x, p2x],
-</code><code id="L1297"><span class="ln">1297</span> dot;
-</code><code id="L1298"><span class="ln">1298</span> abs(t1) > <i>"<span class="d">1e12</span>"</i><span class="s"> && </span>(t1<span class="s"> = </span><span class="d">.5</span>);
-</code><code id="L1299"><span class="ln">1299</span> abs(t2) > <i>"<span class="d">1e12</span>"</i><span class="s"> && </span>(t2<span class="s"> = </span><span class="d">.5</span>);
-</code><code id="L1300"><span class="ln">1300</span> <b>if</b> (t1 > <span class="d">0</span><span class="s"> && </span>t1 < <span class="d">1</span>) {
-</code><code id="L1301"><span class="ln">1301</span> dot<span class="s"> = </span>findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);
-</code><code id="L1302"><span class="ln">1302</span> x.push(dot.x);
-</code><code id="L1303"><span class="ln">1303</span> y.push(dot.y);
-</code><code id="L1304"><span class="ln">1304</span> }
-</code><code id="L1305"><span class="ln">1305</span> <b>if</b> (t2 > <span class="d">0</span><span class="s"> && </span>t2 < <span class="d">1</span>) {
-</code><code id="L1306"><span class="ln">1306</span> dot<span class="s"> = </span>findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);
-</code><code id="L1307"><span class="ln">1307</span> x.push(dot.x);
-</code><code id="L1308"><span class="ln">1308</span> y.push(dot.y);
-</code><code id="L1309"><span class="ln">1309</span> }
-</code><code id="L1310"><span class="ln">1310</span> a<span class="s"> = </span>(c2y<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>c1y<span class="s"> + </span>p1y)<span class="s"> - </span>(p2y<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>c2y<span class="s"> + </span>c1y);
-</code><code id="L1311"><span class="ln">1311</span> b<span class="s"> = </span><span class="d">2</span><span class="s"> * </span>(c1y<span class="s"> - </span>p1y)<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>(c2y<span class="s"> - </span>c1y);
-</code><code id="L1312"><span class="ln">1312</span> c<span class="s"> = </span>p1y<span class="s"> - </span>c1y;
-</code><code id="L1313"><span class="ln">1313</span> t1<span class="s"> = </span>(-b<span class="s"> + </span>math.sqrt(b<span class="s"> * </span>b<span class="s"> - </span><span class="d">4</span><span class="s"> * </span>a<span class="s"> * </span>c))<span class="s"> / </span><span class="d">2</span><span class="s"> / </span>a;
-</code><code id="L1314"><span class="ln">1314</span> t2<span class="s"> = </span>(-b<span class="s"> - </span>math.sqrt(b<span class="s"> * </span>b<span class="s"> - </span><span class="d">4</span><span class="s"> * </span>a<span class="s"> * </span>c))<span class="s"> / </span><span class="d">2</span><span class="s"> / </span>a;
-</code><code id="L1315"><span class="ln">1315</span> abs(t1) > <i>"<span class="d">1e12</span>"</i><span class="s"> && </span>(t1<span class="s"> = </span><span class="d">.5</span>);
-</code><code id="L1316"><span class="ln">1316</span> abs(t2) > <i>"<span class="d">1e12</span>"</i><span class="s"> && </span>(t2<span class="s"> = </span><span class="d">.5</span>);
-</code><code id="L1317"><span class="ln">1317</span> <b>if</b> (t1 > <span class="d">0</span><span class="s"> && </span>t1 < <span class="d">1</span>) {
-</code><code id="L1318"><span class="ln">1318</span> dot<span class="s"> = </span>findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);
-</code><code id="L1319"><span class="ln">1319</span> x.push(dot.x);
-</code><code id="L1320"><span class="ln">1320</span> y.push(dot.y);
-</code><code id="L1321"><span class="ln">1321</span> }
-</code><code id="L1322"><span class="ln">1322</span> <b>if</b> (t2 > <span class="d">0</span><span class="s"> && </span>t2 < <span class="d">1</span>) {
-</code><code id="L1323"><span class="ln">1323</span> dot<span class="s"> = </span>findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);
-</code><code id="L1324"><span class="ln">1324</span> x.push(dot.x);
-</code><code id="L1325"><span class="ln">1325</span> y.push(dot.y);
-</code><code id="L1326"><span class="ln">1326</span> }
-</code><code id="L1327"><span class="ln">1327</span> <b>return</b> {
-</code><code id="L1328"><span class="ln">1328</span> min: {x: mmin[apply](<span class="d">0</span>, x), y: mmin[apply](<span class="d">0</span>, y)},
-</code><code id="L1329"><span class="ln">1329</span> max: {x: mmax[apply](<span class="d">0</span>, x), y: mmax[apply](<span class="d">0</span>, y)}
-</code><code id="L1330"><span class="ln">1330</span> };
-</code><code id="L1331"><span class="ln">1331</span> }),
-</code><code id="L1332"><span class="ln">1332</span> path2curve<span class="s"> = </span>cacher(<b>function</b> (path, path2) {
-</code><code id="L1333"><span class="ln">1333</span> <b>var</b> p<span class="s"> = </span>pathToAbsolute(path),
-</code><code id="L1334"><span class="ln">1334</span> p2<span class="s"> = </span>path2<span class="s"> && </span>pathToAbsolute(path2),
-</code><code id="L1335"><span class="ln">1335</span> attrs<span class="s"> = </span>{x: <span class="d">0</span>, y: <span class="d">0</span>, bx: <span class="d">0</span>, by: <span class="d">0</span>, X: <span class="d">0</span>, Y: <span class="d">0</span>, qx: <b>null</b>, qy: <b>null</b>},
-</code><code id="L1336"><span class="ln">1336</span> attrs2<span class="s"> = </span>{x: <span class="d">0</span>, y: <span class="d">0</span>, bx: <span class="d">0</span>, by: <span class="d">0</span>, X: <span class="d">0</span>, Y: <span class="d">0</span>, qx: <b>null</b>, qy: <b>null</b>},
-</code><code id="L1337"><span class="ln">1337</span> processPath<span class="s"> = </span><b>function</b> (path, d) {
-</code><code id="L1338"><span class="ln">1338</span> <b>var</b> nx, ny;
-</code><code id="L1339"><span class="ln">1339</span> <b>if</b> (!path) {
-</code><code id="L1340"><span class="ln">1340</span> <b>return</b> [<i>"C"</i>, d.x, d.y, d.x, d.y, d.x, d.y];
-</code><code id="L1341"><span class="ln">1341</span> }
-</code><code id="L1342"><span class="ln">1342</span> !(path[<span class="d">0</span>] <b>in</b> {T:<span class="d">1</span>, Q:<span class="d">1</span>})<span class="s"> && </span>(d.qx<span class="s"> = </span>d.qy<span class="s"> = </span><b>null</b>);
-</code><code id="L1343"><span class="ln">1343</span> <b>switch</b> (path[<span class="d">0</span>]) {
-</code><code id="L1344"><span class="ln">1344</span> <b>case</b> <i>"M"</i>:
-</code><code id="L1345"><span class="ln">1345</span> d.X<span class="s"> = </span>path[<span class="d">1</span>];
-</code><code id="L1346"><span class="ln">1346</span> d.Y<span class="s"> = </span>path[<span class="d">2</span>];
-</code><code id="L1347"><span class="ln">1347</span> <b>break</b>;
-</code><code id="L1348"><span class="ln">1348</span> <b>case</b> <i>"A"</i>:
-</code><code id="L1349"><span class="ln">1349</span> path<span class="s"> = </span>[<i>"C"</i>][concat](a2c[apply](<span class="d">0</span>, [d.x, d.y][concat](path.slice(<span class="d">1</span>))));
-</code><code id="L1350"><span class="ln">1350</span> <b>break</b>;
-</code><code id="L1351"><span class="ln">1351</span> <b>case</b> <i>"S"</i>:
-</code><code id="L1352"><span class="ln">1352</span> nx<span class="s"> = </span>d.x<span class="s"> + </span>(d.x<span class="s"> - </span>(d.bx<span class="s"> || </span>d.x));
-</code><code id="L1353"><span class="ln">1353</span> ny<span class="s"> = </span>d.y<span class="s"> + </span>(d.y<span class="s"> - </span>(d.by<span class="s"> || </span>d.y));
-</code><code id="L1354"><span class="ln">1354</span> path<span class="s"> = </span>[<i>"C"</i>, nx, ny][concat](path.slice(<span class="d">1</span>));
-</code><code id="L1355"><span class="ln">1355</span> <b>break</b>;
-</code><code id="L1356"><span class="ln">1356</span> <b>case</b> <i>"T"</i>:
-</code><code id="L1357"><span class="ln">1357</span> d.qx<span class="s"> = </span>d.x<span class="s"> + </span>(d.x<span class="s"> - </span>(d.qx<span class="s"> || </span>d.x));
-</code><code id="L1358"><span class="ln">1358</span> d.qy<span class="s"> = </span>d.y<span class="s"> + </span>(d.y<span class="s"> - </span>(d.qy<span class="s"> || </span>d.y));
-</code><code id="L1359"><span class="ln">1359</span> path<span class="s"> = </span>[<i>"C"</i>][concat](q2c(d.x, d.y, d.qx, d.qy, path[<span class="d">1</span>], path[<span class="d">2</span>]));
-</code><code id="L1360"><span class="ln">1360</span> <b>break</b>;
-</code><code id="L1361"><span class="ln">1361</span> <b>case</b> <i>"Q"</i>:
-</code><code id="L1362"><span class="ln">1362</span> d.qx<span class="s"> = </span>path[<span class="d">1</span>];
-</code><code id="L1363"><span class="ln">1363</span> d.qy<span class="s"> = </span>path[<span class="d">2</span>];
-</code><code id="L1364"><span class="ln">1364</span> path<span class="s"> = </span>[<i>"C"</i>][concat](q2c(d.x, d.y, path[<span class="d">1</span>], path[<span class="d">2</span>], path[<span class="d">3</span>], path[<span class="d">4</span>]));
-</code><code id="L1365"><span class="ln">1365</span> <b>break</b>;
-</code><code id="L1366"><span class="ln">1366</span> <b>case</b> <i>"L"</i>:
-</code><code id="L1367"><span class="ln">1367</span> path<span class="s"> = </span>[<i>"C"</i>][concat](l2c(d.x, d.y, path[<span class="d">1</span>], path[<span class="d">2</span>]));
-</code><code id="L1368"><span class="ln">1368</span> <b>break</b>;
-</code><code id="L1369"><span class="ln">1369</span> <b>case</b> <i>"H"</i>:
-</code><code id="L1370"><span class="ln">1370</span> path<span class="s"> = </span>[<i>"C"</i>][concat](l2c(d.x, d.y, path[<span class="d">1</span>], d.y));
-</code><code id="L1371"><span class="ln">1371</span> <b>break</b>;
-</code><code id="L1372"><span class="ln">1372</span> <b>case</b> <i>"V"</i>:
-</code><code id="L1373"><span class="ln">1373</span> path<span class="s"> = </span>[<i>"C"</i>][concat](l2c(d.x, d.y, d.x, path[<span class="d">1</span>]));
-</code><code id="L1374"><span class="ln">1374</span> <b>break</b>;
-</code><code id="L1375"><span class="ln">1375</span> <b>case</b> <i>"Z"</i>:
-</code><code id="L1376"><span class="ln">1376</span> path<span class="s"> = </span>[<i>"C"</i>][concat](l2c(d.x, d.y, d.X, d.Y));
-</code><code id="L1377"><span class="ln">1377</span> <b>break</b>;
-</code><code id="L1378"><span class="ln">1378</span> }
-</code><code id="L1379"><span class="ln">1379</span> <b>return</b> path;
-</code><code id="L1380"><span class="ln">1380</span> },
-</code><code id="L1381"><span class="ln">1381</span> fixArc<span class="s"> = </span><b>function</b> (pp, i) {
-</code><code id="L1382"><span class="ln">1382</span> <b>if</b> (pp[i].length > <span class="d">7</span>) {
-</code><code id="L1383"><span class="ln">1383</span> pp[i].shift();
-</code><code id="L1384"><span class="ln">1384</span> <b>var</b> pi<span class="s"> = </span>pp[i];
-</code><code id="L1385"><span class="ln">1385</span> <b>while</b> (pi.length) {
-</code><code id="L1386"><span class="ln">1386</span> pp.splice(i++, <span class="d">0</span>, [<i>"C"</i>][concat](pi.splice(<span class="d">0</span>, <span class="d">6</span>)));
-</code><code id="L1387"><span class="ln">1387</span> }
-</code><code id="L1388"><span class="ln">1388</span> pp.splice(i, <span class="d">1</span>);
-</code><code id="L1389"><span class="ln">1389</span> ii<span class="s"> = </span>mmax(p.length, p2<span class="s"> && </span>p2.length<span class="s"> || </span><span class="d">0</span>);
-</code><code id="L1390"><span class="ln">1390</span> }
-</code><code id="L1391"><span class="ln">1391</span> },
-</code><code id="L1392"><span class="ln">1392</span> fixM<span class="s"> = </span><b>function</b> (path1, path2, a1, a2, i) {
-</code><code id="L1393"><span class="ln">1393</span> <b>if</b> (path1<span class="s"> && </span>path2<span class="s"> && </span>path1[i][<span class="d">0</span>]<span class="s"> == </span><i>"M"</i><span class="s"> && </span>path2[i][<span class="d">0</span>] != <i>"M"</i>) {
-</code><code id="L1394"><span class="ln">1394</span> path2.splice(i, <span class="d">0</span>, [<i>"M"</i>, a2.x, a2.y]);
-</code><code id="L1395"><span class="ln">1395</span> a1.bx<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L1396"><span class="ln">1396</span> a1.by<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L1397"><span class="ln">1397</span> a1.x<span class="s"> = </span>path1[i][<span class="d">1</span>];
-</code><code id="L1398"><span class="ln">1398</span> a1.y<span class="s"> = </span>path1[i][<span class="d">2</span>];
-</code><code id="L1399"><span class="ln">1399</span> ii<span class="s"> = </span>mmax(p.length, p2<span class="s"> && </span>p2.length<span class="s"> || </span><span class="d">0</span>);
-</code><code id="L1400"><span class="ln">1400</span> }
-</code><code id="L1401"><span class="ln">1401</span> };
-</code><code id="L1402"><span class="ln">1402</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>mmax(p.length, p2<span class="s"> && </span>p2.length<span class="s"> || </span><span class="d">0</span>); i < ii; i++) {
-</code><code id="L1403"><span class="ln">1403</span> p[i]<span class="s"> = </span>processPath(p[i], attrs);
-</code><code id="L1404"><span class="ln">1404</span> fixArc(p, i);
-</code><code id="L1405"><span class="ln">1405</span> p2<span class="s"> && </span>(p2[i]<span class="s"> = </span>processPath(p2[i], attrs2));
-</code><code id="L1406"><span class="ln">1406</span> p2<span class="s"> && </span>fixArc(p2, i);
-</code><code id="L1407"><span class="ln">1407</span> fixM(p, p2, attrs, attrs2, i);
-</code><code id="L1408"><span class="ln">1408</span> fixM(p2, p, attrs2, attrs, i);
-</code><code id="L1409"><span class="ln">1409</span> <b>var</b> seg<span class="s"> = </span>p[i],
-</code><code id="L1410"><span class="ln">1410</span> seg2<span class="s"> = </span>p2<span class="s"> && </span>p2[i],
-</code><code id="L1411"><span class="ln">1411</span> seglen<span class="s"> = </span>seg.length,
-</code><code id="L1412"><span class="ln">1412</span> seg2len<span class="s"> = </span>p2<span class="s"> && </span>seg2.length;
-</code><code id="L1413"><span class="ln">1413</span> attrs.x<span class="s"> = </span>seg[seglen<span class="s"> - </span><span class="d">2</span>];
-</code><code id="L1414"><span class="ln">1414</span> attrs.y<span class="s"> = </span>seg[seglen<span class="s"> - </span><span class="d">1</span>];
-</code><code id="L1415"><span class="ln">1415</span> attrs.bx<span class="s"> = </span>toFloat(seg[seglen<span class="s"> - </span><span class="d">4</span>])<span class="s"> || </span>attrs.x;
-</code><code id="L1416"><span class="ln">1416</span> attrs.by<span class="s"> = </span>toFloat(seg[seglen<span class="s"> - </span><span class="d">3</span>])<span class="s"> || </span>attrs.y;
-</code><code id="L1417"><span class="ln">1417</span> attrs2.bx<span class="s"> = </span>p2<span class="s"> && </span>(toFloat(seg2[seg2len<span class="s"> - </span><span class="d">4</span>])<span class="s"> || </span>attrs2.x);
-</code><code id="L1418"><span class="ln">1418</span> attrs2.by<span class="s"> = </span>p2<span class="s"> && </span>(toFloat(seg2[seg2len<span class="s"> - </span><span class="d">3</span>])<span class="s"> || </span>attrs2.y);
-</code><code id="L1419"><span class="ln">1419</span> attrs2.x<span class="s"> = </span>p2<span class="s"> && </span>seg2[seg2len<span class="s"> - </span><span class="d">2</span>];
-</code><code id="L1420"><span class="ln">1420</span> attrs2.y<span class="s"> = </span>p2<span class="s"> && </span>seg2[seg2len<span class="s"> - </span><span class="d">1</span>];
-</code><code id="L1421"><span class="ln">1421</span> }
-</code><code id="L1422"><span class="ln">1422</span> <b>return</b> p2 ? [p, p2] : p;
-</code><code id="L1423"><span class="ln">1423</span> }, <b>null</b>, pathClone),
-</code><code id="L1424"><span class="ln">1424</span> parseDots<span class="s"> = </span>cacher(<b>function</b> (gradient) {
-</code><code id="L1425"><span class="ln">1425</span> <b>var</b> dots<span class="s"> = </span>[];
-</code><code id="L1426"><span class="ln">1426</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>gradient.length; i < ii; i++) {
-</code><code id="L1427"><span class="ln">1427</span> <b>var</b> dot<span class="s"> = </span>{},
-</code><code id="L1428"><span class="ln">1428</span> par<span class="s"> = </span>gradient[i].match(/^([^:]*):?([\d\.]*)/);
-</code><code id="L1429"><span class="ln">1429</span> dot.color<span class="s"> = </span>R.getRGB(par[<span class="d">1</span>]);
-</code><code id="L1430"><span class="ln">1430</span> <b>if</b> (dot.color.error) {
-</code><code id="L1431"><span class="ln">1431</span> <b>return</b> <b>null</b>;
-</code><code id="L1432"><span class="ln">1432</span> }
-</code><code id="L1433"><span class="ln">1433</span> dot.color<span class="s"> = </span>dot.color.hex;
-</code><code id="L1434"><span class="ln">1434</span> par[<span class="d">2</span>]<span class="s"> && </span>(dot.offset<span class="s"> = </span>par[<span class="d">2</span>]<span class="s"> + </span><i>"%"</i>);
-</code><code id="L1435"><span class="ln">1435</span> dots.push(dot);
-</code><code id="L1436"><span class="ln">1436</span> }
-</code><code id="L1437"><span class="ln">1437</span> <b>for</b> (i<span class="s"> = </span><span class="d">1</span>, ii<span class="s"> = </span>dots.length<span class="s"> - </span><span class="d">1</span>; i < ii; i++) {
-</code><code id="L1438"><span class="ln">1438</span> <b>if</b> (!dots[i].offset) {
-</code><code id="L1439"><span class="ln">1439</span> <b>var</b> start<span class="s"> = </span>toFloat(dots[i<span class="s"> - </span><span class="d">1</span>].offset<span class="s"> || </span><span class="d">0</span>),
-</code><code id="L1440"><span class="ln">1440</span> end<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L1441"><span class="ln">1441</span> <b>for</b> (<b>var</b> j<span class="s"> = </span>i<span class="s"> + </span><span class="d">1</span>; j < ii; j++) {
-</code><code id="L1442"><span class="ln">1442</span> <b>if</b> (dots[j].offset) {
-</code><code id="L1443"><span class="ln">1443</span> end<span class="s"> = </span>dots[j].offset;
-</code><code id="L1444"><span class="ln">1444</span> <b>break</b>;
-</code><code id="L1445"><span class="ln">1445</span> }
-</code><code id="L1446"><span class="ln">1446</span> }
-</code><code id="L1447"><span class="ln">1447</span> <b>if</b> (!end) {
-</code><code id="L1448"><span class="ln">1448</span> end<span class="s"> = </span><span class="d">100</span>;
-</code><code id="L1449"><span class="ln">1449</span> j<span class="s"> = </span>ii;
-</code><code id="L1450"><span class="ln">1450</span> }
-</code><code id="L1451"><span class="ln">1451</span> end<span class="s"> = </span>toFloat(end);
-</code><code id="L1452"><span class="ln">1452</span> <b>var</b> d<span class="s"> = </span>(end<span class="s"> - </span>start)<span class="s"> / </span>(j<span class="s"> - </span>i<span class="s"> + </span><span class="d">1</span>);
-</code><code id="L1453"><span class="ln">1453</span> <b>for</b> (; i < j; i++) {
-</code><code id="L1454"><span class="ln">1454</span> start += d;
-</code><code id="L1455"><span class="ln">1455</span> dots[i].offset<span class="s"> = </span>start<span class="s"> + </span><i>"%"</i>;
-</code><code id="L1456"><span class="ln">1456</span> }
-</code><code id="L1457"><span class="ln">1457</span> }
-</code><code id="L1458"><span class="ln">1458</span> }
-</code><code id="L1459"><span class="ln">1459</span> <b>return</b> dots;
-</code><code id="L1460"><span class="ln">1460</span> }),
-</code><code id="L1461"><span class="ln">1461</span> getContainer<span class="s"> = </span><b>function</b> (x, y, w, h) {
-</code><code id="L1462"><span class="ln">1462</span> <b>var</b> container;
-</code><code id="L1463"><span class="ln">1463</span> container<span class="s"> = </span>h<span class="s"> == </span><b>null</b><span class="s"> && </span>!R.is(x, <i>"object"</i>) ? g.doc.getElementById(x) : x;
-</code><code id="L1464"><span class="ln">1464</span> <b>if</b> (container<span class="s"> == </span><b>null</b>) {
-</code><code id="L1465"><span class="ln">1465</span> <b>return</b>;
-</code><code id="L1466"><span class="ln">1466</span> }
-</code><code id="L1467"><span class="ln">1467</span> <b>if</b> (container.tagName) {
-</code><code id="L1468"><span class="ln">1468</span> <b>if</b> (y<span class="s"> == </span><b>null</b>) {
-</code><code id="L1469"><span class="ln">1469</span> <b>return</b> {
-</code><code id="L1470"><span class="ln">1470</span> container: container,
-</code><code id="L1471"><span class="ln">1471</span> width: container.style.pixelWidth<span class="s"> || </span>container.offsetWidth,
-</code><code id="L1472"><span class="ln">1472</span> height: container.style.pixelHeight<span class="s"> || </span>container.offsetHeight
-</code><code id="L1473"><span class="ln">1473</span> };
-</code><code id="L1474"><span class="ln">1474</span> } <b>else</b> {
-</code><code id="L1475"><span class="ln">1475</span> <b>return</b> {container: container, width: y, height: w};
-</code><code id="L1476"><span class="ln">1476</span> }
-</code><code id="L1477"><span class="ln">1477</span> }
-</code><code id="L1478"><span class="ln">1478</span> <b>return</b> {container: <span class="d">1</span>, x: x, y: y, width: w, height: h};
-</code><code id="L1479"><span class="ln">1479</span> },
-</code><code id="L1480"><span class="ln">1480</span> plugins<span class="s"> = </span><b>function</b> (con, add) {
-</code><code id="L1481"><span class="ln">1481</span> <b>var</b> that<span class="s"> = </span><b>this</b>;
-</code><code id="L1482"><span class="ln">1482</span> <b>for</b> (<b>var</b> prop <b>in</b> add) {
-</code><code id="L1483"><span class="ln">1483</span> <b>if</b> (add[has](prop)<span class="s"> && </span>!(prop <b>in</b> con)) {
-</code><code id="L1484"><span class="ln">1484</span> <b>switch</b> (<b>typeof</b> add[prop]) {
-</code><code id="L1485"><span class="ln">1485</span> <b>case</b> <i>"<b>function</b>"</i>:
-</code><code id="L1486"><span class="ln">1486</span> (<b>function</b> (f) {
-</code><code id="L1487"><span class="ln">1487</span> con[prop]<span class="s"> = </span>con<span class="s"> === </span>that ? f : <b>function</b> () { <b>return</b> f[apply](that, arguments); };
-</code><code id="L1488"><span class="ln">1488</span> })(add[prop]);
-</code><code id="L1489"><span class="ln">1489</span> <b>break</b>;
-</code><code id="L1490"><span class="ln">1490</span> <b>case</b> <i>"object"</i>:
-</code><code id="L1491"><span class="ln">1491</span> con[prop]<span class="s"> = </span>con[prop]<span class="s"> || </span>{};
-</code><code id="L1492"><span class="ln">1492</span> plugins.call(<b>this</b>, con[prop], add[prop]);
-</code><code id="L1493"><span class="ln">1493</span> <b>break</b>;
-</code><code id="L1494"><span class="ln">1494</span> <b>default</b>:
-</code><code id="L1495"><span class="ln">1495</span> con[prop]<span class="s"> = </span>add[prop];
-</code><code id="L1496"><span class="ln">1496</span> <b>break</b>;
-</code><code id="L1497"><span class="ln">1497</span> }
-</code><code id="L1498"><span class="ln">1498</span> }
-</code><code id="L1499"><span class="ln">1499</span> }
-</code><code id="L1500"><span class="ln">1500</span> },
-</code><code id="L1501"><span class="ln">1501</span> tear<span class="s"> = </span><b>function</b> (el, paper) {
-</code><code id="L1502"><span class="ln">1502</span> el<span class="s"> == </span>paper.top<span class="s"> && </span>(paper.top<span class="s"> = </span>el.prev);
-</code><code id="L1503"><span class="ln">1503</span> el<span class="s"> == </span>paper.bottom<span class="s"> && </span>(paper.bottom<span class="s"> = </span>el.next);
-</code><code id="L1504"><span class="ln">1504</span> el.next<span class="s"> && </span>(el.next.prev<span class="s"> = </span>el.prev);
-</code><code id="L1505"><span class="ln">1505</span> el.prev<span class="s"> && </span>(el.prev.next<span class="s"> = </span>el.next);
-</code><code id="L1506"><span class="ln">1506</span> },
-</code><code id="L1507"><span class="ln">1507</span> tofront<span class="s"> = </span><b>function</b> (el, paper) {
-</code><code id="L1508"><span class="ln">1508</span> <b>if</b> (paper.top<span class="s"> === </span>el) {
-</code><code id="L1509"><span class="ln">1509</span> <b>return</b>;
-</code><code id="L1510"><span class="ln">1510</span> }
-</code><code id="L1511"><span class="ln">1511</span> tear(el, paper);
-</code><code id="L1512"><span class="ln">1512</span> el.next<span class="s"> = </span><b>null</b>;
-</code><code id="L1513"><span class="ln">1513</span> el.prev<span class="s"> = </span>paper.top;
-</code><code id="L1514"><span class="ln">1514</span> paper.top.next<span class="s"> = </span>el;
-</code><code id="L1515"><span class="ln">1515</span> paper.top<span class="s"> = </span>el;
-</code><code id="L1516"><span class="ln">1516</span> },
-</code><code id="L1517"><span class="ln">1517</span> toback<span class="s"> = </span><b>function</b> (el, paper) {
-</code><code id="L1518"><span class="ln">1518</span> <b>if</b> (paper.bottom<span class="s"> === </span>el) {
-</code><code id="L1519"><span class="ln">1519</span> <b>return</b>;
-</code><code id="L1520"><span class="ln">1520</span> }
-</code><code id="L1521"><span class="ln">1521</span> tear(el, paper);
-</code><code id="L1522"><span class="ln">1522</span> el.next<span class="s"> = </span>paper.bottom;
-</code><code id="L1523"><span class="ln">1523</span> el.prev<span class="s"> = </span><b>null</b>;
-</code><code id="L1524"><span class="ln">1524</span> paper.bottom.prev<span class="s"> = </span>el;
-</code><code id="L1525"><span class="ln">1525</span> paper.bottom<span class="s"> = </span>el;
-</code><code id="L1526"><span class="ln">1526</span> },
-</code><code id="L1527"><span class="ln">1527</span> insertafter<span class="s"> = </span><b>function</b> (el, el2, paper) {
-</code><code id="L1528"><span class="ln">1528</span> tear(el, paper);
-</code><code id="L1529"><span class="ln">1529</span> el2<span class="s"> == </span>paper.top<span class="s"> && </span>(paper.top<span class="s"> = </span>el);
-</code><code id="L1530"><span class="ln">1530</span> el2.next<span class="s"> && </span>(el2.next.prev<span class="s"> = </span>el);
-</code><code id="L1531"><span class="ln">1531</span> el.next<span class="s"> = </span>el2.next;
-</code><code id="L1532"><span class="ln">1532</span> el.prev<span class="s"> = </span>el2;
-</code><code id="L1533"><span class="ln">1533</span> el2.next<span class="s"> = </span>el;
-</code><code id="L1534"><span class="ln">1534</span> },
-</code><code id="L1535"><span class="ln">1535</span> insertbefore<span class="s"> = </span><b>function</b> (el, el2, paper) {
-</code><code id="L1536"><span class="ln">1536</span> tear(el, paper);
-</code><code id="L1537"><span class="ln">1537</span> el2<span class="s"> == </span>paper.bottom<span class="s"> && </span>(paper.bottom<span class="s"> = </span>el);
-</code><code id="L1538"><span class="ln">1538</span> el2.prev<span class="s"> && </span>(el2.prev.next<span class="s"> = </span>el);
-</code><code id="L1539"><span class="ln">1539</span> el.prev<span class="s"> = </span>el2.prev;
-</code><code id="L1540"><span class="ln">1540</span> el2.prev<span class="s"> = </span>el;
-</code><code id="L1541"><span class="ln">1541</span> el.next<span class="s"> = </span>el2;
-</code><code id="L1542"><span class="ln">1542</span> },
-</code><code id="L1543"><span class="ln">1543</span> removed<span class="s"> = </span><b>function</b> (methodname) {
-</code><code id="L1544"><span class="ln">1544</span> <b>return</b> <b>function</b> () {
-</code><code id="L1545"><span class="ln">1545</span> <b>throw</b> <b>new</b> Error(<i>"Rapha\xebl: you are calling to method \u201c"</i><span class="s"> + </span>methodname<span class="s"> + </span><i>"\u201d of removed object"</i>);
-</code><code id="L1546"><span class="ln">1546</span> };
-</code><code id="L1547"><span class="ln">1547</span> },
-</code><code id="L1548"><span class="ln">1548</span> extractTransform<span class="s"> = </span><b>function</b> (el, tstr) {
-</code><code id="L1549"><span class="ln">1549</span> <b>if</b> (tstr<span class="s"> == </span><b>null</b>) {
-</code><code id="L1550"><span class="ln">1550</span> <b>return</b> el._.transform;
-</code><code id="L1551"><span class="ln">1551</span> }
-</code><code id="L1552"><span class="ln">1552</span> tstr<span class="s"> = </span>Str(tstr).replace(/\.{<span class="d">3</span>}|\u2026/g, el._.transform<span class="s"> || </span>E);
-</code><code id="L1553"><span class="ln">1553</span> <b>var</b> tdata<span class="s"> = </span>R.parseTransformString(tstr),
-</code><code id="L1554"><span class="ln">1554</span> deg<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L1555"><span class="ln">1555</span> dx<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L1556"><span class="ln">1556</span> dy<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L1557"><span class="ln">1557</span> sx<span class="s"> = </span><span class="d">1</span>,
-</code><code id="L1558"><span class="ln">1558</span> sy<span class="s"> = </span><span class="d">1</span>,
-</code><code id="L1559"><span class="ln">1559</span> _<span class="s"> = </span>el._,
-</code><code id="L1560"><span class="ln">1560</span> m<span class="s"> = </span><b>new</b> Matrix;
-</code><code id="L1561"><span class="ln">1561</span> _.transform<span class="s"> = </span>tdata<span class="s"> || </span>[];
-</code><code id="L1562"><span class="ln">1562</span> <b>if</b> (tdata) {
-</code><code id="L1563"><span class="ln">1563</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>tdata.length; i < ii; i++) {
-</code><code id="L1564"><span class="ln">1564</span> <b>var</b> t<span class="s"> = </span>tdata[i],
-</code><code id="L1565"><span class="ln">1565</span> tlen<span class="s"> = </span>t.length,
-</code><code id="L1566"><span class="ln">1566</span> bb;
-</code><code id="L1567"><span class="ln">1567</span> t[<span class="d">0</span>]<span class="s"> = </span>Str(t[<span class="d">0</span>]).toLowerCase();
-</code><code id="L1568"><span class="ln">1568</span> <b>if</b> (t[<span class="d">0</span>]<span class="s"> == </span><i>"t"</i><span class="s"> && </span>tlen<span class="s"> == </span><span class="d">3</span>) {
-</code><code id="L1569"><span class="ln">1569</span> m.translate(t[<span class="d">1</span>], t[<span class="d">2</span>]);
-</code><code id="L1570"><span class="ln">1570</span> } <b>else</b> <b>if</b> (t[<span class="d">0</span>]<span class="s"> == </span><i>"r"</i>) {
-</code><code id="L1571"><span class="ln">1571</span> <b>if</b> (tlen<span class="s"> == </span><span class="d">2</span>) {
-</code><code id="L1572"><span class="ln">1572</span> bb<span class="s"> = </span>bb<span class="s"> || </span>el.getBBox(<span class="d">1</span>);
-</code><code id="L1573"><span class="ln">1573</span> m.rotate(t[<span class="d">1</span>], bb.x<span class="s"> + </span>bb.width<span class="s"> / </span><span class="d">2</span>, bb.y<span class="s"> + </span>bb.height<span class="s"> / </span><span class="d">2</span>);
-</code><code id="L1574"><span class="ln">1574</span> deg += t[<span class="d">1</span>];
-</code><code id="L1575"><span class="ln">1575</span> } <b>else</b> <b>if</b> (tlen<span class="s"> == </span><span class="d">4</span>) {
-</code><code id="L1576"><span class="ln">1576</span> m.rotate(t[<span class="d">1</span>], t[<span class="d">2</span>], t[<span class="d">3</span>]);
-</code><code id="L1577"><span class="ln">1577</span> deg += t[<span class="d">1</span>];
-</code><code id="L1578"><span class="ln">1578</span> }
-</code><code id="L1579"><span class="ln">1579</span> } <b>else</b> <b>if</b> (t[<span class="d">0</span>]<span class="s"> == </span><i>"s"</i>) {
-</code><code id="L1580"><span class="ln">1580</span> <b>if</b> (tlen<span class="s"> == </span><span class="d">2</span><span class="s"> || </span>tlen<span class="s"> == </span><span class="d">3</span>) {
-</code><code id="L1581"><span class="ln">1581</span> bb<span class="s"> = </span>bb<span class="s"> || </span>el.getBBox(<span class="d">1</span>);
-</code><code id="L1582"><span class="ln">1582</span> m.scale(t[<span class="d">1</span>], t[tlen<span class="s"> - </span><span class="d">1</span>], bb.x<span class="s"> + </span>bb.width<span class="s"> / </span><span class="d">2</span>, bb.y<span class="s"> + </span>bb.height<span class="s"> / </span><span class="d">2</span>);
-</code><code id="L1583"><span class="ln">1583</span> sx *= t[<span class="d">1</span>];
-</code><code id="L1584"><span class="ln">1584</span> sy *= t[tlen<span class="s"> - </span><span class="d">1</span>];
-</code><code id="L1585"><span class="ln">1585</span> } <b>else</b> <b>if</b> (tlen<span class="s"> == </span><span class="d">5</span>) {
-</code><code id="L1586"><span class="ln">1586</span> m.scale(t[<span class="d">1</span>], t[<span class="d">2</span>], t[<span class="d">3</span>], t[<span class="d">4</span>]);
-</code><code id="L1587"><span class="ln">1587</span> sx *= t[<span class="d">1</span>];
-</code><code id="L1588"><span class="ln">1588</span> sy *= t[<span class="d">2</span>];
-</code><code id="L1589"><span class="ln">1589</span> }
-</code><code id="L1590"><span class="ln">1590</span> } <b>else</b> <b>if</b> (t[<span class="d">0</span>]<span class="s"> == </span><i>"m"</i><span class="s"> && </span>tlen<span class="s"> == </span><span class="d">7</span>) {
-</code><code id="L1591"><span class="ln">1591</span> m.add(t[<span class="d">1</span>], t[<span class="d">2</span>], t[<span class="d">3</span>], t[<span class="d">4</span>], t[<span class="d">5</span>], t[<span class="d">6</span>]);
-</code><code id="L1592"><span class="ln">1592</span> }
-</code><code id="L1593"><span class="ln">1593</span> _.dirtyT<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L1594"><span class="ln">1594</span> el.matrix<span class="s"> = </span>m;
-</code><code id="L1595"><span class="ln">1595</span> }
-</code><code id="L1596"><span class="ln">1596</span> }
-</code><code id="L1597"><span class="ln">1597</span>
-</code><code id="L1598"><span class="ln">1598</span> el.matrix<span class="s"> = </span>m;
-</code><code id="L1599"><span class="ln">1599</span>
-</code><code id="L1600"><span class="ln">1600</span> _.sx<span class="s"> = </span>sx;
-</code><code id="L1601"><span class="ln">1601</span> _.sy<span class="s"> = </span>sy;
-</code><code id="L1602"><span class="ln">1602</span> _.deg<span class="s"> = </span>deg;
-</code><code id="L1603"><span class="ln">1603</span> _.dx<span class="s"> = </span>dx<span class="s"> = </span>m.m[<span class="d">0</span>][<span class="d">2</span>];
-</code><code id="L1604"><span class="ln">1604</span> _.dy<span class="s"> = </span>dy<span class="s"> = </span>m.m[<span class="d">1</span>][<span class="d">2</span>];
-</code><code id="L1605"><span class="ln">1605</span>
-</code><code id="L1606"><span class="ln">1606</span> <b>if</b> (sx<span class="s"> == </span><span class="d">1</span><span class="s"> && </span>sy<span class="s"> == </span><span class="d">1</span><span class="s"> && </span>!deg<span class="s"> && </span>_.bbox) {
-</code><code id="L1607"><span class="ln">1607</span> _.bbox.x += +dx;
-</code><code id="L1608"><span class="ln">1608</span> _.bbox.y += +dy;
-</code><code id="L1609"><span class="ln">1609</span> } <b>else</b> {
-</code><code id="L1610"><span class="ln">1610</span> _.dirtyT<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L1611"><span class="ln">1611</span> }
-</code><code id="L1612"><span class="ln">1612</span> },
-</code><code id="L1613"><span class="ln">1613</span> getEmpty<span class="s"> = </span><b>function</b> (item) {
-</code><code id="L1614"><span class="ln">1614</span> <b>switch</b> (item[<span class="d">0</span>]) {
-</code><code id="L1615"><span class="ln">1615</span> <b>case</b> <i>"t"</i>: <b>return</b> [<i>"t"</i>, <span class="d">0</span>, <span class="d">0</span>];
-</code><code id="L1616"><span class="ln">1616</span> <b>case</b> <i>"m"</i>: <b>return</b> [<i>"m"</i>, <span class="d">1</span>, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, <span class="d">0</span>, <span class="d">0</span>];
-</code><code id="L1617"><span class="ln">1617</span> <b>case</b> <i>"r"</i>: <b>if</b> (item.length<span class="s"> == </span><span class="d">4</span>) {
-</code><code id="L1618"><span class="ln">1618</span> <b>return</b> [<i>"r"</i>, <span class="d">0</span>, item[<span class="d">2</span>], item[<span class="d">3</span>]];
-</code><code id="L1619"><span class="ln">1619</span> } <b>else</b> {
-</code><code id="L1620"><span class="ln">1620</span> <b>return</b> [<i>"r"</i>, <span class="d">0</span>];
-</code><code id="L1621"><span class="ln">1621</span> }
-</code><code id="L1622"><span class="ln">1622</span> <b>case</b> <i>"s"</i>: <b>if</b> (item.length<span class="s"> == </span><span class="d">5</span>) {
-</code><code id="L1623"><span class="ln">1623</span> <b>return</b> [<i>"s"</i>, <span class="d">1</span>, <span class="d">1</span>, item[<span class="d">3</span>], item[<span class="d">4</span>]];
-</code><code id="L1624"><span class="ln">1624</span> } <b>else</b> <b>if</b> (item.length<span class="s"> == </span><span class="d">3</span>) {
-</code><code id="L1625"><span class="ln">1625</span> <b>return</b> [<i>"s"</i>, <span class="d">1</span>, <span class="d">1</span>];
-</code><code id="L1626"><span class="ln">1626</span> } <b>else</b> {
-</code><code id="L1627"><span class="ln">1627</span> <b>return</b> [<i>"s"</i>, <span class="d">1</span>];
-</code><code id="L1628"><span class="ln">1628</span> }
-</code><code id="L1629"><span class="ln">1629</span> }
-</code><code id="L1630"><span class="ln">1630</span> },
-</code><code id="L1631"><span class="ln">1631</span> equaliseTransform<span class="s"> = </span><b>function</b> (t1, t2) {
-</code><code id="L1632"><span class="ln">1632</span> t1<span class="s"> = </span>R.parseTransformString(t1)<span class="s"> || </span>[];
-</code><code id="L1633"><span class="ln">1633</span> t2<span class="s"> = </span>R.parseTransformString(t2)<span class="s"> || </span>[];
-</code><code id="L1634"><span class="ln">1634</span> <b>var</b> maxlength<span class="s"> = </span>mmax(t1.length, t2.length),
-</code><code id="L1635"><span class="ln">1635</span> from<span class="s"> = </span>[],
-</code><code id="L1636"><span class="ln">1636</span> to<span class="s"> = </span>[],
-</code><code id="L1637"><span class="ln">1637</span> i<span class="s"> = </span><span class="d">0</span>, j, jj,
-</code><code id="L1638"><span class="ln">1638</span> tt1, tt2;
-</code><code id="L1639"><span class="ln">1639</span> <b>for</b> (; i < maxlength; i++) {
-</code><code id="L1640"><span class="ln">1640</span> tt1<span class="s"> = </span>t1[i]<span class="s"> || </span>getEmpty(t2[i]);
-</code><code id="L1641"><span class="ln">1641</span> tt2<span class="s"> = </span>t2[i]<span class="s"> || </span>getEmpty(tt1);
-</code><code id="L1642"><span class="ln">1642</span> <b>if</b> ( (tt1[<span class="d">0</span>] != tt2[<span class="d">0</span>]) ||
-</code><code id="L1643"><span class="ln">1643</span> (tt1[<span class="d">0</span>]<span class="s"> == </span><i>"r"</i><span class="s"> && </span>(tt1[<span class="d">2</span>] != tt2[<span class="d">2</span>]<span class="s"> || </span>tt1[<span class="d">3</span>] != tt2[<span class="d">3</span>])) ||
-</code><code id="L1644"><span class="ln">1644</span> (tt1[<span class="d">0</span>]<span class="s"> == </span><i>"s"</i><span class="s"> && </span>(tt1[<span class="d">3</span>] != tt2[<span class="d">3</span>]<span class="s"> || </span>tt1[<span class="d">4</span>] != tt2[<span class="d">4</span>]))
-</code><code id="L1645"><span class="ln">1645</span> ) {
-</code><code id="L1646"><span class="ln">1646</span> <b>return</b>;
-</code><code id="L1647"><span class="ln">1647</span> }
-</code><code id="L1648"><span class="ln">1648</span> from[i]<span class="s"> = </span>[];
-</code><code id="L1649"><span class="ln">1649</span> to[i]<span class="s"> = </span>[];
-</code><code id="L1650"><span class="ln">1650</span> <b>for</b> (j<span class="s"> = </span><span class="d">0</span>, jj<span class="s"> = </span>mmax(tt1.length, tt2.length); j < jj; j++) {
-</code><code id="L1651"><span class="ln">1651</span> j <b>in</b> tt1<span class="s"> && </span>(from[i][j]<span class="s"> = </span>tt1[j]);
-</code><code id="L1652"><span class="ln">1652</span> j <b>in</b> tt2<span class="s"> && </span>(to[i][j]<span class="s"> = </span>tt2[j]);
-</code><code id="L1653"><span class="ln">1653</span> }
-</code><code id="L1654"><span class="ln">1654</span> }
-</code><code id="L1655"><span class="ln">1655</span> <b>return</b> {
-</code><code id="L1656"><span class="ln">1656</span> from: from,
-</code><code id="L1657"><span class="ln">1657</span> to: to
-</code><code id="L1658"><span class="ln">1658</span> };
-</code><code id="L1659"><span class="ln">1659</span> };
-</code><code id="L1660"><span class="ln">1660</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L1661"><span class="ln">1661</span><span class="c"> <span class="s"> * </span>Raphael.pathToRelative
-</span></code><code id="L1662"><span class="ln">1662</span><span class="c"> [ method ]
-</span></code><code id="L1663"><span class="ln">1663</span><span class="c"> **
-</span></code><code id="L1664"><span class="ln">1664</span><span class="c"> <span class="s"> * </span>Utility method
-</span></code><code id="L1665"><span class="ln">1665</span><span class="c"> **
-</span></code><code id="L1666"><span class="ln">1666</span><span class="c"> <span class="s"> * </span>Converts path to relative form
-</span></code><code id="L1667"><span class="ln">1667</span><span class="c"> > Parameters
-</span></code><code id="L1668"><span class="ln">1668</span><span class="c"> <span class="s"> - </span>pathString (string|array) path string or array of segments
-</span></code><code id="L1669"><span class="ln">1669</span><span class="c"> <span class="s"> = </span>(array) array of segments.
-</span></code><code id="L1670"><span class="ln">1670</span><span class="c"> \*/</span>
-</code><code id="L1671"><span class="ln">1671</span> R.pathToRelative<span class="s"> = </span>pathToRelative;
-</code><code id="L1672"><span class="ln">1672</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L1673"><span class="ln">1673</span><span class="c"> <span class="s"> * </span>Raphael.path2curve
-</span></code><code id="L1674"><span class="ln">1674</span><span class="c"> [ method ]
-</span></code><code id="L1675"><span class="ln">1675</span><span class="c"> **
-</span></code><code id="L1676"><span class="ln">1676</span><span class="c"> <span class="s"> * </span>Utility method
-</span></code><code id="L1677"><span class="ln">1677</span><span class="c"> **
-</span></code><code id="L1678"><span class="ln">1678</span><span class="c"> <span class="s"> * </span>Converts path to path where all segments are cubic bezier curves.
-</span></code><code id="L1679"><span class="ln">1679</span><span class="c"> > Parameters
-</span></code><code id="L1680"><span class="ln">1680</span><span class="c"> <span class="s"> - </span>pathString (string|array) path string or array of segments
-</span></code><code id="L1681"><span class="ln">1681</span><span class="c"> <span class="s"> = </span>(array) array of segments.
-</span></code><code id="L1682"><span class="ln">1682</span><span class="c"> \*/</span>
-</code><code id="L1683"><span class="ln">1683</span> R.path2curve<span class="s"> = </span>path2curve;
-</code><code id="L1684"><span class="ln">1684</span> <span class="c">// Matrix</span>
-</code><code id="L1685"><span class="ln">1685</span> <span class="c">// <b>var</b> m<span class="s"> = </span>document.createElementNS(<i>"http://www.w3.org/<span class="d">2000</span>/svg"</i>, <i>"svg"</i>).createSVGMatrix();</span>
-</code><code id="L1686"><span class="ln">1686</span> <b>function</b> Matrix(a, b, c, d, e, f) {
-</code><code id="L1687"><span class="ln">1687</span> <b>if</b> (a != <b>null</b>) {
-</code><code id="L1688"><span class="ln">1688</span> <b>this</b>.m<span class="s"> = </span>[[a, c, e], [b, d, f], [<span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>]];
-</code><code id="L1689"><span class="ln">1689</span> } <b>else</b> {
-</code><code id="L1690"><span class="ln">1690</span> <b>this</b>.m<span class="s"> = </span>[[<span class="d">1</span>, <span class="d">0</span>, <span class="d">0</span>], [<span class="d">0</span>, <span class="d">1</span>, <span class="d">0</span>], [<span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>]];
-</code><code id="L1691"><span class="ln">1691</span> }
-</code><code id="L1692"><span class="ln">1692</span> }
-</code><code id="L1693"><span class="ln">1693</span> <b>var</b> matrixproto<span class="s"> = </span>Matrix.prototype;
-</code><code id="L1694"><span class="ln">1694</span> matrixproto.add<span class="s"> = </span><b>function</b> (a, b, c, d, e, f) {
-</code><code id="L1695"><span class="ln">1695</span> <b>var</b> out<span class="s"> = </span>[[], [], []],
-</code><code id="L1696"><span class="ln">1696</span> matrix<span class="s"> = </span>[[a, c, e], [b, d, f], [<span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>]],
-</code><code id="L1697"><span class="ln">1697</span> x, y, z, res;
-</code><code id="L1698"><span class="ln">1698</span>
-</code><code id="L1699"><span class="ln">1699</span> <b>for</b> (x<span class="s"> = </span><span class="d">0</span>; x < <span class="d">3</span>; x++) {
-</code><code id="L1700"><span class="ln">1700</span> <b>for</b> (y<span class="s"> = </span><span class="d">0</span>; y < <span class="d">3</span>; y++) {
-</code><code id="L1701"><span class="ln">1701</span> res<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L1702"><span class="ln">1702</span> <b>for</b> (z<span class="s"> = </span><span class="d">0</span>; z < <span class="d">3</span>; z++) {
-</code><code id="L1703"><span class="ln">1703</span> res += <b>this</b>.m[x][z]<span class="s"> * </span>matrix[z][y];
-</code><code id="L1704"><span class="ln">1704</span> }
-</code><code id="L1705"><span class="ln">1705</span> out[x][y]<span class="s"> = </span>res;
-</code><code id="L1706"><span class="ln">1706</span> }
-</code><code id="L1707"><span class="ln">1707</span> }
-</code><code id="L1708"><span class="ln">1708</span> <b>this</b>.m<span class="s"> = </span>out;
-</code><code id="L1709"><span class="ln">1709</span> };
-</code><code id="L1710"><span class="ln">1710</span> matrixproto.invert<span class="s"> = </span><b>function</b> () {
-</code><code id="L1711"><span class="ln">1711</span> <b>var</b> a<span class="s"> = </span><b>this</b>.m[<span class="d">0</span>][<span class="d">0</span>],
-</code><code id="L1712"><span class="ln">1712</span> b<span class="s"> = </span><b>this</b>.m[<span class="d">1</span>][<span class="d">0</span>],
-</code><code id="L1713"><span class="ln">1713</span> c<span class="s"> = </span><b>this</b>.m[<span class="d">0</span>][<span class="d">1</span>],
-</code><code id="L1714"><span class="ln">1714</span> d<span class="s"> = </span><b>this</b>.m[<span class="d">1</span>][<span class="d">1</span>],
-</code><code id="L1715"><span class="ln">1715</span> e<span class="s"> = </span><b>this</b>.m[<span class="d">0</span>][<span class="d">2</span>],
-</code><code id="L1716"><span class="ln">1716</span> f<span class="s"> = </span><b>this</b>.m[<span class="d">1</span>][<span class="d">2</span>],
-</code><code id="L1717"><span class="ln">1717</span> x<span class="s"> = </span>a<span class="s"> * </span>d<span class="s"> - </span>b<span class="s"> * </span>c;
-</code><code id="L1718"><span class="ln">1718</span> <b>return</b> <b>new</b> Matrix(d<span class="s"> / </span>x, -b<span class="s"> / </span>x, -c<span class="s"> / </span>x, a<span class="s"> / </span>x, (c<span class="s"> * </span>f<span class="s"> - </span>d<span class="s"> * </span>e)<span class="s"> / </span>x, (b<span class="s"> * </span>e<span class="s"> - </span>a<span class="s"> * </span>f)<span class="s"> / </span>x);
-</code><code id="L1719"><span class="ln">1719</span> };
-</code><code id="L1720"><span class="ln">1720</span> matrixproto.clone<span class="s"> = </span><b>function</b> () {
-</code><code id="L1721"><span class="ln">1721</span> <b>var</b> a<span class="s"> = </span><b>this</b>.m[<span class="d">0</span>][<span class="d">0</span>],
-</code><code id="L1722"><span class="ln">1722</span> b<span class="s"> = </span><b>this</b>.m[<span class="d">1</span>][<span class="d">0</span>],
-</code><code id="L1723"><span class="ln">1723</span> c<span class="s"> = </span><b>this</b>.m[<span class="d">0</span>][<span class="d">1</span>],
-</code><code id="L1724"><span class="ln">1724</span> d<span class="s"> = </span><b>this</b>.m[<span class="d">1</span>][<span class="d">1</span>],
-</code><code id="L1725"><span class="ln">1725</span> e<span class="s"> = </span><b>this</b>.m[<span class="d">0</span>][<span class="d">2</span>],
-</code><code id="L1726"><span class="ln">1726</span> f<span class="s"> = </span><b>this</b>.m[<span class="d">1</span>][<span class="d">2</span>];
-</code><code id="L1727"><span class="ln">1727</span> <b>return</b> <b>new</b> Matrix(a, b, c, d, e, f);
-</code><code id="L1728"><span class="ln">1728</span> };
-</code><code id="L1729"><span class="ln">1729</span> matrixproto.translate<span class="s"> = </span><b>function</b> (x, y) {
-</code><code id="L1730"><span class="ln">1730</span> <b>this</b>.add(<span class="d">1</span>, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, x, y);
-</code><code id="L1731"><span class="ln">1731</span> };
-</code><code id="L1732"><span class="ln">1732</span> matrixproto.scale<span class="s"> = </span><b>function</b> (x, y, cx, cy) {
-</code><code id="L1733"><span class="ln">1733</span> y<span class="s"> == </span><b>null</b><span class="s"> && </span>(y<span class="s"> = </span>x);
-</code><code id="L1734"><span class="ln">1734</span> <b>this</b>.add(<span class="d">1</span>, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, cx, cy);
-</code><code id="L1735"><span class="ln">1735</span> <b>this</b>.add(x, <span class="d">0</span>, <span class="d">0</span>, y, <span class="d">0</span>, <span class="d">0</span>);
-</code><code id="L1736"><span class="ln">1736</span> <b>this</b>.add(<span class="d">1</span>, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, -cx, -cy);
-</code><code id="L1737"><span class="ln">1737</span> };
-</code><code id="L1738"><span class="ln">1738</span> matrixproto.rotate<span class="s"> = </span><b>function</b> (a, x, y) {
-</code><code id="L1739"><span class="ln">1739</span> a<span class="s"> = </span>R.rad(a);
-</code><code id="L1740"><span class="ln">1740</span> <b>var</b> cos<span class="s"> = </span>+math.cos(a).toFixed(<span class="d">9</span>),
-</code><code id="L1741"><span class="ln">1741</span> sin<span class="s"> = </span>+math.sin(a).toFixed(<span class="d">9</span>);
-</code><code id="L1742"><span class="ln">1742</span> <b>this</b>.add(cos, sin, -sin, cos, x, y);
-</code><code id="L1743"><span class="ln">1743</span> <b>this</b>.add(<span class="d">1</span>, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, -x, -y);
-</code><code id="L1744"><span class="ln">1744</span> };
-</code><code id="L1745"><span class="ln">1745</span> matrixproto.x<span class="s"> = </span><b>function</b> (x, y) {
-</code><code id="L1746"><span class="ln">1746</span> <b>return</b> x<span class="s"> * </span><b>this</b>.m[<span class="d">0</span>][<span class="d">0</span>]<span class="s"> + </span>y<span class="s"> * </span><b>this</b>.m[<span class="d">0</span>][<span class="d">1</span>]<span class="s"> + </span><b>this</b>.m[<span class="d">0</span>][<span class="d">2</span>];
-</code><code id="L1747"><span class="ln">1747</span> };
-</code><code id="L1748"><span class="ln">1748</span> matrixproto.y<span class="s"> = </span><b>function</b> (x, y) {
-</code><code id="L1749"><span class="ln">1749</span> <b>return</b> x<span class="s"> * </span><b>this</b>.m[<span class="d">1</span>][<span class="d">0</span>]<span class="s"> + </span>y<span class="s"> * </span><b>this</b>.m[<span class="d">1</span>][<span class="d">1</span>]<span class="s"> + </span><b>this</b>.m[<span class="d">1</span>][<span class="d">2</span>];
-</code><code id="L1750"><span class="ln">1750</span> };
-</code><code id="L1751"><span class="ln">1751</span> matrixproto.get<span class="s"> = </span><b>function</b> (i, j) {
-</code><code id="L1752"><span class="ln">1752</span> <b>return</b> +<b>this</b>.m[i][j].toFixed(<span class="d">4</span>);
-</code><code id="L1753"><span class="ln">1753</span> };
-</code><code id="L1754"><span class="ln">1754</span> matrixproto.toString<span class="s"> = </span><b>function</b> () {
-</code><code id="L1755"><span class="ln">1755</span> <b>return</b> R.svg ?
-</code><code id="L1756"><span class="ln">1756</span> <i>"matrix("</i><span class="s"> + </span>[<b>this</b>.get(<span class="d">0</span>, <span class="d">0</span>), <b>this</b>.get(<span class="d">1</span>, <span class="d">0</span>), <b>this</b>.get(<span class="d">0</span>, <span class="d">1</span>), <b>this</b>.get(<span class="d">1</span>, <span class="d">1</span>), <b>this</b>.get(<span class="d">0</span>, <span class="d">2</span>), <b>this</b>.get(<span class="d">1</span>, <span class="d">2</span>)].join()<span class="s"> + </span><i>")"</i> :
-</code><code id="L1757"><span class="ln">1757</span> [<b>this</b>.get(<span class="d">0</span>, <span class="d">0</span>), <b>this</b>.get(<span class="d">0</span>, <span class="d">1</span>), <b>this</b>.get(<span class="d">1</span>, <span class="d">0</span>), <b>this</b>.get(<span class="d">1</span>, <span class="d">1</span>), <span class="d">0</span>, <span class="d">0</span>].join();
-</code><code id="L1758"><span class="ln">1758</span> };
-</code><code id="L1759"><span class="ln">1759</span> matrixproto.toFilter<span class="s"> = </span><b>function</b> () {
-</code><code id="L1760"><span class="ln">1760</span> <b>return</b> <i>"progid:DXImageTransform.Microsoft.Matrix(M11="</i><span class="s"> + </span><b>this</b>.get(<span class="d">0</span>, <span class="d">0</span>) +
-</code><code id="L1761"><span class="ln">1761</span> <i>", M12="</i><span class="s"> + </span><b>this</b>.get(<span class="d">0</span>, <span class="d">1</span>)<span class="s"> + </span><i>", M21="</i><span class="s"> + </span><b>this</b>.get(<span class="d">1</span>, <span class="d">0</span>)<span class="s"> + </span><i>", M22="</i><span class="s"> + </span><b>this</b>.get(<span class="d">1</span>, <span class="d">1</span>) +
-</code><code id="L1762"><span class="ln">1762</span> <i>", Dx="</i><span class="s"> + </span><b>this</b>.get(<span class="d">0</span>, <span class="d">2</span>)<span class="s"> + </span><i>", Dy="</i><span class="s"> + </span><b>this</b>.get(<span class="d">1</span>, <span class="d">2</span>)<span class="s"> + </span><i>", sizingmedthod='auto expand')"</i>;
-</code><code id="L1763"><span class="ln">1763</span> };
-</code><code id="L1764"><span class="ln">1764</span> matrixproto.offset<span class="s"> = </span><b>function</b> () {
-</code><code id="L1765"><span class="ln">1765</span> <b>return</b> [<b>this</b>.m[<span class="d">0</span>][<span class="d">2</span>].toFixed(<span class="d">4</span>), <b>this</b>.m[<span class="d">1</span>][<span class="d">2</span>].toFixed(<span class="d">4</span>)];
-</code><code id="L1766"><span class="ln">1766</span> };
-</code><code id="L1767"><span class="ln">1767</span>
-</code><code id="L1768"><span class="ln">1768</span> R.Matrix<span class="s"> = </span>Matrix;
-</code><code id="L1769"><span class="ln">1769</span>
-</code><code id="L1770"><span class="ln">1770</span> <span class="c">// SVG</span>
-</code><code id="L1771"><span class="ln">1771</span> <b>if</b> (R.svg) {
-</code><code id="L1772"><span class="ln">1772</span> <b>var</b> xlink<span class="s"> = </span><i>"http:<span class="c">//www.w3.org/<span class="d">1999</span>/xlink"</i>,</span>
-</code><code id="L1773"><span class="ln">1773</span> markers<span class="s"> = </span>{
-</code><code id="L1774"><span class="ln">1774</span> block: <i>"M5,<span class="d">0</span> <span class="d">0</span>,<span class="d">2.5</span> <span class="d">5</span>,5z"</i>,
-</code><code id="L1775"><span class="ln">1775</span> classic: <i>"M5,<span class="d">0</span> <span class="d">0</span>,<span class="d">2.5</span> <span class="d">5</span>,<span class="d">5</span> <span class="d">3.5</span>,<span class="d">3</span> <span class="d">3.5</span>,2z"</i>,
-</code><code id="L1776"><span class="ln">1776</span> diamond: <i>"M2<span class="d">.5</span>,<span class="d">0</span> <span class="d">5</span>,<span class="d">2.5</span> <span class="d">2.5</span>,<span class="d">5</span> <span class="d">0</span>,<span class="d">2</span>.5z"</i>,
-</code><code id="L1777"><span class="ln">1777</span> open: <i>"M6,<span class="d">1</span> <span class="d">1</span>,<span class="d">3.5</span> <span class="d">6</span>,<span class="d">6</span>"</i>,
-</code><code id="L1778"><span class="ln">1778</span> oval: <i>"M2<span class="d">.5</span>,0A2<span class="d">.5</span>,<span class="d">2.5</span>,<span class="d">0</span>,<span class="d">0</span>,<span class="d">1</span>,<span class="d">2.5</span>,<span class="d">5</span> <span class="d">2.5</span>,<span class="d">2.5</span>,<span class="d">0</span>,<span class="d">0</span>,<span class="d">1</span>,<span class="d">2.5</span>,0z"</i>
-</code><code id="L1779"><span class="ln">1779</span> },
-</code><code id="L1780"><span class="ln">1780</span> markerCounter<span class="s"> = </span>{};
-</code><code id="L1781"><span class="ln">1781</span> R.toString<span class="s"> = </span><b>function</b> () {
-</code><code id="L1782"><span class="ln">1782</span> <b>return</b> <i>"Your browser supports SVG.\nYou are running Rapha\xebl "</i><span class="s"> + </span><b>this</b>.version;
-</code><code id="L1783"><span class="ln">1783</span> };
-</code><code id="L1784"><span class="ln">1784</span> <b>var</b> $<span class="s"> = </span><b>function</b> (el, attr) {
-</code><code id="L1785"><span class="ln">1785</span> <b>if</b> (attr) {
-</code><code id="L1786"><span class="ln">1786</span> <b>if</b> (<b>typeof</b> el<span class="s"> == </span><i>"string"</i>) {
-</code><code id="L1787"><span class="ln">1787</span> el<span class="s"> = </span>$(el);
-</code><code id="L1788"><span class="ln">1788</span> }
-</code><code id="L1789"><span class="ln">1789</span> <b>for</b> (<b>var</b> key <b>in</b> attr) <b>if</b> (attr[has](key)) {
-</code><code id="L1790"><span class="ln">1790</span> <b>if</b> (key.substring(<span class="d">0</span>, <span class="d">6</span>)<span class="s"> == </span><i>"xlink:"</i>) {
-</code><code id="L1791"><span class="ln">1791</span> el.setAttributeNS(xlink, key.substring(<span class="d">6</span>), Str(attr[key]));
-</code><code id="L1792"><span class="ln">1792</span> } <b>else</b> {
-</code><code id="L1793"><span class="ln">1793</span> el[setAttribute](key, Str(attr[key]));
-</code><code id="L1794"><span class="ln">1794</span> }
-</code><code id="L1795"><span class="ln">1795</span> }
-</code><code id="L1796"><span class="ln">1796</span> } <b>else</b> {
-</code><code id="L1797"><span class="ln">1797</span> el<span class="s"> = </span>g.doc.createElementNS(<i>"http:<span class="c">//www.w3.org/<span class="d">2000</span>/svg"</i>, el);</span>
-</code><code id="L1798"><span class="ln">1798</span> el.style<span class="s"> && </span>(el.style.webkitTapHighlightColor<span class="s"> = </span><i>"rgba(<span class="d">0</span>,<span class="d">0</span>,<span class="d">0</span>,<span class="d">0</span>)"</i>);
-</code><code id="L1799"><span class="ln">1799</span> }
-</code><code id="L1800"><span class="ln">1800</span> <b>return</b> el;
-</code><code id="L1801"><span class="ln">1801</span> },
-</code><code id="L1802"><span class="ln">1802</span> thePath<span class="s"> = </span><b>function</b> (pathString, SVG) {
-</code><code id="L1803"><span class="ln">1803</span> <b>var</b> el<span class="s"> = </span>$(<i>"path"</i>);
-</code><code id="L1804"><span class="ln">1804</span> SVG.canvas<span class="s"> && </span>SVG.canvas.appendChild(el);
-</code><code id="L1805"><span class="ln">1805</span> <b>var</b> p<span class="s"> = </span><b>new</b> Element(el, SVG);
-</code><code id="L1806"><span class="ln">1806</span> p.type<span class="s"> = </span><i>"path"</i>;
-</code><code id="L1807"><span class="ln">1807</span> setFillAndStroke(p, {fill: <i>"none"</i>, stroke: <i>"#<span class="d">000</span>"</i>, path: pathString});
-</code><code id="L1808"><span class="ln">1808</span> <b>return</b> p;
-</code><code id="L1809"><span class="ln">1809</span> },
-</code><code id="L1810"><span class="ln">1810</span> gradients<span class="s"> = </span>{},
-</code><code id="L1811"><span class="ln">1811</span> rgGrad<span class="s"> = </span>/^url\(#(.*)\)$/,
-</code><code id="L1812"><span class="ln">1812</span> removeGradientFill<span class="s"> = </span><b>function</b> (node, paper) {
-</code><code id="L1813"><span class="ln">1813</span> <b>var</b> oid<span class="s"> = </span>node.getAttribute(fillString);
-</code><code id="L1814"><span class="ln">1814</span> oid<span class="s"> = </span>oid<span class="s"> && </span>oid.match(rgGrad);
-</code><code id="L1815"><span class="ln">1815</span> <b>if</b> (oid<span class="s"> && </span>!--gradients[oid[<span class="d">1</span>]]) {
-</code><code id="L1816"><span class="ln">1816</span> <b>delete</b> gradients[oid[<span class="d">1</span>]];
-</code><code id="L1817"><span class="ln">1817</span> paper.defs.removeChild(g.doc.getElementById(oid[<span class="d">1</span>]));
-</code><code id="L1818"><span class="ln">1818</span> }
-</code><code id="L1819"><span class="ln">1819</span> },
-</code><code id="L1820"><span class="ln">1820</span> addGradientFill<span class="s"> = </span><b>function</b> (element, gradient) {
-</code><code id="L1821"><span class="ln">1821</span> <b>var</b> type<span class="s"> = </span><i>"linear"</i>,
-</code><code id="L1822"><span class="ln">1822</span> id<span class="s"> = </span>element.id<span class="s"> + </span>gradient,
-</code><code id="L1823"><span class="ln">1823</span> fx<span class="s"> = </span><span class="d">.5</span>, fy<span class="s"> = </span><span class="d">.5</span>,
-</code><code id="L1824"><span class="ln">1824</span> o<span class="s"> = </span>element.node,
-</code><code id="L1825"><span class="ln">1825</span> SVG<span class="s"> = </span>element.paper,
-</code><code id="L1826"><span class="ln">1826</span> s<span class="s"> = </span>o.style,
-</code><code id="L1827"><span class="ln">1827</span> el<span class="s"> = </span>g.doc.getElementById(id);
-</code><code id="L1828"><span class="ln">1828</span> <b>if</b> (!el) {
-</code><code id="L1829"><span class="ln">1829</span> gradient<span class="s"> = </span>Str(gradient).replace(radial_gradient, <b>function</b> (all, _fx, _fy) {
-</code><code id="L1830"><span class="ln">1830</span> type<span class="s"> = </span><i>"radial"</i>;
-</code><code id="L1831"><span class="ln">1831</span> <b>if</b> (_fx<span class="s"> && </span>_fy) {
-</code><code id="L1832"><span class="ln">1832</span> fx<span class="s"> = </span>toFloat(_fx);
-</code><code id="L1833"><span class="ln">1833</span> fy<span class="s"> = </span>toFloat(_fy);
-</code><code id="L1834"><span class="ln">1834</span> <b>var</b> dir<span class="s"> = </span>((fy > <span class="d">.5</span>)<span class="s"> * </span><span class="d">2</span><span class="s"> - </span><span class="d">1</span>);
-</code><code id="L1835"><span class="ln">1835</span> pow(fx<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>)<span class="s"> + </span>pow(fy<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>) > <span class="d">.25</span> &&
-</code><code id="L1836"><span class="ln">1836</span> (fy<span class="s"> = </span>math.sqrt(<span class="d">.25</span><span class="s"> - </span>pow(fx<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>))<span class="s"> * </span>dir<span class="s"> + </span><span class="d">.5</span>) &&
-</code><code id="L1837"><span class="ln">1837</span> fy != <span class="d">.5</span> &&
-</code><code id="L1838"><span class="ln">1838</span> (fy<span class="s"> = </span>fy.toFixed(<span class="d">5</span>)<span class="s"> - </span><span class="d">1e-5</span><span class="s"> * </span>dir);
-</code><code id="L1839"><span class="ln">1839</span> }
-</code><code id="L1840"><span class="ln">1840</span> <b>return</b> E;
-</code><code id="L1841"><span class="ln">1841</span> });
-</code><code id="L1842"><span class="ln">1842</span> gradient<span class="s"> = </span>gradient.split(/\s*\-\s*/);
-</code><code id="L1843"><span class="ln">1843</span> <b>if</b> (type<span class="s"> == </span><i>"linear"</i>) {
-</code><code id="L1844"><span class="ln">1844</span> <b>var</b> angle<span class="s"> = </span>gradient.shift();
-</code><code id="L1845"><span class="ln">1845</span> angle<span class="s"> = </span>-toFloat(angle);
-</code><code id="L1846"><span class="ln">1846</span> <b>if</b> (isNaN(angle)) {
-</code><code id="L1847"><span class="ln">1847</span> <b>return</b> <b>null</b>;
-</code><code id="L1848"><span class="ln">1848</span> }
-</code><code id="L1849"><span class="ln">1849</span> <b>var</b> vector<span class="s"> = </span>[<span class="d">0</span>, <span class="d">0</span>, math.cos(R.rad(angle)), math.sin(R.rad(angle))],
-</code><code id="L1850"><span class="ln">1850</span> max<span class="s"> = </span><span class="d">1</span><span class="s"> / </span>(mmax(abs(vector[<span class="d">2</span>]), abs(vector[<span class="d">3</span>]))<span class="s"> || </span><span class="d">1</span>);
-</code><code id="L1851"><span class="ln">1851</span> vector[<span class="d">2</span>] *= max;
-</code><code id="L1852"><span class="ln">1852</span> vector[<span class="d">3</span>] *= max;
-</code><code id="L1853"><span class="ln">1853</span> <b>if</b> (vector[<span class="d">2</span>] < <span class="d">0</span>) {
-</code><code id="L1854"><span class="ln">1854</span> vector[<span class="d">0</span>]<span class="s"> = </span>-vector[<span class="d">2</span>];
-</code><code id="L1855"><span class="ln">1855</span> vector[<span class="d">2</span>]<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L1856"><span class="ln">1856</span> }
-</code><code id="L1857"><span class="ln">1857</span> <b>if</b> (vector[<span class="d">3</span>] < <span class="d">0</span>) {
-</code><code id="L1858"><span class="ln">1858</span> vector[<span class="d">1</span>]<span class="s"> = </span>-vector[<span class="d">3</span>];
-</code><code id="L1859"><span class="ln">1859</span> vector[<span class="d">3</span>]<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L1860"><span class="ln">1860</span> }
-</code><code id="L1861"><span class="ln">1861</span> }
-</code><code id="L1862"><span class="ln">1862</span> <b>var</b> dots<span class="s"> = </span>parseDots(gradient);
-</code><code id="L1863"><span class="ln">1863</span> <b>if</b> (!dots) {
-</code><code id="L1864"><span class="ln">1864</span> <b>return</b> <b>null</b>;
-</code><code id="L1865"><span class="ln">1865</span> }
-</code><code id="L1866"><span class="ln">1866</span> <b>if</b> (element.gradient) {
-</code><code id="L1867"><span class="ln">1867</span> SVG.defs.removeChild(element.gradient);
-</code><code id="L1868"><span class="ln">1868</span> <b>delete</b> element.gradient;
-</code><code id="L1869"><span class="ln">1869</span> }
-</code><code id="L1870"><span class="ln">1870</span>
-</code><code id="L1871"><span class="ln">1871</span> el<span class="s"> = </span>$(type<span class="s"> + </span><i>"Gradient"</i>, {id: id});
-</code><code id="L1872"><span class="ln">1872</span> element.gradient<span class="s"> = </span>el;
-</code><code id="L1873"><span class="ln">1873</span> $(el, type<span class="s"> == </span><i>"radial"</i> ? {
-</code><code id="L1874"><span class="ln">1874</span> fx: fx,
-</code><code id="L1875"><span class="ln">1875</span> fy: fy
-</code><code id="L1876"><span class="ln">1876</span> } : {
-</code><code id="L1877"><span class="ln">1877</span> x1: vector[<span class="d">0</span>],
-</code><code id="L1878"><span class="ln">1878</span> y1: vector[<span class="d">1</span>],
-</code><code id="L1879"><span class="ln">1879</span> x2: vector[<span class="d">2</span>],
-</code><code id="L1880"><span class="ln">1880</span> y2: vector[<span class="d">3</span>],
-</code><code id="L1881"><span class="ln">1881</span> gradientTransform: element.matrix.invert()
-</code><code id="L1882"><span class="ln">1882</span> });
-</code><code id="L1883"><span class="ln">1883</span> SVG.defs.appendChild(el);
-</code><code id="L1884"><span class="ln">1884</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>dots.length; i < ii; i++) {
-</code><code id="L1885"><span class="ln">1885</span> el.appendChild($(<i>"stop"</i>, {
-</code><code id="L1886"><span class="ln">1886</span> offset: dots[i].offset ? dots[i].offset : i ? <i>"<span class="d">100</span>%"</i> : <i>"<span class="d">0</span>%"</i>,
-</code><code id="L1887"><span class="ln">1887</span> <i>"stop-color"</i>: dots[i].color<span class="s"> || </span><i>"#fff"</i>
-</code><code id="L1888"><span class="ln">1888</span> }));
-</code><code id="L1889"><span class="ln">1889</span> }
-</code><code id="L1890"><span class="ln">1890</span> }
-</code><code id="L1891"><span class="ln">1891</span> $(o, {
-</code><code id="L1892"><span class="ln">1892</span> fill: <i>"url(#"</i><span class="s"> + </span>id<span class="s"> + </span><i>")"</i>,
-</code><code id="L1893"><span class="ln">1893</span> opacity: <span class="d">1</span>,
-</code><code id="L1894"><span class="ln">1894</span> <i>"fill-opacity"</i>: <span class="d">1</span>
-</code><code id="L1895"><span class="ln">1895</span> });
-</code><code id="L1896"><span class="ln">1896</span> s.fill<span class="s"> = </span>E;
-</code><code id="L1897"><span class="ln">1897</span> s.opacity<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L1898"><span class="ln">1898</span> s.fillOpacity<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L1899"><span class="ln">1899</span> <b>return</b> <span class="d">1</span>;
-</code><code id="L1900"><span class="ln">1900</span> },
-</code><code id="L1901"><span class="ln">1901</span> updatePosition<span class="s"> = </span><b>function</b> (o) {
-</code><code id="L1902"><span class="ln">1902</span> <b>var</b> bbox<span class="s"> = </span>o.getBBox(<span class="d">1</span>);
-</code><code id="L1903"><span class="ln">1903</span> $(o.pattern, {patternTransform: o.matrix.invert()<span class="s"> + </span><i>" translate("</i><span class="s"> + </span>bbox.x<span class="s"> + </span><i>","</i><span class="s"> + </span>bbox.y<span class="s"> + </span><i>")"</i>});
-</code><code id="L1904"><span class="ln">1904</span> },
-</code><code id="L1905"><span class="ln">1905</span> addArrow<span class="s"> = </span><b>function</b> (o, value, isEnd) {
-</code><code id="L1906"><span class="ln">1906</span> <b>if</b> (o.type<span class="s"> == </span><i>"path"</i>) {
-</code><code id="L1907"><span class="ln">1907</span> <b>var</b> values<span class="s"> = </span>Str(value).toLowerCase().split(<i>"-"</i>),
-</code><code id="L1908"><span class="ln">1908</span> p<span class="s"> = </span>o.paper,
-</code><code id="L1909"><span class="ln">1909</span> se<span class="s"> = </span>isEnd ? <i>"end"</i> : <i>"start"</i>,
-</code><code id="L1910"><span class="ln">1910</span> node<span class="s"> = </span>o.node,
-</code><code id="L1911"><span class="ln">1911</span> attrs<span class="s"> = </span>o.attrs,
-</code><code id="L1912"><span class="ln">1912</span> stroke<span class="s"> = </span>attrs[<i>"stroke-width"</i>],
-</code><code id="L1913"><span class="ln">1913</span> i<span class="s"> = </span>values.length,
-</code><code id="L1914"><span class="ln">1914</span> type<span class="s"> = </span><i>"classic"</i>,
-</code><code id="L1915"><span class="ln">1915</span> from,
-</code><code id="L1916"><span class="ln">1916</span> to,
-</code><code id="L1917"><span class="ln">1917</span> dx,
-</code><code id="L1918"><span class="ln">1918</span> refX,
-</code><code id="L1919"><span class="ln">1919</span> attr,
-</code><code id="L1920"><span class="ln">1920</span> w<span class="s"> = </span><span class="d">3</span>,
-</code><code id="L1921"><span class="ln">1921</span> h<span class="s"> = </span><span class="d">3</span>,
-</code><code id="L1922"><span class="ln">1922</span> t<span class="s"> = </span><span class="d">5</span>;
-</code><code id="L1923"><span class="ln">1923</span> <b>while</b> (i--) {
-</code><code id="L1924"><span class="ln">1924</span> <b>switch</b> (values[i]) {
-</code><code id="L1925"><span class="ln">1925</span> <b>case</b> <i>"block"</i>:
-</code><code id="L1926"><span class="ln">1926</span> <b>case</b> <i>"classic"</i>:
-</code><code id="L1927"><span class="ln">1927</span> <b>case</b> <i>"oval"</i>:
-</code><code id="L1928"><span class="ln">1928</span> <b>case</b> <i>"diamond"</i>:
-</code><code id="L1929"><span class="ln">1929</span> <b>case</b> <i>"open"</i>:
-</code><code id="L1930"><span class="ln">1930</span> <b>case</b> <i>"none"</i>:
-</code><code id="L1931"><span class="ln">1931</span> type<span class="s"> = </span>values[i];
-</code><code id="L1932"><span class="ln">1932</span> <b>break</b>;
-</code><code id="L1933"><span class="ln">1933</span> <b>case</b> <i>"wide"</i>: h<span class="s"> = </span><span class="d">5</span>; <b>break</b>;
-</code><code id="L1934"><span class="ln">1934</span> <b>case</b> <i>"narrow"</i>: h<span class="s"> = </span><span class="d">2</span>; <b>break</b>;
-</code><code id="L1935"><span class="ln">1935</span> <b>case</b> <i>"<b>long</b>"</i>: w<span class="s"> = </span><span class="d">5</span>; <b>break</b>;
-</code><code id="L1936"><span class="ln">1936</span> <b>case</b> <i>"<b>short</b>"</i>: w<span class="s"> = </span><span class="d">2</span>; <b>break</b>;
-</code><code id="L1937"><span class="ln">1937</span> }
-</code><code id="L1938"><span class="ln">1938</span> }
-</code><code id="L1939"><span class="ln">1939</span> <b>if</b> (type<span class="s"> == </span><i>"open"</i>) {
-</code><code id="L1940"><span class="ln">1940</span> w += <span class="d">2</span>;
-</code><code id="L1941"><span class="ln">1941</span> h += <span class="d">2</span>;
-</code><code id="L1942"><span class="ln">1942</span> t += <span class="d">2</span>;
-</code><code id="L1943"><span class="ln">1943</span> dx<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L1944"><span class="ln">1944</span> refX<span class="s"> = </span>isEnd ? <span class="d">4</span> : <span class="d">1</span>;
-</code><code id="L1945"><span class="ln">1945</span> attr<span class="s"> = </span>{
-</code><code id="L1946"><span class="ln">1946</span> fill: <i>"none"</i>,
-</code><code id="L1947"><span class="ln">1947</span> stroke: attrs.stroke
-</code><code id="L1948"><span class="ln">1948</span> };
-</code><code id="L1949"><span class="ln">1949</span> } <b>else</b> {
-</code><code id="L1950"><span class="ln">1950</span> refX<span class="s"> = </span>dx<span class="s"> = </span>w<span class="s"> / </span><span class="d">2</span>;
-</code><code id="L1951"><span class="ln">1951</span> attr<span class="s"> = </span>{
-</code><code id="L1952"><span class="ln">1952</span> fill: attrs.stroke,
-</code><code id="L1953"><span class="ln">1953</span> stroke: <i>"none"</i>
-</code><code id="L1954"><span class="ln">1954</span> };
-</code><code id="L1955"><span class="ln">1955</span> }
-</code><code id="L1956"><span class="ln">1956</span> <b>if</b> (o._.arrows) {
-</code><code id="L1957"><span class="ln">1957</span> <b>if</b> (isEnd) {
-</code><code id="L1958"><span class="ln">1958</span> o._.arrows.endPath<span class="s"> && </span>markerCounter[o._.arrows.endPath]--;
-</code><code id="L1959"><span class="ln">1959</span> o._.arrows.endMarker<span class="s"> && </span>markerCounter[o._.arrows.endMarker]--;
-</code><code id="L1960"><span class="ln">1960</span> } <b>else</b> {
-</code><code id="L1961"><span class="ln">1961</span> o._.arrows.startPath<span class="s"> && </span>markerCounter[o._.arrows.startPath]--;
-</code><code id="L1962"><span class="ln">1962</span> o._.arrows.startMarker<span class="s"> && </span>markerCounter[o._.arrows.startMarker]--;
-</code><code id="L1963"><span class="ln">1963</span> }
-</code><code id="L1964"><span class="ln">1964</span> } <b>else</b> {
-</code><code id="L1965"><span class="ln">1965</span> o._.arrows<span class="s"> = </span>{};
-</code><code id="L1966"><span class="ln">1966</span> }
-</code><code id="L1967"><span class="ln">1967</span> <b>if</b> (type != <i>"none"</i>) {
-</code><code id="L1968"><span class="ln">1968</span> <b>var</b> pathId<span class="s"> = </span><i>"raphael-marker-"</i><span class="s"> + </span>type,
-</code><code id="L1969"><span class="ln">1969</span> markerId<span class="s"> = </span><i>"raphael-marker-"</i><span class="s"> + </span>se<span class="s"> + </span>type<span class="s"> + </span>w<span class="s"> + </span>h;
-</code><code id="L1970"><span class="ln">1970</span> <b>if</b> (!g.doc.getElementById(pathId)) {
-</code><code id="L1971"><span class="ln">1971</span> p.defs.appendChild($($(<i>"path"</i>), {
-</code><code id="L1972"><span class="ln">1972</span> <i>"stroke-linecap"</i>: <i>"round"</i>,
-</code><code id="L1973"><span class="ln">1973</span> d: markers[type],
-</code><code id="L1974"><span class="ln">1974</span> id: pathId
-</code><code id="L1975"><span class="ln">1975</span> }));
-</code><code id="L1976"><span class="ln">1976</span> markerCounter[pathId]<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L1977"><span class="ln">1977</span> } <b>else</b> {
-</code><code id="L1978"><span class="ln">1978</span> markerCounter[pathId]++;
-</code><code id="L1979"><span class="ln">1979</span> }
-</code><code id="L1980"><span class="ln">1980</span> <b>var</b> marker<span class="s"> = </span>g.doc.getElementById(markerId),
-</code><code id="L1981"><span class="ln">1981</span> use;
-</code><code id="L1982"><span class="ln">1982</span> <b>if</b> (!marker) {
-</code><code id="L1983"><span class="ln">1983</span> marker<span class="s"> = </span>$($(<i>"marker"</i>), {
-</code><code id="L1984"><span class="ln">1984</span> id: markerId,
-</code><code id="L1985"><span class="ln">1985</span> markerHeight: h,
-</code><code id="L1986"><span class="ln">1986</span> markerWidth: w,
-</code><code id="L1987"><span class="ln">1987</span> orient: <i>"auto"</i>,
-</code><code id="L1988"><span class="ln">1988</span> refX: refX,
-</code><code id="L1989"><span class="ln">1989</span> refY: h<span class="s"> / </span><span class="d">2</span>
-</code><code id="L1990"><span class="ln">1990</span> });
-</code><code id="L1991"><span class="ln">1991</span> use<span class="s"> = </span>$($(<i>"use"</i>), {
-</code><code id="L1992"><span class="ln">1992</span> <i>"xlink:href"</i>: <i>"#"</i><span class="s"> + </span>pathId,
-</code><code id="L1993"><span class="ln">1993</span> transform: (isEnd ? <i>" rotate(<span class="d">180</span> "</i><span class="s"> + </span>w<span class="s"> / </span><span class="d">2</span><span class="s"> + </span><i>" "</i><span class="s"> + </span>h<span class="s"> / </span><span class="d">2</span><span class="s"> + </span><i>") "</i> : S)<span class="s"> + </span><i>"scale("</i><span class="s"> + </span>w<span class="s"> / </span>t<span class="s"> + </span><i>","</i><span class="s"> + </span>h<span class="s"> / </span>t<span class="s"> + </span><i>")"</i>,
-</code><code id="L1994"><span class="ln">1994</span> <i>"stroke-width"</i>: <span class="d">1</span><span class="s"> / </span>((w<span class="s"> / </span>t<span class="s"> + </span>h<span class="s"> / </span>t)<span class="s"> / </span><span class="d">2</span>)
-</code><code id="L1995"><span class="ln">1995</span> });
-</code><code id="L1996"><span class="ln">1996</span> marker.appendChild(use);
-</code><code id="L1997"><span class="ln">1997</span> p.defs.appendChild(marker);
-</code><code id="L1998"><span class="ln">1998</span> markerCounter[markerId]<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L1999"><span class="ln">1999</span> } <b>else</b> {
-</code><code id="L2000"><span class="ln">2000</span> markerCounter[markerId]++;
-</code><code id="L2001"><span class="ln">2001</span> use<span class="s"> = </span>marker.getElementsByTagName(<i>"use"</i>)[<span class="d">0</span>];
-</code><code id="L2002"><span class="ln">2002</span> }
-</code><code id="L2003"><span class="ln">2003</span> $(use, attr);
-</code><code id="L2004"><span class="ln">2004</span> <b>var</b> delta<span class="s"> = </span>dx<span class="s"> * </span>(type != <i>"diamond"</i><span class="s"> && </span>type != <i>"oval"</i>);
-</code><code id="L2005"><span class="ln">2005</span> <b>if</b> (isEnd) {
-</code><code id="L2006"><span class="ln">2006</span> from<span class="s"> = </span>o._.arrows.startdx<span class="s"> * </span>stroke<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L2007"><span class="ln">2007</span> to<span class="s"> = </span>R.getTotalLength(attrs.path)<span class="s"> - </span>delta<span class="s"> * </span>stroke;
-</code><code id="L2008"><span class="ln">2008</span> } <b>else</b> {
-</code><code id="L2009"><span class="ln">2009</span> from<span class="s"> = </span>delta<span class="s"> * </span>stroke;
-</code><code id="L2010"><span class="ln">2010</span> to<span class="s"> = </span>R.getTotalLength(attrs.path)<span class="s"> - </span>(o._.arrows.enddx<span class="s"> * </span>stroke<span class="s"> || </span><span class="d">0</span>);
-</code><code id="L2011"><span class="ln">2011</span> }
-</code><code id="L2012"><span class="ln">2012</span> attr<span class="s"> = </span>{};
-</code><code id="L2013"><span class="ln">2013</span> attr[<i>"marker-"</i><span class="s"> + </span>se]<span class="s"> = </span><i>"url(#"</i><span class="s"> + </span>markerId<span class="s"> + </span><i>")"</i>;
-</code><code id="L2014"><span class="ln">2014</span> <b>if</b> (to<span class="s"> || </span>from) {
-</code><code id="L2015"><span class="ln">2015</span> attr.d<span class="s"> = </span>Raphael.getSubpath(attrs.path, from, to);
-</code><code id="L2016"><span class="ln">2016</span> }
-</code><code id="L2017"><span class="ln">2017</span> $(node, attr);
-</code><code id="L2018"><span class="ln">2018</span> o._.arrows[se<span class="s"> + </span><i>"Path"</i>]<span class="s"> = </span>pathId;
-</code><code id="L2019"><span class="ln">2019</span> o._.arrows[se<span class="s"> + </span><i>"Marker"</i>]<span class="s"> = </span>markerId;
-</code><code id="L2020"><span class="ln">2020</span> o._.arrows[se<span class="s"> + </span><i>"dx"</i>]<span class="s"> = </span>delta;
-</code><code id="L2021"><span class="ln">2021</span> o._.arrows[se<span class="s"> + </span><i>"Type"</i>]<span class="s"> = </span>type;
-</code><code id="L2022"><span class="ln">2022</span> o._.arrows[se<span class="s"> + </span><i>"String"</i>]<span class="s"> = </span>value;
-</code><code id="L2023"><span class="ln">2023</span> } <b>else</b> {
-</code><code id="L2024"><span class="ln">2024</span> <b>if</b> (isEnd) {
-</code><code id="L2025"><span class="ln">2025</span> from<span class="s"> = </span>o._.arrows.startdx<span class="s"> * </span>stroke<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L2026"><span class="ln">2026</span> to<span class="s"> = </span>R.getTotalLength(attrs.path)<span class="s"> - </span>from;
-</code><code id="L2027"><span class="ln">2027</span> } <b>else</b> {
-</code><code id="L2028"><span class="ln">2028</span> from<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L2029"><span class="ln">2029</span> to<span class="s"> = </span>R.getTotalLength(attrs.path)<span class="s"> - </span>(o._.arrows.enddx<span class="s"> * </span>stroke<span class="s"> || </span><span class="d">0</span>);
-</code><code id="L2030"><span class="ln">2030</span> }
-</code><code id="L2031"><span class="ln">2031</span> o._.arrows[se<span class="s"> + </span><i>"Path"</i>]<span class="s"> && </span>$(node, {d: Raphael.getSubpath(attrs.path, from, to)});
-</code><code id="L2032"><span class="ln">2032</span> <b>delete</b> o._.arrows[se<span class="s"> + </span><i>"Path"</i>];
-</code><code id="L2033"><span class="ln">2033</span> <b>delete</b> o._.arrows[se<span class="s"> + </span><i>"Marker"</i>];
-</code><code id="L2034"><span class="ln">2034</span> <b>delete</b> o._.arrows[se<span class="s"> + </span><i>"dx"</i>];
-</code><code id="L2035"><span class="ln">2035</span> <b>delete</b> o._.arrows[se<span class="s"> + </span><i>"Type"</i>];
-</code><code id="L2036"><span class="ln">2036</span> <b>delete</b> o._.arrows[se<span class="s"> + </span><i>"String"</i>];
-</code><code id="L2037"><span class="ln">2037</span> }
-</code><code id="L2038"><span class="ln">2038</span> <b>for</b> (attr <b>in</b> markerCounter) <b>if</b> (markerCounter[has](attr)<span class="s"> && </span>!markerCounter[attr]) {
-</code><code id="L2039"><span class="ln">2039</span> <b>var</b> item<span class="s"> = </span>g.doc.getElementById(attr);
-</code><code id="L2040"><span class="ln">2040</span> item<span class="s"> && </span>item.parentNode.removeChild(item);
-</code><code id="L2041"><span class="ln">2041</span> }
-</code><code id="L2042"><span class="ln">2042</span> }
-</code><code id="L2043"><span class="ln">2043</span> },
-</code><code id="L2044"><span class="ln">2044</span> setFillAndStroke<span class="s"> = </span><b>function</b> (o, params) {
-</code><code id="L2045"><span class="ln">2045</span> <b>var</b> dasharray<span class="s"> = </span>{
-</code><code id="L2046"><span class="ln">2046</span> <i>""</i>: [<span class="d">0</span>],
-</code><code id="L2047"><span class="ln">2047</span> <i>"none"</i>: [<span class="d">0</span>],
-</code><code id="L2048"><span class="ln">2048</span> <i>"-"</i>: [<span class="d">3</span>, <span class="d">1</span>],
-</code><code id="L2049"><span class="ln">2049</span> <i>"."</i>: [<span class="d">1</span>, <span class="d">1</span>],
-</code><code id="L2050"><span class="ln">2050</span> <i>"-."</i>: [<span class="d">3</span>, <span class="d">1</span>, <span class="d">1</span>, <span class="d">1</span>],
-</code><code id="L2051"><span class="ln">2051</span> <i>"-.."</i>: [<span class="d">3</span>, <span class="d">1</span>, <span class="d">1</span>, <span class="d">1</span>, <span class="d">1</span>, <span class="d">1</span>],
-</code><code id="L2052"><span class="ln">2052</span> <i>". "</i>: [<span class="d">1</span>, <span class="d">3</span>],
-</code><code id="L2053"><span class="ln">2053</span> <i>"- "</i>: [<span class="d">4</span>, <span class="d">3</span>],
-</code><code id="L2054"><span class="ln">2054</span> <i>"--"</i>: [<span class="d">8</span>, <span class="d">3</span>],
-</code><code id="L2055"><span class="ln">2055</span> <i>"- ."</i>: [<span class="d">4</span>, <span class="d">3</span>, <span class="d">1</span>, <span class="d">3</span>],
-</code><code id="L2056"><span class="ln">2056</span> <i>"--."</i>: [<span class="d">8</span>, <span class="d">3</span>, <span class="d">1</span>, <span class="d">3</span>],
-</code><code id="L2057"><span class="ln">2057</span> <i>"--.."</i>: [<span class="d">8</span>, <span class="d">3</span>, <span class="d">1</span>, <span class="d">3</span>, <span class="d">1</span>, <span class="d">3</span>]
-</code><code id="L2058"><span class="ln">2058</span> },
-</code><code id="L2059"><span class="ln">2059</span> node<span class="s"> = </span>o.node,
-</code><code id="L2060"><span class="ln">2060</span> attrs<span class="s"> = </span>o.attrs,
-</code><code id="L2061"><span class="ln">2061</span> addDashes<span class="s"> = </span><b>function</b> (o, value) {
-</code><code id="L2062"><span class="ln">2062</span> value<span class="s"> = </span>dasharray[lowerCase.call(value)];
-</code><code id="L2063"><span class="ln">2063</span> <b>if</b> (value) {
-</code><code id="L2064"><span class="ln">2064</span> <b>var</b> width<span class="s"> = </span>o.attrs[<i>"stroke-width"</i>]<span class="s"> || </span><i>"<span class="d">1</span>"</i>,
-</code><code id="L2065"><span class="ln">2065</span> butt<span class="s"> = </span>{round: width, square: width, butt: <span class="d">0</span>}[o.attrs[<i>"stroke-linecap"</i>]<span class="s"> || </span>params[<i>"stroke-linecap"</i>]]<span class="s"> || </span><span class="d">0</span>,
-</code><code id="L2066"><span class="ln">2066</span> dashes<span class="s"> = </span>[],
-</code><code id="L2067"><span class="ln">2067</span> i<span class="s"> = </span>value.length;
-</code><code id="L2068"><span class="ln">2068</span> <b>while</b> (i--) {
-</code><code id="L2069"><span class="ln">2069</span> dashes[i]<span class="s"> = </span>value[i]<span class="s"> * </span>width<span class="s"> + </span>((i<span class="s"> % </span><span class="d">2</span>) ? <span class="d">1</span> : -<span class="d">1</span>)<span class="s"> * </span>butt;
-</code><code id="L2070"><span class="ln">2070</span> }
-</code><code id="L2071"><span class="ln">2071</span> $(node, {<i>"stroke-dasharray"</i>: dashes.join(<i>","</i>)});
-</code><code id="L2072"><span class="ln">2072</span> }
-</code><code id="L2073"><span class="ln">2073</span> };
-</code><code id="L2074"><span class="ln">2074</span> <b>for</b> (<b>var</b> att <b>in</b> params) {
-</code><code id="L2075"><span class="ln">2075</span> <b>if</b> (params[has](att)) {
-</code><code id="L2076"><span class="ln">2076</span> <b>if</b> (!availableAttrs[has](att)) {
-</code><code id="L2077"><span class="ln">2077</span> <b>continue</b>;
-</code><code id="L2078"><span class="ln">2078</span> }
-</code><code id="L2079"><span class="ln">2079</span> <b>var</b> value<span class="s"> = </span>params[att];
-</code><code id="L2080"><span class="ln">2080</span> attrs[att]<span class="s"> = </span>value;
-</code><code id="L2081"><span class="ln">2081</span> <b>switch</b> (att) {
-</code><code id="L2082"><span class="ln">2082</span> <b>case</b> <i>"blur"</i>:
-</code><code id="L2083"><span class="ln">2083</span> o.blur(value);
-</code><code id="L2084"><span class="ln">2084</span> <b>break</b>;
-</code><code id="L2085"><span class="ln">2085</span> <b>case</b> <i>"href"</i>:
-</code><code id="L2086"><span class="ln">2086</span> <b>case</b> <i>"title"</i>:
-</code><code id="L2087"><span class="ln">2087</span> <b>case</b> <i>"target"</i>:
-</code><code id="L2088"><span class="ln">2088</span> <b>var</b> pn<span class="s"> = </span>node.parentNode;
-</code><code id="L2089"><span class="ln">2089</span> <b>if</b> (lowerCase.call(pn.tagName) != <i>"a"</i>) {
-</code><code id="L2090"><span class="ln">2090</span> <b>var</b> hl<span class="s"> = </span>$(<i>"a"</i>);
-</code><code id="L2091"><span class="ln">2091</span> pn.insertBefore(hl, node);
-</code><code id="L2092"><span class="ln">2092</span> hl.appendChild(node);
-</code><code id="L2093"><span class="ln">2093</span> pn<span class="s"> = </span>hl;
-</code><code id="L2094"><span class="ln">2094</span> }
-</code><code id="L2095"><span class="ln">2095</span> <b>if</b> (att<span class="s"> == </span><i>"target"</i><span class="s"> && </span>value<span class="s"> == </span><i>"blank"</i>) {
-</code><code id="L2096"><span class="ln">2096</span> pn.setAttributeNS(xlink, <i>"show"</i>, <i>"<b>new</b>"</i>);
-</code><code id="L2097"><span class="ln">2097</span> } <b>else</b> {
-</code><code id="L2098"><span class="ln">2098</span> pn.setAttributeNS(xlink, att, value);
-</code><code id="L2099"><span class="ln">2099</span> }
-</code><code id="L2100"><span class="ln">2100</span> <b>break</b>;
-</code><code id="L2101"><span class="ln">2101</span> <b>case</b> <i>"cursor"</i>:
-</code><code id="L2102"><span class="ln">2102</span> node.style.cursor<span class="s"> = </span>value;
-</code><code id="L2103"><span class="ln">2103</span> <b>break</b>;
-</code><code id="L2104"><span class="ln">2104</span> <b>case</b> <i>"transform"</i>:
-</code><code id="L2105"><span class="ln">2105</span> o.transform(value);
-</code><code id="L2106"><span class="ln">2106</span> <b>break</b>;
-</code><code id="L2107"><span class="ln">2107</span> <b>case</b> <i>"arrow-start"</i>:
-</code><code id="L2108"><span class="ln">2108</span> addArrow(o, value);
-</code><code id="L2109"><span class="ln">2109</span> <b>break</b>;
-</code><code id="L2110"><span class="ln">2110</span> <b>case</b> <i>"arrow-end"</i>:
-</code><code id="L2111"><span class="ln">2111</span> addArrow(o, value, <span class="d">1</span>);
-</code><code id="L2112"><span class="ln">2112</span> <b>break</b>;
-</code><code id="L2113"><span class="ln">2113</span> <b>case</b> <i>"clip-rect"</i>:
-</code><code id="L2114"><span class="ln">2114</span> <b>var</b> rect<span class="s"> = </span>Str(value).split(separator);
-</code><code id="L2115"><span class="ln">2115</span> <b>if</b> (rect.length<span class="s"> == </span><span class="d">4</span>) {
-</code><code id="L2116"><span class="ln">2116</span> o.clip<span class="s"> && </span>o.clip.parentNode.parentNode.removeChild(o.clip.parentNode);
-</code><code id="L2117"><span class="ln">2117</span> <b>var</b> el<span class="s"> = </span>$(<i>"clipPath"</i>),
-</code><code id="L2118"><span class="ln">2118</span> rc<span class="s"> = </span>$(<i>"rect"</i>);
-</code><code id="L2119"><span class="ln">2119</span> el.id<span class="s"> = </span>createUUID();
-</code><code id="L2120"><span class="ln">2120</span> $(rc, {
-</code><code id="L2121"><span class="ln">2121</span> x: rect[<span class="d">0</span>],
-</code><code id="L2122"><span class="ln">2122</span> y: rect[<span class="d">1</span>],
-</code><code id="L2123"><span class="ln">2123</span> width: rect[<span class="d">2</span>],
-</code><code id="L2124"><span class="ln">2124</span> height: rect[<span class="d">3</span>]
-</code><code id="L2125"><span class="ln">2125</span> });
-</code><code id="L2126"><span class="ln">2126</span> el.appendChild(rc);
-</code><code id="L2127"><span class="ln">2127</span> o.paper.defs.appendChild(el);
-</code><code id="L2128"><span class="ln">2128</span> $(node, {<i>"clip-path"</i>: <i>"url(#"</i><span class="s"> + </span>el.id<span class="s"> + </span><i>")"</i>});
-</code><code id="L2129"><span class="ln">2129</span> o.clip<span class="s"> = </span>rc;
-</code><code id="L2130"><span class="ln">2130</span> }
-</code><code id="L2131"><span class="ln">2131</span> <b>if</b> (!value) {
-</code><code id="L2132"><span class="ln">2132</span> <b>var</b> clip<span class="s"> = </span>g.doc.getElementById(node.getAttribute(<i>"clip-path"</i>).replace(/(^url\(#|\)$)/g, E));
-</code><code id="L2133"><span class="ln">2133</span> clip<span class="s"> && </span>clip.parentNode.removeChild(clip);
-</code><code id="L2134"><span class="ln">2134</span> $(node, {<i>"clip-path"</i>: E});
-</code><code id="L2135"><span class="ln">2135</span> <b>delete</b> o.clip;
-</code><code id="L2136"><span class="ln">2136</span> }
-</code><code id="L2137"><span class="ln">2137</span> <b>break</b>;
-</code><code id="L2138"><span class="ln">2138</span> <b>case</b> <i>"path"</i>:
-</code><code id="L2139"><span class="ln">2139</span> <b>if</b> (o.type<span class="s"> == </span><i>"path"</i>) {
-</code><code id="L2140"><span class="ln">2140</span> $(node, {d: value ? attrs.path<span class="s"> = </span>pathToAbsolute(value) : <i>"M0,<span class="d">0</span>"</i>});
-</code><code id="L2141"><span class="ln">2141</span> o._.dirty<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2142"><span class="ln">2142</span> <b>if</b> (o._.arrows) {
-</code><code id="L2143"><span class="ln">2143</span> <i>"startString"</i> <b>in</b> o._.arrows<span class="s"> && </span>addArrow(o, o._.arrows.startString);
-</code><code id="L2144"><span class="ln">2144</span> <i>"endString"</i> <b>in</b> o._.arrows<span class="s"> && </span>addArrow(o, o._.arrows.endString, <span class="d">1</span>);
-</code><code id="L2145"><span class="ln">2145</span> }
-</code><code id="L2146"><span class="ln">2146</span> }
-</code><code id="L2147"><span class="ln">2147</span> <b>break</b>;
-</code><code id="L2148"><span class="ln">2148</span> <b>case</b> <i>"width"</i>:
-</code><code id="L2149"><span class="ln">2149</span> node[setAttribute](att, value);
-</code><code id="L2150"><span class="ln">2150</span> o._.dirty<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2151"><span class="ln">2151</span> <b>if</b> (attrs.fx) {
-</code><code id="L2152"><span class="ln">2152</span> att<span class="s"> = </span><i>"x"</i>;
-</code><code id="L2153"><span class="ln">2153</span> value<span class="s"> = </span>attrs.x;
-</code><code id="L2154"><span class="ln">2154</span> } <b>else</b> {
-</code><code id="L2155"><span class="ln">2155</span> <b>break</b>;
-</code><code id="L2156"><span class="ln">2156</span> }
-</code><code id="L2157"><span class="ln">2157</span> <b>case</b> <i>"x"</i>:
-</code><code id="L2158"><span class="ln">2158</span> <b>if</b> (attrs.fx) {
-</code><code id="L2159"><span class="ln">2159</span> value<span class="s"> = </span>-attrs.x<span class="s"> - </span>(attrs.width<span class="s"> || </span><span class="d">0</span>);
-</code><code id="L2160"><span class="ln">2160</span> }
-</code><code id="L2161"><span class="ln">2161</span> <b>case</b> <i>"rx"</i>:
-</code><code id="L2162"><span class="ln">2162</span> <b>if</b> (att<span class="s"> == </span><i>"rx"</i><span class="s"> && </span>o.type<span class="s"> == </span><i>"rect"</i>) {
-</code><code id="L2163"><span class="ln">2163</span> <b>break</b>;
-</code><code id="L2164"><span class="ln">2164</span> }
-</code><code id="L2165"><span class="ln">2165</span> <b>case</b> <i>"cx"</i>:
-</code><code id="L2166"><span class="ln">2166</span> node[setAttribute](att, value);
-</code><code id="L2167"><span class="ln">2167</span> o.pattern<span class="s"> && </span>updatePosition(o);
-</code><code id="L2168"><span class="ln">2168</span> o._.dirty<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2169"><span class="ln">2169</span> <b>break</b>;
-</code><code id="L2170"><span class="ln">2170</span> <b>case</b> <i>"height"</i>:
-</code><code id="L2171"><span class="ln">2171</span> node[setAttribute](att, value);
-</code><code id="L2172"><span class="ln">2172</span> o._.dirty<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2173"><span class="ln">2173</span> <b>if</b> (attrs.fy) {
-</code><code id="L2174"><span class="ln">2174</span> att<span class="s"> = </span><i>"y"</i>;
-</code><code id="L2175"><span class="ln">2175</span> value<span class="s"> = </span>attrs.y;
-</code><code id="L2176"><span class="ln">2176</span> } <b>else</b> {
-</code><code id="L2177"><span class="ln">2177</span> <b>break</b>;
-</code><code id="L2178"><span class="ln">2178</span> }
-</code><code id="L2179"><span class="ln">2179</span> <b>case</b> <i>"y"</i>:
-</code><code id="L2180"><span class="ln">2180</span> <b>if</b> (attrs.fy) {
-</code><code id="L2181"><span class="ln">2181</span> value<span class="s"> = </span>-attrs.y<span class="s"> - </span>(attrs.height<span class="s"> || </span><span class="d">0</span>);
-</code><code id="L2182"><span class="ln">2182</span> }
-</code><code id="L2183"><span class="ln">2183</span> <b>case</b> <i>"ry"</i>:
-</code><code id="L2184"><span class="ln">2184</span> <b>if</b> (att<span class="s"> == </span><i>"ry"</i><span class="s"> && </span>o.type<span class="s"> == </span><i>"rect"</i>) {
-</code><code id="L2185"><span class="ln">2185</span> <b>break</b>;
-</code><code id="L2186"><span class="ln">2186</span> }
-</code><code id="L2187"><span class="ln">2187</span> <b>case</b> <i>"cy"</i>:
-</code><code id="L2188"><span class="ln">2188</span> node[setAttribute](att, value);
-</code><code id="L2189"><span class="ln">2189</span> o.pattern<span class="s"> && </span>updatePosition(o);
-</code><code id="L2190"><span class="ln">2190</span> o._.dirty<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2191"><span class="ln">2191</span> <b>break</b>;
-</code><code id="L2192"><span class="ln">2192</span> <b>case</b> <i>"r"</i>:
-</code><code id="L2193"><span class="ln">2193</span> <b>if</b> (o.type<span class="s"> == </span><i>"rect"</i>) {
-</code><code id="L2194"><span class="ln">2194</span> $(node, {rx: value, ry: value});
-</code><code id="L2195"><span class="ln">2195</span> } <b>else</b> {
-</code><code id="L2196"><span class="ln">2196</span> node[setAttribute](att, value);
-</code><code id="L2197"><span class="ln">2197</span> }
-</code><code id="L2198"><span class="ln">2198</span> o._.dirty<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2199"><span class="ln">2199</span> <b>break</b>;
-</code><code id="L2200"><span class="ln">2200</span> <b>case</b> <i>"src"</i>:
-</code><code id="L2201"><span class="ln">2201</span> <b>if</b> (o.type<span class="s"> == </span><i>"image"</i>) {
-</code><code id="L2202"><span class="ln">2202</span> node.setAttributeNS(xlink, <i>"href"</i>, value);
-</code><code id="L2203"><span class="ln">2203</span> }
-</code><code id="L2204"><span class="ln">2204</span> <b>break</b>;
-</code><code id="L2205"><span class="ln">2205</span> <b>case</b> <i>"stroke-width"</i>:
-</code><code id="L2206"><span class="ln">2206</span> <b>if</b> (o._.sx != <span class="d">1</span><span class="s"> || </span>o._.sy != <span class="d">1</span>) {
-</code><code id="L2207"><span class="ln">2207</span> value /= mmax(abs(o._.sx), abs(o._.sy))<span class="s"> || </span><span class="d">1</span>;
-</code><code id="L2208"><span class="ln">2208</span> }
-</code><code id="L2209"><span class="ln">2209</span> <b>if</b> (o.paper._vbSize) {
-</code><code id="L2210"><span class="ln">2210</span> value *= o.paper._vbSize;
-</code><code id="L2211"><span class="ln">2211</span> }
-</code><code id="L2212"><span class="ln">2212</span> node[setAttribute](att, value);
-</code><code id="L2213"><span class="ln">2213</span> <b>if</b> (attrs[<i>"stroke-dasharray"</i>]) {
-</code><code id="L2214"><span class="ln">2214</span> addDashes(o, attrs[<i>"stroke-dasharray"</i>]);
-</code><code id="L2215"><span class="ln">2215</span> }
-</code><code id="L2216"><span class="ln">2216</span> <b>if</b> (o._.arrows) {
-</code><code id="L2217"><span class="ln">2217</span> <i>"startString"</i> <b>in</b> o._.arrows<span class="s"> && </span>addArrow(o, o._.arrows.startString);
-</code><code id="L2218"><span class="ln">2218</span> <i>"endString"</i> <b>in</b> o._.arrows<span class="s"> && </span>addArrow(o, o._.arrows.endString, <span class="d">1</span>);
-</code><code id="L2219"><span class="ln">2219</span> }
-</code><code id="L2220"><span class="ln">2220</span> <b>break</b>;
-</code><code id="L2221"><span class="ln">2221</span> <b>case</b> <i>"stroke-dasharray"</i>:
-</code><code id="L2222"><span class="ln">2222</span> addDashes(o, value);
-</code><code id="L2223"><span class="ln">2223</span> <b>break</b>;
-</code><code id="L2224"><span class="ln">2224</span> <b>case</b> fillString:
-</code><code id="L2225"><span class="ln">2225</span> <b>var</b> isURL<span class="s"> = </span>Str(value).match(ISURL);
-</code><code id="L2226"><span class="ln">2226</span> <b>if</b> (isURL) {
-</code><code id="L2227"><span class="ln">2227</span> el<span class="s"> = </span>$(<i>"pattern"</i>);
-</code><code id="L2228"><span class="ln">2228</span> <b>var</b> ig<span class="s"> = </span>$(<i>"image"</i>);
-</code><code id="L2229"><span class="ln">2229</span> el.id<span class="s"> = </span>createUUID();
-</code><code id="L2230"><span class="ln">2230</span> $(el, {x: <span class="d">0</span>, y: <span class="d">0</span>, patternUnits: <i>"userSpaceOnUse"</i>, height: <span class="d">1</span>, width: <span class="d">1</span>});
-</code><code id="L2231"><span class="ln">2231</span> $(ig, {x: <span class="d">0</span>, y: <span class="d">0</span>, <i>"xlink:href"</i>: isURL[<span class="d">1</span>]});
-</code><code id="L2232"><span class="ln">2232</span> el.appendChild(ig);
-</code><code id="L2233"><span class="ln">2233</span>
-</code><code id="L2234"><span class="ln">2234</span> (<b>function</b> (el) {
-</code><code id="L2235"><span class="ln">2235</span> preload(isURL[<span class="d">1</span>], <b>function</b> () {
-</code><code id="L2236"><span class="ln">2236</span> <b>var</b> w<span class="s"> = </span><b>this</b>.offsetWidth,
-</code><code id="L2237"><span class="ln">2237</span> h<span class="s"> = </span><b>this</b>.offsetHeight;
-</code><code id="L2238"><span class="ln">2238</span> $(el, {width: w, height: h});
-</code><code id="L2239"><span class="ln">2239</span> $(ig, {width: w, height: h});
-</code><code id="L2240"><span class="ln">2240</span> o.paper.safari();
-</code><code id="L2241"><span class="ln">2241</span> });
-</code><code id="L2242"><span class="ln">2242</span> })(el);
-</code><code id="L2243"><span class="ln">2243</span> o.paper.defs.appendChild(el);
-</code><code id="L2244"><span class="ln">2244</span> node.style.fill<span class="s"> = </span><i>"url(#"</i><span class="s"> + </span>el.id<span class="s"> + </span><i>")"</i>;
-</code><code id="L2245"><span class="ln">2245</span> $(node, {fill: <i>"url(#"</i><span class="s"> + </span>el.id<span class="s"> + </span><i>")"</i>});
-</code><code id="L2246"><span class="ln">2246</span> o.pattern<span class="s"> = </span>el;
-</code><code id="L2247"><span class="ln">2247</span> o.pattern<span class="s"> && </span>updatePosition(o);
-</code><code id="L2248"><span class="ln">2248</span> <b>break</b>;
-</code><code id="L2249"><span class="ln">2249</span> }
-</code><code id="L2250"><span class="ln">2250</span> <b>var</b> clr<span class="s"> = </span>R.getRGB(value);
-</code><code id="L2251"><span class="ln">2251</span> <b>if</b> (!clr.error) {
-</code><code id="L2252"><span class="ln">2252</span> <b>delete</b> params.gradient;
-</code><code id="L2253"><span class="ln">2253</span> <b>delete</b> attrs.gradient;
-</code><code id="L2254"><span class="ln">2254</span> !R.is(attrs.opacity, <i>"<b>undefined</b>"</i>) &&
-</code><code id="L2255"><span class="ln">2255</span> R.is(params.opacity, <i>"<b>undefined</b>"</i>) &&
-</code><code id="L2256"><span class="ln">2256</span> $(node, {opacity: attrs.opacity});
-</code><code id="L2257"><span class="ln">2257</span> !R.is(attrs[<i>"fill-opacity"</i>], <i>"<b>undefined</b>"</i>) &&
-</code><code id="L2258"><span class="ln">2258</span> R.is(params[<i>"fill-opacity"</i>], <i>"<b>undefined</b>"</i>) &&
-</code><code id="L2259"><span class="ln">2259</span> $(node, {<i>"fill-opacity"</i>: attrs[<i>"fill-opacity"</i>]});
-</code><code id="L2260"><span class="ln">2260</span> } <b>else</b> <b>if</b> ((o.type<span class="s"> == </span><i>"circle"</i><span class="s"> || </span>o.type<span class="s"> == </span><i>"ellipse"</i><span class="s"> || </span>Str(value).charAt() != <i>"r"</i>)<span class="s"> && </span>addGradientFill(o, value)) {
-</code><code id="L2261"><span class="ln">2261</span> <b>if</b> (<i>"opacity"</i> <b>in</b> attrs<span class="s"> || </span><i>"fill-opacity"</i> <b>in</b> attrs) {
-</code><code id="L2262"><span class="ln">2262</span> <b>var</b> gradient<span class="s"> = </span>g.doc.getElementById(node.getAttribute(fillString).replace(/^url\(#|\)$/g, E));
-</code><code id="L2263"><span class="ln">2263</span> <b>if</b> (gradient) {
-</code><code id="L2264"><span class="ln">2264</span> <b>var</b> stops<span class="s"> = </span>gradient.getElementsByTagName(<i>"stop"</i>);
-</code><code id="L2265"><span class="ln">2265</span> $(stops[stops.length<span class="s"> - </span><span class="d">1</span>], {<i>"stop-opacity"</i>: (<i>"opacity"</i> <b>in</b> attrs ? attrs.opacity : <span class="d">1</span>)<span class="s"> * </span>(<i>"fill-opacity"</i> <b>in</b> attrs ? attrs[<i>"fill-opacity"</i>] : <span class="d">1</span>)});
-</code><code id="L2266"><span class="ln">2266</span> }
-</code><code id="L2267"><span class="ln">2267</span> }
-</code><code id="L2268"><span class="ln">2268</span> attrs.gradient<span class="s"> = </span>value;
-</code><code id="L2269"><span class="ln">2269</span> attrs.fill<span class="s"> = </span><i>"none"</i>;
-</code><code id="L2270"><span class="ln">2270</span> <b>break</b>;
-</code><code id="L2271"><span class="ln">2271</span> }
-</code><code id="L2272"><span class="ln">2272</span> clr[has](<i>"opacity"</i>)<span class="s"> && </span>$(node, {<i>"fill-opacity"</i>: clr.opacity > <span class="d">1</span> ? clr.opacity<span class="s"> / </span><span class="d">100</span> : clr.opacity});
-</code><code id="L2273"><span class="ln">2273</span> <b>case</b> <i>"stroke"</i>:
-</code><code id="L2274"><span class="ln">2274</span> clr<span class="s"> = </span>R.getRGB(value);
-</code><code id="L2275"><span class="ln">2275</span> node[setAttribute](att, clr.hex);
-</code><code id="L2276"><span class="ln">2276</span> att<span class="s"> == </span><i>"stroke"</i><span class="s"> && </span>clr[has](<i>"opacity"</i>)<span class="s"> && </span>$(node, {<i>"stroke-opacity"</i>: clr.opacity > <span class="d">1</span> ? clr.opacity<span class="s"> / </span><span class="d">100</span> : clr.opacity});
-</code><code id="L2277"><span class="ln">2277</span> <b>if</b> (att<span class="s"> == </span><i>"stroke"</i><span class="s"> && </span>o._.arrows) {
-</code><code id="L2278"><span class="ln">2278</span> <i>"startString"</i> <b>in</b> o._.arrows<span class="s"> && </span>addArrow(o, o._.arrows.startString);
-</code><code id="L2279"><span class="ln">2279</span> <i>"endString"</i> <b>in</b> o._.arrows<span class="s"> && </span>addArrow(o, o._.arrows.endString, <span class="d">1</span>);
-</code><code id="L2280"><span class="ln">2280</span> }
-</code><code id="L2281"><span class="ln">2281</span> <b>break</b>;
-</code><code id="L2282"><span class="ln">2282</span> <b>case</b> <i>"gradient"</i>:
-</code><code id="L2283"><span class="ln">2283</span> (o.type<span class="s"> == </span><i>"circle"</i><span class="s"> || </span>o.type<span class="s"> == </span><i>"ellipse"</i><span class="s"> || </span>Str(value).charAt() != <i>"r"</i>)<span class="s"> && </span>addGradientFill(o, value);
-</code><code id="L2284"><span class="ln">2284</span> <b>break</b>;
-</code><code id="L2285"><span class="ln">2285</span> <b>case</b> <i>"opacity"</i>:
-</code><code id="L2286"><span class="ln">2286</span> <b>if</b> (attrs.gradient<span class="s"> && </span>!attrs[has](<i>"stroke-opacity"</i>)) {
-</code><code id="L2287"><span class="ln">2287</span> $(node, {<i>"stroke-opacity"</i>: value > <span class="d">1</span> ? value<span class="s"> / </span><span class="d">100</span> : value});
-</code><code id="L2288"><span class="ln">2288</span> }
-</code><code id="L2289"><span class="ln">2289</span> <span class="c">// fall</span>
-</code><code id="L2290"><span class="ln">2290</span> <b>case</b> <i>"fill-opacity"</i>:
-</code><code id="L2291"><span class="ln">2291</span> <b>if</b> (attrs.gradient) {
-</code><code id="L2292"><span class="ln">2292</span> gradient<span class="s"> = </span>g.doc.getElementById(node.getAttribute(fillString).replace(/^url\(#|\)$/g, E));
-</code><code id="L2293"><span class="ln">2293</span> <b>if</b> (gradient) {
-</code><code id="L2294"><span class="ln">2294</span> stops<span class="s"> = </span>gradient.getElementsByTagName(<i>"stop"</i>);
-</code><code id="L2295"><span class="ln">2295</span> $(stops[stops.length<span class="s"> - </span><span class="d">1</span>], {<i>"stop-opacity"</i>: value});
-</code><code id="L2296"><span class="ln">2296</span> }
-</code><code id="L2297"><span class="ln">2297</span> <b>break</b>;
-</code><code id="L2298"><span class="ln">2298</span> }
-</code><code id="L2299"><span class="ln">2299</span> <b>default</b>:
-</code><code id="L2300"><span class="ln">2300</span> att<span class="s"> == </span><i>"font-size"</i><span class="s"> && </span>(value<span class="s"> = </span>toInt(value, <span class="d">10</span>)<span class="s"> + </span><i>"px"</i>);
-</code><code id="L2301"><span class="ln">2301</span> <b>var</b> cssrule<span class="s"> = </span>att.replace(/(\-.)/g, <b>function</b> (w) {
-</code><code id="L2302"><span class="ln">2302</span> <b>return</b> upperCase.call(w.substring(<span class="d">1</span>));
-</code><code id="L2303"><span class="ln">2303</span> });
-</code><code id="L2304"><span class="ln">2304</span> node.style[cssrule]<span class="s"> = </span>value;
-</code><code id="L2305"><span class="ln">2305</span> o._.dirty<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2306"><span class="ln">2306</span> node[setAttribute](att, value);
-</code><code id="L2307"><span class="ln">2307</span> <b>break</b>;
-</code><code id="L2308"><span class="ln">2308</span> }
-</code><code id="L2309"><span class="ln">2309</span> }
-</code><code id="L2310"><span class="ln">2310</span> }
-</code><code id="L2311"><span class="ln">2311</span>
-</code><code id="L2312"><span class="ln">2312</span> tuneText(o, params);
-</code><code id="L2313"><span class="ln">2313</span> },
-</code><code id="L2314"><span class="ln">2314</span> leading<span class="s"> = </span><span class="d">1.2</span>,
-</code><code id="L2315"><span class="ln">2315</span> tuneText<span class="s"> = </span><b>function</b> (el, params) {
-</code><code id="L2316"><span class="ln">2316</span> <b>if</b> (el.type != <i>"text"</i><span class="s"> || </span>!(params[has](<i>"text"</i>)<span class="s"> || </span>params[has](<i>"font"</i>)<span class="s"> || </span>params[has](<i>"font-size"</i>)<span class="s"> || </span>params[has](<i>"x"</i>)<span class="s"> || </span>params[has](<i>"y"</i>))) {
-</code><code id="L2317"><span class="ln">2317</span> <b>return</b>;
-</code><code id="L2318"><span class="ln">2318</span> }
-</code><code id="L2319"><span class="ln">2319</span> <b>var</b> a<span class="s"> = </span>el.attrs,
-</code><code id="L2320"><span class="ln">2320</span> node<span class="s"> = </span>el.node,
-</code><code id="L2321"><span class="ln">2321</span> fontSize<span class="s"> = </span>node.firstChild ? toInt(g.doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue(<i>"font-size"</i>), <span class="d">10</span>) : <span class="d">10</span>;
-</code><code id="L2322"><span class="ln">2322</span>
-</code><code id="L2323"><span class="ln">2323</span> <b>if</b> (params[has](<i>"text"</i>)) {
-</code><code id="L2324"><span class="ln">2324</span> a.text<span class="s"> = </span>params.text;
-</code><code id="L2325"><span class="ln">2325</span> <b>while</b> (node.firstChild) {
-</code><code id="L2326"><span class="ln">2326</span> node.removeChild(node.firstChild);
-</code><code id="L2327"><span class="ln">2327</span> }
-</code><code id="L2328"><span class="ln">2328</span> <b>var</b> texts<span class="s"> = </span>Str(params.text).split(<i>"\n"</i>),
-</code><code id="L2329"><span class="ln">2329</span> tspans<span class="s"> = </span>[],
-</code><code id="L2330"><span class="ln">2330</span> tspan;
-</code><code id="L2331"><span class="ln">2331</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>texts.length; i < ii; i++) <b>if</b> (texts[i]) {
-</code><code id="L2332"><span class="ln">2332</span> tspan<span class="s"> = </span>$(<i>"tspan"</i>);
-</code><code id="L2333"><span class="ln">2333</span> i<span class="s"> && </span>$(tspan, {dy: fontSize<span class="s"> * </span>leading, x: a.x});
-</code><code id="L2334"><span class="ln">2334</span> tspan.appendChild(g.doc.createTextNode(texts[i]));
-</code><code id="L2335"><span class="ln">2335</span> node.appendChild(tspan);
-</code><code id="L2336"><span class="ln">2336</span> tspans[i]<span class="s"> = </span>tspan;
-</code><code id="L2337"><span class="ln">2337</span> }
-</code><code id="L2338"><span class="ln">2338</span> } <b>else</b> {
-</code><code id="L2339"><span class="ln">2339</span> tspans<span class="s"> = </span>node.getElementsByTagName(<i>"tspan"</i>);
-</code><code id="L2340"><span class="ln">2340</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>tspans.length; i < ii; i++) {
-</code><code id="L2341"><span class="ln">2341</span> i<span class="s"> && </span>$(tspans[i], {dy: fontSize<span class="s"> * </span>leading, x: a.x});
-</code><code id="L2342"><span class="ln">2342</span> }
-</code><code id="L2343"><span class="ln">2343</span> }
-</code><code id="L2344"><span class="ln">2344</span> $(node, {y: a.y});
-</code><code id="L2345"><span class="ln">2345</span> el._.dirty<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2346"><span class="ln">2346</span> <b>var</b> bb<span class="s"> = </span>el._getBBox(),
-</code><code id="L2347"><span class="ln">2347</span> dif<span class="s"> = </span>a.y<span class="s"> - </span>(bb.y<span class="s"> + </span>bb.height<span class="s"> / </span><span class="d">2</span>);
-</code><code id="L2348"><span class="ln">2348</span> dif<span class="s"> && </span>R.is(dif, <i>"finite"</i>)<span class="s"> && </span>$(tspans[<span class="d">0</span>], {dy: a.y<span class="s"> + </span>dif});
-</code><code id="L2349"><span class="ln">2349</span> },
-</code><code id="L2350"><span class="ln">2350</span> Element<span class="s"> = </span><b>function</b> (node, svg) {
-</code><code id="L2351"><span class="ln">2351</span> <b>var</b> X<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L2352"><span class="ln">2352</span> Y<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L2353"><span class="ln">2353</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2354"><span class="ln">2354</span><span class="c"> <span class="s"> * </span>Element.node
-</span></code><code id="L2355"><span class="ln">2355</span><span class="c"> [ property (object) ]
-</span></code><code id="L2356"><span class="ln">2356</span><span class="c"> **
-</span></code><code id="L2357"><span class="ln">2357</span><span class="c"> <span class="s"> * </span>Gives you a reference to the DOM object, so you can assign event handlers or just mess around.
-</span></code><code id="L2358"><span class="ln">2358</span><span class="c"> > Usage
-</span></code><code id="L2359"><span class="ln">2359</span><span class="c"> <span class="s"> | </span><span class="c">// draw a circle at coordinate <span class="d">10</span>,<span class="d">10</span> <b>with</b> radius of <span class="d">10</span></span>
-</span></code><code id="L2360"><span class="ln">2360</span><span class="c"> <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.circle(<span class="d">10</span>, <span class="d">10</span>, <span class="d">10</span>);
-</span></code><code id="L2361"><span class="ln">2361</span><span class="c"> <span class="s"> | </span>c.node.onclick<span class="s"> = </span><b>function</b> () {
-</span></code><code id="L2362"><span class="ln">2362</span><span class="c"> <span class="s"> | </span> c.attr(<i>"fill"</i>, <i>"red"</i>);
-</span></code><code id="L2363"><span class="ln">2363</span><span class="c"> <span class="s"> | </span>};
-</span></code><code id="L2364"><span class="ln">2364</span><span class="c"> \*/</span>
-</code><code id="L2365"><span class="ln">2365</span> <b>this</b>[<span class="d">0</span>]<span class="s"> = </span><b>this</b>.node<span class="s"> = </span>node;
-</code><code id="L2366"><span class="ln">2366</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2367"><span class="ln">2367</span><span class="c"> <span class="s"> * </span>Element.raphael
-</span></code><code id="L2368"><span class="ln">2368</span><span class="c"> [ property (object) ]
-</span></code><code id="L2369"><span class="ln">2369</span><span class="c"> **
-</span></code><code id="L2370"><span class="ln">2370</span><span class="c"> <span class="s"> * </span>Internal reference to @Raphael object. In <b>case</b> it is not available.
-</span></code><code id="L2371"><span class="ln">2371</span><span class="c"> > Usage
-</span></code><code id="L2372"><span class="ln">2372</span><span class="c"> <span class="s"> | </span>Raphael.el.red<span class="s"> = </span><b>function</b> () {
-</span></code><code id="L2373"><span class="ln">2373</span><span class="c"> <span class="s"> | </span> <b>var</b> hsb<span class="s"> = </span><b>this</b>.paper.raphael.rgb2hsb(<b>this</b>.attr(<i>"fill"</i>));
-</span></code><code id="L2374"><span class="ln">2374</span><span class="c"> <span class="s"> | </span> hsb.h<span class="s"> = </span><span class="d">1</span>;
-</span></code><code id="L2375"><span class="ln">2375</span><span class="c"> <span class="s"> | </span> <b>this</b>.attr({fill: <b>this</b>.paper.raphael.hsb2rgb(hsb).hex});
-</span></code><code id="L2376"><span class="ln">2376</span><span class="c"> <span class="s"> | </span>}
-</span></code><code id="L2377"><span class="ln">2377</span><span class="c"> \*/</span>
-</code><code id="L2378"><span class="ln">2378</span> node.raphael<span class="s"> = </span><b>true</b>;
-</code><code id="L2379"><span class="ln">2379</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2380"><span class="ln">2380</span><span class="c"> <span class="s"> * </span>Element.id
-</span></code><code id="L2381"><span class="ln">2381</span><span class="c"> [ property (number) ]
-</span></code><code id="L2382"><span class="ln">2382</span><span class="c"> **
-</span></code><code id="L2383"><span class="ln">2383</span><span class="c"> <span class="s"> * </span>Unique id of the element. Especially usesful when you want to listen to events of the element,
-</span></code><code id="L2384"><span class="ln">2384</span><span class="c"> <span class="s"> * </span>because all events are fired <b>in</b> format `<module>.<action>.<id>`. Also useful <b>for</b> @Paper.getById method.
-</span></code><code id="L2385"><span class="ln">2385</span><span class="c"> \*/</span>
-</code><code id="L2386"><span class="ln">2386</span> <b>this</b>.id<span class="s"> = </span>R._oid++;
-</code><code id="L2387"><span class="ln">2387</span> node.raphaelid<span class="s"> = </span><b>this</b>.id;
-</code><code id="L2388"><span class="ln">2388</span> <b>this</b>.matrix<span class="s"> = </span><b>new</b> Matrix;
-</code><code id="L2389"><span class="ln">2389</span> <b>this</b>.realPath<span class="s"> = </span><b>null</b>;
-</code><code id="L2390"><span class="ln">2390</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2391"><span class="ln">2391</span><span class="c"> <span class="s"> * </span>Element.paper
-</span></code><code id="L2392"><span class="ln">2392</span><span class="c"> [ property (object) ]
-</span></code><code id="L2393"><span class="ln">2393</span><span class="c"> **
-</span></code><code id="L2394"><span class="ln">2394</span><span class="c"> <span class="s"> * </span>Internal reference to “paper” where object drawn. Mainly <b>for</b> use <b>in</b> plugins and element extensions.
-</span></code><code id="L2395"><span class="ln">2395</span><span class="c"> > Usage
-</span></code><code id="L2396"><span class="ln">2396</span><span class="c"> <span class="s"> | </span>Raphael.el.cross<span class="s"> = </span><b>function</b> () {
-</span></code><code id="L2397"><span class="ln">2397</span><span class="c"> <span class="s"> | </span> <b>this</b>.attr({fill: <i>"red"</i>});
-</span></code><code id="L2398"><span class="ln">2398</span><span class="c"> <span class="s"> | </span> <b>this</b>.paper.path(<i>"M10,10L50,50M50,10L10,<span class="d">50</span>"</i>)
-</span></code><code id="L2399"><span class="ln">2399</span><span class="c"> <span class="s"> | </span> .attr({stroke: <i>"red"</i>});
-</span></code><code id="L2400"><span class="ln">2400</span><span class="c"> <span class="s"> | </span>}
-</span></code><code id="L2401"><span class="ln">2401</span><span class="c"> \*/</span>
-</code><code id="L2402"><span class="ln">2402</span> <b>this</b>.paper<span class="s"> = </span>svg;
-</code><code id="L2403"><span class="ln">2403</span> <b>this</b>.attrs<span class="s"> = </span><b>this</b>.attrs<span class="s"> || </span>{};
-</code><code id="L2404"><span class="ln">2404</span> <b>this</b>._<span class="s"> = </span>{
-</code><code id="L2405"><span class="ln">2405</span> transform: [],
-</code><code id="L2406"><span class="ln">2406</span> sx: <span class="d">1</span>,
-</code><code id="L2407"><span class="ln">2407</span> sy: <span class="d">1</span>,
-</code><code id="L2408"><span class="ln">2408</span> deg: <span class="d">0</span>,
-</code><code id="L2409"><span class="ln">2409</span> dx: <span class="d">0</span>,
-</code><code id="L2410"><span class="ln">2410</span> dy: <span class="d">0</span>,
-</code><code id="L2411"><span class="ln">2411</span> dirty: <span class="d">1</span>
-</code><code id="L2412"><span class="ln">2412</span> };
-</code><code id="L2413"><span class="ln">2413</span> !svg.bottom<span class="s"> && </span>(svg.bottom<span class="s"> = </span><b>this</b>);
-</code><code id="L2414"><span class="ln">2414</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2415"><span class="ln">2415</span><span class="c"> <span class="s"> * </span>Element.prev
-</span></code><code id="L2416"><span class="ln">2416</span><span class="c"> [ property (object) ]
-</span></code><code id="L2417"><span class="ln">2417</span><span class="c"> **
-</span></code><code id="L2418"><span class="ln">2418</span><span class="c"> <span class="s"> * </span>Reference to the previous element <b>in</b> the hierarchy.
-</span></code><code id="L2419"><span class="ln">2419</span><span class="c"> \*/</span>
-</code><code id="L2420"><span class="ln">2420</span> <b>this</b>.prev<span class="s"> = </span>svg.top;
-</code><code id="L2421"><span class="ln">2421</span> svg.top<span class="s"> && </span>(svg.top.next<span class="s"> = </span><b>this</b>);
-</code><code id="L2422"><span class="ln">2422</span> svg.top<span class="s"> = </span><b>this</b>;
-</code><code id="L2423"><span class="ln">2423</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2424"><span class="ln">2424</span><span class="c"> <span class="s"> * </span>Element.next
-</span></code><code id="L2425"><span class="ln">2425</span><span class="c"> [ property (object) ]
-</span></code><code id="L2426"><span class="ln">2426</span><span class="c"> **
-</span></code><code id="L2427"><span class="ln">2427</span><span class="c"> <span class="s"> * </span>Reference to the next element <b>in</b> the hierarchy.
-</span></code><code id="L2428"><span class="ln">2428</span><span class="c"> \*/</span>
-</code><code id="L2429"><span class="ln">2429</span> <b>this</b>.next<span class="s"> = </span><b>null</b>;
-</code><code id="L2430"><span class="ln">2430</span> },
-</code><code id="L2431"><span class="ln">2431</span> elproto<span class="s"> = </span>Element.prototype;
-</code><code id="L2432"><span class="ln">2432</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2433"><span class="ln">2433</span><span class="c"> <span class="s"> * </span>Element.rotate
-</span></code><code id="L2434"><span class="ln">2434</span><span class="c"> [ method ]
-</span></code><code id="L2435"><span class="ln">2435</span><span class="c"> **
-</span></code><code id="L2436"><span class="ln">2436</span><span class="c"> <span class="s"> * </span>Adds rotation by given angle around given point to the list of
-</span></code><code id="L2437"><span class="ln">2437</span><span class="c"> <span class="s"> * </span>transformations of the element.
-</span></code><code id="L2438"><span class="ln">2438</span><span class="c"> > Parameters
-</span></code><code id="L2439"><span class="ln">2439</span><span class="c"> <span class="s"> - </span>deg (number) angle <b>in</b> degrees
-</span></code><code id="L2440"><span class="ln">2440</span><span class="c"> <span class="s"> - </span>cx (number) #optional x coordinate of the centre of rotation
-</span></code><code id="L2441"><span class="ln">2441</span><span class="c"> <span class="s"> - </span>cy (number) #optional y coordinate of the centre of rotation
-</span></code><code id="L2442"><span class="ln">2442</span><span class="c"> <span class="s"> * </span>If cx<span class="s"> & </span>cy aren’t specified centre of the shape is used as a point of rotation.
-</span></code><code id="L2443"><span class="ln">2443</span><span class="c"> <span class="s"> = </span>(object) @Element
-</span></code><code id="L2444"><span class="ln">2444</span><span class="c"> \*/</span>
-</code><code id="L2445"><span class="ln">2445</span> elproto.rotate<span class="s"> = </span><b>function</b> (deg, cx, cy) {
-</code><code id="L2446"><span class="ln">2446</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L2447"><span class="ln">2447</span> <b>return</b> <b>this</b>;
-</code><code id="L2448"><span class="ln">2448</span> }
-</code><code id="L2449"><span class="ln">2449</span> deg<span class="s"> = </span>Str(deg).split(separator);
-</code><code id="L2450"><span class="ln">2450</span> <b>if</b> (deg.length<span class="s"> - </span><span class="d">1</span>) {
-</code><code id="L2451"><span class="ln">2451</span> cx<span class="s"> = </span>toFloat(deg[<span class="d">1</span>]);
-</code><code id="L2452"><span class="ln">2452</span> cy<span class="s"> = </span>toFloat(deg[<span class="d">2</span>]);
-</code><code id="L2453"><span class="ln">2453</span> }
-</code><code id="L2454"><span class="ln">2454</span> deg<span class="s"> = </span>toFloat(deg[<span class="d">0</span>]);
-</code><code id="L2455"><span class="ln">2455</span> (cy<span class="s"> == </span><b>null</b>)<span class="s"> && </span>(cx<span class="s"> = </span>cy);
-</code><code id="L2456"><span class="ln">2456</span> <b>if</b> (cx<span class="s"> == </span><b>null</b><span class="s"> || </span>cy<span class="s"> == </span><b>null</b>) {
-</code><code id="L2457"><span class="ln">2457</span> <b>var</b> bbox<span class="s"> = </span><b>this</b>.getBBox(<span class="d">1</span>);
-</code><code id="L2458"><span class="ln">2458</span> cx<span class="s"> = </span>bbox.x<span class="s"> + </span>bbox.width<span class="s"> / </span><span class="d">2</span>;
-</code><code id="L2459"><span class="ln">2459</span> cy<span class="s"> = </span>bbox.y<span class="s"> + </span>bbox.height<span class="s"> / </span><span class="d">2</span>;
-</code><code id="L2460"><span class="ln">2460</span> }
-</code><code id="L2461"><span class="ln">2461</span> <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"r"</i>, deg, cx, cy]]));
-</code><code id="L2462"><span class="ln">2462</span> <b>return</b> <b>this</b>;
-</code><code id="L2463"><span class="ln">2463</span> };
-</code><code id="L2464"><span class="ln">2464</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2465"><span class="ln">2465</span><span class="c"> <span class="s"> * </span>Element.scale
-</span></code><code id="L2466"><span class="ln">2466</span><span class="c"> [ method ]
-</span></code><code id="L2467"><span class="ln">2467</span><span class="c"> **
-</span></code><code id="L2468"><span class="ln">2468</span><span class="c"> <span class="s"> * </span>Adds scale by given amount relative to given point to the list of
-</span></code><code id="L2469"><span class="ln">2469</span><span class="c"> <span class="s"> * </span>transformations of the element.
-</span></code><code id="L2470"><span class="ln">2470</span><span class="c"> > Parameters
-</span></code><code id="L2471"><span class="ln">2471</span><span class="c"> <span class="s"> - </span>sx (number) horisontal scale amount
-</span></code><code id="L2472"><span class="ln">2472</span><span class="c"> <span class="s"> - </span>sy (number) vertical scale amount
-</span></code><code id="L2473"><span class="ln">2473</span><span class="c"> <span class="s"> - </span>cx (number) #optional x coordinate of the centre of scale
-</span></code><code id="L2474"><span class="ln">2474</span><span class="c"> <span class="s"> - </span>cy (number) #optional y coordinate of the centre of scale
-</span></code><code id="L2475"><span class="ln">2475</span><span class="c"> <span class="s"> * </span>If cx<span class="s"> & </span>cy aren’t specified centre of the shape is used instead.
-</span></code><code id="L2476"><span class="ln">2476</span><span class="c"> <span class="s"> = </span>(object) @Element
-</span></code><code id="L2477"><span class="ln">2477</span><span class="c"> \*/</span>
-</code><code id="L2478"><span class="ln">2478</span> elproto.scale<span class="s"> = </span><b>function</b> (sx, sy, cx, cy) {
-</code><code id="L2479"><span class="ln">2479</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L2480"><span class="ln">2480</span> <b>return</b> <b>this</b>;
-</code><code id="L2481"><span class="ln">2481</span> }
-</code><code id="L2482"><span class="ln">2482</span> sx<span class="s"> = </span>Str(sx).split(separator);
-</code><code id="L2483"><span class="ln">2483</span> <b>if</b> (sx.length<span class="s"> - </span><span class="d">1</span>) {
-</code><code id="L2484"><span class="ln">2484</span> sy<span class="s"> = </span>toFloat(sx[<span class="d">1</span>]);
-</code><code id="L2485"><span class="ln">2485</span> cx<span class="s"> = </span>toFloat(sx[<span class="d">2</span>]);
-</code><code id="L2486"><span class="ln">2486</span> cy<span class="s"> = </span>toFloat(sx[<span class="d">3</span>]);
-</code><code id="L2487"><span class="ln">2487</span> }
-</code><code id="L2488"><span class="ln">2488</span> sx<span class="s"> = </span>toFloat(sx[<span class="d">0</span>]);
-</code><code id="L2489"><span class="ln">2489</span> (sy<span class="s"> == </span><b>null</b>)<span class="s"> && </span>(sy<span class="s"> = </span>sx);
-</code><code id="L2490"><span class="ln">2490</span> (cy<span class="s"> == </span><b>null</b>)<span class="s"> && </span>(cx<span class="s"> = </span>cy);
-</code><code id="L2491"><span class="ln">2491</span> <b>if</b> (cx<span class="s"> == </span><b>null</b><span class="s"> || </span>cy<span class="s"> == </span><b>null</b>) {
-</code><code id="L2492"><span class="ln">2492</span> <b>var</b> bbox<span class="s"> = </span><b>this</b>.getBBox(<span class="d">1</span>);
-</code><code id="L2493"><span class="ln">2493</span> }
-</code><code id="L2494"><span class="ln">2494</span> cx<span class="s"> = </span>cx<span class="s"> == </span><b>null</b> ? bbox.x<span class="s"> + </span>bbox.width<span class="s"> / </span><span class="d">2</span> : cx;
-</code><code id="L2495"><span class="ln">2495</span> cy<span class="s"> = </span>cy<span class="s"> == </span><b>null</b> ? bbox.y<span class="s"> + </span>bbox.height<span class="s"> / </span><span class="d">2</span> : cy;
-</code><code id="L2496"><span class="ln">2496</span> <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"s"</i>, sx, sy, cx, cy]]));
-</code><code id="L2497"><span class="ln">2497</span> <b>return</b> <b>this</b>;
-</code><code id="L2498"><span class="ln">2498</span> };
-</code><code id="L2499"><span class="ln">2499</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2500"><span class="ln">2500</span><span class="c"> <span class="s"> * </span>Element.translate
-</span></code><code id="L2501"><span class="ln">2501</span><span class="c"> [ method ]
-</span></code><code id="L2502"><span class="ln">2502</span><span class="c"> **
-</span></code><code id="L2503"><span class="ln">2503</span><span class="c"> <span class="s"> * </span>Adds translation by given amount to the list of transformations of the element.
-</span></code><code id="L2504"><span class="ln">2504</span><span class="c"> > Parameters
-</span></code><code id="L2505"><span class="ln">2505</span><span class="c"> <span class="s"> - </span>dx (number) horisontal shift
-</span></code><code id="L2506"><span class="ln">2506</span><span class="c"> <span class="s"> - </span>dy (number) vertical shift
-</span></code><code id="L2507"><span class="ln">2507</span><span class="c"> <span class="s"> = </span>(object) @Element
-</span></code><code id="L2508"><span class="ln">2508</span><span class="c"> \*/</span>
-</code><code id="L2509"><span class="ln">2509</span> elproto.translate<span class="s"> = </span><b>function</b> (dx, dy) {
-</code><code id="L2510"><span class="ln">2510</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L2511"><span class="ln">2511</span> <b>return</b> <b>this</b>;
-</code><code id="L2512"><span class="ln">2512</span> }
-</code><code id="L2513"><span class="ln">2513</span> dx<span class="s"> = </span>Str(dx).split(separator);
-</code><code id="L2514"><span class="ln">2514</span> <b>if</b> (dx.length<span class="s"> - </span><span class="d">1</span>) {
-</code><code id="L2515"><span class="ln">2515</span> dy<span class="s"> = </span>toFloat(dx[<span class="d">1</span>]);
-</code><code id="L2516"><span class="ln">2516</span> }
-</code><code id="L2517"><span class="ln">2517</span> dx<span class="s"> = </span>toFloat(dx[<span class="d">0</span>])<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L2518"><span class="ln">2518</span> dy<span class="s"> = </span>+dy<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L2519"><span class="ln">2519</span> <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"t"</i>, dx, dy]]));
-</code><code id="L2520"><span class="ln">2520</span> <b>return</b> <b>this</b>;
-</code><code id="L2521"><span class="ln">2521</span> };
-</code><code id="L2522"><span class="ln">2522</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2523"><span class="ln">2523</span><span class="c"> <span class="s"> * </span>Element.transform
-</span></code><code id="L2524"><span class="ln">2524</span><span class="c"> [ method ]
-</span></code><code id="L2525"><span class="ln">2525</span><span class="c"> **
-</span></code><code id="L2526"><span class="ln">2526</span><span class="c"> <span class="s"> * </span>Adds transformation to the element which is separate to other attributes,
-</span></code><code id="L2527"><span class="ln">2527</span><span class="c"> <span class="s"> * </span>i.e. translation doesn’t change `x` or `y` of the rectange. The format
-</span></code><code id="L2528"><span class="ln">2528</span><span class="c"> <span class="s"> * </span>of transformation string is similar to the path string syntax:
-</span></code><code id="L2529"><span class="ln">2529</span><span class="c"> <span class="s"> | </span><i>"t100,100r30,<span class="d">100</span>,100s2,<span class="d">2</span>,<span class="d">100</span>,100r45s1<span class="d">.5</span>"</i>
-</span></code><code id="L2530"><span class="ln">2530</span><span class="c"> <span class="s"> * </span>Each letter is a command. There are four commands: `t` is <b>for</b> translate, `r` is <b>for</b> rotate, `s` is <b>for</b>
-</span></code><code id="L2531"><span class="ln">2531</span><span class="c"> <span class="s"> * </span>scale and `m` is <b>for</b> matrix.
-</span></code><code id="L2532"><span class="ln">2532</span><span class="c"> *
-</span></code><code id="L2533"><span class="ln">2533</span><span class="c"> <span class="s"> * </span>So, example line could be read like “translate by <span class="d">100</span>, <span class="d">100</span>, rotate <span class="d">30</span>° around <span class="d">100</span>, <span class="d">100</span>, scale twice around <span class="d">100</span>, <span class="d">100</span>
-</span></code><code id="L2534"><span class="ln">2534</span><span class="c"> <span class="s"> * </span>rotate <span class="d">45</span>° around centre and scale <span class="d">1.5</span> times relative to centre”. As you see rotate and scale commands has origin
-</span></code><code id="L2535"><span class="ln">2535</span><span class="c"> <span class="s"> * </span>coordinates as a optional parameters.
-</span></code><code id="L2536"><span class="ln">2536</span><span class="c"> <span class="s"> * </span>Matrix accepts six parameters.
-</span></code><code id="L2537"><span class="ln">2537</span><span class="c"> > Usage
-</span></code><code id="L2538"><span class="ln">2538</span><span class="c"> <span class="s"> | </span><b>var</b> el<span class="s"> = </span>paper.rect(<span class="d">10</span>, <span class="d">20</span>, <span class="d">300</span>, <span class="d">200</span>);
-</span></code><code id="L2539"><span class="ln">2539</span><span class="c"> <span class="s"> | </span><span class="c">// translate <span class="d">100</span>, <span class="d">100</span>, rotate <span class="d">45</span>°, translate -<span class="d">100</span>, <span class="d">0</span></span>
-</span></code><code id="L2540"><span class="ln">2540</span><span class="c"> <span class="s"> | </span>el.transform(<i>"t100,100r45t-<span class="d">100</span>,<span class="d">0</span>"</i>);
-</span></code><code id="L2541"><span class="ln">2541</span><span class="c"> <span class="s"> | </span><span class="c">// <b>if</b> you want you can append or prepend transformations</span>
-</span></code><code id="L2542"><span class="ln">2542</span><span class="c"> <span class="s"> | </span>el.transform(<i>"...t50,<span class="d">50</span>"</i>);
-</span></code><code id="L2543"><span class="ln">2543</span><span class="c"> <span class="s"> | </span>el.transform(<i>"s2..."</i>);
-</span></code><code id="L2544"><span class="ln">2544</span><span class="c"> <span class="s"> | </span><span class="c">// or even wrap</span>
-</span></code><code id="L2545"><span class="ln">2545</span><span class="c"> <span class="s"> | </span>el.transform(<i>"t50,<span class="d">50</span>...t-<span class="d">50</span>-<span class="d">50</span>"</i>);
-</span></code><code id="L2546"><span class="ln">2546</span><span class="c"> <span class="s"> | </span><span class="c">// to reset transformation call method <b>with</b> empty string</span>
-</span></code><code id="L2547"><span class="ln">2547</span><span class="c"> <span class="s"> | </span>el.transform(<i>""</i>);
-</span></code><code id="L2548"><span class="ln">2548</span><span class="c"> <span class="s"> | </span><span class="c">// to get current value call it without parameters</span>
-</span></code><code id="L2549"><span class="ln">2549</span><span class="c"> <span class="s"> | </span>console.log(el.transform());
-</span></code><code id="L2550"><span class="ln">2550</span><span class="c"> > Parameters
-</span></code><code id="L2551"><span class="ln">2551</span><span class="c"> <span class="s"> - </span>tstr (string) #optional transformation string
-</span></code><code id="L2552"><span class="ln">2552</span><span class="c"> <span class="s"> * </span>If tstr isn’t specified
-</span></code><code id="L2553"><span class="ln">2553</span><span class="c"> <span class="s"> = </span>(string) current transformation string
-</span></code><code id="L2554"><span class="ln">2554</span><span class="c"> <span class="s"> * </span><b>else</b>
-</span></code><code id="L2555"><span class="ln">2555</span><span class="c"> <span class="s"> = </span>(object) @Element
-</span></code><code id="L2556"><span class="ln">2556</span><span class="c"> \*/</span>
-</code><code id="L2557"><span class="ln">2557</span> elproto.transform<span class="s"> = </span><b>function</b> (tstr) {
-</code><code id="L2558"><span class="ln">2558</span> <b>var</b> _<span class="s"> = </span><b>this</b>._;
-</code><code id="L2559"><span class="ln">2559</span> <b>if</b> (!tstr) {
-</code><code id="L2560"><span class="ln">2560</span> <b>return</b> _.transform;
-</code><code id="L2561"><span class="ln">2561</span> }
-</code><code id="L2562"><span class="ln">2562</span> extractTransform(<b>this</b>, tstr);
-</code><code id="L2563"><span class="ln">2563</span>
-</code><code id="L2564"><span class="ln">2564</span> <b>this</b>.clip<span class="s"> && </span>$(<b>this</b>.clip, {transform: <b>this</b>.matrix.invert()});
-</code><code id="L2565"><span class="ln">2565</span> <span class="c">// <b>this</b>.gradient<span class="s"> && </span>$(<b>this</b>.gradient, {gradientTransform: <b>this</b>.matrix.invert()});</span>
-</code><code id="L2566"><span class="ln">2566</span> <b>this</b>.pattern<span class="s"> && </span>updatePosition(<b>this</b>);
-</code><code id="L2567"><span class="ln">2567</span> <b>this</b>.node<span class="s"> && </span>$(<b>this</b>.node, {transform: <b>this</b>.matrix});
-</code><code id="L2568"><span class="ln">2568</span>
-</code><code id="L2569"><span class="ln">2569</span> <b>if</b> (_.sx != <span class="d">1</span><span class="s"> || </span>_.sy != <span class="d">1</span>) {
-</code><code id="L2570"><span class="ln">2570</span> <b>var</b> sw<span class="s"> = </span><b>this</b>.attrs[has](<i>"stroke-width"</i>) ? <b>this</b>.attrs[<i>"stroke-width"</i>] : <span class="d">1</span>;
-</code><code id="L2571"><span class="ln">2571</span> <b>this</b>.attr({<i>"stroke-width"</i>: sw});
-</code><code id="L2572"><span class="ln">2572</span> }
-</code><code id="L2573"><span class="ln">2573</span>
-</code><code id="L2574"><span class="ln">2574</span> <b>return</b> <b>this</b>;
-</code><code id="L2575"><span class="ln">2575</span> };
-</code><code id="L2576"><span class="ln">2576</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2577"><span class="ln">2577</span><span class="c"> <span class="s"> * </span>Element.hide
-</span></code><code id="L2578"><span class="ln">2578</span><span class="c"> [ method ]
-</span></code><code id="L2579"><span class="ln">2579</span><span class="c"> **
-</span></code><code id="L2580"><span class="ln">2580</span><span class="c"> <span class="s"> * </span>Makes element invisible. See @Element.show.
-</span></code><code id="L2581"><span class="ln">2581</span><span class="c"> <span class="s"> = </span>(object) @Element
-</span></code><code id="L2582"><span class="ln">2582</span><span class="c"> \*/</span>
-</code><code id="L2583"><span class="ln">2583</span> elproto.hide<span class="s"> = </span><b>function</b> () {
-</code><code id="L2584"><span class="ln">2584</span> !<b>this</b>.removed<span class="s"> && </span><b>this</b>.paper.safari(<b>this</b>.node.style.display<span class="s"> = </span><i>"none"</i>);
-</code><code id="L2585"><span class="ln">2585</span> <b>return</b> <b>this</b>;
-</code><code id="L2586"><span class="ln">2586</span> };
-</code><code id="L2587"><span class="ln">2587</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2588"><span class="ln">2588</span><span class="c"> <span class="s"> * </span>Element.show
-</span></code><code id="L2589"><span class="ln">2589</span><span class="c"> [ method ]
-</span></code><code id="L2590"><span class="ln">2590</span><span class="c"> **
-</span></code><code id="L2591"><span class="ln">2591</span><span class="c"> <span class="s"> * </span>Makes element visible. See @Element.hide.
-</span></code><code id="L2592"><span class="ln">2592</span><span class="c"> <span class="s"> = </span>(object) @Element
-</span></code><code id="L2593"><span class="ln">2593</span><span class="c"> \*/</span>
-</code><code id="L2594"><span class="ln">2594</span> elproto.show<span class="s"> = </span><b>function</b> () {
-</code><code id="L2595"><span class="ln">2595</span> !<b>this</b>.removed<span class="s"> && </span><b>this</b>.paper.safari(<b>this</b>.node.style.display<span class="s"> = </span><i>""</i>);
-</code><code id="L2596"><span class="ln">2596</span> <b>return</b> <b>this</b>;
-</code><code id="L2597"><span class="ln">2597</span> };
-</code><code id="L2598"><span class="ln">2598</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2599"><span class="ln">2599</span><span class="c"> <span class="s"> * </span>Element.remove
-</span></code><code id="L2600"><span class="ln">2600</span><span class="c"> [ method ]
-</span></code><code id="L2601"><span class="ln">2601</span><span class="c"> **
-</span></code><code id="L2602"><span class="ln">2602</span><span class="c"> <span class="s"> * </span>Removes element form the paper.
-</span></code><code id="L2603"><span class="ln">2603</span><span class="c"> \*/</span>
-</code><code id="L2604"><span class="ln">2604</span> elproto.remove<span class="s"> = </span><b>function</b> () {
-</code><code id="L2605"><span class="ln">2605</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L2606"><span class="ln">2606</span> <b>return</b>;
-</code><code id="L2607"><span class="ln">2607</span> }
-</code><code id="L2608"><span class="ln">2608</span> eve.unbind(<i>"*.*."</i><span class="s"> + </span><b>this</b>.id);
-</code><code id="L2609"><span class="ln">2609</span> tear(<b>this</b>, <b>this</b>.paper);
-</code><code id="L2610"><span class="ln">2610</span> <b>this</b>.node.parentNode.removeChild(<b>this</b>.node);
-</code><code id="L2611"><span class="ln">2611</span> <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>) {
-</code><code id="L2612"><span class="ln">2612</span> <b>delete</b> <b>this</b>[i];
-</code><code id="L2613"><span class="ln">2613</span> }
-</code><code id="L2614"><span class="ln">2614</span> <b>this</b>.removed<span class="s"> = </span><b>true</b>;
-</code><code id="L2615"><span class="ln">2615</span> };
-</code><code id="L2616"><span class="ln">2616</span> elproto._getBBox<span class="s"> = </span><b>function</b> () {
-</code><code id="L2617"><span class="ln">2617</span> <b>if</b> (<b>this</b>.node.style.display<span class="s"> == </span><i>"none"</i>) {
-</code><code id="L2618"><span class="ln">2618</span> <b>this</b>.show();
-</code><code id="L2619"><span class="ln">2619</span> <b>var</b> hide<span class="s"> = </span><b>true</b>;
-</code><code id="L2620"><span class="ln">2620</span> }
-</code><code id="L2621"><span class="ln">2621</span> <b>var</b> bbox<span class="s"> = </span>{};
-</code><code id="L2622"><span class="ln">2622</span> <b>try</b> {
-</code><code id="L2623"><span class="ln">2623</span> bbox<span class="s"> = </span><b>this</b>.node.getBBox();
-</code><code id="L2624"><span class="ln">2624</span> } <b>catch</b>(e) {
-</code><code id="L2625"><span class="ln">2625</span> <span class="c">// Firefox <span class="d">3.0</span>.x plays badly here</span>
-</code><code id="L2626"><span class="ln">2626</span> } <b>finally</b> {
-</code><code id="L2627"><span class="ln">2627</span> bbox<span class="s"> = </span>bbox<span class="s"> || </span>{};
-</code><code id="L2628"><span class="ln">2628</span> }
-</code><code id="L2629"><span class="ln">2629</span> hide<span class="s"> && </span><b>this</b>.hide();
-</code><code id="L2630"><span class="ln">2630</span> <b>return</b> bbox;
-</code><code id="L2631"><span class="ln">2631</span> };
-</code><code id="L2632"><span class="ln">2632</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2633"><span class="ln">2633</span><span class="c"> <span class="s"> * </span>Element.attr
-</span></code><code id="L2634"><span class="ln">2634</span><span class="c"> [ method ]
-</span></code><code id="L2635"><span class="ln">2635</span><span class="c"> **
-</span></code><code id="L2636"><span class="ln">2636</span><span class="c"> <span class="s"> * </span>Sets the attributes of the element.
-</span></code><code id="L2637"><span class="ln">2637</span><span class="c"> > Parameters
-</span></code><code id="L2638"><span class="ln">2638</span><span class="c"> <span class="s"> - </span>attrName (string) attribute’s name
-</span></code><code id="L2639"><span class="ln">2639</span><span class="c"> <span class="s"> - </span>value (string) value
-</span></code><code id="L2640"><span class="ln">2640</span><span class="c"> <span class="s"> * </span>or
-</span></code><code id="L2641"><span class="ln">2641</span><span class="c"> <span class="s"> - </span>params (object) object of name/value pairs
-</span></code><code id="L2642"><span class="ln">2642</span><span class="c"> <span class="s"> * </span>or
-</span></code><code id="L2643"><span class="ln">2643</span><span class="c"> <span class="s"> - </span>attrName (string) attribute’s name
-</span></code><code id="L2644"><span class="ln">2644</span><span class="c"> <span class="s"> * </span>or
-</span></code><code id="L2645"><span class="ln">2645</span><span class="c"> <span class="s"> - </span>attrNames (array) <b>in</b> <b>this</b> <b>case</b> method returns array of current values <b>for</b> given attribute names
-</span></code><code id="L2646"><span class="ln">2646</span><span class="c"> <span class="s"> = </span>(object) @Element <b>if</b> attrsName<span class="s"> & </span>value or params are passed <b>in</b>.
-</span></code><code id="L2647"><span class="ln">2647</span><span class="c"> <span class="s"> = </span>(...) value of the attribute <b>if</b> only attrsName is passed <b>in</b>.
-</span></code><code id="L2648"><span class="ln">2648</span><span class="c"> <span class="s"> = </span>(array) array of values of the attribute <b>if</b> attrsNames is passed <b>in</b>.
-</span></code><code id="L2649"><span class="ln">2649</span><span class="c"> <span class="s"> = </span>(object) object of attributes <b>if</b> nothing is passed <b>in</b>.
-</span></code><code id="L2650"><span class="ln">2650</span><span class="c"> > Possible parameters
-</span></code><code id="L2651"><span class="ln">2651</span><span class="c"> # <p>Please refer to the <a href=<i>"http:<span class="c">//www.w3.org/TR/SVG/"</i> title=<i>"The W3C Recommendation <b>for</b> the SVG language describes these properties <b>in</b> detail."</i>>SVG specification</a> <b>for</b> an explanation of these parameters.</p></span>
-</span></code><code id="L2652"><span class="ln">2652</span><span class="c"> o arrow-end (string) arrowhead on the end of the path. The format <b>for</b> string is `<type>[-<width>[-<length>]]`. Possible types: `classic`, `block`, `open`, `oval`, `diamond`, `none`, width: `wide`, `narrow`, `midium`, length: `<b>long</b>`, `<b>short</b>`, `midium`.
-</span></code><code id="L2653"><span class="ln">2653</span><span class="c"> o clip-rect (string) comma or space separated values: x, y, width and height
-</span></code><code id="L2654"><span class="ln">2654</span><span class="c"> o cursor (string) CSS type of the cursor
-</span></code><code id="L2655"><span class="ln">2655</span><span class="c"> o cx (number)
-</span></code><code id="L2656"><span class="ln">2656</span><span class="c"> o cy (number)
-</span></code><code id="L2657"><span class="ln">2657</span><span class="c"> o fill (string) colour, gradient or image
-</span></code><code id="L2658"><span class="ln">2658</span><span class="c"> o fill-opacity (number)
-</span></code><code id="L2659"><span class="ln">2659</span><span class="c"> o font (string)
-</span></code><code id="L2660"><span class="ln">2660</span><span class="c"> o font-family (string)
-</span></code><code id="L2661"><span class="ln">2661</span><span class="c"> o font-size (number) font size <b>in</b> pixels
-</span></code><code id="L2662"><span class="ln">2662</span><span class="c"> o font-weight (string)
-</span></code><code id="L2663"><span class="ln">2663</span><span class="c"> o height (number)
-</span></code><code id="L2664"><span class="ln">2664</span><span class="c"> o href (string) URL, <b>if</b> specified element behaves as hyperlink
-</span></code><code id="L2665"><span class="ln">2665</span><span class="c"> o opacity (number)
-</span></code><code id="L2666"><span class="ln">2666</span><span class="c"> o path (string) SVG path string format
-</span></code><code id="L2667"><span class="ln">2667</span><span class="c"> o r (number)
-</span></code><code id="L2668"><span class="ln">2668</span><span class="c"> o rx (number)
-</span></code><code id="L2669"><span class="ln">2669</span><span class="c"> o ry (number)
-</span></code><code id="L2670"><span class="ln">2670</span><span class="c"> o src (string) image URL, only works <b>for</b> @Element.image element
-</span></code><code id="L2671"><span class="ln">2671</span><span class="c"> o stroke (string) stroke colour
-</span></code><code id="L2672"><span class="ln">2672</span><span class="c"> o stroke-dasharray (string) [“”, “`-`”, “`.`”, “`-.`”, “`-..`”, “`. `”, “`- `”, “`--`”, “`- .`”, “`--.`”, “`--..`”]
-</span></code><code id="L2673"><span class="ln">2673</span><span class="c"> o stroke-linecap (string) [“`butt`”, “`square`”, “`round`”]
-</span></code><code id="L2674"><span class="ln">2674</span><span class="c"> o stroke-linejoin (string) [“`bevel`”, “`round`”, “`miter`”]
-</span></code><code id="L2675"><span class="ln">2675</span><span class="c"> o stroke-miterlimit (number)
-</span></code><code id="L2676"><span class="ln">2676</span><span class="c"> o stroke-opacity (number)
-</span></code><code id="L2677"><span class="ln">2677</span><span class="c"> o stroke-width (number) stroke width <b>in</b> pixels, <b>default</b> is <i>'<span class="d">1</span>'</i>
-</span></code><code id="L2678"><span class="ln">2678</span><span class="c"> o target (string) used <b>with</b> href
-</span></code><code id="L2679"><span class="ln">2679</span><span class="c"> o text (string) contents of the text element. Use `\n` <b>for</b> multiline text
-</span></code><code id="L2680"><span class="ln">2680</span><span class="c"> o text-anchor (string) [“`start`”, “`middle`”, “`end`”], <b>default</b> is “`middle`”
-</span></code><code id="L2681"><span class="ln">2681</span><span class="c"> o title (string) will create tooltip <b>with</b> a given text
-</span></code><code id="L2682"><span class="ln">2682</span><span class="c"> o transform (string) see @Element.transform
-</span></code><code id="L2683"><span class="ln">2683</span><span class="c"> o width (number)
-</span></code><code id="L2684"><span class="ln">2684</span><span class="c"> o x (number)
-</span></code><code id="L2685"><span class="ln">2685</span><span class="c"> o y (number)
-</span></code><code id="L2686"><span class="ln">2686</span><span class="c"> > Gradients
-</span></code><code id="L2687"><span class="ln">2687</span><span class="c"> <span class="s"> * </span>Linear gradient format: “`‹angle›-‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`<span class="d">90</span>-#fff-#<span class="d">000</span>`” – <span class="d">90</span>°
-</span></code><code id="L2688"><span class="ln">2688</span><span class="c"> <span class="s"> * </span>gradient from white to black or “`<span class="d">0</span>-#fff-#f00:<span class="d">20</span>-#<span class="d">000</span>`” – <span class="d">0</span>° gradient from white via red (at <span class="d">20</span>%) to black.
-</span></code><code id="L2689"><span class="ln">2689</span><span class="c"> *
-</span></code><code id="L2690"><span class="ln">2690</span><span class="c"> <span class="s"> * </span>radial gradient: “`r[(‹fx›, ‹fy›)]‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`r#fff-#<span class="d">000</span>`” –
-</span></code><code id="L2691"><span class="ln">2691</span><span class="c"> <span class="s"> * </span>gradient from white to black or “`r(<span class="d">0.25</span>, <span class="d">0.75</span>)#fff-#<span class="d">000</span>`” – gradient from white to black <b>with</b> focus point
-</span></code><code id="L2692"><span class="ln">2692</span><span class="c"> <span class="s"> * </span>at <span class="d">0.25</span>, <span class="d">0.75</span>. Focus point coordinates are <b>in</b> <span class="d">0</span>.<span class="d">.1</span> range. Radial gradients can only be applied to circles and ellipses.
-</span></code><code id="L2693"><span class="ln">2693</span><span class="c"> > Path String
-</span></code><code id="L2694"><span class="ln">2694</span><span class="c"> # <p>Please refer to <a href=<i>"http:<span class="c">//www.w3.org/TR/SVG/paths.html#PathData"</i> title=<i>"Details of a path’s data attribute’s format are described <b>in</b> the SVG specification."</i>>SVG documentation regarding path string</a>. Raphaël fully supports it.</p></span>
-</span></code><code id="L2695"><span class="ln">2695</span><span class="c"> > Colour Parsing
-</span></code><code id="L2696"><span class="ln">2696</span><span class="c"> # <ul>
-</span></code><code id="L2697"><span class="ln">2697</span><span class="c"> # <li>Colour name (“<code>red</code>”, “<code>green</code>”, “<code>cornflowerblue</code>”, etc)</li>
-</span></code><code id="L2698"><span class="ln">2698</span><span class="c"> # <li>#••• — shortened HTML colour: (“<code>#<span class="d">000</span></code>”, “<code>#fc0</code>”, etc)</li>
-</span></code><code id="L2699"><span class="ln">2699</span><span class="c"> # <li>#•••••• — full length HTML colour: (“<code>#<span class="d">000000</span></code>”, “<code>#bd2300</code>”)</li>
-</span></code><code id="L2700"><span class="ln">2700</span><span class="c"> # <li>rgb(•••, •••, •••) — red, green and blue channels’ values: (“<code>rgb(<span class="d">200</span>, <span class="d">100</span>, <span class="d">0</span>)</code>”)</li>
-</span></code><code id="L2701"><span class="ln">2701</span><span class="c"> # <li>rgb(•••%, •••%, •••%) — same as above, but <b>in</b> %: (“<code>rgb(<span class="d">100</span>%, <span class="d">175</span>%, <span class="d">0</span>%)</code>”)</li>
-</span></code><code id="L2702"><span class="ln">2702</span><span class="c"> # <li>rgba(•••, •••, •••, •••) — red, green and blue channels’ values: (“<code>rgba(<span class="d">200</span>, <span class="d">100</span>, <span class="d">0</span>, <span class="d">.5</span>)</code>”)</li>
-</span></code><code id="L2703"><span class="ln">2703</span><span class="c"> # <li>rgba(•••%, •••%, •••%, •••%) — same as above, but <b>in</b> %: (“<code>rgba(<span class="d">100</span>%, <span class="d">175</span>%, <span class="d">0</span>%, <span class="d">50</span>%)</code>”)</li>
-</span></code><code id="L2704"><span class="ln">2704</span><span class="c"> # <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (“<code>hsb(<span class="d">0.5</span>, <span class="d">0.25</span>, <span class="d">1</span>)</code>”)</li>
-</span></code><code id="L2705"><span class="ln">2705</span><span class="c"> # <li>hsb(•••%, •••%, •••%) — same as above, but <b>in</b> %</li>
-</span></code><code id="L2706"><span class="ln">2706</span><span class="c"> # <li>hsba(•••, •••, •••, •••) — same as above, but <b>with</b> opacity</li>
-</span></code><code id="L2707"><span class="ln">2707</span><span class="c"> # <li>hsl(•••, •••, •••) — almost the same as hsb, see <a href=<i>"http:<span class="c">//en.wikipedia.org/wiki/HSL_and_HSV"</i> title=<i>"HSL and HSV<span class="s"> - </span>Wikipedia, the free encyclopedia"</i>>Wikipedia page</a></li></span>
-</span></code><code id="L2708"><span class="ln">2708</span><span class="c"> # <li>hsl(•••%, •••%, •••%) — same as above, but <b>in</b> %</li>
-</span></code><code id="L2709"><span class="ln">2709</span><span class="c"> # <li>hsla(•••, •••, •••) — same as above, but <b>with</b> opacity</li>
-</span></code><code id="L2710"><span class="ln">2710</span><span class="c"> # <li>Optionally <b>for</b> hsb and hsl you could specify hue as a degree: “<code>hsl(240deg, <span class="d">1</span>, <span class="d">.5</span>)</code>” or, <b>if</b> you want to go fancy, “<code>hsl(<span class="d">240</span>°, <span class="d">1</span>, <span class="d">.5</span>)</code>”</li>
-</span></code><code id="L2711"><span class="ln">2711</span><span class="c"> # </ul>
-</span></code><code id="L2712"><span class="ln">2712</span><span class="c"> \*/</span>
-</code><code id="L2713"><span class="ln">2713</span> elproto.attr<span class="s"> = </span><b>function</b> (name, value) {
-</code><code id="L2714"><span class="ln">2714</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L2715"><span class="ln">2715</span> <b>return</b> <b>this</b>;
-</code><code id="L2716"><span class="ln">2716</span> }
-</code><code id="L2717"><span class="ln">2717</span> <b>if</b> (name<span class="s"> == </span><b>null</b>) {
-</code><code id="L2718"><span class="ln">2718</span> <b>var</b> res<span class="s"> = </span>{};
-</code><code id="L2719"><span class="ln">2719</span> <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>.attrs) <b>if</b> (<b>this</b>.attrs[has](i)) {
-</code><code id="L2720"><span class="ln">2720</span> res[i]<span class="s"> = </span><b>this</b>.attrs[i];
-</code><code id="L2721"><span class="ln">2721</span> }
-</code><code id="L2722"><span class="ln">2722</span> res.gradient<span class="s"> && </span>res.fill<span class="s"> == </span><i>"none"</i><span class="s"> && </span>(res.fill<span class="s"> = </span>res.gradient)<span class="s"> && </span><b>delete</b> res.gradient;
-</code><code id="L2723"><span class="ln">2723</span> res.transform<span class="s"> = </span><b>this</b>._.transform;
-</code><code id="L2724"><span class="ln">2724</span> <b>return</b> res;
-</code><code id="L2725"><span class="ln">2725</span> }
-</code><code id="L2726"><span class="ln">2726</span> <b>if</b> (value<span class="s"> == </span><b>null</b><span class="s"> && </span>R.is(name, string)) {
-</code><code id="L2727"><span class="ln">2727</span> <b>if</b> (name<span class="s"> == </span>fillString<span class="s"> && </span><b>this</b>.attrs.fill<span class="s"> == </span><i>"none"</i><span class="s"> && </span><b>this</b>.attrs.gradient) {
-</code><code id="L2728"><span class="ln">2728</span> <b>return</b> <b>this</b>.attrs.gradient;
-</code><code id="L2729"><span class="ln">2729</span> }
-</code><code id="L2730"><span class="ln">2730</span> <b>if</b> (name<span class="s"> == </span><i>"transform"</i>) {
-</code><code id="L2731"><span class="ln">2731</span> <b>return</b> <b>this</b>._.transform;
-</code><code id="L2732"><span class="ln">2732</span> }
-</code><code id="L2733"><span class="ln">2733</span> <b>if</b> (name <b>in</b> <b>this</b>.attrs) {
-</code><code id="L2734"><span class="ln">2734</span> <b>return</b> <b>this</b>.attrs[name];
-</code><code id="L2735"><span class="ln">2735</span> } <b>else</b> <b>if</b> (R.is(<b>this</b>.paper.customAttributes[name], <i>"<b>function</b>"</i>)) {
-</code><code id="L2736"><span class="ln">2736</span> <b>return</b> <b>this</b>.paper.customAttributes[name].def;
-</code><code id="L2737"><span class="ln">2737</span> } <b>else</b> {
-</code><code id="L2738"><span class="ln">2738</span> <b>return</b> availableAttrs[name];
-</code><code id="L2739"><span class="ln">2739</span> }
-</code><code id="L2740"><span class="ln">2740</span> }
-</code><code id="L2741"><span class="ln">2741</span> <b>if</b> (value<span class="s"> == </span><b>null</b><span class="s"> && </span>R.is(name, array)) {
-</code><code id="L2742"><span class="ln">2742</span> <b>var</b> values<span class="s"> = </span>{};
-</code><code id="L2743"><span class="ln">2743</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">0</span>, jj<span class="s"> = </span>name.length; j < jj; j++) {
-</code><code id="L2744"><span class="ln">2744</span> values[name[j]]<span class="s"> = </span><b>this</b>.attr(name[j]);
-</code><code id="L2745"><span class="ln">2745</span> }
-</code><code id="L2746"><span class="ln">2746</span> <b>return</b> values;
-</code><code id="L2747"><span class="ln">2747</span> }
-</code><code id="L2748"><span class="ln">2748</span> <b>if</b> (value != <b>null</b>) {
-</code><code id="L2749"><span class="ln">2749</span> <b>var</b> params<span class="s"> = </span>{};
-</code><code id="L2750"><span class="ln">2750</span> params[name]<span class="s"> = </span>value;
-</code><code id="L2751"><span class="ln">2751</span> } <b>else</b> <b>if</b> (name != <b>null</b><span class="s"> && </span>R.is(name, <i>"object"</i>)) {
-</code><code id="L2752"><span class="ln">2752</span> params<span class="s"> = </span>name;
-</code><code id="L2753"><span class="ln">2753</span> }
-</code><code id="L2754"><span class="ln">2754</span> <b>for</b> (<b>var</b> key <b>in</b> <b>this</b>.paper.customAttributes) <b>if</b> (<b>this</b>.paper.customAttributes[has](key)<span class="s"> && </span>params[has](key)<span class="s"> && </span>R.is(<b>this</b>.paper.customAttributes[key], <i>"<b>function</b>"</i>)) {
-</code><code id="L2755"><span class="ln">2755</span> <b>var</b> par<span class="s"> = </span><b>this</b>.paper.customAttributes[key].apply(<b>this</b>, [][concat](params[key]));
-</code><code id="L2756"><span class="ln">2756</span> <b>this</b>.attrs[key]<span class="s"> = </span>params[key];
-</code><code id="L2757"><span class="ln">2757</span> <b>for</b> (<b>var</b> subkey <b>in</b> par) <b>if</b> (par[has](subkey)) {
-</code><code id="L2758"><span class="ln">2758</span> params[subkey]<span class="s"> = </span>par[subkey];
-</code><code id="L2759"><span class="ln">2759</span> }
-</code><code id="L2760"><span class="ln">2760</span> }
-</code><code id="L2761"><span class="ln">2761</span> setFillAndStroke(<b>this</b>, params);
-</code><code id="L2762"><span class="ln">2762</span> <b>return</b> <b>this</b>;
-</code><code id="L2763"><span class="ln">2763</span> };
-</code><code id="L2764"><span class="ln">2764</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2765"><span class="ln">2765</span><span class="c"> <span class="s"> * </span>Element.toFront
-</span></code><code id="L2766"><span class="ln">2766</span><span class="c"> [ method ]
-</span></code><code id="L2767"><span class="ln">2767</span><span class="c"> **
-</span></code><code id="L2768"><span class="ln">2768</span><span class="c"> <span class="s"> * </span>Moves the element so it is the closest to the viewer’s eyes, on top of other elements.
-</span></code><code id="L2769"><span class="ln">2769</span><span class="c"> <span class="s"> = </span>(object) @Element
-</span></code><code id="L2770"><span class="ln">2770</span><span class="c"> \*/</span>
-</code><code id="L2771"><span class="ln">2771</span> elproto.toFront<span class="s"> = </span><b>function</b> () {
-</code><code id="L2772"><span class="ln">2772</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L2773"><span class="ln">2773</span> <b>return</b> <b>this</b>;
-</code><code id="L2774"><span class="ln">2774</span> }
-</code><code id="L2775"><span class="ln">2775</span> <b>this</b>.node.parentNode.appendChild(<b>this</b>.node);
-</code><code id="L2776"><span class="ln">2776</span> <b>var</b> svg<span class="s"> = </span><b>this</b>.paper;
-</code><code id="L2777"><span class="ln">2777</span> svg.top != <b>this</b><span class="s"> && </span>tofront(<b>this</b>, svg);
-</code><code id="L2778"><span class="ln">2778</span> <b>return</b> <b>this</b>;
-</code><code id="L2779"><span class="ln">2779</span> };
-</code><code id="L2780"><span class="ln">2780</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2781"><span class="ln">2781</span><span class="c"> <span class="s"> * </span>Element.toBack
-</span></code><code id="L2782"><span class="ln">2782</span><span class="c"> [ method ]
-</span></code><code id="L2783"><span class="ln">2783</span><span class="c"> **
-</span></code><code id="L2784"><span class="ln">2784</span><span class="c"> <span class="s"> * </span>Moves the element so it is the furthest from the viewer’s eyes, behind other elements.
-</span></code><code id="L2785"><span class="ln">2785</span><span class="c"> <span class="s"> = </span>(object) @Element
-</span></code><code id="L2786"><span class="ln">2786</span><span class="c"> \*/</span>
-</code><code id="L2787"><span class="ln">2787</span> elproto.toBack<span class="s"> = </span><b>function</b> () {
-</code><code id="L2788"><span class="ln">2788</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L2789"><span class="ln">2789</span> <b>return</b> <b>this</b>;
-</code><code id="L2790"><span class="ln">2790</span> }
-</code><code id="L2791"><span class="ln">2791</span> <b>if</b> (<b>this</b>.node.parentNode.firstChild != <b>this</b>.node) {
-</code><code id="L2792"><span class="ln">2792</span> <b>this</b>.node.parentNode.insertBefore(<b>this</b>.node, <b>this</b>.node.parentNode.firstChild);
-</code><code id="L2793"><span class="ln">2793</span> toback(<b>this</b>, <b>this</b>.paper);
-</code><code id="L2794"><span class="ln">2794</span> <b>var</b> svg<span class="s"> = </span><b>this</b>.paper;
-</code><code id="L2795"><span class="ln">2795</span> }
-</code><code id="L2796"><span class="ln">2796</span> <b>return</b> <b>this</b>;
-</code><code id="L2797"><span class="ln">2797</span> };
-</code><code id="L2798"><span class="ln">2798</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2799"><span class="ln">2799</span><span class="c"> <span class="s"> * </span>Element.insertAfter
-</span></code><code id="L2800"><span class="ln">2800</span><span class="c"> [ method ]
-</span></code><code id="L2801"><span class="ln">2801</span><span class="c"> **
-</span></code><code id="L2802"><span class="ln">2802</span><span class="c"> <span class="s"> * </span>Inserts current object after the given one.
-</span></code><code id="L2803"><span class="ln">2803</span><span class="c"> <span class="s"> = </span>(object) @Element
-</span></code><code id="L2804"><span class="ln">2804</span><span class="c"> \*/</span>
-</code><code id="L2805"><span class="ln">2805</span> elproto.insertAfter<span class="s"> = </span><b>function</b> (element) {
-</code><code id="L2806"><span class="ln">2806</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L2807"><span class="ln">2807</span> <b>return</b> <b>this</b>;
-</code><code id="L2808"><span class="ln">2808</span> }
-</code><code id="L2809"><span class="ln">2809</span> <b>var</b> node<span class="s"> = </span>element.node<span class="s"> || </span>element[element.length<span class="s"> - </span><span class="d">1</span>].node;
-</code><code id="L2810"><span class="ln">2810</span> <b>if</b> (node.nextSibling) {
-</code><code id="L2811"><span class="ln">2811</span> node.parentNode.insertBefore(<b>this</b>.node, node.nextSibling);
-</code><code id="L2812"><span class="ln">2812</span> } <b>else</b> {
-</code><code id="L2813"><span class="ln">2813</span> node.parentNode.appendChild(<b>this</b>.node);
-</code><code id="L2814"><span class="ln">2814</span> }
-</code><code id="L2815"><span class="ln">2815</span> insertafter(<b>this</b>, element, <b>this</b>.paper);
-</code><code id="L2816"><span class="ln">2816</span> <b>return</b> <b>this</b>;
-</code><code id="L2817"><span class="ln">2817</span> };
-</code><code id="L2818"><span class="ln">2818</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2819"><span class="ln">2819</span><span class="c"> <span class="s"> * </span>Element.insertBefore
-</span></code><code id="L2820"><span class="ln">2820</span><span class="c"> [ method ]
-</span></code><code id="L2821"><span class="ln">2821</span><span class="c"> **
-</span></code><code id="L2822"><span class="ln">2822</span><span class="c"> <span class="s"> * </span>Inserts current object before the given one.
-</span></code><code id="L2823"><span class="ln">2823</span><span class="c"> <span class="s"> = </span>(object) @Element
-</span></code><code id="L2824"><span class="ln">2824</span><span class="c"> \*/</span>
-</code><code id="L2825"><span class="ln">2825</span> elproto.insertBefore<span class="s"> = </span><b>function</b> (element) {
-</code><code id="L2826"><span class="ln">2826</span> <b>if</b> (<b>this</b>.removed) {
-</code><code id="L2827"><span class="ln">2827</span> <b>return</b> <b>this</b>;
-</code><code id="L2828"><span class="ln">2828</span> }
-</code><code id="L2829"><span class="ln">2829</span> <b>var</b> node<span class="s"> = </span>element.node<span class="s"> || </span>element[<span class="d">0</span>].node;
-</code><code id="L2830"><span class="ln">2830</span> node.parentNode.insertBefore(<b>this</b>.node, node);
-</code><code id="L2831"><span class="ln">2831</span> insertbefore(<b>this</b>, element, <b>this</b>.paper);
-</code><code id="L2832"><span class="ln">2832</span> <b>return</b> <b>this</b>;
-</code><code id="L2833"><span class="ln">2833</span> };
-</code><code id="L2834"><span class="ln">2834</span> elproto.blur<span class="s"> = </span><b>function</b> (size) {
-</code><code id="L2835"><span class="ln">2835</span> <span class="c">// Experimental. No Safari support. Use it on your own risk.</span>
-</code><code id="L2836"><span class="ln">2836</span> <b>var</b> t<span class="s"> = </span><b>this</b>;
-</code><code id="L2837"><span class="ln">2837</span> <b>if</b> (+size !== <span class="d">0</span>) {
-</code><code id="L2838"><span class="ln">2838</span> <b>var</b> fltr<span class="s"> = </span>$(<i>"filter"</i>),
-</code><code id="L2839"><span class="ln">2839</span> blur<span class="s"> = </span>$(<i>"feGaussianBlur"</i>);
-</code><code id="L2840"><span class="ln">2840</span> t.attrs.blur<span class="s"> = </span>size;
-</code><code id="L2841"><span class="ln">2841</span> fltr.id<span class="s"> = </span>createUUID();
-</code><code id="L2842"><span class="ln">2842</span> $(blur, {stdDeviation: +size<span class="s"> || </span><span class="d">1.5</span>});
-</code><code id="L2843"><span class="ln">2843</span> fltr.appendChild(blur);
-</code><code id="L2844"><span class="ln">2844</span> t.paper.defs.appendChild(fltr);
-</code><code id="L2845"><span class="ln">2845</span> t._blur<span class="s"> = </span>fltr;
-</code><code id="L2846"><span class="ln">2846</span> $(t.node, {filter: <i>"url(#"</i><span class="s"> + </span>fltr.id<span class="s"> + </span><i>")"</i>});
-</code><code id="L2847"><span class="ln">2847</span> } <b>else</b> {
-</code><code id="L2848"><span class="ln">2848</span> <b>if</b> (t._blur) {
-</code><code id="L2849"><span class="ln">2849</span> t._blur.parentNode.removeChild(t._blur);
-</code><code id="L2850"><span class="ln">2850</span> <b>delete</b> t._blur;
-</code><code id="L2851"><span class="ln">2851</span> <b>delete</b> t.attrs.blur;
-</code><code id="L2852"><span class="ln">2852</span> }
-</code><code id="L2853"><span class="ln">2853</span> t.node.removeAttribute(<i>"filter"</i>);
-</code><code id="L2854"><span class="ln">2854</span> }
-</code><code id="L2855"><span class="ln">2855</span> };
-</code><code id="L2856"><span class="ln">2856</span> <b>var</b> theCircle<span class="s"> = </span><b>function</b> (svg, x, y, r) {
-</code><code id="L2857"><span class="ln">2857</span> <b>var</b> el<span class="s"> = </span>$(<i>"circle"</i>);
-</code><code id="L2858"><span class="ln">2858</span> svg.canvas<span class="s"> && </span>svg.canvas.appendChild(el);
-</code><code id="L2859"><span class="ln">2859</span> <b>var</b> res<span class="s"> = </span><b>new</b> Element(el, svg);
-</code><code id="L2860"><span class="ln">2860</span> res.attrs<span class="s"> = </span>{cx: x, cy: y, r: r, fill: <i>"none"</i>, stroke: <i>"#<span class="d">000</span>"</i>};
-</code><code id="L2861"><span class="ln">2861</span> res.type<span class="s"> = </span><i>"circle"</i>;
-</code><code id="L2862"><span class="ln">2862</span> $(el, res.attrs);
-</code><code id="L2863"><span class="ln">2863</span> <b>return</b> res;
-</code><code id="L2864"><span class="ln">2864</span> },
-</code><code id="L2865"><span class="ln">2865</span> theRect<span class="s"> = </span><b>function</b> (svg, x, y, w, h, r) {
-</code><code id="L2866"><span class="ln">2866</span> <b>var</b> el<span class="s"> = </span>$(<i>"rect"</i>);
-</code><code id="L2867"><span class="ln">2867</span> svg.canvas<span class="s"> && </span>svg.canvas.appendChild(el);
-</code><code id="L2868"><span class="ln">2868</span> <b>var</b> res<span class="s"> = </span><b>new</b> Element(el, svg);
-</code><code id="L2869"><span class="ln">2869</span> res.attrs<span class="s"> = </span>{x: x, y: y, width: w, height: h, r: r<span class="s"> || </span><span class="d">0</span>, rx: r<span class="s"> || </span><span class="d">0</span>, ry: r<span class="s"> || </span><span class="d">0</span>, fill: <i>"none"</i>, stroke: <i>"#<span class="d">000</span>"</i>};
-</code><code id="L2870"><span class="ln">2870</span> res.type<span class="s"> = </span><i>"rect"</i>;
-</code><code id="L2871"><span class="ln">2871</span> $(el, res.attrs);
-</code><code id="L2872"><span class="ln">2872</span> <b>return</b> res;
-</code><code id="L2873"><span class="ln">2873</span> },
-</code><code id="L2874"><span class="ln">2874</span> theEllipse<span class="s"> = </span><b>function</b> (svg, x, y, rx, ry) {
-</code><code id="L2875"><span class="ln">2875</span> <b>var</b> el<span class="s"> = </span>$(<i>"ellipse"</i>);
-</code><code id="L2876"><span class="ln">2876</span> svg.canvas<span class="s"> && </span>svg.canvas.appendChild(el);
-</code><code id="L2877"><span class="ln">2877</span> <b>var</b> res<span class="s"> = </span><b>new</b> Element(el, svg);
-</code><code id="L2878"><span class="ln">2878</span> res.attrs<span class="s"> = </span>{cx: x, cy: y, rx: rx, ry: ry, fill: <i>"none"</i>, stroke: <i>"#<span class="d">000</span>"</i>};
-</code><code id="L2879"><span class="ln">2879</span> res.type<span class="s"> = </span><i>"ellipse"</i>;
-</code><code id="L2880"><span class="ln">2880</span> $(el, res.attrs);
-</code><code id="L2881"><span class="ln">2881</span> <b>return</b> res;
-</code><code id="L2882"><span class="ln">2882</span> },
-</code><code id="L2883"><span class="ln">2883</span> theImage<span class="s"> = </span><b>function</b> (svg, src, x, y, w, h) {
-</code><code id="L2884"><span class="ln">2884</span> <b>var</b> el<span class="s"> = </span>$(<i>"image"</i>);
-</code><code id="L2885"><span class="ln">2885</span> $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: <i>"none"</i>});
-</code><code id="L2886"><span class="ln">2886</span> el.setAttributeNS(xlink, <i>"href"</i>, src);
-</code><code id="L2887"><span class="ln">2887</span> svg.canvas<span class="s"> && </span>svg.canvas.appendChild(el);
-</code><code id="L2888"><span class="ln">2888</span> <b>var</b> res<span class="s"> = </span><b>new</b> Element(el, svg);
-</code><code id="L2889"><span class="ln">2889</span> res.attrs<span class="s"> = </span>{x: x, y: y, width: w, height: h, src: src};
-</code><code id="L2890"><span class="ln">2890</span> res.type<span class="s"> = </span><i>"image"</i>;
-</code><code id="L2891"><span class="ln">2891</span> <b>return</b> res;
-</code><code id="L2892"><span class="ln">2892</span> },
-</code><code id="L2893"><span class="ln">2893</span> theText<span class="s"> = </span><b>function</b> (svg, x, y, text) {
-</code><code id="L2894"><span class="ln">2894</span> <b>var</b> el<span class="s"> = </span>$(<i>"text"</i>);
-</code><code id="L2895"><span class="ln">2895</span> $(el, {x: x, y: y, <i>"text-anchor"</i>: <i>"middle"</i>});
-</code><code id="L2896"><span class="ln">2896</span> svg.canvas<span class="s"> && </span>svg.canvas.appendChild(el);
-</code><code id="L2897"><span class="ln">2897</span> <b>var</b> res<span class="s"> = </span><b>new</b> Element(el, svg);
-</code><code id="L2898"><span class="ln">2898</span> res.attrs<span class="s"> = </span>{x: x, y: y, <i>"text-anchor"</i>: <i>"middle"</i>, text: text, font: availableAttrs.font, stroke: <i>"none"</i>, fill: <i>"#<span class="d">000</span>"</i>};
-</code><code id="L2899"><span class="ln">2899</span> res.type<span class="s"> = </span><i>"text"</i>;
-</code><code id="L2900"><span class="ln">2900</span> setFillAndStroke(res, res.attrs);
-</code><code id="L2901"><span class="ln">2901</span> <b>return</b> res;
-</code><code id="L2902"><span class="ln">2902</span> },
-</code><code id="L2903"><span class="ln">2903</span> setSize<span class="s"> = </span><b>function</b> (width, height) {
-</code><code id="L2904"><span class="ln">2904</span> <b>this</b>.width<span class="s"> = </span>width<span class="s"> || </span><b>this</b>.width;
-</code><code id="L2905"><span class="ln">2905</span> <b>this</b>.height<span class="s"> = </span>height<span class="s"> || </span><b>this</b>.height;
-</code><code id="L2906"><span class="ln">2906</span> <b>this</b>.canvas[setAttribute](<i>"width"</i>, <b>this</b>.width);
-</code><code id="L2907"><span class="ln">2907</span> <b>this</b>.canvas[setAttribute](<i>"height"</i>, <b>this</b>.height);
-</code><code id="L2908"><span class="ln">2908</span> <b>if</b> (<b>this</b>._viewBox) {
-</code><code id="L2909"><span class="ln">2909</span> <b>this</b>.setViewBox.apply(<b>this</b>, <b>this</b>._viewBox);
-</code><code id="L2910"><span class="ln">2910</span> }
-</code><code id="L2911"><span class="ln">2911</span> <b>return</b> <b>this</b>;
-</code><code id="L2912"><span class="ln">2912</span> },
-</code><code id="L2913"><span class="ln">2913</span> create<span class="s"> = </span><b>function</b> () {
-</code><code id="L2914"><span class="ln">2914</span> <b>var</b> con<span class="s"> = </span>getContainer[apply](<span class="d">0</span>, arguments),
-</code><code id="L2915"><span class="ln">2915</span> container<span class="s"> = </span>con<span class="s"> && </span>con.container,
-</code><code id="L2916"><span class="ln">2916</span> x<span class="s"> = </span>con.x,
-</code><code id="L2917"><span class="ln">2917</span> y<span class="s"> = </span>con.y,
-</code><code id="L2918"><span class="ln">2918</span> width<span class="s"> = </span>con.width,
-</code><code id="L2919"><span class="ln">2919</span> height<span class="s"> = </span>con.height;
-</code><code id="L2920"><span class="ln">2920</span> <b>if</b> (!container) {
-</code><code id="L2921"><span class="ln">2921</span> <b>throw</b> <b>new</b> Error(<i>"SVG container not found."</i>);
-</code><code id="L2922"><span class="ln">2922</span> }
-</code><code id="L2923"><span class="ln">2923</span> <b>var</b> cnvs<span class="s"> = </span>$(<i>"svg"</i>),
-</code><code id="L2924"><span class="ln">2924</span> css<span class="s"> = </span><i>"overflow:hidden;"</i>;
-</code><code id="L2925"><span class="ln">2925</span> x<span class="s"> = </span>x<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L2926"><span class="ln">2926</span> y<span class="s"> = </span>y<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L2927"><span class="ln">2927</span> width<span class="s"> = </span>width<span class="s"> || </span><span class="d">512</span>;
-</code><code id="L2928"><span class="ln">2928</span> height<span class="s"> = </span>height<span class="s"> || </span><span class="d">342</span>;
-</code><code id="L2929"><span class="ln">2929</span> $(cnvs, {
-</code><code id="L2930"><span class="ln">2930</span> height: height,
-</code><code id="L2931"><span class="ln">2931</span> version: <span class="d">1.1</span>,
-</code><code id="L2932"><span class="ln">2932</span> width: width,
-</code><code id="L2933"><span class="ln">2933</span> xmlns: <i>"http:<span class="c">//www.w3.org/<span class="d">2000</span>/svg"</i></span>
-</code><code id="L2934"><span class="ln">2934</span> });
-</code><code id="L2935"><span class="ln">2935</span> <b>if</b> (container<span class="s"> == </span><span class="d">1</span>) {
-</code><code id="L2936"><span class="ln">2936</span> cnvs.style.cssText<span class="s"> = </span>css<span class="s"> + </span><i>"position:absolute;left:"</i><span class="s"> + </span>x<span class="s"> + </span><i>"px;top:"</i><span class="s"> + </span>y<span class="s"> + </span><i>"px"</i>;
-</code><code id="L2937"><span class="ln">2937</span> g.doc.body.appendChild(cnvs);
-</code><code id="L2938"><span class="ln">2938</span> } <b>else</b> {
-</code><code id="L2939"><span class="ln">2939</span> cnvs.style.cssText<span class="s"> = </span>css;
-</code><code id="L2940"><span class="ln">2940</span> <b>if</b> (container.firstChild) {
-</code><code id="L2941"><span class="ln">2941</span> container.insertBefore(cnvs, container.firstChild);
-</code><code id="L2942"><span class="ln">2942</span> } <b>else</b> {
-</code><code id="L2943"><span class="ln">2943</span> container.appendChild(cnvs);
-</code><code id="L2944"><span class="ln">2944</span> }
-</code><code id="L2945"><span class="ln">2945</span> }
-</code><code id="L2946"><span class="ln">2946</span> container<span class="s"> = </span><b>new</b> Paper;
-</code><code id="L2947"><span class="ln">2947</span> container.width<span class="s"> = </span>width;
-</code><code id="L2948"><span class="ln">2948</span> container.height<span class="s"> = </span>height;
-</code><code id="L2949"><span class="ln">2949</span> container.canvas<span class="s"> = </span>cnvs;
-</code><code id="L2950"><span class="ln">2950</span> plugins.call(container, container, R.fn);
-</code><code id="L2951"><span class="ln">2951</span> container.clear();
-</code><code id="L2952"><span class="ln">2952</span> <b>return</b> container;
-</code><code id="L2953"><span class="ln">2953</span> },
-</code><code id="L2954"><span class="ln">2954</span> setViewBox<span class="s"> = </span><b>function</b> (x, y, w, h, fit) {
-</code><code id="L2955"><span class="ln">2955</span> eve(<i>"setViewBox"</i>, <b>this</b>, <b>this</b>._viewBox, [x, y, w, h, fit]);
-</code><code id="L2956"><span class="ln">2956</span> <b>var</b> size<span class="s"> = </span>mmax(w<span class="s"> / </span><b>this</b>.width, h<span class="s"> / </span><b>this</b>.height),
-</code><code id="L2957"><span class="ln">2957</span> top<span class="s"> = </span><b>this</b>.top,
-</code><code id="L2958"><span class="ln">2958</span> aspectRatio<span class="s"> = </span>fit ? <i>"meet"</i> : <i>"xMinYMin"</i>,
-</code><code id="L2959"><span class="ln">2959</span> vb,
-</code><code id="L2960"><span class="ln">2960</span> sw;
-</code><code id="L2961"><span class="ln">2961</span> <b>if</b> (x<span class="s"> == </span><b>null</b>) {
-</code><code id="L2962"><span class="ln">2962</span> <b>if</b> (<b>this</b>._vbSize) {
-</code><code id="L2963"><span class="ln">2963</span> size<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2964"><span class="ln">2964</span> }
-</code><code id="L2965"><span class="ln">2965</span> <b>delete</b> <b>this</b>._vbSize;
-</code><code id="L2966"><span class="ln">2966</span> vb<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span> "</i><span class="s"> + </span><b>this</b>.width<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.height;
-</code><code id="L2967"><span class="ln">2967</span> } <b>else</b> {
-</code><code id="L2968"><span class="ln">2968</span> <b>this</b>._vbSize<span class="s"> = </span>size;
-</code><code id="L2969"><span class="ln">2969</span> vb<span class="s"> = </span>x<span class="s"> + </span>S<span class="s"> + </span>y<span class="s"> + </span>S<span class="s"> + </span>w<span class="s"> + </span>S<span class="s"> + </span>h;
-</code><code id="L2970"><span class="ln">2970</span> }
-</code><code id="L2971"><span class="ln">2971</span> $(<b>this</b>.canvas, {
-</code><code id="L2972"><span class="ln">2972</span> viewBox: vb,
-</code><code id="L2973"><span class="ln">2973</span> preserveAspectRatio: aspectRatio
-</code><code id="L2974"><span class="ln">2974</span> });
-</code><code id="L2975"><span class="ln">2975</span> <b>while</b> (size<span class="s"> && </span>top) {
-</code><code id="L2976"><span class="ln">2976</span> sw<span class="s"> = </span><i>"stroke-width"</i> <b>in</b> top.attrs ? top.attrs[<i>"stroke-width"</i>] : <span class="d">1</span>;
-</code><code id="L2977"><span class="ln">2977</span> top.attr({<i>"stroke-width"</i>: sw});
-</code><code id="L2978"><span class="ln">2978</span> top._.dirty<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2979"><span class="ln">2979</span> top._.dirtyT<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2980"><span class="ln">2980</span> top<span class="s"> = </span>top.prev;
-</code><code id="L2981"><span class="ln">2981</span> }
-</code><code id="L2982"><span class="ln">2982</span> <b>this</b>._viewBox<span class="s"> = </span>[x, y, w, h, !!fit];
-</code><code id="L2983"><span class="ln">2983</span> <b>return</b> <b>this</b>;
-</code><code id="L2984"><span class="ln">2984</span> };
-</code><code id="L2985"><span class="ln">2985</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L2986"><span class="ln">2986</span><span class="c"> <span class="s"> * </span>Paper.clear
-</span></code><code id="L2987"><span class="ln">2987</span><span class="c"> [ method ]
-</span></code><code id="L2988"><span class="ln">2988</span><span class="c"> **
-</span></code><code id="L2989"><span class="ln">2989</span><span class="c"> <span class="s"> * </span>Clears the paper, i.e. removes all the elements.
-</span></code><code id="L2990"><span class="ln">2990</span><span class="c"> \*/</span>
-</code><code id="L2991"><span class="ln">2991</span> paperproto.clear<span class="s"> = </span><b>function</b> () {
-</code><code id="L2992"><span class="ln">2992</span> eve(<i>"clear"</i>, <b>this</b>);
-</code><code id="L2993"><span class="ln">2993</span> <b>var</b> c<span class="s"> = </span><b>this</b>.canvas;
-</code><code id="L2994"><span class="ln">2994</span> <b>while</b> (c.firstChild) {
-</code><code id="L2995"><span class="ln">2995</span> c.removeChild(c.firstChild);
-</code><code id="L2996"><span class="ln">2996</span> }
-</code><code id="L2997"><span class="ln">2997</span> <b>this</b>.bottom<span class="s"> = </span><b>this</b>.top<span class="s"> = </span><b>null</b>;
-</code><code id="L2998"><span class="ln">2998</span> (<b>this</b>.desc<span class="s"> = </span>$(<i>"desc"</i>)).appendChild(g.doc.createTextNode(<i>"Created <b>with</b> Rapha\xebl "</i><span class="s"> + </span>R.version));
-</code><code id="L2999"><span class="ln">2999</span> c.appendChild(<b>this</b>.desc);
-</code><code id="L3000"><span class="ln">3000</span> c.appendChild(<b>this</b>.defs<span class="s"> = </span>$(<i>"defs"</i>));
-</code><code id="L3001"><span class="ln">3001</span> };
-</code><code id="L3002"><span class="ln">3002</span><span class="c"> <span class="c">/*\</span>
-</span></code><code id="L3003"><span class="ln">3003</span><span class="c"> <span class="s"> * </span>Paper.remove
-</span></code><code id="L3004"><span class="ln">3004</span><span class="c"> [ method ]
-</span></code><code id="L3005"><span class="ln">3005</span><span class="c"> **
-</span></code><code id="L3006"><span class="ln">3006</span><span class="c"> <span class="s"> * </span>Removes the paper from the DOM.
-</span></code><code id="L3007"><span class="ln">3007</span><span class="c"> \*/</span>
-</code><code id="L3008"><span class="ln">3008</span> paperproto.remove<span class="s"> = </span><b>function</b> () {
-</code><code id="L3009"><span class="ln">3009</span> eve(<i>"remove"</i>, <b>this</b>);
-</code><code id="L3010"><span class="ln">3010</span> <b>this</b>.canvas.parentNode<span class="s"> && </span><b>this</b>.canvas.parentNode.removeChild(<b>this</b>.canvas);
-</code><code id="L3011"><span class="ln">3011</span> <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>) {
-</code><code id="L3012"><span class="ln">3012</span> <b>this</b>[i]<span class="s"> = </span>removed(i);
-</code><code id="L3013"><span class="ln">3013</span> }
-</code><code id="L3014"><span class="ln">3014</span> };
-</code><code id="L3015"><span class="ln">3015</span> }
-</code><code id="L3016"><span class="ln">3016</span>
-</code><code id="L3017"><span class="ln">3017</span> <span class="c">// VML</span>
-</code><code id="L3018"><span class="ln">3018</span> <b>if</b> (R.vml) {
-</code><code id="L3019"><span class="ln">3019</span> <b>var</b> map<span class="s"> = </span>{M: <i>"m"</i>, L: <i>"l"</i>, C: <i>"c"</i>, Z: <i>"x"</i>, m: <i>"t"</i>, l: <i>"r"</i>, c: <i>"v"</i>, z: <i>"x"</i>},
-</code><code id="L3020"><span class="ln">3020</span> bites<span class="s"> = </span>/([clmz]),?([^clmz]*)/gi,
-</code><code id="L3021"><span class="ln">3021</span> blurregexp<span class="s"> = </span>/ progid:\S+Blur\([^\)]+\)/g,
-</code><code id="L3022"><span class="ln">3022</span> val<span class="s"> = </span>/-?[^,\s-]+/g,
-</code><code id="L3023"><span class="ln">3023</span> cssDot<span class="s"> = </span><i>"position:absolute;left:<span class="d">0</span>;top:<span class="d">0</span>;width:1px;height:1px"</i>,
-</code><code id="L3024"><span class="ln">3024</span> zoom<span class="s"> = </span><span class="d">21600</span>,
-</code><code id="L3025"><span class="ln">3025</span> pathTypes<span class="s"> = </span>{path: <span class="d">1</span>, rect: <span class="d">1</span>},
-</code><code id="L3026"><span class="ln">3026</span> ovalTypes<span class="s"> = </span>{circle: <span class="d">1</span>, ellipse: <span class="d">1</span>},
-</code><code id="L3027"><span class="ln">3027</span> path2vml<span class="s"> = </span><b>function</b> (path) {
-</code><code id="L3028"><span class="ln">3028</span> <b>var</b> total<span class="s"> = </span> /[ahqstv]/ig,
-</code><code id="L3029"><span class="ln">3029</span> command<span class="s"> = </span>pathToAbsolute;
-</code><code id="L3030"><span class="ln">3030</span> Str(path).match(total)<span class="s"> && </span>(command<span class="s"> = </span>path2curve);
-</code><code id="L3031"><span class="ln">3031</span> total<span class="s"> = </span>/[clmz]/g;
-</code><code id="L3032"><span class="ln">3032</span> <b>if</b> (command<span class="s"> == </span>pathToAbsolute<span class="s"> && </span>!Str(path).match(total)) {
-</code><code id="L3033"><span class="ln">3033</span> <b>var</b> res<span class="s"> = </span>Str(path).replace(bites, <b>function</b> (all, command, args) {
-</code><code id="L3034"><span class="ln">3034</span> <b>var</b> vals<span class="s"> = </span>[],
-</code><code id="L3035"><span class="ln">3035</span> isMove<span class="s"> = </span>lowerCase.call(command)<span class="s"> == </span><i>"m"</i>,
-</code><code id="L3036"><span class="ln">3036</span> res<span class="s"> = </span>map[command];
-</code><code id="L3037"><span class="ln">3037</span> args.replace(val, <b>function</b> (value) {
-</code><code id="L3038"><span class="ln">3038</span> <b>if</b> (isMove<span class="s"> && </span>vals.length<span class="s"> == </span><span class="d">2</span>) {
-</code><code id="L3039"><span class="ln">3039</span> res += vals<span class="s"> + </span>map[command<span class="s"> == </span><i>"m"</i> ? <i>"l"</i> : <i>"L"</i>];
-</code><code id="L3040"><span class="ln">3040</span> vals<span class="s"> = </span>[];
-</code><code id="L3041"><span class="ln">3041</span> }
-</code><code id="L3042"><span class="ln">3042</span> vals.push(round(value<span class="s"> * </span>zoom));
-</code><code id="L3043"><span class="ln">3043</span> });
-</code><code id="L3044"><span class="ln">3044</span> <b>return</b> res<span class="s"> + </span>vals;
-</code><code id="L3045"><span class="ln">3045</span> });
-</code><code id="L3046"><span class="ln">3046</span> <b>return</b> res;
-</code><code id="L3047"><span class="ln">3047</span> }
-</code><code id="L3048"><span class="ln">3048</span> <b>var</b> pa<span class="s"> = </span>command(path), p, r;
-</code><code id="L3049"><span class="ln">3049</span> res<span class="s"> = </span>[];
-</code><code id="L3050"><span class="ln">3050</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>pa.length; i < ii; i++) {
-</code><code id="L3051"><span class="ln">3051</span> p<span class="s"> = </span>pa[i];
-</code><code id="L3052"><span class="ln">3052</span> r<span class="s"> = </span>lowerCase.call(pa[i][<span class="d">0</span>]);
-</code><code id="L3053"><span class="ln">3053</span> r<span class="s"> == </span><i>"z"</i><span class="s"> && </span>(r<span class="s"> = </span><i>"x"</i>);
-</code><code id="L3054"><span class="ln">3054</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>p.length; j < jj; j++) {
-</code><code id="L3055"><span class="ln">3055</span> r += round(p[j]<span class="s"> * </span>zoom)<span class="s"> + </span>(j != jj<span class="s"> - </span><span class="d">1</span> ? <i>","</i> : E);
-</code><code id="L3056"><span class="ln">3056</span> }
-</code><code id="L3057"><span class="ln">3057</span> res.push(r);
-</code><code id="L3058"><span class="ln">3058</span> }
-</code><code id="L3059"><span class="ln">3059</span> <b>return</b> res.join(S);
-</code><code id="L3060"><span class="ln">3060</span> },
-</code><code id="L3061"><span class="ln">3061</span> compensation<span class="s"> = </span><b>function</b> (deg, dx, dy) {
-</code><code id="L3062"><span class="ln">3062</span> <b>var</b> m<span class="s"> = </span><b>new</b> Matrix;
-</code><code id="L3063"><span class="ln">3063</span> m.rotate(-deg, <span class="d">.5</span>, <span class="d">.5</span>);
-</code><code id="L3064"><span class="ln">3064</span> <b>return</b> {
-</code><code id="L3065"><span class="ln">3065</span> dx: m.x(dx, dy),
-</code><code id="L3066"><span class="ln">3066</span> dy: m.y(dx, dy)
-</code><code id="L3067"><span class="ln">3067</span> };
-</code><code id="L3068"><span class="ln">3068</span> },
-</code><code id="L3069"><span class="ln">3069</span> setCoords<span class="s"> = </span><b>function</b> (p) {
-</code><code id="L3070"><span class="ln">3070</span> <b>var</b> _<span class="s"> = </span>p._,
-</code><code id="L3071"><span class="ln">3071</span> sx<span class="s"> = </span>_.sx,
-</code><code id="L3072"><span class="ln">3072</span> sy<span class="s"> = </span>_.sy,
-</code><code id="L3073"><span class="ln">3073</span> deg<span class="s"> = </span>_.deg,
-</code><code id="L3074"><span class="ln">3074</span> dx<span class="s"> = </span>_.dx,
-</code><code id="L3075"><span class="ln">3075</span> dy<span class="s"> = </span>_.dy,
-</code><code id="L3076"><span class="ln">3076</span> fillpos<span class="s"> = </span>_.fillpos,
-</code><code id="L3077"><span class="ln">3077</span> o<span class="s"> = </span>p.node,
-</code><code id="L3078"><span class="ln">3078</span> s<span class="s"> = </span>o.style,
-</code><code id="L3079"><span class="ln">3079</span> y<span class="s"> = </span><span class="d">1</span>,
-</code><code id="L3080"><span class="ln">3080</span> m<span class="s"> = </span>p.matrix,
-</code><code id="L3081"><span class="ln">3081</span> flip<span class="s"> = </span><i>""</i>,
-</code><code id="L3082"><span class="ln">3082</span> dxdy,
-</code><code id="L3083"><span class="ln">3083</span> kx<span class="s"> = </span>zoom<span class="s"> / </span>sx,
-</code><code id="L3084"><span class="ln">3084</span> ky<span class="s"> = </span>zoom<span class="s"> / </span>sy;
-</code><code id="L3085"><span class="ln">3085</span> s.visibility<span class="s"> = </span><i>"hidden"</i>;
-</code><code id="L3086"><span class="ln">3086</span> o.coordsize<span class="s"> = </span>abs(kx)<span class="s"> + </span>S<span class="s"> + </span>abs(ky);
-</code><code id="L3087"><span class="ln">3087</span> s.rotation<span class="s"> = </span>deg<span class="s"> * </span>(sx<span class="s"> * </span>sy < <span class="d">0</span> ? -<span class="d">1</span> : <span class="d">1</span>);
-</code><code id="L3088"><span class="ln">3088</span> <b>if</b> (deg) {
-</code><code id="L3089"><span class="ln">3089</span> <b>var</b> c<span class="s"> = </span>compensation(deg, dx, dy);
-</code><code id="L3090"><span class="ln">3090</span> dx<span class="s"> = </span>c.dx;
-</code><code id="L3091"><span class="ln">3091</span> dy<span class="s"> = </span>c.dy;
-</code><code id="L3092"><span class="ln">3092</span> }
-</code><code id="L3093"><span class="ln">3093</span> sx < <span class="d">0</span><span class="s"> && </span>(flip += <i>"x"</i>);
-</code><code id="L3094"><span class="ln">3094</span> sy < <span class="d">0</span><span class="s"> && </span>(flip += <i>" y"</i>)<span class="s"> && </span>(y<span class="s"> = </span>-<span class="d">1</span>);
-</code><code id="L3095"><span class="ln">3095</span> s.flip<span class="s"> = </span>flip;
-</code><code id="L3096"><span class="ln">3096</span> o.coordorigin<span class="s"> = </span>(dx<span class="s"> * </span>-kx)<span class="s"> + </span>S<span class="s"> + </span>(dy<span class="s"> * </span>-ky);
-</code><code id="L3097"><span class="ln">3097</span> <b>if</b> (fillpos<span class="s"> || </span>_.fillsize) {
-</code><code id="L3098"><span class="ln">3098</span> <b>var</b> fill<span class="s"> = </span>o.getElementsByTagName(fillString);
-</code><code id="L3099"><span class="ln">3099</span> fill<span class="s"> = </span>fill<span class="s"> && </span>fill[<span class="d">0</span>];
-</code><code id="L3100"><span class="ln">3100</span> o.removeChild(fill);
-</code><code id="L3101"><span class="ln">3101</span> <b>if</b> (fillpos) {
-</code><code id="L3102"><span class="ln">3102</span> c<span class="s"> = </span>compensation(deg, m.x(fillpos[<span class="d">0</span>], fillpos[<span class="d">1</span>]), m.y(fillpos[<span class="d">0</span>], fillpos[<span class="d">1</span>]));
-</code><code id="L3103"><span class="ln">3103</span> fill.position<span class="s"> = </span>c.dx<span class="s"> * </span>y<span class="s"> + </span>S<span class="s"> + </span>c.dy<span class="s"> * </span>y;
-</code><code id="L3104"><span class="ln">3104</span> }
-</code><code id="L3105"><span class="ln">3105</span> <b>if</b> (_.fillsize) {
-</code><code id="L3106"><span class="ln">3106</span> fill.size<span class="s"> = </span>_.fillsize[<span class="d">0</span>]<span class="s"> * </span>abs(sx)<span class="s"> + </span>S<span class="s"> + </span>_.fillsize[<span class="d">1</span>]<span class="s"> * </span>abs(sy);
-</code><code id="L3107"><span class="ln">3107</span> }
-</code><code id="L3108"><span class="ln">3108</span> o.appendChild(fill);
-</code><code id="L3109"><span class="ln">3109</span> }
-</code><code id="L3110"><span class="ln">3110</span> s.visibility<span class="s"> = </span><i>"visible"</i>;
-</code><code id="L3111"><span class="ln">3111</span> };
-</code><code id="L3112"><span class="ln">3112</span> R.toString<span class="s"> = </span><b>function</b> () {
-</code><code id="L3113"><span class="ln">3113</span> <b>return</b> <i>"Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl "</i><span class="s"> + </span><b>this</b>.version;
-</code><code id="L3114"><span class="ln">3114</span> };
-</code><code id="L3115"><span class="ln">3115</span> addArrow<span class="s"> = </span><b>function</b> (o, value, isEnd) {
-</code><code id="L3116"><span class="ln">3116</span> <b>var</b> values<span class="s"> = </span>Str(value).toLowerCase().split(<i>"-"</i>),
-</code><code id="L3117"><span class="ln">3117</span> se<span class="s"> = </span>isEnd ? <i>"end"</i> : <i>"start"</i>,
-</code><code id="L3118"><span class="ln">3118</span> i<span class="s"> = </span>values.length,
-</code><code id="L3119"><span class="ln">3119</span> type<span class="s"> = </span><i>"classic"</i>,
-</code><code id="L3120"><span class="ln">3120</span> w<span class="s"> = </span><i>"medium"</i>,
-</code><code id="L3121"><span class="ln">3121</span> h<span class="s"> = </span><i>"medium"</i>;
-</code><code id="L3122"><span class="ln">3122</span> <b>while</b> (i--) {
-</code><code id="L3123"><span class="ln">3123</span> <b>switch</b> (values[i]) {
-</code><code id="L3124"><span class="ln">3124</span> <b>case</b> <i>"block"</i>:
-</code><code id="L3125"><span class="ln">3125</span> <b>case</b> <i>"classic"</i>:
-</code><code id="L3126"><span class="ln">3126</span> <b>case</b> <i>"oval"</i>:
-</code><code id="L3127"><span class="ln">3127</span> <b>case</b> <i>"diamond"</i>:
-</code><code id="L3128"><span class="ln">3128</span> <b>case</b> <i>"open"</i>:
-</code><code id="L3129"><span class="ln">3129</span> <b>case</b> <i>"none"</i>:
-</code><code id="L3130"><span class="ln">3130</span> type<span class="s"> = </span>values[i];
-</code><code id="L3131"><span class="ln">3131</span> <b>break</b>;
-</code><code id="L3132"><span class="ln">3132</span> <b>case</b> <i>"wide"</i>:
-</code><code id="L3133"><span class="ln">3133</span> <b>case</b> <i>"narrow"</i>: h<span class="s"> = </span>values[i]; <b>break</b>;
-</code><code id="L3134"><span class="ln">3134</span> <b>case</b> <i>"<b>long</b>"</i>:
-</code><code id="L3135"><span class="ln">3135</span> <b>case</b> <i>"<b>short</b>"</i>: w<span class="s"> = </span>values[i]; <b>break</b>;
-</code><code id="L3136"><span class="ln">3136</span> }
-</code><code id="L3137"><span class="ln">3137</span> }
-</code><code id="L3138"><span class="ln">3138</span> <b>var</b> stroke<span class="s"> = </span>o.node.getElementsByTagName(<i>"stroke"</i>)[<span class="d">0</span>];
-</code><code id="L3139"><span class="ln">3139</span> stroke[se<span class="s"> + </span><i>"arrow"</i>]<span class="s"> = </span>type;
-</code><code id="L3140"><span class="ln">3140</span> stroke[se<span class="s"> + </span><i>"arrowlength"</i>]<span class="s"> = </span>w;
-</code><code id="L3141"><span class="ln">3141</span> stroke[se<span class="s"> + </span><i>"arrowwidth"</i>]<span class="s"> = </span>h;
-</code><code id="L3142"><span class="ln">3142</span> };
-</code><code id="L3143"><span class="ln">3143</span> setFillAndStroke<span class="s"> = </span><b>function</b> (o, params) {
-</code><code id="L3144"><span class="ln">3144</span> o.paper.canvas.style.display<span class="s"> = </span><i>"none"</i>;
-</code><code id="L3145"><span class="ln">3145</span> o.attrs<span class="s"> = </span>o.attrs<span class="s"> || </span>{};
-</code><code id="L3146"><span class="ln">3146</span> <b>var</b> node<span class="s"> = </span>o.node,
-</code><code id="L3147"><span class="ln">3147</span> a<span class="s"> = </span>o.attrs,
-</code><code id="L3148"><span class="ln">3148</span> s<span class="s"> = </span>node.style,
-</code><code id="L3149"><span class="ln">3149</span> xy,
-</code><code id="L3150"><span class="ln">3150</span> newpath<span class="s"> = </span>pathTypes[o.type]<span class="s"> && </span>(params.x != a.x<span class="s"> || </span>params.y != a.y<span class="s"> || </span>params.width != a.width<span class="s"> || </span>params.height != a.height<span class="s"> || </span>params.cx != a.cx<span class="s"> || </span>params.cy != a.cy<span class="s"> || </span>params.rx != a.rx<span class="s"> || </span>params.ry != a.ry<span class="s"> || </span>params.r != a.r),
-</code><code id="L3151"><span class="ln">3151</span> isOval<span class="s"> = </span>ovalTypes[o.type]<span class="s"> && </span>(a.cx != params.cx<span class="s"> || </span>a.cy != params.cy<span class="s"> || </span>a.r != params.r<span class="s"> || </span>a.rx != params.rx<span class="s"> || </span>a.ry != params.ry),
-</code><code id="L3152"><span class="ln">3152</span> res<span class="s"> = </span>o;
-</code><code id="L3153"><span class="ln">3153</span>
+</span></code><code id="L32"><span class="ln">32</span><span class="c"> <span class="s"> | </span><span class="c">// Each of the following examples create a canvas</span>
+</span></code><code id="L33"><span class="ln">33</span><span class="c"> <span class="s"> | </span><span class="c">// that is 320px wide by 200px high.</span>
+</span></code><code id="L34"><span class="ln">34</span><span class="c"> <span class="s"> | </span><span class="c">// Canvas is created at the viewport’s <span class="d">10</span>,<span class="d">50</span> coordinate.</span>
+</span></code><code id="L35"><span class="ln">35</span><span class="c"> <span class="s"> | </span><b>var</b> paper<span class="s"> = </span>Raphael(<span class="d">10</span>, <span class="d">50</span>, <span class="d">320</span>, <span class="d">200</span>);
+</span></code><code id="L36"><span class="ln">36</span><span class="c"> <span class="s"> | </span><span class="c">// Canvas is created at the top left corner of the #notepad element</span>
+</span></code><code id="L37"><span class="ln">37</span><span class="c"> <span class="s"> | </span><span class="c">// (or its top right corner <b>in</b> dir=<i>"rtl"</i> elements)</span>
+</span></code><code id="L38"><span class="ln">38</span><span class="c"> <span class="s"> | </span><b>var</b> paper<span class="s"> = </span>Raphael(document.getElementById(<i>"notepad"</i>), <span class="d">320</span>, <span class="d">200</span>);
+</span></code><code id="L39"><span class="ln">39</span><span class="c"> <span class="s"> | </span><span class="c">// Same as above</span>
+</span></code><code id="L40"><span class="ln">40</span><span class="c"> <span class="s"> | </span><b>var</b> paper<span class="s"> = </span>Raphael(<i>"notepad"</i>, <span class="d">320</span>, <span class="d">200</span>);
+</span></code><code id="L41"><span class="ln">41</span><span class="c"> <span class="s"> | </span><span class="c">// Image dump</span>
+</span></code><code id="L42"><span class="ln">42</span><span class="c"> <span class="s"> | </span><b>var</b> set<span class="s"> = </span>Raphael([<i>"notepad"</i>, <span class="d">320</span>, <span class="d">200</span>, {
+</span></code><code id="L43"><span class="ln">43</span><span class="c"> <span class="s"> | </span> type: <i>"rect"</i>,
+</span></code><code id="L44"><span class="ln">44</span><span class="c"> <span class="s"> | </span> x: <span class="d">10</span>,
+</span></code><code id="L45"><span class="ln">45</span><span class="c"> <span class="s"> | </span> y: <span class="d">10</span>,
+</span></code><code id="L46"><span class="ln">46</span><span class="c"> <span class="s"> | </span> width: <span class="d">25</span>,
+</span></code><code id="L47"><span class="ln">47</span><span class="c"> <span class="s"> | </span> height: <span class="d">25</span>,
+</span></code><code id="L48"><span class="ln">48</span><span class="c"> <span class="s"> | </span> stroke: <i>"#f00"</i>
+</span></code><code id="L49"><span class="ln">49</span><span class="c"> <span class="s"> | </span>}, {
+</span></code><code id="L50"><span class="ln">50</span><span class="c"> <span class="s"> | </span> type: <i>"text"</i>,
+</span></code><code id="L51"><span class="ln">51</span><span class="c"> <span class="s"> | </span> x: <span class="d">30</span>,
+</span></code><code id="L52"><span class="ln">52</span><span class="c"> <span class="s"> | </span> y: <span class="d">40</span>,
+</span></code><code id="L53"><span class="ln">53</span><span class="c"> <span class="s"> | </span> text: <i>"Dump"</i>
+</span></code><code id="L54"><span class="ln">54</span><span class="c"> <span class="s"> | </span>}]);
+</span></code><code id="L55"><span class="ln">55</span><span class="c"> \*/</span>
+</code><code id="L56"><span class="ln">56</span> <b>function</b> R(first) {
+</code><code id="L57"><span class="ln">57</span> <b>if</b> (R.is(first, <i>"<b>function</b>"</i>)) {
+</code><code id="L58"><span class="ln">58</span> <b>return</b> eve.on(<i>"DOMload"</i>, first);
+</code><code id="L59"><span class="ln">59</span> } <b>else</b> <b>if</b> (R.is(first, array)) {
+</code><code id="L60"><span class="ln">60</span> <b>var</b> a<span class="s"> = </span>first,
+</code><code id="L61"><span class="ln">61</span> cnv<span class="s"> = </span>create[apply](R, a.splice(<span class="d">0</span>, <span class="d">3</span><span class="s"> + </span>R.is(a[<span class="d">0</span>], nu))),
+</code><code id="L62"><span class="ln">62</span> res<span class="s"> = </span>cnv.set(),
+</code><code id="L63"><span class="ln">63</span> i<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L64"><span class="ln">64</span> ii<span class="s"> = </span>a.length,
+</code><code id="L65"><span class="ln">65</span> j;
+</code><code id="L66"><span class="ln">66</span> <b>for</b> (; i < ii; i++) {
+</code><code id="L67"><span class="ln">67</span> j<span class="s"> = </span>a[i]<span class="s"> || </span>{};
+</code><code id="L68"><span class="ln">68</span> elements[has](j.type)<span class="s"> && </span>res.push(cnv[j.type]().attr(j));
+</code><code id="L69"><span class="ln">69</span> }
+</code><code id="L70"><span class="ln">70</span> <b>return</b> res;
+</code><code id="L71"><span class="ln">71</span> }
+</code><code id="L72"><span class="ln">72</span> <b>return</b> create[apply](R, arguments);
+</code><code id="L73"><span class="ln">73</span> }
+</code><code id="L74"><span class="ln">74</span> R.version<span class="s"> = </span><i>"<span class="d">2.0</span><span class="d">.0</span>"</i>;
+</code><code id="L75"><span class="ln">75</span> <b>var</b> separator<span class="s"> = </span>/[, ]+/,
+</code><code id="L76"><span class="ln">76</span> elements<span class="s"> = </span>{circle: <span class="d">1</span>, rect: <span class="d">1</span>, path: <span class="d">1</span>, ellipse: <span class="d">1</span>, text: <span class="d">1</span>, image: <span class="d">1</span>},
+</code><code id="L77"><span class="ln">77</span> formatrg<span class="s"> = </span>/\{(\d+)\}/g,
+</code><code id="L78"><span class="ln">78</span> proto<span class="s"> = </span><i>"prototype"</i>,
+</code><code id="L79"><span class="ln">79</span> has<span class="s"> = </span><i>"hasOwnProperty"</i>,
+</code><code id="L80"><span class="ln">80</span> g<span class="s"> = </span>{
+</code><code id="L81"><span class="ln">81</span> doc: document,
+</code><code id="L82"><span class="ln">82</span> win: window
+</code><code id="L83"><span class="ln">83</span> },
+</code><code id="L84"><span class="ln">84</span> oldRaphael<span class="s"> = </span>{
+</code><code id="L85"><span class="ln">85</span> was: Object.prototype[has].call(g.win, <i>"Raphael"</i>),
+</code><code id="L86"><span class="ln">86</span> is: g.win.Raphael
+</code><code id="L87"><span class="ln">87</span> },
+</code><code id="L88"><span class="ln">88</span> Paper<span class="s"> = </span><b>function</b> () {},
+</code><code id="L89"><span class="ln">89</span> paperproto,
+</code><code id="L90"><span class="ln">90</span> appendChild<span class="s"> = </span><i>"appendChild"</i>,
+</code><code id="L91"><span class="ln">91</span> apply<span class="s"> = </span><i>"apply"</i>,
+</code><code id="L92"><span class="ln">92</span> concat<span class="s"> = </span><i>"concat"</i>,
+</code><code id="L93"><span class="ln">93</span> supportsTouch<span class="s"> = </span><i>"createTouch"</i> <b>in</b> g.doc,
+</code><code id="L94"><span class="ln">94</span> E<span class="s"> = </span><i>""</i>,
+</code><code id="L95"><span class="ln">95</span> S<span class="s"> = </span><i>" "</i>,
+</code><code id="L96"><span class="ln">96</span> Str<span class="s"> = </span>String,
+</code><code id="L97"><span class="ln">97</span> split<span class="s"> = </span><i>"split"</i>,
+</code><code id="L98"><span class="ln">98</span> events<span class="s"> = </span><i>"click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend"</i>.split(S),
+</code><code id="L99"><span class="ln">99</span> touchMap<span class="s"> = </span>{
+</code><code id="L100"><span class="ln">100</span> mousedown: <i>"touchstart"</i>,
+</code><code id="L101"><span class="ln">101</span> mousemove: <i>"touchmove"</i>,
+</code><code id="L102"><span class="ln">102</span> mouseup: <i>"touchend"</i>
+</code><code id="L103"><span class="ln">103</span> },
+</code><code id="L104"><span class="ln">104</span> lowerCase<span class="s"> = </span>Str.prototype.toLowerCase,
+</code><code id="L105"><span class="ln">105</span> math<span class="s"> = </span>Math,
+</code><code id="L106"><span class="ln">106</span> mmax<span class="s"> = </span>math.max,
+</code><code id="L107"><span class="ln">107</span> mmin<span class="s"> = </span>math.min,
+</code><code id="L108"><span class="ln">108</span> abs<span class="s"> = </span>math.abs,
+</code><code id="L109"><span class="ln">109</span> pow<span class="s"> = </span>math.pow,
+</code><code id="L110"><span class="ln">110</span> PI<span class="s"> = </span>math.PI,
+</code><code id="L111"><span class="ln">111</span> nu<span class="s"> = </span><i>"number"</i>,
+</code><code id="L112"><span class="ln">112</span> string<span class="s"> = </span><i>"string"</i>,
+</code><code id="L113"><span class="ln">113</span> array<span class="s"> = </span><i>"array"</i>,
+</code><code id="L114"><span class="ln">114</span> toString<span class="s"> = </span><i>"toString"</i>,
+</code><code id="L115"><span class="ln">115</span> fillString<span class="s"> = </span><i>"fill"</i>,
+</code><code id="L116"><span class="ln">116</span> objectToString<span class="s"> = </span>Object.prototype.toString,
+</code><code id="L117"><span class="ln">117</span> paper<span class="s"> = </span>{},
+</code><code id="L118"><span class="ln">118</span> push<span class="s"> = </span><i>"push"</i>,
+</code><code id="L119"><span class="ln">119</span> ISURL<span class="s"> = </span>/^url\([<i>'"]?([^\)]+?)['</i>"]?\)$/i,
+</code><code id="L120"><span class="ln">120</span> colourRegExp<span class="s"> = </span>/^\s*((#[a-f\d]{<span class="d">6</span>})|(#[a-f\d]{<span class="d">3</span>})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,
+</code><code id="L121"><span class="ln">121</span> isnan<span class="s"> = </span>{<i>"NaN"</i>: <span class="d">1</span>, <i>"Infinity"</i>: <span class="d">1</span>, <i>"-Infinity"</i>: <span class="d">1</span>},
+</code><code id="L122"><span class="ln">122</span> bezierrg<span class="s"> = </span>/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,
+</code><code id="L123"><span class="ln">123</span> round<span class="s"> = </span>math.round,
+</code><code id="L124"><span class="ln">124</span> setAttribute<span class="s"> = </span><i>"setAttribute"</i>,
+</code><code id="L125"><span class="ln">125</span> toFloat<span class="s"> = </span>parseFloat,
+</code><code id="L126"><span class="ln">126</span> toInt<span class="s"> = </span>parseInt,
+</code><code id="L127"><span class="ln">127</span> ms<span class="s"> = </span><i>" progid:DXImageTransform.Microsoft"</i>,
+</code><code id="L128"><span class="ln">128</span> upperCase<span class="s"> = </span>Str.prototype.toUpperCase,
+</code><code id="L129"><span class="ln">129</span> availableAttrs<span class="s"> = </span>{<i>"arrow-end"</i>: <i>"none"</i>, <i>"arrow-start"</i>: <i>"none"</i>, blur: <span class="d">0</span>, <i>"clip-rect"</i>: <i>"<span class="d">0</span> <span class="d">0</span> <span class="d">1e9</span> <span class="d">1e9</span>"</i>, cursor: <i>"<b>default</b>"</i>, cx: <span class="d">0</span>, cy: <span class="d">0</span>, fill: <i>"#fff"</i>, <i>"fill-opacity"</i>: <span class="d">1</span>, font: <i>'10px "Arial"'</i>, <i>"font-family"</i>: <i>'"Arial"'</i>, <i>"font-size"</i>: <i>"<span class="d">10</span>"</i>, <i>"font-style"</i>: <i>"normal"</i>, <i>"font-weight"</i>: <span class="d">400</span>, gradient: <span class="d">0</span>, height: <span class="d">0</span>, href: <i>"http:<span class="c">//raphaeljs.com/"</i>, opacity: <span class="d">1</span>, path: <i>"M0,<span class="d">0</span>"</i>, r: <span class="d">0</span>, rx: <span class="d">0</span>, ry: <span class="d">0</span>, src: <i>""</i>, stroke: <i>"#<span class="d">000</span>"</i>, <i>"stroke-dasharray"</i>: <i>""</i>, <i>"stroke-linecap"</i>: <i>"butt"</i>, <i>"stroke-linejoin"</i>: <i>"butt"</i>, <i>"stroke-miterlimit"</i>: <span class="d">0</span>, <i>"stroke-opacity"</i>: <span class="d">1</span>, <i>"stroke-width"</i>: <span class="d">1</span>, target: <i>"_blank"</i>, <i>"text-anchor"</i>: <i>"middle"</i>, title: <i>"Raphael"</i>, transform: <i>""</i>, width: <span class="d">0</span>, x: <span class="d">0</span>, y: <span class="d">0</span>},</span>
+</code><code id="L130"><span class="ln">130</span> availableAnimAttrs<span class="s"> = </span>{blur: nu, <i>"clip-rect"</i>: <i>"csv"</i>, cx: nu, cy: nu, fill: <i>"colour"</i>, <i>"fill-opacity"</i>: nu, <i>"font-size"</i>: nu, height: nu, opacity: nu, path: <i>"path"</i>, r: nu, rx: nu, ry: nu, stroke: <i>"colour"</i>, <i>"stroke-opacity"</i>: nu, <i>"stroke-width"</i>: nu, transform: <i>"transform"</i>, width: nu, x: nu, y: nu},
+</code><code id="L131"><span class="ln">131</span> commaSpaces<span class="s"> = </span>/\s*,\s*/,
+</code><code id="L132"><span class="ln">132</span> hsrg<span class="s"> = </span>{hs: <span class="d">1</span>, rg: <span class="d">1</span>},
+</code><code id="L133"><span class="ln">133</span> p2s<span class="s"> = </span>/,?([achlmqrstvxz]),?/gi,
+</code><code id="L134"><span class="ln">134</span> pathCommand<span class="s"> = </span>/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,
+</code><code id="L135"><span class="ln">135</span> tCommand<span class="s"> = </span>/([rstm])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,
+</code><code id="L136"><span class="ln">136</span> pathValues<span class="s"> = </span>/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,
+</code><code id="L137"><span class="ln">137</span> radial_gradient<span class="s"> = </span>/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,
+</code><code id="L138"><span class="ln">138</span> sortByKey<span class="s"> = </span><b>function</b> (a, b) {
+</code><code id="L139"><span class="ln">139</span> <b>return</b> a.key<span class="s"> - </span>b.key;
+</code><code id="L140"><span class="ln">140</span> },
+</code><code id="L141"><span class="ln">141</span> sortByNumber<span class="s"> = </span><b>function</b> (a, b) {
+</code><code id="L142"><span class="ln">142</span> <b>return</b> a<span class="s"> - </span>b;
+</code><code id="L143"><span class="ln">143</span> },
+</code><code id="L144"><span class="ln">144</span> fun<span class="s"> = </span><b>function</b> () {},
+</code><code id="L145"><span class="ln">145</span> pipe<span class="s"> = </span><b>function</b> (x) {
+</code><code id="L146"><span class="ln">146</span> <b>return</b> x;
+</code><code id="L147"><span class="ln">147</span> },
+</code><code id="L148"><span class="ln">148</span> rectPath<span class="s"> = </span><b>function</b> (x, y, w, h, r) {
+</code><code id="L149"><span class="ln">149</span> <b>if</b> (r) {
+</code><code id="L150"><span class="ln">150</span> <b>return</b> [[<i>"M"</i>, x<span class="s"> + </span>r, y], [<i>"l"</i>, w<span class="s"> - </span>r<span class="s"> * </span><span class="d">2</span>, <span class="d">0</span>], [<i>"a"</i>, r, r, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, r, r], [<i>"l"</i>, <span class="d">0</span>, h<span class="s"> - </span>r<span class="s"> * </span><span class="d">2</span>], [<i>"a"</i>, r, r, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, -r, r], [<i>"l"</i>, r<span class="s"> * </span><span class="d">2</span><span class="s"> - </span>w, <span class="d">0</span>], [<i>"a"</i>, r, r, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, -r, -r], [<i>"l"</i>, <span class="d">0</span>, r<span class="s"> * </span><span class="d">2</span><span class="s"> - </span>h], [<i>"a"</i>, r, r, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, r, -r], [<i>"z"</i>]];
+</code><code id="L151"><span class="ln">151</span> }
+</code><code id="L152"><span class="ln">152</span> <b>return</b> [[<i>"M"</i>, x, y], [<i>"l"</i>, w, <span class="d">0</span>], [<i>"l"</i>, <span class="d">0</span>, h], [<i>"l"</i>, -w, <span class="d">0</span>], [<i>"z"</i>]];
+</code><code id="L153"><span class="ln">153</span> },
+</code><code id="L154"><span class="ln">154</span> ellipsePath<span class="s"> = </span><b>function</b> (x, y, rx, ry) {
+</code><code id="L155"><span class="ln">155</span> <b>if</b> (ry<span class="s"> == </span><b>null</b>) {
+</code><code id="L156"><span class="ln">156</span> ry<span class="s"> = </span>rx;
+</code><code id="L157"><span class="ln">157</span> }
+</code><code id="L158"><span class="ln">158</span> <b>return</b> [[<i>"M"</i>, x, y], [<i>"m"</i>, <span class="d">0</span>, -ry], [<i>"a"</i>, rx, ry, <span class="d">0</span>, <span class="d">1</span>, <span class="d">1</span>, <span class="d">0</span>, <span class="d">2</span><span class="s"> * </span>ry], [<i>"a"</i>, rx, ry, <span class="d">0</span>, <span class="d">1</span>, <span class="d">1</span>, <span class="d">0</span>, -<span class="d">2</span><span class="s"> * </span>ry], [<i>"z"</i>]];
+</code><code id="L159"><span class="ln">159</span> },
+</code><code id="L160"><span class="ln">160</span> getPath<span class="s"> = </span>{
+</code><code id="L161"><span class="ln">161</span> path: <b>function</b> (el) {
+</code><code id="L162"><span class="ln">162</span> <b>return</b> el.attr(<i>"path"</i>);
+</code><code id="L163"><span class="ln">163</span> },
+</code><code id="L164"><span class="ln">164</span> circle: <b>function</b> (el) {
+</code><code id="L165"><span class="ln">165</span> <b>var</b> a<span class="s"> = </span>el.attrs;
+</code><code id="L166"><span class="ln">166</span> <b>return</b> ellipsePath(a.cx, a.cy, a.r);
+</code><code id="L167"><span class="ln">167</span> },
+</code><code id="L168"><span class="ln">168</span> ellipse: <b>function</b> (el) {
+</code><code id="L169"><span class="ln">169</span> <b>var</b> a<span class="s"> = </span>el.attrs;
+</code><code id="L170"><span class="ln">170</span> <b>return</b> ellipsePath(a.cx, a.cy, a.rx, a.ry);
+</code><code id="L171"><span class="ln">171</span> },
+</code><code id="L172"><span class="ln">172</span> rect: <b>function</b> (el) {
+</code><code id="L173"><span class="ln">173</span> <b>var</b> a<span class="s"> = </span>el.attrs;
+</code><code id="L174"><span class="ln">174</span> <b>return</b> rectPath(a.x, a.y, a.width, a.height, a.r);
+</code><code id="L175"><span class="ln">175</span> },
+</code><code id="L176"><span class="ln">176</span> image: <b>function</b> (el) {
+</code><code id="L177"><span class="ln">177</span> <b>var</b> a<span class="s"> = </span>el.attrs;
+</code><code id="L178"><span class="ln">178</span> <b>return</b> rectPath(a.x, a.y, a.width, a.height);
+</code><code id="L179"><span class="ln">179</span> },
+</code><code id="L180"><span class="ln">180</span> text: <b>function</b> (el) {
+</code><code id="L181"><span class="ln">181</span> <b>var</b> bbox<span class="s"> = </span>el._getBBox();
+</code><code id="L182"><span class="ln">182</span> <b>return</b> rectPath(bbox.x, bbox.y, bbox.width, bbox.height);
+</code><code id="L183"><span class="ln">183</span> }
+</code><code id="L184"><span class="ln">184</span> },
+</code><code id="L185"><span class="ln">185</span> mapPath<span class="s"> = </span><b>function</b> (path, matrix) {
+</code><code id="L186"><span class="ln">186</span> <b>if</b> (!matrix) {
+</code><code id="L187"><span class="ln">187</span> <b>return</b> path;
+</code><code id="L188"><span class="ln">188</span> }
+</code><code id="L189"><span class="ln">189</span> <b>var</b> x, y, i, j, pathi;
+</code><code id="L190"><span class="ln">190</span> path<span class="s"> = </span>path2curve(path);
+</code><code id="L191"><span class="ln">191</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>path.length; i < ii; i++) {
+</code><code id="L192"><span class="ln">192</span> pathi<span class="s"> = </span>path[i];
+</code><code id="L193"><span class="ln">193</span> <b>for</b> (j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>pathi.length; j < jj; j += <span class="d">2</span>) {
+</code><code id="L194"><span class="ln">194</span> x<span class="s"> = </span>matrix.x(pathi[j], pathi[j<span class="s"> + </span><span class="d">1</span>]);
+</code><code id="L195"><span class="ln">195</span> y<span class="s"> = </span>matrix.y(pathi[j], pathi[j<span class="s"> + </span><span class="d">1</span>]);
+</code><code id="L196"><span class="ln">196</span> pathi[j]<span class="s"> = </span>x;
+</code><code id="L197"><span class="ln">197</span> pathi[j<span class="s"> + </span><span class="d">1</span>]<span class="s"> = </span>y;
+</code><code id="L198"><span class="ln">198</span> }
+</code><code id="L199"><span class="ln">199</span> }
+</code><code id="L200"><span class="ln">200</span> <b>return</b> path;
+</code><code id="L201"><span class="ln">201</span> };
+</code><code id="L202"><span class="ln">202</span>
+</code><code id="L203"><span class="ln">203</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L204"><span class="ln">204</span><span class="c"> <span class="s"> * </span>Raphael.type
+</span></code><code id="L205"><span class="ln">205</span><span class="c"> [ property (string) ]
+</span></code><code id="L206"><span class="ln">206</span><span class="c"> **
+</span></code><code id="L207"><span class="ln">207</span><span class="c"> <span class="s"> * </span>Can be “SVG”, “VML” or empty, depending on browser support.
+</span></code><code id="L208"><span class="ln">208</span><span class="c"> \*/</span>
+</code><code id="L209"><span class="ln">209</span> R.type<span class="s"> = </span>(g.win.SVGAngle<span class="s"> || </span>g.doc.implementation.hasFeature(<i>"http:<span class="c">//www.w3.org/TR/SVG11/feature#BasicStructure"</i>, <i>"<span class="d">1.1</span>"</i>) ? <i>"SVG"</i> : <i>"VML"</i>);</span>
+</code><code id="L210"><span class="ln">210</span> <b>if</b> (R.type<span class="s"> == </span><i>"VML"</i>) {
+</code><code id="L211"><span class="ln">211</span> <b>var</b> d<span class="s"> = </span>g.doc.createElement(<i>"div"</i>),
+</code><code id="L212"><span class="ln">212</span> b;
+</code><code id="L213"><span class="ln">213</span> d.innerHTML<span class="s"> = </span><i>'<v:shape adj="<span class="d">1</span>"/>'</i>;
+</code><code id="L214"><span class="ln">214</span> b<span class="s"> = </span>d.firstChild;
+</code><code id="L215"><span class="ln">215</span> b.style.behavior<span class="s"> = </span><i>"url(#<b>default</b>#VML)"</i>;
+</code><code id="L216"><span class="ln">216</span> <b>if</b> (!(b<span class="s"> && </span><b>typeof</b> b.adj<span class="s"> == </span><i>"object"</i>)) {
+</code><code id="L217"><span class="ln">217</span> <b>return</b> R.type<span class="s"> = </span>E;
+</code><code id="L218"><span class="ln">218</span> }
+</code><code id="L219"><span class="ln">219</span> d<span class="s"> = </span><b>null</b>;
+</code><code id="L220"><span class="ln">220</span> }
+</code><code id="L221"><span class="ln">221</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L222"><span class="ln">222</span><span class="c"> <span class="s"> * </span>Raphael.svg
+</span></code><code id="L223"><span class="ln">223</span><span class="c"> [ property (<b>boolean</b>) ]
+</span></code><code id="L224"><span class="ln">224</span><span class="c"> **
+</span></code><code id="L225"><span class="ln">225</span><span class="c"> <span class="s"> * </span>`<b>true</b>` <b>if</b> browser supports SVG.
+</span></code><code id="L226"><span class="ln">226</span><span class="c"> \*/</span>
+</code><code id="L227"><span class="ln">227</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L228"><span class="ln">228</span><span class="c"> <span class="s"> * </span>Raphael.vml
+</span></code><code id="L229"><span class="ln">229</span><span class="c"> [ property (<b>boolean</b>) ]
+</span></code><code id="L230"><span class="ln">230</span><span class="c"> **
+</span></code><code id="L231"><span class="ln">231</span><span class="c"> <span class="s"> * </span>`<b>true</b>` <b>if</b> browser supports VML.
+</span></code><code id="L232"><span class="ln">232</span><span class="c"> \*/</span>
+</code><code id="L233"><span class="ln">233</span> R.svg<span class="s"> = </span>!(R.vml<span class="s"> = </span>R.type<span class="s"> == </span><i>"VML"</i>);
+</code><code id="L234"><span class="ln">234</span> paperproto<span class="s"> = </span>Paper.prototype<span class="s"> = </span>R.prototype;
+</code><code id="L235"><span class="ln">235</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L236"><span class="ln">236</span><span class="c"> <span class="s"> * </span>Paper.customAttributes
+</span></code><code id="L237"><span class="ln">237</span><span class="c"> [ property (object) ]
+</span></code><code id="L238"><span class="ln">238</span><span class="c"> **
+</span></code><code id="L239"><span class="ln">239</span><span class="c"> <span class="s"> * </span>If you have a set of attributes that you would like to represent
+</span></code><code id="L240"><span class="ln">240</span><span class="c"> <span class="s"> * </span>as a <b>function</b> of some number you can <b>do</b> it easily <b>with</b> custom attributes:
+</span></code><code id="L241"><span class="ln">241</span><span class="c"> > Usage
+</span></code><code id="L242"><span class="ln">242</span><span class="c"> <span class="s"> | </span>paper.customAttributes.hue<span class="s"> = </span><b>function</b> (num) {
+</span></code><code id="L243"><span class="ln">243</span><span class="c"> <span class="s"> | </span> num<span class="s"> = </span>num<span class="s"> % </span><span class="d">1</span>;
+</span></code><code id="L244"><span class="ln">244</span><span class="c"> <span class="s"> | </span> <b>return</b> {fill: <i>"hsb("</i><span class="s"> + </span>num<span class="s"> + </span><i>", <span class="d">.75</span>, <span class="d">1</span>)"</i>};
+</span></code><code id="L245"><span class="ln">245</span><span class="c"> <span class="s"> | </span>};
+</span></code><code id="L246"><span class="ln">246</span><span class="c"> <span class="s"> | </span><span class="c">// Custom attribute “hue” will change fill</span>
+</span></code><code id="L247"><span class="ln">247</span><span class="c"> <span class="s"> | </span><span class="c">// to be given hue <b>with</b> fixed saturation and brightness.</span>
+</span></code><code id="L248"><span class="ln">248</span><span class="c"> <span class="s"> | </span><span class="c">// Now you can use it like <b>this</b>:</span>
+</span></code><code id="L249"><span class="ln">249</span><span class="c"> <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.circle(<span class="d">10</span>, <span class="d">10</span>, <span class="d">10</span>).attr({hue: <span class="d">.45</span>});
+</span></code><code id="L250"><span class="ln">250</span><span class="c"> <span class="s"> | </span><span class="c">// or even like <b>this</b>:</span>
+</span></code><code id="L251"><span class="ln">251</span><span class="c"> <span class="s"> | </span>c.animate({hue: <span class="d">1</span>}, <span class="d">1e3</span>);
+</span></code><code id="L252"><span class="ln">252</span><span class="c"> <span class="s"> | </span>
+</span></code><code id="L253"><span class="ln">253</span><span class="c"> <span class="s"> | </span><span class="c">// You could also create custom attribute</span>
+</span></code><code id="L254"><span class="ln">254</span><span class="c"> <span class="s"> | </span><span class="c">// <b>with</b> multiple parameters:</span>
+</span></code><code id="L255"><span class="ln">255</span><span class="c"> <span class="s"> | </span>paper.customAttributes.hsb<span class="s"> = </span><b>function</b> (h, s, b) {
+</span></code><code id="L256"><span class="ln">256</span><span class="c"> <span class="s"> | </span> <b>return</b> {fill: <i>"hsb("</i><span class="s"> + </span>[h, s, b].join(<i>","</i>)<span class="s"> + </span><i>")"</i>};
+</span></code><code id="L257"><span class="ln">257</span><span class="c"> <span class="s"> | </span>};
+</span></code><code id="L258"><span class="ln">258</span><span class="c"> <span class="s"> | </span>c.attr({hsb: <i>"<span class="d">.5</span> <span class="d">.8</span> <span class="d">1</span>"</i>});
+</span></code><code id="L259"><span class="ln">259</span><span class="c"> <span class="s"> | </span>c.animate({hsb: <i>"<span class="d">1</span> <span class="d">0</span> <span class="d">.5</span>"</i>}, <span class="d">1e3</span>);
+</span></code><code id="L260"><span class="ln">260</span><span class="c"> \*/</span>
+</code><code id="L261"><span class="ln">261</span> paperproto.customAttributes<span class="s"> = </span>{};
+</code><code id="L262"><span class="ln">262</span> R._id<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L263"><span class="ln">263</span> R._oid<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L264"><span class="ln">264</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L265"><span class="ln">265</span><span class="c"> <span class="s"> * </span>Raphael.fn
+</span></code><code id="L266"><span class="ln">266</span><span class="c"> [ property (object) ]
+</span></code><code id="L267"><span class="ln">267</span><span class="c"> **
+</span></code><code id="L268"><span class="ln">268</span><span class="c"> <span class="s"> * </span>You can add your own method to the canvas. For example <b>if</b> you want to draw a pie chart,
+</span></code><code id="L269"><span class="ln">269</span><span class="c"> <span class="s"> * </span>you can create your own pie chart <b>function</b> and ship it as a Raphaël plugin. To <b>do</b> <b>this</b>
+</span></code><code id="L270"><span class="ln">270</span><span class="c"> <span class="s"> * </span>you need to extend the `Raphael.fn` object. Please note that you can create your own namespaces
+</span></code><code id="L271"><span class="ln">271</span><span class="c"> <span class="s"> * </span>inside the `fn` object — methods will be run <b>in</b> the context of canvas anyway. You should alter
+</span></code><code id="L272"><span class="ln">272</span><span class="c"> <span class="s"> * </span>the `fn` object before a Raphaël instance is created, otherwise it will take no effect.
+</span></code><code id="L273"><span class="ln">273</span><span class="c"> > Usage
+</span></code><code id="L274"><span class="ln">274</span><span class="c"> <span class="s"> | </span>Raphael.fn.arrow<span class="s"> = </span><b>function</b> (x1, y1, x2, y2, size) {
+</span></code><code id="L275"><span class="ln">275</span><span class="c"> <span class="s"> | </span> <b>return</b> <b>this</b>.path( ... );
+</span></code><code id="L276"><span class="ln">276</span><span class="c"> <span class="s"> | </span>};
+</span></code><code id="L277"><span class="ln">277</span><span class="c"> <span class="s"> | </span><span class="c">// or create namespace</span>
+</span></code><code id="L278"><span class="ln">278</span><span class="c"> <span class="s"> | </span>Raphael.fn.mystuff<span class="s"> = </span>{
+</span></code><code id="L279"><span class="ln">279</span><span class="c"> <span class="s"> | </span> arrow: <b>function</b> () {…},
+</span></code><code id="L280"><span class="ln">280</span><span class="c"> <span class="s"> | </span> star: <b>function</b> () {…},
+</span></code><code id="L281"><span class="ln">281</span><span class="c"> <span class="s"> | </span> <span class="c">// etc…</span>
+</span></code><code id="L282"><span class="ln">282</span><span class="c"> <span class="s"> | </span>};
+</span></code><code id="L283"><span class="ln">283</span><span class="c"> <span class="s"> | </span><b>var</b> paper<span class="s"> = </span>Raphael(<span class="d">10</span>, <span class="d">10</span>, <span class="d">630</span>, <span class="d">480</span>);
+</span></code><code id="L284"><span class="ln">284</span><span class="c"> <span class="s"> | </span><span class="c">// then use it</span>
+</span></code><code id="L285"><span class="ln">285</span><span class="c"> <span class="s"> | </span>paper.arrow(<span class="d">10</span>, <span class="d">10</span>, <span class="d">30</span>, <span class="d">30</span>, <span class="d">5</span>).attr({fill: <i>"#f00"</i>});
+</span></code><code id="L286"><span class="ln">286</span><span class="c"> <span class="s"> | </span>paper.mystuff.arrow();
+</span></code><code id="L287"><span class="ln">287</span><span class="c"> <span class="s"> | </span>paper.mystuff.star();
+</span></code><code id="L288"><span class="ln">288</span><span class="c"> \*/</span>
+</code><code id="L289"><span class="ln">289</span> R.fn<span class="s"> = </span>{};
+</code><code id="L290"><span class="ln">290</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L291"><span class="ln">291</span><span class="c"> <span class="s"> * </span>Raphael.is
+</span></code><code id="L292"><span class="ln">292</span><span class="c"> [ method ]
+</span></code><code id="L293"><span class="ln">293</span><span class="c"> **
+</span></code><code id="L294"><span class="ln">294</span><span class="c"> <span class="s"> * </span>Handfull replacement <b>for</b> `<b>typeof</b>` operator.
+</span></code><code id="L295"><span class="ln">295</span><span class="c"> > Parameters
+</span></code><code id="L296"><span class="ln">296</span><span class="c"> <span class="s"> - </span>o (…) any object or primitive
+</span></code><code id="L297"><span class="ln">297</span><span class="c"> <span class="s"> - </span>type (string) name of the type, i.e. “string”, “<b>function</b>”, “number”, etc.
+</span></code><code id="L298"><span class="ln">298</span><span class="c"> <span class="s"> = </span>(<b>boolean</b>) is given value is of given type
+</span></code><code id="L299"><span class="ln">299</span><span class="c"> \*/</span>
+</code><code id="L300"><span class="ln">300</span> R.is<span class="s"> = </span><b>function</b> (o, type) {
+</code><code id="L301"><span class="ln">301</span> type<span class="s"> = </span>lowerCase.call(type);
+</code><code id="L302"><span class="ln">302</span> <b>if</b> (type<span class="s"> == </span><i>"finite"</i>) {
+</code><code id="L303"><span class="ln">303</span> <b>return</b> !isnan[has](+o);
+</code><code id="L304"><span class="ln">304</span> }
+</code><code id="L305"><span class="ln">305</span> <b>return</b> (type<span class="s"> == </span><i>"<b>null</b>"</i><span class="s"> && </span>o<span class="s"> === </span><b>null</b>) ||
+</code><code id="L306"><span class="ln">306</span> (type<span class="s"> == </span><b>typeof</b> o) ||
+</code><code id="L307"><span class="ln">307</span> (type<span class="s"> == </span><i>"object"</i><span class="s"> && </span>o<span class="s"> === </span>Object(o)) ||
+</code><code id="L308"><span class="ln">308</span> (type<span class="s"> == </span><i>"array"</i><span class="s"> && </span>Array.isArray<span class="s"> && </span>Array.isArray(o)) ||
+</code><code id="L309"><span class="ln">309</span> objectToString.call(o).slice(<span class="d">8</span>, -<span class="d">1</span>).toLowerCase()<span class="s"> == </span>type;
+</code><code id="L310"><span class="ln">310</span> };
+</code><code id="L311"><span class="ln">311</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L312"><span class="ln">312</span><span class="c"> <span class="s"> * </span>Raphael.angle
+</span></code><code id="L313"><span class="ln">313</span><span class="c"> [ method ]
+</span></code><code id="L314"><span class="ln">314</span><span class="c"> **
+</span></code><code id="L315"><span class="ln">315</span><span class="c"> <span class="s"> * </span>Returns angle between two or three points
+</span></code><code id="L316"><span class="ln">316</span><span class="c"> > Parameters
+</span></code><code id="L317"><span class="ln">317</span><span class="c"> <span class="s"> - </span>x1 (number) x coord of first point
+</span></code><code id="L318"><span class="ln">318</span><span class="c"> <span class="s"> - </span>y1 (number) y coord of first point
+</span></code><code id="L319"><span class="ln">319</span><span class="c"> <span class="s"> - </span>x2 (number) x coord of second point
+</span></code><code id="L320"><span class="ln">320</span><span class="c"> <span class="s"> - </span>y2 (number) y coord of second point
+</span></code><code id="L321"><span class="ln">321</span><span class="c"> <span class="s"> - </span>x3 (number) #optional x coord of third point
+</span></code><code id="L322"><span class="ln">322</span><span class="c"> <span class="s"> - </span>y3 (number) #optional y coord of third point
+</span></code><code id="L323"><span class="ln">323</span><span class="c"> <span class="s"> = </span>(number) angle <b>in</b> degrees.
+</span></code><code id="L324"><span class="ln">324</span><span class="c"> \*/</span>
+</code><code id="L325"><span class="ln">325</span> R.angle<span class="s"> = </span><b>function</b> (x1, y1, x2, y2, x3, y3) {
+</code><code id="L326"><span class="ln">326</span> <b>if</b> (x3<span class="s"> == </span><b>null</b>) {
+</code><code id="L327"><span class="ln">327</span> <b>var</b> x<span class="s"> = </span>x1<span class="s"> - </span>x2,
+</code><code id="L328"><span class="ln">328</span> y<span class="s"> = </span>y1<span class="s"> - </span>y2;
+</code><code id="L329"><span class="ln">329</span> <b>if</b> (!x<span class="s"> && </span>!y) {
+</code><code id="L330"><span class="ln">330</span> <b>return</b> <span class="d">0</span>;
+</code><code id="L331"><span class="ln">331</span> }
+</code><code id="L332"><span class="ln">332</span> <b>return</b> (<span class="d">180</span><span class="s"> + </span>math.atan2(-y, -x)<span class="s"> * </span><span class="d">180</span><span class="s"> / </span>PI<span class="s"> + </span><span class="d">360</span>)<span class="s"> % </span><span class="d">360</span>;
+</code><code id="L333"><span class="ln">333</span> } <b>else</b> {
+</code><code id="L334"><span class="ln">334</span> <b>return</b> R.angle(x1, y1, x3, y3)<span class="s"> - </span>R.angle(x2, y2, x3, y3);
+</code><code id="L335"><span class="ln">335</span> }
+</code><code id="L336"><span class="ln">336</span> };
+</code><code id="L337"><span class="ln">337</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L338"><span class="ln">338</span><span class="c"> <span class="s"> * </span>Raphael.rad
+</span></code><code id="L339"><span class="ln">339</span><span class="c"> [ method ]
+</span></code><code id="L340"><span class="ln">340</span><span class="c"> **
+</span></code><code id="L341"><span class="ln">341</span><span class="c"> <span class="s"> * </span>Transform angle to radians
+</span></code><code id="L342"><span class="ln">342</span><span class="c"> > Parameters
+</span></code><code id="L343"><span class="ln">343</span><span class="c"> <span class="s"> - </span>deg (number) angle <b>in</b> degrees
+</span></code><code id="L344"><span class="ln">344</span><span class="c"> <span class="s"> = </span>(number) angle <b>in</b> radians.
+</span></code><code id="L345"><span class="ln">345</span><span class="c"> \*/</span>
+</code><code id="L346"><span class="ln">346</span> R.rad<span class="s"> = </span><b>function</b> (deg) {
+</code><code id="L347"><span class="ln">347</span> <b>return</b> deg<span class="s"> % </span><span class="d">360</span><span class="s"> * </span>PI<span class="s"> / </span><span class="d">180</span>;
+</code><code id="L348"><span class="ln">348</span> };
+</code><code id="L349"><span class="ln">349</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L350"><span class="ln">350</span><span class="c"> <span class="s"> * </span>Raphael.deg
+</span></code><code id="L351"><span class="ln">351</span><span class="c"> [ method ]
+</span></code><code id="L352"><span class="ln">352</span><span class="c"> **
+</span></code><code id="L353"><span class="ln">353</span><span class="c"> <span class="s"> * </span>Transform angle to degrees
+</span></code><code id="L354"><span class="ln">354</span><span class="c"> > Parameters
+</span></code><code id="L355"><span class="ln">355</span><span class="c"> <span class="s"> - </span>deg (number) angle <b>in</b> radians
+</span></code><code id="L356"><span class="ln">356</span><span class="c"> <span class="s"> = </span>(number) angle <b>in</b> degrees.
+</span></code><code id="L357"><span class="ln">357</span><span class="c"> \*/</span>
+</code><code id="L358"><span class="ln">358</span> R.deg<span class="s"> = </span><b>function</b> (rad) {
+</code><code id="L359"><span class="ln">359</span> <b>return</b> rad<span class="s"> * </span><span class="d">180</span><span class="s"> / </span>PI<span class="s"> % </span><span class="d">360</span>;
+</code><code id="L360"><span class="ln">360</span> };
+</code><code id="L361"><span class="ln">361</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L362"><span class="ln">362</span><span class="c"> <span class="s"> * </span>Raphael.snapTo
+</span></code><code id="L363"><span class="ln">363</span><span class="c"> [ method ]
+</span></code><code id="L364"><span class="ln">364</span><span class="c"> **
+</span></code><code id="L365"><span class="ln">365</span><span class="c"> <span class="s"> * </span>Snaps given value to given grid.
+</span></code><code id="L366"><span class="ln">366</span><span class="c"> > Parameters
+</span></code><code id="L367"><span class="ln">367</span><span class="c"> <span class="s"> - </span>values (array|number) given array of values or step of the grid
+</span></code><code id="L368"><span class="ln">368</span><span class="c"> <span class="s"> - </span>value (number) value to adjust
+</span></code><code id="L369"><span class="ln">369</span><span class="c"> <span class="s"> - </span>tolerance (number) #optional tolerance <b>for</b> snapping. Default is `<span class="d">10</span>`.
+</span></code><code id="L370"><span class="ln">370</span><span class="c"> <span class="s"> = </span>(number) adjusted value.
+</span></code><code id="L371"><span class="ln">371</span><span class="c"> \*/</span>
+</code><code id="L372"><span class="ln">372</span> R.snapTo<span class="s"> = </span><b>function</b> (values, value, tolerance) {
+</code><code id="L373"><span class="ln">373</span> tolerance<span class="s"> = </span>R.is(tolerance, <i>"finite"</i>) ? tolerance : <span class="d">10</span>;
+</code><code id="L374"><span class="ln">374</span> <b>if</b> (R.is(values, array)) {
+</code><code id="L375"><span class="ln">375</span> <b>var</b> i<span class="s"> = </span>values.length;
+</code><code id="L376"><span class="ln">376</span> <b>while</b> (i--) <b>if</b> (abs(values[i]<span class="s"> - </span>value) <= tolerance) {
+</code><code id="L377"><span class="ln">377</span> <b>return</b> values[i];
+</code><code id="L378"><span class="ln">378</span> }
+</code><code id="L379"><span class="ln">379</span> } <b>else</b> {
+</code><code id="L380"><span class="ln">380</span> values<span class="s"> = </span>+values;
+</code><code id="L381"><span class="ln">381</span> <b>var</b> rem<span class="s"> = </span>value<span class="s"> % </span>values;
+</code><code id="L382"><span class="ln">382</span> <b>if</b> (rem < tolerance) {
+</code><code id="L383"><span class="ln">383</span> <b>return</b> value<span class="s"> - </span>rem;
+</code><code id="L384"><span class="ln">384</span> }
+</code><code id="L385"><span class="ln">385</span> <b>if</b> (rem > values<span class="s"> - </span>tolerance) {
+</code><code id="L386"><span class="ln">386</span> <b>return</b> value<span class="s"> - </span>rem<span class="s"> + </span>values;
+</code><code id="L387"><span class="ln">387</span> }
+</code><code id="L388"><span class="ln">388</span> }
+</code><code id="L389"><span class="ln">389</span> <b>return</b> value;
+</code><code id="L390"><span class="ln">390</span> };
+</code><code id="L391"><span class="ln">391</span>
+</code><code id="L392"><span class="ln">392</span> <b>var</b> createUUID<span class="s"> = </span>(<b>function</b> (uuidRegEx, uuidReplacer) {
+</code><code id="L393"><span class="ln">393</span> <b>return</b> <b>function</b> () {
+</code><code id="L394"><span class="ln">394</span> <b>return</b> <i>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"</i>.replace(uuidRegEx, uuidReplacer).toUpperCase();
+</code><code id="L395"><span class="ln">395</span> };
+</code><code id="L396"><span class="ln">396</span> })(/[xy]/g, <b>function</b> (c) {
+</code><code id="L397"><span class="ln">397</span> <b>var</b> r<span class="s"> = </span>math.random()<span class="s"> * </span><span class="d">16</span><span class="s"> | </span><span class="d">0</span>,
+</code><code id="L398"><span class="ln">398</span> v<span class="s"> = </span>c<span class="s"> == </span><i>"x"</i> ? r : (r<span class="s"> & </span><span class="d">3</span><span class="s"> | </span><span class="d">8</span>);
+</code><code id="L399"><span class="ln">399</span> <b>return</b> v.toString(<span class="d">16</span>);
+</code><code id="L400"><span class="ln">400</span> });
+</code><code id="L401"><span class="ln">401</span>
+</code><code id="L402"><span class="ln">402</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L403"><span class="ln">403</span><span class="c"> <span class="s"> * </span>Raphael.setWindow
+</span></code><code id="L404"><span class="ln">404</span><span class="c"> [ method ]
+</span></code><code id="L405"><span class="ln">405</span><span class="c"> **
+</span></code><code id="L406"><span class="ln">406</span><span class="c"> <span class="s"> * </span>Used when you need to draw <b>in</b> `<iframe>`. Switched window to the iframe one.
+</span></code><code id="L407"><span class="ln">407</span><span class="c"> > Parameters
+</span></code><code id="L408"><span class="ln">408</span><span class="c"> <span class="s"> - </span>newwin (window) <b>new</b> window object
+</span></code><code id="L409"><span class="ln">409</span><span class="c"> \*/</span>
+</code><code id="L410"><span class="ln">410</span> R.setWindow<span class="s"> = </span><b>function</b> (newwin) {
+</code><code id="L411"><span class="ln">411</span> eve(<i>"setWindow"</i>, R, g.win, newwin);
+</code><code id="L412"><span class="ln">412</span> g.win<span class="s"> = </span>newwin;
+</code><code id="L413"><span class="ln">413</span> g.doc<span class="s"> = </span>g.win.document;
+</code><code id="L414"><span class="ln">414</span> <b>if</b> (initWin) {
+</code><code id="L415"><span class="ln">415</span> initWin(g.win);
+</code><code id="L416"><span class="ln">416</span> }
+</code><code id="L417"><span class="ln">417</span> };
+</code><code id="L418"><span class="ln">418</span> <span class="c">// colour utilities</span>
+</code><code id="L419"><span class="ln">419</span> <b>var</b> toHex<span class="s"> = </span><b>function</b> (color) {
+</code><code id="L420"><span class="ln">420</span> <b>if</b> (R.vml) {
+</code><code id="L421"><span class="ln">421</span> <span class="c">// http://dean.edwards.name/weblog/<span class="d">2009</span>/<span class="d">10</span>/convert-any-colour-value-to-hex-<b>in</b>-msie/</span>
+</code><code id="L422"><span class="ln">422</span> <b>var</b> trim<span class="s"> = </span>/^\s+|\s+$/g;
+</code><code id="L423"><span class="ln">423</span> <b>var</b> bod;
+</code><code id="L424"><span class="ln">424</span> <b>try</b> {
+</code><code id="L425"><span class="ln">425</span> <b>var</b> docum<span class="s"> = </span><b>new</b> ActiveXObject(<i>"htmlfile"</i>);
+</code><code id="L426"><span class="ln">426</span> docum.write(<i>"<body>"</i>);
+</code><code id="L427"><span class="ln">427</span> docum.close();
+</code><code id="L428"><span class="ln">428</span> bod<span class="s"> = </span>docum.body;
+</code><code id="L429"><span class="ln">429</span> } <b>catch</b>(e) {
+</code><code id="L430"><span class="ln">430</span> bod<span class="s"> = </span>createPopup().document.body;
+</code><code id="L431"><span class="ln">431</span> }
+</code><code id="L432"><span class="ln">432</span> <b>var</b> range<span class="s"> = </span>bod.createTextRange();
+</code><code id="L433"><span class="ln">433</span> toHex<span class="s"> = </span>cacher(<b>function</b> (color) {
+</code><code id="L434"><span class="ln">434</span> <b>try</b> {
+</code><code id="L435"><span class="ln">435</span> bod.style.color<span class="s"> = </span>Str(color).replace(trim, E);
+</code><code id="L436"><span class="ln">436</span> <b>var</b> value<span class="s"> = </span>range.queryCommandValue(<i>"ForeColor"</i>);
+</code><code id="L437"><span class="ln">437</span> value<span class="s"> = </span>((value<span class="s"> & </span><span class="d">255</span>) << <span class="d">16</span>)<span class="s"> | </span>(value<span class="s"> & </span><span class="d">65280</span>)<span class="s"> | </span>((value<span class="s"> & </span><span class="d">16711680</span>) >>> <span class="d">16</span>);
+</code><code id="L438"><span class="ln">438</span> <b>return</b> <i>"#"</i><span class="s"> + </span>(<i>"<span class="d">000000</span>"</i><span class="s"> + </span>value.toString(<span class="d">16</span>)).slice(-<span class="d">6</span>);
+</code><code id="L439"><span class="ln">439</span> } <b>catch</b>(e) {
+</code><code id="L440"><span class="ln">440</span> <b>return</b> <i>"none"</i>;
+</code><code id="L441"><span class="ln">441</span> }
+</code><code id="L442"><span class="ln">442</span> });
+</code><code id="L443"><span class="ln">443</span> } <b>else</b> {
+</code><code id="L444"><span class="ln">444</span> <b>var</b> i<span class="s"> = </span>g.doc.createElement(<i>"i"</i>);
+</code><code id="L445"><span class="ln">445</span> i.title<span class="s"> = </span><i>"Rapha\xebl Colour Picker"</i>;
+</code><code id="L446"><span class="ln">446</span> i.style.display<span class="s"> = </span><i>"none"</i>;
+</code><code id="L447"><span class="ln">447</span> g.doc.body.appendChild(i);
+</code><code id="L448"><span class="ln">448</span> toHex<span class="s"> = </span>cacher(<b>function</b> (color) {
+</code><code id="L449"><span class="ln">449</span> i.style.color<span class="s"> = </span>color;
+</code><code id="L450"><span class="ln">450</span> <b>return</b> g.doc.defaultView.getComputedStyle(i, E).getPropertyValue(<i>"color"</i>);
+</code><code id="L451"><span class="ln">451</span> });
+</code><code id="L452"><span class="ln">452</span> }
+</code><code id="L453"><span class="ln">453</span> <b>return</b> toHex(color);
+</code><code id="L454"><span class="ln">454</span> },
+</code><code id="L455"><span class="ln">455</span> hsbtoString<span class="s"> = </span><b>function</b> () {
+</code><code id="L456"><span class="ln">456</span> <b>return</b> <i>"hsb("</i><span class="s"> + </span>[<b>this</b>.h, <b>this</b>.s, <b>this</b>.b]<span class="s"> + </span><i>")"</i>;
+</code><code id="L457"><span class="ln">457</span> },
+</code><code id="L458"><span class="ln">458</span> hsltoString<span class="s"> = </span><b>function</b> () {
+</code><code id="L459"><span class="ln">459</span> <b>return</b> <i>"hsl("</i><span class="s"> + </span>[<b>this</b>.h, <b>this</b>.s, <b>this</b>.l]<span class="s"> + </span><i>")"</i>;
+</code><code id="L460"><span class="ln">460</span> },
+</code><code id="L461"><span class="ln">461</span> rgbtoString<span class="s"> = </span><b>function</b> () {
+</code><code id="L462"><span class="ln">462</span> <b>return</b> <b>this</b>.hex;
+</code><code id="L463"><span class="ln">463</span> },
+</code><code id="L464"><span class="ln">464</span> prepareRGB<span class="s"> = </span><b>function</b> (r, g, b) {
+</code><code id="L465"><span class="ln">465</span> <b>if</b> (g<span class="s"> == </span><b>null</b><span class="s"> && </span>R.is(r, <i>"object"</i>)<span class="s"> && </span><i>"r"</i> <b>in</b> r<span class="s"> && </span><i>"g"</i> <b>in</b> r<span class="s"> && </span><i>"b"</i> <b>in</b> r) {
+</code><code id="L466"><span class="ln">466</span> b<span class="s"> = </span>r.b;
+</code><code id="L467"><span class="ln">467</span> g<span class="s"> = </span>r.g;
+</code><code id="L468"><span class="ln">468</span> r<span class="s"> = </span>r.r;
+</code><code id="L469"><span class="ln">469</span> }
+</code><code id="L470"><span class="ln">470</span> <b>if</b> (g<span class="s"> == </span><b>null</b><span class="s"> && </span>R.is(r, string)) {
+</code><code id="L471"><span class="ln">471</span> <b>var</b> clr<span class="s"> = </span>R.getRGB(r);
+</code><code id="L472"><span class="ln">472</span> r<span class="s"> = </span>clr.r;
+</code><code id="L473"><span class="ln">473</span> g<span class="s"> = </span>clr.g;
+</code><code id="L474"><span class="ln">474</span> b<span class="s"> = </span>clr.b;
+</code><code id="L475"><span class="ln">475</span> }
+</code><code id="L476"><span class="ln">476</span> <b>if</b> (r > <span class="d">1</span><span class="s"> || </span>g > <span class="d">1</span><span class="s"> || </span>b > <span class="d">1</span>) {
+</code><code id="L477"><span class="ln">477</span> r /= <span class="d">255</span>;
+</code><code id="L478"><span class="ln">478</span> g /= <span class="d">255</span>;
+</code><code id="L479"><span class="ln">479</span> b /= <span class="d">255</span>;
+</code><code id="L480"><span class="ln">480</span> }
+</code><code id="L481"><span class="ln">481</span>
+</code><code id="L482"><span class="ln">482</span> <b>return</b> [r, g, b];
+</code><code id="L483"><span class="ln">483</span> },
+</code><code id="L484"><span class="ln">484</span> packageRGB<span class="s"> = </span><b>function</b> (r, g, b, o) {
+</code><code id="L485"><span class="ln">485</span> r *= <span class="d">255</span>;
+</code><code id="L486"><span class="ln">486</span> g *= <span class="d">255</span>;
+</code><code id="L487"><span class="ln">487</span> b *= <span class="d">255</span>;
+</code><code id="L488"><span class="ln">488</span> <b>var</b> rgb<span class="s"> = </span>{
+</code><code id="L489"><span class="ln">489</span> r: r,
+</code><code id="L490"><span class="ln">490</span> g: g,
+</code><code id="L491"><span class="ln">491</span> b: b,
+</code><code id="L492"><span class="ln">492</span> hex: R.rgb(r, g, b),
+</code><code id="L493"><span class="ln">493</span> toString: rgbtoString
+</code><code id="L494"><span class="ln">494</span> };
+</code><code id="L495"><span class="ln">495</span> R.is(o, <i>"finite"</i>)<span class="s"> && </span>(rgb.opacity<span class="s"> = </span>o);
+</code><code id="L496"><span class="ln">496</span> <b>return</b> rgb;
+</code><code id="L497"><span class="ln">497</span> };
+</code><code id="L498"><span class="ln">498</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L499"><span class="ln">499</span><span class="c"> <span class="s"> * </span>Raphael.hsb2rgb
+</span></code><code id="L500"><span class="ln">500</span><span class="c"> [ method ]
+</span></code><code id="L501"><span class="ln">501</span><span class="c"> **
+</span></code><code id="L502"><span class="ln">502</span><span class="c"> <span class="s"> * </span>Converts HSB values to RGB object.
+</span></code><code id="L503"><span class="ln">503</span><span class="c"> > Parameters
+</span></code><code id="L504"><span class="ln">504</span><span class="c"> <span class="s"> - </span>h (number) hue
+</span></code><code id="L505"><span class="ln">505</span><span class="c"> <span class="s"> - </span>s (number) saturation
+</span></code><code id="L506"><span class="ln">506</span><span class="c"> <span class="s"> - </span>v (number) value or brightness
+</span></code><code id="L507"><span class="ln">507</span><span class="c"> <span class="s"> = </span>(object) RGB object <b>in</b> format:
+</span></code><code id="L508"><span class="ln">508</span><span class="c"> o {
+</span></code><code id="L509"><span class="ln">509</span><span class="c"> o r (number) red,
+</span></code><code id="L510"><span class="ln">510</span><span class="c"> o g (number) green,
+</span></code><code id="L511"><span class="ln">511</span><span class="c"> o b (number) blue,
+</span></code><code id="L512"><span class="ln">512</span><span class="c"> o hex (string) color <b>in</b> HTML/CSS format: #••••••
+</span></code><code id="L513"><span class="ln">513</span><span class="c"> o }
+</span></code><code id="L514"><span class="ln">514</span><span class="c"> \*/</span>
+</code><code id="L515"><span class="ln">515</span> R.hsb2rgb<span class="s"> = </span><b>function</b> (h, s, v, o) {
+</code><code id="L516"><span class="ln">516</span> <b>if</b> (<b>this</b>.is(h, <i>"object"</i>)<span class="s"> && </span><i>"h"</i> <b>in</b> h<span class="s"> && </span><i>"s"</i> <b>in</b> h<span class="s"> && </span><i>"b"</i> <b>in</b> h) {
+</code><code id="L517"><span class="ln">517</span> v<span class="s"> = </span>h.b;
+</code><code id="L518"><span class="ln">518</span> s<span class="s"> = </span>h.s;
+</code><code id="L519"><span class="ln">519</span> h<span class="s"> = </span>h.h;
+</code><code id="L520"><span class="ln">520</span> o<span class="s"> = </span>h.o;
+</code><code id="L521"><span class="ln">521</span> }
+</code><code id="L522"><span class="ln">522</span> h *= <span class="d">360</span>;
+</code><code id="L523"><span class="ln">523</span> <b>var</b> R, G, B, X, C;
+</code><code id="L524"><span class="ln">524</span> h<span class="s"> = </span>(h<span class="s"> % </span><span class="d">360</span>)<span class="s"> / </span><span class="d">60</span>;
+</code><code id="L525"><span class="ln">525</span> C<span class="s"> = </span>v<span class="s"> * </span>s;
+</code><code id="L526"><span class="ln">526</span> X<span class="s"> = </span>C<span class="s"> * </span>(<span class="d">1</span><span class="s"> - </span>abs(h<span class="s"> % </span><span class="d">2</span><span class="s"> - </span><span class="d">1</span>));
+</code><code id="L527"><span class="ln">527</span> R<span class="s"> = </span>G<span class="s"> = </span>B<span class="s"> = </span>v<span class="s"> - </span>C;
+</code><code id="L528"><span class="ln">528</span>
+</code><code id="L529"><span class="ln">529</span> h<span class="s"> = </span>~~h;
+</code><code id="L530"><span class="ln">530</span> R += [C, X, <span class="d">0</span>, <span class="d">0</span>, X, C][h];
+</code><code id="L531"><span class="ln">531</span> G += [X, C, C, X, <span class="d">0</span>, <span class="d">0</span>][h];
+</code><code id="L532"><span class="ln">532</span> B += [<span class="d">0</span>, <span class="d">0</span>, X, C, C, X][h];
+</code><code id="L533"><span class="ln">533</span> <b>return</b> packageRGB(R, G, B, o);
+</code><code id="L534"><span class="ln">534</span> };
+</code><code id="L535"><span class="ln">535</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L536"><span class="ln">536</span><span class="c"> <span class="s"> * </span>Raphael.hsl2rgb
+</span></code><code id="L537"><span class="ln">537</span><span class="c"> [ method ]
+</span></code><code id="L538"><span class="ln">538</span><span class="c"> **
+</span></code><code id="L539"><span class="ln">539</span><span class="c"> <span class="s"> * </span>Converts HSL values to RGB object.
+</span></code><code id="L540"><span class="ln">540</span><span class="c"> > Parameters
+</span></code><code id="L541"><span class="ln">541</span><span class="c"> <span class="s"> - </span>h (number) hue
+</span></code><code id="L542"><span class="ln">542</span><span class="c"> <span class="s"> - </span>s (number) saturation
+</span></code><code id="L543"><span class="ln">543</span><span class="c"> <span class="s"> - </span>l (number) luminosity
+</span></code><code id="L544"><span class="ln">544</span><span class="c"> <span class="s"> = </span>(object) RGB object <b>in</b> format:
+</span></code><code id="L545"><span class="ln">545</span><span class="c"> o {
+</span></code><code id="L546"><span class="ln">546</span><span class="c"> o r (number) red,
+</span></code><code id="L547"><span class="ln">547</span><span class="c"> o g (number) green,
+</span></code><code id="L548"><span class="ln">548</span><span class="c"> o b (number) blue,
+</span></code><code id="L549"><span class="ln">549</span><span class="c"> o hex (string) color <b>in</b> HTML/CSS format: #••••••
+</span></code><code id="L550"><span class="ln">550</span><span class="c"> o }
+</span></code><code id="L551"><span class="ln">551</span><span class="c"> \*/</span>
+</code><code id="L552"><span class="ln">552</span> R.hsl2rgb<span class="s"> = </span><b>function</b> (h, s, l, o) {
+</code><code id="L553"><span class="ln">553</span> <b>if</b> (<b>this</b>.is(h, <i>"object"</i>)<span class="s"> && </span><i>"h"</i> <b>in</b> h<span class="s"> && </span><i>"s"</i> <b>in</b> h<span class="s"> && </span><i>"l"</i> <b>in</b> h) {
+</code><code id="L554"><span class="ln">554</span> l<span class="s"> = </span>h.l;
+</code><code id="L555"><span class="ln">555</span> s<span class="s"> = </span>h.s;
+</code><code id="L556"><span class="ln">556</span> h<span class="s"> = </span>h.h;
+</code><code id="L557"><span class="ln">557</span> }
+</code><code id="L558"><span class="ln">558</span> <b>if</b> (h > <span class="d">1</span><span class="s"> || </span>s > <span class="d">1</span><span class="s"> || </span>l > <span class="d">1</span>) {
+</code><code id="L559"><span class="ln">559</span> h /= <span class="d">360</span>;
+</code><code id="L560"><span class="ln">560</span> s /= <span class="d">100</span>;
+</code><code id="L561"><span class="ln">561</span> l /= <span class="d">100</span>;
+</code><code id="L562"><span class="ln">562</span> }
+</code><code id="L563"><span class="ln">563</span> h *= <span class="d">360</span>;
+</code><code id="L564"><span class="ln">564</span> <b>var</b> R, G, B, X, C;
+</code><code id="L565"><span class="ln">565</span> h<span class="s"> = </span>(h<span class="s"> % </span><span class="d">360</span>)<span class="s"> / </span><span class="d">60</span>;
+</code><code id="L566"><span class="ln">566</span> C<span class="s"> = </span><span class="d">2</span><span class="s"> * </span>s<span class="s"> * </span>(l < <span class="d">.5</span> ? l : <span class="d">1</span><span class="s"> - </span>l);
+</code><code id="L567"><span class="ln">567</span> X<span class="s"> = </span>C<span class="s"> * </span>(<span class="d">1</span><span class="s"> - </span>abs(h<span class="s"> % </span><span class="d">2</span><span class="s"> - </span><span class="d">1</span>));
+</code><code id="L568"><span class="ln">568</span> R<span class="s"> = </span>G<span class="s"> = </span>B<span class="s"> = </span>l<span class="s"> - </span>C<span class="s"> / </span><span class="d">2</span>;
+</code><code id="L569"><span class="ln">569</span>
+</code><code id="L570"><span class="ln">570</span> h<span class="s"> = </span>~~h;
+</code><code id="L571"><span class="ln">571</span> R += [C, X, <span class="d">0</span>, <span class="d">0</span>, X, C][h];
+</code><code id="L572"><span class="ln">572</span> G += [X, C, C, X, <span class="d">0</span>, <span class="d">0</span>][h];
+</code><code id="L573"><span class="ln">573</span> B += [<span class="d">0</span>, <span class="d">0</span>, X, C, C, X][h];
+</code><code id="L574"><span class="ln">574</span> <b>return</b> packageRGB(R, G, B, o);
+</code><code id="L575"><span class="ln">575</span> };
+</code><code id="L576"><span class="ln">576</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L577"><span class="ln">577</span><span class="c"> <span class="s"> * </span>Raphael.rgb2hsb
+</span></code><code id="L578"><span class="ln">578</span><span class="c"> [ method ]
+</span></code><code id="L579"><span class="ln">579</span><span class="c"> **
+</span></code><code id="L580"><span class="ln">580</span><span class="c"> <span class="s"> * </span>Converts RGB values to HSB object.
+</span></code><code id="L581"><span class="ln">581</span><span class="c"> > Parameters
+</span></code><code id="L582"><span class="ln">582</span><span class="c"> <span class="s"> - </span>r (number) red
+</span></code><code id="L583"><span class="ln">583</span><span class="c"> <span class="s"> - </span>g (number) green
+</span></code><code id="L584"><span class="ln">584</span><span class="c"> <span class="s"> - </span>b (number) blue
+</span></code><code id="L585"><span class="ln">585</span><span class="c"> <span class="s"> = </span>(object) HSB object <b>in</b> format:
+</span></code><code id="L586"><span class="ln">586</span><span class="c"> o {
+</span></code><code id="L587"><span class="ln">587</span><span class="c"> o h (number) hue
+</span></code><code id="L588"><span class="ln">588</span><span class="c"> o s (number) saturation
+</span></code><code id="L589"><span class="ln">589</span><span class="c"> o b (number) brightness
+</span></code><code id="L590"><span class="ln">590</span><span class="c"> o }
+</span></code><code id="L591"><span class="ln">591</span><span class="c"> \*/</span>
+</code><code id="L592"><span class="ln">592</span> R.rgb2hsb<span class="s"> = </span><b>function</b> (r, g, b) {
+</code><code id="L593"><span class="ln">593</span> b<span class="s"> = </span>prepareRGB(r, g, b);
+</code><code id="L594"><span class="ln">594</span> r<span class="s"> = </span>b[<span class="d">0</span>];
+</code><code id="L595"><span class="ln">595</span> g<span class="s"> = </span>b[<span class="d">1</span>];
+</code><code id="L596"><span class="ln">596</span> b<span class="s"> = </span>b[<span class="d">2</span>];
+</code><code id="L597"><span class="ln">597</span>
+</code><code id="L598"><span class="ln">598</span> <b>var</b> H, S, V, C;
+</code><code id="L599"><span class="ln">599</span> V<span class="s"> = </span>mmax(r, g, b);
+</code><code id="L600"><span class="ln">600</span> C<span class="s"> = </span>V<span class="s"> - </span>mmin(r, g, b);
+</code><code id="L601"><span class="ln">601</span> H<span class="s"> = </span>(C<span class="s"> == </span><span class="d">0</span> ? <b>null</b> :
+</code><code id="L602"><span class="ln">602</span> V<span class="s"> == </span>r ? (g<span class="s"> - </span>b)<span class="s"> / </span>C :
+</code><code id="L603"><span class="ln">603</span> V<span class="s"> == </span>g ? (b<span class="s"> - </span>r)<span class="s"> / </span>C<span class="s"> + </span><span class="d">2</span> :
+</code><code id="L604"><span class="ln">604</span> (r<span class="s"> - </span>g)<span class="s"> / </span>C<span class="s"> + </span><span class="d">4</span>);
+</code><code id="L605"><span class="ln">605</span> H<span class="s"> = </span>(H<span class="s"> % </span><span class="d">6</span>)<span class="s"> * </span><span class="d">60</span>;
+</code><code id="L606"><span class="ln">606</span> S<span class="s"> = </span>C<span class="s"> == </span><span class="d">0</span> ? <span class="d">0</span> : C<span class="s"> / </span>V;
+</code><code id="L607"><span class="ln">607</span> <b>return</b> {h: H, s: S, b: V, toString: hsbtoString};
+</code><code id="L608"><span class="ln">608</span> };
+</code><code id="L609"><span class="ln">609</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L610"><span class="ln">610</span><span class="c"> <span class="s"> * </span>Raphael.rgb2hsl
+</span></code><code id="L611"><span class="ln">611</span><span class="c"> [ method ]
+</span></code><code id="L612"><span class="ln">612</span><span class="c"> **
+</span></code><code id="L613"><span class="ln">613</span><span class="c"> <span class="s"> * </span>Converts RGB values to HSL object.
+</span></code><code id="L614"><span class="ln">614</span><span class="c"> > Parameters
+</span></code><code id="L615"><span class="ln">615</span><span class="c"> <span class="s"> - </span>r (number) red
+</span></code><code id="L616"><span class="ln">616</span><span class="c"> <span class="s"> - </span>g (number) green
+</span></code><code id="L617"><span class="ln">617</span><span class="c"> <span class="s"> - </span>b (number) blue
+</span></code><code id="L618"><span class="ln">618</span><span class="c"> <span class="s"> = </span>(object) HSL object <b>in</b> format:
+</span></code><code id="L619"><span class="ln">619</span><span class="c"> o {
+</span></code><code id="L620"><span class="ln">620</span><span class="c"> o h (number) hue
+</span></code><code id="L621"><span class="ln">621</span><span class="c"> o s (number) saturation
+</span></code><code id="L622"><span class="ln">622</span><span class="c"> o l (number) luminosity
+</span></code><code id="L623"><span class="ln">623</span><span class="c"> o }
+</span></code><code id="L624"><span class="ln">624</span><span class="c"> \*/</span>
+</code><code id="L625"><span class="ln">625</span> R.rgb2hsl<span class="s"> = </span><b>function</b> (r, g, b) {
+</code><code id="L626"><span class="ln">626</span> b<span class="s"> = </span>prepareRGB(r, g, b);
+</code><code id="L627"><span class="ln">627</span> r<span class="s"> = </span>b[<span class="d">0</span>];
+</code><code id="L628"><span class="ln">628</span> g<span class="s"> = </span>b[<span class="d">1</span>];
+</code><code id="L629"><span class="ln">629</span> b<span class="s"> = </span>b[<span class="d">2</span>];
+</code><code id="L630"><span class="ln">630</span>
+</code><code id="L631"><span class="ln">631</span> <b>var</b> H, S, L, M, m, C;
+</code><code id="L632"><span class="ln">632</span> M<span class="s"> = </span>mmax(r, g, b);
+</code><code id="L633"><span class="ln">633</span> m<span class="s"> = </span>mmin(r, g, b);
+</code><code id="L634"><span class="ln">634</span> C<span class="s"> = </span>M<span class="s"> - </span>m;
+</code><code id="L635"><span class="ln">635</span> H<span class="s"> = </span>(C<span class="s"> == </span><span class="d">0</span> ? <b>null</b> :
+</code><code id="L636"><span class="ln">636</span> M<span class="s"> == </span>r ? (g<span class="s"> - </span>b)<span class="s"> / </span>C :
+</code><code id="L637"><span class="ln">637</span> M<span class="s"> == </span>g ? (b<span class="s"> - </span>r)<span class="s"> / </span>C<span class="s"> + </span><span class="d">2</span> :
+</code><code id="L638"><span class="ln">638</span> (r<span class="s"> - </span>g)<span class="s"> / </span>C<span class="s"> + </span><span class="d">4</span>);
+</code><code id="L639"><span class="ln">639</span> H<span class="s"> = </span>(H<span class="s"> % </span><span class="d">6</span>)<span class="s"> * </span><span class="d">60</span>;
+</code><code id="L640"><span class="ln">640</span> L<span class="s"> = </span>(M<span class="s"> + </span>m)<span class="s"> / </span><span class="d">2</span>;
+</code><code id="L641"><span class="ln">641</span> S<span class="s"> = </span>(C<span class="s"> == </span><span class="d">0</span> ? <span class="d">0</span> :
+</code><code id="L642"><span class="ln">642</span> L < <span class="d">.5</span> ? C<span class="s"> / </span>(<span class="d">2</span><span class="s"> * </span>L) :
+</code><code id="L643"><span class="ln">643</span> C<span class="s"> / </span>(<span class="d">2</span><span class="s"> - </span><span class="d">2</span><span class="s"> * </span>L));
+</code><code id="L644"><span class="ln">644</span> <b>return</b> {h: H, s: S, l: L, toString: hsltoString};
+</code><code id="L645"><span class="ln">645</span> };
+</code><code id="L646"><span class="ln">646</span> R._path2string<span class="s"> = </span><b>function</b> () {
+</code><code id="L647"><span class="ln">647</span> <b>return</b> <b>this</b>.join(<i>","</i>).replace(p2s, <i>"$<span class="d">1</span>"</i>);
+</code><code id="L648"><span class="ln">648</span> };
+</code><code id="L649"><span class="ln">649</span> <b>function</b> cacher(f, scope, postprocessor) {
+</code><code id="L650"><span class="ln">650</span> <b>function</b> newf() {
+</code><code id="L651"><span class="ln">651</span> <b>var</b> arg<span class="s"> = </span>Array.prototype.slice.call(arguments, <span class="d">0</span>),
+</code><code id="L652"><span class="ln">652</span> args<span class="s"> = </span>arg.join(<i>"\u2400"</i>),
+</code><code id="L653"><span class="ln">653</span> cache<span class="s"> = </span>newf.cache<span class="s"> = </span>newf.cache<span class="s"> || </span>{},
+</code><code id="L654"><span class="ln">654</span> count<span class="s"> = </span>newf.count<span class="s"> = </span>newf.count<span class="s"> || </span>[];
+</code><code id="L655"><span class="ln">655</span> <b>if</b> (cache[has](args)) {
+</code><code id="L656"><span class="ln">656</span> <b>return</b> postprocessor ? postprocessor(cache[args]) : cache[args];
+</code><code id="L657"><span class="ln">657</span> }
+</code><code id="L658"><span class="ln">658</span> count.length >= <span class="d">1e3</span><span class="s"> && </span><b>delete</b> cache[count.shift()];
+</code><code id="L659"><span class="ln">659</span> count.push(args);
+</code><code id="L660"><span class="ln">660</span> cache[args]<span class="s"> = </span>f[apply](scope, arg);
+</code><code id="L661"><span class="ln">661</span> <b>return</b> postprocessor ? postprocessor(cache[args]) : cache[args];
+</code><code id="L662"><span class="ln">662</span> }
+</code><code id="L663"><span class="ln">663</span> <b>return</b> newf;
+</code><code id="L664"><span class="ln">664</span> }
+</code><code id="L665"><span class="ln">665</span>
+</code><code id="L666"><span class="ln">666</span> <b>function</b> preload(src, f) {
+</code><code id="L667"><span class="ln">667</span> <b>var</b> img<span class="s"> = </span>g.doc.createElement(<i>"img"</i>);
+</code><code id="L668"><span class="ln">668</span> img.style.cssText<span class="s"> = </span><i>"position:absolute;left:-9999em;top-9999em"</i>;
+</code><code id="L669"><span class="ln">669</span> img.onload<span class="s"> = </span><b>function</b> () {
+</code><code id="L670"><span class="ln">670</span> f.call(<b>this</b>);
+</code><code id="L671"><span class="ln">671</span> <b>this</b>.onload<span class="s"> = </span><b>null</b>;
+</code><code id="L672"><span class="ln">672</span> g.doc.body.removeChild(<b>this</b>);
+</code><code id="L673"><span class="ln">673</span> };
+</code><code id="L674"><span class="ln">674</span> img.onerror<span class="s"> = </span><b>function</b> () {
+</code><code id="L675"><span class="ln">675</span> g.doc.body.removeChild(<b>this</b>);
+</code><code id="L676"><span class="ln">676</span> };
+</code><code id="L677"><span class="ln">677</span> g.doc.body.appendChild(img);
+</code><code id="L678"><span class="ln">678</span> img.src<span class="s"> = </span>src;
+</code><code id="L679"><span class="ln">679</span> }
+</code><code id="L680"><span class="ln">680</span>
+</code><code id="L681"><span class="ln">681</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L682"><span class="ln">682</span><span class="c"> <span class="s"> * </span>Raphael.getRGB
+</span></code><code id="L683"><span class="ln">683</span><span class="c"> [ method ]
+</span></code><code id="L684"><span class="ln">684</span><span class="c"> **
+</span></code><code id="L685"><span class="ln">685</span><span class="c"> <span class="s"> * </span>Parses colour string as RGB object
+</span></code><code id="L686"><span class="ln">686</span><span class="c"> > Parameters
+</span></code><code id="L687"><span class="ln">687</span><span class="c"> <span class="s"> - </span>colour (string) colour string <b>in</b> one of formats:
+</span></code><code id="L688"><span class="ln">688</span><span class="c"> # <ul>
+</span></code><code id="L689"><span class="ln">689</span><span class="c"> # <li>Colour name (“<code>red</code>”, “<code>green</code>”, “<code>cornflowerblue</code>”, etc)</li>
+</span></code><code id="L690"><span class="ln">690</span><span class="c"> # <li>#••• — shortened HTML colour: (“<code>#<span class="d">000</span></code>”, “<code>#fc0</code>”, etc)</li>
+</span></code><code id="L691"><span class="ln">691</span><span class="c"> # <li>#•••••• — full length HTML colour: (“<code>#<span class="d">000000</span></code>”, “<code>#bd2300</code>”)</li>
+</span></code><code id="L692"><span class="ln">692</span><span class="c"> # <li>rgb(•••, •••, •••) — red, green and blue channels’ values: (“<code>rgb(<span class="d">200</span>, <span class="d">100</span>, <span class="d">0</span>)</code>”)</li>
+</span></code><code id="L693"><span class="ln">693</span><span class="c"> # <li>rgb(•••%, •••%, •••%) — same as above, but <b>in</b> %: (“<code>rgb(<span class="d">100</span>%, <span class="d">175</span>%, <span class="d">0</span>%)</code>”)</li>
+</span></code><code id="L694"><span class="ln">694</span><span class="c"> # <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (“<code>hsb(<span class="d">0.5</span>, <span class="d">0.25</span>, <span class="d">1</span>)</code>”)</li>
+</span></code><code id="L695"><span class="ln">695</span><span class="c"> # <li>hsb(•••%, •••%, •••%) — same as above, but <b>in</b> %</li>
+</span></code><code id="L696"><span class="ln">696</span><span class="c"> # <li>hsl(•••, •••, •••) — same as hsb</li>
+</span></code><code id="L697"><span class="ln">697</span><span class="c"> # <li>hsl(•••%, •••%, •••%) — same as hsb</li>
+</span></code><code id="L698"><span class="ln">698</span><span class="c"> # </ul>
+</span></code><code id="L699"><span class="ln">699</span><span class="c"> <span class="s"> = </span>(object) RGB object <b>in</b> format:
+</span></code><code id="L700"><span class="ln">700</span><span class="c"> o {
+</span></code><code id="L701"><span class="ln">701</span><span class="c"> o r (number) red,
+</span></code><code id="L702"><span class="ln">702</span><span class="c"> o g (number) green,
+</span></code><code id="L703"><span class="ln">703</span><span class="c"> o b (number) blue
+</span></code><code id="L704"><span class="ln">704</span><span class="c"> o hex (string) color <b>in</b> HTML/CSS format: #••••••,
+</span></code><code id="L705"><span class="ln">705</span><span class="c"> o error (<b>boolean</b>) <b>true</b> <b>if</b> string can’t be parsed
+</span></code><code id="L706"><span class="ln">706</span><span class="c"> o }
+</span></code><code id="L707"><span class="ln">707</span><span class="c"> \*/</span>
+</code><code id="L708"><span class="ln">708</span> R.getRGB<span class="s"> = </span>cacher(<b>function</b> (colour) {
+</code><code id="L709"><span class="ln">709</span> <b>if</b> (!colour<span class="s"> || </span>!!((colour<span class="s"> = </span>Str(colour)).indexOf(<i>"-"</i>)<span class="s"> + </span><span class="d">1</span>)) {
+</code><code id="L710"><span class="ln">710</span> <b>return</b> {r: -<span class="d">1</span>, g: -<span class="d">1</span>, b: -<span class="d">1</span>, hex: <i>"none"</i>, error: <span class="d">1</span>};
+</code><code id="L711"><span class="ln">711</span> }
+</code><code id="L712"><span class="ln">712</span> <b>if</b> (colour<span class="s"> == </span><i>"none"</i>) {
+</code><code id="L713"><span class="ln">713</span> <b>return</b> {r: -<span class="d">1</span>, g: -<span class="d">1</span>, b: -<span class="d">1</span>, hex: <i>"none"</i>};
+</code><code id="L714"><span class="ln">714</span> }
+</code><code id="L715"><span class="ln">715</span> !(hsrg[has](colour.toLowerCase().substring(<span class="d">0</span>, <span class="d">2</span>))<span class="s"> || </span>colour.charAt()<span class="s"> == </span><i>"#"</i>)<span class="s"> && </span>(colour<span class="s"> = </span>toHex(colour));
+</code><code id="L716"><span class="ln">716</span> <b>var</b> res,
+</code><code id="L717"><span class="ln">717</span> red,
+</code><code id="L718"><span class="ln">718</span> green,
+</code><code id="L719"><span class="ln">719</span> blue,
+</code><code id="L720"><span class="ln">720</span> opacity,
+</code><code id="L721"><span class="ln">721</span> t,
+</code><code id="L722"><span class="ln">722</span> values,
+</code><code id="L723"><span class="ln">723</span> rgb<span class="s"> = </span>colour.match(colourRegExp);
+</code><code id="L724"><span class="ln">724</span> <b>if</b> (rgb) {
+</code><code id="L725"><span class="ln">725</span> <b>if</b> (rgb[<span class="d">2</span>]) {
+</code><code id="L726"><span class="ln">726</span> blue<span class="s"> = </span>toInt(rgb[<span class="d">2</span>].substring(<span class="d">5</span>), <span class="d">16</span>);
+</code><code id="L727"><span class="ln">727</span> green<span class="s"> = </span>toInt(rgb[<span class="d">2</span>].substring(<span class="d">3</span>, <span class="d">5</span>), <span class="d">16</span>);
+</code><code id="L728"><span class="ln">728</span> red<span class="s"> = </span>toInt(rgb[<span class="d">2</span>].substring(<span class="d">1</span>, <span class="d">3</span>), <span class="d">16</span>);
+</code><code id="L729"><span class="ln">729</span> }
+</code><code id="L730"><span class="ln">730</span> <b>if</b> (rgb[<span class="d">3</span>]) {
+</code><code id="L731"><span class="ln">731</span> blue<span class="s"> = </span>toInt((t<span class="s"> = </span>rgb[<span class="d">3</span>].charAt(<span class="d">3</span>))<span class="s"> + </span>t, <span class="d">16</span>);
+</code><code id="L732"><span class="ln">732</span> green<span class="s"> = </span>toInt((t<span class="s"> = </span>rgb[<span class="d">3</span>].charAt(<span class="d">2</span>))<span class="s"> + </span>t, <span class="d">16</span>);
+</code><code id="L733"><span class="ln">733</span> red<span class="s"> = </span>toInt((t<span class="s"> = </span>rgb[<span class="d">3</span>].charAt(<span class="d">1</span>))<span class="s"> + </span>t, <span class="d">16</span>);
+</code><code id="L734"><span class="ln">734</span> }
+</code><code id="L735"><span class="ln">735</span> <b>if</b> (rgb[<span class="d">4</span>]) {
+</code><code id="L736"><span class="ln">736</span> values<span class="s"> = </span>rgb[<span class="d">4</span>].split(commaSpaces);
+</code><code id="L737"><span class="ln">737</span> red<span class="s"> = </span>toFloat(values[<span class="d">0</span>]);
+</code><code id="L738"><span class="ln">738</span> values[<span class="d">0</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(red *= <span class="d">2.55</span>);
+</code><code id="L739"><span class="ln">739</span> green<span class="s"> = </span>toFloat(values[<span class="d">1</span>]);
+</code><code id="L740"><span class="ln">740</span> values[<span class="d">1</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(green *= <span class="d">2.55</span>);
+</code><code id="L741"><span class="ln">741</span> blue<span class="s"> = </span>toFloat(values[<span class="d">2</span>]);
+</code><code id="L742"><span class="ln">742</span> values[<span class="d">2</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(blue *= <span class="d">2.55</span>);
+</code><code id="L743"><span class="ln">743</span> rgb[<span class="d">1</span>].toLowerCase().slice(<span class="d">0</span>, <span class="d">4</span>)<span class="s"> == </span><i>"rgba"</i><span class="s"> && </span>(opacity<span class="s"> = </span>toFloat(values[<span class="d">3</span>]));
+</code><code id="L744"><span class="ln">744</span> values[<span class="d">3</span>]<span class="s"> && </span>values[<span class="d">3</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(opacity /= <span class="d">100</span>);
+</code><code id="L745"><span class="ln">745</span> }
+</code><code id="L746"><span class="ln">746</span> <b>if</b> (rgb[<span class="d">5</span>]) {
+</code><code id="L747"><span class="ln">747</span> values<span class="s"> = </span>rgb[<span class="d">5</span>].split(commaSpaces);
+</code><code id="L748"><span class="ln">748</span> red<span class="s"> = </span>toFloat(values[<span class="d">0</span>]);
+</code><code id="L749"><span class="ln">749</span> values[<span class="d">0</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(red *= <span class="d">2.55</span>);
+</code><code id="L750"><span class="ln">750</span> green<span class="s"> = </span>toFloat(values[<span class="d">1</span>]);
+</code><code id="L751"><span class="ln">751</span> values[<span class="d">1</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(green *= <span class="d">2.55</span>);
+</code><code id="L752"><span class="ln">752</span> blue<span class="s"> = </span>toFloat(values[<span class="d">2</span>]);
+</code><code id="L753"><span class="ln">753</span> values[<span class="d">2</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(blue *= <span class="d">2.55</span>);
+</code><code id="L754"><span class="ln">754</span> (values[<span class="d">0</span>].slice(-<span class="d">3</span>)<span class="s"> == </span><i>"deg"</i><span class="s"> || </span>values[<span class="d">0</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"\xb0"</i>)<span class="s"> && </span>(red /= <span class="d">360</span>);
+</code><code id="L755"><span class="ln">755</span> rgb[<span class="d">1</span>].toLowerCase().slice(<span class="d">0</span>, <span class="d">4</span>)<span class="s"> == </span><i>"hsba"</i><span class="s"> && </span>(opacity<span class="s"> = </span>toFloat(values[<span class="d">3</span>]));
+</code><code id="L756"><span class="ln">756</span> values[<span class="d">3</span>]<span class="s"> && </span>values[<span class="d">3</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(opacity /= <span class="d">100</span>);
+</code><code id="L757"><span class="ln">757</span> <b>return</b> R.hsb2rgb(red, green, blue, opacity);
+</code><code id="L758"><span class="ln">758</span> }
+</code><code id="L759"><span class="ln">759</span> <b>if</b> (rgb[<span class="d">6</span>]) {
+</code><code id="L760"><span class="ln">760</span> values<span class="s"> = </span>rgb[<span class="d">6</span>].split(commaSpaces);
+</code><code id="L761"><span class="ln">761</span> red<span class="s"> = </span>toFloat(values[<span class="d">0</span>]);
+</code><code id="L762"><span class="ln">762</span> values[<span class="d">0</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(red *= <span class="d">2.55</span>);
+</code><code id="L763"><span class="ln">763</span> green<span class="s"> = </span>toFloat(values[<span class="d">1</span>]);
+</code><code id="L764"><span class="ln">764</span> values[<span class="d">1</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(green *= <span class="d">2.55</span>);
+</code><code id="L765"><span class="ln">765</span> blue<span class="s"> = </span>toFloat(values[<span class="d">2</span>]);
+</code><code id="L766"><span class="ln">766</span> values[<span class="d">2</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(blue *= <span class="d">2.55</span>);
+</code><code id="L767"><span class="ln">767</span> (values[<span class="d">0</span>].slice(-<span class="d">3</span>)<span class="s"> == </span><i>"deg"</i><span class="s"> || </span>values[<span class="d">0</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"\xb0"</i>)<span class="s"> && </span>(red /= <span class="d">360</span>);
+</code><code id="L768"><span class="ln">768</span> rgb[<span class="d">1</span>].toLowerCase().slice(<span class="d">0</span>, <span class="d">4</span>)<span class="s"> == </span><i>"hsla"</i><span class="s"> && </span>(opacity<span class="s"> = </span>toFloat(values[<span class="d">3</span>]));
+</code><code id="L769"><span class="ln">769</span> values[<span class="d">3</span>]<span class="s"> && </span>values[<span class="d">3</span>].slice(-<span class="d">1</span>)<span class="s"> == </span><i>"%"</i><span class="s"> && </span>(opacity /= <span class="d">100</span>);
+</code><code id="L770"><span class="ln">770</span> <b>return</b> R.hsl2rgb(red, green, blue, opacity);
+</code><code id="L771"><span class="ln">771</span> }
+</code><code id="L772"><span class="ln">772</span> rgb<span class="s"> = </span>{r: red, g: green, b: blue};
+</code><code id="L773"><span class="ln">773</span> rgb.hex<span class="s"> = </span><i>"#"</i><span class="s"> + </span>(<span class="d">16777216</span><span class="s"> | </span>blue<span class="s"> | </span>(green << <span class="d">8</span>)<span class="s"> | </span>(red << <span class="d">16</span>)).toString(<span class="d">16</span>).slice(<span class="d">1</span>);
+</code><code id="L774"><span class="ln">774</span> R.is(opacity, <i>"finite"</i>)<span class="s"> && </span>(rgb.opacity<span class="s"> = </span>opacity);
+</code><code id="L775"><span class="ln">775</span> <b>return</b> rgb;
+</code><code id="L776"><span class="ln">776</span> }
+</code><code id="L777"><span class="ln">777</span> <b>return</b> {r: -<span class="d">1</span>, g: -<span class="d">1</span>, b: -<span class="d">1</span>, hex: <i>"none"</i>, error: <span class="d">1</span>};
+</code><code id="L778"><span class="ln">778</span> }, R);
+</code><code id="L779"><span class="ln">779</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L780"><span class="ln">780</span><span class="c"> <span class="s"> * </span>Raphael.hsb
+</span></code><code id="L781"><span class="ln">781</span><span class="c"> [ method ]
+</span></code><code id="L782"><span class="ln">782</span><span class="c"> **
+</span></code><code id="L783"><span class="ln">783</span><span class="c"> <span class="s"> * </span>Converts HSB values to hex representation of the colour.
+</span></code><code id="L784"><span class="ln">784</span><span class="c"> > Parameters
+</span></code><code id="L785"><span class="ln">785</span><span class="c"> <span class="s"> - </span>h (number) hue
+</span></code><code id="L786"><span class="ln">786</span><span class="c"> <span class="s"> - </span>s (number) saturation
+</span></code><code id="L787"><span class="ln">787</span><span class="c"> <span class="s"> - </span>b (number) value or brightness
+</span></code><code id="L788"><span class="ln">788</span><span class="c"> <span class="s"> = </span>(string) hex representation of the colour.
+</span></code><code id="L789"><span class="ln">789</span><span class="c"> \*/</span>
+</code><code id="L790"><span class="ln">790</span> R.hsb<span class="s"> = </span>cacher(<b>function</b> (h, s, b) {
+</code><code id="L791"><span class="ln">791</span> <b>return</b> R.hsb2rgb(h, s, b).hex;
+</code><code id="L792"><span class="ln">792</span> });
+</code><code id="L793"><span class="ln">793</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L794"><span class="ln">794</span><span class="c"> <span class="s"> * </span>Raphael.hsl
+</span></code><code id="L795"><span class="ln">795</span><span class="c"> [ method ]
+</span></code><code id="L796"><span class="ln">796</span><span class="c"> **
+</span></code><code id="L797"><span class="ln">797</span><span class="c"> <span class="s"> * </span>Converts HSL values to hex representation of the colour.
+</span></code><code id="L798"><span class="ln">798</span><span class="c"> > Parameters
+</span></code><code id="L799"><span class="ln">799</span><span class="c"> <span class="s"> - </span>h (number) hue
+</span></code><code id="L800"><span class="ln">800</span><span class="c"> <span class="s"> - </span>s (number) saturation
+</span></code><code id="L801"><span class="ln">801</span><span class="c"> <span class="s"> - </span>l (number) luminosity
+</span></code><code id="L802"><span class="ln">802</span><span class="c"> <span class="s"> = </span>(string) hex representation of the colour.
+</span></code><code id="L803"><span class="ln">803</span><span class="c"> \*/</span>
+</code><code id="L804"><span class="ln">804</span> R.hsl<span class="s"> = </span>cacher(<b>function</b> (h, s, l) {
+</code><code id="L805"><span class="ln">805</span> <b>return</b> R.hsl2rgb(h, s, l).hex;
+</code><code id="L806"><span class="ln">806</span> });
+</code><code id="L807"><span class="ln">807</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L808"><span class="ln">808</span><span class="c"> <span class="s"> * </span>Raphael.rgb
+</span></code><code id="L809"><span class="ln">809</span><span class="c"> [ method ]
+</span></code><code id="L810"><span class="ln">810</span><span class="c"> **
+</span></code><code id="L811"><span class="ln">811</span><span class="c"> <span class="s"> * </span>Converts RGB values to hex representation of the colour.
+</span></code><code id="L812"><span class="ln">812</span><span class="c"> > Parameters
+</span></code><code id="L813"><span class="ln">813</span><span class="c"> <span class="s"> - </span>r (number) red
+</span></code><code id="L814"><span class="ln">814</span><span class="c"> <span class="s"> - </span>g (number) green
+</span></code><code id="L815"><span class="ln">815</span><span class="c"> <span class="s"> - </span>b (number) blue
+</span></code><code id="L816"><span class="ln">816</span><span class="c"> <span class="s"> = </span>(string) hex representation of the colour.
+</span></code><code id="L817"><span class="ln">817</span><span class="c"> \*/</span>
+</code><code id="L818"><span class="ln">818</span> R.rgb<span class="s"> = </span>cacher(<b>function</b> (r, g, b) {
+</code><code id="L819"><span class="ln">819</span> <b>return</b> <i>"#"</i><span class="s"> + </span>(<span class="d">16777216</span><span class="s"> | </span>b<span class="s"> | </span>(g << <span class="d">8</span>)<span class="s"> | </span>(r << <span class="d">16</span>)).toString(<span class="d">16</span>).slice(<span class="d">1</span>);
+</code><code id="L820"><span class="ln">820</span> });
+</code><code id="L821"><span class="ln">821</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L822"><span class="ln">822</span><span class="c"> <span class="s"> * </span>Raphael.getColor
+</span></code><code id="L823"><span class="ln">823</span><span class="c"> [ method ]
+</span></code><code id="L824"><span class="ln">824</span><span class="c"> **
+</span></code><code id="L825"><span class="ln">825</span><span class="c"> <span class="s"> * </span>On each call returns next colour <b>in</b> the spectrum. To reset it back to red call @Raphael.getColor.reset
+</span></code><code id="L826"><span class="ln">826</span><span class="c"> > Parameters
+</span></code><code id="L827"><span class="ln">827</span><span class="c"> <span class="s"> - </span>value (number) #optional brightness, <b>default</b> is `<span class="d">0.75</span>`
+</span></code><code id="L828"><span class="ln">828</span><span class="c"> <span class="s"> = </span>(string) hex representation of the colour.
+</span></code><code id="L829"><span class="ln">829</span><span class="c"> \*/</span>
+</code><code id="L830"><span class="ln">830</span> R.getColor<span class="s"> = </span><b>function</b> (value) {
+</code><code id="L831"><span class="ln">831</span> <b>var</b> start<span class="s"> = </span><b>this</b>.getColor.start<span class="s"> = </span><b>this</b>.getColor.start<span class="s"> || </span>{h: <span class="d">0</span>, s: <span class="d">1</span>, b: value<span class="s"> || </span><span class="d">.75</span>},
+</code><code id="L832"><span class="ln">832</span> rgb<span class="s"> = </span><b>this</b>.hsb2rgb(start.h, start.s, start.b);
+</code><code id="L833"><span class="ln">833</span> start.h += <span class="d">.075</span>;
+</code><code id="L834"><span class="ln">834</span> <b>if</b> (start.h > <span class="d">1</span>) {
+</code><code id="L835"><span class="ln">835</span> start.h<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L836"><span class="ln">836</span> start.s -= <span class="d">.2</span>;
+</code><code id="L837"><span class="ln">837</span> start.s <= <span class="d">0</span><span class="s"> && </span>(<b>this</b>.getColor.start<span class="s"> = </span>{h: <span class="d">0</span>, s: <span class="d">1</span>, b: start.b});
+</code><code id="L838"><span class="ln">838</span> }
+</code><code id="L839"><span class="ln">839</span> <b>return</b> rgb.hex;
+</code><code id="L840"><span class="ln">840</span> };
+</code><code id="L841"><span class="ln">841</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L842"><span class="ln">842</span><span class="c"> <span class="s"> * </span>Raphael.getColor.reset
+</span></code><code id="L843"><span class="ln">843</span><span class="c"> [ method ]
+</span></code><code id="L844"><span class="ln">844</span><span class="c"> **
+</span></code><code id="L845"><span class="ln">845</span><span class="c"> <span class="s"> * </span>Resets spectrum position <b>for</b> @Raphael.getColor back to red.
+</span></code><code id="L846"><span class="ln">846</span><span class="c"> \*/</span>
+</code><code id="L847"><span class="ln">847</span> R.getColor.reset<span class="s"> = </span><b>function</b> () {
+</code><code id="L848"><span class="ln">848</span> <b>delete</b> <b>this</b>.start;
+</code><code id="L849"><span class="ln">849</span> };
+</code><code id="L850"><span class="ln">850</span>
+</code><code id="L851"><span class="ln">851</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L852"><span class="ln">852</span><span class="c"> <span class="s"> * </span>Raphael.parsePathString
+</span></code><code id="L853"><span class="ln">853</span><span class="c"> [ method ]
+</span></code><code id="L854"><span class="ln">854</span><span class="c"> **
+</span></code><code id="L855"><span class="ln">855</span><span class="c"> <span class="s"> * </span>Utility method
+</span></code><code id="L856"><span class="ln">856</span><span class="c"> **
+</span></code><code id="L857"><span class="ln">857</span><span class="c"> <span class="s"> * </span>Parses given path string into an array of arrays of path segments.
+</span></code><code id="L858"><span class="ln">858</span><span class="c"> > Parameters
+</span></code><code id="L859"><span class="ln">859</span><span class="c"> <span class="s"> - </span>pathString (string|array) path string or array of segments (<b>in</b> the last <b>case</b> it will be returned straight away)
+</span></code><code id="L860"><span class="ln">860</span><span class="c"> <span class="s"> = </span>(array) array of segments.
+</span></code><code id="L861"><span class="ln">861</span><span class="c"> \*/</span>
+</code><code id="L862"><span class="ln">862</span> R.parsePathString<span class="s"> = </span>cacher(<b>function</b> (pathString) {
+</code><code id="L863"><span class="ln">863</span> <b>if</b> (!pathString) {
+</code><code id="L864"><span class="ln">864</span> <b>return</b> <b>null</b>;
+</code><code id="L865"><span class="ln">865</span> }
+</code><code id="L866"><span class="ln">866</span> <b>var</b> paramCounts<span class="s"> = </span>{a: <span class="d">7</span>, c: <span class="d">6</span>, h: <span class="d">1</span>, l: <span class="d">2</span>, m: <span class="d">2</span>, q: <span class="d">4</span>, s: <span class="d">4</span>, t: <span class="d">2</span>, v: <span class="d">1</span>, z: <span class="d">0</span>},
+</code><code id="L867"><span class="ln">867</span> data<span class="s"> = </span>[];
+</code><code id="L868"><span class="ln">868</span> <b>if</b> (R.is(pathString, array)<span class="s"> && </span>R.is(pathString[<span class="d">0</span>], array)) { <span class="c">// rough assumption</span>
+</code><code id="L869"><span class="ln">869</span> data<span class="s"> = </span>pathClone(pathString);
+</code><code id="L870"><span class="ln">870</span> }
+</code><code id="L871"><span class="ln">871</span> <b>if</b> (!data.length) {
+</code><code id="L872"><span class="ln">872</span> Str(pathString).replace(pathCommand, <b>function</b> (a, b, c) {
+</code><code id="L873"><span class="ln">873</span> <b>var</b> params<span class="s"> = </span>[],
+</code><code id="L874"><span class="ln">874</span> name<span class="s"> = </span>lowerCase.call(b);
+</code><code id="L875"><span class="ln">875</span> c.replace(pathValues, <b>function</b> (a, b) {
+</code><code id="L876"><span class="ln">876</span> b<span class="s"> && </span>params.push(+b);
+</code><code id="L877"><span class="ln">877</span> });
+</code><code id="L878"><span class="ln">878</span> <b>if</b> (name<span class="s"> == </span><i>"m"</i><span class="s"> && </span>params.length > <span class="d">2</span>) {
+</code><code id="L879"><span class="ln">879</span> data.push([b][concat](params.splice(<span class="d">0</span>, <span class="d">2</span>)));
+</code><code id="L880"><span class="ln">880</span> name<span class="s"> = </span><i>"l"</i>;
+</code><code id="L881"><span class="ln">881</span> b<span class="s"> = </span>b<span class="s"> == </span><i>"m"</i> ? <i>"l"</i> : <i>"L"</i>;
+</code><code id="L882"><span class="ln">882</span> }
+</code><code id="L883"><span class="ln">883</span> <b>while</b> (params.length >= paramCounts[name]) {
+</code><code id="L884"><span class="ln">884</span> data.push([b][concat](params.splice(<span class="d">0</span>, paramCounts[name])));
+</code><code id="L885"><span class="ln">885</span> <b>if</b> (!paramCounts[name]) {
+</code><code id="L886"><span class="ln">886</span> <b>break</b>;
+</code><code id="L887"><span class="ln">887</span> }
+</code><code id="L888"><span class="ln">888</span> }
+</code><code id="L889"><span class="ln">889</span> });
+</code><code id="L890"><span class="ln">890</span> }
+</code><code id="L891"><span class="ln">891</span> data.toString<span class="s"> = </span>R._path2string;
+</code><code id="L892"><span class="ln">892</span> <b>return</b> data;
+</code><code id="L893"><span class="ln">893</span> });
+</code><code id="L894"><span class="ln">894</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L895"><span class="ln">895</span><span class="c"> <span class="s"> * </span>Raphael.parseTransformString
+</span></code><code id="L896"><span class="ln">896</span><span class="c"> [ method ]
+</span></code><code id="L897"><span class="ln">897</span><span class="c"> **
+</span></code><code id="L898"><span class="ln">898</span><span class="c"> <span class="s"> * </span>Utility method
+</span></code><code id="L899"><span class="ln">899</span><span class="c"> **
+</span></code><code id="L900"><span class="ln">900</span><span class="c"> <span class="s"> * </span>Parses given path string into an array of transformations.
+</span></code><code id="L901"><span class="ln">901</span><span class="c"> > Parameters
+</span></code><code id="L902"><span class="ln">902</span><span class="c"> <span class="s"> - </span>TString (string|array) transform string or array of transformations (<b>in</b> the last <b>case</b> it will be returned straight away)
+</span></code><code id="L903"><span class="ln">903</span><span class="c"> <span class="s"> = </span>(array) array of transformations.
+</span></code><code id="L904"><span class="ln">904</span><span class="c"> \*/</span>
+</code><code id="L905"><span class="ln">905</span> R.parseTransformString<span class="s"> = </span>cacher(<b>function</b> (TString) {
+</code><code id="L906"><span class="ln">906</span> <b>if</b> (!TString) {
+</code><code id="L907"><span class="ln">907</span> <b>return</b> <b>null</b>;
+</code><code id="L908"><span class="ln">908</span> }
+</code><code id="L909"><span class="ln">909</span> <b>var</b> paramCounts<span class="s"> = </span>{r: <span class="d">3</span>, s: <span class="d">4</span>, t: <span class="d">2</span>, m: <span class="d">6</span>},
+</code><code id="L910"><span class="ln">910</span> data<span class="s"> = </span>[];
+</code><code id="L911"><span class="ln">911</span> <b>if</b> (R.is(TString, array)<span class="s"> && </span>R.is(TString[<span class="d">0</span>], array)) { <span class="c">// rough assumption</span>
+</code><code id="L912"><span class="ln">912</span> data<span class="s"> = </span>pathClone(TString);
+</code><code id="L913"><span class="ln">913</span> }
+</code><code id="L914"><span class="ln">914</span> <b>if</b> (!data.length) {
+</code><code id="L915"><span class="ln">915</span> Str(TString).replace(tCommand, <b>function</b> (a, b, c) {
+</code><code id="L916"><span class="ln">916</span> <b>var</b> params<span class="s"> = </span>[],
+</code><code id="L917"><span class="ln">917</span> name<span class="s"> = </span>lowerCase.call(b);
+</code><code id="L918"><span class="ln">918</span> c.replace(pathValues, <b>function</b> (a, b) {
+</code><code id="L919"><span class="ln">919</span> b<span class="s"> && </span>params.push(+b);
+</code><code id="L920"><span class="ln">920</span> });
+</code><code id="L921"><span class="ln">921</span> data.push([name][concat](params));
+</code><code id="L922"><span class="ln">922</span> });
+</code><code id="L923"><span class="ln">923</span> }
+</code><code id="L924"><span class="ln">924</span> data.toString<span class="s"> = </span>R._path2string;
+</code><code id="L925"><span class="ln">925</span> <b>return</b> data;
+</code><code id="L926"><span class="ln">926</span> });
+</code><code id="L927"><span class="ln">927</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L928"><span class="ln">928</span><span class="c"> <span class="s"> * </span>Raphael.findDotsAtSegment
+</span></code><code id="L929"><span class="ln">929</span><span class="c"> [ method ]
+</span></code><code id="L930"><span class="ln">930</span><span class="c"> **
+</span></code><code id="L931"><span class="ln">931</span><span class="c"> <span class="s"> * </span>Utility method
+</span></code><code id="L932"><span class="ln">932</span><span class="c"> **
+</span></code><code id="L933"><span class="ln">933</span><span class="c"> <span class="s"> * </span>Find dot coordinates on the given cubic bezier curve at the given t.
+</span></code><code id="L934"><span class="ln">934</span><span class="c"> > Parameters
+</span></code><code id="L935"><span class="ln">935</span><span class="c"> <span class="s"> - </span>p1x (number) x of the first point of the curve
+</span></code><code id="L936"><span class="ln">936</span><span class="c"> <span class="s"> - </span>p1y (number) y of the first point of the curve
+</span></code><code id="L937"><span class="ln">937</span><span class="c"> <span class="s"> - </span>c1x (number) x of the first anchor of the curve
+</span></code><code id="L938"><span class="ln">938</span><span class="c"> <span class="s"> - </span>c1y (number) y of the first anchor of the curve
+</span></code><code id="L939"><span class="ln">939</span><span class="c"> <span class="s"> - </span>c2x (number) x of the second anchor of the curve
+</span></code><code id="L940"><span class="ln">940</span><span class="c"> <span class="s"> - </span>c2y (number) y of the second anchor of the curve
+</span></code><code id="L941"><span class="ln">941</span><span class="c"> <span class="s"> - </span>p2x (number) x of the second point of the curve
+</span></code><code id="L942"><span class="ln">942</span><span class="c"> <span class="s"> - </span>p2y (number) y of the second point of the curve
+</span></code><code id="L943"><span class="ln">943</span><span class="c"> <span class="s"> - </span>t (number) position on the curve (<span class="d">0</span>.<span class="d">.1</span>)
+</span></code><code id="L944"><span class="ln">944</span><span class="c"> <span class="s"> = </span>(object) point information <b>in</b> format:
+</span></code><code id="L945"><span class="ln">945</span><span class="c"> o {
+</span></code><code id="L946"><span class="ln">946</span><span class="c"> o x: (number) x coordinate of the point
+</span></code><code id="L947"><span class="ln">947</span><span class="c"> o y: (number) y coordinate of the point
+</span></code><code id="L948"><span class="ln">948</span><span class="c"> o m: {
+</span></code><code id="L949"><span class="ln">949</span><span class="c"> o x: (number) x coordinate of the left anchor
+</span></code><code id="L950"><span class="ln">950</span><span class="c"> o y: (number) y coordinate of the left anchor
+</span></code><code id="L951"><span class="ln">951</span><span class="c"> o }
+</span></code><code id="L952"><span class="ln">952</span><span class="c"> o n: {
+</span></code><code id="L953"><span class="ln">953</span><span class="c"> o x: (number) x coordinate of the right anchor
+</span></code><code id="L954"><span class="ln">954</span><span class="c"> o y: (number) y coordinate of the right anchor
+</span></code><code id="L955"><span class="ln">955</span><span class="c"> o }
+</span></code><code id="L956"><span class="ln">956</span><span class="c"> o start: {
+</span></code><code id="L957"><span class="ln">957</span><span class="c"> o x: (number) x coordinate of the start of the curve
+</span></code><code id="L958"><span class="ln">958</span><span class="c"> o y: (number) y coordinate of the start of the curve
+</span></code><code id="L959"><span class="ln">959</span><span class="c"> o }
+</span></code><code id="L960"><span class="ln">960</span><span class="c"> o end: {
+</span></code><code id="L961"><span class="ln">961</span><span class="c"> o x: (number) x coordinate of the end of the curve
+</span></code><code id="L962"><span class="ln">962</span><span class="c"> o y: (number) y coordinate of the end of the curve
+</span></code><code id="L963"><span class="ln">963</span><span class="c"> o }
+</span></code><code id="L964"><span class="ln">964</span><span class="c"> o alpha: (number) angle of the curve derivative at the point
+</span></code><code id="L965"><span class="ln">965</span><span class="c"> o }
+</span></code><code id="L966"><span class="ln">966</span><span class="c"> \*/</span>
+</code><code id="L967"><span class="ln">967</span> R.findDotsAtSegment<span class="s"> = </span><b>function</b> (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
+</code><code id="L968"><span class="ln">968</span> <b>var</b> t1<span class="s"> = </span><span class="d">1</span><span class="s"> - </span>t,
+</code><code id="L969"><span class="ln">969</span> x<span class="s"> = </span>pow(t1, <span class="d">3</span>)<span class="s"> * </span>p1x<span class="s"> + </span>pow(t1, <span class="d">2</span>)<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>c1x<span class="s"> + </span>t1<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>t<span class="s"> * </span>c2x<span class="s"> + </span>pow(t, <span class="d">3</span>)<span class="s"> * </span>p2x,
+</code><code id="L970"><span class="ln">970</span> y<span class="s"> = </span>pow(t1, <span class="d">3</span>)<span class="s"> * </span>p1y<span class="s"> + </span>pow(t1, <span class="d">2</span>)<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>c1y<span class="s"> + </span>t1<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>t<span class="s"> * </span>c2y<span class="s"> + </span>pow(t, <span class="d">3</span>)<span class="s"> * </span>p2y,
+</code><code id="L971"><span class="ln">971</span> mx<span class="s"> = </span>p1x<span class="s"> + </span><span class="d">2</span><span class="s"> * </span>t<span class="s"> * </span>(c1x<span class="s"> - </span>p1x)<span class="s"> + </span>t<span class="s"> * </span>t<span class="s"> * </span>(c2x<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>c1x<span class="s"> + </span>p1x),
+</code><code id="L972"><span class="ln">972</span> my<span class="s"> = </span>p1y<span class="s"> + </span><span class="d">2</span><span class="s"> * </span>t<span class="s"> * </span>(c1y<span class="s"> - </span>p1y)<span class="s"> + </span>t<span class="s"> * </span>t<span class="s"> * </span>(c2y<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>c1y<span class="s"> + </span>p1y),
+</code><code id="L973"><span class="ln">973</span> nx<span class="s"> = </span>c1x<span class="s"> + </span><span class="d">2</span><span class="s"> * </span>t<span class="s"> * </span>(c2x<span class="s"> - </span>c1x)<span class="s"> + </span>t<span class="s"> * </span>t<span class="s"> * </span>(p2x<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>c2x<span class="s"> + </span>c1x),
+</code><code id="L974"><span class="ln">974</span> ny<span class="s"> = </span>c1y<span class="s"> + </span><span class="d">2</span><span class="s"> * </span>t<span class="s"> * </span>(c2y<span class="s"> - </span>c1y)<span class="s"> + </span>t<span class="s"> * </span>t<span class="s"> * </span>(p2y<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>c2y<span class="s"> + </span>c1y),
+</code><code id="L975"><span class="ln">975</span> ax<span class="s"> = </span>(<span class="d">1</span><span class="s"> - </span>t)<span class="s"> * </span>p1x<span class="s"> + </span>t<span class="s"> * </span>c1x,
+</code><code id="L976"><span class="ln">976</span> ay<span class="s"> = </span>(<span class="d">1</span><span class="s"> - </span>t)<span class="s"> * </span>p1y<span class="s"> + </span>t<span class="s"> * </span>c1y,
+</code><code id="L977"><span class="ln">977</span> cx<span class="s"> = </span>(<span class="d">1</span><span class="s"> - </span>t)<span class="s"> * </span>c2x<span class="s"> + </span>t<span class="s"> * </span>p2x,
+</code><code id="L978"><span class="ln">978</span> cy<span class="s"> = </span>(<span class="d">1</span><span class="s"> - </span>t)<span class="s"> * </span>c2y<span class="s"> + </span>t<span class="s"> * </span>p2y,
+</code><code id="L979"><span class="ln">979</span> alpha<span class="s"> = </span>(<span class="d">90</span><span class="s"> - </span>math.atan2(mx<span class="s"> - </span>nx, my<span class="s"> - </span>ny)<span class="s"> * </span><span class="d">180</span><span class="s"> / </span>PI);
+</code><code id="L980"><span class="ln">980</span> (mx > nx<span class="s"> || </span>my < ny)<span class="s"> && </span>(alpha += <span class="d">180</span>);
+</code><code id="L981"><span class="ln">981</span> <b>return</b> {x: x, y: y, m: {x: mx, y: my}, n: {x: nx, y: ny}, start: {x: ax, y: ay}, end: {x: cx, y: cy}, alpha: alpha};
+</code><code id="L982"><span class="ln">982</span> };
+</code><code id="L983"><span class="ln">983</span> <b>var</b> pathDimensions<span class="s"> = </span>cacher(<b>function</b> (path) {
+</code><code id="L984"><span class="ln">984</span> <b>if</b> (!path) {
+</code><code id="L985"><span class="ln">985</span> <b>return</b> {x: <span class="d">0</span>, y: <span class="d">0</span>, width: <span class="d">0</span>, height: <span class="d">0</span>};
+</code><code id="L986"><span class="ln">986</span> }
+</code><code id="L987"><span class="ln">987</span> path<span class="s"> = </span>path2curve(path);
+</code><code id="L988"><span class="ln">988</span> <b>var</b> x<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L989"><span class="ln">989</span> y<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L990"><span class="ln">990</span> X<span class="s"> = </span>[],
+</code><code id="L991"><span class="ln">991</span> Y<span class="s"> = </span>[],
+</code><code id="L992"><span class="ln">992</span> p;
+</code><code id="L993"><span class="ln">993</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>path.length; i < ii; i++) {
+</code><code id="L994"><span class="ln">994</span> p<span class="s"> = </span>path[i];
+</code><code id="L995"><span class="ln">995</span> <b>if</b> (p[<span class="d">0</span>]<span class="s"> == </span><i>"M"</i>) {
+</code><code id="L996"><span class="ln">996</span> x<span class="s"> = </span>p[<span class="d">1</span>];
+</code><code id="L997"><span class="ln">997</span> y<span class="s"> = </span>p[<span class="d">2</span>];
+</code><code id="L998"><span class="ln">998</span> X.push(x);
+</code><code id="L999"><span class="ln">999</span> Y.push(y);
+</code><code id="L1000"><span class="ln">1000</span> } <b>else</b> {
+</code><code id="L1001"><span class="ln">1001</span> <b>var</b> dim<span class="s"> = </span>curveDim(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>]);
+</code><code id="L1002"><span class="ln">1002</span> X<span class="s"> = </span>X[concat](dim.min.x, dim.max.x);
+</code><code id="L1003"><span class="ln">1003</span> Y<span class="s"> = </span>Y[concat](dim.min.y, dim.max.y);
+</code><code id="L1004"><span class="ln">1004</span> x<span class="s"> = </span>p[<span class="d">5</span>];
+</code><code id="L1005"><span class="ln">1005</span> y<span class="s"> = </span>p[<span class="d">6</span>];
+</code><code id="L1006"><span class="ln">1006</span> }
+</code><code id="L1007"><span class="ln">1007</span> }
+</code><code id="L1008"><span class="ln">1008</span> <b>var</b> xmin<span class="s"> = </span>mmin[apply](<span class="d">0</span>, X),
+</code><code id="L1009"><span class="ln">1009</span> ymin<span class="s"> = </span>mmin[apply](<span class="d">0</span>, Y);
+</code><code id="L1010"><span class="ln">1010</span> <b>return</b> {
+</code><code id="L1011"><span class="ln">1011</span> x: xmin,
+</code><code id="L1012"><span class="ln">1012</span> y: ymin,
+</code><code id="L1013"><span class="ln">1013</span> width: mmax[apply](<span class="d">0</span>, X)<span class="s"> - </span>xmin,
+</code><code id="L1014"><span class="ln">1014</span> height: mmax[apply](<span class="d">0</span>, Y)<span class="s"> - </span>ymin
+</code><code id="L1015"><span class="ln">1015</span> };
+</code><code id="L1016"><span class="ln">1016</span> }),
+</code><code id="L1017"><span class="ln">1017</span> pathClone<span class="s"> = </span><b>function</b> (pathArray) {
+</code><code id="L1018"><span class="ln">1018</span> <b>var</b> res<span class="s"> = </span>[];
+</code><code id="L1019"><span class="ln">1019</span> <b>if</b> (!R.is(pathArray, array)<span class="s"> || </span>!R.is(pathArray<span class="s"> && </span>pathArray[<span class="d">0</span>], array)) { <span class="c">// rough assumption</span>
+</code><code id="L1020"><span class="ln">1020</span> pathArray<span class="s"> = </span>R.parsePathString(pathArray);
+</code><code id="L1021"><span class="ln">1021</span> }
+</code><code id="L1022"><span class="ln">1022</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>pathArray.length; i < ii; i++) {
+</code><code id="L1023"><span class="ln">1023</span> res[i]<span class="s"> = </span>[];
+</code><code id="L1024"><span class="ln">1024</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">0</span>, jj<span class="s"> = </span>pathArray[i].length; j < jj; j++) {
+</code><code id="L1025"><span class="ln">1025</span> res[i][j]<span class="s"> = </span>pathArray[i][j];
+</code><code id="L1026"><span class="ln">1026</span> }
+</code><code id="L1027"><span class="ln">1027</span> }
+</code><code id="L1028"><span class="ln">1028</span> res.toString<span class="s"> = </span>R._path2string;
+</code><code id="L1029"><span class="ln">1029</span> <b>return</b> res;
+</code><code id="L1030"><span class="ln">1030</span> },
+</code><code id="L1031"><span class="ln">1031</span> pathToRelative<span class="s"> = </span>cacher(<b>function</b> (pathArray) {
+</code><code id="L1032"><span class="ln">1032</span> <b>if</b> (!R.is(pathArray, array)<span class="s"> || </span>!R.is(pathArray<span class="s"> && </span>pathArray[<span class="d">0</span>], array)) { <span class="c">// rough assumption</span>
+</code><code id="L1033"><span class="ln">1033</span> pathArray<span class="s"> = </span>R.parsePathString(pathArray);
+</code><code id="L1034"><span class="ln">1034</span> }
+</code><code id="L1035"><span class="ln">1035</span> <b>var</b> res<span class="s"> = </span>[],
+</code><code id="L1036"><span class="ln">1036</span> x<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L1037"><span class="ln">1037</span> y<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L1038"><span class="ln">1038</span> mx<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L1039"><span class="ln">1039</span> my<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L1040"><span class="ln">1040</span> start<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L1041"><span class="ln">1041</span> <b>if</b> (pathArray[<span class="d">0</span>][<span class="d">0</span>]<span class="s"> == </span><i>"M"</i>) {
+</code><code id="L1042"><span class="ln">1042</span> x<span class="s"> = </span>pathArray[<span class="d">0</span>][<span class="d">1</span>];
+</code><code id="L1043"><span class="ln">1043</span> y<span class="s"> = </span>pathArray[<span class="d">0</span>][<span class="d">2</span>];
+</code><code id="L1044"><span class="ln">1044</span> mx<span class="s"> = </span>x;
+</code><code id="L1045"><span class="ln">1045</span> my<span class="s"> = </span>y;
+</code><code id="L1046"><span class="ln">1046</span> start++;
+</code><code id="L1047"><span class="ln">1047</span> res.push([<i>"M"</i>, x, y]);
+</code><code id="L1048"><span class="ln">1048</span> }
+</code><code id="L1049"><span class="ln">1049</span> <b>for</b> (<b>var</b> i<span class="s"> = </span>start, ii<span class="s"> = </span>pathArray.length; i < ii; i++) {
+</code><code id="L1050"><span class="ln">1050</span> <b>var</b> r<span class="s"> = </span>res[i]<span class="s"> = </span>[],
+</code><code id="L1051"><span class="ln">1051</span> pa<span class="s"> = </span>pathArray[i];
+</code><code id="L1052"><span class="ln">1052</span> <b>if</b> (pa[<span class="d">0</span>] != lowerCase.call(pa[<span class="d">0</span>])) {
+</code><code id="L1053"><span class="ln">1053</span> r[<span class="d">0</span>]<span class="s"> = </span>lowerCase.call(pa[<span class="d">0</span>]);
+</code><code id="L1054"><span class="ln">1054</span> <b>switch</b> (r[<span class="d">0</span>]) {
+</code><code id="L1055"><span class="ln">1055</span> <b>case</b> <i>"a"</i>:
+</code><code id="L1056"><span class="ln">1056</span> r[<span class="d">1</span>]<span class="s"> = </span>pa[<span class="d">1</span>];
+</code><code id="L1057"><span class="ln">1057</span> r[<span class="d">2</span>]<span class="s"> = </span>pa[<span class="d">2</span>];
+</code><code id="L1058"><span class="ln">1058</span> r[<span class="d">3</span>]<span class="s"> = </span>pa[<span class="d">3</span>];
+</code><code id="L1059"><span class="ln">1059</span> r[<span class="d">4</span>]<span class="s"> = </span>pa[<span class="d">4</span>];
+</code><code id="L1060"><span class="ln">1060</span> r[<span class="d">5</span>]<span class="s"> = </span>pa[<span class="d">5</span>];
+</code><code id="L1061"><span class="ln">1061</span> r[<span class="d">6</span>]<span class="s"> = </span>+(pa[<span class="d">6</span>]<span class="s"> - </span>x).toFixed(<span class="d">3</span>);
+</code><code id="L1062"><span class="ln">1062</span> r[<span class="d">7</span>]<span class="s"> = </span>+(pa[<span class="d">7</span>]<span class="s"> - </span>y).toFixed(<span class="d">3</span>);
+</code><code id="L1063"><span class="ln">1063</span> <b>break</b>;
+</code><code id="L1064"><span class="ln">1064</span> <b>case</b> <i>"v"</i>:
+</code><code id="L1065"><span class="ln">1065</span> r[<span class="d">1</span>]<span class="s"> = </span>+(pa[<span class="d">1</span>]<span class="s"> - </span>y).toFixed(<span class="d">3</span>);
+</code><code id="L1066"><span class="ln">1066</span> <b>break</b>;
+</code><code id="L1067"><span class="ln">1067</span> <b>case</b> <i>"m"</i>:
+</code><code id="L1068"><span class="ln">1068</span> mx<span class="s"> = </span>pa[<span class="d">1</span>];
+</code><code id="L1069"><span class="ln">1069</span> my<span class="s"> = </span>pa[<span class="d">2</span>];
+</code><code id="L1070"><span class="ln">1070</span> <b>default</b>:
+</code><code id="L1071"><span class="ln">1071</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>pa.length; j < jj; j++) {
+</code><code id="L1072"><span class="ln">1072</span> r[j]<span class="s"> = </span>+(pa[j]<span class="s"> - </span>((j<span class="s"> % </span><span class="d">2</span>) ? x : y)).toFixed(<span class="d">3</span>);
+</code><code id="L1073"><span class="ln">1073</span> }
+</code><code id="L1074"><span class="ln">1074</span> }
+</code><code id="L1075"><span class="ln">1075</span> } <b>else</b> {
+</code><code id="L1076"><span class="ln">1076</span> r<span class="s"> = </span>res[i]<span class="s"> = </span>[];
+</code><code id="L1077"><span class="ln">1077</span> <b>if</b> (pa[<span class="d">0</span>]<span class="s"> == </span><i>"m"</i>) {
+</code><code id="L1078"><span class="ln">1078</span> mx<span class="s"> = </span>pa[<span class="d">1</span>]<span class="s"> + </span>x;
+</code><code id="L1079"><span class="ln">1079</span> my<span class="s"> = </span>pa[<span class="d">2</span>]<span class="s"> + </span>y;
+</code><code id="L1080"><span class="ln">1080</span> }
+</code><code id="L1081"><span class="ln">1081</span> <b>for</b> (<b>var</b> k<span class="s"> = </span><span class="d">0</span>, kk<span class="s"> = </span>pa.length; k < kk; k++) {
+</code><code id="L1082"><span class="ln">1082</span> res[i][k]<span class="s"> = </span>pa[k];
+</code><code id="L1083"><span class="ln">1083</span> }
+</code><code id="L1084"><span class="ln">1084</span> }
+</code><code id="L1085"><span class="ln">1085</span> <b>var</b> len<span class="s"> = </span>res[i].length;
+</code><code id="L1086"><span class="ln">1086</span> <b>switch</b> (res[i][<span class="d">0</span>]) {
+</code><code id="L1087"><span class="ln">1087</span> <b>case</b> <i>"z"</i>:
+</code><code id="L1088"><span class="ln">1088</span> x<span class="s"> = </span>mx;
+</code><code id="L1089"><span class="ln">1089</span> y<span class="s"> = </span>my;
+</code><code id="L1090"><span class="ln">1090</span> <b>break</b>;
+</code><code id="L1091"><span class="ln">1091</span> <b>case</b> <i>"h"</i>:
+</code><code id="L1092"><span class="ln">1092</span> x += +res[i][len<span class="s"> - </span><span class="d">1</span>];
+</code><code id="L1093"><span class="ln">1093</span> <b>break</b>;
+</code><code id="L1094"><span class="ln">1094</span> <b>case</b> <i>"v"</i>:
+</code><code id="L1095"><span class="ln">1095</span> y += +res[i][len<span class="s"> - </span><span class="d">1</span>];
+</code><code id="L1096"><span class="ln">1096</span> <b>break</b>;
+</code><code id="L1097"><span class="ln">1097</span> <b>default</b>:
+</code><code id="L1098"><span class="ln">1098</span> x += +res[i][len<span class="s"> - </span><span class="d">2</span>];
+</code><code id="L1099"><span class="ln">1099</span> y += +res[i][len<span class="s"> - </span><span class="d">1</span>];
+</code><code id="L1100"><span class="ln">1100</span> }
+</code><code id="L1101"><span class="ln">1101</span> }
+</code><code id="L1102"><span class="ln">1102</span> res.toString<span class="s"> = </span>R._path2string;
+</code><code id="L1103"><span class="ln">1103</span> <b>return</b> res;
+</code><code id="L1104"><span class="ln">1104</span> }, <span class="d">0</span>, pathClone),
+</code><code id="L1105"><span class="ln">1105</span> pathToAbsolute<span class="s"> = </span>cacher(<b>function</b> (pathArray) {
+</code><code id="L1106"><span class="ln">1106</span> <b>if</b> (!R.is(pathArray, array)<span class="s"> || </span>!R.is(pathArray<span class="s"> && </span>pathArray[<span class="d">0</span>], array)) { <span class="c">// rough assumption</span>
+</code><code id="L1107"><span class="ln">1107</span> pathArray<span class="s"> = </span>R.parsePathString(pathArray);
+</code><code id="L1108"><span class="ln">1108</span> }
+</code><code id="L1109"><span class="ln">1109</span> <b>var</b> res<span class="s"> = </span>[],
+</code><code id="L1110"><span class="ln">1110</span> x<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L1111"><span class="ln">1111</span> y<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L1112"><span class="ln">1112</span> mx<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L1113"><span class="ln">1113</span> my<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L1114"><span class="ln">1114</span> start<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L1115"><span class="ln">1115</span> <b>if</b> (pathArray[<span class="d">0</span>][<span class="d">0</span>]<span class="s"> == </span><i>"M"</i>) {
+</code><code id="L1116"><span class="ln">1116</span> x<span class="s"> = </span>+pathArray[<span class="d">0</span>][<span class="d">1</span>];
+</code><code id="L1117"><span class="ln">1117</span> y<span class="s"> = </span>+pathArray[<span class="d">0</span>][<span class="d">2</span>];
+</code><code id="L1118"><span class="ln">1118</span> mx<span class="s"> = </span>x;
+</code><code id="L1119"><span class="ln">1119</span> my<span class="s"> = </span>y;
+</code><code id="L1120"><span class="ln">1120</span> start++;
+</code><code id="L1121"><span class="ln">1121</span> res[<span class="d">0</span>]<span class="s"> = </span>[<i>"M"</i>, x, y];
+</code><code id="L1122"><span class="ln">1122</span> }
+</code><code id="L1123"><span class="ln">1123</span> <b>for</b> (<b>var</b> i<span class="s"> = </span>start, ii<span class="s"> = </span>pathArray.length; i < ii; i++) {
+</code><code id="L1124"><span class="ln">1124</span> <b>var</b> r<span class="s"> = </span>res[i]<span class="s"> = </span>[],
+</code><code id="L1125"><span class="ln">1125</span> pa<span class="s"> = </span>pathArray[i];
+</code><code id="L1126"><span class="ln">1126</span> <b>if</b> (pa[<span class="d">0</span>] != upperCase.call(pa[<span class="d">0</span>])) {
+</code><code id="L1127"><span class="ln">1127</span> r[<span class="d">0</span>]<span class="s"> = </span>upperCase.call(pa[<span class="d">0</span>]);
+</code><code id="L1128"><span class="ln">1128</span> <b>switch</b> (r[<span class="d">0</span>]) {
+</code><code id="L1129"><span class="ln">1129</span> <b>case</b> <i>"A"</i>:
+</code><code id="L1130"><span class="ln">1130</span> r[<span class="d">1</span>]<span class="s"> = </span>pa[<span class="d">1</span>];
+</code><code id="L1131"><span class="ln">1131</span> r[<span class="d">2</span>]<span class="s"> = </span>pa[<span class="d">2</span>];
+</code><code id="L1132"><span class="ln">1132</span> r[<span class="d">3</span>]<span class="s"> = </span>pa[<span class="d">3</span>];
+</code><code id="L1133"><span class="ln">1133</span> r[<span class="d">4</span>]<span class="s"> = </span>pa[<span class="d">4</span>];
+</code><code id="L1134"><span class="ln">1134</span> r[<span class="d">5</span>]<span class="s"> = </span>pa[<span class="d">5</span>];
+</code><code id="L1135"><span class="ln">1135</span> r[<span class="d">6</span>]<span class="s"> = </span>+(pa[<span class="d">6</span>]<span class="s"> + </span>x);
+</code><code id="L1136"><span class="ln">1136</span> r[<span class="d">7</span>]<span class="s"> = </span>+(pa[<span class="d">7</span>]<span class="s"> + </span>y);
+</code><code id="L1137"><span class="ln">1137</span> <b>break</b>;
+</code><code id="L1138"><span class="ln">1138</span> <b>case</b> <i>"V"</i>:
+</code><code id="L1139"><span class="ln">1139</span> r[<span class="d">1</span>]<span class="s"> = </span>+pa[<span class="d">1</span>]<span class="s"> + </span>y;
+</code><code id="L1140"><span class="ln">1140</span> <b>break</b>;
+</code><code id="L1141"><span class="ln">1141</span> <b>case</b> <i>"H"</i>:
+</code><code id="L1142"><span class="ln">1142</span> r[<span class="d">1</span>]<span class="s"> = </span>+pa[<span class="d">1</span>]<span class="s"> + </span>x;
+</code><code id="L1143"><span class="ln">1143</span> <b>break</b>;
+</code><code id="L1144"><span class="ln">1144</span> <b>case</b> <i>"M"</i>:
+</code><code id="L1145"><span class="ln">1145</span> mx<span class="s"> = </span>+pa[<span class="d">1</span>]<span class="s"> + </span>x;
+</code><code id="L1146"><span class="ln">1146</span> my<span class="s"> = </span>+pa[<span class="d">2</span>]<span class="s"> + </span>y;
+</code><code id="L1147"><span class="ln">1147</span> <b>default</b>:
+</code><code id="L1148"><span class="ln">1148</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>pa.length; j < jj; j++) {
+</code><code id="L1149"><span class="ln">1149</span> r[j]<span class="s"> = </span>+pa[j]<span class="s"> + </span>((j<span class="s"> % </span><span class="d">2</span>) ? x : y);
+</code><code id="L1150"><span class="ln">1150</span> }
+</code><code id="L1151"><span class="ln">1151</span> }
+</code><code id="L1152"><span class="ln">1152</span> } <b>else</b> {
+</code><code id="L1153"><span class="ln">1153</span> <b>for</b> (<b>var</b> k<span class="s"> = </span><span class="d">0</span>, kk<span class="s"> = </span>pa.length; k < kk; k++) {
+</code><code id="L1154"><span class="ln">1154</span> res[i][k]<span class="s"> = </span>pa[k];
+</code><code id="L1155"><span class="ln">1155</span> }
+</code><code id="L1156"><span class="ln">1156</span> }
+</code><code id="L1157"><span class="ln">1157</span> <b>switch</b> (r[<span class="d">0</span>]) {
+</code><code id="L1158"><span class="ln">1158</span> <b>case</b> <i>"Z"</i>:
+</code><code id="L1159"><span class="ln">1159</span> x<span class="s"> = </span>mx;
+</code><code id="L1160"><span class="ln">1160</span> y<span class="s"> = </span>my;
+</code><code id="L1161"><span class="ln">1161</span> <b>break</b>;
+</code><code id="L1162"><span class="ln">1162</span> <b>case</b> <i>"H"</i>:
+</code><code id="L1163"><span class="ln">1163</span> x<span class="s"> = </span>r[<span class="d">1</span>];
+</code><code id="L1164"><span class="ln">1164</span> <b>break</b>;
+</code><code id="L1165"><span class="ln">1165</span> <b>case</b> <i>"V"</i>:
+</code><code id="L1166"><span class="ln">1166</span> y<span class="s"> = </span>r[<span class="d">1</span>];
+</code><code id="L1167"><span class="ln">1167</span> <b>break</b>;
+</code><code id="L1168"><span class="ln">1168</span> <b>case</b> <i>"M"</i>:
+</code><code id="L1169"><span class="ln">1169</span> mx<span class="s"> = </span>res[i][res[i].length<span class="s"> - </span><span class="d">2</span>];
+</code><code id="L1170"><span class="ln">1170</span> my<span class="s"> = </span>res[i][res[i].length<span class="s"> - </span><span class="d">1</span>];
+</code><code id="L1171"><span class="ln">1171</span> <b>default</b>:
+</code><code id="L1172"><span class="ln">1172</span> x<span class="s"> = </span>res[i][res[i].length<span class="s"> - </span><span class="d">2</span>];
+</code><code id="L1173"><span class="ln">1173</span> y<span class="s"> = </span>res[i][res[i].length<span class="s"> - </span><span class="d">1</span>];
+</code><code id="L1174"><span class="ln">1174</span> }
+</code><code id="L1175"><span class="ln">1175</span> }
+</code><code id="L1176"><span class="ln">1176</span> res.toString<span class="s"> = </span>R._path2string;
+</code><code id="L1177"><span class="ln">1177</span> <b>return</b> res;
+</code><code id="L1178"><span class="ln">1178</span> }, <b>null</b>, pathClone),
+</code><code id="L1179"><span class="ln">1179</span> l2c<span class="s"> = </span><b>function</b> (x1, y1, x2, y2) {
+</code><code id="L1180"><span class="ln">1180</span> <b>return</b> [x1, y1, x2, y2, x2, y2];
+</code><code id="L1181"><span class="ln">1181</span> },
+</code><code id="L1182"><span class="ln">1182</span> q2c<span class="s"> = </span><b>function</b> (x1, y1, ax, ay, x2, y2) {
+</code><code id="L1183"><span class="ln">1183</span> <b>var</b> _13<span class="s"> = </span><span class="d">1</span><span class="s"> / </span><span class="d">3</span>,
+</code><code id="L1184"><span class="ln">1184</span> _23<span class="s"> = </span><span class="d">2</span><span class="s"> / </span><span class="d">3</span>;
+</code><code id="L1185"><span class="ln">1185</span> <b>return</b> [
+</code><code id="L1186"><span class="ln">1186</span> _13<span class="s"> * </span>x1<span class="s"> + </span>_23<span class="s"> * </span>ax,
+</code><code id="L1187"><span class="ln">1187</span> _13<span class="s"> * </span>y1<span class="s"> + </span>_23<span class="s"> * </span>ay,
+</code><code id="L1188"><span class="ln">1188</span> _13<span class="s"> * </span>x2<span class="s"> + </span>_23<span class="s"> * </span>ax,
+</code><code id="L1189"><span class="ln">1189</span> _13<span class="s"> * </span>y2<span class="s"> + </span>_23<span class="s"> * </span>ay,
+</code><code id="L1190"><span class="ln">1190</span> x2,
+</code><code id="L1191"><span class="ln">1191</span> y2
+</code><code id="L1192"><span class="ln">1192</span> ];
+</code><code id="L1193"><span class="ln">1193</span> },
+</code><code id="L1194"><span class="ln">1194</span> a2c<span class="s"> = </span><b>function</b> (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {
+</code><code id="L1195"><span class="ln">1195</span> <span class="c">// <b>for</b> more information of where <b>this</b> math came from visit:</span>
+</code><code id="L1196"><span class="ln">1196</span> <span class="c">// http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes</span>
+</code><code id="L1197"><span class="ln">1197</span> <b>var</b> _120<span class="s"> = </span>PI<span class="s"> * </span><span class="d">120</span><span class="s"> / </span><span class="d">180</span>,
+</code><code id="L1198"><span class="ln">1198</span> rad<span class="s"> = </span>PI<span class="s"> / </span><span class="d">180</span><span class="s"> * </span>(+angle<span class="s"> || </span><span class="d">0</span>),
+</code><code id="L1199"><span class="ln">1199</span> res<span class="s"> = </span>[],
+</code><code id="L1200"><span class="ln">1200</span> xy,
+</code><code id="L1201"><span class="ln">1201</span> rotate<span class="s"> = </span>cacher(<b>function</b> (x, y, rad) {
+</code><code id="L1202"><span class="ln">1202</span> <b>var</b> X<span class="s"> = </span>x<span class="s"> * </span>math.cos(rad)<span class="s"> - </span>y<span class="s"> * </span>math.sin(rad),
+</code><code id="L1203"><span class="ln">1203</span> Y<span class="s"> = </span>x<span class="s"> * </span>math.sin(rad)<span class="s"> + </span>y<span class="s"> * </span>math.cos(rad);
+</code><code id="L1204"><span class="ln">1204</span> <b>return</b> {x: X, y: Y};
+</code><code id="L1205"><span class="ln">1205</span> });
+</code><code id="L1206"><span class="ln">1206</span> <b>if</b> (!recursive) {
+</code><code id="L1207"><span class="ln">1207</span> xy<span class="s"> = </span>rotate(x1, y1, -rad);
+</code><code id="L1208"><span class="ln">1208</span> x1<span class="s"> = </span>xy.x;
+</code><code id="L1209"><span class="ln">1209</span> y1<span class="s"> = </span>xy.y;
+</code><code id="L1210"><span class="ln">1210</span> xy<span class="s"> = </span>rotate(x2, y2, -rad);
+</code><code id="L1211"><span class="ln">1211</span> x2<span class="s"> = </span>xy.x;
+</code><code id="L1212"><span class="ln">1212</span> y2<span class="s"> = </span>xy.y;
+</code><code id="L1213"><span class="ln">1213</span> <b>var</b> cos<span class="s"> = </span>math.cos(PI<span class="s"> / </span><span class="d">180</span><span class="s"> * </span>angle),
+</code><code id="L1214"><span class="ln">1214</span> sin<span class="s"> = </span>math.sin(PI<span class="s"> / </span><span class="d">180</span><span class="s"> * </span>angle),
+</code><code id="L1215"><span class="ln">1215</span> x<span class="s"> = </span>(x1<span class="s"> - </span>x2)<span class="s"> / </span><span class="d">2</span>,
+</code><code id="L1216"><span class="ln">1216</span> y<span class="s"> = </span>(y1<span class="s"> - </span>y2)<span class="s"> / </span><span class="d">2</span>;
+</code><code id="L1217"><span class="ln">1217</span> <b>var</b> h<span class="s"> = </span>(x<span class="s"> * </span>x)<span class="s"> / </span>(rx<span class="s"> * </span>rx)<span class="s"> + </span>(y<span class="s"> * </span>y)<span class="s"> / </span>(ry<span class="s"> * </span>ry);
+</code><code id="L1218"><span class="ln">1218</span> <b>if</b> (h > <span class="d">1</span>) {
+</code><code id="L1219"><span class="ln">1219</span> h<span class="s"> = </span>math.sqrt(h);
+</code><code id="L1220"><span class="ln">1220</span> rx<span class="s"> = </span>h<span class="s"> * </span>rx;
+</code><code id="L1221"><span class="ln">1221</span> ry<span class="s"> = </span>h<span class="s"> * </span>ry;
+</code><code id="L1222"><span class="ln">1222</span> }
+</code><code id="L1223"><span class="ln">1223</span> <b>var</b> rx2<span class="s"> = </span>rx<span class="s"> * </span>rx,
+</code><code id="L1224"><span class="ln">1224</span> ry2<span class="s"> = </span>ry<span class="s"> * </span>ry,
+</code><code id="L1225"><span class="ln">1225</span> k<span class="s"> = </span>(large_arc_flag<span class="s"> == </span>sweep_flag ? -<span class="d">1</span> : <span class="d">1</span>) *
+</code><code id="L1226"><span class="ln">1226</span> math.sqrt(abs((rx2<span class="s"> * </span>ry2<span class="s"> - </span>rx2<span class="s"> * </span>y<span class="s"> * </span>y<span class="s"> - </span>ry2<span class="s"> * </span>x<span class="s"> * </span>x)<span class="s"> / </span>(rx2<span class="s"> * </span>y<span class="s"> * </span>y<span class="s"> + </span>ry2<span class="s"> * </span>x<span class="s"> * </span>x))),
+</code><code id="L1227"><span class="ln">1227</span> cx<span class="s"> = </span>k<span class="s"> * </span>rx<span class="s"> * </span>y<span class="s"> / </span>ry<span class="s"> + </span>(x1<span class="s"> + </span>x2)<span class="s"> / </span><span class="d">2</span>,
+</code><code id="L1228"><span class="ln">1228</span> cy<span class="s"> = </span>k<span class="s"> * </span>-ry<span class="s"> * </span>x<span class="s"> / </span>rx<span class="s"> + </span>(y1<span class="s"> + </span>y2)<span class="s"> / </span><span class="d">2</span>,
+</code><code id="L1229"><span class="ln">1229</span> f1<span class="s"> = </span>math.asin(((y1<span class="s"> - </span>cy)<span class="s"> / </span>ry).toFixed(<span class="d">9</span>)),
+</code><code id="L1230"><span class="ln">1230</span> f2<span class="s"> = </span>math.asin(((y2<span class="s"> - </span>cy)<span class="s"> / </span>ry).toFixed(<span class="d">9</span>));
+</code><code id="L1231"><span class="ln">1231</span>
+</code><code id="L1232"><span class="ln">1232</span> f1<span class="s"> = </span>x1 < cx ? PI<span class="s"> - </span>f1 : f1;
+</code><code id="L1233"><span class="ln">1233</span> f2<span class="s"> = </span>x2 < cx ? PI<span class="s"> - </span>f2 : f2;
+</code><code id="L1234"><span class="ln">1234</span> f1 < <span class="d">0</span><span class="s"> && </span>(f1<span class="s"> = </span>PI<span class="s"> * </span><span class="d">2</span><span class="s"> + </span>f1);
+</code><code id="L1235"><span class="ln">1235</span> f2 < <span class="d">0</span><span class="s"> && </span>(f2<span class="s"> = </span>PI<span class="s"> * </span><span class="d">2</span><span class="s"> + </span>f2);
+</code><code id="L1236"><span class="ln">1236</span> <b>if</b> (sweep_flag<span class="s"> && </span>f1 > f2) {
+</code><code id="L1237"><span class="ln">1237</span> f1<span class="s"> = </span>f1<span class="s"> - </span>PI<span class="s"> * </span><span class="d">2</span>;
+</code><code id="L1238"><span class="ln">1238</span> }
+</code><code id="L1239"><span class="ln">1239</span> <b>if</b> (!sweep_flag<span class="s"> && </span>f2 > f1) {
+</code><code id="L1240"><span class="ln">1240</span> f2<span class="s"> = </span>f2<span class="s"> - </span>PI<span class="s"> * </span><span class="d">2</span>;
+</code><code id="L1241"><span class="ln">1241</span> }
+</code><code id="L1242"><span class="ln">1242</span> } <b>else</b> {
+</code><code id="L1243"><span class="ln">1243</span> f1<span class="s"> = </span>recursive[<span class="d">0</span>];
+</code><code id="L1244"><span class="ln">1244</span> f2<span class="s"> = </span>recursive[<span class="d">1</span>];
+</code><code id="L1245"><span class="ln">1245</span> cx<span class="s"> = </span>recursive[<span class="d">2</span>];
+</code><code id="L1246"><span class="ln">1246</span> cy<span class="s"> = </span>recursive[<span class="d">3</span>];
+</code><code id="L1247"><span class="ln">1247</span> }
+</code><code id="L1248"><span class="ln">1248</span> <b>var</b> df<span class="s"> = </span>f2<span class="s"> - </span>f1;
+</code><code id="L1249"><span class="ln">1249</span> <b>if</b> (abs(df) > _120) {
+</code><code id="L1250"><span class="ln">1250</span> <b>var</b> f2old<span class="s"> = </span>f2,
+</code><code id="L1251"><span class="ln">1251</span> x2old<span class="s"> = </span>x2,
+</code><code id="L1252"><span class="ln">1252</span> y2old<span class="s"> = </span>y2;
+</code><code id="L1253"><span class="ln">1253</span> f2<span class="s"> = </span>f1<span class="s"> + </span>_120<span class="s"> * </span>(sweep_flag<span class="s"> && </span>f2 > f1 ? <span class="d">1</span> : -<span class="d">1</span>);
+</code><code id="L1254"><span class="ln">1254</span> x2<span class="s"> = </span>cx<span class="s"> + </span>rx<span class="s"> * </span>math.cos(f2);
+</code><code id="L1255"><span class="ln">1255</span> y2<span class="s"> = </span>cy<span class="s"> + </span>ry<span class="s"> * </span>math.sin(f2);
+</code><code id="L1256"><span class="ln">1256</span> res<span class="s"> = </span>a2c(x2, y2, rx, ry, angle, <span class="d">0</span>, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);
+</code><code id="L1257"><span class="ln">1257</span> }
+</code><code id="L1258"><span class="ln">1258</span> df<span class="s"> = </span>f2<span class="s"> - </span>f1;
+</code><code id="L1259"><span class="ln">1259</span> <b>var</b> c1<span class="s"> = </span>math.cos(f1),
+</code><code id="L1260"><span class="ln">1260</span> s1<span class="s"> = </span>math.sin(f1),
+</code><code id="L1261"><span class="ln">1261</span> c2<span class="s"> = </span>math.cos(f2),
+</code><code id="L1262"><span class="ln">1262</span> s2<span class="s"> = </span>math.sin(f2),
+</code><code id="L1263"><span class="ln">1263</span> t<span class="s"> = </span>math.tan(df<span class="s"> / </span><span class="d">4</span>),
+</code><code id="L1264"><span class="ln">1264</span> hx<span class="s"> = </span><span class="d">4</span><span class="s"> / </span><span class="d">3</span><span class="s"> * </span>rx<span class="s"> * </span>t,
+</code><code id="L1265"><span class="ln">1265</span> hy<span class="s"> = </span><span class="d">4</span><span class="s"> / </span><span class="d">3</span><span class="s"> * </span>ry<span class="s"> * </span>t,
+</code><code id="L1266"><span class="ln">1266</span> m1<span class="s"> = </span>[x1, y1],
+</code><code id="L1267"><span class="ln">1267</span> m2<span class="s"> = </span>[x1<span class="s"> + </span>hx<span class="s"> * </span>s1, y1<span class="s"> - </span>hy<span class="s"> * </span>c1],
+</code><code id="L1268"><span class="ln">1268</span> m3<span class="s"> = </span>[x2<span class="s"> + </span>hx<span class="s"> * </span>s2, y2<span class="s"> - </span>hy<span class="s"> * </span>c2],
+</code><code id="L1269"><span class="ln">1269</span> m4<span class="s"> = </span>[x2, y2];
+</code><code id="L1270"><span class="ln">1270</span> m2[<span class="d">0</span>]<span class="s"> = </span><span class="d">2</span><span class="s"> * </span>m1[<span class="d">0</span>]<span class="s"> - </span>m2[<span class="d">0</span>];
+</code><code id="L1271"><span class="ln">1271</span> m2[<span class="d">1</span>]<span class="s"> = </span><span class="d">2</span><span class="s"> * </span>m1[<span class="d">1</span>]<span class="s"> - </span>m2[<span class="d">1</span>];
+</code><code id="L1272"><span class="ln">1272</span> <b>if</b> (recursive) {
+</code><code id="L1273"><span class="ln">1273</span> <b>return</b> [m2, m3, m4][concat](res);
+</code><code id="L1274"><span class="ln">1274</span> } <b>else</b> {
+</code><code id="L1275"><span class="ln">1275</span> res<span class="s"> = </span>[m2, m3, m4][concat](res).join().split(<i>","</i>);
+</code><code id="L1276"><span class="ln">1276</span> <b>var</b> newres<span class="s"> = </span>[];
+</code><code id="L1277"><span class="ln">1277</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>res.length; i < ii; i++) {
+</code><code id="L1278"><span class="ln">1278</span> newres[i]<span class="s"> = </span>i<span class="s"> % </span><span class="d">2</span> ? rotate(res[i<span class="s"> - </span><span class="d">1</span>], res[i], rad).y : rotate(res[i], res[i<span class="s"> + </span><span class="d">1</span>], rad).x;
+</code><code id="L1279"><span class="ln">1279</span> }
+</code><code id="L1280"><span class="ln">1280</span> <b>return</b> newres;
+</code><code id="L1281"><span class="ln">1281</span> }
+</code><code id="L1282"><span class="ln">1282</span> },
+</code><code id="L1283"><span class="ln">1283</span> findDotAtSegment<span class="s"> = </span><b>function</b> (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
+</code><code id="L1284"><span class="ln">1284</span> <b>var</b> t1<span class="s"> = </span><span class="d">1</span><span class="s"> - </span>t;
+</code><code id="L1285"><span class="ln">1285</span> <b>return</b> {
+</code><code id="L1286"><span class="ln">1286</span> x: pow(t1, <span class="d">3</span>)<span class="s"> * </span>p1x<span class="s"> + </span>pow(t1, <span class="d">2</span>)<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>c1x<span class="s"> + </span>t1<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>t<span class="s"> * </span>c2x<span class="s"> + </span>pow(t, <span class="d">3</span>)<span class="s"> * </span>p2x,
+</code><code id="L1287"><span class="ln">1287</span> y: pow(t1, <span class="d">3</span>)<span class="s"> * </span>p1y<span class="s"> + </span>pow(t1, <span class="d">2</span>)<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>c1y<span class="s"> + </span>t1<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>t<span class="s"> * </span>c2y<span class="s"> + </span>pow(t, <span class="d">3</span>)<span class="s"> * </span>p2y
+</code><code id="L1288"><span class="ln">1288</span> };
+</code><code id="L1289"><span class="ln">1289</span> },
+</code><code id="L1290"><span class="ln">1290</span> curveDim<span class="s"> = </span>cacher(<b>function</b> (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {
+</code><code id="L1291"><span class="ln">1291</span> <b>var</b> a<span class="s"> = </span>(c2x<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>c1x<span class="s"> + </span>p1x)<span class="s"> - </span>(p2x<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>c2x<span class="s"> + </span>c1x),
+</code><code id="L1292"><span class="ln">1292</span> b<span class="s"> = </span><span class="d">2</span><span class="s"> * </span>(c1x<span class="s"> - </span>p1x)<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>(c2x<span class="s"> - </span>c1x),
+</code><code id="L1293"><span class="ln">1293</span> c<span class="s"> = </span>p1x<span class="s"> - </span>c1x,
+</code><code id="L1294"><span class="ln">1294</span> t1<span class="s"> = </span>(-b<span class="s"> + </span>math.sqrt(b<span class="s"> * </span>b<span class="s"> - </span><span class="d">4</span><span class="s"> * </span>a<span class="s"> * </span>c))<span class="s"> / </span><span class="d">2</span><span class="s"> / </span>a,
+</code><code id="L1295"><span class="ln">1295</span> t2<span class="s"> = </span>(-b<span class="s"> - </span>math.sqrt(b<span class="s"> * </span>b<span class="s"> - </span><span class="d">4</span><span class="s"> * </span>a<span class="s"> * </span>c))<span class="s"> / </span><span class="d">2</span><span class="s"> / </span>a,
+</code><code id="L1296"><span class="ln">1296</span> y<span class="s"> = </span>[p1y, p2y],
+</code><code id="L1297"><span class="ln">1297</span> x<span class="s"> = </span>[p1x, p2x],
+</code><code id="L1298"><span class="ln">1298</span> dot;
+</code><code id="L1299"><span class="ln">1299</span> abs(t1) > <i>"<span class="d">1e12</span>"</i><span class="s"> && </span>(t1<span class="s"> = </span><span class="d">.5</span>);
+</code><code id="L1300"><span class="ln">1300</span> abs(t2) > <i>"<span class="d">1e12</span>"</i><span class="s"> && </span>(t2<span class="s"> = </span><span class="d">.5</span>);
+</code><code id="L1301"><span class="ln">1301</span> <b>if</b> (t1 > <span class="d">0</span><span class="s"> && </span>t1 < <span class="d">1</span>) {
+</code><code id="L1302"><span class="ln">1302</span> dot<span class="s"> = </span>findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);
+</code><code id="L1303"><span class="ln">1303</span> x.push(dot.x);
+</code><code id="L1304"><span class="ln">1304</span> y.push(dot.y);
+</code><code id="L1305"><span class="ln">1305</span> }
+</code><code id="L1306"><span class="ln">1306</span> <b>if</b> (t2 > <span class="d">0</span><span class="s"> && </span>t2 < <span class="d">1</span>) {
+</code><code id="L1307"><span class="ln">1307</span> dot<span class="s"> = </span>findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);
+</code><code id="L1308"><span class="ln">1308</span> x.push(dot.x);
+</code><code id="L1309"><span class="ln">1309</span> y.push(dot.y);
+</code><code id="L1310"><span class="ln">1310</span> }
+</code><code id="L1311"><span class="ln">1311</span> a<span class="s"> = </span>(c2y<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>c1y<span class="s"> + </span>p1y)<span class="s"> - </span>(p2y<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>c2y<span class="s"> + </span>c1y);
+</code><code id="L1312"><span class="ln">1312</span> b<span class="s"> = </span><span class="d">2</span><span class="s"> * </span>(c1y<span class="s"> - </span>p1y)<span class="s"> - </span><span class="d">2</span><span class="s"> * </span>(c2y<span class="s"> - </span>c1y);
+</code><code id="L1313"><span class="ln">1313</span> c<span class="s"> = </span>p1y<span class="s"> - </span>c1y;
+</code><code id="L1314"><span class="ln">1314</span> t1<span class="s"> = </span>(-b<span class="s"> + </span>math.sqrt(b<span class="s"> * </span>b<span class="s"> - </span><span class="d">4</span><span class="s"> * </span>a<span class="s"> * </span>c))<span class="s"> / </span><span class="d">2</span><span class="s"> / </span>a;
+</code><code id="L1315"><span class="ln">1315</span> t2<span class="s"> = </span>(-b<span class="s"> - </span>math.sqrt(b<span class="s"> * </span>b<span class="s"> - </span><span class="d">4</span><span class="s"> * </span>a<span class="s"> * </span>c))<span class="s"> / </span><span class="d">2</span><span class="s"> / </span>a;
+</code><code id="L1316"><span class="ln">1316</span> abs(t1) > <i>"<span class="d">1e12</span>"</i><span class="s"> && </span>(t1<span class="s"> = </span><span class="d">.5</span>);
+</code><code id="L1317"><span class="ln">1317</span> abs(t2) > <i>"<span class="d">1e12</span>"</i><span class="s"> && </span>(t2<span class="s"> = </span><span class="d">.5</span>);
+</code><code id="L1318"><span class="ln">1318</span> <b>if</b> (t1 > <span class="d">0</span><span class="s"> && </span>t1 < <span class="d">1</span>) {
+</code><code id="L1319"><span class="ln">1319</span> dot<span class="s"> = </span>findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);
+</code><code id="L1320"><span class="ln">1320</span> x.push(dot.x);
+</code><code id="L1321"><span class="ln">1321</span> y.push(dot.y);
+</code><code id="L1322"><span class="ln">1322</span> }
+</code><code id="L1323"><span class="ln">1323</span> <b>if</b> (t2 > <span class="d">0</span><span class="s"> && </span>t2 < <span class="d">1</span>) {
+</code><code id="L1324"><span class="ln">1324</span> dot<span class="s"> = </span>findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);
+</code><code id="L1325"><span class="ln">1325</span> x.push(dot.x);
+</code><code id="L1326"><span class="ln">1326</span> y.push(dot.y);
+</code><code id="L1327"><span class="ln">1327</span> }
+</code><code id="L1328"><span class="ln">1328</span> <b>return</b> {
+</code><code id="L1329"><span class="ln">1329</span> min: {x: mmin[apply](<span class="d">0</span>, x), y: mmin[apply](<span class="d">0</span>, y)},
+</code><code id="L1330"><span class="ln">1330</span> max: {x: mmax[apply](<span class="d">0</span>, x), y: mmax[apply](<span class="d">0</span>, y)}
+</code><code id="L1331"><span class="ln">1331</span> };
+</code><code id="L1332"><span class="ln">1332</span> }),
+</code><code id="L1333"><span class="ln">1333</span> path2curve<span class="s"> = </span>cacher(<b>function</b> (path, path2) {
+</code><code id="L1334"><span class="ln">1334</span> <b>var</b> p<span class="s"> = </span>pathToAbsolute(path),
+</code><code id="L1335"><span class="ln">1335</span> p2<span class="s"> = </span>path2<span class="s"> && </span>pathToAbsolute(path2),
+</code><code id="L1336"><span class="ln">1336</span> attrs<span class="s"> = </span>{x: <span class="d">0</span>, y: <span class="d">0</span>, bx: <span class="d">0</span>, by: <span class="d">0</span>, X: <span class="d">0</span>, Y: <span class="d">0</span>, qx: <b>null</b>, qy: <b>null</b>},
+</code><code id="L1337"><span class="ln">1337</span> attrs2<span class="s"> = </span>{x: <span class="d">0</span>, y: <span class="d">0</span>, bx: <span class="d">0</span>, by: <span class="d">0</span>, X: <span class="d">0</span>, Y: <span class="d">0</span>, qx: <b>null</b>, qy: <b>null</b>},
+</code><code id="L1338"><span class="ln">1338</span> processPath<span class="s"> = </span><b>function</b> (path, d) {
+</code><code id="L1339"><span class="ln">1339</span> <b>var</b> nx, ny;
+</code><code id="L1340"><span class="ln">1340</span> <b>if</b> (!path) {
+</code><code id="L1341"><span class="ln">1341</span> <b>return</b> [<i>"C"</i>, d.x, d.y, d.x, d.y, d.x, d.y];
+</code><code id="L1342"><span class="ln">1342</span> }
+</code><code id="L1343"><span class="ln">1343</span> !(path[<span class="d">0</span>] <b>in</b> {T:<span class="d">1</span>, Q:<span class="d">1</span>})<span class="s"> && </span>(d.qx<span class="s"> = </span>d.qy<span class="s"> = </span><b>null</b>);
+</code><code id="L1344"><span class="ln">1344</span> <b>switch</b> (path[<span class="d">0</span>]) {
+</code><code id="L1345"><span class="ln">1345</span> <b>case</b> <i>"M"</i>:
+</code><code id="L1346"><span class="ln">1346</span> d.X<span class="s"> = </span>path[<span class="d">1</span>];
+</code><code id="L1347"><span class="ln">1347</span> d.Y<span class="s"> = </span>path[<span class="d">2</span>];
+</code><code id="L1348"><span class="ln">1348</span> <b>break</b>;
+</code><code id="L1349"><span class="ln">1349</span> <b>case</b> <i>"A"</i>:
+</code><code id="L1350"><span class="ln">1350</span> path<span class="s"> = </span>[<i>"C"</i>][concat](a2c[apply](<span class="d">0</span>, [d.x, d.y][concat](path.slice(<span class="d">1</span>))));
+</code><code id="L1351"><span class="ln">1351</span> <b>break</b>;
+</code><code id="L1352"><span class="ln">1352</span> <b>case</b> <i>"S"</i>:
+</code><code id="L1353"><span class="ln">1353</span> nx<span class="s"> = </span>d.x<span class="s"> + </span>(d.x<span class="s"> - </span>(d.bx<span class="s"> || </span>d.x));
+</code><code id="L1354"><span class="ln">1354</span> ny<span class="s"> = </span>d.y<span class="s"> + </span>(d.y<span class="s"> - </span>(d.by<span class="s"> || </span>d.y));
+</code><code id="L1355"><span class="ln">1355</span> path<span class="s"> = </span>[<i>"C"</i>, nx, ny][concat](path.slice(<span class="d">1</span>));
+</code><code id="L1356"><span class="ln">1356</span> <b>break</b>;
+</code><code id="L1357"><span class="ln">1357</span> <b>case</b> <i>"T"</i>:
+</code><code id="L1358"><span class="ln">1358</span> d.qx<span class="s"> = </span>d.x<span class="s"> + </span>(d.x<span class="s"> - </span>(d.qx<span class="s"> || </span>d.x));
+</code><code id="L1359"><span class="ln">1359</span> d.qy<span class="s"> = </span>d.y<span class="s"> + </span>(d.y<span class="s"> - </span>(d.qy<span class="s"> || </span>d.y));
+</code><code id="L1360"><span class="ln">1360</span> path<span class="s"> = </span>[<i>"C"</i>][concat](q2c(d.x, d.y, d.qx, d.qy, path[<span class="d">1</span>], path[<span class="d">2</span>]));
+</code><code id="L1361"><span class="ln">1361</span> <b>break</b>;
+</code><code id="L1362"><span class="ln">1362</span> <b>case</b> <i>"Q"</i>:
+</code><code id="L1363"><span class="ln">1363</span> d.qx<span class="s"> = </span>path[<span class="d">1</span>];
+</code><code id="L1364"><span class="ln">1364</span> d.qy<span class="s"> = </span>path[<span class="d">2</span>];
+</code><code id="L1365"><span class="ln">1365</span> path<span class="s"> = </span>[<i>"C"</i>][concat](q2c(d.x, d.y, path[<span class="d">1</span>], path[<span class="d">2</span>], path[<span class="d">3</span>], path[<span class="d">4</span>]));
+</code><code id="L1366"><span class="ln">1366</span> <b>break</b>;
+</code><code id="L1367"><span class="ln">1367</span> <b>case</b> <i>"L"</i>:
+</code><code id="L1368"><span class="ln">1368</span> path<span class="s"> = </span>[<i>"C"</i>][concat](l2c(d.x, d.y, path[<span class="d">1</span>], path[<span class="d">2</span>]));
+</code><code id="L1369"><span class="ln">1369</span> <b>break</b>;
+</code><code id="L1370"><span class="ln">1370</span> <b>case</b> <i>"H"</i>:
+</code><code id="L1371"><span class="ln">1371</span> path<span class="s"> = </span>[<i>"C"</i>][concat](l2c(d.x, d.y, path[<span class="d">1</span>], d.y));
+</code><code id="L1372"><span class="ln">1372</span> <b>break</b>;
+</code><code id="L1373"><span class="ln">1373</span> <b>case</b> <i>"V"</i>:
+</code><code id="L1374"><span class="ln">1374</span> path<span class="s"> = </span>[<i>"C"</i>][concat](l2c(d.x, d.y, d.x, path[<span class="d">1</span>]));
+</code><code id="L1375"><span class="ln">1375</span> <b>break</b>;
+</code><code id="L1376"><span class="ln">1376</span> <b>case</b> <i>"Z"</i>:
+</code><code id="L1377"><span class="ln">1377</span> path<span class="s"> = </span>[<i>"C"</i>][concat](l2c(d.x, d.y, d.X, d.Y));
+</code><code id="L1378"><span class="ln">1378</span> <b>break</b>;
+</code><code id="L1379"><span class="ln">1379</span> }
+</code><code id="L1380"><span class="ln">1380</span> <b>return</b> path;
+</code><code id="L1381"><span class="ln">1381</span> },
+</code><code id="L1382"><span class="ln">1382</span> fixArc<span class="s"> = </span><b>function</b> (pp, i) {
+</code><code id="L1383"><span class="ln">1383</span> <b>if</b> (pp[i].length > <span class="d">7</span>) {
+</code><code id="L1384"><span class="ln">1384</span> pp[i].shift();
+</code><code id="L1385"><span class="ln">1385</span> <b>var</b> pi<span class="s"> = </span>pp[i];
+</code><code id="L1386"><span class="ln">1386</span> <b>while</b> (pi.length) {
+</code><code id="L1387"><span class="ln">1387</span> pp.splice(i++, <span class="d">0</span>, [<i>"C"</i>][concat](pi.splice(<span class="d">0</span>, <span class="d">6</span>)));
+</code><code id="L1388"><span class="ln">1388</span> }
+</code><code id="L1389"><span class="ln">1389</span> pp.splice(i, <span class="d">1</span>);
+</code><code id="L1390"><span class="ln">1390</span> ii<span class="s"> = </span>mmax(p.length, p2<span class="s"> && </span>p2.length<span class="s"> || </span><span class="d">0</span>);
+</code><code id="L1391"><span class="ln">1391</span> }
+</code><code id="L1392"><span class="ln">1392</span> },
+</code><code id="L1393"><span class="ln">1393</span> fixM<span class="s"> = </span><b>function</b> (path1, path2, a1, a2, i) {
+</code><code id="L1394"><span class="ln">1394</span> <b>if</b> (path1<span class="s"> && </span>path2<span class="s"> && </span>path1[i][<span class="d">0</span>]<span class="s"> == </span><i>"M"</i><span class="s"> && </span>path2[i][<span class="d">0</span>] != <i>"M"</i>) {
+</code><code id="L1395"><span class="ln">1395</span> path2.splice(i, <span class="d">0</span>, [<i>"M"</i>, a2.x, a2.y]);
+</code><code id="L1396"><span class="ln">1396</span> a1.bx<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L1397"><span class="ln">1397</span> a1.by<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L1398"><span class="ln">1398</span> a1.x<span class="s"> = </span>path1[i][<span class="d">1</span>];
+</code><code id="L1399"><span class="ln">1399</span> a1.y<span class="s"> = </span>path1[i][<span class="d">2</span>];
+</code><code id="L1400"><span class="ln">1400</span> ii<span class="s"> = </span>mmax(p.length, p2<span class="s"> && </span>p2.length<span class="s"> || </span><span class="d">0</span>);
+</code><code id="L1401"><span class="ln">1401</span> }
+</code><code id="L1402"><span class="ln">1402</span> };
+</code><code id="L1403"><span class="ln">1403</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>mmax(p.length, p2<span class="s"> && </span>p2.length<span class="s"> || </span><span class="d">0</span>); i < ii; i++) {
+</code><code id="L1404"><span class="ln">1404</span> p[i]<span class="s"> = </span>processPath(p[i], attrs);
+</code><code id="L1405"><span class="ln">1405</span> fixArc(p, i);
+</code><code id="L1406"><span class="ln">1406</span> p2<span class="s"> && </span>(p2[i]<span class="s"> = </span>processPath(p2[i], attrs2));
+</code><code id="L1407"><span class="ln">1407</span> p2<span class="s"> && </span>fixArc(p2, i);
+</code><code id="L1408"><span class="ln">1408</span> fixM(p, p2, attrs, attrs2, i);
+</code><code id="L1409"><span class="ln">1409</span> fixM(p2, p, attrs2, attrs, i);
+</code><code id="L1410"><span class="ln">1410</span> <b>var</b> seg<span class="s"> = </span>p[i],
+</code><code id="L1411"><span class="ln">1411</span> seg2<span class="s"> = </span>p2<span class="s"> && </span>p2[i],
+</code><code id="L1412"><span class="ln">1412</span> seglen<span class="s"> = </span>seg.length,
+</code><code id="L1413"><span class="ln">1413</span> seg2len<span class="s"> = </span>p2<span class="s"> && </span>seg2.length;
+</code><code id="L1414"><span class="ln">1414</span> attrs.x<span class="s"> = </span>seg[seglen<span class="s"> - </span><span class="d">2</span>];
+</code><code id="L1415"><span class="ln">1415</span> attrs.y<span class="s"> = </span>seg[seglen<span class="s"> - </span><span class="d">1</span>];
+</code><code id="L1416"><span class="ln">1416</span> attrs.bx<span class="s"> = </span>toFloat(seg[seglen<span class="s"> - </span><span class="d">4</span>])<span class="s"> || </span>attrs.x;
+</code><code id="L1417"><span class="ln">1417</span> attrs.by<span class="s"> = </span>toFloat(seg[seglen<span class="s"> - </span><span class="d">3</span>])<span class="s"> || </span>attrs.y;
+</code><code id="L1418"><span class="ln">1418</span> attrs2.bx<span class="s"> = </span>p2<span class="s"> && </span>(toFloat(seg2[seg2len<span class="s"> - </span><span class="d">4</span>])<span class="s"> || </span>attrs2.x);
+</code><code id="L1419"><span class="ln">1419</span> attrs2.by<span class="s"> = </span>p2<span class="s"> && </span>(toFloat(seg2[seg2len<span class="s"> - </span><span class="d">3</span>])<span class="s"> || </span>attrs2.y);
+</code><code id="L1420"><span class="ln">1420</span> attrs2.x<span class="s"> = </span>p2<span class="s"> && </span>seg2[seg2len<span class="s"> - </span><span class="d">2</span>];
+</code><code id="L1421"><span class="ln">1421</span> attrs2.y<span class="s"> = </span>p2<span class="s"> && </span>seg2[seg2len<span class="s"> - </span><span class="d">1</span>];
+</code><code id="L1422"><span class="ln">1422</span> }
+</code><code id="L1423"><span class="ln">1423</span> <b>return</b> p2 ? [p, p2] : p;
+</code><code id="L1424"><span class="ln">1424</span> }, <b>null</b>, pathClone),
+</code><code id="L1425"><span class="ln">1425</span> parseDots<span class="s"> = </span>cacher(<b>function</b> (gradient) {
+</code><code id="L1426"><span class="ln">1426</span> <b>var</b> dots<span class="s"> = </span>[];
+</code><code id="L1427"><span class="ln">1427</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>gradient.length; i < ii; i++) {
+</code><code id="L1428"><span class="ln">1428</span> <b>var</b> dot<span class="s"> = </span>{},
+</code><code id="L1429"><span class="ln">1429</span> par<span class="s"> = </span>gradient[i].match(/^([^:]*):?([\d\.]*)/);
+</code><code id="L1430"><span class="ln">1430</span> dot.color<span class="s"> = </span>R.getRGB(par[<span class="d">1</span>]);
+</code><code id="L1431"><span class="ln">1431</span> <b>if</b> (dot.color.error) {
+</code><code id="L1432"><span class="ln">1432</span> <b>return</b> <b>null</b>;
+</code><code id="L1433"><span class="ln">1433</span> }
+</code><code id="L1434"><span class="ln">1434</span> dot.color<span class="s"> = </span>dot.color.hex;
+</code><code id="L1435"><span class="ln">1435</span> par[<span class="d">2</span>]<span class="s"> && </span>(dot.offset<span class="s"> = </span>par[<span class="d">2</span>]<span class="s"> + </span><i>"%"</i>);
+</code><code id="L1436"><span class="ln">1436</span> dots.push(dot);
+</code><code id="L1437"><span class="ln">1437</span> }
+</code><code id="L1438"><span class="ln">1438</span> <b>for</b> (i<span class="s"> = </span><span class="d">1</span>, ii<span class="s"> = </span>dots.length<span class="s"> - </span><span class="d">1</span>; i < ii; i++) {
+</code><code id="L1439"><span class="ln">1439</span> <b>if</b> (!dots[i].offset) {
+</code><code id="L1440"><span class="ln">1440</span> <b>var</b> start<span class="s"> = </span>toFloat(dots[i<span class="s"> - </span><span class="d">1</span>].offset<span class="s"> || </span><span class="d">0</span>),
+</code><code id="L1441"><span class="ln">1441</span> end<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L1442"><span class="ln">1442</span> <b>for</b> (<b>var</b> j<span class="s"> = </span>i<span class="s"> + </span><span class="d">1</span>; j < ii; j++) {
+</code><code id="L1443"><span class="ln">1443</span> <b>if</b> (dots[j].offset) {
+</code><code id="L1444"><span class="ln">1444</span> end<span class="s"> = </span>dots[j].offset;
+</code><code id="L1445"><span class="ln">1445</span> <b>break</b>;
+</code><code id="L1446"><span class="ln">1446</span> }
+</code><code id="L1447"><span class="ln">1447</span> }
+</code><code id="L1448"><span class="ln">1448</span> <b>if</b> (!end) {
+</code><code id="L1449"><span class="ln">1449</span> end<span class="s"> = </span><span class="d">100</span>;
+</code><code id="L1450"><span class="ln">1450</span> j<span class="s"> = </span>ii;
+</code><code id="L1451"><span class="ln">1451</span> }
+</code><code id="L1452"><span class="ln">1452</span> end<span class="s"> = </span>toFloat(end);
+</code><code id="L1453"><span class="ln">1453</span> <b>var</b> d<span class="s"> = </span>(end<span class="s"> - </span>start)<span class="s"> / </span>(j<span class="s"> - </span>i<span class="s"> + </span><span class="d">1</span>);
+</code><code id="L1454"><span class="ln">1454</span> <b>for</b> (; i < j; i++) {
+</code><code id="L1455"><span class="ln">1455</span> start += d;
+</code><code id="L1456"><span class="ln">1456</span> dots[i].offset<span class="s"> = </span>start<span class="s"> + </span><i>"%"</i>;
+</code><code id="L1457"><span class="ln">1457</span> }
+</code><code id="L1458"><span class="ln">1458</span> }
+</code><code id="L1459"><span class="ln">1459</span> }
+</code><code id="L1460"><span class="ln">1460</span> <b>return</b> dots;
+</code><code id="L1461"><span class="ln">1461</span> }),
+</code><code id="L1462"><span class="ln">1462</span> getContainer<span class="s"> = </span><b>function</b> (x, y, w, h) {
+</code><code id="L1463"><span class="ln">1463</span> <b>var</b> container;
+</code><code id="L1464"><span class="ln">1464</span> container<span class="s"> = </span>h<span class="s"> == </span><b>null</b><span class="s"> && </span>!R.is(x, <i>"object"</i>) ? g.doc.getElementById(x) : x;
+</code><code id="L1465"><span class="ln">1465</span> <b>if</b> (container<span class="s"> == </span><b>null</b>) {
+</code><code id="L1466"><span class="ln">1466</span> <b>return</b>;
+</code><code id="L1467"><span class="ln">1467</span> }
+</code><code id="L1468"><span class="ln">1468</span> <b>if</b> (container.tagName) {
+</code><code id="L1469"><span class="ln">1469</span> <b>if</b> (y<span class="s"> == </span><b>null</b>) {
+</code><code id="L1470"><span class="ln">1470</span> <b>return</b> {
+</code><code id="L1471"><span class="ln">1471</span> container: container,
+</code><code id="L1472"><span class="ln">1472</span> width: container.style.pixelWidth<span class="s"> || </span>container.offsetWidth,
+</code><code id="L1473"><span class="ln">1473</span> height: container.style.pixelHeight<span class="s"> || </span>container.offsetHeight
+</code><code id="L1474"><span class="ln">1474</span> };
+</code><code id="L1475"><span class="ln">1475</span> } <b>else</b> {
+</code><code id="L1476"><span class="ln">1476</span> <b>return</b> {container: container, width: y, height: w};
+</code><code id="L1477"><span class="ln">1477</span> }
+</code><code id="L1478"><span class="ln">1478</span> }
+</code><code id="L1479"><span class="ln">1479</span> <b>return</b> {container: <span class="d">1</span>, x: x, y: y, width: w, height: h};
+</code><code id="L1480"><span class="ln">1480</span> },
+</code><code id="L1481"><span class="ln">1481</span> plugins<span class="s"> = </span><b>function</b> (con, add) {
+</code><code id="L1482"><span class="ln">1482</span> <b>var</b> that<span class="s"> = </span><b>this</b>;
+</code><code id="L1483"><span class="ln">1483</span> <b>for</b> (<b>var</b> prop <b>in</b> add) {
+</code><code id="L1484"><span class="ln">1484</span> <b>if</b> (add[has](prop)<span class="s"> && </span>!(prop <b>in</b> con)) {
+</code><code id="L1485"><span class="ln">1485</span> <b>switch</b> (<b>typeof</b> add[prop]) {
+</code><code id="L1486"><span class="ln">1486</span> <b>case</b> <i>"<b>function</b>"</i>:
+</code><code id="L1487"><span class="ln">1487</span> (<b>function</b> (f) {
+</code><code id="L1488"><span class="ln">1488</span> con[prop]<span class="s"> = </span>con<span class="s"> === </span>that ? f : <b>function</b> () { <b>return</b> f[apply](that, arguments); };
+</code><code id="L1489"><span class="ln">1489</span> })(add[prop]);
+</code><code id="L1490"><span class="ln">1490</span> <b>break</b>;
+</code><code id="L1491"><span class="ln">1491</span> <b>case</b> <i>"object"</i>:
+</code><code id="L1492"><span class="ln">1492</span> con[prop]<span class="s"> = </span>con[prop]<span class="s"> || </span>{};
+</code><code id="L1493"><span class="ln">1493</span> plugins.call(<b>this</b>, con[prop], add[prop]);
+</code><code id="L1494"><span class="ln">1494</span> <b>break</b>;
+</code><code id="L1495"><span class="ln">1495</span> <b>default</b>:
+</code><code id="L1496"><span class="ln">1496</span> con[prop]<span class="s"> = </span>add[prop];
+</code><code id="L1497"><span class="ln">1497</span> <b>break</b>;
+</code><code id="L1498"><span class="ln">1498</span> }
+</code><code id="L1499"><span class="ln">1499</span> }
+</code><code id="L1500"><span class="ln">1500</span> }
+</code><code id="L1501"><span class="ln">1501</span> },
+</code><code id="L1502"><span class="ln">1502</span> tear<span class="s"> = </span><b>function</b> (el, paper) {
+</code><code id="L1503"><span class="ln">1503</span> el<span class="s"> == </span>paper.top<span class="s"> && </span>(paper.top<span class="s"> = </span>el.prev);
+</code><code id="L1504"><span class="ln">1504</span> el<span class="s"> == </span>paper.bottom<span class="s"> && </span>(paper.bottom<span class="s"> = </span>el.next);
+</code><code id="L1505"><span class="ln">1505</span> el.next<span class="s"> && </span>(el.next.prev<span class="s"> = </span>el.prev);
+</code><code id="L1506"><span class="ln">1506</span> el.prev<span class="s"> && </span>(el.prev.next<span class="s"> = </span>el.next);
+</code><code id="L1507"><span class="ln">1507</span> },
+</code><code id="L1508"><span class="ln">1508</span> tofront<span class="s"> = </span><b>function</b> (el, paper) {
+</code><code id="L1509"><span class="ln">1509</span> <b>if</b> (paper.top<span class="s"> === </span>el) {
+</code><code id="L1510"><span class="ln">1510</span> <b>return</b>;
+</code><code id="L1511"><span class="ln">1511</span> }
+</code><code id="L1512"><span class="ln">1512</span> tear(el, paper);
+</code><code id="L1513"><span class="ln">1513</span> el.next<span class="s"> = </span><b>null</b>;
+</code><code id="L1514"><span class="ln">1514</span> el.prev<span class="s"> = </span>paper.top;
+</code><code id="L1515"><span class="ln">1515</span> paper.top.next<span class="s"> = </span>el;
+</code><code id="L1516"><span class="ln">1516</span> paper.top<span class="s"> = </span>el;
+</code><code id="L1517"><span class="ln">1517</span> },
+</code><code id="L1518"><span class="ln">1518</span> toback<span class="s"> = </span><b>function</b> (el, paper) {
+</code><code id="L1519"><span class="ln">1519</span> <b>if</b> (paper.bottom<span class="s"> === </span>el) {
+</code><code id="L1520"><span class="ln">1520</span> <b>return</b>;
+</code><code id="L1521"><span class="ln">1521</span> }
+</code><code id="L1522"><span class="ln">1522</span> tear(el, paper);
+</code><code id="L1523"><span class="ln">1523</span> el.next<span class="s"> = </span>paper.bottom;
+</code><code id="L1524"><span class="ln">1524</span> el.prev<span class="s"> = </span><b>null</b>;
+</code><code id="L1525"><span class="ln">1525</span> paper.bottom.prev<span class="s"> = </span>el;
+</code><code id="L1526"><span class="ln">1526</span> paper.bottom<span class="s"> = </span>el;
+</code><code id="L1527"><span class="ln">1527</span> },
+</code><code id="L1528"><span class="ln">1528</span> insertafter<span class="s"> = </span><b>function</b> (el, el2, paper) {
+</code><code id="L1529"><span class="ln">1529</span> tear(el, paper);
+</code><code id="L1530"><span class="ln">1530</span> el2<span class="s"> == </span>paper.top<span class="s"> && </span>(paper.top<span class="s"> = </span>el);
+</code><code id="L1531"><span class="ln">1531</span> el2.next<span class="s"> && </span>(el2.next.prev<span class="s"> = </span>el);
+</code><code id="L1532"><span class="ln">1532</span> el.next<span class="s"> = </span>el2.next;
+</code><code id="L1533"><span class="ln">1533</span> el.prev<span class="s"> = </span>el2;
+</code><code id="L1534"><span class="ln">1534</span> el2.next<span class="s"> = </span>el;
+</code><code id="L1535"><span class="ln">1535</span> },
+</code><code id="L1536"><span class="ln">1536</span> insertbefore<span class="s"> = </span><b>function</b> (el, el2, paper) {
+</code><code id="L1537"><span class="ln">1537</span> tear(el, paper);
+</code><code id="L1538"><span class="ln">1538</span> el2<span class="s"> == </span>paper.bottom<span class="s"> && </span>(paper.bottom<span class="s"> = </span>el);
+</code><code id="L1539"><span class="ln">1539</span> el2.prev<span class="s"> && </span>(el2.prev.next<span class="s"> = </span>el);
+</code><code id="L1540"><span class="ln">1540</span> el.prev<span class="s"> = </span>el2.prev;
+</code><code id="L1541"><span class="ln">1541</span> el2.prev<span class="s"> = </span>el;
+</code><code id="L1542"><span class="ln">1542</span> el.next<span class="s"> = </span>el2;
+</code><code id="L1543"><span class="ln">1543</span> },
+</code><code id="L1544"><span class="ln">1544</span> removed<span class="s"> = </span><b>function</b> (methodname) {
+</code><code id="L1545"><span class="ln">1545</span> <b>return</b> <b>function</b> () {
+</code><code id="L1546"><span class="ln">1546</span> <b>throw</b> <b>new</b> Error(<i>"Rapha\xebl: you are calling to method \u201c"</i><span class="s"> + </span>methodname<span class="s"> + </span><i>"\u201d of removed object"</i>);
+</code><code id="L1547"><span class="ln">1547</span> };
+</code><code id="L1548"><span class="ln">1548</span> },
+</code><code id="L1549"><span class="ln">1549</span> extractTransform<span class="s"> = </span><b>function</b> (el, tstr) {
+</code><code id="L1550"><span class="ln">1550</span> <b>if</b> (tstr<span class="s"> == </span><b>null</b>) {
+</code><code id="L1551"><span class="ln">1551</span> <b>return</b> el._.transform;
+</code><code id="L1552"><span class="ln">1552</span> }
+</code><code id="L1553"><span class="ln">1553</span> tstr<span class="s"> = </span>Str(tstr).replace(/\.{<span class="d">3</span>}|\u2026/g, el._.transform<span class="s"> || </span>E);
+</code><code id="L1554"><span class="ln">1554</span> <b>var</b> tdata<span class="s"> = </span>R.parseTransformString(tstr),
+</code><code id="L1555"><span class="ln">1555</span> deg<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L1556"><span class="ln">1556</span> dx<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L1557"><span class="ln">1557</span> dy<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L1558"><span class="ln">1558</span> sx<span class="s"> = </span><span class="d">1</span>,
+</code><code id="L1559"><span class="ln">1559</span> sy<span class="s"> = </span><span class="d">1</span>,
+</code><code id="L1560"><span class="ln">1560</span> _<span class="s"> = </span>el._,
+</code><code id="L1561"><span class="ln">1561</span> m<span class="s"> = </span><b>new</b> Matrix;
+</code><code id="L1562"><span class="ln">1562</span> _.transform<span class="s"> = </span>tdata<span class="s"> || </span>[];
+</code><code id="L1563"><span class="ln">1563</span> <b>if</b> (tdata) {
+</code><code id="L1564"><span class="ln">1564</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>tdata.length; i < ii; i++) {
+</code><code id="L1565"><span class="ln">1565</span> <b>var</b> t<span class="s"> = </span>tdata[i],
+</code><code id="L1566"><span class="ln">1566</span> tlen<span class="s"> = </span>t.length,
+</code><code id="L1567"><span class="ln">1567</span> bb;
+</code><code id="L1568"><span class="ln">1568</span> t[<span class="d">0</span>]<span class="s"> = </span>Str(t[<span class="d">0</span>]).toLowerCase();
+</code><code id="L1569"><span class="ln">1569</span> <b>if</b> (t[<span class="d">0</span>]<span class="s"> == </span><i>"t"</i><span class="s"> && </span>tlen<span class="s"> == </span><span class="d">3</span>) {
+</code><code id="L1570"><span class="ln">1570</span> m.translate(t[<span class="d">1</span>], t[<span class="d">2</span>]);
+</code><code id="L1571"><span class="ln">1571</span> } <b>else</b> <b>if</b> (t[<span class="d">0</span>]<span class="s"> == </span><i>"r"</i>) {
+</code><code id="L1572"><span class="ln">1572</span> <b>if</b> (tlen<span class="s"> == </span><span class="d">2</span>) {
+</code><code id="L1573"><span class="ln">1573</span> bb<span class="s"> = </span>bb<span class="s"> || </span>el.getBBox(<span class="d">1</span>);
+</code><code id="L1574"><span class="ln">1574</span> m.rotate(t[<span class="d">1</span>], bb.x<span class="s"> + </span>bb.width<span class="s"> / </span><span class="d">2</span>, bb.y<span class="s"> + </span>bb.height<span class="s"> / </span><span class="d">2</span>);
+</code><code id="L1575"><span class="ln">1575</span> deg += t[<span class="d">1</span>];
+</code><code id="L1576"><span class="ln">1576</span> } <b>else</b> <b>if</b> (tlen<span class="s"> == </span><span class="d">4</span>) {
+</code><code id="L1577"><span class="ln">1577</span> m.rotate(t[<span class="d">1</span>], t[<span class="d">2</span>], t[<span class="d">3</span>]);
+</code><code id="L1578"><span class="ln">1578</span> deg += t[<span class="d">1</span>];
+</code><code id="L1579"><span class="ln">1579</span> }
+</code><code id="L1580"><span class="ln">1580</span> } <b>else</b> <b>if</b> (t[<span class="d">0</span>]<span class="s"> == </span><i>"s"</i>) {
+</code><code id="L1581"><span class="ln">1581</span> <b>if</b> (tlen<span class="s"> == </span><span class="d">2</span><span class="s"> || </span>tlen<span class="s"> == </span><span class="d">3</span>) {
+</code><code id="L1582"><span class="ln">1582</span> bb<span class="s"> = </span>bb<span class="s"> || </span>el.getBBox(<span class="d">1</span>);
+</code><code id="L1583"><span class="ln">1583</span> m.scale(t[<span class="d">1</span>], t[tlen<span class="s"> - </span><span class="d">1</span>], bb.x<span class="s"> + </span>bb.width<span class="s"> / </span><span class="d">2</span>, bb.y<span class="s"> + </span>bb.height<span class="s"> / </span><span class="d">2</span>);
+</code><code id="L1584"><span class="ln">1584</span> sx *= t[<span class="d">1</span>];
+</code><code id="L1585"><span class="ln">1585</span> sy *= t[tlen<span class="s"> - </span><span class="d">1</span>];
+</code><code id="L1586"><span class="ln">1586</span> } <b>else</b> <b>if</b> (tlen<span class="s"> == </span><span class="d">5</span>) {
+</code><code id="L1587"><span class="ln">1587</span> m.scale(t[<span class="d">1</span>], t[<span class="d">2</span>], t[<span class="d">3</span>], t[<span class="d">4</span>]);
+</code><code id="L1588"><span class="ln">1588</span> sx *= t[<span class="d">1</span>];
+</code><code id="L1589"><span class="ln">1589</span> sy *= t[<span class="d">2</span>];
+</code><code id="L1590"><span class="ln">1590</span> }
+</code><code id="L1591"><span class="ln">1591</span> } <b>else</b> <b>if</b> (t[<span class="d">0</span>]<span class="s"> == </span><i>"m"</i><span class="s"> && </span>tlen<span class="s"> == </span><span class="d">7</span>) {
+</code><code id="L1592"><span class="ln">1592</span> m.add(t[<span class="d">1</span>], t[<span class="d">2</span>], t[<span class="d">3</span>], t[<span class="d">4</span>], t[<span class="d">5</span>], t[<span class="d">6</span>]);
+</code><code id="L1593"><span class="ln">1593</span> }
+</code><code id="L1594"><span class="ln">1594</span> _.dirtyT<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L1595"><span class="ln">1595</span> el.matrix<span class="s"> = </span>m;
+</code><code id="L1596"><span class="ln">1596</span> }
+</code><code id="L1597"><span class="ln">1597</span> }
+</code><code id="L1598"><span class="ln">1598</span>
+</code><code id="L1599"><span class="ln">1599</span> el.matrix<span class="s"> = </span>m;
+</code><code id="L1600"><span class="ln">1600</span>
+</code><code id="L1601"><span class="ln">1601</span> _.sx<span class="s"> = </span>sx;
+</code><code id="L1602"><span class="ln">1602</span> _.sy<span class="s"> = </span>sy;
+</code><code id="L1603"><span class="ln">1603</span> _.deg<span class="s"> = </span>deg;
+</code><code id="L1604"><span class="ln">1604</span> _.dx<span class="s"> = </span>dx<span class="s"> = </span>m.m[<span class="d">0</span>][<span class="d">2</span>];
+</code><code id="L1605"><span class="ln">1605</span> _.dy<span class="s"> = </span>dy<span class="s"> = </span>m.m[<span class="d">1</span>][<span class="d">2</span>];
+</code><code id="L1606"><span class="ln">1606</span>
+</code><code id="L1607"><span class="ln">1607</span> <b>if</b> (sx<span class="s"> == </span><span class="d">1</span><span class="s"> && </span>sy<span class="s"> == </span><span class="d">1</span><span class="s"> && </span>!deg<span class="s"> && </span>_.bbox) {
+</code><code id="L1608"><span class="ln">1608</span> _.bbox.x += +dx;
+</code><code id="L1609"><span class="ln">1609</span> _.bbox.y += +dy;
+</code><code id="L1610"><span class="ln">1610</span> } <b>else</b> {
+</code><code id="L1611"><span class="ln">1611</span> _.dirtyT<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L1612"><span class="ln">1612</span> }
+</code><code id="L1613"><span class="ln">1613</span> },
+</code><code id="L1614"><span class="ln">1614</span> getEmpty<span class="s"> = </span><b>function</b> (item) {
+</code><code id="L1615"><span class="ln">1615</span> <b>switch</b> (item[<span class="d">0</span>]) {
+</code><code id="L1616"><span class="ln">1616</span> <b>case</b> <i>"t"</i>: <b>return</b> [<i>"t"</i>, <span class="d">0</span>, <span class="d">0</span>];
+</code><code id="L1617"><span class="ln">1617</span> <b>case</b> <i>"m"</i>: <b>return</b> [<i>"m"</i>, <span class="d">1</span>, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, <span class="d">0</span>, <span class="d">0</span>];
+</code><code id="L1618"><span class="ln">1618</span> <b>case</b> <i>"r"</i>: <b>if</b> (item.length<span class="s"> == </span><span class="d">4</span>) {
+</code><code id="L1619"><span class="ln">1619</span> <b>return</b> [<i>"r"</i>, <span class="d">0</span>, item[<span class="d">2</span>], item[<span class="d">3</span>]];
+</code><code id="L1620"><span class="ln">1620</span> } <b>else</b> {
+</code><code id="L1621"><span class="ln">1621</span> <b>return</b> [<i>"r"</i>, <span class="d">0</span>];
+</code><code id="L1622"><span class="ln">1622</span> }
+</code><code id="L1623"><span class="ln">1623</span> <b>case</b> <i>"s"</i>: <b>if</b> (item.length<span class="s"> == </span><span class="d">5</span>) {
+</code><code id="L1624"><span class="ln">1624</span> <b>return</b> [<i>"s"</i>, <span class="d">1</span>, <span class="d">1</span>, item[<span class="d">3</span>], item[<span class="d">4</span>]];
+</code><code id="L1625"><span class="ln">1625</span> } <b>else</b> <b>if</b> (item.length<span class="s"> == </span><span class="d">3</span>) {
+</code><code id="L1626"><span class="ln">1626</span> <b>return</b> [<i>"s"</i>, <span class="d">1</span>, <span class="d">1</span>];
+</code><code id="L1627"><span class="ln">1627</span> } <b>else</b> {
+</code><code id="L1628"><span class="ln">1628</span> <b>return</b> [<i>"s"</i>, <span class="d">1</span>];
+</code><code id="L1629"><span class="ln">1629</span> }
+</code><code id="L1630"><span class="ln">1630</span> }
+</code><code id="L1631"><span class="ln">1631</span> },
+</code><code id="L1632"><span class="ln">1632</span> equaliseTransform<span class="s"> = </span><b>function</b> (t1, t2) {
+</code><code id="L1633"><span class="ln">1633</span> t1<span class="s"> = </span>R.parseTransformString(t1)<span class="s"> || </span>[];
+</code><code id="L1634"><span class="ln">1634</span> t2<span class="s"> = </span>R.parseTransformString(t2)<span class="s"> || </span>[];
+</code><code id="L1635"><span class="ln">1635</span> <b>var</b> maxlength<span class="s"> = </span>mmax(t1.length, t2.length),
+</code><code id="L1636"><span class="ln">1636</span> from<span class="s"> = </span>[],
+</code><code id="L1637"><span class="ln">1637</span> to<span class="s"> = </span>[],
+</code><code id="L1638"><span class="ln">1638</span> i<span class="s"> = </span><span class="d">0</span>, j, jj,
+</code><code id="L1639"><span class="ln">1639</span> tt1, tt2;
+</code><code id="L1640"><span class="ln">1640</span> <b>for</b> (; i < maxlength; i++) {
+</code><code id="L1641"><span class="ln">1641</span> tt1<span class="s"> = </span>t1[i]<span class="s"> || </span>getEmpty(t2[i]);
+</code><code id="L1642"><span class="ln">1642</span> tt2<span class="s"> = </span>t2[i]<span class="s"> || </span>getEmpty(tt1);
+</code><code id="L1643"><span class="ln">1643</span> <b>if</b> ( (tt1[<span class="d">0</span>] != tt2[<span class="d">0</span>]) ||
+</code><code id="L1644"><span class="ln">1644</span> (tt1[<span class="d">0</span>]<span class="s"> == </span><i>"r"</i><span class="s"> && </span>(tt1[<span class="d">2</span>] != tt2[<span class="d">2</span>]<span class="s"> || </span>tt1[<span class="d">3</span>] != tt2[<span class="d">3</span>])) ||
+</code><code id="L1645"><span class="ln">1645</span> (tt1[<span class="d">0</span>]<span class="s"> == </span><i>"s"</i><span class="s"> && </span>(tt1[<span class="d">3</span>] != tt2[<span class="d">3</span>]<span class="s"> || </span>tt1[<span class="d">4</span>] != tt2[<span class="d">4</span>]))
+</code><code id="L1646"><span class="ln">1646</span> ) {
+</code><code id="L1647"><span class="ln">1647</span> <b>return</b>;
+</code><code id="L1648"><span class="ln">1648</span> }
+</code><code id="L1649"><span class="ln">1649</span> from[i]<span class="s"> = </span>[];
+</code><code id="L1650"><span class="ln">1650</span> to[i]<span class="s"> = </span>[];
+</code><code id="L1651"><span class="ln">1651</span> <b>for</b> (j<span class="s"> = </span><span class="d">0</span>, jj<span class="s"> = </span>mmax(tt1.length, tt2.length); j < jj; j++) {
+</code><code id="L1652"><span class="ln">1652</span> j <b>in</b> tt1<span class="s"> && </span>(from[i][j]<span class="s"> = </span>tt1[j]);
+</code><code id="L1653"><span class="ln">1653</span> j <b>in</b> tt2<span class="s"> && </span>(to[i][j]<span class="s"> = </span>tt2[j]);
+</code><code id="L1654"><span class="ln">1654</span> }
+</code><code id="L1655"><span class="ln">1655</span> }
+</code><code id="L1656"><span class="ln">1656</span> <b>return</b> {
+</code><code id="L1657"><span class="ln">1657</span> from: from,
+</code><code id="L1658"><span class="ln">1658</span> to: to
+</code><code id="L1659"><span class="ln">1659</span> };
+</code><code id="L1660"><span class="ln">1660</span> };
+</code><code id="L1661"><span class="ln">1661</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L1662"><span class="ln">1662</span><span class="c"> <span class="s"> * </span>Raphael.pathToRelative
+</span></code><code id="L1663"><span class="ln">1663</span><span class="c"> [ method ]
+</span></code><code id="L1664"><span class="ln">1664</span><span class="c"> **
+</span></code><code id="L1665"><span class="ln">1665</span><span class="c"> <span class="s"> * </span>Utility method
+</span></code><code id="L1666"><span class="ln">1666</span><span class="c"> **
+</span></code><code id="L1667"><span class="ln">1667</span><span class="c"> <span class="s"> * </span>Converts path to relative form
+</span></code><code id="L1668"><span class="ln">1668</span><span class="c"> > Parameters
+</span></code><code id="L1669"><span class="ln">1669</span><span class="c"> <span class="s"> - </span>pathString (string|array) path string or array of segments
+</span></code><code id="L1670"><span class="ln">1670</span><span class="c"> <span class="s"> = </span>(array) array of segments.
+</span></code><code id="L1671"><span class="ln">1671</span><span class="c"> \*/</span>
+</code><code id="L1672"><span class="ln">1672</span> R.pathToRelative<span class="s"> = </span>pathToRelative;
+</code><code id="L1673"><span class="ln">1673</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L1674"><span class="ln">1674</span><span class="c"> <span class="s"> * </span>Raphael.path2curve
+</span></code><code id="L1675"><span class="ln">1675</span><span class="c"> [ method ]
+</span></code><code id="L1676"><span class="ln">1676</span><span class="c"> **
+</span></code><code id="L1677"><span class="ln">1677</span><span class="c"> <span class="s"> * </span>Utility method
+</span></code><code id="L1678"><span class="ln">1678</span><span class="c"> **
+</span></code><code id="L1679"><span class="ln">1679</span><span class="c"> <span class="s"> * </span>Converts path to a <b>new</b> path where all segments are cubic bezier curves.
+</span></code><code id="L1680"><span class="ln">1680</span><span class="c"> > Parameters
+</span></code><code id="L1681"><span class="ln">1681</span><span class="c"> <span class="s"> - </span>pathString (string|array) path string or array of segments
+</span></code><code id="L1682"><span class="ln">1682</span><span class="c"> <span class="s"> = </span>(array) array of segments.
+</span></code><code id="L1683"><span class="ln">1683</span><span class="c"> \*/</span>
+</code><code id="L1684"><span class="ln">1684</span> R.path2curve<span class="s"> = </span>path2curve;
+</code><code id="L1685"><span class="ln">1685</span> <span class="c">// Matrix</span>
+</code><code id="L1686"><span class="ln">1686</span> <span class="c">// <b>var</b> m<span class="s"> = </span>document.createElementNS(<i>"http://www.w3.org/<span class="d">2000</span>/svg"</i>, <i>"svg"</i>).createSVGMatrix();</span>
+</code><code id="L1687"><span class="ln">1687</span> <b>function</b> Matrix(a, b, c, d, e, f) {
+</code><code id="L1688"><span class="ln">1688</span> <b>if</b> (a != <b>null</b>) {
+</code><code id="L1689"><span class="ln">1689</span> <b>this</b>.m<span class="s"> = </span>[[a, c, e], [b, d, f], [<span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>]];
+</code><code id="L1690"><span class="ln">1690</span> } <b>else</b> {
+</code><code id="L1691"><span class="ln">1691</span> <b>this</b>.m<span class="s"> = </span>[[<span class="d">1</span>, <span class="d">0</span>, <span class="d">0</span>], [<span class="d">0</span>, <span class="d">1</span>, <span class="d">0</span>], [<span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>]];
+</code><code id="L1692"><span class="ln">1692</span> }
+</code><code id="L1693"><span class="ln">1693</span> }
+</code><code id="L1694"><span class="ln">1694</span> <b>var</b> matrixproto<span class="s"> = </span>Matrix.prototype;
+</code><code id="L1695"><span class="ln">1695</span> matrixproto.add<span class="s"> = </span><b>function</b> (a, b, c, d, e, f) {
+</code><code id="L1696"><span class="ln">1696</span> <b>var</b> out<span class="s"> = </span>[[], [], []],
+</code><code id="L1697"><span class="ln">1697</span> matrix<span class="s"> = </span>[[a, c, e], [b, d, f], [<span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>]],
+</code><code id="L1698"><span class="ln">1698</span> x, y, z, res;
+</code><code id="L1699"><span class="ln">1699</span>
+</code><code id="L1700"><span class="ln">1700</span> <b>for</b> (x<span class="s"> = </span><span class="d">0</span>; x < <span class="d">3</span>; x++) {
+</code><code id="L1701"><span class="ln">1701</span> <b>for</b> (y<span class="s"> = </span><span class="d">0</span>; y < <span class="d">3</span>; y++) {
+</code><code id="L1702"><span class="ln">1702</span> res<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L1703"><span class="ln">1703</span> <b>for</b> (z<span class="s"> = </span><span class="d">0</span>; z < <span class="d">3</span>; z++) {
+</code><code id="L1704"><span class="ln">1704</span> res += <b>this</b>.m[x][z]<span class="s"> * </span>matrix[z][y];
+</code><code id="L1705"><span class="ln">1705</span> }
+</code><code id="L1706"><span class="ln">1706</span> out[x][y]<span class="s"> = </span>res;
+</code><code id="L1707"><span class="ln">1707</span> }
+</code><code id="L1708"><span class="ln">1708</span> }
+</code><code id="L1709"><span class="ln">1709</span> <b>this</b>.m<span class="s"> = </span>out;
+</code><code id="L1710"><span class="ln">1710</span> };
+</code><code id="L1711"><span class="ln">1711</span> matrixproto.invert<span class="s"> = </span><b>function</b> () {
+</code><code id="L1712"><span class="ln">1712</span> <b>var</b> a<span class="s"> = </span><b>this</b>.m[<span class="d">0</span>][<span class="d">0</span>],
+</code><code id="L1713"><span class="ln">1713</span> b<span class="s"> = </span><b>this</b>.m[<span class="d">1</span>][<span class="d">0</span>],
+</code><code id="L1714"><span class="ln">1714</span> c<span class="s"> = </span><b>this</b>.m[<span class="d">0</span>][<span class="d">1</span>],
+</code><code id="L1715"><span class="ln">1715</span> d<span class="s"> = </span><b>this</b>.m[<span class="d">1</span>][<span class="d">1</span>],
+</code><code id="L1716"><span class="ln">1716</span> e<span class="s"> = </span><b>this</b>.m[<span class="d">0</span>][<span class="d">2</span>],
+</code><code id="L1717"><span class="ln">1717</span> f<span class="s"> = </span><b>this</b>.m[<span class="d">1</span>][<span class="d">2</span>],
+</code><code id="L1718"><span class="ln">1718</span> x<span class="s"> = </span>a<span class="s"> * </span>d<span class="s"> - </span>b<span class="s"> * </span>c;
+</code><code id="L1719"><span class="ln">1719</span> <b>return</b> <b>new</b> Matrix(d<span class="s"> / </span>x, -b<span class="s"> / </span>x, -c<span class="s"> / </span>x, a<span class="s"> / </span>x, (c<span class="s"> * </span>f<span class="s"> - </span>d<span class="s"> * </span>e)<span class="s"> / </span>x, (b<span class="s"> * </span>e<span class="s"> - </span>a<span class="s"> * </span>f)<span class="s"> / </span>x);
+</code><code id="L1720"><span class="ln">1720</span> };
+</code><code id="L1721"><span class="ln">1721</span> matrixproto.clone<span class="s"> = </span><b>function</b> () {
+</code><code id="L1722"><span class="ln">1722</span> <b>var</b> a<span class="s"> = </span><b>this</b>.m[<span class="d">0</span>][<span class="d">0</span>],
+</code><code id="L1723"><span class="ln">1723</span> b<span class="s"> = </span><b>this</b>.m[<span class="d">1</span>][<span class="d">0</span>],
+</code><code id="L1724"><span class="ln">1724</span> c<span class="s"> = </span><b>this</b>.m[<span class="d">0</span>][<span class="d">1</span>],
+</code><code id="L1725"><span class="ln">1725</span> d<span class="s"> = </span><b>this</b>.m[<span class="d">1</span>][<span class="d">1</span>],
+</code><code id="L1726"><span class="ln">1726</span> e<span class="s"> = </span><b>this</b>.m[<span class="d">0</span>][<span class="d">2</span>],
+</code><code id="L1727"><span class="ln">1727</span> f<span class="s"> = </span><b>this</b>.m[<span class="d">1</span>][<span class="d">2</span>];
+</code><code id="L1728"><span class="ln">1728</span> <b>return</b> <b>new</b> Matrix(a, b, c, d, e, f);
+</code><code id="L1729"><span class="ln">1729</span> };
+</code><code id="L1730"><span class="ln">1730</span> matrixproto.translate<span class="s"> = </span><b>function</b> (x, y) {
+</code><code id="L1731"><span class="ln">1731</span> <b>this</b>.add(<span class="d">1</span>, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, x, y);
+</code><code id="L1732"><span class="ln">1732</span> };
+</code><code id="L1733"><span class="ln">1733</span> matrixproto.scale<span class="s"> = </span><b>function</b> (x, y, cx, cy) {
+</code><code id="L1734"><span class="ln">1734</span> y<span class="s"> == </span><b>null</b><span class="s"> && </span>(y<span class="s"> = </span>x);
+</code><code id="L1735"><span class="ln">1735</span> <b>this</b>.add(<span class="d">1</span>, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, cx, cy);
+</code><code id="L1736"><span class="ln">1736</span> <b>this</b>.add(x, <span class="d">0</span>, <span class="d">0</span>, y, <span class="d">0</span>, <span class="d">0</span>);
+</code><code id="L1737"><span class="ln">1737</span> <b>this</b>.add(<span class="d">1</span>, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, -cx, -cy);
+</code><code id="L1738"><span class="ln">1738</span> };
+</code><code id="L1739"><span class="ln">1739</span> matrixproto.rotate<span class="s"> = </span><b>function</b> (a, x, y) {
+</code><code id="L1740"><span class="ln">1740</span> a<span class="s"> = </span>R.rad(a);
+</code><code id="L1741"><span class="ln">1741</span> <b>var</b> cos<span class="s"> = </span>+math.cos(a).toFixed(<span class="d">9</span>),
+</code><code id="L1742"><span class="ln">1742</span> sin<span class="s"> = </span>+math.sin(a).toFixed(<span class="d">9</span>);
+</code><code id="L1743"><span class="ln">1743</span> <b>this</b>.add(cos, sin, -sin, cos, x, y);
+</code><code id="L1744"><span class="ln">1744</span> <b>this</b>.add(<span class="d">1</span>, <span class="d">0</span>, <span class="d">0</span>, <span class="d">1</span>, -x, -y);
+</code><code id="L1745"><span class="ln">1745</span> };
+</code><code id="L1746"><span class="ln">1746</span> matrixproto.x<span class="s"> = </span><b>function</b> (x, y) {
+</code><code id="L1747"><span class="ln">1747</span> <b>return</b> x<span class="s"> * </span><b>this</b>.m[<span class="d">0</span>][<span class="d">0</span>]<span class="s"> + </span>y<span class="s"> * </span><b>this</b>.m[<span class="d">0</span>][<span class="d">1</span>]<span class="s"> + </span><b>this</b>.m[<span class="d">0</span>][<span class="d">2</span>];
+</code><code id="L1748"><span class="ln">1748</span> };
+</code><code id="L1749"><span class="ln">1749</span> matrixproto.y<span class="s"> = </span><b>function</b> (x, y) {
+</code><code id="L1750"><span class="ln">1750</span> <b>return</b> x<span class="s"> * </span><b>this</b>.m[<span class="d">1</span>][<span class="d">0</span>]<span class="s"> + </span>y<span class="s"> * </span><b>this</b>.m[<span class="d">1</span>][<span class="d">1</span>]<span class="s"> + </span><b>this</b>.m[<span class="d">1</span>][<span class="d">2</span>];
+</code><code id="L1751"><span class="ln">1751</span> };
+</code><code id="L1752"><span class="ln">1752</span> matrixproto.get<span class="s"> = </span><b>function</b> (i, j) {
+</code><code id="L1753"><span class="ln">1753</span> <b>return</b> +<b>this</b>.m[i][j].toFixed(<span class="d">4</span>);
+</code><code id="L1754"><span class="ln">1754</span> };
+</code><code id="L1755"><span class="ln">1755</span> matrixproto.toString<span class="s"> = </span><b>function</b> () {
+</code><code id="L1756"><span class="ln">1756</span> <b>return</b> R.svg ?
+</code><code id="L1757"><span class="ln">1757</span> <i>"matrix("</i><span class="s"> + </span>[<b>this</b>.get(<span class="d">0</span>, <span class="d">0</span>), <b>this</b>.get(<span class="d">1</span>, <span class="d">0</span>), <b>this</b>.get(<span class="d">0</span>, <span class="d">1</span>), <b>this</b>.get(<span class="d">1</span>, <span class="d">1</span>), <b>this</b>.get(<span class="d">0</span>, <span class="d">2</span>), <b>this</b>.get(<span class="d">1</span>, <span class="d">2</span>)].join()<span class="s"> + </span><i>")"</i> :
+</code><code id="L1758"><span class="ln">1758</span> [<b>this</b>.get(<span class="d">0</span>, <span class="d">0</span>), <b>this</b>.get(<span class="d">0</span>, <span class="d">1</span>), <b>this</b>.get(<span class="d">1</span>, <span class="d">0</span>), <b>this</b>.get(<span class="d">1</span>, <span class="d">1</span>), <span class="d">0</span>, <span class="d">0</span>].join();
+</code><code id="L1759"><span class="ln">1759</span> };
+</code><code id="L1760"><span class="ln">1760</span> matrixproto.toFilter<span class="s"> = </span><b>function</b> () {
+</code><code id="L1761"><span class="ln">1761</span> <b>return</b> <i>"progid:DXImageTransform.Microsoft.Matrix(M11="</i><span class="s"> + </span><b>this</b>.get(<span class="d">0</span>, <span class="d">0</span>) +
+</code><code id="L1762"><span class="ln">1762</span> <i>", M12="</i><span class="s"> + </span><b>this</b>.get(<span class="d">0</span>, <span class="d">1</span>)<span class="s"> + </span><i>", M21="</i><span class="s"> + </span><b>this</b>.get(<span class="d">1</span>, <span class="d">0</span>)<span class="s"> + </span><i>", M22="</i><span class="s"> + </span><b>this</b>.get(<span class="d">1</span>, <span class="d">1</span>) +
+</code><code id="L1763"><span class="ln">1763</span> <i>", Dx="</i><span class="s"> + </span><b>this</b>.get(<span class="d">0</span>, <span class="d">2</span>)<span class="s"> + </span><i>", Dy="</i><span class="s"> + </span><b>this</b>.get(<span class="d">1</span>, <span class="d">2</span>)<span class="s"> + </span><i>", sizingmedthod='auto expand')"</i>;
+</code><code id="L1764"><span class="ln">1764</span> };
+</code><code id="L1765"><span class="ln">1765</span> matrixproto.offset<span class="s"> = </span><b>function</b> () {
+</code><code id="L1766"><span class="ln">1766</span> <b>return</b> [<b>this</b>.m[<span class="d">0</span>][<span class="d">2</span>].toFixed(<span class="d">4</span>), <b>this</b>.m[<span class="d">1</span>][<span class="d">2</span>].toFixed(<span class="d">4</span>)];
+</code><code id="L1767"><span class="ln">1767</span> };
+</code><code id="L1768"><span class="ln">1768</span>
+</code><code id="L1769"><span class="ln">1769</span> R.Matrix<span class="s"> = </span>Matrix;
+</code><code id="L1770"><span class="ln">1770</span>
+</code><code id="L1771"><span class="ln">1771</span> <span class="c">// SVG</span>
+</code><code id="L1772"><span class="ln">1772</span> <b>if</b> (R.svg) {
+</code><code id="L1773"><span class="ln">1773</span> <b>var</b> xlink<span class="s"> = </span><i>"http:<span class="c">//www.w3.org/<span class="d">1999</span>/xlink"</i>,</span>
+</code><code id="L1774"><span class="ln">1774</span> markers<span class="s"> = </span>{
+</code><code id="L1775"><span class="ln">1775</span> block: <i>"M5,<span class="d">0</span> <span class="d">0</span>,<span class="d">2.5</span> <span class="d">5</span>,5z"</i>,
+</code><code id="L1776"><span class="ln">1776</span> classic: <i>"M5,<span class="d">0</span> <span class="d">0</span>,<span class="d">2.5</span> <span class="d">5</span>,<span class="d">5</span> <span class="d">3.5</span>,<span class="d">3</span> <span class="d">3.5</span>,2z"</i>,
+</code><code id="L1777"><span class="ln">1777</span> diamond: <i>"M2<span class="d">.5</span>,<span class="d">0</span> <span class="d">5</span>,<span class="d">2.5</span> <span class="d">2.5</span>,<span class="d">5</span> <span class="d">0</span>,<span class="d">2</span>.5z"</i>,
+</code><code id="L1778"><span class="ln">1778</span> open: <i>"M6,<span class="d">1</span> <span class="d">1</span>,<span class="d">3.5</span> <span class="d">6</span>,<span class="d">6</span>"</i>,
+</code><code id="L1779"><span class="ln">1779</span> oval: <i>"M2<span class="d">.5</span>,0A2<span class="d">.5</span>,<span class="d">2.5</span>,<span class="d">0</span>,<span class="d">0</span>,<span class="d">1</span>,<span class="d">2.5</span>,<span class="d">5</span> <span class="d">2.5</span>,<span class="d">2.5</span>,<span class="d">0</span>,<span class="d">0</span>,<span class="d">1</span>,<span class="d">2.5</span>,0z"</i>
+</code><code id="L1780"><span class="ln">1780</span> },
+</code><code id="L1781"><span class="ln">1781</span> markerCounter<span class="s"> = </span>{};
+</code><code id="L1782"><span class="ln">1782</span> R.toString<span class="s"> = </span><b>function</b> () {
+</code><code id="L1783"><span class="ln">1783</span> <b>return</b> <i>"Your browser supports SVG.\nYou are running Rapha\xebl "</i><span class="s"> + </span><b>this</b>.version;
+</code><code id="L1784"><span class="ln">1784</span> };
+</code><code id="L1785"><span class="ln">1785</span> <b>var</b> $<span class="s"> = </span><b>function</b> (el, attr) {
+</code><code id="L1786"><span class="ln">1786</span> <b>if</b> (attr) {
+</code><code id="L1787"><span class="ln">1787</span> <b>if</b> (<b>typeof</b> el<span class="s"> == </span><i>"string"</i>) {
+</code><code id="L1788"><span class="ln">1788</span> el<span class="s"> = </span>$(el);
+</code><code id="L1789"><span class="ln">1789</span> }
+</code><code id="L1790"><span class="ln">1790</span> <b>for</b> (<b>var</b> key <b>in</b> attr) <b>if</b> (attr[has](key)) {
+</code><code id="L1791"><span class="ln">1791</span> <b>if</b> (key.substring(<span class="d">0</span>, <span class="d">6</span>)<span class="s"> == </span><i>"xlink:"</i>) {
+</code><code id="L1792"><span class="ln">1792</span> el.setAttributeNS(xlink, key.substring(<span class="d">6</span>), Str(attr[key]));
+</code><code id="L1793"><span class="ln">1793</span> } <b>else</b> {
+</code><code id="L1794"><span class="ln">1794</span> el[setAttribute](key, Str(attr[key]));
+</code><code id="L1795"><span class="ln">1795</span> }
+</code><code id="L1796"><span class="ln">1796</span> }
+</code><code id="L1797"><span class="ln">1797</span> } <b>else</b> {
+</code><code id="L1798"><span class="ln">1798</span> el<span class="s"> = </span>g.doc.createElementNS(<i>"http:<span class="c">//www.w3.org/<span class="d">2000</span>/svg"</i>, el);</span>
+</code><code id="L1799"><span class="ln">1799</span> el.style<span class="s"> && </span>(el.style.webkitTapHighlightColor<span class="s"> = </span><i>"rgba(<span class="d">0</span>,<span class="d">0</span>,<span class="d">0</span>,<span class="d">0</span>)"</i>);
+</code><code id="L1800"><span class="ln">1800</span> }
+</code><code id="L1801"><span class="ln">1801</span> <b>return</b> el;
+</code><code id="L1802"><span class="ln">1802</span> },
+</code><code id="L1803"><span class="ln">1803</span> thePath<span class="s"> = </span><b>function</b> (pathString, SVG) {
+</code><code id="L1804"><span class="ln">1804</span> <b>var</b> el<span class="s"> = </span>$(<i>"path"</i>);
+</code><code id="L1805"><span class="ln">1805</span> SVG.canvas<span class="s"> && </span>SVG.canvas.appendChild(el);
+</code><code id="L1806"><span class="ln">1806</span> <b>var</b> p<span class="s"> = </span><b>new</b> Element(el, SVG);
+</code><code id="L1807"><span class="ln">1807</span> p.type<span class="s"> = </span><i>"path"</i>;
+</code><code id="L1808"><span class="ln">1808</span> setFillAndStroke(p, {fill: <i>"none"</i>, stroke: <i>"#<span class="d">000</span>"</i>, path: pathString});
+</code><code id="L1809"><span class="ln">1809</span> <b>return</b> p;
+</code><code id="L1810"><span class="ln">1810</span> },
+</code><code id="L1811"><span class="ln">1811</span> gradients<span class="s"> = </span>{},
+</code><code id="L1812"><span class="ln">1812</span> rgGrad<span class="s"> = </span>/^url\(#(.*)\)$/,
+</code><code id="L1813"><span class="ln">1813</span> removeGradientFill<span class="s"> = </span><b>function</b> (node, paper) {
+</code><code id="L1814"><span class="ln">1814</span> <b>var</b> oid<span class="s"> = </span>node.getAttribute(fillString);
+</code><code id="L1815"><span class="ln">1815</span> oid<span class="s"> = </span>oid<span class="s"> && </span>oid.match(rgGrad);
+</code><code id="L1816"><span class="ln">1816</span> <b>if</b> (oid<span class="s"> && </span>!--gradients[oid[<span class="d">1</span>]]) {
+</code><code id="L1817"><span class="ln">1817</span> <b>delete</b> gradients[oid[<span class="d">1</span>]];
+</code><code id="L1818"><span class="ln">1818</span> paper.defs.removeChild(g.doc.getElementById(oid[<span class="d">1</span>]));
+</code><code id="L1819"><span class="ln">1819</span> }
+</code><code id="L1820"><span class="ln">1820</span> },
+</code><code id="L1821"><span class="ln">1821</span> addGradientFill<span class="s"> = </span><b>function</b> (element, gradient) {
+</code><code id="L1822"><span class="ln">1822</span> <b>var</b> type<span class="s"> = </span><i>"linear"</i>,
+</code><code id="L1823"><span class="ln">1823</span> id<span class="s"> = </span>element.id<span class="s"> + </span>gradient,
+</code><code id="L1824"><span class="ln">1824</span> fx<span class="s"> = </span><span class="d">.5</span>, fy<span class="s"> = </span><span class="d">.5</span>,
+</code><code id="L1825"><span class="ln">1825</span> o<span class="s"> = </span>element.node,
+</code><code id="L1826"><span class="ln">1826</span> SVG<span class="s"> = </span>element.paper,
+</code><code id="L1827"><span class="ln">1827</span> s<span class="s"> = </span>o.style,
+</code><code id="L1828"><span class="ln">1828</span> el<span class="s"> = </span>g.doc.getElementById(id);
+</code><code id="L1829"><span class="ln">1829</span> <b>if</b> (!el) {
+</code><code id="L1830"><span class="ln">1830</span> gradient<span class="s"> = </span>Str(gradient).replace(radial_gradient, <b>function</b> (all, _fx, _fy) {
+</code><code id="L1831"><span class="ln">1831</span> type<span class="s"> = </span><i>"radial"</i>;
+</code><code id="L1832"><span class="ln">1832</span> <b>if</b> (_fx<span class="s"> && </span>_fy) {
+</code><code id="L1833"><span class="ln">1833</span> fx<span class="s"> = </span>toFloat(_fx);
+</code><code id="L1834"><span class="ln">1834</span> fy<span class="s"> = </span>toFloat(_fy);
+</code><code id="L1835"><span class="ln">1835</span> <b>var</b> dir<span class="s"> = </span>((fy > <span class="d">.5</span>)<span class="s"> * </span><span class="d">2</span><span class="s"> - </span><span class="d">1</span>);
+</code><code id="L1836"><span class="ln">1836</span> pow(fx<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>)<span class="s"> + </span>pow(fy<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>) > <span class="d">.25</span> &&
+</code><code id="L1837"><span class="ln">1837</span> (fy<span class="s"> = </span>math.sqrt(<span class="d">.25</span><span class="s"> - </span>pow(fx<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>))<span class="s"> * </span>dir<span class="s"> + </span><span class="d">.5</span>) &&
+</code><code id="L1838"><span class="ln">1838</span> fy != <span class="d">.5</span> &&
+</code><code id="L1839"><span class="ln">1839</span> (fy<span class="s"> = </span>fy.toFixed(<span class="d">5</span>)<span class="s"> - </span><span class="d">1e-5</span><span class="s"> * </span>dir);
+</code><code id="L1840"><span class="ln">1840</span> }
+</code><code id="L1841"><span class="ln">1841</span> <b>return</b> E;
+</code><code id="L1842"><span class="ln">1842</span> });
+</code><code id="L1843"><span class="ln">1843</span> gradient<span class="s"> = </span>gradient.split(/\s*\-\s*/);
+</code><code id="L1844"><span class="ln">1844</span> <b>if</b> (type<span class="s"> == </span><i>"linear"</i>) {
+</code><code id="L1845"><span class="ln">1845</span> <b>var</b> angle<span class="s"> = </span>gradient.shift();
+</code><code id="L1846"><span class="ln">1846</span> angle<span class="s"> = </span>-toFloat(angle);
+</code><code id="L1847"><span class="ln">1847</span> <b>if</b> (isNaN(angle)) {
+</code><code id="L1848"><span class="ln">1848</span> <b>return</b> <b>null</b>;
+</code><code id="L1849"><span class="ln">1849</span> }
+</code><code id="L1850"><span class="ln">1850</span> <b>var</b> vector<span class="s"> = </span>[<span class="d">0</span>, <span class="d">0</span>, math.cos(R.rad(angle)), math.sin(R.rad(angle))],
+</code><code id="L1851"><span class="ln">1851</span> max<span class="s"> = </span><span class="d">1</span><span class="s"> / </span>(mmax(abs(vector[<span class="d">2</span>]), abs(vector[<span class="d">3</span>]))<span class="s"> || </span><span class="d">1</span>);
+</code><code id="L1852"><span class="ln">1852</span> vector[<span class="d">2</span>] *= max;
+</code><code id="L1853"><span class="ln">1853</span> vector[<span class="d">3</span>] *= max;
+</code><code id="L1854"><span class="ln">1854</span> <b>if</b> (vector[<span class="d">2</span>] < <span class="d">0</span>) {
+</code><code id="L1855"><span class="ln">1855</span> vector[<span class="d">0</span>]<span class="s"> = </span>-vector[<span class="d">2</span>];
+</code><code id="L1856"><span class="ln">1856</span> vector[<span class="d">2</span>]<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L1857"><span class="ln">1857</span> }
+</code><code id="L1858"><span class="ln">1858</span> <b>if</b> (vector[<span class="d">3</span>] < <span class="d">0</span>) {
+</code><code id="L1859"><span class="ln">1859</span> vector[<span class="d">1</span>]<span class="s"> = </span>-vector[<span class="d">3</span>];
+</code><code id="L1860"><span class="ln">1860</span> vector[<span class="d">3</span>]<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L1861"><span class="ln">1861</span> }
+</code><code id="L1862"><span class="ln">1862</span> }
+</code><code id="L1863"><span class="ln">1863</span> <b>var</b> dots<span class="s"> = </span>parseDots(gradient);
+</code><code id="L1864"><span class="ln">1864</span> <b>if</b> (!dots) {
+</code><code id="L1865"><span class="ln">1865</span> <b>return</b> <b>null</b>;
+</code><code id="L1866"><span class="ln">1866</span> }
+</code><code id="L1867"><span class="ln">1867</span> <b>if</b> (element.gradient) {
+</code><code id="L1868"><span class="ln">1868</span> SVG.defs.removeChild(element.gradient);
+</code><code id="L1869"><span class="ln">1869</span> <b>delete</b> element.gradient;
+</code><code id="L1870"><span class="ln">1870</span> }
+</code><code id="L1871"><span class="ln">1871</span>
+</code><code id="L1872"><span class="ln">1872</span> el<span class="s"> = </span>$(type<span class="s"> + </span><i>"Gradient"</i>, {id: id});
+</code><code id="L1873"><span class="ln">1873</span> element.gradient<span class="s"> = </span>el;
+</code><code id="L1874"><span class="ln">1874</span> $(el, type<span class="s"> == </span><i>"radial"</i> ? {
+</code><code id="L1875"><span class="ln">1875</span> fx: fx,
+</code><code id="L1876"><span class="ln">1876</span> fy: fy
+</code><code id="L1877"><span class="ln">1877</span> } : {
+</code><code id="L1878"><span class="ln">1878</span> x1: vector[<span class="d">0</span>],
+</code><code id="L1879"><span class="ln">1879</span> y1: vector[<span class="d">1</span>],
+</code><code id="L1880"><span class="ln">1880</span> x2: vector[<span class="d">2</span>],
+</code><code id="L1881"><span class="ln">1881</span> y2: vector[<span class="d">3</span>],
+</code><code id="L1882"><span class="ln">1882</span> gradientTransform: element.matrix.invert()
+</code><code id="L1883"><span class="ln">1883</span> });
+</code><code id="L1884"><span class="ln">1884</span> SVG.defs.appendChild(el);
+</code><code id="L1885"><span class="ln">1885</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>dots.length; i < ii; i++) {
+</code><code id="L1886"><span class="ln">1886</span> el.appendChild($(<i>"stop"</i>, {
+</code><code id="L1887"><span class="ln">1887</span> offset: dots[i].offset ? dots[i].offset : i ? <i>"<span class="d">100</span>%"</i> : <i>"<span class="d">0</span>%"</i>,
+</code><code id="L1888"><span class="ln">1888</span> <i>"stop-color"</i>: dots[i].color<span class="s"> || </span><i>"#fff"</i>
+</code><code id="L1889"><span class="ln">1889</span> }));
+</code><code id="L1890"><span class="ln">1890</span> }
+</code><code id="L1891"><span class="ln">1891</span> }
+</code><code id="L1892"><span class="ln">1892</span> $(o, {
+</code><code id="L1893"><span class="ln">1893</span> fill: <i>"url(#"</i><span class="s"> + </span>id<span class="s"> + </span><i>")"</i>,
+</code><code id="L1894"><span class="ln">1894</span> opacity: <span class="d">1</span>,
+</code><code id="L1895"><span class="ln">1895</span> <i>"fill-opacity"</i>: <span class="d">1</span>
+</code><code id="L1896"><span class="ln">1896</span> });
+</code><code id="L1897"><span class="ln">1897</span> s.fill<span class="s"> = </span>E;
+</code><code id="L1898"><span class="ln">1898</span> s.opacity<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L1899"><span class="ln">1899</span> s.fillOpacity<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L1900"><span class="ln">1900</span> <b>return</b> <span class="d">1</span>;
+</code><code id="L1901"><span class="ln">1901</span> },
+</code><code id="L1902"><span class="ln">1902</span> updatePosition<span class="s"> = </span><b>function</b> (o) {
+</code><code id="L1903"><span class="ln">1903</span> <b>var</b> bbox<span class="s"> = </span>o.getBBox(<span class="d">1</span>);
+</code><code id="L1904"><span class="ln">1904</span> $(o.pattern, {patternTransform: o.matrix.invert()<span class="s"> + </span><i>" translate("</i><span class="s"> + </span>bbox.x<span class="s"> + </span><i>","</i><span class="s"> + </span>bbox.y<span class="s"> + </span><i>")"</i>});
+</code><code id="L1905"><span class="ln">1905</span> },
+</code><code id="L1906"><span class="ln">1906</span> addArrow<span class="s"> = </span><b>function</b> (o, value, isEnd) {
+</code><code id="L1907"><span class="ln">1907</span> <b>if</b> (o.type<span class="s"> == </span><i>"path"</i>) {
+</code><code id="L1908"><span class="ln">1908</span> <b>var</b> values<span class="s"> = </span>Str(value).toLowerCase().split(<i>"-"</i>),
+</code><code id="L1909"><span class="ln">1909</span> p<span class="s"> = </span>o.paper,
+</code><code id="L1910"><span class="ln">1910</span> se<span class="s"> = </span>isEnd ? <i>"end"</i> : <i>"start"</i>,
+</code><code id="L1911"><span class="ln">1911</span> node<span class="s"> = </span>o.node,
+</code><code id="L1912"><span class="ln">1912</span> attrs<span class="s"> = </span>o.attrs,
+</code><code id="L1913"><span class="ln">1913</span> stroke<span class="s"> = </span>attrs[<i>"stroke-width"</i>],
+</code><code id="L1914"><span class="ln">1914</span> i<span class="s"> = </span>values.length,
+</code><code id="L1915"><span class="ln">1915</span> type<span class="s"> = </span><i>"classic"</i>,
+</code><code id="L1916"><span class="ln">1916</span> from,
+</code><code id="L1917"><span class="ln">1917</span> to,
+</code><code id="L1918"><span class="ln">1918</span> dx,
+</code><code id="L1919"><span class="ln">1919</span> refX,
+</code><code id="L1920"><span class="ln">1920</span> attr,
+</code><code id="L1921"><span class="ln">1921</span> w<span class="s"> = </span><span class="d">3</span>,
+</code><code id="L1922"><span class="ln">1922</span> h<span class="s"> = </span><span class="d">3</span>,
+</code><code id="L1923"><span class="ln">1923</span> t<span class="s"> = </span><span class="d">5</span>;
+</code><code id="L1924"><span class="ln">1924</span> <b>while</b> (i--) {
+</code><code id="L1925"><span class="ln">1925</span> <b>switch</b> (values[i]) {
+</code><code id="L1926"><span class="ln">1926</span> <b>case</b> <i>"block"</i>:
+</code><code id="L1927"><span class="ln">1927</span> <b>case</b> <i>"classic"</i>:
+</code><code id="L1928"><span class="ln">1928</span> <b>case</b> <i>"oval"</i>:
+</code><code id="L1929"><span class="ln">1929</span> <b>case</b> <i>"diamond"</i>:
+</code><code id="L1930"><span class="ln">1930</span> <b>case</b> <i>"open"</i>:
+</code><code id="L1931"><span class="ln">1931</span> <b>case</b> <i>"none"</i>:
+</code><code id="L1932"><span class="ln">1932</span> type<span class="s"> = </span>values[i];
+</code><code id="L1933"><span class="ln">1933</span> <b>break</b>;
+</code><code id="L1934"><span class="ln">1934</span> <b>case</b> <i>"wide"</i>: h<span class="s"> = </span><span class="d">5</span>; <b>break</b>;
+</code><code id="L1935"><span class="ln">1935</span> <b>case</b> <i>"narrow"</i>: h<span class="s"> = </span><span class="d">2</span>; <b>break</b>;
+</code><code id="L1936"><span class="ln">1936</span> <b>case</b> <i>"<b>long</b>"</i>: w<span class="s"> = </span><span class="d">5</span>; <b>break</b>;
+</code><code id="L1937"><span class="ln">1937</span> <b>case</b> <i>"<b>short</b>"</i>: w<span class="s"> = </span><span class="d">2</span>; <b>break</b>;
+</code><code id="L1938"><span class="ln">1938</span> }
+</code><code id="L1939"><span class="ln">1939</span> }
+</code><code id="L1940"><span class="ln">1940</span> <b>if</b> (type<span class="s"> == </span><i>"open"</i>) {
+</code><code id="L1941"><span class="ln">1941</span> w += <span class="d">2</span>;
+</code><code id="L1942"><span class="ln">1942</span> h += <span class="d">2</span>;
+</code><code id="L1943"><span class="ln">1943</span> t += <span class="d">2</span>;
+</code><code id="L1944"><span class="ln">1944</span> dx<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L1945"><span class="ln">1945</span> refX<span class="s"> = </span>isEnd ? <span class="d">4</span> : <span class="d">1</span>;
+</code><code id="L1946"><span class="ln">1946</span> attr<span class="s"> = </span>{
+</code><code id="L1947"><span class="ln">1947</span> fill: <i>"none"</i>,
+</code><code id="L1948"><span class="ln">1948</span> stroke: attrs.stroke
+</code><code id="L1949"><span class="ln">1949</span> };
+</code><code id="L1950"><span class="ln">1950</span> } <b>else</b> {
+</code><code id="L1951"><span class="ln">1951</span> refX<span class="s"> = </span>dx<span class="s"> = </span>w<span class="s"> / </span><span class="d">2</span>;
+</code><code id="L1952"><span class="ln">1952</span> attr<span class="s"> = </span>{
+</code><code id="L1953"><span class="ln">1953</span> fill: attrs.stroke,
+</code><code id="L1954"><span class="ln">1954</span> stroke: <i>"none"</i>
+</code><code id="L1955"><span class="ln">1955</span> };
+</code><code id="L1956"><span class="ln">1956</span> }
+</code><code id="L1957"><span class="ln">1957</span> <b>if</b> (o._.arrows) {
+</code><code id="L1958"><span class="ln">1958</span> <b>if</b> (isEnd) {
+</code><code id="L1959"><span class="ln">1959</span> o._.arrows.endPath<span class="s"> && </span>markerCounter[o._.arrows.endPath]--;
+</code><code id="L1960"><span class="ln">1960</span> o._.arrows.endMarker<span class="s"> && </span>markerCounter[o._.arrows.endMarker]--;
+</code><code id="L1961"><span class="ln">1961</span> } <b>else</b> {
+</code><code id="L1962"><span class="ln">1962</span> o._.arrows.startPath<span class="s"> && </span>markerCounter[o._.arrows.startPath]--;
+</code><code id="L1963"><span class="ln">1963</span> o._.arrows.startMarker<span class="s"> && </span>markerCounter[o._.arrows.startMarker]--;
+</code><code id="L1964"><span class="ln">1964</span> }
+</code><code id="L1965"><span class="ln">1965</span> } <b>else</b> {
+</code><code id="L1966"><span class="ln">1966</span> o._.arrows<span class="s"> = </span>{};
+</code><code id="L1967"><span class="ln">1967</span> }
+</code><code id="L1968"><span class="ln">1968</span> <b>if</b> (type != <i>"none"</i>) {
+</code><code id="L1969"><span class="ln">1969</span> <b>var</b> pathId<span class="s"> = </span><i>"raphael-marker-"</i><span class="s"> + </span>type,
+</code><code id="L1970"><span class="ln">1970</span> markerId<span class="s"> = </span><i>"raphael-marker-"</i><span class="s"> + </span>se<span class="s"> + </span>type<span class="s"> + </span>w<span class="s"> + </span>h;
+</code><code id="L1971"><span class="ln">1971</span> <b>if</b> (!g.doc.getElementById(pathId)) {
+</code><code id="L1972"><span class="ln">1972</span> p.defs.appendChild($($(<i>"path"</i>), {
+</code><code id="L1973"><span class="ln">1973</span> <i>"stroke-linecap"</i>: <i>"round"</i>,
+</code><code id="L1974"><span class="ln">1974</span> d: markers[type],
+</code><code id="L1975"><span class="ln">1975</span> id: pathId
+</code><code id="L1976"><span class="ln">1976</span> }));
+</code><code id="L1977"><span class="ln">1977</span> markerCounter[pathId]<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L1978"><span class="ln">1978</span> } <b>else</b> {
+</code><code id="L1979"><span class="ln">1979</span> markerCounter[pathId]++;
+</code><code id="L1980"><span class="ln">1980</span> }
+</code><code id="L1981"><span class="ln">1981</span> <b>var</b> marker<span class="s"> = </span>g.doc.getElementById(markerId),
+</code><code id="L1982"><span class="ln">1982</span> use;
+</code><code id="L1983"><span class="ln">1983</span> <b>if</b> (!marker) {
+</code><code id="L1984"><span class="ln">1984</span> marker<span class="s"> = </span>$($(<i>"marker"</i>), {
+</code><code id="L1985"><span class="ln">1985</span> id: markerId,
+</code><code id="L1986"><span class="ln">1986</span> markerHeight: h,
+</code><code id="L1987"><span class="ln">1987</span> markerWidth: w,
+</code><code id="L1988"><span class="ln">1988</span> orient: <i>"auto"</i>,
+</code><code id="L1989"><span class="ln">1989</span> refX: refX,
+</code><code id="L1990"><span class="ln">1990</span> refY: h<span class="s"> / </span><span class="d">2</span>
+</code><code id="L1991"><span class="ln">1991</span> });
+</code><code id="L1992"><span class="ln">1992</span> use<span class="s"> = </span>$($(<i>"use"</i>), {
+</code><code id="L1993"><span class="ln">1993</span> <i>"xlink:href"</i>: <i>"#"</i><span class="s"> + </span>pathId,
+</code><code id="L1994"><span class="ln">1994</span> transform: (isEnd ? <i>" rotate(<span class="d">180</span> "</i><span class="s"> + </span>w<span class="s"> / </span><span class="d">2</span><span class="s"> + </span><i>" "</i><span class="s"> + </span>h<span class="s"> / </span><span class="d">2</span><span class="s"> + </span><i>") "</i> : S)<span class="s"> + </span><i>"scale("</i><span class="s"> + </span>w<span class="s"> / </span>t<span class="s"> + </span><i>","</i><span class="s"> + </span>h<span class="s"> / </span>t<span class="s"> + </span><i>")"</i>,
+</code><code id="L1995"><span class="ln">1995</span> <i>"stroke-width"</i>: <span class="d">1</span><span class="s"> / </span>((w<span class="s"> / </span>t<span class="s"> + </span>h<span class="s"> / </span>t)<span class="s"> / </span><span class="d">2</span>)
+</code><code id="L1996"><span class="ln">1996</span> });
+</code><code id="L1997"><span class="ln">1997</span> marker.appendChild(use);
+</code><code id="L1998"><span class="ln">1998</span> p.defs.appendChild(marker);
+</code><code id="L1999"><span class="ln">1999</span> markerCounter[markerId]<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2000"><span class="ln">2000</span> } <b>else</b> {
+</code><code id="L2001"><span class="ln">2001</span> markerCounter[markerId]++;
+</code><code id="L2002"><span class="ln">2002</span> use<span class="s"> = </span>marker.getElementsByTagName(<i>"use"</i>)[<span class="d">0</span>];
+</code><code id="L2003"><span class="ln">2003</span> }
+</code><code id="L2004"><span class="ln">2004</span> $(use, attr);
+</code><code id="L2005"><span class="ln">2005</span> <b>var</b> delta<span class="s"> = </span>dx<span class="s"> * </span>(type != <i>"diamond"</i><span class="s"> && </span>type != <i>"oval"</i>);
+</code><code id="L2006"><span class="ln">2006</span> <b>if</b> (isEnd) {
+</code><code id="L2007"><span class="ln">2007</span> from<span class="s"> = </span>o._.arrows.startdx<span class="s"> * </span>stroke<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L2008"><span class="ln">2008</span> to<span class="s"> = </span>R.getTotalLength(attrs.path)<span class="s"> - </span>delta<span class="s"> * </span>stroke;
+</code><code id="L2009"><span class="ln">2009</span> } <b>else</b> {
+</code><code id="L2010"><span class="ln">2010</span> from<span class="s"> = </span>delta<span class="s"> * </span>stroke;
+</code><code id="L2011"><span class="ln">2011</span> to<span class="s"> = </span>R.getTotalLength(attrs.path)<span class="s"> - </span>(o._.arrows.enddx<span class="s"> * </span>stroke<span class="s"> || </span><span class="d">0</span>);
+</code><code id="L2012"><span class="ln">2012</span> }
+</code><code id="L2013"><span class="ln">2013</span> attr<span class="s"> = </span>{};
+</code><code id="L2014"><span class="ln">2014</span> attr[<i>"marker-"</i><span class="s"> + </span>se]<span class="s"> = </span><i>"url(#"</i><span class="s"> + </span>markerId<span class="s"> + </span><i>")"</i>;
+</code><code id="L2015"><span class="ln">2015</span> <b>if</b> (to<span class="s"> || </span>from) {
+</code><code id="L2016"><span class="ln">2016</span> attr.d<span class="s"> = </span>Raphael.getSubpath(attrs.path, from, to);
+</code><code id="L2017"><span class="ln">2017</span> }
+</code><code id="L2018"><span class="ln">2018</span> $(node, attr);
+</code><code id="L2019"><span class="ln">2019</span> o._.arrows[se<span class="s"> + </span><i>"Path"</i>]<span class="s"> = </span>pathId;
+</code><code id="L2020"><span class="ln">2020</span> o._.arrows[se<span class="s"> + </span><i>"Marker"</i>]<span class="s"> = </span>markerId;
+</code><code id="L2021"><span class="ln">2021</span> o._.arrows[se<span class="s"> + </span><i>"dx"</i>]<span class="s"> = </span>delta;
+</code><code id="L2022"><span class="ln">2022</span> o._.arrows[se<span class="s"> + </span><i>"Type"</i>]<span class="s"> = </span>type;
+</code><code id="L2023"><span class="ln">2023</span> o._.arrows[se<span class="s"> + </span><i>"String"</i>]<span class="s"> = </span>value;
+</code><code id="L2024"><span class="ln">2024</span> } <b>else</b> {
+</code><code id="L2025"><span class="ln">2025</span> <b>if</b> (isEnd) {
+</code><code id="L2026"><span class="ln">2026</span> from<span class="s"> = </span>o._.arrows.startdx<span class="s"> * </span>stroke<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L2027"><span class="ln">2027</span> to<span class="s"> = </span>R.getTotalLength(attrs.path)<span class="s"> - </span>from;
+</code><code id="L2028"><span class="ln">2028</span> } <b>else</b> {
+</code><code id="L2029"><span class="ln">2029</span> from<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L2030"><span class="ln">2030</span> to<span class="s"> = </span>R.getTotalLength(attrs.path)<span class="s"> - </span>(o._.arrows.enddx<span class="s"> * </span>stroke<span class="s"> || </span><span class="d">0</span>);
+</code><code id="L2031"><span class="ln">2031</span> }
+</code><code id="L2032"><span class="ln">2032</span> o._.arrows[se<span class="s"> + </span><i>"Path"</i>]<span class="s"> && </span>$(node, {d: Raphael.getSubpath(attrs.path, from, to)});
+</code><code id="L2033"><span class="ln">2033</span> <b>delete</b> o._.arrows[se<span class="s"> + </span><i>"Path"</i>];
+</code><code id="L2034"><span class="ln">2034</span> <b>delete</b> o._.arrows[se<span class="s"> + </span><i>"Marker"</i>];
+</code><code id="L2035"><span class="ln">2035</span> <b>delete</b> o._.arrows[se<span class="s"> + </span><i>"dx"</i>];
+</code><code id="L2036"><span class="ln">2036</span> <b>delete</b> o._.arrows[se<span class="s"> + </span><i>"Type"</i>];
+</code><code id="L2037"><span class="ln">2037</span> <b>delete</b> o._.arrows[se<span class="s"> + </span><i>"String"</i>];
+</code><code id="L2038"><span class="ln">2038</span> }
+</code><code id="L2039"><span class="ln">2039</span> <b>for</b> (attr <b>in</b> markerCounter) <b>if</b> (markerCounter[has](attr)<span class="s"> && </span>!markerCounter[attr]) {
+</code><code id="L2040"><span class="ln">2040</span> <b>var</b> item<span class="s"> = </span>g.doc.getElementById(attr);
+</code><code id="L2041"><span class="ln">2041</span> item<span class="s"> && </span>item.parentNode.removeChild(item);
+</code><code id="L2042"><span class="ln">2042</span> }
+</code><code id="L2043"><span class="ln">2043</span> }
+</code><code id="L2044"><span class="ln">2044</span> },
+</code><code id="L2045"><span class="ln">2045</span> setFillAndStroke<span class="s"> = </span><b>function</b> (o, params) {
+</code><code id="L2046"><span class="ln">2046</span> <b>var</b> dasharray<span class="s"> = </span>{
+</code><code id="L2047"><span class="ln">2047</span> <i>""</i>: [<span class="d">0</span>],
+</code><code id="L2048"><span class="ln">2048</span> <i>"none"</i>: [<span class="d">0</span>],
+</code><code id="L2049"><span class="ln">2049</span> <i>"-"</i>: [<span class="d">3</span>, <span class="d">1</span>],
+</code><code id="L2050"><span class="ln">2050</span> <i>"."</i>: [<span class="d">1</span>, <span class="d">1</span>],
+</code><code id="L2051"><span class="ln">2051</span> <i>"-."</i>: [<span class="d">3</span>, <span class="d">1</span>, <span class="d">1</span>, <span class="d">1</span>],
+</code><code id="L2052"><span class="ln">2052</span> <i>"-.."</i>: [<span class="d">3</span>, <span class="d">1</span>, <span class="d">1</span>, <span class="d">1</span>, <span class="d">1</span>, <span class="d">1</span>],
+</code><code id="L2053"><span class="ln">2053</span> <i>". "</i>: [<span class="d">1</span>, <span class="d">3</span>],
+</code><code id="L2054"><span class="ln">2054</span> <i>"- "</i>: [<span class="d">4</span>, <span class="d">3</span>],
+</code><code id="L2055"><span class="ln">2055</span> <i>"--"</i>: [<span class="d">8</span>, <span class="d">3</span>],
+</code><code id="L2056"><span class="ln">2056</span> <i>"- ."</i>: [<span class="d">4</span>, <span class="d">3</span>, <span class="d">1</span>, <span class="d">3</span>],
+</code><code id="L2057"><span class="ln">2057</span> <i>"--."</i>: [<span class="d">8</span>, <span class="d">3</span>, <span class="d">1</span>, <span class="d">3</span>],
+</code><code id="L2058"><span class="ln">2058</span> <i>"--.."</i>: [<span class="d">8</span>, <span class="d">3</span>, <span class="d">1</span>, <span class="d">3</span>, <span class="d">1</span>, <span class="d">3</span>]
+</code><code id="L2059"><span class="ln">2059</span> },
+</code><code id="L2060"><span class="ln">2060</span> node<span class="s"> = </span>o.node,
+</code><code id="L2061"><span class="ln">2061</span> attrs<span class="s"> = </span>o.attrs,
+</code><code id="L2062"><span class="ln">2062</span> addDashes<span class="s"> = </span><b>function</b> (o, value) {
+</code><code id="L2063"><span class="ln">2063</span> value<span class="s"> = </span>dasharray[lowerCase.call(value)];
+</code><code id="L2064"><span class="ln">2064</span> <b>if</b> (value) {
+</code><code id="L2065"><span class="ln">2065</span> <b>var</b> width<span class="s"> = </span>o.attrs[<i>"stroke-width"</i>]<span class="s"> || </span><i>"<span class="d">1</span>"</i>,
+</code><code id="L2066"><span class="ln">2066</span> butt<span class="s"> = </span>{round: width, square: width, butt: <span class="d">0</span>}[o.attrs[<i>"stroke-linecap"</i>]<span class="s"> || </span>params[<i>"stroke-linecap"</i>]]<span class="s"> || </span><span class="d">0</span>,
+</code><code id="L2067"><span class="ln">2067</span> dashes<span class="s"> = </span>[],
+</code><code id="L2068"><span class="ln">2068</span> i<span class="s"> = </span>value.length;
+</code><code id="L2069"><span class="ln">2069</span> <b>while</b> (i--) {
+</code><code id="L2070"><span class="ln">2070</span> dashes[i]<span class="s"> = </span>value[i]<span class="s"> * </span>width<span class="s"> + </span>((i<span class="s"> % </span><span class="d">2</span>) ? <span class="d">1</span> : -<span class="d">1</span>)<span class="s"> * </span>butt;
+</code><code id="L2071"><span class="ln">2071</span> }
+</code><code id="L2072"><span class="ln">2072</span> $(node, {<i>"stroke-dasharray"</i>: dashes.join(<i>","</i>)});
+</code><code id="L2073"><span class="ln">2073</span> }
+</code><code id="L2074"><span class="ln">2074</span> };
+</code><code id="L2075"><span class="ln">2075</span> <b>for</b> (<b>var</b> att <b>in</b> params) {
+</code><code id="L2076"><span class="ln">2076</span> <b>if</b> (params[has](att)) {
+</code><code id="L2077"><span class="ln">2077</span> <b>if</b> (!availableAttrs[has](att)) {
+</code><code id="L2078"><span class="ln">2078</span> <b>continue</b>;
+</code><code id="L2079"><span class="ln">2079</span> }
+</code><code id="L2080"><span class="ln">2080</span> <b>var</b> value<span class="s"> = </span>params[att];
+</code><code id="L2081"><span class="ln">2081</span> attrs[att]<span class="s"> = </span>value;
+</code><code id="L2082"><span class="ln">2082</span> <b>switch</b> (att) {
+</code><code id="L2083"><span class="ln">2083</span> <b>case</b> <i>"blur"</i>:
+</code><code id="L2084"><span class="ln">2084</span> o.blur(value);
+</code><code id="L2085"><span class="ln">2085</span> <b>break</b>;
+</code><code id="L2086"><span class="ln">2086</span> <b>case</b> <i>"href"</i>:
+</code><code id="L2087"><span class="ln">2087</span> <b>case</b> <i>"title"</i>:
+</code><code id="L2088"><span class="ln">2088</span> <b>case</b> <i>"target"</i>:
+</code><code id="L2089"><span class="ln">2089</span> <b>var</b> pn<span class="s"> = </span>node.parentNode;
+</code><code id="L2090"><span class="ln">2090</span> <b>if</b> (lowerCase.call(pn.tagName) != <i>"a"</i>) {
+</code><code id="L2091"><span class="ln">2091</span> <b>var</b> hl<span class="s"> = </span>$(<i>"a"</i>);
+</code><code id="L2092"><span class="ln">2092</span> pn.insertBefore(hl, node);
+</code><code id="L2093"><span class="ln">2093</span> hl.appendChild(node);
+</code><code id="L2094"><span class="ln">2094</span> pn<span class="s"> = </span>hl;
+</code><code id="L2095"><span class="ln">2095</span> }
+</code><code id="L2096"><span class="ln">2096</span> <b>if</b> (att<span class="s"> == </span><i>"target"</i><span class="s"> && </span>value<span class="s"> == </span><i>"blank"</i>) {
+</code><code id="L2097"><span class="ln">2097</span> pn.setAttributeNS(xlink, <i>"show"</i>, <i>"<b>new</b>"</i>);
+</code><code id="L2098"><span class="ln">2098</span> } <b>else</b> {
+</code><code id="L2099"><span class="ln">2099</span> pn.setAttributeNS(xlink, att, value);
+</code><code id="L2100"><span class="ln">2100</span> }
+</code><code id="L2101"><span class="ln">2101</span> <b>break</b>;
+</code><code id="L2102"><span class="ln">2102</span> <b>case</b> <i>"cursor"</i>:
+</code><code id="L2103"><span class="ln">2103</span> node.style.cursor<span class="s"> = </span>value;
+</code><code id="L2104"><span class="ln">2104</span> <b>break</b>;
+</code><code id="L2105"><span class="ln">2105</span> <b>case</b> <i>"transform"</i>:
+</code><code id="L2106"><span class="ln">2106</span> o.transform(value);
+</code><code id="L2107"><span class="ln">2107</span> <b>break</b>;
+</code><code id="L2108"><span class="ln">2108</span> <b>case</b> <i>"arrow-start"</i>:
+</code><code id="L2109"><span class="ln">2109</span> addArrow(o, value);
+</code><code id="L2110"><span class="ln">2110</span> <b>break</b>;
+</code><code id="L2111"><span class="ln">2111</span> <b>case</b> <i>"arrow-end"</i>:
+</code><code id="L2112"><span class="ln">2112</span> addArrow(o, value, <span class="d">1</span>);
+</code><code id="L2113"><span class="ln">2113</span> <b>break</b>;
+</code><code id="L2114"><span class="ln">2114</span> <b>case</b> <i>"clip-rect"</i>:
+</code><code id="L2115"><span class="ln">2115</span> <b>var</b> rect<span class="s"> = </span>Str(value).split(separator);
+</code><code id="L2116"><span class="ln">2116</span> <b>if</b> (rect.length<span class="s"> == </span><span class="d">4</span>) {
+</code><code id="L2117"><span class="ln">2117</span> o.clip<span class="s"> && </span>o.clip.parentNode.parentNode.removeChild(o.clip.parentNode);
+</code><code id="L2118"><span class="ln">2118</span> <b>var</b> el<span class="s"> = </span>$(<i>"clipPath"</i>),
+</code><code id="L2119"><span class="ln">2119</span> rc<span class="s"> = </span>$(<i>"rect"</i>);
+</code><code id="L2120"><span class="ln">2120</span> el.id<span class="s"> = </span>createUUID();
+</code><code id="L2121"><span class="ln">2121</span> $(rc, {
+</code><code id="L2122"><span class="ln">2122</span> x: rect[<span class="d">0</span>],
+</code><code id="L2123"><span class="ln">2123</span> y: rect[<span class="d">1</span>],
+</code><code id="L2124"><span class="ln">2124</span> width: rect[<span class="d">2</span>],
+</code><code id="L2125"><span class="ln">2125</span> height: rect[<span class="d">3</span>]
+</code><code id="L2126"><span class="ln">2126</span> });
+</code><code id="L2127"><span class="ln">2127</span> el.appendChild(rc);
+</code><code id="L2128"><span class="ln">2128</span> o.paper.defs.appendChild(el);
+</code><code id="L2129"><span class="ln">2129</span> $(node, {<i>"clip-path"</i>: <i>"url(#"</i><span class="s"> + </span>el.id<span class="s"> + </span><i>")"</i>});
+</code><code id="L2130"><span class="ln">2130</span> o.clip<span class="s"> = </span>rc;
+</code><code id="L2131"><span class="ln">2131</span> }
+</code><code id="L2132"><span class="ln">2132</span> <b>if</b> (!value) {
+</code><code id="L2133"><span class="ln">2133</span> <b>var</b> clip<span class="s"> = </span>g.doc.getElementById(node.getAttribute(<i>"clip-path"</i>).replace(/(^url\(#|\)$)/g, E));
+</code><code id="L2134"><span class="ln">2134</span> clip<span class="s"> && </span>clip.parentNode.removeChild(clip);
+</code><code id="L2135"><span class="ln">2135</span> $(node, {<i>"clip-path"</i>: E});
+</code><code id="L2136"><span class="ln">2136</span> <b>delete</b> o.clip;
+</code><code id="L2137"><span class="ln">2137</span> }
+</code><code id="L2138"><span class="ln">2138</span> <b>break</b>;
+</code><code id="L2139"><span class="ln">2139</span> <b>case</b> <i>"path"</i>:
+</code><code id="L2140"><span class="ln">2140</span> <b>if</b> (o.type<span class="s"> == </span><i>"path"</i>) {
+</code><code id="L2141"><span class="ln">2141</span> $(node, {d: value ? attrs.path<span class="s"> = </span>pathToAbsolute(value) : <i>"M0,<span class="d">0</span>"</i>});
+</code><code id="L2142"><span class="ln">2142</span> o._.dirty<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2143"><span class="ln">2143</span> <b>if</b> (o._.arrows) {
+</code><code id="L2144"><span class="ln">2144</span> <i>"startString"</i> <b>in</b> o._.arrows<span class="s"> && </span>addArrow(o, o._.arrows.startString);
+</code><code id="L2145"><span class="ln">2145</span> <i>"endString"</i> <b>in</b> o._.arrows<span class="s"> && </span>addArrow(o, o._.arrows.endString, <span class="d">1</span>);
+</code><code id="L2146"><span class="ln">2146</span> }
+</code><code id="L2147"><span class="ln">2147</span> }
+</code><code id="L2148"><span class="ln">2148</span> <b>break</b>;
+</code><code id="L2149"><span class="ln">2149</span> <b>case</b> <i>"width"</i>:
+</code><code id="L2150"><span class="ln">2150</span> node[setAttribute](att, value);
+</code><code id="L2151"><span class="ln">2151</span> o._.dirty<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2152"><span class="ln">2152</span> <b>if</b> (attrs.fx) {
+</code><code id="L2153"><span class="ln">2153</span> att<span class="s"> = </span><i>"x"</i>;
+</code><code id="L2154"><span class="ln">2154</span> value<span class="s"> = </span>attrs.x;
+</code><code id="L2155"><span class="ln">2155</span> } <b>else</b> {
+</code><code id="L2156"><span class="ln">2156</span> <b>break</b>;
+</code><code id="L2157"><span class="ln">2157</span> }
+</code><code id="L2158"><span class="ln">2158</span> <b>case</b> <i>"x"</i>:
+</code><code id="L2159"><span class="ln">2159</span> <b>if</b> (attrs.fx) {
+</code><code id="L2160"><span class="ln">2160</span> value<span class="s"> = </span>-attrs.x<span class="s"> - </span>(attrs.width<span class="s"> || </span><span class="d">0</span>);
+</code><code id="L2161"><span class="ln">2161</span> }
+</code><code id="L2162"><span class="ln">2162</span> <b>case</b> <i>"rx"</i>:
+</code><code id="L2163"><span class="ln">2163</span> <b>if</b> (att<span class="s"> == </span><i>"rx"</i><span class="s"> && </span>o.type<span class="s"> == </span><i>"rect"</i>) {
+</code><code id="L2164"><span class="ln">2164</span> <b>break</b>;
+</code><code id="L2165"><span class="ln">2165</span> }
+</code><code id="L2166"><span class="ln">2166</span> <b>case</b> <i>"cx"</i>:
+</code><code id="L2167"><span class="ln">2167</span> node[setAttribute](att, value);
+</code><code id="L2168"><span class="ln">2168</span> o.pattern<span class="s"> && </span>updatePosition(o);
+</code><code id="L2169"><span class="ln">2169</span> o._.dirty<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2170"><span class="ln">2170</span> <b>break</b>;
+</code><code id="L2171"><span class="ln">2171</span> <b>case</b> <i>"height"</i>:
+</code><code id="L2172"><span class="ln">2172</span> node[setAttribute](att, value);
+</code><code id="L2173"><span class="ln">2173</span> o._.dirty<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2174"><span class="ln">2174</span> <b>if</b> (attrs.fy) {
+</code><code id="L2175"><span class="ln">2175</span> att<span class="s"> = </span><i>"y"</i>;
+</code><code id="L2176"><span class="ln">2176</span> value<span class="s"> = </span>attrs.y;
+</code><code id="L2177"><span class="ln">2177</span> } <b>else</b> {
+</code><code id="L2178"><span class="ln">2178</span> <b>break</b>;
+</code><code id="L2179"><span class="ln">2179</span> }
+</code><code id="L2180"><span class="ln">2180</span> <b>case</b> <i>"y"</i>:
+</code><code id="L2181"><span class="ln">2181</span> <b>if</b> (attrs.fy) {
+</code><code id="L2182"><span class="ln">2182</span> value<span class="s"> = </span>-attrs.y<span class="s"> - </span>(attrs.height<span class="s"> || </span><span class="d">0</span>);
+</code><code id="L2183"><span class="ln">2183</span> }
+</code><code id="L2184"><span class="ln">2184</span> <b>case</b> <i>"ry"</i>:
+</code><code id="L2185"><span class="ln">2185</span> <b>if</b> (att<span class="s"> == </span><i>"ry"</i><span class="s"> && </span>o.type<span class="s"> == </span><i>"rect"</i>) {
+</code><code id="L2186"><span class="ln">2186</span> <b>break</b>;
+</code><code id="L2187"><span class="ln">2187</span> }
+</code><code id="L2188"><span class="ln">2188</span> <b>case</b> <i>"cy"</i>:
+</code><code id="L2189"><span class="ln">2189</span> node[setAttribute](att, value);
+</code><code id="L2190"><span class="ln">2190</span> o.pattern<span class="s"> && </span>updatePosition(o);
+</code><code id="L2191"><span class="ln">2191</span> o._.dirty<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2192"><span class="ln">2192</span> <b>break</b>;
+</code><code id="L2193"><span class="ln">2193</span> <b>case</b> <i>"r"</i>:
+</code><code id="L2194"><span class="ln">2194</span> <b>if</b> (o.type<span class="s"> == </span><i>"rect"</i>) {
+</code><code id="L2195"><span class="ln">2195</span> $(node, {rx: value, ry: value});
+</code><code id="L2196"><span class="ln">2196</span> } <b>else</b> {
+</code><code id="L2197"><span class="ln">2197</span> node[setAttribute](att, value);
+</code><code id="L2198"><span class="ln">2198</span> }
+</code><code id="L2199"><span class="ln">2199</span> o._.dirty<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2200"><span class="ln">2200</span> <b>break</b>;
+</code><code id="L2201"><span class="ln">2201</span> <b>case</b> <i>"src"</i>:
+</code><code id="L2202"><span class="ln">2202</span> <b>if</b> (o.type<span class="s"> == </span><i>"image"</i>) {
+</code><code id="L2203"><span class="ln">2203</span> node.setAttributeNS(xlink, <i>"href"</i>, value);
+</code><code id="L2204"><span class="ln">2204</span> }
+</code><code id="L2205"><span class="ln">2205</span> <b>break</b>;
+</code><code id="L2206"><span class="ln">2206</span> <b>case</b> <i>"stroke-width"</i>:
+</code><code id="L2207"><span class="ln">2207</span> <b>if</b> (o._.sx != <span class="d">1</span><span class="s"> || </span>o._.sy != <span class="d">1</span>) {
+</code><code id="L2208"><span class="ln">2208</span> value /= mmax(abs(o._.sx), abs(o._.sy))<span class="s"> || </span><span class="d">1</span>;
+</code><code id="L2209"><span class="ln">2209</span> }
+</code><code id="L2210"><span class="ln">2210</span> <b>if</b> (o.paper._vbSize) {
+</code><code id="L2211"><span class="ln">2211</span> value *= o.paper._vbSize;
+</code><code id="L2212"><span class="ln">2212</span> }
+</code><code id="L2213"><span class="ln">2213</span> node[setAttribute](att, value);
+</code><code id="L2214"><span class="ln">2214</span> <b>if</b> (attrs[<i>"stroke-dasharray"</i>]) {
+</code><code id="L2215"><span class="ln">2215</span> addDashes(o, attrs[<i>"stroke-dasharray"</i>]);
+</code><code id="L2216"><span class="ln">2216</span> }
+</code><code id="L2217"><span class="ln">2217</span> <b>if</b> (o._.arrows) {
+</code><code id="L2218"><span class="ln">2218</span> <i>"startString"</i> <b>in</b> o._.arrows<span class="s"> && </span>addArrow(o, o._.arrows.startString);
+</code><code id="L2219"><span class="ln">2219</span> <i>"endString"</i> <b>in</b> o._.arrows<span class="s"> && </span>addArrow(o, o._.arrows.endString, <span class="d">1</span>);
+</code><code id="L2220"><span class="ln">2220</span> }
+</code><code id="L2221"><span class="ln">2221</span> <b>break</b>;
+</code><code id="L2222"><span class="ln">2222</span> <b>case</b> <i>"stroke-dasharray"</i>:
+</code><code id="L2223"><span class="ln">2223</span> addDashes(o, value);
+</code><code id="L2224"><span class="ln">2224</span> <b>break</b>;
+</code><code id="L2225"><span class="ln">2225</span> <b>case</b> fillString:
+</code><code id="L2226"><span class="ln">2226</span> <b>var</b> isURL<span class="s"> = </span>Str(value).match(ISURL);
+</code><code id="L2227"><span class="ln">2227</span> <b>if</b> (isURL) {
+</code><code id="L2228"><span class="ln">2228</span> el<span class="s"> = </span>$(<i>"pattern"</i>);
+</code><code id="L2229"><span class="ln">2229</span> <b>var</b> ig<span class="s"> = </span>$(<i>"image"</i>);
+</code><code id="L2230"><span class="ln">2230</span> el.id<span class="s"> = </span>createUUID();
+</code><code id="L2231"><span class="ln">2231</span> $(el, {x: <span class="d">0</span>, y: <span class="d">0</span>, patternUnits: <i>"userSpaceOnUse"</i>, height: <span class="d">1</span>, width: <span class="d">1</span>});
+</code><code id="L2232"><span class="ln">2232</span> $(ig, {x: <span class="d">0</span>, y: <span class="d">0</span>, <i>"xlink:href"</i>: isURL[<span class="d">1</span>]});
+</code><code id="L2233"><span class="ln">2233</span> el.appendChild(ig);
+</code><code id="L2234"><span class="ln">2234</span>
+</code><code id="L2235"><span class="ln">2235</span> (<b>function</b> (el) {
+</code><code id="L2236"><span class="ln">2236</span> preload(isURL[<span class="d">1</span>], <b>function</b> () {
+</code><code id="L2237"><span class="ln">2237</span> <b>var</b> w<span class="s"> = </span><b>this</b>.offsetWidth,
+</code><code id="L2238"><span class="ln">2238</span> h<span class="s"> = </span><b>this</b>.offsetHeight;
+</code><code id="L2239"><span class="ln">2239</span> $(el, {width: w, height: h});
+</code><code id="L2240"><span class="ln">2240</span> $(ig, {width: w, height: h});
+</code><code id="L2241"><span class="ln">2241</span> o.paper.safari();
+</code><code id="L2242"><span class="ln">2242</span> });
+</code><code id="L2243"><span class="ln">2243</span> })(el);
+</code><code id="L2244"><span class="ln">2244</span> o.paper.defs.appendChild(el);
+</code><code id="L2245"><span class="ln">2245</span> node.style.fill<span class="s"> = </span><i>"url(#"</i><span class="s"> + </span>el.id<span class="s"> + </span><i>")"</i>;
+</code><code id="L2246"><span class="ln">2246</span> $(node, {fill: <i>"url(#"</i><span class="s"> + </span>el.id<span class="s"> + </span><i>")"</i>});
+</code><code id="L2247"><span class="ln">2247</span> o.pattern<span class="s"> = </span>el;
+</code><code id="L2248"><span class="ln">2248</span> o.pattern<span class="s"> && </span>updatePosition(o);
+</code><code id="L2249"><span class="ln">2249</span> <b>break</b>;
+</code><code id="L2250"><span class="ln">2250</span> }
+</code><code id="L2251"><span class="ln">2251</span> <b>var</b> clr<span class="s"> = </span>R.getRGB(value);
+</code><code id="L2252"><span class="ln">2252</span> <b>if</b> (!clr.error) {
+</code><code id="L2253"><span class="ln">2253</span> <b>delete</b> params.gradient;
+</code><code id="L2254"><span class="ln">2254</span> <b>delete</b> attrs.gradient;
+</code><code id="L2255"><span class="ln">2255</span> !R.is(attrs.opacity, <i>"<b>undefined</b>"</i>) &&
+</code><code id="L2256"><span class="ln">2256</span> R.is(params.opacity, <i>"<b>undefined</b>"</i>) &&
+</code><code id="L2257"><span class="ln">2257</span> $(node, {opacity: attrs.opacity});
+</code><code id="L2258"><span class="ln">2258</span> !R.is(attrs[<i>"fill-opacity"</i>], <i>"<b>undefined</b>"</i>) &&
+</code><code id="L2259"><span class="ln">2259</span> R.is(params[<i>"fill-opacity"</i>], <i>"<b>undefined</b>"</i>) &&
+</code><code id="L2260"><span class="ln">2260</span> $(node, {<i>"fill-opacity"</i>: attrs[<i>"fill-opacity"</i>]});
+</code><code id="L2261"><span class="ln">2261</span> } <b>else</b> <b>if</b> ((o.type<span class="s"> == </span><i>"circle"</i><span class="s"> || </span>o.type<span class="s"> == </span><i>"ellipse"</i><span class="s"> || </span>Str(value).charAt() != <i>"r"</i>)<span class="s"> && </span>addGradientFill(o, value)) {
+</code><code id="L2262"><span class="ln">2262</span> <b>if</b> (<i>"opacity"</i> <b>in</b> attrs<span class="s"> || </span><i>"fill-opacity"</i> <b>in</b> attrs) {
+</code><code id="L2263"><span class="ln">2263</span> <b>var</b> gradient<span class="s"> = </span>g.doc.getElementById(node.getAttribute(fillString).replace(/^url\(#|\)$/g, E));
+</code><code id="L2264"><span class="ln">2264</span> <b>if</b> (gradient) {
+</code><code id="L2265"><span class="ln">2265</span> <b>var</b> stops<span class="s"> = </span>gradient.getElementsByTagName(<i>"stop"</i>);
+</code><code id="L2266"><span class="ln">2266</span> $(stops[stops.length<span class="s"> - </span><span class="d">1</span>], {<i>"stop-opacity"</i>: (<i>"opacity"</i> <b>in</b> attrs ? attrs.opacity : <span class="d">1</span>)<span class="s"> * </span>(<i>"fill-opacity"</i> <b>in</b> attrs ? attrs[<i>"fill-opacity"</i>] : <span class="d">1</span>)});
+</code><code id="L2267"><span class="ln">2267</span> }
+</code><code id="L2268"><span class="ln">2268</span> }
+</code><code id="L2269"><span class="ln">2269</span> attrs.gradient<span class="s"> = </span>value;
+</code><code id="L2270"><span class="ln">2270</span> attrs.fill<span class="s"> = </span><i>"none"</i>;
+</code><code id="L2271"><span class="ln">2271</span> <b>break</b>;
+</code><code id="L2272"><span class="ln">2272</span> }
+</code><code id="L2273"><span class="ln">2273</span> clr[has](<i>"opacity"</i>)<span class="s"> && </span>$(node, {<i>"fill-opacity"</i>: clr.opacity > <span class="d">1</span> ? clr.opacity<span class="s"> / </span><span class="d">100</span> : clr.opacity});
+</code><code id="L2274"><span class="ln">2274</span> <b>case</b> <i>"stroke"</i>:
+</code><code id="L2275"><span class="ln">2275</span> clr<span class="s"> = </span>R.getRGB(value);
+</code><code id="L2276"><span class="ln">2276</span> node[setAttribute](att, clr.hex);
+</code><code id="L2277"><span class="ln">2277</span> att<span class="s"> == </span><i>"stroke"</i><span class="s"> && </span>clr[has](<i>"opacity"</i>)<span class="s"> && </span>$(node, {<i>"stroke-opacity"</i>: clr.opacity > <span class="d">1</span> ? clr.opacity<span class="s"> / </span><span class="d">100</span> : clr.opacity});
+</code><code id="L2278"><span class="ln">2278</span> <b>if</b> (att<span class="s"> == </span><i>"stroke"</i><span class="s"> && </span>o._.arrows) {
+</code><code id="L2279"><span class="ln">2279</span> <i>"startString"</i> <b>in</b> o._.arrows<span class="s"> && </span>addArrow(o, o._.arrows.startString);
+</code><code id="L2280"><span class="ln">2280</span> <i>"endString"</i> <b>in</b> o._.arrows<span class="s"> && </span>addArrow(o, o._.arrows.endString, <span class="d">1</span>);
+</code><code id="L2281"><span class="ln">2281</span> }
+</code><code id="L2282"><span class="ln">2282</span> <b>break</b>;
+</code><code id="L2283"><span class="ln">2283</span> <b>case</b> <i>"gradient"</i>:
+</code><code id="L2284"><span class="ln">2284</span> (o.type<span class="s"> == </span><i>"circle"</i><span class="s"> || </span>o.type<span class="s"> == </span><i>"ellipse"</i><span class="s"> || </span>Str(value).charAt() != <i>"r"</i>)<span class="s"> && </span>addGradientFill(o, value);
+</code><code id="L2285"><span class="ln">2285</span> <b>break</b>;
+</code><code id="L2286"><span class="ln">2286</span> <b>case</b> <i>"opacity"</i>:
+</code><code id="L2287"><span class="ln">2287</span> <b>if</b> (attrs.gradient<span class="s"> && </span>!attrs[has](<i>"stroke-opacity"</i>)) {
+</code><code id="L2288"><span class="ln">2288</span> $(node, {<i>"stroke-opacity"</i>: value > <span class="d">1</span> ? value<span class="s"> / </span><span class="d">100</span> : value});
+</code><code id="L2289"><span class="ln">2289</span> }
+</code><code id="L2290"><span class="ln">2290</span> <span class="c">// fall</span>
+</code><code id="L2291"><span class="ln">2291</span> <b>case</b> <i>"fill-opacity"</i>:
+</code><code id="L2292"><span class="ln">2292</span> <b>if</b> (attrs.gradient) {
+</code><code id="L2293"><span class="ln">2293</span> gradient<span class="s"> = </span>g.doc.getElementById(node.getAttribute(fillString).replace(/^url\(#|\)$/g, E));
+</code><code id="L2294"><span class="ln">2294</span> <b>if</b> (gradient) {
+</code><code id="L2295"><span class="ln">2295</span> stops<span class="s"> = </span>gradient.getElementsByTagName(<i>"stop"</i>);
+</code><code id="L2296"><span class="ln">2296</span> $(stops[stops.length<span class="s"> - </span><span class="d">1</span>], {<i>"stop-opacity"</i>: value});
+</code><code id="L2297"><span class="ln">2297</span> }
+</code><code id="L2298"><span class="ln">2298</span> <b>break</b>;
+</code><code id="L2299"><span class="ln">2299</span> }
+</code><code id="L2300"><span class="ln">2300</span> <b>default</b>:
+</code><code id="L2301"><span class="ln">2301</span> att<span class="s"> == </span><i>"font-size"</i><span class="s"> && </span>(value<span class="s"> = </span>toInt(value, <span class="d">10</span>)<span class="s"> + </span><i>"px"</i>);
+</code><code id="L2302"><span class="ln">2302</span> <b>var</b> cssrule<span class="s"> = </span>att.replace(/(\-.)/g, <b>function</b> (w) {
+</code><code id="L2303"><span class="ln">2303</span> <b>return</b> upperCase.call(w.substring(<span class="d">1</span>));
+</code><code id="L2304"><span class="ln">2304</span> });
+</code><code id="L2305"><span class="ln">2305</span> node.style[cssrule]<span class="s"> = </span>value;
+</code><code id="L2306"><span class="ln">2306</span> o._.dirty<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2307"><span class="ln">2307</span> node[setAttribute](att, value);
+</code><code id="L2308"><span class="ln">2308</span> <b>break</b>;
+</code><code id="L2309"><span class="ln">2309</span> }
+</code><code id="L2310"><span class="ln">2310</span> }
+</code><code id="L2311"><span class="ln">2311</span> }
+</code><code id="L2312"><span class="ln">2312</span>
+</code><code id="L2313"><span class="ln">2313</span> tuneText(o, params);
+</code><code id="L2314"><span class="ln">2314</span> },
+</code><code id="L2315"><span class="ln">2315</span> leading<span class="s"> = </span><span class="d">1.2</span>,
+</code><code id="L2316"><span class="ln">2316</span> tuneText<span class="s"> = </span><b>function</b> (el, params) {
+</code><code id="L2317"><span class="ln">2317</span> <b>if</b> (el.type != <i>"text"</i><span class="s"> || </span>!(params[has](<i>"text"</i>)<span class="s"> || </span>params[has](<i>"font"</i>)<span class="s"> || </span>params[has](<i>"font-size"</i>)<span class="s"> || </span>params[has](<i>"x"</i>)<span class="s"> || </span>params[has](<i>"y"</i>))) {
+</code><code id="L2318"><span class="ln">2318</span> <b>return</b>;
+</code><code id="L2319"><span class="ln">2319</span> }
+</code><code id="L2320"><span class="ln">2320</span> <b>var</b> a<span class="s"> = </span>el.attrs,
+</code><code id="L2321"><span class="ln">2321</span> node<span class="s"> = </span>el.node,
+</code><code id="L2322"><span class="ln">2322</span> fontSize<span class="s"> = </span>node.firstChild ? toInt(g.doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue(<i>"font-size"</i>), <span class="d">10</span>) : <span class="d">10</span>;
+</code><code id="L2323"><span class="ln">2323</span>
+</code><code id="L2324"><span class="ln">2324</span> <b>if</b> (params[has](<i>"text"</i>)) {
+</code><code id="L2325"><span class="ln">2325</span> a.text<span class="s"> = </span>params.text;
+</code><code id="L2326"><span class="ln">2326</span> <b>while</b> (node.firstChild) {
+</code><code id="L2327"><span class="ln">2327</span> node.removeChild(node.firstChild);
+</code><code id="L2328"><span class="ln">2328</span> }
+</code><code id="L2329"><span class="ln">2329</span> <b>var</b> texts<span class="s"> = </span>Str(params.text).split(<i>"\n"</i>),
+</code><code id="L2330"><span class="ln">2330</span> tspans<span class="s"> = </span>[],
+</code><code id="L2331"><span class="ln">2331</span> tspan;
+</code><code id="L2332"><span class="ln">2332</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>texts.length; i < ii; i++) <b>if</b> (texts[i]) {
+</code><code id="L2333"><span class="ln">2333</span> tspan<span class="s"> = </span>$(<i>"tspan"</i>);
+</code><code id="L2334"><span class="ln">2334</span> i<span class="s"> && </span>$(tspan, {dy: fontSize<span class="s"> * </span>leading, x: a.x});
+</code><code id="L2335"><span class="ln">2335</span> tspan.appendChild(g.doc.createTextNode(texts[i]));
+</code><code id="L2336"><span class="ln">2336</span> node.appendChild(tspan);
+</code><code id="L2337"><span class="ln">2337</span> tspans[i]<span class="s"> = </span>tspan;
+</code><code id="L2338"><span class="ln">2338</span> }
+</code><code id="L2339"><span class="ln">2339</span> } <b>else</b> {
+</code><code id="L2340"><span class="ln">2340</span> tspans<span class="s"> = </span>node.getElementsByTagName(<i>"tspan"</i>);
+</code><code id="L2341"><span class="ln">2341</span> <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>tspans.length; i < ii; i++) {
+</code><code id="L2342"><span class="ln">2342</span> i<span class="s"> && </span>$(tspans[i], {dy: fontSize<span class="s"> * </span>leading, x: a.x});
+</code><code id="L2343"><span class="ln">2343</span> }
+</code><code id="L2344"><span class="ln">2344</span> }
+</code><code id="L2345"><span class="ln">2345</span> $(node, {y: a.y});
+</code><code id="L2346"><span class="ln">2346</span> el._.dirty<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2347"><span class="ln">2347</span> <b>var</b> bb<span class="s"> = </span>el._getBBox(),
+</code><code id="L2348"><span class="ln">2348</span> dif<span class="s"> = </span>a.y<span class="s"> - </span>(bb.y<span class="s"> + </span>bb.height<span class="s"> / </span><span class="d">2</span>);
+</code><code id="L2349"><span class="ln">2349</span> dif<span class="s"> && </span>R.is(dif, <i>"finite"</i>)<span class="s"> && </span>$(tspans[<span class="d">0</span>], {dy: a.y<span class="s"> + </span>dif});
+</code><code id="L2350"><span class="ln">2350</span> },
+</code><code id="L2351"><span class="ln">2351</span> Element<span class="s"> = </span><b>function</b> (node, svg) {
+</code><code id="L2352"><span class="ln">2352</span> <b>var</b> X<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L2353"><span class="ln">2353</span> Y<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L2354"><span class="ln">2354</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2355"><span class="ln">2355</span><span class="c"> <span class="s"> * </span>Element.node
+</span></code><code id="L2356"><span class="ln">2356</span><span class="c"> [ property (object) ]
+</span></code><code id="L2357"><span class="ln">2357</span><span class="c"> **
+</span></code><code id="L2358"><span class="ln">2358</span><span class="c"> <span class="s"> * </span>Gives you a reference to the DOM object, so you can assign event handlers or just mess around.
+</span></code><code id="L2359"><span class="ln">2359</span><span class="c"> > Usage
+</span></code><code id="L2360"><span class="ln">2360</span><span class="c"> <span class="s"> | </span><span class="c">// draw a circle at coordinate <span class="d">10</span>,<span class="d">10</span> <b>with</b> radius of <span class="d">10</span></span>
+</span></code><code id="L2361"><span class="ln">2361</span><span class="c"> <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.circle(<span class="d">10</span>, <span class="d">10</span>, <span class="d">10</span>);
+</span></code><code id="L2362"><span class="ln">2362</span><span class="c"> <span class="s"> | </span>c.node.onclick<span class="s"> = </span><b>function</b> () {
+</span></code><code id="L2363"><span class="ln">2363</span><span class="c"> <span class="s"> | </span> c.attr(<i>"fill"</i>, <i>"red"</i>);
+</span></code><code id="L2364"><span class="ln">2364</span><span class="c"> <span class="s"> | </span>};
+</span></code><code id="L2365"><span class="ln">2365</span><span class="c"> \*/</span>
+</code><code id="L2366"><span class="ln">2366</span> <b>this</b>[<span class="d">0</span>]<span class="s"> = </span><b>this</b>.node<span class="s"> = </span>node;
+</code><code id="L2367"><span class="ln">2367</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2368"><span class="ln">2368</span><span class="c"> <span class="s"> * </span>Element.raphael
+</span></code><code id="L2369"><span class="ln">2369</span><span class="c"> [ property (object) ]
+</span></code><code id="L2370"><span class="ln">2370</span><span class="c"> **
+</span></code><code id="L2371"><span class="ln">2371</span><span class="c"> <span class="s"> * </span>Internal reference to @Raphael object. In <b>case</b> it is not available.
+</span></code><code id="L2372"><span class="ln">2372</span><span class="c"> > Usage
+</span></code><code id="L2373"><span class="ln">2373</span><span class="c"> <span class="s"> | </span>Raphael.el.red<span class="s"> = </span><b>function</b> () {
+</span></code><code id="L2374"><span class="ln">2374</span><span class="c"> <span class="s"> | </span> <b>var</b> hsb<span class="s"> = </span><b>this</b>.paper.raphael.rgb2hsb(<b>this</b>.attr(<i>"fill"</i>));
+</span></code><code id="L2375"><span class="ln">2375</span><span class="c"> <span class="s"> | </span> hsb.h<span class="s"> = </span><span class="d">1</span>;
+</span></code><code id="L2376"><span class="ln">2376</span><span class="c"> <span class="s"> | </span> <b>this</b>.attr({fill: <b>this</b>.paper.raphael.hsb2rgb(hsb).hex});
+</span></code><code id="L2377"><span class="ln">2377</span><span class="c"> <span class="s"> | </span>}
+</span></code><code id="L2378"><span class="ln">2378</span><span class="c"> \*/</span>
+</code><code id="L2379"><span class="ln">2379</span> node.raphael<span class="s"> = </span><b>true</b>;
+</code><code id="L2380"><span class="ln">2380</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2381"><span class="ln">2381</span><span class="c"> <span class="s"> * </span>Element.id
+</span></code><code id="L2382"><span class="ln">2382</span><span class="c"> [ property (number) ]
+</span></code><code id="L2383"><span class="ln">2383</span><span class="c"> **
+</span></code><code id="L2384"><span class="ln">2384</span><span class="c"> <span class="s"> * </span>Unique id of the element. Especially usesful when you want to listen to events of the element,
+</span></code><code id="L2385"><span class="ln">2385</span><span class="c"> <span class="s"> * </span>because all events are fired <b>in</b> format `<module>.<action>.<id>`. Also useful <b>for</b> @Paper.getById method.
+</span></code><code id="L2386"><span class="ln">2386</span><span class="c"> \*/</span>
+</code><code id="L2387"><span class="ln">2387</span> <b>this</b>.id<span class="s"> = </span>R._oid++;
+</code><code id="L2388"><span class="ln">2388</span> node.raphaelid<span class="s"> = </span><b>this</b>.id;
+</code><code id="L2389"><span class="ln">2389</span> <b>this</b>.matrix<span class="s"> = </span><b>new</b> Matrix;
+</code><code id="L2390"><span class="ln">2390</span> <b>this</b>.realPath<span class="s"> = </span><b>null</b>;
+</code><code id="L2391"><span class="ln">2391</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2392"><span class="ln">2392</span><span class="c"> <span class="s"> * </span>Element.paper
+</span></code><code id="L2393"><span class="ln">2393</span><span class="c"> [ property (object) ]
+</span></code><code id="L2394"><span class="ln">2394</span><span class="c"> **
+</span></code><code id="L2395"><span class="ln">2395</span><span class="c"> <span class="s"> * </span>Internal reference to “paper” where object drawn. Mainly <b>for</b> use <b>in</b> plugins and element extensions.
+</span></code><code id="L2396"><span class="ln">2396</span><span class="c"> > Usage
+</span></code><code id="L2397"><span class="ln">2397</span><span class="c"> <span class="s"> | </span>Raphael.el.cross<span class="s"> = </span><b>function</b> () {
+</span></code><code id="L2398"><span class="ln">2398</span><span class="c"> <span class="s"> | </span> <b>this</b>.attr({fill: <i>"red"</i>});
+</span></code><code id="L2399"><span class="ln">2399</span><span class="c"> <span class="s"> | </span> <b>this</b>.paper.path(<i>"M10,10L50,50M50,10L10,<span class="d">50</span>"</i>)
+</span></code><code id="L2400"><span class="ln">2400</span><span class="c"> <span class="s"> | </span> .attr({stroke: <i>"red"</i>});
+</span></code><code id="L2401"><span class="ln">2401</span><span class="c"> <span class="s"> | </span>}
+</span></code><code id="L2402"><span class="ln">2402</span><span class="c"> \*/</span>
+</code><code id="L2403"><span class="ln">2403</span> <b>this</b>.paper<span class="s"> = </span>svg;
+</code><code id="L2404"><span class="ln">2404</span> <b>this</b>.attrs<span class="s"> = </span><b>this</b>.attrs<span class="s"> || </span>{};
+</code><code id="L2405"><span class="ln">2405</span> <b>this</b>._<span class="s"> = </span>{
+</code><code id="L2406"><span class="ln">2406</span> transform: [],
+</code><code id="L2407"><span class="ln">2407</span> sx: <span class="d">1</span>,
+</code><code id="L2408"><span class="ln">2408</span> sy: <span class="d">1</span>,
+</code><code id="L2409"><span class="ln">2409</span> deg: <span class="d">0</span>,
+</code><code id="L2410"><span class="ln">2410</span> dx: <span class="d">0</span>,
+</code><code id="L2411"><span class="ln">2411</span> dy: <span class="d">0</span>,
+</code><code id="L2412"><span class="ln">2412</span> dirty: <span class="d">1</span>
+</code><code id="L2413"><span class="ln">2413</span> };
+</code><code id="L2414"><span class="ln">2414</span> !svg.bottom<span class="s"> && </span>(svg.bottom<span class="s"> = </span><b>this</b>);
+</code><code id="L2415"><span class="ln">2415</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2416"><span class="ln">2416</span><span class="c"> <span class="s"> * </span>Element.prev
+</span></code><code id="L2417"><span class="ln">2417</span><span class="c"> [ property (object) ]
+</span></code><code id="L2418"><span class="ln">2418</span><span class="c"> **
+</span></code><code id="L2419"><span class="ln">2419</span><span class="c"> <span class="s"> * </span>Reference to the previous element <b>in</b> the hierarchy.
+</span></code><code id="L2420"><span class="ln">2420</span><span class="c"> \*/</span>
+</code><code id="L2421"><span class="ln">2421</span> <b>this</b>.prev<span class="s"> = </span>svg.top;
+</code><code id="L2422"><span class="ln">2422</span> svg.top<span class="s"> && </span>(svg.top.next<span class="s"> = </span><b>this</b>);
+</code><code id="L2423"><span class="ln">2423</span> svg.top<span class="s"> = </span><b>this</b>;
+</code><code id="L2424"><span class="ln">2424</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2425"><span class="ln">2425</span><span class="c"> <span class="s"> * </span>Element.next
+</span></code><code id="L2426"><span class="ln">2426</span><span class="c"> [ property (object) ]
+</span></code><code id="L2427"><span class="ln">2427</span><span class="c"> **
+</span></code><code id="L2428"><span class="ln">2428</span><span class="c"> <span class="s"> * </span>Reference to the next element <b>in</b> the hierarchy.
+</span></code><code id="L2429"><span class="ln">2429</span><span class="c"> \*/</span>
+</code><code id="L2430"><span class="ln">2430</span> <b>this</b>.next<span class="s"> = </span><b>null</b>;
+</code><code id="L2431"><span class="ln">2431</span> },
+</code><code id="L2432"><span class="ln">2432</span> elproto<span class="s"> = </span>Element.prototype;
+</code><code id="L2433"><span class="ln">2433</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2434"><span class="ln">2434</span><span class="c"> <span class="s"> * </span>Element.rotate
+</span></code><code id="L2435"><span class="ln">2435</span><span class="c"> [ method ]
+</span></code><code id="L2436"><span class="ln">2436</span><span class="c"> **
+</span></code><code id="L2437"><span class="ln">2437</span><span class="c"> <span class="s"> * </span>Adds rotation by given angle around given point to the list of
+</span></code><code id="L2438"><span class="ln">2438</span><span class="c"> <span class="s"> * </span>transformations of the element.
+</span></code><code id="L2439"><span class="ln">2439</span><span class="c"> > Parameters
+</span></code><code id="L2440"><span class="ln">2440</span><span class="c"> <span class="s"> - </span>deg (number) angle <b>in</b> degrees
+</span></code><code id="L2441"><span class="ln">2441</span><span class="c"> <span class="s"> - </span>cx (number) #optional x coordinate of the centre of rotation
+</span></code><code id="L2442"><span class="ln">2442</span><span class="c"> <span class="s"> - </span>cy (number) #optional y coordinate of the centre of rotation
+</span></code><code id="L2443"><span class="ln">2443</span><span class="c"> <span class="s"> * </span>If cx<span class="s"> & </span>cy aren’t specified centre of the shape is used as a point of rotation.
+</span></code><code id="L2444"><span class="ln">2444</span><span class="c"> <span class="s"> = </span>(object) @Element
+</span></code><code id="L2445"><span class="ln">2445</span><span class="c"> \*/</span>
+</code><code id="L2446"><span class="ln">2446</span> elproto.rotate<span class="s"> = </span><b>function</b> (deg, cx, cy) {
+</code><code id="L2447"><span class="ln">2447</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L2448"><span class="ln">2448</span> <b>return</b> <b>this</b>;
+</code><code id="L2449"><span class="ln">2449</span> }
+</code><code id="L2450"><span class="ln">2450</span> deg<span class="s"> = </span>Str(deg).split(separator);
+</code><code id="L2451"><span class="ln">2451</span> <b>if</b> (deg.length<span class="s"> - </span><span class="d">1</span>) {
+</code><code id="L2452"><span class="ln">2452</span> cx<span class="s"> = </span>toFloat(deg[<span class="d">1</span>]);
+</code><code id="L2453"><span class="ln">2453</span> cy<span class="s"> = </span>toFloat(deg[<span class="d">2</span>]);
+</code><code id="L2454"><span class="ln">2454</span> }
+</code><code id="L2455"><span class="ln">2455</span> deg<span class="s"> = </span>toFloat(deg[<span class="d">0</span>]);
+</code><code id="L2456"><span class="ln">2456</span> (cy<span class="s"> == </span><b>null</b>)<span class="s"> && </span>(cx<span class="s"> = </span>cy);
+</code><code id="L2457"><span class="ln">2457</span> <b>if</b> (cx<span class="s"> == </span><b>null</b><span class="s"> || </span>cy<span class="s"> == </span><b>null</b>) {
+</code><code id="L2458"><span class="ln">2458</span> <b>var</b> bbox<span class="s"> = </span><b>this</b>.getBBox(<span class="d">1</span>);
+</code><code id="L2459"><span class="ln">2459</span> cx<span class="s"> = </span>bbox.x<span class="s"> + </span>bbox.width<span class="s"> / </span><span class="d">2</span>;
+</code><code id="L2460"><span class="ln">2460</span> cy<span class="s"> = </span>bbox.y<span class="s"> + </span>bbox.height<span class="s"> / </span><span class="d">2</span>;
+</code><code id="L2461"><span class="ln">2461</span> }
+</code><code id="L2462"><span class="ln">2462</span> <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"r"</i>, deg, cx, cy]]));
+</code><code id="L2463"><span class="ln">2463</span> <b>return</b> <b>this</b>;
+</code><code id="L2464"><span class="ln">2464</span> };
+</code><code id="L2465"><span class="ln">2465</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2466"><span class="ln">2466</span><span class="c"> <span class="s"> * </span>Element.scale
+</span></code><code id="L2467"><span class="ln">2467</span><span class="c"> [ method ]
+</span></code><code id="L2468"><span class="ln">2468</span><span class="c"> **
+</span></code><code id="L2469"><span class="ln">2469</span><span class="c"> <span class="s"> * </span>Adds scale by given amount relative to given point to the list of
+</span></code><code id="L2470"><span class="ln">2470</span><span class="c"> <span class="s"> * </span>transformations of the element.
+</span></code><code id="L2471"><span class="ln">2471</span><span class="c"> > Parameters
+</span></code><code id="L2472"><span class="ln">2472</span><span class="c"> <span class="s"> - </span>sx (number) horisontal scale amount
+</span></code><code id="L2473"><span class="ln">2473</span><span class="c"> <span class="s"> - </span>sy (number) vertical scale amount
+</span></code><code id="L2474"><span class="ln">2474</span><span class="c"> <span class="s"> - </span>cx (number) #optional x coordinate of the centre of scale
+</span></code><code id="L2475"><span class="ln">2475</span><span class="c"> <span class="s"> - </span>cy (number) #optional y coordinate of the centre of scale
+</span></code><code id="L2476"><span class="ln">2476</span><span class="c"> <span class="s"> * </span>If cx<span class="s"> & </span>cy aren’t specified centre of the shape is used instead.
+</span></code><code id="L2477"><span class="ln">2477</span><span class="c"> <span class="s"> = </span>(object) @Element
+</span></code><code id="L2478"><span class="ln">2478</span><span class="c"> \*/</span>
+</code><code id="L2479"><span class="ln">2479</span> elproto.scale<span class="s"> = </span><b>function</b> (sx, sy, cx, cy) {
+</code><code id="L2480"><span class="ln">2480</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L2481"><span class="ln">2481</span> <b>return</b> <b>this</b>;
+</code><code id="L2482"><span class="ln">2482</span> }
+</code><code id="L2483"><span class="ln">2483</span> sx<span class="s"> = </span>Str(sx).split(separator);
+</code><code id="L2484"><span class="ln">2484</span> <b>if</b> (sx.length<span class="s"> - </span><span class="d">1</span>) {
+</code><code id="L2485"><span class="ln">2485</span> sy<span class="s"> = </span>toFloat(sx[<span class="d">1</span>]);
+</code><code id="L2486"><span class="ln">2486</span> cx<span class="s"> = </span>toFloat(sx[<span class="d">2</span>]);
+</code><code id="L2487"><span class="ln">2487</span> cy<span class="s"> = </span>toFloat(sx[<span class="d">3</span>]);
+</code><code id="L2488"><span class="ln">2488</span> }
+</code><code id="L2489"><span class="ln">2489</span> sx<span class="s"> = </span>toFloat(sx[<span class="d">0</span>]);
+</code><code id="L2490"><span class="ln">2490</span> (sy<span class="s"> == </span><b>null</b>)<span class="s"> && </span>(sy<span class="s"> = </span>sx);
+</code><code id="L2491"><span class="ln">2491</span> (cy<span class="s"> == </span><b>null</b>)<span class="s"> && </span>(cx<span class="s"> = </span>cy);
+</code><code id="L2492"><span class="ln">2492</span> <b>if</b> (cx<span class="s"> == </span><b>null</b><span class="s"> || </span>cy<span class="s"> == </span><b>null</b>) {
+</code><code id="L2493"><span class="ln">2493</span> <b>var</b> bbox<span class="s"> = </span><b>this</b>.getBBox(<span class="d">1</span>);
+</code><code id="L2494"><span class="ln">2494</span> }
+</code><code id="L2495"><span class="ln">2495</span> cx<span class="s"> = </span>cx<span class="s"> == </span><b>null</b> ? bbox.x<span class="s"> + </span>bbox.width<span class="s"> / </span><span class="d">2</span> : cx;
+</code><code id="L2496"><span class="ln">2496</span> cy<span class="s"> = </span>cy<span class="s"> == </span><b>null</b> ? bbox.y<span class="s"> + </span>bbox.height<span class="s"> / </span><span class="d">2</span> : cy;
+</code><code id="L2497"><span class="ln">2497</span> <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"s"</i>, sx, sy, cx, cy]]));
+</code><code id="L2498"><span class="ln">2498</span> <b>return</b> <b>this</b>;
+</code><code id="L2499"><span class="ln">2499</span> };
+</code><code id="L2500"><span class="ln">2500</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2501"><span class="ln">2501</span><span class="c"> <span class="s"> * </span>Element.translate
+</span></code><code id="L2502"><span class="ln">2502</span><span class="c"> [ method ]
+</span></code><code id="L2503"><span class="ln">2503</span><span class="c"> **
+</span></code><code id="L2504"><span class="ln">2504</span><span class="c"> <span class="s"> * </span>Adds translation by given amount to the list of transformations of the element.
+</span></code><code id="L2505"><span class="ln">2505</span><span class="c"> > Parameters
+</span></code><code id="L2506"><span class="ln">2506</span><span class="c"> <span class="s"> - </span>dx (number) horisontal shift
+</span></code><code id="L2507"><span class="ln">2507</span><span class="c"> <span class="s"> - </span>dy (number) vertical shift
+</span></code><code id="L2508"><span class="ln">2508</span><span class="c"> <span class="s"> = </span>(object) @Element
+</span></code><code id="L2509"><span class="ln">2509</span><span class="c"> \*/</span>
+</code><code id="L2510"><span class="ln">2510</span> elproto.translate<span class="s"> = </span><b>function</b> (dx, dy) {
+</code><code id="L2511"><span class="ln">2511</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L2512"><span class="ln">2512</span> <b>return</b> <b>this</b>;
+</code><code id="L2513"><span class="ln">2513</span> }
+</code><code id="L2514"><span class="ln">2514</span> dx<span class="s"> = </span>Str(dx).split(separator);
+</code><code id="L2515"><span class="ln">2515</span> <b>if</b> (dx.length<span class="s"> - </span><span class="d">1</span>) {
+</code><code id="L2516"><span class="ln">2516</span> dy<span class="s"> = </span>toFloat(dx[<span class="d">1</span>]);
+</code><code id="L2517"><span class="ln">2517</span> }
+</code><code id="L2518"><span class="ln">2518</span> dx<span class="s"> = </span>toFloat(dx[<span class="d">0</span>])<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L2519"><span class="ln">2519</span> dy<span class="s"> = </span>+dy<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L2520"><span class="ln">2520</span> <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"t"</i>, dx, dy]]));
+</code><code id="L2521"><span class="ln">2521</span> <b>return</b> <b>this</b>;
+</code><code id="L2522"><span class="ln">2522</span> };
+</code><code id="L2523"><span class="ln">2523</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2524"><span class="ln">2524</span><span class="c"> <span class="s"> * </span>Element.transform
+</span></code><code id="L2525"><span class="ln">2525</span><span class="c"> [ method ]
+</span></code><code id="L2526"><span class="ln">2526</span><span class="c"> **
+</span></code><code id="L2527"><span class="ln">2527</span><span class="c"> <span class="s"> * </span>Adds transformation to the element which is separate to other attributes,
+</span></code><code id="L2528"><span class="ln">2528</span><span class="c"> <span class="s"> * </span>i.e. translation doesn’t change `x` or `y` of the rectange. The format
+</span></code><code id="L2529"><span class="ln">2529</span><span class="c"> <span class="s"> * </span>of transformation string is similar to the path string syntax:
+</span></code><code id="L2530"><span class="ln">2530</span><span class="c"> <span class="s"> | </span><i>"t100,100r30,<span class="d">100</span>,100s2,<span class="d">2</span>,<span class="d">100</span>,100r45s1<span class="d">.5</span>"</i>
+</span></code><code id="L2531"><span class="ln">2531</span><span class="c"> <span class="s"> * </span>Each letter is a command. There are four commands: `t` is <b>for</b> translate, `r` is <b>for</b> rotate, `s` is <b>for</b>
+</span></code><code id="L2532"><span class="ln">2532</span><span class="c"> <span class="s"> * </span>scale and `m` is <b>for</b> matrix.
+</span></code><code id="L2533"><span class="ln">2533</span><span class="c"> *
+</span></code><code id="L2534"><span class="ln">2534</span><span class="c"> <span class="s"> * </span>So, the example line above could be read like “translate by <span class="d">100</span>, <span class="d">100</span>; rotate <span class="d">30</span>° around <span class="d">100</span>, <span class="d">100</span>; scale twice around <span class="d">100</span>, <span class="d">100</span>;
+</span></code><code id="L2535"><span class="ln">2535</span><span class="c"> <span class="s"> * </span>rotate <span class="d">45</span>° around centre; scale <span class="d">1.5</span> times relative to centre”. As you can see rotate and scale commands have origin
+</span></code><code id="L2536"><span class="ln">2536</span><span class="c"> <span class="s"> * </span>coordinates as optional parameters, the <b>default</b> is the centre point of the element.
+</span></code><code id="L2537"><span class="ln">2537</span><span class="c"> <span class="s"> * </span>Matrix accepts six parameters.
+</span></code><code id="L2538"><span class="ln">2538</span><span class="c"> > Usage
+</span></code><code id="L2539"><span class="ln">2539</span><span class="c"> <span class="s"> | </span><b>var</b> el<span class="s"> = </span>paper.rect(<span class="d">10</span>, <span class="d">20</span>, <span class="d">300</span>, <span class="d">200</span>);
+</span></code><code id="L2540"><span class="ln">2540</span><span class="c"> <span class="s"> | </span><span class="c">// translate <span class="d">100</span>, <span class="d">100</span>, rotate <span class="d">45</span>°, translate -<span class="d">100</span>, <span class="d">0</span></span>
+</span></code><code id="L2541"><span class="ln">2541</span><span class="c"> <span class="s"> | </span>el.transform(<i>"t100,100r45t-<span class="d">100</span>,<span class="d">0</span>"</i>);
+</span></code><code id="L2542"><span class="ln">2542</span><span class="c"> <span class="s"> | </span><span class="c">// <b>if</b> you want you can append or prepend transformations</span>
+</span></code><code id="L2543"><span class="ln">2543</span><span class="c"> <span class="s"> | </span>el.transform(<i>"...t50,<span class="d">50</span>"</i>);
+</span></code><code id="L2544"><span class="ln">2544</span><span class="c"> <span class="s"> | </span>el.transform(<i>"s2..."</i>);
+</span></code><code id="L2545"><span class="ln">2545</span><span class="c"> <span class="s"> | </span><span class="c">// or even wrap</span>
+</span></code><code id="L2546"><span class="ln">2546</span><span class="c"> <span class="s"> | </span>el.transform(<i>"t50,<span class="d">50</span>...t-<span class="d">50</span>-<span class="d">50</span>"</i>);
+</span></code><code id="L2547"><span class="ln">2547</span><span class="c"> <span class="s"> | </span><span class="c">// to reset transformation call method <b>with</b> empty string</span>
+</span></code><code id="L2548"><span class="ln">2548</span><span class="c"> <span class="s"> | </span>el.transform(<i>""</i>);
+</span></code><code id="L2549"><span class="ln">2549</span><span class="c"> <span class="s"> | </span><span class="c">// to get current value call it without parameters</span>
+</span></code><code id="L2550"><span class="ln">2550</span><span class="c"> <span class="s"> | </span>console.log(el.transform());
+</span></code><code id="L2551"><span class="ln">2551</span><span class="c"> > Parameters
+</span></code><code id="L2552"><span class="ln">2552</span><span class="c"> <span class="s"> - </span>tstr (string) #optional transformation string
+</span></code><code id="L2553"><span class="ln">2553</span><span class="c"> <span class="s"> * </span>If tstr isn’t specified
+</span></code><code id="L2554"><span class="ln">2554</span><span class="c"> <span class="s"> = </span>(string) current transformation string
+</span></code><code id="L2555"><span class="ln">2555</span><span class="c"> <span class="s"> * </span><b>else</b>
+</span></code><code id="L2556"><span class="ln">2556</span><span class="c"> <span class="s"> = </span>(object) @Element
+</span></code><code id="L2557"><span class="ln">2557</span><span class="c"> \*/</span>
+</code><code id="L2558"><span class="ln">2558</span> elproto.transform<span class="s"> = </span><b>function</b> (tstr) {
+</code><code id="L2559"><span class="ln">2559</span> <b>var</b> _<span class="s"> = </span><b>this</b>._;
+</code><code id="L2560"><span class="ln">2560</span> <b>if</b> (!tstr) {
+</code><code id="L2561"><span class="ln">2561</span> <b>return</b> _.transform;
+</code><code id="L2562"><span class="ln">2562</span> }
+</code><code id="L2563"><span class="ln">2563</span> extractTransform(<b>this</b>, tstr);
+</code><code id="L2564"><span class="ln">2564</span>
+</code><code id="L2565"><span class="ln">2565</span> <b>this</b>.clip<span class="s"> && </span>$(<b>this</b>.clip, {transform: <b>this</b>.matrix.invert()});
+</code><code id="L2566"><span class="ln">2566</span> <span class="c">// <b>this</b>.gradient<span class="s"> && </span>$(<b>this</b>.gradient, {gradientTransform: <b>this</b>.matrix.invert()});</span>
+</code><code id="L2567"><span class="ln">2567</span> <b>this</b>.pattern<span class="s"> && </span>updatePosition(<b>this</b>);
+</code><code id="L2568"><span class="ln">2568</span> <b>this</b>.node<span class="s"> && </span>$(<b>this</b>.node, {transform: <b>this</b>.matrix});
+</code><code id="L2569"><span class="ln">2569</span>
+</code><code id="L2570"><span class="ln">2570</span> <b>if</b> (_.sx != <span class="d">1</span><span class="s"> || </span>_.sy != <span class="d">1</span>) {
+</code><code id="L2571"><span class="ln">2571</span> <b>var</b> sw<span class="s"> = </span><b>this</b>.attrs[has](<i>"stroke-width"</i>) ? <b>this</b>.attrs[<i>"stroke-width"</i>] : <span class="d">1</span>;
+</code><code id="L2572"><span class="ln">2572</span> <b>this</b>.attr({<i>"stroke-width"</i>: sw});
+</code><code id="L2573"><span class="ln">2573</span> }
+</code><code id="L2574"><span class="ln">2574</span>
+</code><code id="L2575"><span class="ln">2575</span> <b>return</b> <b>this</b>;
+</code><code id="L2576"><span class="ln">2576</span> };
+</code><code id="L2577"><span class="ln">2577</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2578"><span class="ln">2578</span><span class="c"> <span class="s"> * </span>Element.hide
+</span></code><code id="L2579"><span class="ln">2579</span><span class="c"> [ method ]
+</span></code><code id="L2580"><span class="ln">2580</span><span class="c"> **
+</span></code><code id="L2581"><span class="ln">2581</span><span class="c"> <span class="s"> * </span>Makes element invisible. See @Element.show.
+</span></code><code id="L2582"><span class="ln">2582</span><span class="c"> <span class="s"> = </span>(object) @Element
+</span></code><code id="L2583"><span class="ln">2583</span><span class="c"> \*/</span>
+</code><code id="L2584"><span class="ln">2584</span> elproto.hide<span class="s"> = </span><b>function</b> () {
+</code><code id="L2585"><span class="ln">2585</span> !<b>this</b>.removed<span class="s"> && </span><b>this</b>.paper.safari(<b>this</b>.node.style.display<span class="s"> = </span><i>"none"</i>);
+</code><code id="L2586"><span class="ln">2586</span> <b>return</b> <b>this</b>;
+</code><code id="L2587"><span class="ln">2587</span> };
+</code><code id="L2588"><span class="ln">2588</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2589"><span class="ln">2589</span><span class="c"> <span class="s"> * </span>Element.show
+</span></code><code id="L2590"><span class="ln">2590</span><span class="c"> [ method ]
+</span></code><code id="L2591"><span class="ln">2591</span><span class="c"> **
+</span></code><code id="L2592"><span class="ln">2592</span><span class="c"> <span class="s"> * </span>Makes element visible. See @Element.hide.
+</span></code><code id="L2593"><span class="ln">2593</span><span class="c"> <span class="s"> = </span>(object) @Element
+</span></code><code id="L2594"><span class="ln">2594</span><span class="c"> \*/</span>
+</code><code id="L2595"><span class="ln">2595</span> elproto.show<span class="s"> = </span><b>function</b> () {
+</code><code id="L2596"><span class="ln">2596</span> !<b>this</b>.removed<span class="s"> && </span><b>this</b>.paper.safari(<b>this</b>.node.style.display<span class="s"> = </span><i>""</i>);
+</code><code id="L2597"><span class="ln">2597</span> <b>return</b> <b>this</b>;
+</code><code id="L2598"><span class="ln">2598</span> };
+</code><code id="L2599"><span class="ln">2599</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2600"><span class="ln">2600</span><span class="c"> <span class="s"> * </span>Element.remove
+</span></code><code id="L2601"><span class="ln">2601</span><span class="c"> [ method ]
+</span></code><code id="L2602"><span class="ln">2602</span><span class="c"> **
+</span></code><code id="L2603"><span class="ln">2603</span><span class="c"> <span class="s"> * </span>Removes element form the paper.
+</span></code><code id="L2604"><span class="ln">2604</span><span class="c"> \*/</span>
+</code><code id="L2605"><span class="ln">2605</span> elproto.remove<span class="s"> = </span><b>function</b> () {
+</code><code id="L2606"><span class="ln">2606</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L2607"><span class="ln">2607</span> <b>return</b>;
+</code><code id="L2608"><span class="ln">2608</span> }
+</code><code id="L2609"><span class="ln">2609</span> eve.unbind(<i>"*.*."</i><span class="s"> + </span><b>this</b>.id);
+</code><code id="L2610"><span class="ln">2610</span> tear(<b>this</b>, <b>this</b>.paper);
+</code><code id="L2611"><span class="ln">2611</span> <b>this</b>.node.parentNode.removeChild(<b>this</b>.node);
+</code><code id="L2612"><span class="ln">2612</span> <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>) {
+</code><code id="L2613"><span class="ln">2613</span> <b>delete</b> <b>this</b>[i];
+</code><code id="L2614"><span class="ln">2614</span> }
+</code><code id="L2615"><span class="ln">2615</span> <b>this</b>.removed<span class="s"> = </span><b>true</b>;
+</code><code id="L2616"><span class="ln">2616</span> };
+</code><code id="L2617"><span class="ln">2617</span> elproto._getBBox<span class="s"> = </span><b>function</b> () {
+</code><code id="L2618"><span class="ln">2618</span> <b>if</b> (<b>this</b>.node.style.display<span class="s"> == </span><i>"none"</i>) {
+</code><code id="L2619"><span class="ln">2619</span> <b>this</b>.show();
+</code><code id="L2620"><span class="ln">2620</span> <b>var</b> hide<span class="s"> = </span><b>true</b>;
+</code><code id="L2621"><span class="ln">2621</span> }
+</code><code id="L2622"><span class="ln">2622</span> <b>var</b> bbox<span class="s"> = </span>{};
+</code><code id="L2623"><span class="ln">2623</span> <b>try</b> {
+</code><code id="L2624"><span class="ln">2624</span> bbox<span class="s"> = </span><b>this</b>.node.getBBox();
+</code><code id="L2625"><span class="ln">2625</span> } <b>catch</b>(e) {
+</code><code id="L2626"><span class="ln">2626</span> <span class="c">// Firefox <span class="d">3.0</span>.x plays badly here</span>
+</code><code id="L2627"><span class="ln">2627</span> } <b>finally</b> {
+</code><code id="L2628"><span class="ln">2628</span> bbox<span class="s"> = </span>bbox<span class="s"> || </span>{};
+</code><code id="L2629"><span class="ln">2629</span> }
+</code><code id="L2630"><span class="ln">2630</span> hide<span class="s"> && </span><b>this</b>.hide();
+</code><code id="L2631"><span class="ln">2631</span> <b>return</b> bbox;
+</code><code id="L2632"><span class="ln">2632</span> };
+</code><code id="L2633"><span class="ln">2633</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2634"><span class="ln">2634</span><span class="c"> <span class="s"> * </span>Element.attr
+</span></code><code id="L2635"><span class="ln">2635</span><span class="c"> [ method ]
+</span></code><code id="L2636"><span class="ln">2636</span><span class="c"> **
+</span></code><code id="L2637"><span class="ln">2637</span><span class="c"> <span class="s"> * </span>Sets the attributes of the element.
+</span></code><code id="L2638"><span class="ln">2638</span><span class="c"> > Parameters
+</span></code><code id="L2639"><span class="ln">2639</span><span class="c"> <span class="s"> - </span>attrName (string) attribute’s name
+</span></code><code id="L2640"><span class="ln">2640</span><span class="c"> <span class="s"> - </span>value (string) value
+</span></code><code id="L2641"><span class="ln">2641</span><span class="c"> <span class="s"> * </span>or
+</span></code><code id="L2642"><span class="ln">2642</span><span class="c"> <span class="s"> - </span>params (object) object of name/value pairs
+</span></code><code id="L2643"><span class="ln">2643</span><span class="c"> <span class="s"> * </span>or
+</span></code><code id="L2644"><span class="ln">2644</span><span class="c"> <span class="s"> - </span>attrName (string) attribute’s name
+</span></code><code id="L2645"><span class="ln">2645</span><span class="c"> <span class="s"> * </span>or
+</span></code><code id="L2646"><span class="ln">2646</span><span class="c"> <span class="s"> - </span>attrNames (array) <b>in</b> <b>this</b> <b>case</b> method returns array of current values <b>for</b> given attribute names
+</span></code><code id="L2647"><span class="ln">2647</span><span class="c"> <span class="s"> = </span>(object) @Element <b>if</b> attrsName<span class="s"> & </span>value or params are passed <b>in</b>.
+</span></code><code id="L2648"><span class="ln">2648</span><span class="c"> <span class="s"> = </span>(...) value of the attribute <b>if</b> only attrsName is passed <b>in</b>.
+</span></code><code id="L2649"><span class="ln">2649</span><span class="c"> <span class="s"> = </span>(array) array of values of the attribute <b>if</b> attrsNames is passed <b>in</b>.
+</span></code><code id="L2650"><span class="ln">2650</span><span class="c"> <span class="s"> = </span>(object) object of attributes <b>if</b> nothing is passed <b>in</b>.
+</span></code><code id="L2651"><span class="ln">2651</span><span class="c"> > Possible parameters
+</span></code><code id="L2652"><span class="ln">2652</span><span class="c"> # <p>Please refer to the <a href=<i>"http:<span class="c">//www.w3.org/TR/SVG/"</i> title=<i>"The W3C Recommendation <b>for</b> the SVG language describes these properties <b>in</b> detail."</i>>SVG specification</a> <b>for</b> an explanation of these parameters.</p></span>
+</span></code><code id="L2653"><span class="ln">2653</span><span class="c"> o arrow-end (string) arrowhead on the end of the path. The format <b>for</b> string is `<type>[-<width>[-<length>]]`. Possible types: `classic`, `block`, `open`, `oval`, `diamond`, `none`, width: `wide`, `narrow`, `midium`, length: `<b>long</b>`, `<b>short</b>`, `midium`.
+</span></code><code id="L2654"><span class="ln">2654</span><span class="c"> o clip-rect (string) comma or space separated values: x, y, width and height
+</span></code><code id="L2655"><span class="ln">2655</span><span class="c"> o cursor (string) CSS type of the cursor
+</span></code><code id="L2656"><span class="ln">2656</span><span class="c"> o cx (number)
+</span></code><code id="L2657"><span class="ln">2657</span><span class="c"> o cy (number)
+</span></code><code id="L2658"><span class="ln">2658</span><span class="c"> o fill (string) colour, gradient or image
+</span></code><code id="L2659"><span class="ln">2659</span><span class="c"> o fill-opacity (number)
+</span></code><code id="L2660"><span class="ln">2660</span><span class="c"> o font (string)
+</span></code><code id="L2661"><span class="ln">2661</span><span class="c"> o font-family (string)
+</span></code><code id="L2662"><span class="ln">2662</span><span class="c"> o font-size (number) font size <b>in</b> pixels
+</span></code><code id="L2663"><span class="ln">2663</span><span class="c"> o font-weight (string)
+</span></code><code id="L2664"><span class="ln">2664</span><span class="c"> o height (number)
+</span></code><code id="L2665"><span class="ln">2665</span><span class="c"> o href (string) URL, <b>if</b> specified element behaves as hyperlink
+</span></code><code id="L2666"><span class="ln">2666</span><span class="c"> o opacity (number)
+</span></code><code id="L2667"><span class="ln">2667</span><span class="c"> o path (string) SVG path string format
+</span></code><code id="L2668"><span class="ln">2668</span><span class="c"> o r (number)
+</span></code><code id="L2669"><span class="ln">2669</span><span class="c"> o rx (number)
+</span></code><code id="L2670"><span class="ln">2670</span><span class="c"> o ry (number)
+</span></code><code id="L2671"><span class="ln">2671</span><span class="c"> o src (string) image URL, only works <b>for</b> @Element.image element
+</span></code><code id="L2672"><span class="ln">2672</span><span class="c"> o stroke (string) stroke colour
+</span></code><code id="L2673"><span class="ln">2673</span><span class="c"> o stroke-dasharray (string) [“”, “`-`”, “`.`”, “`-.`”, “`-..`”, “`. `”, “`- `”, “`--`”, “`- .`”, “`--.`”, “`--..`”]
+</span></code><code id="L2674"><span class="ln">2674</span><span class="c"> o stroke-linecap (string) [“`butt`”, “`square`”, “`round`”]
+</span></code><code id="L2675"><span class="ln">2675</span><span class="c"> o stroke-linejoin (string) [“`bevel`”, “`round`”, “`miter`”]
+</span></code><code id="L2676"><span class="ln">2676</span><span class="c"> o stroke-miterlimit (number)
+</span></code><code id="L2677"><span class="ln">2677</span><span class="c"> o stroke-opacity (number)
+</span></code><code id="L2678"><span class="ln">2678</span><span class="c"> o stroke-width (number) stroke width <b>in</b> pixels, <b>default</b> is <i>'<span class="d">1</span>'</i>
+</span></code><code id="L2679"><span class="ln">2679</span><span class="c"> o target (string) used <b>with</b> href
+</span></code><code id="L2680"><span class="ln">2680</span><span class="c"> o text (string) contents of the text element. Use `\n` <b>for</b> multiline text
+</span></code><code id="L2681"><span class="ln">2681</span><span class="c"> o text-anchor (string) [“`start`”, “`middle`”, “`end`”], <b>default</b> is “`middle`”
+</span></code><code id="L2682"><span class="ln">2682</span><span class="c"> o title (string) will create tooltip <b>with</b> a given text
+</span></code><code id="L2683"><span class="ln">2683</span><span class="c"> o transform (string) see @Element.transform
+</span></code><code id="L2684"><span class="ln">2684</span><span class="c"> o width (number)
+</span></code><code id="L2685"><span class="ln">2685</span><span class="c"> o x (number)
+</span></code><code id="L2686"><span class="ln">2686</span><span class="c"> o y (number)
+</span></code><code id="L2687"><span class="ln">2687</span><span class="c"> > Gradients
+</span></code><code id="L2688"><span class="ln">2688</span><span class="c"> <span class="s"> * </span>Linear gradient format: “`‹angle›-‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`<span class="d">90</span>-#fff-#<span class="d">000</span>`” – <span class="d">90</span>°
+</span></code><code id="L2689"><span class="ln">2689</span><span class="c"> <span class="s"> * </span>gradient from white to black or “`<span class="d">0</span>-#fff-#f00:<span class="d">20</span>-#<span class="d">000</span>`” – <span class="d">0</span>° gradient from white via red (at <span class="d">20</span>%) to black.
+</span></code><code id="L2690"><span class="ln">2690</span><span class="c"> *
+</span></code><code id="L2691"><span class="ln">2691</span><span class="c"> <span class="s"> * </span>radial gradient: “`r[(‹fx›, ‹fy›)]‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`r#fff-#<span class="d">000</span>`” –
+</span></code><code id="L2692"><span class="ln">2692</span><span class="c"> <span class="s"> * </span>gradient from white to black or “`r(<span class="d">0.25</span>, <span class="d">0.75</span>)#fff-#<span class="d">000</span>`” – gradient from white to black <b>with</b> focus point
+</span></code><code id="L2693"><span class="ln">2693</span><span class="c"> <span class="s"> * </span>at <span class="d">0.25</span>, <span class="d">0.75</span>. Focus point coordinates are <b>in</b> <span class="d">0</span>.<span class="d">.1</span> range. Radial gradients can only be applied to circles and ellipses.
+</span></code><code id="L2694"><span class="ln">2694</span><span class="c"> > Path String
+</span></code><code id="L2695"><span class="ln">2695</span><span class="c"> # <p>Please refer to <a href=<i>"http:<span class="c">//www.w3.org/TR/SVG/paths.html#PathData"</i> title=<i>"Details of a path’s data attribute’s format are described <b>in</b> the SVG specification."</i>>SVG documentation regarding path string</a>. Raphaël fully supports it.</p></span>
+</span></code><code id="L2696"><span class="ln">2696</span><span class="c"> > Colour Parsing
+</span></code><code id="L2697"><span class="ln">2697</span><span class="c"> # <ul>
+</span></code><code id="L2698"><span class="ln">2698</span><span class="c"> # <li>Colour name (“<code>red</code>”, “<code>green</code>”, “<code>cornflowerblue</code>”, etc)</li>
+</span></code><code id="L2699"><span class="ln">2699</span><span class="c"> # <li>#••• — shortened HTML colour: (“<code>#<span class="d">000</span></code>”, “<code>#fc0</code>”, etc)</li>
+</span></code><code id="L2700"><span class="ln">2700</span><span class="c"> # <li>#•••••• — full length HTML colour: (“<code>#<span class="d">000000</span></code>”, “<code>#bd2300</code>”)</li>
+</span></code><code id="L2701"><span class="ln">2701</span><span class="c"> # <li>rgb(•••, •••, •••) — red, green and blue channels’ values: (“<code>rgb(<span class="d">200</span>, <span class="d">100</span>, <span class="d">0</span>)</code>”)</li>
+</span></code><code id="L2702"><span class="ln">2702</span><span class="c"> # <li>rgb(•••%, •••%, •••%) — same as above, but <b>in</b> %: (“<code>rgb(<span class="d">100</span>%, <span class="d">175</span>%, <span class="d">0</span>%)</code>”)</li>
+</span></code><code id="L2703"><span class="ln">2703</span><span class="c"> # <li>rgba(•••, •••, •••, •••) — red, green and blue channels’ values: (“<code>rgba(<span class="d">200</span>, <span class="d">100</span>, <span class="d">0</span>, <span class="d">.5</span>)</code>”)</li>
+</span></code><code id="L2704"><span class="ln">2704</span><span class="c"> # <li>rgba(•••%, •••%, •••%, •••%) — same as above, but <b>in</b> %: (“<code>rgba(<span class="d">100</span>%, <span class="d">175</span>%, <span class="d">0</span>%, <span class="d">50</span>%)</code>”)</li>
+</span></code><code id="L2705"><span class="ln">2705</span><span class="c"> # <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (“<code>hsb(<span class="d">0.5</span>, <span class="d">0.25</span>, <span class="d">1</span>)</code>”)</li>
+</span></code><code id="L2706"><span class="ln">2706</span><span class="c"> # <li>hsb(•••%, •••%, •••%) — same as above, but <b>in</b> %</li>
+</span></code><code id="L2707"><span class="ln">2707</span><span class="c"> # <li>hsba(•••, •••, •••, •••) — same as above, but <b>with</b> opacity</li>
+</span></code><code id="L2708"><span class="ln">2708</span><span class="c"> # <li>hsl(•••, •••, •••) — almost the same as hsb, see <a href=<i>"http:<span class="c">//en.wikipedia.org/wiki/HSL_and_HSV"</i> title=<i>"HSL and HSV<span class="s"> - </span>Wikipedia, the free encyclopedia"</i>>Wikipedia page</a></li></span>
+</span></code><code id="L2709"><span class="ln">2709</span><span class="c"> # <li>hsl(•••%, •••%, •••%) — same as above, but <b>in</b> %</li>
+</span></code><code id="L2710"><span class="ln">2710</span><span class="c"> # <li>hsla(•••, •••, •••) — same as above, but <b>with</b> opacity</li>
+</span></code><code id="L2711"><span class="ln">2711</span><span class="c"> # <li>Optionally <b>for</b> hsb and hsl you could specify hue as a degree: “<code>hsl(240deg, <span class="d">1</span>, <span class="d">.5</span>)</code>” or, <b>if</b> you want to go fancy, “<code>hsl(<span class="d">240</span>°, <span class="d">1</span>, <span class="d">.5</span>)</code>”</li>
+</span></code><code id="L2712"><span class="ln">2712</span><span class="c"> # </ul>
+</span></code><code id="L2713"><span class="ln">2713</span><span class="c"> \*/</span>
+</code><code id="L2714"><span class="ln">2714</span> elproto.attr<span class="s"> = </span><b>function</b> (name, value) {
+</code><code id="L2715"><span class="ln">2715</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L2716"><span class="ln">2716</span> <b>return</b> <b>this</b>;
+</code><code id="L2717"><span class="ln">2717</span> }
+</code><code id="L2718"><span class="ln">2718</span> <b>if</b> (name<span class="s"> == </span><b>null</b>) {
+</code><code id="L2719"><span class="ln">2719</span> <b>var</b> res<span class="s"> = </span>{};
+</code><code id="L2720"><span class="ln">2720</span> <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>.attrs) <b>if</b> (<b>this</b>.attrs[has](i)) {
+</code><code id="L2721"><span class="ln">2721</span> res[i]<span class="s"> = </span><b>this</b>.attrs[i];
+</code><code id="L2722"><span class="ln">2722</span> }
+</code><code id="L2723"><span class="ln">2723</span> res.gradient<span class="s"> && </span>res.fill<span class="s"> == </span><i>"none"</i><span class="s"> && </span>(res.fill<span class="s"> = </span>res.gradient)<span class="s"> && </span><b>delete</b> res.gradient;
+</code><code id="L2724"><span class="ln">2724</span> res.transform<span class="s"> = </span><b>this</b>._.transform;
+</code><code id="L2725"><span class="ln">2725</span> <b>return</b> res;
+</code><code id="L2726"><span class="ln">2726</span> }
+</code><code id="L2727"><span class="ln">2727</span> <b>if</b> (value<span class="s"> == </span><b>null</b><span class="s"> && </span>R.is(name, string)) {
+</code><code id="L2728"><span class="ln">2728</span> <b>if</b> (name<span class="s"> == </span>fillString<span class="s"> && </span><b>this</b>.attrs.fill<span class="s"> == </span><i>"none"</i><span class="s"> && </span><b>this</b>.attrs.gradient) {
+</code><code id="L2729"><span class="ln">2729</span> <b>return</b> <b>this</b>.attrs.gradient;
+</code><code id="L2730"><span class="ln">2730</span> }
+</code><code id="L2731"><span class="ln">2731</span> <b>if</b> (name<span class="s"> == </span><i>"transform"</i>) {
+</code><code id="L2732"><span class="ln">2732</span> <b>return</b> <b>this</b>._.transform;
+</code><code id="L2733"><span class="ln">2733</span> }
+</code><code id="L2734"><span class="ln">2734</span> <b>if</b> (name <b>in</b> <b>this</b>.attrs) {
+</code><code id="L2735"><span class="ln">2735</span> <b>return</b> <b>this</b>.attrs[name];
+</code><code id="L2736"><span class="ln">2736</span> } <b>else</b> <b>if</b> (R.is(<b>this</b>.paper.customAttributes[name], <i>"<b>function</b>"</i>)) {
+</code><code id="L2737"><span class="ln">2737</span> <b>return</b> <b>this</b>.paper.customAttributes[name].def;
+</code><code id="L2738"><span class="ln">2738</span> } <b>else</b> {
+</code><code id="L2739"><span class="ln">2739</span> <b>return</b> availableAttrs[name];
+</code><code id="L2740"><span class="ln">2740</span> }
+</code><code id="L2741"><span class="ln">2741</span> }
+</code><code id="L2742"><span class="ln">2742</span> <b>if</b> (value<span class="s"> == </span><b>null</b><span class="s"> && </span>R.is(name, array)) {
+</code><code id="L2743"><span class="ln">2743</span> <b>var</b> values<span class="s"> = </span>{};
+</code><code id="L2744"><span class="ln">2744</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">0</span>, jj<span class="s"> = </span>name.length; j < jj; j++) {
+</code><code id="L2745"><span class="ln">2745</span> values[name[j]]<span class="s"> = </span><b>this</b>.attr(name[j]);
+</code><code id="L2746"><span class="ln">2746</span> }
+</code><code id="L2747"><span class="ln">2747</span> <b>return</b> values;
+</code><code id="L2748"><span class="ln">2748</span> }
+</code><code id="L2749"><span class="ln">2749</span> <b>if</b> (value != <b>null</b>) {
+</code><code id="L2750"><span class="ln">2750</span> <b>var</b> params<span class="s"> = </span>{};
+</code><code id="L2751"><span class="ln">2751</span> params[name]<span class="s"> = </span>value;
+</code><code id="L2752"><span class="ln">2752</span> } <b>else</b> <b>if</b> (name != <b>null</b><span class="s"> && </span>R.is(name, <i>"object"</i>)) {
+</code><code id="L2753"><span class="ln">2753</span> params<span class="s"> = </span>name;
+</code><code id="L2754"><span class="ln">2754</span> }
+</code><code id="L2755"><span class="ln">2755</span> <b>for</b> (<b>var</b> key <b>in</b> <b>this</b>.paper.customAttributes) <b>if</b> (<b>this</b>.paper.customAttributes[has](key)<span class="s"> && </span>params[has](key)<span class="s"> && </span>R.is(<b>this</b>.paper.customAttributes[key], <i>"<b>function</b>"</i>)) {
+</code><code id="L2756"><span class="ln">2756</span> <b>var</b> par<span class="s"> = </span><b>this</b>.paper.customAttributes[key].apply(<b>this</b>, [][concat](params[key]));
+</code><code id="L2757"><span class="ln">2757</span> <b>this</b>.attrs[key]<span class="s"> = </span>params[key];
+</code><code id="L2758"><span class="ln">2758</span> <b>for</b> (<b>var</b> subkey <b>in</b> par) <b>if</b> (par[has](subkey)) {
+</code><code id="L2759"><span class="ln">2759</span> params[subkey]<span class="s"> = </span>par[subkey];
+</code><code id="L2760"><span class="ln">2760</span> }
+</code><code id="L2761"><span class="ln">2761</span> }
+</code><code id="L2762"><span class="ln">2762</span> setFillAndStroke(<b>this</b>, params);
+</code><code id="L2763"><span class="ln">2763</span> <b>return</b> <b>this</b>;
+</code><code id="L2764"><span class="ln">2764</span> };
+</code><code id="L2765"><span class="ln">2765</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2766"><span class="ln">2766</span><span class="c"> <span class="s"> * </span>Element.toFront
+</span></code><code id="L2767"><span class="ln">2767</span><span class="c"> [ method ]
+</span></code><code id="L2768"><span class="ln">2768</span><span class="c"> **
+</span></code><code id="L2769"><span class="ln">2769</span><span class="c"> <span class="s"> * </span>Moves the element so it is the closest to the viewer’s eyes, on top of other elements.
+</span></code><code id="L2770"><span class="ln">2770</span><span class="c"> <span class="s"> = </span>(object) @Element
+</span></code><code id="L2771"><span class="ln">2771</span><span class="c"> \*/</span>
+</code><code id="L2772"><span class="ln">2772</span> elproto.toFront<span class="s"> = </span><b>function</b> () {
+</code><code id="L2773"><span class="ln">2773</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L2774"><span class="ln">2774</span> <b>return</b> <b>this</b>;
+</code><code id="L2775"><span class="ln">2775</span> }
+</code><code id="L2776"><span class="ln">2776</span> <b>this</b>.node.parentNode.appendChild(<b>this</b>.node);
+</code><code id="L2777"><span class="ln">2777</span> <b>var</b> svg<span class="s"> = </span><b>this</b>.paper;
+</code><code id="L2778"><span class="ln">2778</span> svg.top != <b>this</b><span class="s"> && </span>tofront(<b>this</b>, svg);
+</code><code id="L2779"><span class="ln">2779</span> <b>return</b> <b>this</b>;
+</code><code id="L2780"><span class="ln">2780</span> };
+</code><code id="L2781"><span class="ln">2781</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2782"><span class="ln">2782</span><span class="c"> <span class="s"> * </span>Element.toBack
+</span></code><code id="L2783"><span class="ln">2783</span><span class="c"> [ method ]
+</span></code><code id="L2784"><span class="ln">2784</span><span class="c"> **
+</span></code><code id="L2785"><span class="ln">2785</span><span class="c"> <span class="s"> * </span>Moves the element so it is the furthest from the viewer’s eyes, behind other elements.
+</span></code><code id="L2786"><span class="ln">2786</span><span class="c"> <span class="s"> = </span>(object) @Element
+</span></code><code id="L2787"><span class="ln">2787</span><span class="c"> \*/</span>
+</code><code id="L2788"><span class="ln">2788</span> elproto.toBack<span class="s"> = </span><b>function</b> () {
+</code><code id="L2789"><span class="ln">2789</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L2790"><span class="ln">2790</span> <b>return</b> <b>this</b>;
+</code><code id="L2791"><span class="ln">2791</span> }
+</code><code id="L2792"><span class="ln">2792</span> <b>if</b> (<b>this</b>.node.parentNode.firstChild != <b>this</b>.node) {
+</code><code id="L2793"><span class="ln">2793</span> <b>this</b>.node.parentNode.insertBefore(<b>this</b>.node, <b>this</b>.node.parentNode.firstChild);
+</code><code id="L2794"><span class="ln">2794</span> toback(<b>this</b>, <b>this</b>.paper);
+</code><code id="L2795"><span class="ln">2795</span> <b>var</b> svg<span class="s"> = </span><b>this</b>.paper;
+</code><code id="L2796"><span class="ln">2796</span> }
+</code><code id="L2797"><span class="ln">2797</span> <b>return</b> <b>this</b>;
+</code><code id="L2798"><span class="ln">2798</span> };
+</code><code id="L2799"><span class="ln">2799</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2800"><span class="ln">2800</span><span class="c"> <span class="s"> * </span>Element.insertAfter
+</span></code><code id="L2801"><span class="ln">2801</span><span class="c"> [ method ]
+</span></code><code id="L2802"><span class="ln">2802</span><span class="c"> **
+</span></code><code id="L2803"><span class="ln">2803</span><span class="c"> <span class="s"> * </span>Inserts current object after the given one.
+</span></code><code id="L2804"><span class="ln">2804</span><span class="c"> <span class="s"> = </span>(object) @Element
+</span></code><code id="L2805"><span class="ln">2805</span><span class="c"> \*/</span>
+</code><code id="L2806"><span class="ln">2806</span> elproto.insertAfter<span class="s"> = </span><b>function</b> (element) {
+</code><code id="L2807"><span class="ln">2807</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L2808"><span class="ln">2808</span> <b>return</b> <b>this</b>;
+</code><code id="L2809"><span class="ln">2809</span> }
+</code><code id="L2810"><span class="ln">2810</span> <b>var</b> node<span class="s"> = </span>element.node<span class="s"> || </span>element[element.length<span class="s"> - </span><span class="d">1</span>].node;
+</code><code id="L2811"><span class="ln">2811</span> <b>if</b> (node.nextSibling) {
+</code><code id="L2812"><span class="ln">2812</span> node.parentNode.insertBefore(<b>this</b>.node, node.nextSibling);
+</code><code id="L2813"><span class="ln">2813</span> } <b>else</b> {
+</code><code id="L2814"><span class="ln">2814</span> node.parentNode.appendChild(<b>this</b>.node);
+</code><code id="L2815"><span class="ln">2815</span> }
+</code><code id="L2816"><span class="ln">2816</span> insertafter(<b>this</b>, element, <b>this</b>.paper);
+</code><code id="L2817"><span class="ln">2817</span> <b>return</b> <b>this</b>;
+</code><code id="L2818"><span class="ln">2818</span> };
+</code><code id="L2819"><span class="ln">2819</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2820"><span class="ln">2820</span><span class="c"> <span class="s"> * </span>Element.insertBefore
+</span></code><code id="L2821"><span class="ln">2821</span><span class="c"> [ method ]
+</span></code><code id="L2822"><span class="ln">2822</span><span class="c"> **
+</span></code><code id="L2823"><span class="ln">2823</span><span class="c"> <span class="s"> * </span>Inserts current object before the given one.
+</span></code><code id="L2824"><span class="ln">2824</span><span class="c"> <span class="s"> = </span>(object) @Element
+</span></code><code id="L2825"><span class="ln">2825</span><span class="c"> \*/</span>
+</code><code id="L2826"><span class="ln">2826</span> elproto.insertBefore<span class="s"> = </span><b>function</b> (element) {
+</code><code id="L2827"><span class="ln">2827</span> <b>if</b> (<b>this</b>.removed) {
+</code><code id="L2828"><span class="ln">2828</span> <b>return</b> <b>this</b>;
+</code><code id="L2829"><span class="ln">2829</span> }
+</code><code id="L2830"><span class="ln">2830</span> <b>var</b> node<span class="s"> = </span>element.node<span class="s"> || </span>element[<span class="d">0</span>].node;
+</code><code id="L2831"><span class="ln">2831</span> node.parentNode.insertBefore(<b>this</b>.node, node);
+</code><code id="L2832"><span class="ln">2832</span> insertbefore(<b>this</b>, element, <b>this</b>.paper);
+</code><code id="L2833"><span class="ln">2833</span> <b>return</b> <b>this</b>;
+</code><code id="L2834"><span class="ln">2834</span> };
+</code><code id="L2835"><span class="ln">2835</span> elproto.blur<span class="s"> = </span><b>function</b> (size) {
+</code><code id="L2836"><span class="ln">2836</span> <span class="c">// Experimental. No Safari support. Use it on your own risk.</span>
+</code><code id="L2837"><span class="ln">2837</span> <b>var</b> t<span class="s"> = </span><b>this</b>;
+</code><code id="L2838"><span class="ln">2838</span> <b>if</b> (+size !== <span class="d">0</span>) {
+</code><code id="L2839"><span class="ln">2839</span> <b>var</b> fltr<span class="s"> = </span>$(<i>"filter"</i>),
+</code><code id="L2840"><span class="ln">2840</span> blur<span class="s"> = </span>$(<i>"feGaussianBlur"</i>);
+</code><code id="L2841"><span class="ln">2841</span> t.attrs.blur<span class="s"> = </span>size;
+</code><code id="L2842"><span class="ln">2842</span> fltr.id<span class="s"> = </span>createUUID();
+</code><code id="L2843"><span class="ln">2843</span> $(blur, {stdDeviation: +size<span class="s"> || </span><span class="d">1.5</span>});
+</code><code id="L2844"><span class="ln">2844</span> fltr.appendChild(blur);
+</code><code id="L2845"><span class="ln">2845</span> t.paper.defs.appendChild(fltr);
+</code><code id="L2846"><span class="ln">2846</span> t._blur<span class="s"> = </span>fltr;
+</code><code id="L2847"><span class="ln">2847</span> $(t.node, {filter: <i>"url(#"</i><span class="s"> + </span>fltr.id<span class="s"> + </span><i>")"</i>});
+</code><code id="L2848"><span class="ln">2848</span> } <b>else</b> {
+</code><code id="L2849"><span class="ln">2849</span> <b>if</b> (t._blur) {
+</code><code id="L2850"><span class="ln">2850</span> t._blur.parentNode.removeChild(t._blur);
+</code><code id="L2851"><span class="ln">2851</span> <b>delete</b> t._blur;
+</code><code id="L2852"><span class="ln">2852</span> <b>delete</b> t.attrs.blur;
+</code><code id="L2853"><span class="ln">2853</span> }
+</code><code id="L2854"><span class="ln">2854</span> t.node.removeAttribute(<i>"filter"</i>);
+</code><code id="L2855"><span class="ln">2855</span> }
+</code><code id="L2856"><span class="ln">2856</span> };
+</code><code id="L2857"><span class="ln">2857</span> <b>var</b> theCircle<span class="s"> = </span><b>function</b> (svg, x, y, r) {
+</code><code id="L2858"><span class="ln">2858</span> <b>var</b> el<span class="s"> = </span>$(<i>"circle"</i>);
+</code><code id="L2859"><span class="ln">2859</span> svg.canvas<span class="s"> && </span>svg.canvas.appendChild(el);
+</code><code id="L2860"><span class="ln">2860</span> <b>var</b> res<span class="s"> = </span><b>new</b> Element(el, svg);
+</code><code id="L2861"><span class="ln">2861</span> res.attrs<span class="s"> = </span>{cx: x, cy: y, r: r, fill: <i>"none"</i>, stroke: <i>"#<span class="d">000</span>"</i>};
+</code><code id="L2862"><span class="ln">2862</span> res.type<span class="s"> = </span><i>"circle"</i>;
+</code><code id="L2863"><span class="ln">2863</span> $(el, res.attrs);
+</code><code id="L2864"><span class="ln">2864</span> <b>return</b> res;
+</code><code id="L2865"><span class="ln">2865</span> },
+</code><code id="L2866"><span class="ln">2866</span> theRect<span class="s"> = </span><b>function</b> (svg, x, y, w, h, r) {
+</code><code id="L2867"><span class="ln">2867</span> <b>var</b> el<span class="s"> = </span>$(<i>"rect"</i>);
+</code><code id="L2868"><span class="ln">2868</span> svg.canvas<span class="s"> && </span>svg.canvas.appendChild(el);
+</code><code id="L2869"><span class="ln">2869</span> <b>var</b> res<span class="s"> = </span><b>new</b> Element(el, svg);
+</code><code id="L2870"><span class="ln">2870</span> res.attrs<span class="s"> = </span>{x: x, y: y, width: w, height: h, r: r<span class="s"> || </span><span class="d">0</span>, rx: r<span class="s"> || </span><span class="d">0</span>, ry: r<span class="s"> || </span><span class="d">0</span>, fill: <i>"none"</i>, stroke: <i>"#<span class="d">000</span>"</i>};
+</code><code id="L2871"><span class="ln">2871</span> res.type<span class="s"> = </span><i>"rect"</i>;
+</code><code id="L2872"><span class="ln">2872</span> $(el, res.attrs);
+</code><code id="L2873"><span class="ln">2873</span> <b>return</b> res;
+</code><code id="L2874"><span class="ln">2874</span> },
+</code><code id="L2875"><span class="ln">2875</span> theEllipse<span class="s"> = </span><b>function</b> (svg, x, y, rx, ry) {
+</code><code id="L2876"><span class="ln">2876</span> <b>var</b> el<span class="s"> = </span>$(<i>"ellipse"</i>);
+</code><code id="L2877"><span class="ln">2877</span> svg.canvas<span class="s"> && </span>svg.canvas.appendChild(el);
+</code><code id="L2878"><span class="ln">2878</span> <b>var</b> res<span class="s"> = </span><b>new</b> Element(el, svg);
+</code><code id="L2879"><span class="ln">2879</span> res.attrs<span class="s"> = </span>{cx: x, cy: y, rx: rx, ry: ry, fill: <i>"none"</i>, stroke: <i>"#<span class="d">000</span>"</i>};
+</code><code id="L2880"><span class="ln">2880</span> res.type<span class="s"> = </span><i>"ellipse"</i>;
+</code><code id="L2881"><span class="ln">2881</span> $(el, res.attrs);
+</code><code id="L2882"><span class="ln">2882</span> <b>return</b> res;
+</code><code id="L2883"><span class="ln">2883</span> },
+</code><code id="L2884"><span class="ln">2884</span> theImage<span class="s"> = </span><b>function</b> (svg, src, x, y, w, h) {
+</code><code id="L2885"><span class="ln">2885</span> <b>var</b> el<span class="s"> = </span>$(<i>"image"</i>);
+</code><code id="L2886"><span class="ln">2886</span> $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: <i>"none"</i>});
+</code><code id="L2887"><span class="ln">2887</span> el.setAttributeNS(xlink, <i>"href"</i>, src);
+</code><code id="L2888"><span class="ln">2888</span> svg.canvas<span class="s"> && </span>svg.canvas.appendChild(el);
+</code><code id="L2889"><span class="ln">2889</span> <b>var</b> res<span class="s"> = </span><b>new</b> Element(el, svg);
+</code><code id="L2890"><span class="ln">2890</span> res.attrs<span class="s"> = </span>{x: x, y: y, width: w, height: h, src: src};
+</code><code id="L2891"><span class="ln">2891</span> res.type<span class="s"> = </span><i>"image"</i>;
+</code><code id="L2892"><span class="ln">2892</span> <b>return</b> res;
+</code><code id="L2893"><span class="ln">2893</span> },
+</code><code id="L2894"><span class="ln">2894</span> theText<span class="s"> = </span><b>function</b> (svg, x, y, text) {
+</code><code id="L2895"><span class="ln">2895</span> <b>var</b> el<span class="s"> = </span>$(<i>"text"</i>);
+</code><code id="L2896"><span class="ln">2896</span> $(el, {x: x, y: y, <i>"text-anchor"</i>: <i>"middle"</i>});
+</code><code id="L2897"><span class="ln">2897</span> svg.canvas<span class="s"> && </span>svg.canvas.appendChild(el);
+</code><code id="L2898"><span class="ln">2898</span> <b>var</b> res<span class="s"> = </span><b>new</b> Element(el, svg);
+</code><code id="L2899"><span class="ln">2899</span> res.attrs<span class="s"> = </span>{x: x, y: y, <i>"text-anchor"</i>: <i>"middle"</i>, text: text, font: availableAttrs.font, stroke: <i>"none"</i>, fill: <i>"#<span class="d">000</span>"</i>};
+</code><code id="L2900"><span class="ln">2900</span> res.type<span class="s"> = </span><i>"text"</i>;
+</code><code id="L2901"><span class="ln">2901</span> setFillAndStroke(res, res.attrs);
+</code><code id="L2902"><span class="ln">2902</span> <b>return</b> res;
+</code><code id="L2903"><span class="ln">2903</span> },
+</code><code id="L2904"><span class="ln">2904</span> setSize<span class="s"> = </span><b>function</b> (width, height) {
+</code><code id="L2905"><span class="ln">2905</span> <b>this</b>.width<span class="s"> = </span>width<span class="s"> || </span><b>this</b>.width;
+</code><code id="L2906"><span class="ln">2906</span> <b>this</b>.height<span class="s"> = </span>height<span class="s"> || </span><b>this</b>.height;
+</code><code id="L2907"><span class="ln">2907</span> <b>this</b>.canvas[setAttribute](<i>"width"</i>, <b>this</b>.width);
+</code><code id="L2908"><span class="ln">2908</span> <b>this</b>.canvas[setAttribute](<i>"height"</i>, <b>this</b>.height);
+</code><code id="L2909"><span class="ln">2909</span> <b>if</b> (<b>this</b>._viewBox) {
+</code><code id="L2910"><span class="ln">2910</span> <b>this</b>.setViewBox.apply(<b>this</b>, <b>this</b>._viewBox);
+</code><code id="L2911"><span class="ln">2911</span> }
+</code><code id="L2912"><span class="ln">2912</span> <b>return</b> <b>this</b>;
+</code><code id="L2913"><span class="ln">2913</span> },
+</code><code id="L2914"><span class="ln">2914</span> create<span class="s"> = </span><b>function</b> () {
+</code><code id="L2915"><span class="ln">2915</span> <b>var</b> con<span class="s"> = </span>getContainer[apply](<span class="d">0</span>, arguments),
+</code><code id="L2916"><span class="ln">2916</span> container<span class="s"> = </span>con<span class="s"> && </span>con.container,
+</code><code id="L2917"><span class="ln">2917</span> x<span class="s"> = </span>con.x,
+</code><code id="L2918"><span class="ln">2918</span> y<span class="s"> = </span>con.y,
+</code><code id="L2919"><span class="ln">2919</span> width<span class="s"> = </span>con.width,
+</code><code id="L2920"><span class="ln">2920</span> height<span class="s"> = </span>con.height;
+</code><code id="L2921"><span class="ln">2921</span> <b>if</b> (!container) {
+</code><code id="L2922"><span class="ln">2922</span> <b>throw</b> <b>new</b> Error(<i>"SVG container not found."</i>);
+</code><code id="L2923"><span class="ln">2923</span> }
+</code><code id="L2924"><span class="ln">2924</span> <b>var</b> cnvs<span class="s"> = </span>$(<i>"svg"</i>),
+</code><code id="L2925"><span class="ln">2925</span> css<span class="s"> = </span><i>"overflow:hidden;"</i>;
+</code><code id="L2926"><span class="ln">2926</span> x<span class="s"> = </span>x<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L2927"><span class="ln">2927</span> y<span class="s"> = </span>y<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L2928"><span class="ln">2928</span> width<span class="s"> = </span>width<span class="s"> || </span><span class="d">512</span>;
+</code><code id="L2929"><span class="ln">2929</span> height<span class="s"> = </span>height<span class="s"> || </span><span class="d">342</span>;
+</code><code id="L2930"><span class="ln">2930</span> $(cnvs, {
+</code><code id="L2931"><span class="ln">2931</span> height: height,
+</code><code id="L2932"><span class="ln">2932</span> version: <span class="d">1.1</span>,
+</code><code id="L2933"><span class="ln">2933</span> width: width,
+</code><code id="L2934"><span class="ln">2934</span> xmlns: <i>"http:<span class="c">//www.w3.org/<span class="d">2000</span>/svg"</i></span>
+</code><code id="L2935"><span class="ln">2935</span> });
+</code><code id="L2936"><span class="ln">2936</span> <b>if</b> (container<span class="s"> == </span><span class="d">1</span>) {
+</code><code id="L2937"><span class="ln">2937</span> cnvs.style.cssText<span class="s"> = </span>css<span class="s"> + </span><i>"position:absolute;left:"</i><span class="s"> + </span>x<span class="s"> + </span><i>"px;top:"</i><span class="s"> + </span>y<span class="s"> + </span><i>"px"</i>;
+</code><code id="L2938"><span class="ln">2938</span> g.doc.body.appendChild(cnvs);
+</code><code id="L2939"><span class="ln">2939</span> } <b>else</b> {
+</code><code id="L2940"><span class="ln">2940</span> cnvs.style.cssText<span class="s"> = </span>css;
+</code><code id="L2941"><span class="ln">2941</span> <b>if</b> (container.firstChild) {
+</code><code id="L2942"><span class="ln">2942</span> container.insertBefore(cnvs, container.firstChild);
+</code><code id="L2943"><span class="ln">2943</span> } <b>else</b> {
+</code><code id="L2944"><span class="ln">2944</span> container.appendChild(cnvs);
+</code><code id="L2945"><span class="ln">2945</span> }
+</code><code id="L2946"><span class="ln">2946</span> }
+</code><code id="L2947"><span class="ln">2947</span> container<span class="s"> = </span><b>new</b> Paper;
+</code><code id="L2948"><span class="ln">2948</span> container.width<span class="s"> = </span>width;
+</code><code id="L2949"><span class="ln">2949</span> container.height<span class="s"> = </span>height;
+</code><code id="L2950"><span class="ln">2950</span> container.canvas<span class="s"> = </span>cnvs;
+</code><code id="L2951"><span class="ln">2951</span> plugins.call(container, container, R.fn);
+</code><code id="L2952"><span class="ln">2952</span> container.clear();
+</code><code id="L2953"><span class="ln">2953</span> <b>return</b> container;
+</code><code id="L2954"><span class="ln">2954</span> },
+</code><code id="L2955"><span class="ln">2955</span> setViewBox<span class="s"> = </span><b>function</b> (x, y, w, h, fit) {
+</code><code id="L2956"><span class="ln">2956</span> eve(<i>"setViewBox"</i>, <b>this</b>, <b>this</b>._viewBox, [x, y, w, h, fit]);
+</code><code id="L2957"><span class="ln">2957</span> <b>var</b> size<span class="s"> = </span>mmax(w<span class="s"> / </span><b>this</b>.width, h<span class="s"> / </span><b>this</b>.height),
+</code><code id="L2958"><span class="ln">2958</span> top<span class="s"> = </span><b>this</b>.top,
+</code><code id="L2959"><span class="ln">2959</span> aspectRatio<span class="s"> = </span>fit ? <i>"meet"</i> : <i>"xMinYMin"</i>,
+</code><code id="L2960"><span class="ln">2960</span> vb,
+</code><code id="L2961"><span class="ln">2961</span> sw;
+</code><code id="L2962"><span class="ln">2962</span> <b>if</b> (x<span class="s"> == </span><b>null</b>) {
+</code><code id="L2963"><span class="ln">2963</span> <b>if</b> (<b>this</b>._vbSize) {
+</code><code id="L2964"><span class="ln">2964</span> size<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2965"><span class="ln">2965</span> }
+</code><code id="L2966"><span class="ln">2966</span> <b>delete</b> <b>this</b>._vbSize;
+</code><code id="L2967"><span class="ln">2967</span> vb<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span> "</i><span class="s"> + </span><b>this</b>.width<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.height;
+</code><code id="L2968"><span class="ln">2968</span> } <b>else</b> {
+</code><code id="L2969"><span class="ln">2969</span> <b>this</b>._vbSize<span class="s"> = </span>size;
+</code><code id="L2970"><span class="ln">2970</span> vb<span class="s"> = </span>x<span class="s"> + </span>S<span class="s"> + </span>y<span class="s"> + </span>S<span class="s"> + </span>w<span class="s"> + </span>S<span class="s"> + </span>h;
+</code><code id="L2971"><span class="ln">2971</span> }
+</code><code id="L2972"><span class="ln">2972</span> $(<b>this</b>.canvas, {
+</code><code id="L2973"><span class="ln">2973</span> viewBox: vb,
+</code><code id="L2974"><span class="ln">2974</span> preserveAspectRatio: aspectRatio
+</code><code id="L2975"><span class="ln">2975</span> });
+</code><code id="L2976"><span class="ln">2976</span> <b>while</b> (size<span class="s"> && </span>top) {
+</code><code id="L2977"><span class="ln">2977</span> sw<span class="s"> = </span><i>"stroke-width"</i> <b>in</b> top.attrs ? top.attrs[<i>"stroke-width"</i>] : <span class="d">1</span>;
+</code><code id="L2978"><span class="ln">2978</span> top.attr({<i>"stroke-width"</i>: sw});
+</code><code id="L2979"><span class="ln">2979</span> top._.dirty<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2980"><span class="ln">2980</span> top._.dirtyT<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2981"><span class="ln">2981</span> top<span class="s"> = </span>top.prev;
+</code><code id="L2982"><span class="ln">2982</span> }
+</code><code id="L2983"><span class="ln">2983</span> <b>this</b>._viewBox<span class="s"> = </span>[x, y, w, h, !!fit];
+</code><code id="L2984"><span class="ln">2984</span> <b>return</b> <b>this</b>;
+</code><code id="L2985"><span class="ln">2985</span> };
+</code><code id="L2986"><span class="ln">2986</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L2987"><span class="ln">2987</span><span class="c"> <span class="s"> * </span>Paper.clear
+</span></code><code id="L2988"><span class="ln">2988</span><span class="c"> [ method ]
+</span></code><code id="L2989"><span class="ln">2989</span><span class="c"> **
+</span></code><code id="L2990"><span class="ln">2990</span><span class="c"> <span class="s"> * </span>Clears the paper, i.e. removes all the elements.
+</span></code><code id="L2991"><span class="ln">2991</span><span class="c"> \*/</span>
+</code><code id="L2992"><span class="ln">2992</span> paperproto.clear<span class="s"> = </span><b>function</b> () {
+</code><code id="L2993"><span class="ln">2993</span> eve(<i>"clear"</i>, <b>this</b>);
+</code><code id="L2994"><span class="ln">2994</span> <b>var</b> c<span class="s"> = </span><b>this</b>.canvas;
+</code><code id="L2995"><span class="ln">2995</span> <b>while</b> (c.firstChild) {
+</code><code id="L2996"><span class="ln">2996</span> c.removeChild(c.firstChild);
+</code><code id="L2997"><span class="ln">2997</span> }
+</code><code id="L2998"><span class="ln">2998</span> <b>this</b>.bottom<span class="s"> = </span><b>this</b>.top<span class="s"> = </span><b>null</b>;
+</code><code id="L2999"><span class="ln">2999</span> (<b>this</b>.desc<span class="s"> = </span>$(<i>"desc"</i>)).appendChild(g.doc.createTextNode(<i>"Created <b>with</b> Rapha\xebl "</i><span class="s"> + </span>R.version));
+</code><code id="L3000"><span class="ln">3000</span> c.appendChild(<b>this</b>.desc);
+</code><code id="L3001"><span class="ln">3001</span> c.appendChild(<b>this</b>.defs<span class="s"> = </span>$(<i>"defs"</i>));
+</code><code id="L3002"><span class="ln">3002</span> };
+</code><code id="L3003"><span class="ln">3003</span><span class="c"> <span class="c">/*\</span>
+</span></code><code id="L3004"><span class="ln">3004</span><span class="c"> <span class="s"> * </span>Paper.remove
+</span></code><code id="L3005"><span class="ln">3005</span><span class="c"> [ method ]
+</span></code><code id="L3006"><span class="ln">3006</span><span class="c"> **
+</span></code><code id="L3007"><span class="ln">3007</span><span class="c"> <span class="s"> * </span>Removes the paper from the DOM.
+</span></code><code id="L3008"><span class="ln">3008</span><span class="c"> \*/</span>
+</code><code id="L3009"><span class="ln">3009</span> paperproto.remove<span class="s"> = </span><b>function</b> () {
+</code><code id="L3010"><span class="ln">3010</span> eve(<i>"remove"</i>, <b>this</b>);
+</code><code id="L3011"><span class="ln">3011</span> <b>this</b>.canvas.parentNode<span class="s"> && </span><b>this</b>.canvas.parentNode.removeChild(<b>this</b>.canvas);
+</code><code id="L3012"><span class="ln">3012</span> <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>) {
+</code><code id="L3013"><span class="ln">3013</span> <b>this</b>[i]<span class="s"> = </span>removed(i);
+</code><code id="L3014"><span class="ln">3014</span> }
+</code><code id="L3015"><span class="ln">3015</span> };
+</code><code id="L3016"><span class="ln">3016</span> }
+</code><code id="L3017"><span class="ln">3017</span>
+</code><code id="L3018"><span class="ln">3018</span> <span class="c">// VML</span>
+</code><code id="L3019"><span class="ln">3019</span> <b>if</b> (R.vml) {
+</code><code id="L3020"><span class="ln">3020</span> <b>var</b> map<span class="s"> = </span>{M: <i>"m"</i>, L: <i>"l"</i>, C: <i>"c"</i>, Z: <i>"x"</i>, m: <i>"t"</i>, l: <i>"r"</i>, c: <i>"v"</i>, z: <i>"x"</i>},
+</code><code id="L3021"><span class="ln">3021</span> bites<span class="s"> = </span>/([clmz]),?([^clmz]*)/gi,
+</code><code id="L3022"><span class="ln">3022</span> blurregexp<span class="s"> = </span>/ progid:\S+Blur\([^\)]+\)/g,
+</code><code id="L3023"><span class="ln">3023</span> val<span class="s"> = </span>/-?[^,\s-]+/g,
+</code><code id="L3024"><span class="ln">3024</span> cssDot<span class="s"> = </span><i>"position:absolute;left:<span class="d">0</span>;top:<span class="d">0</span>;width:1px;height:1px"</i>,
+</code><code id="L3025"><span class="ln">3025</span> zoom<span class="s"> = </span><span class="d">21600</span>,
+</code><code id="L3026"><span class="ln">3026</span> pathTypes<span class="s"> = </span>{path: <span class="d">1</span>, rect: <span class="d">1</span>},
+</code><code id="L3027"><span class="ln">3027</span> ovalTypes<span class="s"> = </span>{circle: <span class="d">1</span>, ellipse: <span class="d">1</span>},
+</code><code id="L3028"><span class="ln">3028</span> path2vml<span class="s"> = </span><b>function</b> (path) {
+</code><code id="L3029"><span class="ln">3029</span> <b>var</b> total<span class="s"> = </span> /[ahqstv]/ig,
+</code><code id="L3030"><span class="ln">3030</span> command<span class="s"> = </span>pathToAbsolute;
+</code><code id="L3031"><span class="ln">3031</span> Str(path).match(total)<span class="s"> && </span>(command<span class="s"> = </span>path2curve);
+</code><code id="L3032"><span class="ln">3032</span> total<span class="s"> = </span>/[clmz]/g;
+</code><code id="L3033"><span class="ln">3033</span> <b>if</b> (command<span class="s"> == </span>pathToAbsolute<span class="s"> && </span>!Str(path).match(total)) {
+</code><code id="L3034"><span class="ln">3034</span> <b>var</b> res<span class="s"> = </span>Str(path).replace(bites, <b>function</b> (all, command, args) {
+</code><code id="L3035"><span class="ln">3035</span> <b>var</b> vals<span class="s"> = </span>[],
+</code><code id="L3036"><span class="ln">3036</span> isMove<span class="s"> = </span>lowerCase.call(command)<span class="s"> == </span><i>"m"</i>,
+</code><code id="L3037"><span class="ln">3037</span> res<span class="s"> = </span>map[command];
+</code><code id="L3038"><span class="ln">3038</span> args.replace(val, <b>function</b> (value) {
+</code><code id="L3039"><span class="ln">3039</span> <b>if</b> (isMove<span class="s"> && </span>vals.length<span class="s"> == </span><span class="d">2</span>) {
+</code><code id="L3040"><span class="ln">3040</span> res += vals<span class="s"> + </span>map[command<span class="s"> == </span><i>"m"</i> ? <i>"l"</i> : <i>"L"</i>];
+</code><code id="L3041"><span class="ln">3041</span> vals<span class="s"> = </span>[];
+</code><code id="L3042"><span class="ln">3042</span> }
+</code><code id="L3043"><span class="ln">3043</span> vals.push(round(value<span class="s"> * </span>zoom));
+</code><code id="L3044"><span class="ln">3044</span> });
+</code><code id="L3045"><span class="ln">3045</span> <b>return</b> res<span class="s"> + </span>vals;
+</code><code id="L3046"><span class="ln">3046</span> });
+</code><code id="L3047"><span class="ln">3047</span> <b>return</b> res;
+</code><code id="L3048"><span class="ln">3048</span> }
+</code><code id="L3049"><span class="ln">3049</span> <b>var</b> pa<span class="s"> = </span>command(path), p, r;
+</code><code id="L3050"><span class="ln">3050</span> res<span class="s"> = </span>[];
+</code><code id="L3051"><span class="ln">3051</span> <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>pa.length; i < ii; i++) {
+</code><code id="L3052"><span class="ln">3052</span> p<span class="s"> = </span>pa[i];
+</code><code id="L3053"><span class="ln">3053</span> r<span class="s"> = </span>lowerCase.call(pa[i][<span class="d">0</span>]);
+</code><code id="L3054"><span class="ln">3054</span> r<span class="s"> == </span><i>"z"</i><span class="s"> && </span>(r<span class="s"> = </span><i>"x"</i>);
+</code><code id="L3055"><span class="ln">3055</span> <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>p.length; j < jj; j++) {
+</code><code id="L3056"><span class="ln">3056</span> r += round(p[j]<span class="s"> * </span>zoom)<span class="s"> + </span>(j != jj<span class="s"> - </span><span class="d">1</span> ? <i>","</i> : E);
+</code><code id="L3057"><span class="ln">3057</span> }
+</code><code id="L3058"><span class="ln">3058</span> res.push(r);
+</code><code id="L3059"><span class="ln">3059</span> }
+</code><code id="L3060"><span class="ln">3060</span> <b>return</b> res.join(S);
+</code><code id="L3061"><span class="ln">3061</span> },
+</code><code id="L3062"><span class="ln">3062</span> compensation<span class="s"> = </span><b>function</b> (deg, dx, dy) {
+</code><code id="L3063"><span class="ln">3063</span> <b>var</b> m<span class="s"> = </span><b>new</b> Matrix;
+</code><code id="L3064"><span class="ln">3064</span> m.rotate(-deg, <span class="d">.5</span>, <span class="d">.5</span>);
+</code><code id="L3065"><span class="ln">3065</span> <b>return</b> {
+</code><code id="L3066"><span class="ln">3066</span> dx: m.x(dx, dy),
+</code><code id="L3067"><span class="ln">3067</span> dy: m.y(dx, dy)
+</code><code id="L3068"><span class="ln">3068</span> };
+</code><code id="L3069"><span class="ln">3069</span> },
+</code><code id="L3070"><span class="ln">3070</span> setCoords<span class="s"> = </span><b>function</b> (p) {
+</code><code id="L3071"><span class="ln">3071</span> <b>var</b> _<span class="s"> = </span>p._,
+</code><code id="L3072"><span class="ln">3072</span> sx<span class="s"> = </span>_.sx,
+</code><code id="L3073"><span class="ln">3073</span> sy<span class="s"> = </span>_.sy,
+</code><code id="L3074"><span class="ln">3074</span> deg<span class="s"> = </span>_.deg,
+</code><code id="L3075"><span class="ln">3075</span> dx<span class="s"> = </span>_.dx,
+</code><code id="L3076"><span class="ln">3076</span> dy<span class="s"> = </span>_.dy,
+</code><code id="L3077"><span class="ln">3077</span> fillpos<span class="s"> = </span>_.fillpos,
+</code><code id="L3078"><span class="ln">3078</span> o<span class="s"> = </span>p.node,
+</code><code id="L3079"><span class="ln">3079</span> s<span class="s"> = </span>o.style,
+</code><code id="L3080"><span class="ln">3080</span> y<span class="s"> = </span><span class="d">1</span>,
+</code><code id="L3081"><span class="ln">3081</span> m<span class="s"> = </span>p.matrix,
+</code><code id="L3082"><span class="ln">3082</span> flip<span class="s"> = </span><i>""</i>,
+</code><code id="L3083"><span class="ln">3083</span> dxdy,
+</code><code id="L3084"><span class="ln">3084</span> kx<span class="s"> = </span>zoom<span class="s"> / </span>sx,
+</code><code id="L3085"><span class="ln">3085</span> ky<span class="s"> = </span>zoom<span class="s"> / </span>sy;
+</code><code id="L3086"><span class="ln">3086</span> s.visibility<span class="s"> = </span><i>"hidden"</i>;
+</code><code id="L3087"><span class="ln">3087</span> o.coordsize<span class="s"> = </span>abs(kx)<span class="s"> + </span>S<span class="s"> + </span>abs(ky);
+</code><code id="L3088"><span class="ln">3088</span> s.rotation<span class="s"> = </span>deg<span class="s"> * </span>(sx<span class="s"> * </span>sy < <span class="d">0</span> ? -<span class="d">1</span> : <span class="d">1</span>);
+</code><code id="L3089"><span class="ln">3089</span> <b>if</b> (deg) {
+</code><code id="L3090"><span class="ln">3090</span> <b>var</b> c<span class="s"> = </span>compensation(deg, dx, dy);
+</code><code id="L3091"><span class="ln">3091</span> dx<span class="s"> = </span>c.dx;
+</code><code id="L3092"><span class="ln">3092</span> dy<span class="s"> = </span>c.dy;
+</code><code id="L3093"><span class="ln">3093</span> }
+</code><code id="L3094"><span class="ln">3094</span> sx < <span class="d">0</span><span class="s"> && </span>(flip += <i>"x"</i>);
+</code><code id="L3095"><span class="ln">3095</span> sy < <span class="d">0</span><span class="s"> && </span>(flip += <i>" y"</i>)<span class="s"> && </span>(y<span class="s"> = </span>-<span class="d">1</span>);
+</code><code id="L3096"><span class="ln">3096</span> s.flip<span class="s"> = </span>flip;
+</code><code id="L3097"><span class="ln">3097</span> o.coordorigin<span class="s"> = </span>(dx<span class="s"> * </span>-kx)<span class="s"> + </span>S<span class="s"> + </span>(dy<span class="s"> * </span>-ky);
+</code><code id="L3098"><span class="ln">3098</span> <b>if</b> (fillpos<span class="s"> || </span>_.fillsize) {
+</code><code id="L3099"><span class="ln">3099</span> <b>var</b> fill<span class="s"> = </span>o.getElementsByTagName(fillString);
+</code><code id="L3100"><span class="ln">3100</span> fill<span class="s"> = </span>fill<span class="s"> && </span>fill[<span class="d">0</span>];
+</code><code id="L3101"><span class="ln">3101</span> o.removeChild(fill);
+</code><code id="L3102"><span class="ln">3102</span> <b>if</b> (fillpos) {
+</code><code id="L3103"><span class="ln">3103</span> c<span class="s"> = </span>compensation(deg, m.x(fillpos[<span class="d">0</span>], fillpos[<span class="d">1</span>]), m.y(fillpos[<span class="d">0</span>], fillpos[<span class="d">1</span>]));
+</code><code id="L3104"><span class="ln">3104</span> fill.position<span class="s"> = </span>c.dx<span class="s"> * </span>y<span class="s"> + </span>S<span class="s"> + </span>c.dy<span class="s"> * </span>y;
+</code><code id="L3105"><span class="ln">3105</span> }
+</code><code id="L3106"><span class="ln">3106</span> <b>if</b> (_.fillsize) {
+</code><code id="L3107"><span class="ln">3107</span> fill.size<span class="s"> = </span>_.fillsize[<span class="d">0</span>]<span class="s"> * </span>abs(sx)<span class="s"> + </span>S<span class="s"> + </span>_.fillsize[<span class="d">1</span>]<span class="s"> * </span>abs(sy);
+</code><code id="L3108"><span class="ln">3108</span> }
+</code><code id="L3109"><span class="ln">3109</span> o.appendChild(fill);
+</code><code id="L3110"><span class="ln">3110</span> }
+</code><code id="L3111"><span class="ln">3111</span> s.visibility<span class="s"> = </span><i>"visible"</i>;
+</code><code id="L3112"><span class="ln">3112</span> };
+</code><code id="L3113"><span class="ln">3113</span> R.toString<span class="s"> = </span><b>function</b> () {
+</code><code id="L3114"><span class="ln">3114</span> <b>return</b> <i>"Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl "</i><span class="s"> + </span><b>this</b>.version;
+</code><code id="L3115"><span class="ln">3115</span> };
+</code><code id="L3116"><span class="ln">3116</span> addArrow<span class="s"> = </span><b>function</b> (o, value, isEnd) {
+</code><code id="L3117"><span class="ln">3117</span> <b>var</b> values<span class="s"> = </span>Str(value).toLowerCase().split(<i>"-"</i>),
+</code><code id="L3118"><span class="ln">3118</span> se<span class="s"> = </span>isEnd ? <i>"end"</i> : <i>"start"</i>,
+</code><code id="L3119"><span class="ln">3119</span> i<span class="s"> = </span>values.length,
+</code><code id="L3120"><span class="ln">3120</span> type<span class="s"> = </span><i>"classic"</i>,
+</code><code id="L3121"><span class="ln">3121</span> w<span class="s"> = </span><i>"medium"</i>,
+</code><code id="L3122"><span class="ln">3122</span> h<span class="s"> = </span><i>"medium"</i>;
+</code><code id="L3123"><span class="ln">3123</span> <b>while</b> (i--) {
+</code><code id="L3124"><span class="ln">3124</span> <b>switch</b> (values[i]) {
+</code><code id="L3125"><span class="ln">3125</span> <b>case</b> <i>"block"</i>:
+</code><code id="L3126"><span class="ln">3126</span> <b>case</b> <i>"classic"</i>:
+</code><code id="L3127"><span class="ln">3127</span> <b>case</b> <i>"oval"</i>:
+</code><code id="L3128"><span class="ln">3128</span> <b>case</b> <i>"diamond"</i>:
+</code><code id="L3129"><span class="ln">3129</span> <b>case</b> <i>"open"</i>:
+</code><code id="L3130"><span class="ln">3130</span> <b>case</b> <i>"none"</i>:
+</code><code id="L3131"><span class="ln">3131</span> type<span class="s"> = </span>values[i];
+</code><code id="L3132"><span class="ln">3132</span> <b>break</b>;
+</code><code id="L3133"><span class="ln">3133</span> <b>case</b> <i>"wide"</i>:
+</code><code id="L3134"><span class="ln">3134</span> <b>case</b> <i>"narrow"</i>: h<span class="s"> = </span>values[i]; <b>break</b>;
+</code><code id="L3135"><span class="ln">3135</span> <b>case</b> <i>"<b>long</b>"</i>:
+</code><code id="L3136"><span class="ln">3136</span> <b>case</b> <i>"<b>short</b>"</i>: w<span class="s"> = </span>values[i]; <b>break</b>;
+</code><code id="L3137"><span class="ln">3137</span> }
+</code><code id="L3138"><span class="ln">3138</span> }
+</code><code id="L3139"><span class="ln">3139</span> <b>var</b> stroke<span class="s"> = </span>o.node.getElementsByTagName(<i>"stroke"</i>)[<span class="d">0</span>];
+</code><code id="L3140"><span class="ln">3140</span> stroke[se<span class="s"> + </span><i>"arrow"</i>]<span class="s"> = </span>type;
+</code><code id="L3141"><span class="ln">3141</span> stroke[se<span class="s"> + </span><i>"arrowlength"</i>]<span class="s"> = </span>w;
+</code><code id="L3142"><span class="ln">3142</span> stroke[se<span class="s"> + </span><i>"arrowwidth"</i>]<span class="s"> = </span>h;
+</code><code id="L3143"><span class="ln">3143</span> };
+</code><code id="L3144"><span class="ln">3144</span> setFillAndStroke<span class="s"> = </span><b>function</b> (o, params) {
+</code><code id="L3145"><span class="ln">3145</span> o.paper.canvas.style.display<span class="s"> = </span><i>"none"</i>;
+</code><code id="L3146"><span class="ln">3146</span> o.attrs<span class="s"> = </span>o.attrs<span class="s"> || </span>{};
+</code><code id="L3147"><span class="ln">3147</span> <b>var</b> node<span class="s"> = </span>o.node,
+</code><code id="L3148"><span class="ln">3148</span> a<span class="s"> = </span>o.attrs,
+</code><code id="L3149"><span class="ln">3149</span> s<span class="s"> = </span>node.style,
+</code><code id="L3150"><span class="ln">3150</span> xy,
+</code><code id="L3151"><span class="ln">3151</span> newpath<span class="s"> = </span>pathTypes[o.type]<span class="s"> && </span>(params.x != a.x<span class="s"> || </span>params.y != a.y<span class="s"> || </span>params.width != a.width<span class="s"> || </span>params.height != a.height<span class="s"> || </span>params.cx != a.cx<span class="s"> || </span>params.cy != a.cy<span class="s"> || </span>params.rx != a.rx<span class="s"> || </span>params.ry != a.ry<span class="s"> || </span>params.r != a.r),
+</code><code id="L3152"><span class="ln">3152</span> isOval<span class="s"> = </span>ovalTypes[o.type]<span class="s"> && </span>(a.cx != params.cx<span class="s"> || </span>a.cy != params.cy<span class="s"> || </span>a.r != params.r<span class="s"> || </span>a.rx != params.rx<span class="s"> || </span>a.ry != params.ry),
+</code><code id="L3153"><span class="ln">3153</span> res<span class="s"> = </span>o;