Note
This was something I wrote for shits and giggles when I was still familiarizing myself with Python. It was written as a direct translation of kangax's JavaScript code to Python, and no thought was given to redesigning it for the new language. (Even the original naming scheme was retained until I murdered the consistency with updates using the Python naming style) As a result, it has awful performance, hideous source, and should never be used for any sort of production-level work.
HtmlMinify.py
Update: Changed the html parser to LXML. Should work a lot better now.
I needed a quick little python script for minimizing html that I could easily integrate into the build script of a project I was working on. (Never actually used it in said build script or ever again after writing it) Since the only usable thing I could find at the time was kangax's js script, I went to work converting his over to python.
I had to make a few changes to some of the existing regular expressions, due to some funky effects when dealing with unclean html, but it shouldn't affect the end size too much. Let me know if you notice anything off.
All credit goes to him, since the entire script's logic down to the regular expressions are clones of his work.
Singlize.py
Probably broken after the updates.
Usage
singlize.py input_file.html output_file.html
Description
Threw together a script that utilizes htmlminifier, pyquery, cssmin, and a modified version of ClosureCompiler (included) to turn a static page like this:
Original:
<!doctype html>
<html>
<head>
<title>Playing with Code Mirror</title>
<link rel="stylesheet" href="assets/default.css" />
<link rel="stylesheet" href="assets/docs.css" />
<link rel="stylesheet" href="assets/codemirror.css" />
<style type="text/css">
.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
.activeline {background: #f0fcff !important;}
</style>
<script type="text/javascript" language="javascript" src="assets/codemirror.js"></script>
<script type="text/javascript" language="javascript" src="assets/overlay.js"></script>
<script type="text/javascript" language="javascript" src="assets/runmode.js"></script>
<script type="text/javascript" language="javascript" src="assets/javascript.js"></script>
<script type="text/javascript" language="javascript" src="assets/php.js"></script>
<script type="text/javascript" language="javascript" src="assets/xml.js"></script>
<script type="text/javascript" language="javascript" src="assets/python.js"></script>
</head>
<body>
<!-- this is a comment -->
<!-- this is,
as well -->
<form><textarea id="code" name="code">
(function() {
print('hello world');
blink();
})();
</textarea></form>
<script>
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
mode: "text/javascript",
lineNumbers: true,
onCursorActivity: function() {
editor.setLineClass(hlLine, null);
hlLine = editor.setLineClass(editor.getCursor().line, "activeline");
}
});
var hlLine = editor.setLineClass(0, "activeline");
</script>
</body>
</html>
Into Result:
<!DOCTYPE html><html><head><title>Playing with Code Mirror</title><style type="text/css">.cm-s-default span.cm-keyword{color:#708}.cm-s-default span.cm-atom{color:#219}.cm-s-default span.cm-number{color:#164}.cm-s-default span.cm-def{color:#00f}.cm-s-default span.cm-variable{color:black}.cm-s-default span.cm-variable-2{color:#05a}.cm-s-default span.cm-variable-3{color:#0a5}.cm-s-default span.cm-property{color:black}.cm-s-default span.cm-operator{color:black}.cm-s-default span.cm-comment{color:#a50}.cm-s-default span.cm-string{color:#a11}.cm-s-default span.cm-meta{color:#555}.cm-s-default span.cm-error{color:#f00}.cm-s-default span.cm-qualifier{color:#555}.cm-s-default span.cm-builtin{color:#30a}.cm-s-default span.cm-bracket{color:#cc7}.cm-s-default span.cm-tag{color:#170}.cm-s-default span.cm-attribute{color:#00c}html,body,form,textarea#code,form>div.CodeMirror{margin:0;padding:0;width:100%;height:100%}body{font-family:Droid Sans,Arial,sans-serif}pre#logo{background-image:url(data:image/x-png;base64,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)}pre{background-color:#eee;-moz-border-radius:6px;-webkit-border-radius:6px;border-radius:6px;padding:1em}.rel{margin-bottom:0}.rel-note{color:#777;font-size:.9em;margin-top:.1em}.logo-braces{color:#df0019;position:relative;top:-4px}.blk{float:left}.left{width:37em;padding-right:6.53em;padding-bottom:1em}.left1{width:15.24em;padding-right:6.45em}.left2{width:15.24em}.right{width:20.68em}.leftbig{width:42.44em;padding-right:6.53em}.rightsmall{width:15.24em}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.clear{display:inline-block}/* start commented backslash hack \*/* html .clear{height:1%}.clear{display:block}/* close commented backslash hack */.CodeMirror{line-height:1em;font-family:monospace}.CodeMirror-scroll{overflow:auto;height:100%;position:relative}.CodeMirror-gutter{position:absolute;left:0;top:0;background-color:#f7f7f7;border-right:1px solid #eee;min-width:2em;height:100%}.CodeMirror-gutter-text{color:#aaa;text-align:right;padding:.4em .2em .4em .4em}.CodeMirror-lines{padding:.4em}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;-o-border-radius:0;border-radius:0;border-width:0;margin:0;padding:0;background:transparent;font-family:inherit;font-size:inherit;padding:0;margin:0;white-space:pre;word-wrap:normal}.CodeMirror textarea{font-family:inherit!important;font-size:inherit!important}.CodeMirror-cursor{z-index:10;position:absolute;visibility:hidden;border-left:1px solid black!important}.CodeMirror-focused .CodeMirror-cursor{visibility:visible}span.CodeMirror-selected{background:#ccc!important;color:HighlightText!important}.CodeMirror-focused span.CodeMirror-selected{background:Highlight!important}.CodeMirror-matchingbracket{color:#0f0!important}.CodeMirror-nonmatchingbracket{color:#f22!important}.CodeMirror{border-top:1px solid black;border-bottom:1px solid black}.activeline{background:#f0fcff!important}</style></head><body><form><textarea id=code name=code> (function() {
print('hello world');
blink();
})();
</textarea></form>
<script type="text/javascript">var CodeMirror=function(){function o(a,b){var e,f,G,g,c,m,n,t;function h(d){ca=null;var r={line:0,ch:0};A(r,{line:k.length-1,ch:k[k.length-1].text.length},ja(d),r,r);ca=new T}function C(){if(u.readOnly!="nocursor"){if(!fa){if(u.onFocus)u.onFocus(X);fa=!0;ba.className.search(/\bCodeMirror-focused\b/)==-1&&(ba.className+=" CodeMirror-focused");La||bb()}Qa();ob()}}function y(){if(fa){if(u.onBlur)u.onBlur(X);fa=!1;ba.className=ba.className.replace(" CodeMirror-focused","")}clearInterval(cb);setTimeout(function(){fa||
(ka=null)},150)}function A(d,r,z,a,c){if(ca){for(var b=[],p=d.line,q=r.line+1;p<q;++p)b.push(k[p].text);for(ca.addChange(d.line,z.length,b);ca.done.length>u.undoDepth;)ca.done.shift()}oa(d,r,z,a,c)}function ua(d,r){var z=d.pop();if(z){for(var a=[],c=z.start+z.added,b=z.start;b<c;++b)a.push(k[b].text);r.push({start:z.start,added:z.old.length,old:a});b=z.start+z.old.length-1;var a=a[a.length-1],p=z.old[z.old.length-1];if(p)if(a){for(var q=a.length,n=p.length;q>=0&&n>=0;--q,--n)if(a.charAt(q)!=p.charAt(n))break;
a=n+1}else a=p.length;else a=a?a.length:0;b=O({line:b,ch:a});oa({line:z.start,ch:0},{line:c-1,ch:k[c-1].text.length},z.old,b,b);ga=!0}}function N(){ua(ca.done,ca.undone)}function P(){ua(ca.undone,ca.done)}function oa(d,r,a,c,b){for(var da=!1,p=Ma.length,q=d.line;q<=r.line;++q)if(k[q].text.length==p){da=!0;break}var e=r.line-d.line,q=k[d.line],s=k[r.line];if(q==s)if(a.length==1)q.replace(d.ch,r.ch,a[0]);else{var s=q.split(r.ch,a[a.length-1]),f=[d.line+1,e];q.replace(d.ch,q.text.length,a[0]);for(var q=
1,m=a.length-1;q<m;++q)f.push(new i(a[q]));f.push(s);k.splice.apply(k,f)}else if(a.length==1)q.replace(d.ch,q.text.length,a[0]+s.text.slice(r.ch)),k.splice(d.line+1,e);else{f=[d.line+1,e-1];q.replace(d.ch,q.text.length,a[0]);s.replace(0,r.ch,a[a.length-1]);q=1;for(m=a.length-1;q<m;++q)f.push(new i(a[q]));k.splice.apply(k,f)}q=d.line;for(m=q+a.length;q<m;++q)if(s=k[q].text,s.length>p)Ma=s,p=s.length,Da=null,da=!1;if(da){p=0;Ma="";Da=null;q=0;for(m=k.length;q<m;++q)if(s=k[q].text,s.length>p)p=s.length,
Ma=s}da=[];e=a.length-e-1;q=0;for(s=la.length;q<s;++q)p=la[q],p<d.line?da.push(p):p>r.line&&da.push(p+e);if(a.length<5){s=d.line;q=d.line+a.length;for(p=Ra(s);s<q;++s)f=k[s],f.highlight(R,p),f.stateAfter=D(R,p);da.push(d.line+a.length)}else da.push(d.line);la=da;db(100);Y.push({from:d.line,to:r.line+1,diff:e});eb={from:d,to:r,text:a};Ea(c,b,t.line<=Math.min(r.line,r.line+e)?t.line:t.line+e,n.line<=Math.min(r.line,r.line+e)?n.line:n.line+e);ha.style.height=k.length*ia()+2*U.offsetTop+"px"}function va(d,
r,a){function c(Ca){if(E(Ca,r))return Ca;if(!E(a,Ca))return b;var p=Ca.line+d.length-(a.line-r.line)-1,q=Ca.ch;Ca.line==a.line&&(q+=d[d.length-1].length-(a.ch-(a.line==r.line?r.ch:0)));return{line:p,ch:q}}var r=O(r),a=a?O(a):r,d=ja(d),b;pa(d,r,a,function(d){b=d;return{from:c(t),to:c(n)}});return b}function Sa(d,r){pa(ja(d),t,n,function(d){return r=="end"?{from:d,to:d}:r=="start"?{from:t,to:t}:{from:t,to:d}})}function pa(d,r,a,c){c=c({line:r.line+d.length-1,ch:d.length==1?d[0].length+r.ch:d[d.length-
1].length});A(r,a,d,c.from,c.to)}function pb(d,a){var z=d.line,c=a.line;if(z==c)return k[z].text.slice(d.ch,a.ch);var b=[k[z].text.slice(d.ch)];for(z+=1;z<c;++z)b.push(k[z].text);b.push(k[c].text.slice(0,a.ch));return b.join("\n")}function qb(){return pb(t,n)}function Qa(){fb||gb.set(2E3,function(){hb();rb();fa&&Qa();ib()})}function Fa(d){function a(){hb();var c=rb();c=="moved"&&d&&(qa[d]=!0);!c&&!z?(z=!0,gb.set(80,a)):(fb=!1,Qa());ib()}var z=!1;fb=!0;gb.set(20,a)}function rb(){function d(d,a){for(var r=
0;;){var c=z.indexOf("\n",r);if(c==-1||(z.charAt(c-1)=="\r"?c-1:c)>=d)return{line:a,ch:d-r};++a;r=c+1}}if(!La&&fa){var a=!1,z=M.value,b=ma(M);if(!b)return!1;var a=e!=z,w=wa,da=a||b.start!=f||b.end!=(w?f:G);if(!da&&!w)return!1;if(a&&(ka=wa=null,u.readOnly))return ga=!0,"changed";var p=d(b.start,g),q=d(b.end,g);if(w){var k=b.start==w.anchor?q:p,q=ka?n:b.start==w.anchor?p:q;(m=E(k,q))?p=k:(wa=null,p=q,q=k)}p.line==q.line&&p.line==t.line&&p.line==n.line&&!ka&&(ga=!1);if(a){for(var k=0,w=z.length,s=Math.min(w,
e.length),j,l=g,h=-1;k<s&&(j=z.charAt(k))==e.charAt(k);)++k,j=="\n"&&(l++,h=k);for(var s=h>-1?k-h:k,i=c-1,B=e.length;;){j=e.charAt(B);if(z.charAt(w)!=j){++w;++B;break}j=="\n"&&i--;if(B<=k||w<=k)break;--w;--B}h=e.lastIndexOf("\n",B-1);A({line:l,ch:s},{line:i,ch:h==-1?B:B-h-1},ja(z.slice(k,w)),p,q);if(l!=i||p.line!=l)ga=!0}else Ea(p,q);e=z;f=b.start;G=b.end;return a?"changed":da?"moved":!1}}function bb(){for(var d=[],a=Math.max(0,t.line-1),z=Math.min(k.length,n.line+2),b=a;b<z;++b)d.push(k[b].text);
for(var d=M.value=d.join(xa),w=t.ch,m=n.ch,b=a;b<t.line;++b)w+=xa.length+k[b].text.length;for(b=a;b<n.line;++b)m+=xa.length+k[b].text.length;e=d;g=a;c=z;f=w;G=m;ya(M,w,wa?w:m)}function Ta(){u.readOnly!="nocursor"&&M.focus()}function sb(){var d=jb(m?t:n);return tb(d.x,d.y,d.x,d.yBot)}function tb(d,a,c,b){var w=U.offsetLeft,n=U.offsetTop,p=ia();a+=n;b+=n;d+=w;c+=w;var q=H.clientHeight,e=H.scrollTop,w=!1,n=!0;if(a<e)H.scrollTop=Math.max(0,a-2*p),w=!0;else if(b>e+q)H.scrollTop=b+p-q,w=!0;a=H.clientWidth;
b=H.scrollLeft;if(d<b)d<50&&(d=0),H.scrollLeft=Math.max(0,d-10),w=!0;else if(c>a+b)H.scrollLeft=c+10-a,w=!0,c>ha.clientWidth&&(n=!1);if(w&&u.onScroll)u.onScroll(X);return n}function ub(){var d=ia(),a=H.scrollTop-U.offsetTop;return{from:Math.min(k.length,Math.max(0,Math.floor(a/d))),to:Math.min(k.length,Math.ceil((a+H.clientHeight)/d))}}function Ua(d){if(H.clientWidth){for(var a=d===!0?[]:[{from:S,to:ra,domStart:0}],c=0,b=d.length||0;c<b;++c){for(var w=d[c],e=[],p=w.diff||0,q=0,m=a.length;q<m;++q){var s=
a[q];w.to<=s.from?e.push({from:s.from+p,to:s.to+p,domStart:s.domStart}):s.to<=w.from?e.push(s):(w.from>s.from&&e.push({from:s.from,to:w.from,domStart:s.domStart}),w.to<s.to&&e.push({from:w.to+p,to:s.to+p,domStart:s.domStart+(w.to-s.from)}))}a=e}for(var p=ub(),d=Math.min(S,Math.max(p.from-3,0)),w=Math.min(k.length,Math.max(ra,p.to+3)),e=[],q=0,m=ra-S,f=d,G=0,c=0,b=a.length;c<b;++c)if(s=a[c],!(s.to<=d)){if(s.from>=w)break;if(s.domStart>q||s.from>f)e.push({from:f,to:s.from,domSize:s.domStart-q,domStart:q}),
G+=s.from-f;f=s.to;q=s.domStart+(s.to-s.from)}if(q!=m||f!=w)G+=Math.abs(w-f),e.push({from:f,to:w,domSize:m-q,domStart:q});if(e.length){V.style.display="none";if(G>(p.to-p.from)*0.3){s=d=Math.max(p.from-10,0);a=w=Math.min(p.to+7,k.length);c=[];b={line:s,ch:0};for(b=E(t,b)&&!E(n,b);s<a;++s){q=p=null;if(b){if(p=0,n.line==s)b=!1,q=n.ch}else if(t.line==s)n.line==s?(p=t.ch,q=n.ch):(b=!0,p=t.ch);c.push(k[s].getHTML(p,q,!0))}V.innerHTML=c.join("")}else{a=t.line;c=n.line;b=0;s=j&&za.createElement("div");p=
0;for(q=e.length;p<q;++p){m=e[p];f=m.to-m.from-m.domSize;G=V.childNodes[m.domStart+m.domSize+b]||null;if(j)for(var g=Math.max(-f,m.domSize);g>0;--g)V.removeChild(G?G.previousSibling:V.lastChild);else if(f){for(g=Math.max(0,f);g>0;--g)V.insertBefore(za.createElement("pre"),G);for(g=Math.max(0,-f);g>0;--g)V.removeChild(G?G.previousSibling:V.lastChild)}for(var l=V.childNodes[m.domStart+b],B=a<m.from&&c>=m.from,g=m.from;g<m.to;++g){var h=null,i=null;if(B){if(h=0,c==g)B=!1,i=n.ch}else if(a==g)c==g?(h=
t.ch,i=n.ch):(B=!0,h=t.ch);j?(s.innerHTML=k[g].getHTML(h,i,!0),V.insertBefore(s.firstChild,G)):(l.innerHTML=k[g].getHTML(h,i,!1),l.className=k[g].className||"",l=l.nextSibling)}b+=f}}V.style.display="";a=d!=S||w!=ra||vb!=H.clientHeight;S=d;ra=w;Va.style.top=d*ia()+"px";if(a)vb=H.clientHeight,ha.style.height=k.length*ia()+2*U.offsetTop+"px",Wa();Da==null&&(Da=wb(Ma));Da>H.clientWidth?(U.style.width=Da+"px",ha.style.width="",ha.style.width=H.scrollWidth+"px"):U.style.width=ha.style.width="";if(V.childNodes.length!=
ra-S)throw Error("BAD PATCH! "+JSON.stringify(e)+" size="+(ra-S)+" nodes="+V.childNodes.length);xb()}}else S=ra=0}function Wa(){if(u.gutter||u.lineNumbers){var d=Va.offsetHeight,a=H.clientHeight;sa.style.height=(d-a<2?a:d)+"px";d=[];for(a=S;a<Math.max(ra,S+1);++a){var c=k[a].gutterMarker,b=u.lineNumbers?a+u.firstLineNumber:null;c&&c.text?b=c.text.replace("%N%",b!=null?b:""):b==null&&(b="\u00a0");d.push(c&&c.style?'<pre class="'+c.style+'">':"<pre>",b,"</pre>")}sa.style.display="none";Xa.innerHTML=
d.join("");d=String(k.length).length;a=Xa.firstChild;c=a.textContent||a.innerText||a.nodeValue||"";for(b="";c.length+b.length<d;)b+="\u00a0";b&&a.insertBefore(za.createTextNode(b),a.firstChild);sa.style.display="";U.style.marginLeft=sa.offsetWidth+"px"}}function xb(){var d=m?t:n,a=ia(),b=yb(d.line,d.ch)+"px",c=(d.line-S)*a+"px";Ya.style.top=d.line*a-H.scrollTop+"px";v(t,n)?(Aa.style.top=c,Aa.style.left=b,Aa.style.display=""):Aa.style.display="none"}function Ga(d,a){var b=ka&&O(ka);b&&(E(b,d)?d=b:
E(a,b)&&(a=b));Ea(d,a)}function Ea(d,a,b,c){if(!v(t,d)||!v(n,a)){if(E(a,d))var w=a,a=d,d=w;v(d,a)?m=!1:v(d,n)?m=!1:v(a,t)&&(m=!0);if(b==null)b=t.line,c=n.line;v(d,a)?v(t,n)||Y.push({from:b,to:c+1}):v(t,n)?Y.push({from:d.line,to:a.line+1}):(v(d,t)||(d.line<b?Y.push({from:d.line,to:Math.min(a.line,b)+1}):Y.push({from:b,to:Math.min(c,d.line)+1})),v(a,n)||(a.line<c?Y.push({from:Math.max(b,d.line),to:c+1}):Y.push({from:Math.max(d.line,c),to:a.line+1})));t=d;n=a;ta=!0}}function Ha(d,a,b){d=O({line:d,ch:a||
0});(b?Ga:Ea)(d,d)}function Ba(d){return Math.max(0,Math.min(d,k.length-1))}function O(d){if(d.line<0)return{line:0,ch:0};if(d.line>=k.length)return{line:k.length-1,ch:k[k.length-1].text.length};var a=d.ch,b=k[d.line].text.length;return a==null||a>b?{line:d.line,ch:b}:a<0?{line:d.line,ch:0}:d}function Jb(d){Ga({line:d,ch:0},{line:d,ch:k[d].text.length})}function Kb(d){function a(d){if(v(t,n))return Ia(t.line,d);for(var b=n.line-(n.ch?0:1),c=t.line;c<=b;++c)Ia(c,d)}ka=null;switch(u.tabMode){case "default":return!1;
case "indent":a("smart");break;case "classic":if(v(t,n)){d?Ia(t.line,"smart"):Sa("\t","end");break}case "shift":a(d?"subtract":"add")}return!0}function Ia(d,a){if(a=="smart")if(R.indent)var b=Ra(d);else a="prev";var c=k[d],w=c.indentation(),e=c.text.match(/^\s*/)[0],p;a=="prev"?p=d?k[d-1].indentation():0:a=="smart"?p=R.indent(b,c.text.slice(e.length)):a=="add"?p=w+u.indentUnit:a=="subtract"&&(p=w-u.indentUnit);p=Math.max(0,p);if(p-w){w="";b=0;if(u.indentWithTabs)for(c=Math.floor(p/Ja);c;--c)b+=Ja,
w+="\t";for(;b<p;)++b,w+=" "}else{if(t.line!=d&&n.line!=d)return;w=e}va(w,{line:d,ch:0},{line:d,ch:e.length})}function zb(){R=o.getMode(u,u.mode);for(var d=0,a=k.length;d<a;++d)k[d].stateAfter=null;la=[0];db()}function kb(d,a,b){function c(d,a,b,r){d=k[d];a=d.addMark(a,b,r);a.line=d;e.push(a)}var d=O(d),a=O(a),e=[];if(d.line==a.line)c(d.line,d.ch,a.ch,b);else{c(d.line,d.ch,null,b);for(var m=d.line+1,p=a.line;m<p;++m)c(m,0,null,b);c(a.line,0,a.ch,b)}Y.push({from:d.line,to:a.line+1});return function(){for(var d,
a,b=0;b<e.length;++b){var c=e[b],r=I(k,c.line);c.line.removeMark(c);r>-1&&(d==null&&(d=r),a=r)}d!=null&&Y.push({from:d,to:a+1})}}function wb(d){na.innerHTML="<pre><span>x</span></pre>";na.firstChild.firstChild.firstChild.nodeValue=d;return na.firstChild.firstChild.offsetWidth||10}function yb(d,a){if(a==0)return 0;na.innerHTML="<pre><span>"+k[d].getHTML(null,null,!1,a)+"</span></pre>";return na.firstChild.firstChild.offsetWidth}function Ab(d,a){function b(d){na.innerHTML="<pre><span>"+c.getHTML(null,
null,!1,d)+"</span></pre>";return na.firstChild.firstChild.offsetWidth}if(a<=0)return 0;for(var c=k[d],e=0,m=0,p=c.text.length,n,f=Math.min(p,Math.ceil(a/wb("x")));;){var s=b(f);if(s<=a&&f<p)f=Math.min(p,Math.ceil(f*1.2));else{n=s;p=f;break}}if(a>n)return p;f=Math.floor(p*0.8);s=b(f);s<a&&(e=f,m=s);for(;;){if(p-e<=1)return n-a>a-m?e:p;f=Math.ceil((e+p)/2);s=b(f);s>a?(p=f,n=s):(e=f,m=s)}}function jb(d,a){var b=ia(),c=d.line-(a?S:0);return{x:yb(d.line,d.ch),y:c*b,yBot:(c+1)*b}}function Bb(d){var d=
jb(d,!0),a=L(U);return{x:a.left+d.x,y:a.top+d.y,yBot:a.top+d.yBot}}function ia(){var d=V.childNodes.length;if(d)return V.offsetHeight/d||1;na.innerHTML="<pre>x</pre>";return na.firstChild.offsetHeight||1}function Ka(d,a){var b=L(H,!0),c,e;try{c=d.clientX,e=d.clientY}catch(f){return null}if(!a&&(c-b.left>H.clientWidth||e-b.top>H.clientHeight))return null;b=L(U,!0);e=S+Math.floor((e-b.top)/ia());return O({line:e,ch:Ab(Ba(e),c-b.left)})}function Cb(d){function a(){var d=ja(M.value).join("\n");d!=e&&
J(Sa)(d,"end");Ya.style.position="relative";M.style.cssText=c;La=!1;bb();Qa()}var b=Ka(d);if(b&&!window.opera){(v(t,n)||E(b,t)||!E(b,n))&&J(Ha)(b.line,b.ch);var c=M.style.cssText;Ya.style.position="absolute";M.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(l(d)-1)+"px; left: "+(W(d)-1)+"px; z-index: 1000; background: white; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";La=!0;var e=M.value=qb();Ta();ya(M,0,M.value.length);if(B){ea(d);
var f=K(window,"mouseup",function(){f();setTimeout(a,20)},!0)}else setTimeout(a,50)}}function ob(){clearInterval(cb);var d=!0;Aa.style.visibility="";cb=setInterval(function(){Aa.style.visibility=(d=!d)?"":"hidden"},650)}function Db(d){function a(d,b,c){if(d.text)for(var r=d.styles,d=p?0:d.text.length-1,e,f=p?0:r.length-2,m=p?r.length:-2;f!=m;f+=2*q){var n=r[f];if(r[f+1]!=null&&r[f+1]!=j)d+=q*n.length;else for(var z=p?0:n.length-1,k=p?n.length:-1;z!=k;z+=q,d+=q)if(d>=b&&d<c&&h.test(e=n.charAt(z))){var s=
lb[e];if(s.charAt(1)==">"==p)l.push(e);else if(l.pop()!=s.charAt(0))return{pos:d,match:!1};else if(!l.length)return{pos:d,match:!0}}}}var b=m?t:n,c=k[b.line],e=b.ch-1,f=e>=0&&lb[c.text.charAt(e)]||lb[c.text.charAt(++e)];if(f){f.charAt(0);for(var p=f.charAt(1)==">",q=p?1:-1,G=c.styles,s=e+1,f=0,g=G.length;f<g;f+=2)if((s-=G[f].length)<=0){var j=G[f+1];break}for(var l=[c.text.charAt(e)],h=/[(){}[\]]/,f=b.line,g=p?Math.min(f+100,k.length):Math.max(-1,f-100);f!=g;f+=q){var c=k[f],B=f==b.line;if(B=a(c,
B&&p?e+1:0,B&&!p?e:c.text.length))break}B||(B={pos:null,match:!1});var j=B.match?"CodeMirror-matchingbracket":"CodeMirror-nonmatchingbracket",i=kb({line:b.line,ch:e},{line:b.line,ch:e+1},j),u=B.pos!=null?kb({line:f,ch:B.pos},{line:f,ch:B.pos+1},j):function(){},b=J(function(){i();u()});d?setTimeout(b,800):Za=b}}function Eb(d){var a,b,c=d;for(d-=40;c>d;--c){if(c==0)return 0;var e=k[c-1];if(e.stateAfter)return c;e=e.indentation();if(b==null||a>e)b=c,a=e}return b}function Ra(d){for(var a=Eb(d),b=a&&k[a-
1].stateAfter,b=b?D(R,b):x(R);a<d;++a){var c=k[a];c.highlight(R,b);c.stateAfter=D(R,b)}d<k.length&&!k[d].stateAfter&&la.push(d);return b}function Lb(){for(var d=+new Date+u.workTime,a=la.length;la.length;){var b=k[S].stateAfter?la.pop():S;if(!(b>=k.length)){for(var c=Eb(b),e=c&&k[c-1].stateAfter,e=e?D(R,e):x(R),f=0,m=R.compareStates,n=k.length;c<n;++c){var t=k[c],s=t.stateAfter;if(+new Date>d){la.push(c);db(u.workDelay);Y.push({from:b,to:c+1});return}var G=t.highlight(R,e);t.stateAfter=D(R,e);if(m){if(s&&
m(s,e))break}else if(G||!s)f=0;else if(++f>3)break}Y.push({from:b,to:c+1})}}if(a&&u.onHighlightComplete)u.onHighlightComplete(X)}function db(d){la.length&&Mb.set(d,J(Lb))}function hb(){ga=null;Y=[];eb=ta=!1}function ib(){var d=!1;ta&&(d=!sb());Y.length?Ua(Y):ta&&xb();d&&sb();ta&&ob();fa&&!La&&(ga===!0||ga!==!1&&ta)&&bb();ta&&u.matchBrackets&&setTimeout(J(function(){Za&&(Za(),Za=null);Db(!1)}),20);d=eb;if(ta&&u.onCursorActivity)u.onCursorActivity(X);if(d&&u.onChange&&X)u.onChange(X,d)}function J(d){return function(){Fb++||
hb();try{var a=d.apply(this,arguments)}finally{--Fb||ib()}return a}}function Gb(d,a,b){this.atOccurrence=!1;b==null&&(b=typeof d=="string"&&d==d.toLowerCase());a=a&&typeof a=="object"?O(a):{line:0,ch:0};this.pos={from:a,to:a};if(typeof d!="string")this.matches=function(a,b){if(a)for(var c=k[b.line].text.slice(0,b.ch),e=c.match(d),f=0;e;){var r=c.indexOf(e[0]);f+=r;c=c.slice(r+1);if(r=c.match(d))e=r;else break;f++}else c=k[b.line].text.slice(b.ch),f=(e=c.match(d))&&b.ch+c.indexOf(e[0]);if(e)return{from:{line:b.line,
ch:f},to:{line:b.line,ch:f+e[0].length},match:e}};else{b&&(d=d.toLowerCase());var c=b?function(a){return a.toLowerCase()}:function(a){return a},e=d.split("\n");this.matches=e.length==1?function(a,b){var e=c(k[b.line].text),f=d.length,r;if(a?b.ch>=f&&(r=e.lastIndexOf(d,b.ch-f))!=-1:(r=e.indexOf(d,b.ch))!=-1)return{from:{line:b.line,ch:r},to:{line:b.line,ch:r+f}}}:function(a,d){var b=d.line,f=a?e.length-1:0,r=e[f],m=c(k[b].text),n=a?m.indexOf(r)+r.length:m.lastIndexOf(r);if(!(a?n>=d.ch||n!=r.length:
n<=d.ch||n!=m.length-r.length))for(;;){if(a?!b:b==k.length-1)break;m=c(k[b+=a?-1:1].text);r=e[a?--f:++f];if(f>0&&f<e.length-1)if(m!=r)break;else continue;f=a?m.lastIndexOf(r):m.indexOf(r)+r.length;if(a?f!=m.length-r.length:f!=r.length)break;r={line:d.line,ch:n};b={line:b,ch:f};return{from:a?b:r,to:a?r:b}}}}}var u={},mb=o.defaults,Na;for(Na in mb)mb.hasOwnProperty(Na)&&(u[Na]=(b&&b.hasOwnProperty(Na)?b:mb)[Na]);var za=u.document,ba=za.createElement("div");ba.className="CodeMirror";ba.innerHTML='<div style="overflow: hidden; position: relative; width: 1px; height: 0px;"><textarea style="position: absolute; width: 2px;" wrap="off"></textarea></div><div class="CodeMirror-scroll cm-s-'+
u.theme+'"><div style="position: relative"><div style="position: absolute; height: 0; width: 0; overflow: hidden;"></div><div style="position: relative"><div class="CodeMirror-gutter"><div class="CodeMirror-gutter-text"></div></div><div class="CodeMirror-lines"><div style="position: relative"><pre class="CodeMirror-cursor"> </pre><div></div></div></div></div></div></div>';a.appendChild?a.appendChild(ba):a(ba);var Ya=ba.firstChild,M=Ya.firstChild,H=ba.lastChild,ha=H.firstChild,na=ha.firstChild,
Va=na.nextSibling,sa=Va.firstChild,Xa=sa.firstChild,U=sa.nextSibling.firstChild,Aa=U.firstChild,V=Aa.nextSibling;if(u.tabindex!=null)M.tabindex=u.tabindex;if(!u.gutter&&!u.lineNumbers)sa.style.display="none";var gb=new $,Mb=new $,cb,R,k=[new i("")],la,ca=new T,fa;zb();t={line:0,ch:0};n={line:0,ch:0};m=!1;var ka,wa,nb,ga,Y,eb,ta,La,S=0,ra=0,vb=0,$a=null,Za,Ma="",Da;J(function(){h(u.value||"");ga=!1})();K(H,"mousedown",J(function(a){function b(a){var d=Ka(a,!0);if(d&&!v(d,m)){fa||C();m=d;Ga(f,d);ga=
!1;var c=ub();if(d.line>=c.to||d.line<c.from)n=setTimeout(J(function(){b(a)}),150)}}for(var c=a.target||a.srcElement;c!=ba;c=c.parentNode)if(c.parentNode==ha&&c!=Va)return;var e=nb;nb=null;for(c=a.target||a.srcElement;c!=ba;c=c.parentNode)if(c.parentNode==Xa){if(u.onGutterClick)u.onGutterClick(X,I(Xa.childNodes,c)+S);return F(a)}var f=Ka(a);switch(aa(a)){case 3:B&&!Oa&&Cb(a);return;case 2:f&&Ha(f.line,f.ch,!0);return}if(f){fa||C();F(a);if(e&&+new Date-e<400)return Jb(f.line);Ha(f.line,f.ch,!0);var m=
f,n,t=K(za,"mousemove",J(function(a){clearTimeout(n);F(a);b(a)}),!0),k=K(za,"mouseup",J(function(a){clearTimeout(n);var d=Ka(a);d&&Ga(f,d);F(a);Ta();ga=!0;t();k()}),!0)}else(a.target||a.srcElement)==H&&F(a)}));B||K(H,"contextmenu",Cb);K(ha,"dblclick",J(function(a){var b=Ka(a);if(b){for(var c=k[b.line].text,e=b.ch,f=b.ch;e>0&&/\w/.test(c.charAt(e-1));)--e;for(;f<c.length&&/\w/.test(c.charAt(f));)++f;Ga({line:b.line,ch:e},{line:b.line,ch:f});F(a);nb=+new Date}}));K(H,"scroll",function(){Ua([]);if(u.onScroll)u.onScroll(X)});
K(window,"resize",function(){Ua(!0)});K(M,"keyup",J(function(a){if(!u.onKeyEvent||!u.onKeyEvent(X,Q(a)))wa&&(wa=null,ga=!0),a.keyCode==16&&(ka=null)}));K(M,"keydown",J(function(a){fa||C();var b=a.keyCode;if(Pa&&b==27)a.returnValue=!1;var c=(Oa?a.metaKey:a.ctrlKey)&&!a.altKey,e=a.ctrlKey||a.altKey||a.metaKey;ka=b==16||a.shiftKey?ka||(m?n:t):null;if(!u.onKeyEvent||!u.onKeyEvent(X,Q(a))){if(b==33||b==34)return b=b==34,c=Math.floor(H.clientHeight/ia()),e=m?t:n,Ha(e.line+Math.max(c-1,1)*(b?1:-1),e.ch,
!0),F(a);if(c&&(b==36||b==35||Oa&&(b==38||b==40)))return b=b==36||b==38?{line:0,ch:0}:{line:k.length-1,ch:k[k.length-1].text.length},Ga(b,b),F(a);if(c&&b==65)return b=k.length-1,Ea({line:0,ch:0},{line:b,ch:k[b].text.length}),F(a);if(!u.readOnly){if(!e&&b==13)return;if(!e&&b==9&&Kb(a.shiftKey))return F(a);if(c&&b==90)return N(),F(a);if(c&&(a.shiftKey&&b==90||b==89))return P(),F(a)}$a=(c?"c":"")+b;if(m&&qa.hasOwnProperty($a)&&(a=ma(M)))wa={anchor:a.start},ya(M,a.start,a.start);Fa($a)}}));K(M,"keypress",
J(function(a){if(!u.onKeyEvent||!u.onKeyEvent(X,Q(a))){if(u.electricChars&&R.electricChars){var b=String.fromCharCode(a.charCode==null?a.keyCode:a.charCode);R.electricChars.indexOf(b)>-1&&setTimeout(J(function(){Ia(n.line,"smart")}),50)}b=a.keyCode;b==13?(u.readOnly||(Sa("\n","end"),u.enterMode!="flat"&&Ia(t.line,u.enterMode=="keep"?"prev":"smart")),F(a)):!a.ctrlKey&&!a.altKey&&!a.metaKey&&b==9&&u.tabMode!="default"?F(a):Fa($a)}}));K(M,"focus",C);K(M,"blur",y);K(H,"dragenter",ea);K(H,"dragover",ea);
K(H,"drop",J(function(a){a.preventDefault();var b=Ka(a,!0),c=a.dataTransfer.files;if(b&&!u.readOnly)if(c&&c.length&&window.FileReader&&window.File)for(var a=function(a,d){var c=new FileReader;c.onload=function(){f[d]=c.result;++m==e&&va(f.join(""),O(b),O(b))};c.readAsText(a)},e=c.length,f=Array(e),m=0,n=0;n<e;++n)a(c[n],n);else try{(f=a.dataTransfer.getData("Text"))&&va(f,b,b)}catch(t){}}));K(H,"paste",function(){Ta();Fa()});K(M,"paste",function(){Fa()});K(M,"cut",function(){Fa()});var Hb;try{Hb=
za.activeElement==M}catch(Nb){}Hb?setTimeout(C,20):y();var X={getValue:function(){for(var a=[],b=0,c=k.length;b<c;++b)a.push(k[b].text);return a.join("\n")},setValue:J(h),getSelection:qb,replaceSelection:J(Sa),focus:function(){Ta();C();Fa()},setOption:function(a,b){u[a]=b;if(a=="lineNumbers"||a=="gutter"){var c=u.gutter||u.lineNumbers;sa.style.display=c?"":"none";c?Wa():V.parentNode.style.marginLeft=0}else if(a=="mode"||a=="indentUnit")zb();else if(a=="readOnly"&&b=="nocursor")M.blur();else if(a==
"theme")H.className=H.className.replace(/cm-s-\w+/,"cm-s-"+b)},getOption:function(a){return u[a]},undo:J(N),redo:J(P),indentLine:J(function(a){a>=0&&a<k.length&&Ia(a,"smart")}),historySize:function(){return{undo:ca.done.length,redo:ca.undone.length}},matchBrackets:J(function(){Db(!0)}),getTokenAt:function(a){a=O(a);return k[a.line].getTokenAt(R,Ra(a.line),a.ch)},getStateAfter:function(a){a=Ba(a==null?k.length-1:a);return Ra(a+1)},cursorCoords:function(a){a==null&&(a=m);return Bb(a?t:n)},charCoords:function(a){return Bb(O(a))},
coordsChar:function(a){var b=L(U),c=Ba(Math.min(k.length-1,S+Math.floor((a.y-b.top)/ia())));return O({line:c,ch:Ab(Ba(c),a.x-b.left)})},getSearchCursor:function(a,b,c){return new Gb(a,b,c)},markText:J(function(a,b,c){return J(kb(a,b,c))}),setMarker:function(a,b,c){typeof a=="number"&&(a=k[Ba(a)]);a.gutterMarker={text:b,style:c};Wa();return a},clearMarker:function(a){typeof a=="number"&&(a=k[Ba(a)]);a.gutterMarker=null;Wa()},setLineClass:J(function(a,b){if(typeof a=="number")var c=a,a=k[Ba(a)];else if(c=
I(k,a),c==-1)return null;if(a.className!=b)a.className=b,Y.push({from:c,to:c+1});return a}),lineInfo:function(a){if(typeof a=="number"){var b=a,a=k[a];if(!a)return null}else if(b=I(k,a),b==-1)return null;var c=a.gutterMarker;return{line:b,text:a.text,markerText:c&&c.text,markerClass:c&&c.style}},addWidget:function(a,b,c,e){var a=jb(O(a)),f=a.yBot,m=a.x;b.style.position="absolute";ha.appendChild(b);b.style.left=m+"px";if(e=="over")f=a.y;else if(e=="near"){var e=Math.max(H.offsetHeight,k.length*ia()),
n=Math.max(ha.clientWidth,U.clientWidth)-U.offsetLeft;a.yBot+b.offsetHeight>e&&a.y>b.offsetHeight&&(f=a.y-b.offsetHeight);m+b.offsetWidth>n&&(m=n-b.offsetWidth)}b.style.top=f+U.offsetTop+"px";b.style.left=m+U.offsetLeft+"px";c&&tb(m,f,m+b.offsetWidth,f+b.offsetHeight)},lineCount:function(){return k.length},getCursor:function(a){a==null&&(a=m);return{line:(a?t:n).line,ch:(a?t:n).ch}},somethingSelected:function(){return!v(t,n)},setCursor:J(function(a,b){b==null&&typeof a.line=="number"?Ha(a.line,a.ch):
Ha(a,b)}),setSelection:J(function(a,b){Ea(O(a),O(b||a))}),getLine:function(a){if(a>=0&&a<k.length)return k[a].text},setLine:J(function(a,b){a>=0&&a<k.length&&va(b,{line:a,ch:0},{line:a,ch:k[a].text.length})}),removeLine:J(function(a){a>=0&&a<k.length&&va("",{line:a,ch:0},O({line:a+1,ch:0}))}),replaceRange:J(va),getRange:function(a,b){return pb(O(a),O(b))},operation:function(a){return J(a)()},refresh:function(){Ua(!0)},getInputField:function(){return M},getWrapperElement:function(){return ba},getScrollerElement:function(){return H}},
fb=!1,lb={"(":")>",")":"(<","[":"]>","]":"[<","{":"}>","}":"{<"},Fb=0;Gb.prototype={findNext:function(){return this.find(!1)},findPrevious:function(){return this.find(!0)},find:function(a){function b(a){a={line:a,ch:0};c.pos={from:a,to:a};return c.atOccurrence=!1}for(var c=this,e=O(a?this.pos.from:this.pos.to);;){if(this.pos=this.matches(a,e))return this.atOccurrence=!0,this.pos.match||!0;if(a){if(!e.line)return b(0);e={line:e.line-1,ch:k[e.line-1].text.length}}else{if(e.line==k.length-1)return b(k.length);
e={line:e.line+1,ch:0}}}},from:function(){if(this.atOccurrence)return{line:this.pos.from.line,ch:this.pos.from.ch}},to:function(){if(this.atOccurrence)return{line:this.pos.to.line,ch:this.pos.to.ch}},replace:function(a){var b=this;this.atOccurrence&&J(function(){b.pos.to=va(a,b.pos.from,b.pos.to)})()}};for(var ab in Z)Z.propertyIsEnumerable(ab)&&!X.propertyIsEnumerable(ab)&&(X[ab]=Z[ab]);return X}function D(a,b){if(b===!0)return b;if(a.copyState)return a.copyState(b);var e={},f;for(f in b){var G=
b[f];G instanceof Array&&(G=G.concat([]));e[f]=G}return e}function x(a,b,e){return a.startState?a.startState(b,e):!0}function h(a){this.pos=this.start=0;this.string=a}function i(a,b){this.styles=b||[a,null];this.stateAfter=null;this.text=a;this.marked=this.gutterMarker=this.className=null}function N(a,b,e,f){for(var G=0,g=0,c=0;g<b;G+=2){var m=e[G],n=g+m.length;c==0?(n>a&&f.push(m.slice(a-g,Math.min(m.length,b-g)),e[G+1]),n>=a&&(c=1)):c==1&&(n>b?f.push(m.slice(0,b-g),e[G+1]):f.push(m,e[G+1]));g=n}}
function T(){this.time=0;this.done=[];this.undone=[]}function y(){ea(this)}function Q(a){if(!a.stop)a.stop=y;return a}function F(a){a.preventDefault?a.preventDefault():a.returnValue=!1}function ea(a){F(a);a.stopPropagation?a.stopPropagation():a.cancelBubble=!0}function aa(a){if(a.which)return a.which;else if(a.button&1)return 1;else if(a.button&2)return 3;else if(a.button&4)return 2}function W(a){if(a.pageX!=null)return a.pageX;var b=(a.target||a.srcElement).ownerDocument;return a.clientX+b.body.scrollLeft+
b.documentElement.scrollLeft}function l(a){if(a.pageY!=null)return a.pageY;var b=(a.target||a.srcElement).ownerDocument;return a.clientY+b.body.scrollTop+b.documentElement.scrollTop}function K(a,b,e,f){function g(a){e(a||window.event)}if(typeof a.addEventListener=="function"){if(a.addEventListener(b,g,!1),f)return function(){a.removeEventListener(b,g,!1)}}else if(a.attachEvent("on"+b,g),f)return function(){a.detachEvent("on"+b,g)}}function $(){this.id=null}function P(a,b){if(b==null&&(b=a.search(/[^\s\u00a0]/),
b==-1))b=a.length;for(var e=0,f=0;e<b;++e)a.charAt(e)=="\t"?f+=Ja-f%Ja:++f;return f}function L(a,b){for(var e=a.ownerDocument.body,f=0,g=0,j=!1,c=a;c;c=c.offsetParent)f+=c.offsetLeft,g+=c.offsetTop,b&&(c.currentStyle?c.currentStyle:window.getComputedStyle(c,null)).position=="fixed"&&(j=!0);e=b&&!j?null:e;for(c=a.parentNode;c!=e;c=c.parentNode)c.scrollLeft!=null&&(f-=c.scrollLeft,g-=c.scrollTop);return{left:f,top:g}}function v(a,b){return a.line==b.line&&a.ch==b.ch}function E(a,b){return a.line<b.line||
a.line==b.line&&a.ch<b.ch}function A(a){oa.innerText=oa.textContent=a;return oa.innerHTML}function I(a,b){if(a.indexOf)return a.indexOf(b);for(var e=0,f=a.length;e<f;++e)if(a[e]==b)return e;return-1}o.defaults={value:"",mode:null,theme:"default",indentUnit:2,indentWithTabs:!1,tabMode:"classic",enterMode:"indent",electricChars:!0,onKeyEvent:null,lineNumbers:!1,gutter:!1,firstLineNumber:1,readOnly:!1,onChange:null,onCursorActivity:null,onGutterClick:null,onHighlightComplete:null,onFocus:null,onBlur:null,
onScroll:null,matchBrackets:!1,workTime:100,workDelay:200,undoDepth:40,tabindex:null,document:window.document};var g={},C={};o.defineMode=function(a,b){if(!o.defaults.mode&&a!="null")o.defaults.mode=a;g[a]=b};o.defineMIME=function(a,b){C[a]=b};o.getMode=function(a,b){typeof b=="string"&&C.hasOwnProperty(b)&&(b=C[b]);if(typeof b=="string")var e=b,f={};else if(b!=null)e=b.name,f=b;var j=g[e];return!j?(window.console&&console.warn("No mode "+e+" found, falling back to plain text."),o.getMode(a,"text/plain")):
j(a,f||{})};o.listModes=function(){var a=[],b;for(b in g)g.propertyIsEnumerable(b)&&a.push(b);return a};o.listMIMEs=function(){var a=[],b;for(b in C)C.propertyIsEnumerable(b)&&a.push(b);return a};var Z={};o.defineExtension=function(a,b){Z[a]=b};o.fromTextArea=function(a,b){function e(){a.value=c.getValue()}b||(b={});b.value=a.value;if(!b.tabindex&&a.tabindex)b.tabindex=a.tabindex;if(a.form){var f=K(a.form,"submit",e,!0);if(typeof a.form.submit=="function"){var g=a.form.submit,j=function(){e();a.form.submit=
g;a.form.submit();a.form.submit=j};a.form.submit=j}}a.style.display="none";var c=o(function(b){a.parentNode.insertBefore(b,a.nextSibling)},b);c.save=e;c.toTextArea=function(){e();a.parentNode.removeChild(c.getWrapperElement());a.style.display="";if(a.form&&(f(),typeof a.form.submit=="function"))a.form.submit=g};return c};o.startState=x;o.copyState=D;h.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==0},peek:function(){return this.string.charAt(this.pos)},
next:function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},eat:function(a){var b=this.string.charAt(this.pos);if(typeof a=="string"?b==a:b&&(a.test?a.test(b):a(b)))return++this.pos,b},eatWhile:function(a){for(var b=this.start;this.eat(a););return this.pos>b},eatSpace:function(){for(var a=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>a},skipToEnd:function(){this.pos=this.string.length},skipTo:function(a){a=this.string.indexOf(a,this.pos);
if(a>-1)return this.pos=a,!0},backUp:function(a){this.pos-=a},column:function(){return P(this.string,this.start)},indentation:function(){return P(this.string)},match:function(a,b,e){if(typeof a=="string"){if((e?this.string.toLowerCase():this.string).indexOf(e?a.toLowerCase():a,this.pos)==this.pos)return b!==!1&&(this.pos+=a.length),!0}else return(a=this.string.slice(this.pos).match(a))&&b!==!1&&(this.pos+=a[0].length),a},current:function(){return this.string.slice(this.start,this.pos)}};o.StringStream=
h;i.prototype={replace:function(a,b,e){var f=[],g=this.marked;N(0,a,this.styles,f);e&&f.push(e,null);N(b,this.text.length,this.styles,f);this.styles=f;this.text=this.text.slice(0,a)+e+this.text.slice(b);this.stateAfter=null;if(g){a=e.length-(b-a);e=this.text.length;for(f=0;f<g.length;++f){var j=g[f],c=!1;if(j.from>=e)c=!0;else if(j.from=j.from<=Math.min(b,b+a)?j.from:j.from+a,j.to!=null)j.to=j.to<=Math.min(b,b+a)?j.to:j.to+a;if(c||j.from>=j.to)g.splice(f,1),f--}}},split:function(a,b){var e=[b,null];
N(a,this.text.length,this.styles,e);return new i(b+this.text.slice(a),e)},addMark:function(a,b,e){a={from:a,to:b,style:e};if(this.marked==null)this.marked=[];this.marked.push(a);this.marked.sort(function(a,b){return a.from-b.from});return a},removeMark:function(a){var b=this.marked;if(b)for(var e=0;e<b.length;++e)if(b[e]==a){b.splice(e,1);break}},highlight:function(a,b){var e=new h(this.text),f=this.styles,g=0,j=!1,c=f[0],m;for(this.text==""&&a.blankLine&&a.blankLine(b);!e.eol();){var n=a.token(e,
b),t=this.text.slice(e.start,e.pos);e.start=e.pos;if(g&&f[g-1]==n)f[g-2]+=t;else if(t){if(!j&&(f[g+1]!=n||g&&f[g-2]!=m))j=!0;f[g++]=t;f[g++]=n;m=c;c=f[g]}if(e.pos>5E3){f[g++]=this.text.slice(e.pos);f[g++]=null;break}}if(f.length!=g)f.length=g,j=!0;g&&f[g-2]!=m&&(j=!0);return j||f.length<5&&this.text.length<10},getTokenAt:function(a,b,e){for(var f=new h(this.text);f.pos<e&&!f.eol();){f.start=f.pos;var g=a.token(f,b)}return{start:f.start,end:f.pos,string:f.current(),className:g||null,state:b}},indentation:function(){return P(this.text)},
getHTML:function(a,b,e,f){function g(a,b){a&&(b?j.push('<span class="',b,'">',A(a),"</span>"):j.push(A(a)))}var j=[];e&&j.push(this.className?'<pre class="'+this.className+'">':"<pre>");var c=this.styles,m=this.text,n=this.marked;a==b&&(a=null);var t=m.length;f!=null&&(t=Math.min(f,t));if(!m&&f==null)g(" ",a!=null&&b==null?"CodeMirror-selected":null);else if(!n&&a==null)for(a=f=0;a<t;f+=2){var b=c[f],B=b.length;a+B>t&&(b=b.slice(0,t-a));a+=B;g(b,"cm-"+c[f+1])}else{var f=m=0,l="",h=-1,i=null,Z=function(){n&&
(h+=1,i=h<n.length?n[h]:null)};for(Z();m<t;){var C=t,aa="";if(a!=null)if(a>m)C=a;else if(b==null||b>m)aa=" CodeMirror-selected",b!=null&&(C=Math.min(C,b));for(;i&&i.to!=null&&i.to<=m;)Z();i&&(i.from>m?C=Math.min(C,i.from):(aa+=" "+i.style,i.to!=null&&(C=Math.min(C,i.to))));for(;;){var o=m+l.length,v=B;aa&&(v=B?B+aa:aa);g(o>C?l.slice(0,C-m):l,v);if(o>=C){l=l.slice(C-m);m=C;break}m=o;l=c[f++];B="cm-"+c[f++]}}a!=null&&b==null&&g(" ","CodeMirror-selected")}e&&j.push("</pre>");return j.join("")}};T.prototype=
{addChange:function(a,b,e){this.undone.length=0;var f=+new Date,g=this.done[this.done.length-1];if(f-this.time>400||!g||g.start>a+b||g.start+g.added<a-g.added+g.old.length)this.done.push({start:a,added:b,old:e});else{var j=0;if(a<g.start){for(var c=g.start-a-1;c>=0;--c)g.old.unshift(e[c]);g.added+=g.start-a;g.start=a}else g.start<a&&(j=a-g.start,b+=j);c=g.added-j;for(a=e.length;c<a;++c)g.old.push(e[c]);if(g.added<b)g.added=b}this.time=f}};$.prototype={set:function(a,b){clearTimeout(this.id);this.id=
setTimeout(b,a)}};var j=function(){var a=document.createElement("pre");a.innerHTML=" ";return!a.innerHTML}(),B=/gecko\/\d{7}/i.test(navigator.userAgent),Pa=/MSIE \d/.test(navigator.userAgent),ua=/Apple Computer/.test(navigator.vendor),xa="\n";(function(){var a=document.createElement("textarea");a.value="foo\nbar";a.value.indexOf("\r")>-1&&(xa="\r\n")})();for(var Ja=8,Oa=/Mac/.test(navigator.platform),qa={},pa=35;pa<=40;++pa)qa[pa]=qa["c"+pa]=!0;var oa=document.createElement("div");o.htmlEscape=A;
var ja,ma,ya;ja="\n\nb".split(/\n/).length!=3?function(a){for(var b=0,e,f=[];(e=a.indexOf("\n",b))>-1;)f.push(a.slice(b,a.charAt(e-1)=="\r"?e-1:e)),b=e+1;f.push(a.slice(b));return f}:function(a){return a.split(/\r?\n/)};o.splitLines=ja;window.getSelection?(ma=function(a){try{return{start:a.selectionStart,end:a.selectionEnd}}catch(b){return null}},ya=ua?function(a,b,e){b==e?a.setSelectionRange(b,e):(a.setSelectionRange(b,e-1),window.getSelection().modify("extend","forward","character"))}:function(a,
b,e){try{a.setSelectionRange(b,e)}catch(f){}}):(ma=function(a){try{var b=a.ownerDocument.selection.createRange()}catch(e){return null}if(!b||b.parentElement()!=a)return null;var f=a.value,g=f.length,j=a.createTextRange();j.moveToBookmark(b.getBookmark());var c=a.createTextRange();c.collapse(!1);if(j.compareEndPoints("StartToEnd",c)>-1)return{start:g,end:g};a=-j.moveStart("character",-g);for(b=f.indexOf("\r");b>-1&&b<a;b=f.indexOf("\r",b+1),a++);if(j.compareEndPoints("EndToEnd",c)>-1)return{start:a,
end:g};g=-j.moveEnd("character",-g);for(b=f.indexOf("\r");b>-1&&b<g;b=f.indexOf("\r",b+1),g++);return{start:a,end:g}},ya=function(a,b,e){var f=a.createTextRange();f.collapse(!0);for(var g=f.duplicate(),j=0,a=a.value,c=a.indexOf("\n");c>-1&&c<b;c=a.indexOf("\n",c+1))++j;for(f.move("character",b-j);c>-1&&c<e;c=a.indexOf("\n",c+1))++j;g.move("character",e-j);f.setEndPoint("EndToEnd",g);f.select()});o.defineMode("null",function(){return{token:function(a){a.skipToEnd()}}});o.defineMIME("text/plain","null");
return o}();
CodeMirror.overlayParser=function(o,D,x){return{startState:function(){return{base:CodeMirror.startState(o),overlay:CodeMirror.startState(D),basePos:0,baseCur:null,overlayPos:0,overlayCur:null}},copyState:function(h){return{base:CodeMirror.copyState(o,h.base),overlay:CodeMirror.copyState(D,h.overlay),basePos:h.basePos,baseCur:null,overlayPos:h.overlayPos,overlayCur:null}},token:function(h,i){if(h.start==i.basePos)i.baseCur=o.token(h,i.base),i.basePos=h.pos;if(h.start==i.overlayPos)h.pos=h.start,i.overlayCur=
D.token(h,i.overlay),i.overlayPos=h.pos;h.pos=Math.min(i.basePos,i.overlayPos);if(h.eol())i.basePos=i.overlayPos=0;return i.overlayCur==null?i.baseCur:i.baseCur!=null&&x?i.baseCur+" "+i.overlayCur:i.overlayCur},indent:function(h,i){return o.indent(h.base,i)},electricChars:o.electricChars}};
CodeMirror.runMode=function(o,D,x){var D=CodeMirror.getMode({indentUnit:2},D),h=x.nodeType==1;if(h)var i=x,N=[],x=function(i,h){i=="\n"?N.push("<br>"):h?N.push('<span class="cm-'+CodeMirror.htmlEscape(h)+'">'+CodeMirror.htmlEscape(i)+"</span>"):N.push(CodeMirror.htmlEscape(i))};for(var o=CodeMirror.splitLines(o),T=CodeMirror.startState(D),y=0,Q=o.length;y<Q;++y){y&&x("\n");for(var F=new CodeMirror.StringStream(o[y]);!F.eol();){var ea=D.token(F,T);x(F.current(),ea);F.start=F.pos}}if(h)i.innerHTML=
N.join("")};
CodeMirror.defineMode("javascript",function(o,D){var x,h,i,N;function T(a,b){for(var e=!1,f;(f=a.next())!=null;){if(f==b&&!e)return!1;e=!e&&f=="\\"}return e}function y(a,b,g){e=a;f=g;return b}function Q(c,e){var f=c.next();if(f=='"'||f=="'")return f=F(f),e.tokenize=f,f(c,e);else if(/[\[\]{}\(\),;\:\.]/.test(f))return y(f);else if(f=="0"&&c.eat(/x/i))return c.eatWhile(/[\da-f]/i),y("number","number");else if(/\d/.test(f))return c.match(/^\d*(?:\.\d*)?(?:e[+\-]?\d+)?/),y("number","number");else if(f==
"/")return c.eat("*")?(f=ea,e.tokenize=f,f(c,e)):c.eat("/")?(c.skipToEnd(),y("comment","comment")):e.reAllowed?(T(c,"/"),c.eatWhile(/[gimy]/),y("regexp","string")):(c.eatWhile(b),y("operator",null,c.current()));else if(b.test(f))return c.eatWhile(b),y("operator",null,c.current());else{c.eatWhile(/[\w\$_]/);var f=c.current(),g=a.propertyIsEnumerable(f)&&a[f];return g?y(g.type,g.style,f):y("variable","variable",f)}}function F(a){return function(b,e){if(!T(b,a))e.tokenize=Q;return y("string","string")}}
function ea(a,b){for(var e=!1,f;f=a.next();){if(f=="/"&&e){b.tokenize=Q;break}e=f=="*"}return y("comment","comment")}function aa(a,b,e,f,g,j){this.indented=a;this.column=b;this.type=e;this.prev=g;this.info=j;if(f!=null)this.align=f}function W(){for(var a=arguments.length-1;a>=0;a--)N.push(arguments[a])}function l(){W.apply(null,arguments);return!0}function K(a){var b=x;if(b.context){i="def";for(var e=b.localVars;e;e=e.next)if(e.name==a)return;b.localVars={name:a,next:b.localVars}}}function $(){if(!x.context)x.localVars=
Ib;x.context={prev:x.context,vars:x.localVars}}function P(){x.localVars=x.context.vars;x.context=x.context.prev}function L(a,b){var e=function(){var e=x;e.lexical=new aa(e.indented,h.column(),a,null,e.lexical,b)};e.lex=!0;return e}function v(){var a=x;if(a.lexical.prev){if(a.lexical.type==")")a.indented=a.lexical.indented;a.lexical=a.lexical.prev}}function E(a){return function(b){return b==a?l():a==";"?W():l(arguments.callee)}}function A(a){return a=="var"?l(L("vardef"),ua,E(";"),v):a=="keyword a"?
l(L("form"),I,A,v):a=="keyword b"?l(L("form"),A,v):a=="{"?l(L("}"),Pa,v):a==";"?l():a=="function"?l(oa):a=="for"?l(L("form"),E("("),L(")"),Ja,E(")"),v,A,v):a=="variable"?l(L("stat"),C):a=="switch"?l(L("form"),I,L("}","switch"),E("{"),Pa,v,v):a=="case"?l(I,E(":")):a=="default"?l(E(":")):a=="catch"?l(L("form"),$,E("("),ja,E(")"),A,v,P):W(L("stat"),I,E(";"),v)}function I(a){return G.hasOwnProperty(a)?l(g):a=="function"?l(oa):a=="keyword c"?l(I):a=="("?l(L(")"),I,E(")"),v,g):a=="operator"?l(I):a=="["?
l(L("]"),B(I,"]"),v,g):a=="{"?l(L("}"),B(j,"}"),v,g):l()}function g(a,b){if(a=="operator"&&/\+\+|--/.test(b))return l(g);if(a=="operator")return l(I);if(a!=";"){if(a=="(")return l(L(")"),B(I,")"),v,g);if(a==".")return l(Z,g);if(a=="[")return l(L("]"),I,E("]"),v,g)}}function C(a){return a==":"?l(v,A):W(g,E(";"),v)}function Z(a){if(a=="variable")return i="property",l()}function j(a){a=="variable"&&(i="property");if(G.hasOwnProperty(a))return l(E(":"),I)}function B(a,b){function e(f){return f==","?l(a,
e):f==b?l():l(E(b))}return function(f){return f==b?l():W(a,e)}}function Pa(a){return a=="}"?l():W(A,Pa)}function ua(a,b){return a=="variable"?(K(b),l(xa)):l()}function xa(a,b){if(b=="=")return l(I,xa);if(a==",")return l(ua)}function Ja(a){return a=="var"?l(ua,qa):a==";"?W(qa):a=="variable"?l(Oa):W(qa)}function Oa(a,b){return b=="in"?l(I):l(g,qa)}function qa(a,b){return a==";"?l(pa):b=="in"?l(I):l(I,E(";"),pa)}function pa(a){a!=")"&&l(I)}function oa(a,b){if(a=="variable")return K(b),l(oa);if(a=="(")return l(L(")"),
$,B(ja,")"),v,A,P)}function ja(a,b){if(a=="variable")return K(b),l()}var ma=o.indentUnit,ya=D.json,a=function(){function a(b){return{type:b,style:"keyword"}}var b=a("keyword a"),e=a("keyword b"),f=a("keyword c"),g=a("operator"),j={type:"atom",style:"atom"};return{"if":b,"while":b,"with":b,"else":e,"do":e,"try":e,"finally":e,"return":f,"break":f,"continue":f,"new":f,"delete":f,"throw":f,"var":a("var"),"function":a("function"),"catch":a("catch"),"for":a("for"),"switch":a("switch"),"case":a("case"),
"default":a("default"),"in":g,"typeof":g,"instanceof":g,"true":j,"false":j,"null":j,undefined:j,NaN:j,Infinity:j}}(),b=/[+\-*&%=<>!?|]/,e,f,G={atom:!0,number:!0,variable:!0,string:!0,regexp:!0};x=null;i=null;N=null;h=void 0;var Ib={name:"this",next:{name:"arguments"}};v.lex=!0;return{startState:function(a){return{tokenize:Q,reAllowed:!0,cc:[],lexical:new aa((a||0)-ma,0,"block",!1),localVars:null,context:null,indented:0}},token:function(a,b){if(a.sol()){if(!b.lexical.hasOwnProperty("align"))b.lexical.align=
!1;b.indented=a.indentation()}if(a.eatSpace())return null;var g=b.tokenize(a,b);if(e=="comment")return g;b.reAllowed=e=="operator"||e=="keyword c"||e.match(/^[\[{}\(,;:]$/);var j;a:{var B=e,l=f,C=b.cc;x=b;h=a;i=null;N=C;if(!b.lexical.hasOwnProperty("align"))b.lexical.align=!0;for(;;)if((C.length?C.pop():ya?I:A)(B,l)){for(;C.length&&C[C.length-1].lex;)C.pop()();if(i){j=i;break a}if(j=B=="variable")b:{for(j=b.localVars;j;j=j.next)if(j.name==l){j=!0;break b}j=void 0}j=j?"variable-2":g;break a}}return j},
indent:function(a,b){if(a.tokenize!=Q)return 0;var e=b&&b.charAt(0),f=a.lexical,g=f.type,j=e==g;return g=="vardef"?f.indented+4:g=="form"&&e=="{"?f.indented:g=="stat"||g=="form"?f.indented+ma:f.info=="switch"&&!j?f.indented+(/^(?:case|default)\b/.test(b)?ma:2*ma):f.align?f.column+(j?0:1):f.indented+(j?0:ma)},electricChars:":{}"}});CodeMirror.defineMIME("text/javascript","javascript");CodeMirror.defineMIME("application/json",{name:"javascript",json:!0});
(function(){function o(h){for(var i={},h=h.split(" "),o=0;o<h.length;++o)i[h[o]]=!0;return i}function D(h){return function(i,o){i.match(h)?o.tokenize=null:i.skipToEnd();return"string"}}var x={name:"clike",keywords:o("abstract and array as break case catch cfunction class clone const continue declare default do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final for foreach function global goto if implements interface instanceof namespace new or private protected public static switch throw try use var while xor return"),
blockKeywords:o("catch do else elseif for foreach if switch try while"),atoms:o("true false null"),multiLineStrings:!0,hooks:{$:function(h){h.eatWhile(/[\w\$_]/);return"variable-2"},"<":function(h,i){return h.match(/<</)?(h.eatWhile(/[\w\.]/),i.tokenize=D(h.current().slice(3)),i.tokenize(h,i)):!1}}};CodeMirror.defineMode("php",function(h,i){function o(i,h){if(h.curMode==D){var x=D.token(i,h.curState);if(x=="meta"&&/^<\?/.test(i.current()))h.curMode=F,h.curState=h.php,h.curClose=/^\?>/;else if(x==
"tag"&&i.current()==">"&&h.curState.context)if(/^script$/i.test(h.curState.context.tagName))h.curMode=y,h.curState=y.startState(D.indent(h.curState,"")),h.curClose=/^<\/\s*script\s*>/i;else if(/^style$/i.test(h.curState.context.tagName))h.curMode=Q,h.curState=Q.startState(D.indent(h.curState,"")),h.curClose=/^<\/\s*style\s*>/i;return x}else return i.match(h.curClose,!1)?(h.curMode=D,h.curState=h.html,h.curClose=null,o(i,h)):h.curMode.token(i,h.curState)}var D=CodeMirror.getMode(h,"text/html"),y=CodeMirror.getMode(h,
"text/javascript"),Q=CodeMirror.getMode(h,"text/css"),F=CodeMirror.getMode(h,x);return{startState:function(){var h=D.startState();return{html:h,php:F.startState(),curMode:i.startOpen?F:D,curState:i.startOpen?F.startState():h,curClose:i.startOpen?/^\?>/:null}},copyState:function(h){var i=h.html,o=CodeMirror.copyState(D,i),l=h.php,x=CodeMirror.copyState(F,l),i=h.curState==i?o:h.curState==l?x:CodeMirror.copyState(h.curMode,h.curState);return{html:o,php:x,curMode:h.curMode,curState:i,curClose:h.curClose}},
token:o,indent:function(h,i){return h.curMode!=F&&/^\s*<\//.test(i)||h.curMode==F&&/^\?>/.test(i)?D.indent(h.html,i):h.curMode.indent(h.curState,i)},electricChars:"/{}:"}});CodeMirror.defineMIME("application/x-httpd-php","php");CodeMirror.defineMIME("application/x-httpd-php-open",{name:"php",startOpen:!0});CodeMirror.defineMIME("text/x-php",x)})();
CodeMirror.defineMode("xml",function(o,D){function x(g,i){function l(j){i.tokenize=j;return j(g,i)}var j=g.next();if(j=="<")if(g.eat("!"))return g.eat("[")?g.match("CDATA[")?l(N("atom","]]\>")):null:g.match("--")?l(N("comment","--\>")):g.match("DOCTYPE",!0,!0)?(g.eatWhile(/[\w\._\-]/),l(N("meta",">"))):null;else if(g.eat("?"))return g.eatWhile(/[\w\._\-]/),i.tokenize=N("meta","?>"),"meta";else{E=g.eat("/")?"closeTag":"openTag";g.eatSpace();for(v="";j=g.eat(/[^\s\u00a0=<>\"\'\/?]/);)v+=j;i.tokenize=
h;return"tag"}else return j=="&"?(g.eatWhile(/[^;]/),g.eat(";"),"atom"):(g.eatWhile(/[^&<]/),null)}function h(g,h){var l=g.next();return l==">"||l=="/"&&g.eat(">")?(h.tokenize=x,E=l==">"?"endTag":"selfcloseTag","tag"):l=="="?(E="equals",null):/[\'\"]/.test(l)?(h.tokenize=i(l),h.tokenize(g,h)):(g.eatWhile(/[^\s\u00a0=<>\"\'\/?]/),"word")}function i(g){return function(i,l){for(;!i.eol();)if(i.next()==g){l.tokenize=h;break}return"string"}}function N(g,h){return function(i,j){for(;!i.eol();){if(i.match(h)){j.tokenize=
x;break}i.next()}return g}}function T(){for(var g=arguments.length-1;g>=0;g--)A.cc.push(arguments[g])}function y(){T.apply(null,arguments);return!0}function Q(g,h){var i=P.doNotIndent.hasOwnProperty(g)||A.context&&A.context.noIndent;A.context={prev:A.context,tagName:g,indent:A.indented,startOfLine:h,noIndent:i}}function F(g){if(g=="openTag")return A.tagName=v,y(W,ea(A.startOfLine));else if(g=="closeTag"){g=!1;if(A.context){if(g=A.context.tagName!=v,A.context)A.context=A.context.prev}else g=!0;g&&
(I="error");return y(aa(g))}else{if(g=="string"&&((!A.context||A.context.name!="!cdata")&&Q("!cdata"),A.tokenize==x&&A.context))A.context=A.context.prev;return y()}}function ea(g){return function(h){if(h=="selfcloseTag"||h=="endTag"&&P.autoSelfClosers.hasOwnProperty(A.tagName.toLowerCase()))return y();h=="endTag"&&Q(A.tagName,g);return y()}}function aa(g){return function(h){g&&(I="error");return h=="endTag"?y():T()}}function W(g){return g=="word"?(I="attribute",y(W)):g=="equals"?y(l,W):T()}function l(g){return g==
"word"&&P.allowUnquoted?(I="string",y()):g=="string"?y(K):T()}function K(g){return g=="string"?y(K):T()}var $=o.indentUnit,P=D.htmlMode?{autoSelfClosers:{br:!0,img:!0,hr:!0,link:!0,input:!0,meta:!0,col:!0,frame:!0,base:!0,area:!0},doNotIndent:{pre:!0,"!cdata":!0},allowUnquoted:!0}:{autoSelfClosers:{},doNotIndent:{"!cdata":!0},allowUnquoted:!1},L=D.alignCDATA,v,E,A,I;return{startState:function(){return{tokenize:x,cc:[],indented:0,startOfLine:!0,tagName:null,context:null}},token:function(g,h){if(g.sol())h.startOfLine=
!0,h.indented=g.indentation();if(g.eatSpace())return null;I=E=v=null;var i=h.tokenize(g,h);if((i||E)&&i!="comment")for(A=h;;)if((h.cc.pop()||F)(E||i))break;h.startOfLine=!1;return I||i},indent:function(g,h){var i=g.context;if(i&&i.noIndent)return 0;if(L&&/<!\[CDATA\[/.test(h))return 0;if(i&&/^<\//.test(h))i=i.prev;for(;i&&!i.startOfLine;)i=i.prev;return i?i.indent+$:0},compareStates:function(g,h){if(g.indented!=h.indented||g.tagName!=h.tagName)return!1;for(var i=g.context,j=h.context;;i=i.prev,j=
j.prev){if(!i||!j)return i==j;if(i.tagName!=j.tagName)return!1}},electricChars:"/"}});CodeMirror.defineMIME("application/xml","xml");CodeMirror.defineMIME("text/html",{name:"xml",htmlMode:!0});
CodeMirror.defineMode("python",function(o){function D(g){return RegExp("^(("+g.join(")|(")+"))\\b")}function x(j,i){if(j.sol()){var o=i.scopes[0].offset;if(j.eatSpace()){var v=j.indentation();v>o?Z="indent":v<o&&(Z="dedent");return null}else o>0&&N(j,i)}if(j.eatSpace())return null;if(j.peek()==="#")return j.skipToEnd(),"comment";if(j.match(/^[0-9\.]/,!1)){o=!1;j.match(/^\d*\.\d+(e[\+\-]?\d+)?/i)&&(o=!0);j.match(/^\d+\.\d*/)&&(o=!0);j.match(/^\.\d+/)&&(o=!0);if(o)return j.eat(/J/i),"number";o=!1;j.match(/^0x[0-9a-f]+/i)&&
(o=!0);j.match(/^0b[01]+/i)&&(o=!0);j.match(/^0o[0-7]+/i)&&(o=!0);j.match(/^[1-9]\d*(e[\+\-]?\d+)?/)&&(j.eat(/J/i),o=!0);j.match(/^0(?![\dx])/i)&&(o=!0);if(o)return j.eat(/L/i),"number"}if(j.match(I))return i.tokenize=h(j.current()),i.tokenize(j,i);if(j.match(W)||j.match(aa))return null;if(j.match(ea)||j.match(Q)||j.match(K))return"operator";if(j.match(F))return null;if(j.match(C))return"builtin";if(j.match(g))return"keyword";if(j.match(l))return"variable";j.next();return y}function h(g){for(;"rub".indexOf(g[0].toLowerCase())>=
0;)g=g.substr(1);var h=RegExp(g),i=g.length==1,l="string";return function(g,j){for(;!g.eol();)if(g.eatWhile(/[^'"\\]/),g.eat("\\")){if(g.next(),i&&g.eol())return l}else if(g.match(h))return j.tokenize=x,l;else g.eat(/['"]/);if(i)o.mode.singleLineStringErrors?l=y:j.tokenize=x;return l}}function i(g,h,i){var i=i||"py",l=0;if(i==="py")for(g=0;g<h.scopes.length;++g){if(h.scopes[g].type==="py"){l=h.scopes[g].offset+o.indentUnit;break}}else l=g.column()+g.current().length;h.scopes.unshift({offset:l,type:i})}
function N(g,h){if(h.scopes.length!=1){if(h.scopes[0].type==="py"){for(var i=g.indentation(),l=-1,o=0;o<h.scopes.length;++o)if(i===h.scopes[o].offset){l=o;break}if(l===-1)return!0;for(;h.scopes[0].offset!==i;)h.scopes.shift()}else h.scopes.shift();return!1}}function T(g,h){Z=null;var l=h.tokenize(g,h),o=g.current();if(o===".")return l=h.tokenize(g,h),g.current(),l==="variable"?"variable":y;if(o==="@")return l=h.tokenize(g,h),o=g.current(),l==="variable"||o==="@staticmethod"||o==="@classmethod"?"meta":
y;if(o==="pass"||o==="return")h.dedent+=1;(o===":"&&!h.lambda&&h.scopes[0].type=="py"||Z==="indent")&&i(g,h);var v="[({".indexOf(o);v!==-1&&i(g,h,"])}".slice(v,v+1));if(Z==="dedent"&&N(g,h))return y;v="])}".indexOf(o);if(v!==-1&&N(g,h))return y;h.dedent>0&&g.eol()&&h.scopes[0].type=="py"&&(h.scopes.length>1&&h.scopes.shift(),h.dedent-=1);return l}var y="error",Q=/^[\+\-\*/%&|\^~<>!]/,F=/^[\(\)\[\]\{\}@,:`=;\.]/,ea=/^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(\/\/)|(\*\*))/,aa=/^((\+=)|(\-=)|(\*=)|(%=)|(\/=)|(&=)|(\|=)|(\^=))/,
W=/^((\/\/=)|(>>=)|(<<=)|(\*\*=))/,l=/^[_A-Za-z][_A-Za-z0-9]*/,K=D(["and","or","not","is","in"]),$="as,assert,break,class,continue,def,del,elif,else,except,finally,for,from,global,if,import,lambda,pass,raise,return,try,while,with,yield".split(","),P="bool,classmethod,complex,dict,enumerate,float,frozenset,int,list,object,property,reversed,set,slice,staticmethod,str,super,tuple,type".split(","),L="basestring,buffer,file,long,unicode,xrange".split(","),v=["exec","print"],E="bytearray,bytes,filter,map,memoryview,open,range,zip".split(","),
A=["nonlocal"];if(o.mode.version&&parseInt(o.mode.version,10)===3)var $=$.concat(A),P=P.concat(E),I=/^(([rb]|(br))?('{3}|"{3}|['"]))/i;else $=$.concat(v),P=P.concat(L),I=/^(([rub]|(ur)|(br))?('{3}|"{3}|['"]))/i;var g=D($),C=D(P),Z=null;return{startState:function(g){return{tokenize:x,scopes:[{offset:g||0,type:"py"}],lastToken:null,lambda:!1,dedent:0}},token:function(g,h){var i=T(g,h);h.lastToken={style:i,content:g.current()};if(g.eol()&&g.lambda)h.lambda=!1;return i},indent:function(g){return g.tokenize!=
x?0:g.scopes[0].offset}}});CodeMirror.defineMIME("text/x-python","python");var editor=CodeMirror.fromTextArea(document.getElementById("code"),{mode:"text/javascript",lineNumbers:!0,onCursorActivity:function(){editor.setLineClass(hlLine,null);hlLine=editor.setLineClass(editor.getCursor().line,"activeline")}}),hlLine=editor.setLineClass(0,"activeline");</script></body></html>
Pretty simple tool as it stands now. It will follow @imports, base64 any images it finds in the CSS (though not in tags yet), etc. At the moment, it doesn't resolve external links, chrome links, or file:// links. It also assumes that your root directory is your current working directory.