@@ -0,0 +1,3213 @@
1+
2+var Guid = function() {
3+ var counter = 0;
4+ var guid = function() { counter += 1; return counter; };
5+ return {guid : guid};
6+}();
7+var Foreign = function() {
8+ var JavaScript = function() {
9+ function castJSBoolToBool(b) { return b; }
10+ function castBoolToJSBool(b) { return b; }
11+
12+ function castJSNumberToFloat(n) { return n; }
13+ function castFloatToJSNumber(n) { return n; }
14+
15+ function castJSNumberToInt(n) { return ~~n; }
16+ function castIntToJSNumber(n) { return n; }
17+
18+ function castJSElementToElement(w) {
19+ return function(h) {
20+ return function(node) {
21+ return ["Element",Guid.guid(),
22+ ["EExternalHtml",node],
23+ w,h,1,Nothing,Nothing];
24+ }
25+ }
26+ }
27+ function castElementToJSElement(elem) { return Render.render(elem); }
28+
29+ function castJSArrayToList(arr) {
30+ var list = ["Nil"];
31+ for (var i = arr.length; i--; ) {
32+ list = [ "Cons", arr[i], list ];
33+ }
34+ return list;
35+ }
36+ function castListToJSArray(list) {
37+ var a = [];
38+ while (list[0] === "Cons") {
39+ a.push(list[1]);
40+ list = list[2];
41+ }
42+ return a;
43+ }
44+
45+ var castJSStringToString = castJSArrayToList;
46+ function castStringToJSString(str) {
47+ if (typeof str === "string") return str;
48+ return castListToJSArray(str).join('');
49+ }
50+
51+ function fromTuple(t) { return t.slice(1); }
52+ function toTuple(a) { return ["Tuple" + a.length].concat(a); }
53+
54+ return {castJSBoolToBool:castJSBoolToBool,
55+ castBoolToJSBool:castBoolToJSBool,
56+ castJSNumberToFloat:castJSNumberToFloat,
57+ castFloatToJSNumber:castFloatToJSNumber,
58+ castJSNumberToInt:castJSNumberToInt,
59+ castIntToJSNumber:castIntToJSNumber,
60+ Experimental : {castJSElementToElement:castJSElementToElement,
61+ castElementToJSElement:castElementToJSElement},
62+ castJSArrayToList:castJSArrayToList,
63+ castListToJSArray:castListToJSArray,
64+ castJSStringToString:castJSStringToString,
65+ castStringToJSString:castStringToJSString,
66+ castTupleToJSTuple2:fromTuple,
67+ castTupleToJSTuple3:fromTuple,
68+ castTupleToJSTuple4:fromTuple,
69+ castTupleToJSTuple5:fromTuple,
70+ castJSTupleToTuple2:toTuple,
71+ castJSTupleToTuple3:toTuple,
72+ castJSTupleToTuple4:toTuple,
73+ castJSTupleToTuple5:toTuple
74+ };
75+ }();
76+ return {JavaScript:JavaScript};
77+}();
78+var ElmJSON = function() {
79+ var JS = Foreign.JavaScript;
80+ var empty = ['JSON',{}];
81+ function singleton(k) { return function(v) {
82+ var obj = {};
83+ obj[JS.castStringToJSString(k)] = v;
84+ return ['JSON', obj ];
85+ };
86+ }
87+ function insert(k) { return function(v) { return function(inObj) {
88+ var obj = inObj[1];
89+ var outObj = {};
90+ for (var i in obj) {
91+ outObj[i] = obj[i];
92+ }
93+ outObj[JS.castStringToJSString(k)] = v;
94+ return ['JSON', outObj ];
95+ };
96+ };
97+ }
98+ function lookup(key) { return function(obj) {
99+ var k = JS.castStringToJSString(key);
100+ return obj[1].hasOwnProperty(k) ? Just(obj[1][k]) : Nothing ;
101+ };
102+ }
103+ function lookupWithDefault(base) { return function(key) { return function(obj) {
104+ var k = JS.castStringToJSString(key);
105+ return obj[1].hasOwnProperty(k) ? obj[1][k] : base ;
106+ };
107+ };
108+ }
109+ function remove(k) { return function(inObj) {
110+ var obj = inObj[1];
111+ var outObj = {};
112+ for (var i in obj) {
113+ outObj[i] = obj[i];
114+ }
115+ delete outObj[JS.castStringToJSString(k)];
116+ return ['JSON', outObj];
117+ };
118+ }
119+
120+ function JsonString(v) { return [ "JsonString", v ]; }
121+ function JsonNumber(v) { return [ "JsonNumber", v ]; }
122+ function JsonBool(v) { return [ "JsonBool", v ]; }
123+ var JsonNull = [ "JsonNull" ];
124+ function JsonArray(v) { return [ "JsonArray", v ]; }
125+ function JsonObject(v) { return [ "JsonObject", v ]; }
126+
127+ function toList(json) {
128+ var obj = json[1];
129+ var arr = [];
130+ for (var i in obj) {
131+ arr.push(Value.Tuple(JS.castJSStringToString(i), obj[i]));
132+ }
133+ return JS.castJSArrayToList(arr);
134+ }
135+ function fromList(list) {
136+ var arr = JS.castListToJSArray(list);
137+ var obj = {};
138+ for (var i = arr.length; i--; ) {
139+ obj[JS.castStringToJSString(arr[i][1])] = arr[i][2];
140+ }
141+ return [ "JSON", obj ];
142+ }
143+
144+ function toPrettyJSString(sep) { return function (obj) {
145+ function fromValue(v) {
146+ switch (v[0]) {
147+ case 'JsonNull' : return null;
148+ case 'JsonString' : return JS.castStringToJSString(v[1]);
149+ case 'JsonObject' :
150+ var o = {};
151+ var from = v[1][1];
152+ for (var i in from) {
153+ o[i] = fromValue(from[i]);
154+ }
155+ return o;
156+ case 'JsonArray' :
157+ var a = JS.castListToJSArray(v[1]);
158+ for (var i = a.length; i--; ) {
159+ a[i] = fromValue(a[i]);
160+ }
161+ return a;
162+ default :
163+ return v[1];
164+ }
165+ }
166+ return JSON.stringify(fromValue([ 'JsonObject', obj ]), null, JS.castStringToJSString(sep));
167+ };
168+ }
169+ function fromJSString(str) {
170+ var obj = JSON.parse(str);
171+ function toValue(v) {
172+ switch (typeof v) {
173+ case 'string' : return [ "JsonString", JS.castJSStringToString(v) ];
174+ case 'number' : return [ "JsonNumber", JS.castJSNumberToFloat(v) ];
175+ case 'boolean' : return [ "JsonBool", JS.castJSBoolToBool(v) ];
176+ case 'object' :
177+ if (v === null) return [ "JsonNull" ];
178+ for (var i in v) {
179+ v[i] = toValue(v[i]);
180+ }
181+ if (v instanceof Array) return [ "JsonArray", JS.castJSArrayToList(v) ];
182+ return [ "JsonObject", [ "JSON", v ] ];
183+ }
184+ }
185+ for (var i in obj) {
186+ obj[i] = toValue(obj[i]);
187+ }
188+ return ['JSON',obj];
189+ }
190+ return {empty : empty,
191+ singleton : singleton,
192+ insert : insert,
193+ lookup : lookup,
194+ findWithDefault : lookupWithDefault,
195+ remove : remove,
196+ toPrettyJSString : toPrettyJSString,
197+ toJSString : toPrettyJSString(''),
198+ fromJSString : fromJSString,
199+ toPrettyString : function(sep) { return function(v) {
200+ return JS.castJSStringToString(toPrettyJSString(sep)(v)); }; },
201+ toString : function(v) { return JS.castJSStringToString(toPrettyJSString('')(v)); },
202+ fromString : function(v) { return fromJSString(JS.castStringToJSString(v)); },
203+ toList : toList,
204+ fromList : fromList,
205+ JsonString : JsonString,
206+ JsonNumber : JsonNumber,
207+ JsonBool : JsonBool,
208+ JsonNull : JsonNull,
209+ JsonArray : JsonArray,
210+ JsonObject : JsonObject
211+ };
212+}();
213+
214+Foreign.JavaScript.JSON = ElmJSON;
215+var Value = function(){
216+
217+ var eq = function(x,y) {
218+ if (typeof x === "object") {
219+ if (x === y) return true;
220+ if (x.length !== y.length) return false;
221+ for (var i = x.length; i--; ) {
222+ if (!eq(x[i],y[i])) return false;
223+ }
224+ return true;
225+ }
226+ return x === y;
227+ };
228+
229+ var Tuple = function() {
230+ var len = arguments.length;
231+ var arr = new Array(len+1);
232+ arr[0] = "Tuple" + arguments.length;
233+ for (var i = len; i--; ) {
234+ arr[i+1] = arguments[i];
235+ }
236+ return arr;
237+ };
238+
239+ var listToArray = function(list) {
240+ var arr = [];
241+ while (list[0] === "Cons") {
242+ arr.push(list[1]);
243+ list = list[2];
244+ }
245+ return arr;
246+ };
247+
248+ function makeSpaces(s) {
249+ if (s.length == 0) { return s; }
250+ var arr = s.split('');
251+ if (arr[0] == ' ') { arr[0] = " " }
252+ for (var i = arr.length; --i; ) {
253+ if (arr[i][0] == ' ' && arr[i-1] == ' ') {
254+ arr[i-1] = arr[i-1] + arr[i];
255+ arr[i] = '';
256+ }
257+ }
258+ for (var i = arr.length; i--; ) {
259+ if (arr[i].length > 1 && arr[i][0] == ' ') {
260+ var spaces = arr[i].split('');
261+ for (var j = spaces.length - 2; j >= 0; j -= 2) {
262+ spaces[j] = ' ';
263+ }
264+ arr[i] = spaces.join('');
265+ }
266+ }
267+ return arr.join('');
268+ }
269+
270+ function properEscape(str) {
271+ if (str.length == 0) return str;
272+ str = str //.replace(/&/g, "&")
273+ .replace(/"/g, /*"*/ """)
274+ .replace(/'/g, /*'*/ "'")
275+ .replace(/</g, "<")
276+ .replace(/>/g, ">")
277+ .replace(/\n/g, "<br/>");
278+ var arr = str.split('<br/>');
279+ for (var i = arr.length; i--; ) {
280+ arr[i] = makeSpaces(arr[i]);
281+ }
282+ return arr.join('<br/>');
283+ }
284+
285+ var toText = function(elmList) {
286+ if (typeof elmList === "string") return properEscape(elmList);
287+ var a = [];
288+ while (elmList[0] === "Cons") {
289+ a.push(elmList[1]);
290+ elmList = elmList[2];
291+ }
292+ return properEscape(a.join(''));
293+ };
294+
295+ function getTextSize(w,h,txt) {
296+ var t = document.createElement('div');
297+ t.innerHTML = txt;
298+ t.style.textAlign = 'left';
299+ if (w > 0) { t.style.width = w + "px"; }
300+
301+ t.style.visibility = "hidden";
302+ t.style.styleFloat = "left";
303+ t.style.cssFloat = "left";
304+
305+ document.body.appendChild(t);
306+ var cStyle = window.getComputedStyle(t);
307+ var realW = cStyle.getPropertyValue("width").slice(0,-2) - 0;
308+ var realH = cStyle.getPropertyValue("height").slice(0,-2) - 0;
309+ document.body.removeChild(t);
310+ delete t;
311+ return [Math.ceil(realW),Math.ceil(Math.max(h,realH))];
312+ }
313+
314+ function getSize(e) {
315+ var t = e.cloneNode(true);
316+
317+ t.style.visibility = "hidden";
318+ t.style.styleFloat = "left";
319+ t.style.cssFloat = "left";
320+
321+ document.body.appendChild(t);
322+ var w = t.offsetWidth;
323+ var h = t.offsetHeight;
324+ document.body.removeChild(t);
325+ delete t;
326+ return [w,h];
327+ }
328+
329+ function getExcess(e) {
330+ var t = e.cloneNode(true);
331+
332+ t.style.visibility = "hidden";
333+ t.style.styleFloat = "left";
334+ t.style.cssFloat = "left";
335+
336+ document.body.appendChild(t);
337+ var ow = t.offsetWidth;
338+ var oh = t.offsetHeight;
339+ var cStyle = window.getComputedStyle(t);
340+ var w = cStyle.getPropertyValue("width").slice(0,-2) - 0;
341+ var h = cStyle.getPropertyValue("height").slice(0,-2) - 0;
342+ document.body.removeChild(t);
343+ delete t;
344+ return [ow-w,oh-h];
345+ }
346+
347+
348+ function groupForms(forms) {
349+ forms = Foreign.JavaScript.castListToJSArray(forms);
350+ var groups = [];
351+ var arr = [];
352+ for (var i = forms.length; i--; ) {
353+ var f = forms[i];
354+ switch(f[4][0]) {
355+ case "FElement":
356+ if (arr.length > 0) {
357+ groups.push(arr);
358+ arr = [];
359+ }
360+ groups.push(f);
361+ break;
362+ default:
363+ arr.push(f);
364+ }
365+ }
366+ if (arr.length > 0) groups.push(arr);
367+ return groups;
368+ }
369+
370+ var toString = function(v) {
371+ if (typeof v === "boolean") {
372+ return v ? "True" : "False";
373+ } else if (typeof v === "number") {
374+ return v+"";
375+ } else if (typeof v === "string" && v.length < 2) {
376+ return "'"+v+"'";
377+ } else if (v[0]) {
378+ if (v[0].substring(0,5) === "Tuple") {
379+ var output = "";
380+ for (var i = v.length; --i; ) {
381+ output = "," + toString(v[i]) + output;
382+ }
383+ if (output[0] === ",") output = output.substring(1);
384+ return "("+output+")";
385+ } else if (v[0] === "Cons") {
386+ var start = (typeof v[1] === "string") ? '"' : "[";
387+ var end = (typeof v[1] === "string") ? '"' : "]";
388+ var div = (typeof v[1] === "string") ? "" : ",";
389+ var f = (typeof v[1] === "string") ? function(x){return x} : toString;
390+ var output = start + f(v[1]);
391+ v = v[2];
392+ while (true) {
393+ if (v[0] === "Cons") {
394+ output += div + f(v[1]);
395+ v = v[2];
396+ } else {
397+ return output + end;
398+ }
399+ }
400+ } else if (v[0] === "Nil") {
401+ return "[]";
402+ } else if (v[0] === "JSON") {
403+ return "(JSON.fromList " + toString(ElmJSON.toList(v)) + ")";
404+ } else {
405+ var output = "";
406+ for (var i = v.length; --i; ) {
407+ output = " " + toString(v[i]) + output
408+ }
409+ output = v[0] + output;
410+ return (v.length > 1) ? "(" + output + ")" : output;
411+ }
412+ }
413+ return v+"";
414+ };
415+ var show = function(v) { return str(toString(v)); };
416+ var append = function(xs,ys) {
417+ if (typeof xs === "string" && typeof ys === "string") {
418+ return xs.concat(ys);
419+ }
420+ if (xs[0] === "Nil") {
421+ return ys;
422+ }
423+ var root = ["Cons", xs[1], ["Nil"]];
424+ var curr = root;
425+ xs = xs[2];
426+ while (xs[0]==="Cons") {
427+ curr[2] = ["Cons", xs[1], ["Nil"]];
428+ xs = xs[2];
429+ curr = curr[2];
430+ }
431+ curr[2] = ys;
432+ return root;
433+ };
434+
435+ var str = function(s) {
436+ var out = ["Nil"];
437+ for (var i = s.length; i--; ) {
438+ out = ["Cons", s[i], out];
439+ }
440+ return out;
441+ };
442+
443+ return {eq:eq,
444+ str:str,
445+ show:show,
446+ Tuple:Tuple,
447+ append:append,
448+ listToArray:listToArray,
449+ toText : toText,
450+ properEscape : properEscape,
451+ getTextSize : getTextSize,
452+ getSize : getSize,
453+ getExcess : getExcess,
454+ groupForms : groupForms };
455+}();var List = function() {
456+
457+ var throwError = function(f) {
458+ throw "Function '" + f + "' expecting a list!";
459+ }
460+
461+ function length(xs) {
462+ var out = 0;
463+ while (xs[0] === "Cons") {
464+ out += 1;
465+ xs = xs[2];
466+ }
467+ return out;
468+ };
469+ var reverse = foldl(function(x_72) {
470+ return function(y_73) {
471+ return["Cons", x_72, y_73]
472+ }
473+ })(["Nil"]);
474+ var concat = foldr(function(x_74) {
475+ return function(y_75) {
476+ return Value.append(x_74, y_75)
477+ }
478+ })(["Nil"]);
479+ var and = foldl(function(x_77) {
480+ return function(y_78) {
481+ return x_77 && y_78
482+ }
483+ })(true);
484+ var or = foldl(function(x_79) {
485+ return function(y_80) {
486+ return x_79 || y_80
487+ }
488+ })(false);
489+ var sum = foldl(function(x_89) {
490+ return function(y_90) {
491+ return x_89 + y_90
492+ }
493+ })(0);
494+ var product = foldl(function(x_91) {
495+ return function(y_92) {
496+ return x_91 * y_92
497+ }
498+ })(1);
499+ var maximum = foldl1(function(x) { return function(y) { return Math.max(x,y) } });
500+ var minimum = foldl1(function(x) { return function(y) { return Math.min(x,y) } });
501+ function head(v) {
502+ if (v[0] !== "Cons") {
503+ throw "Error: 'head' only accepts lists of length greater than one.";
504+ }
505+ return v[1];
506+ }
507+ function tail(v) {
508+ if (v[0] !== "Cons") {
509+ throw "Error: 'tail' only accepts lists of length greater than one.";
510+ }
511+ return v[2];
512+ }
513+ function last(v) {
514+ if (v[0] !== "Cons") {
515+ throw "Error: 'last' only accepts lists of length greater than one.";
516+ }
517+ var out = v[1];
518+ while (v[0] === "Cons") {
519+ out = v[1];
520+ v = v[2];
521+ }
522+ return out;
523+ }
524+ function map(f) {
525+ return function(xs) {
526+ if (xs[0] === "Nil") { return xs; }
527+ if (xs[0] !== "Cons") { throwError('map'); }
528+ var root = ["Cons", f(xs[1]), ["Nil"]];
529+ var curr = root;
530+ xs = xs[2];
531+ while (xs[0]==="Cons") {
532+ curr[2] = ["Cons", f(xs[1]), ["Nil"]];
533+ xs = xs[2];
534+ curr = curr[2];
535+ }
536+ return root;
537+ }
538+ }
539+ function foldl(f) {
540+ return function(b) {
541+ return function(xs) {
542+ var acc = b;
543+ if (xs[0] === "Nil") { return acc; }
544+ if (xs[0] !== "Cons") { throwError('foldl'); }
545+ while (xs[0] === "Cons") {
546+ acc = f(xs[1])(acc);
547+ xs = xs[2];
548+ }
549+ return acc;
550+ }
551+ }
552+ }
553+ function foldr(f) {
554+ return function(b) {
555+ return function(xs) {
556+ var acc = b;
557+ if (xs[0] === "Nil") { return acc; }
558+ if (xs[0] !== "Cons") { throwError('foldr'); }
559+ var arr = [];
560+ while (xs[0] === "Cons") {
561+ arr.push(xs[1]);
562+ xs = xs[2];
563+ }
564+ for (var i = arr.length; i--; ) {
565+ acc = f(arr[i])(acc);
566+ }
567+ return acc;
568+ }
569+ }
570+ }
571+ function foldl1(f_49) {
572+ return function(_temp_50) {
573+ return function(v) {
574+ if("Cons" !== v[0]) {
575+ return undefined
576+ }else {
577+ var x_51 = v[1];
578+ var xs_52 = v[2];
579+ return foldl(f_49)(x_51)(xs_52)
580+ }
581+ }(_temp_50)
582+ }
583+ }
584+ function foldr1(f) {
585+ return function(xs) {
586+ if (xs[0] === "Nil") { throw "'foldr1' requires an non-empty list." }
587+ if (xs[0] !== "Cons") { throwError('foldr1'); }
588+ var arr = [];
589+ while (xs[0] === "Cons") {
590+ arr.push(xs[1]);
591+ xs = xs[2];
592+ }
593+ var acc = arr.pop();
594+ for (var i = arr.length; i--; ) {
595+ acc = f(arr[i])(acc);
596+ }
597+ return acc;
598+ }
599+ }
600+ function scanl(f) {
601+ return function(b) {
602+ return function(xs) {
603+ if (xs[0] === "Nil") { return ["Cons",b,["Nil"]]; }
604+ if (xs[0] !== "Cons") { throwError('scanl'); }
605+ var arr = [b];
606+ while (xs[0] === "Cons") {
607+ b = f(xs[1])(b);
608+ arr.push(b);
609+ xs = xs[2];
610+ }
611+ var out = ["Nil"];
612+ for (var i = arr.length; i--; ) {
613+ out = ["Cons", arr[i], out];
614+ }
615+ return out;
616+ }
617+ }
618+ }
619+ function scanl1(f) {
620+ return function(xs) {
621+ if (xs[0] !== "Cons") {
622+ throw "Error: 'scanl1' requires a list of at least length 1.";
623+ }
624+ return scanl(f)(xs[1])(xs[2]);
625+ }
626+ }
627+ function filter(pred) {
628+ return function(xs) {
629+ if (xs[0] === "Nil") { return xs; }
630+ if (xs[0] !== "Cons") { throwError('filter'); }
631+ var arr = [];
632+ while (xs[0] === "Cons") {
633+ if (pred(xs[1])) { arr.push(xs[1]); }
634+ xs = xs[2];
635+ }
636+ var out = ["Nil"];
637+ for (var i = arr.length; i--; ) {
638+ out = ["Cons", arr[i], out];
639+ }
640+ return out;
641+ }
642+ }
643+ function concatMap(f_76) {
644+ return function(x) {
645+ return concat(map(f_76)(x))
646+ }
647+ }
648+ function all(pred) {
649+ return foldl(function(x) { return function(acc) {
650+ return acc && pred(x);
651+ };})(true);
652+ }
653+ function any(pred) {
654+ return foldl(function(x) { return function(acc) {
655+ return acc || pred(x);
656+ };})(false);
657+ }
658+ function partition(pred_93) {
659+ return function(lst_94) {
660+ return function() {
661+ var v = lst_94;
662+ var c = [function(v) {
663+ if("Nil" !== v[0]) {
664+ return undefined
665+ }else {
666+ return["Tuple2", ["Nil"], ["Nil"]]
667+ }
668+ }, function(v) {
669+ if("Cons" !== v[0]) {
670+ return undefined
671+ }else {
672+ var x_95 = v[1];
673+ var xs_96 = v[2];
674+ return function(v) {
675+ if("Tuple2" !== v[0]) {
676+ return undefined
677+ }else {
678+ var as_97 = v[1];
679+ var bs_98 = v[2];
680+ return pred_93(x_95) ? ["Tuple2", ["Cons", x_95, as_97], bs_98] : ["Tuple2", as_97, ["Cons", x_95, bs_98]]
681+ }
682+ }(partition(pred_93)(xs_96))
683+ }
684+ }];
685+ for(var i = c.length;i--;) {
686+ var r = c[i](v);
687+ if(r !== undefined) {
688+ return r
689+ }
690+ }
691+ }()
692+ }
693+ }
694+ function zipWith(f) {
695+ return function(listA) {
696+ return function(listB) {
697+ if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
698+ if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zipWith'); }
699+ var arr = [];
700+ while (listA[0] === "Cons" && listB[0] === "Cons") {
701+ arr.push(f(listA[1])(listB[1]));
702+ listA = listA[2];
703+ listB = listB[2];
704+ }
705+ var out = ["Nil"];
706+ for (var i = arr.length; i--; ) {
707+ out = ["Cons", arr[i], out];
708+ }
709+ return out;
710+ }
711+ }
712+ }
713+ function zip(listA) {
714+ return function(listB) {
715+ if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
716+ if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zip'); }
717+ var arr = [];
718+ while (listA[0] === "Cons" && listB[0] === "Cons") {
719+ arr.push(["Tuple2", listA[1], listB[1]]);
720+ listA = listA[2];
721+ listB = listB[2];
722+ }
723+ var out = ["Nil"];
724+ for (var i = arr.length; i--; ) {
725+ out = ["Cons", arr[i], out];
726+ }
727+ return out;
728+ }
729+ }
730+ function unzip(pairs_112) {
731+ return function() {
732+ var v = pairs_112;
733+ var c = [function(v) {
734+ if("Nil" !== v[0]) {
735+ return undefined
736+ }else {
737+ return["Tuple2", ["Nil"], ["Nil"]]
738+ }
739+ }, function(v) {
740+ if("Cons" !== v[0]) {
741+ return undefined
742+ }else {
743+ var p_113 = v[1];
744+ var ps_114 = v[2];
745+ return function(v) {
746+ if("Tuple2" !== v[0]) {
747+ return undefined
748+ }else {
749+ if("Tuple2" !== v[1][0]) {
750+ return undefined
751+ }else {
752+ var x_115 = v[1][1];
753+ var y_116 = v[1][2];
754+ if("Tuple2" !== v[2][0]) {
755+ return undefined
756+ }else {
757+ var xs_117 = v[2][1];
758+ var ys_118 = v[2][2];
759+ return["Tuple2", ["Cons", x_115, xs_117], ["Cons", y_116, ys_118]]
760+ }
761+ }
762+ }
763+ }(["Tuple2", p_113, unzip(ps_114)])
764+ }
765+ }];
766+ for(var i = c.length;i--;) {
767+ var r = c[i](v);
768+ if(r !== undefined) {
769+ return r
770+ }
771+ }
772+ }()
773+ }
774+ function intersperse(sep_119) {
775+ return function(xs_120) {
776+ return function() {
777+ var v = xs_120;
778+ var c = [function(v) {
779+ if("Nil" !== v[0]) {
780+ return undefined
781+ }else {
782+ return["Nil"]
783+ }
784+ }, function(v) {
785+ if("Cons" !== v[0]) {
786+ return undefined
787+ }else {
788+ var a_124 = v[1];
789+ if("Nil" !== v[2][0]) {
790+ return undefined
791+ }else {
792+ return["Cons", a_124, ["Nil"]]
793+ }
794+ }
795+ }, function(v) {
796+ if("Cons" !== v[0]) {
797+ return undefined
798+ }else {
799+ var a_121 = v[1];
800+ if("Cons" !== v[2][0]) {
801+ return undefined
802+ }else {
803+ var b_122 = v[2][1];
804+ var cs_123 = v[2][2];
805+ return["Cons", a_121, ["Cons", sep_119, intersperse(sep_119)(["Cons", b_122, cs_123])]]
806+ }
807+ }
808+ }];
809+ for(var i = c.length;i--;) {
810+ var r = c[i](v);
811+ if(r !== undefined) {
812+ return r
813+ }
814+ }
815+ }()
816+ }
817+ }
818+ function intercalate(sep_125) {
819+ return function(xs_126) {
820+ return function() {
821+ var v = xs_126;
822+ var c = [function(v) {
823+ if("Nil" !== v[0]) {
824+ return undefined
825+ }else {
826+ return["Nil"]
827+ }
828+ }, function(v) {
829+ if("Cons" !== v[0]) {
830+ return undefined
831+ }else {
832+ var a_130 = v[1];
833+ if("Nil" !== v[2][0]) {
834+ return undefined
835+ }else {
836+ return a_130
837+ }
838+ }
839+ }, function(v) {
840+ if("Cons" !== v[0]) {
841+ return undefined
842+ }else {
843+ var a_127 = v[1];
844+ if("Cons" !== v[2][0]) {
845+ return undefined
846+ }else {
847+ var b_128 = v[2][1];
848+ var cs_129 = v[2][2];
849+ return Value.append(a_127, Value.append(sep_125, intercalate(sep_125)(["Cons", b_128, cs_129])))
850+ }
851+ }
852+ }];
853+ for(var i = c.length;i--;) {
854+ var r = c[i](v);
855+ if(r !== undefined) {
856+ return r
857+ }
858+ }
859+ }()
860+ }
861+ }
862+ function sort(xs) {
863+ if (xs[0] === "Nil") { return xs; }
864+ if (xs[0] !== "Cons") { throwError('sort'); }
865+ var arr = [];
866+ while (xs[0] === "Cons") {
867+ arr.push(xs[1]);
868+ xs = xs[2];
869+ }
870+ arr.sort(function(a,b) { return a - b});
871+ var out = ["Nil"];
872+ for (var i = arr.length; i--; ) {
873+ out = [ "Cons", arr[i], out ];
874+ }
875+ return out;
876+ }
877+ function take(n) { return function(xs) {
878+ if (n <= 0) { return ["Nil"]; }
879+ if (xs[0] === "Nil") { return xs; }
880+ if (xs[0] !== "Cons") { throwError('take'); }
881+ var out = [ "Cons", xs[1], ["Nil"] ];
882+ var temp = out;
883+ xs = xs[2];
884+ --n;
885+ while (xs[0] === "Cons" && n > 0) {
886+ temp[2] = [ "Cons", xs[1], ["Nil"] ];
887+ temp = temp[2];
888+ xs = xs[2];
889+ --n;
890+ }
891+ return out;
892+ };
893+ }
894+ function drop(n) { return function(xs) {
895+ if (xs[0] === "Nil") { return xs; }
896+ if (xs[0] !== "Cons") { throwError('drop'); }
897+ while (xs[0] === "Cons" && n > 0) {
898+ xs = xs[2];
899+ --n;
900+ }
901+ return xs;
902+ };
903+ }
904+ return {head:head,
905+ tail:tail,
906+ last:last,
907+ map:map,
908+ foldl:foldl,
909+ foldr:foldr,
910+ foldl1:foldl1,
911+ foldr1:foldr1,
912+ scanl:scanl,
913+ scanl1:scanl1,
914+ filter:filter,
915+ length:length,
916+ reverse:reverse,
917+ concat:concat,
918+ concatMap:concatMap,
919+ and:and,
920+ or:or,
921+ all:all,
922+ any:any,
923+ sum:sum,
924+ product:product,
925+ maximum:maximum,
926+ minimum:minimum,
927+ partition:partition,
928+ zipWith:zipWith,
929+ zip:zip,
930+ unzip:unzip,
931+ intersperse:intersperse,
932+ intercalate:intercalate,
933+ sort:sort,
934+ take:take,
935+ drop:drop};
936+}();
937+var Data = function() {
938+
939+var Char = function() {
940+ function isBetween(lo,hi) { return function(chr) {
941+ var c = chr.charCodeAt(0);
942+ return lo <= c && c <= hi;
943+ };
944+ }
945+ var isDigit = isBetween('0'.charCodeAt(0),'9'.charCodeAt(0));
946+ var chk1 = isBetween('a'.charCodeAt(0),'f'.charCodeAt(0));
947+ var chk2 = isBetween('A'.charCodeAt(0),'F'.charCodeAt(0));
948+
949+ return {fromCode : function(c) { return String.fromCharCode(c); },
950+ toCode : function(c) { return c.charCodeAt(0); },
951+ toUpper : function(c) { return c.toUpperCase(); },
952+ toLower : function(c) { return c.toLowerCase(); },
953+ toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },
954+ toLocaleLower : function(c) { return c.toLocaleLowerCase(); },
955+ isLower : isBetween('a'.charCodeAt(0),'z'.charCodeAt(0)),
956+ isUpper : isBetween('A'.charCodeAt(0),'Z'.charCodeAt(0)),
957+ isDigit : isDigit,
958+ isOctDigit : isBetween('0'.charCodeAt(0),'7'.charCodeAt(0)),
959+ isHexDigit : function(c) { return isDigit(c) || chk1(c) || chk2(c); }
960+ };
961+}();
962+
963+var Maybe = function() {
964+ function consMaybe(x) { return function(xs) {
965+ if (x[0] === "Just") return ["Cons", x[1], xs];
966+ return xs;
967+ };
968+ }
969+ function fromMaybe(b) { return function(m) {
970+ if (m[0] === "Just") return m[1];
971+ return b;
972+ };
973+ }
974+ function mapCons(f) { return function(y) { return function(xs) {
975+ var x = f(y);
976+ if (x[0] === "Just") return ["Cons", x[1], xs];
977+ return xs;
978+ };
979+ };
980+ }
981+ function maybe(b) { return function(f) { return function(m) {
982+ if (m[0] === "Just") return f(m[1]);
983+ return b;
984+ };
985+ };
986+ }
987+
988+ return {Just : function(x) { return ["Just",x]; },
989+ Nothing : ["Nothing"],
990+ catMaybes : List.foldr(consMaybe)(["Nil"]),
991+ isJust : function(m) { return m[0] === "Just"; },
992+ isNothing : function(m) { return m[0] === "Nothing"; },
993+ fromMaybe : fromMaybe,
994+ consMaybe : consMaybe,
995+ mapMaybe : function(f) { return List.foldr(mapCons(f))(["Nil"]); },
996+ maybe : maybe
997+ };
998+}();
999+
1000+/*
1001+var String = function() {
1002+
1003+ function append(s1) { return function(s2) {
1004+ return s1.concat(s2);
1005+ };
1006+ }
1007+ function map(f) { return function(s) {
1008+ for (var i = s.length; i--; ) { s[i] = f(s[i]); }
1009+ };
1010+ }
1011+
1012+ function intercalate(sep) { return function(ss) {
1013+ return Value.listToArray(ss).join(sep);
1014+ };
1015+ }
1016+ function intersperse(sep) { return function(s) {
1017+ return s.split("").join(sep);
1018+ };
1019+ }
1020+
1021+ function foldl(f) { return function(b) { return function(s) {
1022+ var acc = b;
1023+ for (var i = 0, len = s.length; i < len; ++i) { acc = f(s[i])(acc); }
1024+ return acc;
1025+ };
1026+ };
1027+ }
1028+ function foldr(f) { return function(b) { return function(s) {
1029+ var acc = b;
1030+ for (var i = s.length; i--; ) { acc = f(s[i])(acc); }
1031+ return acc;
1032+ };
1033+ };
1034+ }
1035+
1036+ function concatMap(f) { return function(s) {
1037+ var a = s.split("");
1038+ for (var i = a.length; i--; ) { a[i] = f(a[i]); }
1039+ return a.join("");
1040+ };
1041+ }
1042+
1043+ function forall(pred) { return function(s) {
1044+ for (var i = s.length; i--; ) { if (!pred(s[i])) {return false}; }
1045+ return true;
1046+ };
1047+ }
1048+ function exists(pred) { return function(s) {
1049+ for (var i = s.length; i--; ) { if (pred(s[i])) {return true}; }
1050+ return false;
1051+ };
1052+ }
1053+
1054+ return {cons : append,
1055+ snoc : append,
1056+ head : function(s) { return s[0]; },
1057+ last : function(s) { return s[s.length-1]; },
1058+ tail : function(s) { return s.slice(1); },
1059+ length : function(s) { return s.length; },
1060+ map : map,
1061+ intercalate : intercalate,
1062+ intersperse : intersperse,
1063+ reverse : function(s) { return s.split("").reverse().join(""); },
1064+ toLower : function(s) { return s.toLowerCase(); },
1065+ toUpper : function(s) { return s.toUpperCase(); },
1066+ foldl : foldl,
1067+ foldr : foldr,
1068+ concat : function(ss) { return Value.listToArray(ss).join(""); },
1069+ concatMap : concatMap,
1070+ forall : forall,
1071+ exists : exists,
1072+ //filter : filter,
1073+ //take:,
1074+ //drop:,
1075+ toText : Value.toText,
1076+ properEscape : Value.properEscape
1077+ };
1078+}();
1079+*/
1080+return {String: {toText:Value.toText, properEscape:Value.properEscape},
1081+ Char:Char,
1082+ Maybe:Maybe,
1083+ List:List
1084+ };
1085+}();var ElmCode = ElmCode || {};
1086+ElmCode.Graphics = ElmCode.Graphics || {};
1087+ElmCode.Graphics.Color = function() {
1088+ function Color_0(a1) {
1089+ return function(a2) {
1090+ return function(a3) {
1091+ return function(a4) {
1092+ return["Color", a1, a2, a3, a4]
1093+ }
1094+ }
1095+ }
1096+ }
1097+ var rgba_1 = Color_0;
1098+ var red_3 = ["Color",255,0,0,1];
1099+ var green_4 = ["Color",0,255,0,1];
1100+ var blue_5 = ["Color",0,0,255,1];
1101+ var yellow_6 = ["Color",255,255,0,1];
1102+ var cyan_7 = ["Color",0,255,255,1];
1103+ var magenta_8 = ["Color",255,0,255,1];
1104+ var black_9 = ["Color",0,0,0,1];
1105+ var white_10 = ["Color",255,255,255,1];
1106+ var gray_11 = ["Color",128,128,128,1];
1107+ var grey_12 = ["Color",128,128,128,1];
1108+ function rgb_2(r_13) {
1109+ return function(g_14) {
1110+ return function(b_15) {
1111+ return ["Color",r_13,g_14,b_15,1]
1112+ }
1113+ }
1114+ }
1115+ function extract(c) {
1116+ if (c[4] === 1) { return 'rgb(' + c[1] + ',' + c[2] + ',' + c[3] + ')'; }
1117+ return 'rgba(' + c[1] + ',' + c[2] + ',' + c[3] + ',' + c[4] + ')';
1118+ }
1119+ return{rgba:rgba_1, rgb:rgb_2, red:red_3, green:green_4, blue:blue_5, yellow:yellow_6, cyan:cyan_7, magenta:magenta_8, black:black_9, white:white_10, gray:gray_11, grey:grey_12,extract:extract}
1120+}();
1121+var Collage = function() {
1122+
1123+function tracePoints(ctx,points) {
1124+ var i = points.length - 1;
1125+ if (i <= 0) return;
1126+ ctx.moveTo(points[i][1], points[i][2]);
1127+ while (i--) { ctx.lineTo(points[i][1], points[i][2]); }
1128+}
1129+
1130+function solid(ctx,color,points) {
1131+ tracePoints(ctx,points);
1132+ ctx.strokeStyle = ElmCode.Graphics.Color.extract(color);
1133+ ctx.stroke();
1134+};
1135+
1136+function filled(ctx,color,points) {
1137+ tracePoints(ctx,points);
1138+ ctx.fillStyle = ElmCode.Graphics.Color.extract(color);
1139+ ctx.fill();
1140+}
1141+
1142+function textured(redo,ctx,src,points) {
1143+ var img = new Image();
1144+ img.src = Foreign.JavaScript.castStringToJSString(src);
1145+ img.onload = redo;
1146+
1147+ tracePoints(ctx,points);
1148+ ctx.fillStyle = ctx.createPattern(img,'repeat');
1149+ ctx.fill();
1150+}
1151+
1152+function customLine(pattern,ctx,color,points) {
1153+ if (pattern.length === 0) { pattern = [8,4]; }
1154+ customLineHelp(ctx, pattern, points);
1155+ ctx.strokeStyle = ElmCode.Graphics.Color.extract(color);
1156+ ctx.stroke();
1157+};
1158+
1159+var customLineHelp = function(ctx, pattern, points) {
1160+ var i = points.length - 1;
1161+ if (i <= 0) return;
1162+ var x0 = points[i][1], y0 = points[i][2];
1163+ var x1=0, y1=0, dx=0, dy=0, remaining=0, nx=0, ny=0;
1164+ var pindex = 0, plen = pattern.length;
1165+ var draw = true, segmentLength = pattern[0];
1166+ ctx.moveTo(x0,y0);
1167+ while (i--) {
1168+ x1 = points[i][1]; y1 = points[i][2];
1169+ dx = x1 - x0; dy = y1 - y0;
1170+ remaining = Math.sqrt(dx * dx + dy * dy);
1171+ while (segmentLength <= remaining) {
1172+ x0 += dx * segmentLength / remaining;
1173+ y0 += dy * segmentLength / remaining;
1174+ ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);
1175+ // update starting position
1176+ dx = x1 - x0; dy = y1 - y0;
1177+ remaining = Math.sqrt(dx * dx + dy * dy);
1178+ // update pattern
1179+ draw = !draw;
1180+ pindex = (pindex + 1) % plen;
1181+ segmentLength = pattern[pindex];
1182+ }
1183+ if (remaining > 0) {
1184+ ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);
1185+ segmentLength -= remaining;
1186+ }
1187+ x0 = x1; y0 = y1;
1188+ }
1189+};
1190+
1191+function drawLine(ctx,form) {
1192+ var points = form[3][1];
1193+ switch(form[1][0]) {
1194+ case "Solid" : return solid(ctx,form[2],points);
1195+ case "Dotted": return customLine([3,3],ctx,form[2],points);
1196+ case "Dashed": return customLine([8,4],ctx,form[2],points);
1197+ case "Custom": return customLine(form[1][1],ctx,form[2],points);
1198+ }
1199+};
1200+
1201+function drawShape(redo,ctx,shapeStyle,color,points) {
1202+ switch(shapeStyle[0]) {
1203+ case "Filled": return filled(ctx,color,points);
1204+ case "Outlined": return solid(ctx,color,points);
1205+ case "Textured": return textured(redo,ctx,shapeStyle[1],points);
1206+ case "CustomOutline":
1207+ return customLine(shapeStyle[1],ctx,color,points);
1208+ }
1209+};
1210+
1211+function drawImage(redo,ctx,w,h,src) {
1212+ var img = new Image();
1213+ img.onload = redo;
1214+ img.src = Foreign.JavaScript.castStringToJSString(src);
1215+ ctx.drawImage(img,-w/2,-h/2,w,h);
1216+}
1217+
1218+function renderForm(redo,ctx,theta,scale,x,y,form) {
1219+ ctx.save();
1220+ if (x !== 0 || y !== 0) ctx.translate(x,y);
1221+ if (theta !== ~~theta) ctx.rotate(2*Math.PI*theta);
1222+ if (scale !== 1) ctx.scale(scale,scale);
1223+ ctx.beginPath();
1224+ switch(form[0]) {
1225+ case "FLine": drawLine(ctx,form); break;
1226+ case "FShape": drawShape(redo,ctx,form[1],form[2],form[3][1]); break;
1227+ case "FImage": drawImage(redo,ctx,form[1],form[2],form[3]); break;
1228+ }
1229+ ctx.restore();
1230+};
1231+
1232+function renderForms(redo,ctx,w,h,forms) {
1233+ ctx.clearRect(0,0,w,h);
1234+ for (var i = forms.length; i--; ) {
1235+ var f = forms[i];
1236+ renderForm(redo,ctx,f[1],f[2],f[3][1],f[3][2],f[4]);
1237+ }
1238+}
1239+
1240+function collageForms(w,h,forms) {
1241+ var canvas = Render.newElement('canvas');
1242+ canvas.style.width = (~~w) + 'px';
1243+ canvas.style.height = (~~h) + 'px';
1244+ canvas.style.display = "block";
1245+ canvas.width = ~~w;
1246+ canvas.height = ~~h;
1247+ if (canvas.getContext) {
1248+ var ctx = canvas.getContext('2d');
1249+ var w = canvas.width, h = canvas.height;
1250+ function redo() { renderForms(this,ctx,w,h,forms); }
1251+ renderForms(redo,ctx,w,h,forms);
1252+ return canvas;
1253+ }
1254+ canvas.innerHTML = "Your browser does not support the canvas element.";
1255+ return canvas;
1256+};
1257+
1258+function collageElement(w,h,theta,scale,x,y,elem) {
1259+ var e = Render.render(elem);
1260+ var t = "translate(" + (x - elem[3] / 2) + "px,"+ (y - elem[4] / 2) + "px)";
1261+ var r = theta === (~~theta) ? "" : "rotate(" + theta*360 + "deg)";
1262+ var s = scale === 1 ? "" : "scale(" + scale + "," + scale + ")";
1263+ var transforms = t + " " + s + " " + r;
1264+ e.style.transform = transforms;
1265+ e.style.msTransform = transforms;
1266+ e.style.MozTransform = transforms;
1267+ e.style.webkitTransform = transforms;
1268+ e.style.OTransform = transforms;
1269+ var div = Render.newElement('div');
1270+ Render.addTo(div,e);
1271+ div.style.width = (~~w) + "px";
1272+ div.style.height = (~~h) + "px";
1273+ div.style.overflow = "hidden";
1274+ return div;
1275+}
1276+
1277+function collage(w,h,formss) {
1278+ if (formss.length === 0) { return collageForms(w,h,[]); }
1279+ var elems = new Array(formss.length);
1280+ for (var i = formss.length; i--; ) {
1281+ var f = formss[i];
1282+ if (typeof f[0] === "string") {
1283+ elems[i] = collageElement(w,h,f[1],f[2],f[3][1],f[3][2],f[4][1]);
1284+ } else {
1285+ elems[i] = collageForms(w,h,f);
1286+ }
1287+ }
1288+ if (formss.length === 1) { return elems[0]; }
1289+ return Render.flowWith(Render.goIn,function(x){return x},elems);
1290+}
1291+
1292+function updateFormSet(node,currSet,nextSet) {
1293+ if (Value.eq(nextSet,currSet)) return;
1294+ var w = node.style.width.slice(0,-2) - 0;
1295+ var h = node.style.height.slice(0,-2) - 0;
1296+ if (typeof nextSet[0] === "object") {
1297+ if (typeof currSet[0] === "object") {
1298+ if (node.getContext) {
1299+ var ctx = node.getContext('2d');
1300+ function redo() { renderForms(this,ctx,w,h,nextSet); }
1301+ return renderForms(redo,ctx,w,h,nextSet);
1302+ }
1303+ }
1304+ var newNode = collageForms(w,h,nextSet);
1305+ newNode.style.position = 'absolute';
1306+ return node.parentNode.replaceChild(newNode,node);
1307+ }
1308+ var f = nextSet;
1309+ var newNode = collageElement(w,h,f[1],f[2],f[3][1],f[3][2],f[4][1]);
1310+ newNode.style.position = 'absolute';
1311+ return node.parentNode.replaceChild(newNode,node);
1312+}
1313+
1314+// assumes that the form sets are the same length.
1315+function updateCollage(node,currs,nexts) {
1316+ if (nexts.length === 1) {
1317+ return updateFormSet(node,currs[0],nexts[0]);
1318+ }
1319+ var kids = node.childNodes;
1320+ var len = kids.length;
1321+ for (var i = len; i--; ) {
1322+ updateFormSet(kids[len-i-1], currs[i], nexts[i]);
1323+ }
1324+}
1325+
1326+function style(clr,n,list) {
1327+ return ["Tuple2",
1328+ '<span style="font-size:100%;color:' + clr + ';">' + n + '</span>',
1329+ list];
1330+}
1331+
1332+function insideForm(point) { return function(form) {
1333+ if (!inBoundsOf(point[1],point[2],form)) return false;
1334+ var hw, hh;
1335+ switch (form[4][0]) {
1336+ case "FShape": return insideShape(point,form[1],form[2],form[3],form[4][3][1]);
1337+ case "FLine": return false;
1338+ case "FImage":
1339+ hw = form[4][1] / 2;
1340+ hh = form[4][2] / 2;
1341+ break;
1342+ case "FElement":
1343+ hw = form[4][1][3] / 2;
1344+ hh = form[4][1][4] / 2;
1345+ break;
1346+ }
1347+ return insideShape(point,form[1],form[2],form[3],
1348+ [ [null, hw, hh],
1349+ [null,-hw, hh],
1350+ [null,-hw,-hh],
1351+ [null, hw,-hh],
1352+ [null, hw, hh] ]);
1353+ };
1354+}
1355+
1356+function inBoundsOf(px,py,form) {
1357+ if (form.length < 6) {
1358+ var fx = form[3][1], fy = form[3][2];
1359+ var radiusSquared = 0;
1360+ var scale = form[2];
1361+ switch (form[4][0]) {
1362+ case "FShape":
1363+ var points = form[4][3][1];
1364+ for (var i = points.length; --i; ) {
1365+ var p = points[i];
1366+ radiusSquared = Math.max(radiusSquared, p[1]*p[1] + p[2]*p[2]);
1367+ }
1368+ radiusSquared *= scale * scale;
1369+ break;
1370+ case "FLine":
1371+ break;
1372+ case "FImage":
1373+ var x = scale * form[4][1] / 2;
1374+ var y = scale * form[4][2] / 2;
1375+ radiusSquared = x*x + y*y;
1376+ break;
1377+ case "FElement":
1378+ var x = scale * form[4][1][3] / 2;
1379+ var y = scale * form[4][1][4] / 2;
1380+ radiusSquared = x*x + y*y;
1381+ break;
1382+ }
1383+ form.push(function(px,py) {
1384+ var dx = px - fx;
1385+ var dy = py - fy;
1386+ return dx*dx + dy*dy < radiusSquared + 1;
1387+ });
1388+ }
1389+ return form[5](px,py);
1390+}
1391+
1392+function insideShape(point,theta,scale,pos,points) {
1393+ var counter = 0;
1394+ var list = ["Nil"];
1395+ var p1,p2;
1396+
1397+ var x = (point[1] - pos[1]) / scale;
1398+ var y = (point[2] - pos[2]) / scale;
1399+ if (theta !== 0) {
1400+ var t = -2 * Math.PI * theta;
1401+ var nx = x * Math.cos(t) - y * Math.sin(t);
1402+ y = x * Math.sin(t) + y * Math.cos(t);
1403+ x = nx;
1404+ }
1405+
1406+ if (points.length === 0) { return false; }
1407+ p1 = points[0];
1408+ for (var i = points.length - 1; i--; ) {
1409+ p2 = points[i];
1410+ var p1x = p1[1], p1y = p1[2], p2x = p2[1], p2y = p2[2];
1411+
1412+ if (p1y < p2y) {var ymin=p1y, ymax=p2y;} else {var ymin=p2y, ymax=p1y;}
1413+ if (p1x < p2x) {var xmin=p1x, xmax=p2x;} else {var xmin=p2x, xmax=p1x;}
1414+
1415+ if (ymin < y && y <= ymax && x <= xmax) {
1416+ if (x <= xmin || x <= ((y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x)) {
1417+ ++counter;
1418+ }
1419+ }
1420+ p1 = p2;
1421+ }
1422+ return (counter % 2) === 1;
1423+}
1424+
1425+return {collage:collage, updateCollage:updateCollage, insideForm:insideForm};
1426+
1427+}();var ElmCode = ElmCode || {};
1428+ElmCode.Graphics = ElmCode.Graphics || {};
1429+ElmCode.Graphics.Element = function() {
1430+ var DLeft_0 = ["DLeft"];
1431+ var DRight_1 = ["DRight"];
1432+ var DUp_2 = ["DUp"];
1433+ var DDown_3 = ["DDown"];
1434+ var DIn_4 = ["DIn"];
1435+ var DOut_5 = ["DOut"];
1436+ function Absolute_12(a1) {
1437+ return["Absolute", a1]
1438+ }
1439+ function Relative_13(a1) {
1440+ return["Relative", a1]
1441+ }
1442+ var Near_14 = ["Near"];
1443+ var Mid_15 = ["Mid"];
1444+ var Far_16 = ["Far"];
1445+ function Position_17(a1) {
1446+ return function(a2) {
1447+ return["Position", a1, a2]
1448+ }
1449+ }
1450+ function PositionTL_18(a1) {
1451+ return function(a2) {
1452+ return["PositionTL", a1, a2]
1453+ }
1454+ }
1455+ function PositionTR_19(a1) {
1456+ return function(a2) {
1457+ return["PositionTR", a1, a2]
1458+ }
1459+ }
1460+ function PositionBL_20(a1) {
1461+ return function(a2) {
1462+ return["PositionBL", a1, a2]
1463+ }
1464+ }
1465+ function PositionBR_21(a1) {
1466+ return function(a2) {
1467+ return["PositionBR", a1, a2]
1468+ }
1469+ }
1470+ function Element_37(id,e,w,h,o,c,l) {
1471+ return["Element", id, e, w, h, o, c, l ]
1472+ }
1473+ function EText_39(a1) {
1474+ return function(a2) {
1475+ return["EText", a1, a2]
1476+ }
1477+ }
1478+ function EImage_40(a1) {
1479+ return["EImage", Foreign.JavaScript.castStringToJSString(a1)]
1480+ }
1481+ function EVideo_41(a1) {
1482+ return["EVideo", Foreign.JavaScript.castStringToJSString(a1)]
1483+ }
1484+ function EFittedImage_42(a1) {
1485+ return["EFittedImage", Foreign.JavaScript.castStringToJSString(a1)]
1486+ }
1487+ function EFlow_43(a1) {
1488+ return function(a2) {
1489+ return["EFlow", a1, Foreign.JavaScript.castListToJSArray(a2)]
1490+ }
1491+ }
1492+ function ECollage_44(a1) {
1493+ return function(a2) {
1494+ return function(a3) {
1495+ return["ECollage", a1, a2, Value.groupForms(a3)]
1496+ }
1497+ }
1498+ }
1499+ var EEmpty_45 = ["EEmpty"];
1500+ function EContainer_46(a1) {
1501+ return function(a2) {
1502+ return["EContainer", a1, a2]
1503+ }
1504+ }
1505+ var Solid_68 = ["Solid"];
1506+ var Dotted_69 = ["Dotted"];
1507+ var Dashed_70 = ["Dashed"];
1508+ function Custom_71(a1) {
1509+ return["Custom", Foreign.JavaScript.castListToJSArray(a1)]
1510+ }
1511+ var Filled_72 = ["Filled"];
1512+ var Outlined_73 = ["Outlined"];
1513+ function CustomOutline_74(a1) {
1514+ return["CustomOutline", Foreign.JavaScript.castListToJSArray(a1)]
1515+ }
1516+ function Line_75(a1) {
1517+ return["Line", Foreign.JavaScript.castListToJSArray(a1)]
1518+ }
1519+ function Shape_78(a1) {
1520+ return function(a2) {
1521+ var points = Foreign.JavaScript.castListToJSArray(a1);
1522+ if (points.length > 0) { points.push(points[0]); }
1523+ return["Shape", points, a2];
1524+ }
1525+ }
1526+ function Form_84(a1) {
1527+ return function(a2) {
1528+ return function(a3) {
1529+ return function(a4) {
1530+ return["Form", a1, a2, a3, a4]
1531+ }
1532+ }
1533+ }
1534+ }
1535+ function FLine_85(a1) {
1536+ return function(a2) {
1537+ return function(a3) {
1538+ return["FLine", a1, a2, a3]
1539+ }
1540+ }
1541+ }
1542+ function FShape_86(a1) {
1543+ return function(a2) {
1544+ return function(a3) {
1545+ return["FShape", a1, a2, a3]
1546+ }
1547+ }
1548+ }
1549+ function FImage_87(a1) {
1550+ return function(a2) {
1551+ return function(a3) {
1552+ return["FImage", a1, a2, Foreign.JavaScript.castStringToJSString(a3)]
1553+ }
1554+ }
1555+ }
1556+ function FElement_88(a1) {
1557+ return["FElement", a1]
1558+ }
1559+ var left_6 = DLeft_0;
1560+ var right_7 = DRight_1;
1561+ var down_8 = DDown_3;
1562+ var up_9 = DUp_2;
1563+ var inward_10 = DIn_4;
1564+ var outward_11 = DOut_5;
1565+ var topLeft_22 = Position_17(Near_14)(Near_14);
1566+ var topRight_23 = Position_17(Far_16)(Near_14);
1567+ var bottomLeft_24 = Position_17(Near_14)(Far_16);
1568+ var bottomRight_25 = Position_17(Far_16)(Far_16);
1569+ var midLeft_26 = Position_17(Near_14)(Mid_15);
1570+ var midRight_27 = Position_17(Far_16)(Mid_15);
1571+ var midTop_28 = Position_17(Mid_15)(Near_14);
1572+ var midBottom_29 = Position_17(Mid_15)(Far_16);
1573+ var middle_30 = Position_17(Mid_15)(Mid_15);
1574+ function middleAt(a1) {
1575+ return function(a2) {
1576+ return["PositionAt", a1, a2]
1577+ }
1578+ }
1579+ var topLeftAt_31 = PositionTL_18;
1580+ var topRightAt_32 = PositionTR_19;
1581+ var bottomLeftAt_33 = PositionBL_20;
1582+ var bottomRightAt_34 = PositionBR_21;
1583+ var absolute_35 = Absolute_12;
1584+ var relative_36 = Relative_13;
1585+ function newElement_38(e,w,h,o,c,l) { return Element_37(Guid.guid(),e,w,h,o,c,l); }
1586+ function basicNewElement(e,w,h) { return Element_37(Guid.guid(),e,w,h,1,Nothing,Nothing); }
1587+ var line_76 = Line_75;
1588+ var polygon_79 = Shape_78;
1589+ function sprite_96(src) {
1590+ return function(w) {
1591+ return function(h) {
1592+ return function(pos) {
1593+ return Form_84(0)(1)(pos)(FImage_87(w)(h)(src))
1594+ }
1595+ }
1596+ }
1597+ }
1598+ function toForm_97(pos) {
1599+ return function(e) {
1600+ return Form_84(0)(1)(pos)(FElement_88(e))
1601+ }
1602+ }
1603+ function width_47(w__101) {
1604+ return function(e) {
1605+ var be = e[2];
1606+ switch(be[0]) {
1607+ case "EImage":
1608+ case "EVideo":
1609+ return newElement_38(e[2],w__101,e[4] * w__101 / e[3], e[5], e[6], e[7]);
1610+ case "EText":
1611+ var p = Value.getTextSize(w__101,e[4],be[2]);
1612+ return newElement_38(e[2], w__101, p[1], e[5], e[6], e[7]);
1613+ }
1614+ return newElement_38(e[2], w__101, e[4], e[5], e[6], e[7]);
1615+ }
1616+ }
1617+ function height_48(h__108) {
1618+ return function(e) {
1619+ var be = e[2];
1620+ switch(be[0]) {
1621+ case "EImage":
1622+ case "EVideo":
1623+ return newElement_38(e[2], e[3] * h__108 / e[4], h__108, e[5], e[6], e[7]);
1624+ }
1625+ return newElement_38(e[2], e[3], h__108, e[5], e[6], e[7]);
1626+ }
1627+ }
1628+ function size_49(w) {
1629+ return function(h) {
1630+ return function(e) {
1631+ return newElement_38(e[2], w, h, e[5], e[6], e[7]);
1632+ }
1633+ }
1634+ }
1635+ function opacity_50(o) {
1636+ return function(e) {
1637+ return newElement_38(e[2], e[3], e[4], o, e[6], e[7]);
1638+ }
1639+ }
1640+ function color_51(c) {
1641+ return function(e) {
1642+ return newElement_38(e[2], e[3], e[4], e[5], Just(c), e[7]);
1643+ }
1644+ }
1645+ function link(lnk) {
1646+ return function(e) {
1647+ return newElement_38(e[2], e[3], e[4], e[5], e[6], Just(Foreign.JavaScript.castStringToJSString(lnk)));
1648+ }
1649+ }
1650+ function widthOf_52(e) { return ~~e[3]; }
1651+ function heightOf_53(e) { return ~~e[4]; }
1652+ function sizeOf_54(e) { return["Tuple2", ~~e[3], ~~e[4]] }
1653+ function text_56(txt) {
1654+ var p = Value.getTextSize(0,0,txt);
1655+ return basicNewElement(EText_39("left")(txt), p[0], p[1])
1656+ }
1657+ function plainText(str) {
1658+ var txt = Value.toText(str);
1659+ var p = Value.getTextSize(0,0,txt);
1660+ return basicNewElement(EText_39("left")(txt),p[0],p[1])
1661+ }
1662+ function asText(v) {
1663+ var txt = monospace(Value.toText(Value.show(v)));
1664+ var p = Value.getTextSize(0,0,txt);
1665+ return basicNewElement(EText_39("left")(txt),p[0],p[1])
1666+ }
1667+ function centeredText(txt) {
1668+ var p = Value.getTextSize(0,0,txt);
1669+ return basicNewElement(EText_39("center")(txt),p[0],p[1])
1670+ }
1671+ function justifiedText(txt) {
1672+ var p = Value.getTextSize(0,0,txt);
1673+ return basicNewElement(EText_39("justify")(txt),p[0],p[1])
1674+ }
1675+ function rightedText(txt) {
1676+ var p = Value.getTextSize(0,0,txt);
1677+ return basicNewElement(EText_39("right")(txt),p[0],p[1])
1678+ }
1679+ function image_57(w) {
1680+ return function(h) {
1681+ return function(src) {
1682+ return basicNewElement(EImage_40(src),w,h)
1683+ }
1684+ }
1685+ }
1686+ function images(srcs) {
1687+ var pics = Elm.Input(spacer_66(0)(0));
1688+ var update = Elm.Lift(function(src) {
1689+ src = Foreign.JavaScript.castStringToJSString(src);
1690+ var img = new Image();
1691+ img.onload = function() {
1692+ Dispatcher.notify(pics.id,
1693+ image_57(this.width)(this.height)(src));
1694+ };
1695+ img.src = src;
1696+ }, [srcs]);
1697+ var combine = Elm.Lift(function(x) { return function(y) { return x; } },
1698+ [pics,update]);
1699+ return combine;
1700+ }
1701+ function video_58(w) {
1702+ return function(h) {
1703+ return function(src) {
1704+ return basicNewElement(EVideo_41(src),w,h)
1705+ }
1706+ }
1707+ }
1708+ function fittedImage_59(w_147) {
1709+ return function(h_148) {
1710+ return function(s_149) {
1711+ return basicNewElement(EFittedImage_42(s_149),w_147,h_148)
1712+ }
1713+ }
1714+ }
1715+ function flow_60(dir_150) {
1716+ return function(es_151) {
1717+ return function() {
1718+ var w_152 = function() {
1719+ var ws_154 = map(widthOf_52)(es_151);
1720+ return function(case1) {
1721+ var case0 = case1;
1722+ switch(case0[0]) {
1723+ case "DLeft":
1724+ return sum(ws_154);
1725+ case "DRight":
1726+ return sum(ws_154)
1727+ }
1728+ return maximum(ws_154)
1729+ }(dir_150)
1730+ }();
1731+ var h_153 = function() {
1732+ var hs_155 = map(heightOf_53)(es_151);
1733+ return function(case3) {
1734+ var case2 = case3;
1735+ switch(case2[0]) {
1736+ case "DDown":
1737+ return sum(hs_155);
1738+ case "DUp":
1739+ return sum(hs_155)
1740+ }
1741+ return maximum(hs_155)
1742+ }(dir_150)
1743+ }();
1744+ return basicNewElement(EFlow_43(dir_150)(es_151), w_152, h_153)
1745+ }()
1746+ }
1747+ }
1748+ function above_61(e1_156) {
1749+ return function(e2_157) {
1750+ return basicNewElement(EFlow_43(DDown_3)(["Cons", e1_156, ["Cons", e2_157, ["Nil"]]]), max(widthOf_52(e1_156))(widthOf_52(e2_157)), heightOf_53(e1_156) + heightOf_53(e2_157))
1751+ }
1752+ }
1753+ function below_62(e1_158) {
1754+ return function(e2_159) {
1755+ return basicNewElement(EFlow_43(DDown_3)(["Cons", e2_159, ["Cons", e1_158, ["Nil"]]]), max(widthOf_52(e1_158))(widthOf_52(e2_159)), heightOf_53(e1_158) + heightOf_53(e2_159))
1756+ }
1757+ }
1758+ function beside_63(e1_160) {
1759+ return function(e2_161) {
1760+ return basicNewElement(EFlow_43(DRight_1)(["Cons", e1_160, ["Cons", e2_161, ["Nil"]]]), widthOf_52(e1_160) + widthOf_52(e2_161), max(heightOf_53(e1_160))(heightOf_53(e2_161)))
1761+ }
1762+ }
1763+ function layers_64(es_162) {
1764+ return basicNewElement(EFlow_43(DOut_5)(es_162), maximum(map(widthOf_52)(es_162)), maximum(map(heightOf_53)(es_162)))
1765+ }
1766+ function collage_65(w_163) {
1767+ return function(h_164) {
1768+ return function(forms_165) {
1769+ return basicNewElement(ECollage_44(w_163)(h_164)(forms_165),w_163,h_164)
1770+ }
1771+ }
1772+ }
1773+ function spacer_66(w_166) {
1774+ return function(h_167) {
1775+ return basicNewElement(EEmpty_45,w_166,h_167)
1776+ }
1777+ }
1778+ function container_67(w_169) {
1779+ return function(h_170) {
1780+ return function(pos_168) {
1781+ return function(e_171) {
1782+ return basicNewElement(EContainer_46(pos_168)(e_171),w_169,h_170)
1783+ }
1784+ }
1785+ }
1786+ }
1787+ function segment_77(p1_172) {
1788+ return function(p2_173) {
1789+ return Line_75(["Cons", p1_172, ["Cons", p2_173, ["Nil"]]])
1790+ }
1791+ }
1792+ function rect_80(w_174) {
1793+ return function(h_175) {
1794+ return function(pos_176) {
1795+ return Shape_78(["Cons", ["Tuple2", 0 - w_174 / 2, 0 - h_175 / 2],
1796+ ["Cons", ["Tuple2", 0 - w_174 / 2, h_175 / 2],
1797+ ["Cons", ["Tuple2", w_174 / 2, h_175 / 2],
1798+ ["Cons", ["Tuple2", w_174 / 2, 0 - h_175 / 2], ["Nil"]]]]])(pos_176)
1799+ }
1800+ }
1801+ }
1802+ function oval_81(w_177) {
1803+ return function(h_178) {
1804+ return function(pos_179) {
1805+ return function() {
1806+ var n_180 = 50;
1807+ return function() {
1808+ function f_181(i_182) {
1809+ return["Tuple2", w_177 / 2 * cos(2 * (pi / n_180) * i_182), h_178 / 2 * sin(2 * (pi / n_180) * i_182)]
1810+ }
1811+ return Shape_78(map(f_181)(function() {
1812+ var lo = 0;
1813+ var hi = n_180 - 1;
1814+ var lst = ["Nil"];
1815+ if(lo <= hi) {
1816+ do {
1817+ var lst = ["Cons", hi, lst]
1818+ }while(hi-- > lo)
1819+ }
1820+ return lst
1821+ }()))(pos_179)
1822+ }()
1823+ }()
1824+ }
1825+ }
1826+ }
1827+ function circle_82(r_183) {
1828+ return oval_81(2 * r_183)(2 * r_183)
1829+ }
1830+ function ngon_83(n_184) {
1831+ return function(r_185) {
1832+ return function(pos_186) {
1833+ return function() {
1834+ var m_187 = toFloat(n_184);
1835+ return function() {
1836+ function f_188(i_189) {
1837+ return["Tuple2", r_185 * cos(2 * (pi / m_187) * i_189), r_185 * sin(2 * (pi / m_187) * i_189)]
1838+ }
1839+ return Shape_78(map(f_188)(function() {
1840+ var lo = 0;
1841+ var hi = n_184 - 1;
1842+ var lst = ["Nil"];
1843+ if(lo <= hi) {
1844+ do {
1845+ var lst = ["Cons", hi, lst]
1846+ }while(hi-- > lo)
1847+ }
1848+ return lst
1849+ }()))(pos_186)
1850+ }()
1851+ }()
1852+ }
1853+ }
1854+ }
1855+ function solid_89(clr_190) {
1856+ return function(ln_191) {
1857+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Solid_68)(clr_190)(ln_191))
1858+ }
1859+ }
1860+ function dotted_90(clr_192) {
1861+ return function(ln_193) {
1862+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dotted_69)(clr_192)(ln_193))
1863+ }
1864+ }
1865+ function dashed_91(clr_194) {
1866+ return function(ln_195) {
1867+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dashed_70)(clr_194)(ln_195))
1868+ }
1869+ }
1870+ function customLine_92(pattern_196) {
1871+ return function(clr_197) {
1872+ return function(ln_198) {
1873+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Custom_71(pattern_196))(clr_197)(ln_198))
1874+ }
1875+ }
1876+ }
1877+ function filled_93(clr) {
1878+ return function(shape) {
1879+ return Form_84(0)(1)(shape[2])(FShape_86(Filled_72)(clr)(shape));
1880+ }
1881+ }
1882+ function outlined_94(clr) {
1883+ return function(shape) {
1884+ return Form_84(0)(1)(shape[2])(FShape_86(Outlined_73)(clr)(shape));
1885+ }
1886+ }
1887+ function customOutline_95(pattern) {
1888+ return function(clr) {
1889+ return function(shape) {
1890+ return Form_84(0)(1)(shape[2])(FShape_86(CustomOutline_74(pattern))(clr)(shape));
1891+ }
1892+ }
1893+ }
1894+ function textured(src) {
1895+ return function(shape) {
1896+ return Form_84(0)(1)(shape[2])(FShape_86(["Textured",src])(null)(shape));
1897+ }
1898+ }
1899+ function rotate_98(t_212) {
1900+ return function(Form$thetascaleposform_213) {
1901+ return function(case5) {
1902+ var case0 = case5;
1903+ switch(case0[0]) {
1904+ case "Form":
1905+ var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1906+ return Form_84(t_212 + case1)(case2)(case3)(case4)
1907+ }
1908+ throw"Non-exhaustive pattern match in case";
1909+ }(Form$thetascaleposform_213)
1910+ }
1911+ }
1912+ function scale_99(s) {
1913+ return function(form) {
1914+ return Form_84(form[1])(s * form[2])(form[3])(form[4])
1915+ }
1916+ }
1917+ function move_100(x_224) {
1918+ return function(y_225) {
1919+ return function(Form$thetascaleTuple2$pxpyform_226) {
1920+ return function(case7) {
1921+ var case0 = case7;
1922+ switch(case0[0]) {
1923+ case "Form":
1924+ var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1925+ switch(case3[0]) {
1926+ case "Tuple2":
1927+ var case5 = case3[1], case6 = case3[2];
1928+ return Form_84(case1)(case2)(["Tuple2", x_224 + case5, y_225 + case6])(case4)
1929+ }
1930+ break
1931+ }
1932+ throw"Non-exhaustive pattern match in case";
1933+ }(Form$thetascaleTuple2$pxpyform_226)
1934+ }
1935+ }
1936+ }
1937+ return{left:left_6, right:right_7, down:down_8, up:up_9, inward:inward_10, outward:outward_11, topLeft:topLeft_22, topRight:topRight_23, bottomLeft:bottomLeft_24, bottomRight:bottomRight_25, midLeft:midLeft_26, midRight:midRight_27, midTop:midTop_28, midBottom:midBottom_29, middle:middle_30, middleAt:middleAt, topLeftAt:topLeftAt_31, topRightAt:topRightAt_32, bottomLeftAt:bottomLeftAt_33, bottomRightAt:bottomRightAt_34, absolute:absolute_35, relative:relative_36, width:width_47, height:height_48, size:size_49, opacity:opacity_50,
1938+ color:color_51, link:link, widthOf:widthOf_52, heightOf:heightOf_53, sizeOf:sizeOf_54, text:text_56, asText:asText, plainText:plainText, centeredText:centeredText, justifiedText:justifiedText, rightedText:rightedText, image:image_57, images:images, video:video_58, fittedImage:fittedImage_59, flow:flow_60, above:above_61, below:below_62, beside:beside_63, layers:layers_64, collage:collage_65, spacer:spacer_66, container:container_67, line:line_76, segment:segment_77, polygon:polygon_79, rect:rect_80, oval:oval_81, circle:circle_82, ngon:ngon_83, solid:solid_89, dotted:dotted_90, dashed:dashed_91, customLine:customLine_92, filled:filled_93,
1939+ outlined:outlined_94, customOutline:customOutline_95, textured:textured, sprite:sprite_96, toForm:toForm_97, rotate:rotate_98, scale:scale_99, move:move_100,
1940+ isWithin: Collage.insideForm}
1941+}();
1942+var Text = function() {
1943+ function fromString(s) { return Value.toText(s); }
1944+
1945+ var addTag = function(tag) { return function(text) {
1946+ return '<' + tag + ' style="padding:0;margin:0">' + text + '</' + tag + '>';
1947+ };
1948+ };
1949+ var addStyle = function(style, value) { return function(text) {
1950+ return "<span style='" + style + ":" + value + "'>" + text + "</span>";
1951+ };
1952+ };
1953+
1954+ var typeface = function(name) {
1955+ name = Foreign.JavaScript.castStringToJSString(name);
1956+ return addStyle('font-family', name);
1957+ };
1958+ var size = function(px) {
1959+ return addStyle('font-size', px + 'px');
1960+ };
1961+ var header = addTag('h1');
1962+ var height = function(h) { return addStyle('font-size', h+'em'); }
1963+ var italic = addStyle('font-style', 'italic');
1964+ var bold = addTag('b');
1965+ var color = function(c) {
1966+ return addStyle('color', ElmCode.Graphics.Color.extract(c));
1967+ };
1968+ var underline = addStyle('text-decoration', 'underline');
1969+ var overline = addStyle('text-decoration', 'overline');
1970+ var strikeThrough = addStyle('text-decoration', 'line-through');
1971+ var link = function(href) { return function(text) {
1972+ return "<a href='" + fromString(href) + "'>" + text + "</a>";
1973+ };
1974+ };
1975+
1976+ return {fromString : fromString,
1977+ toText: fromString,
1978+ header : header,
1979+ height : height,
1980+ italic : italic,
1981+ bold : bold,
1982+ underline : underline,
1983+ overline : overline,
1984+ strikeThrough : strikeThrough,
1985+ monospace : typeface('monospace'),
1986+ typeface : typeface,
1987+ color : color,
1988+ link : link };
1989+}();
1990+var Render = function(){
1991+
1992+function newElement(elementType) {
1993+ var e = document.createElement(elementType);
1994+ e.style.padding = "0";
1995+ e.style.margin = "0";
1996+ return e;
1997+};
1998+
1999+function addTo(container, elem) {
2000+ container.appendChild(elem);
2001+};
2002+
2003+function makeText(pos,txt) {
2004+ var e = newElement('div');
2005+ e.innerHTML = txt;
2006+ e.style.textAlign = pos;
2007+ return e;
2008+};
2009+
2010+function image(src) {
2011+ var img = newElement('img');
2012+ img.src = src;
2013+ img.name = src;
2014+ img.style.display = "block";
2015+ return img;
2016+}
2017+
2018+function fittedImage(w,h,src) {
2019+ var canvas = newElement('canvas');
2020+ canvas.style.display = "block";
2021+ canvas.style.width = w + 'px';
2022+ canvas.style.height = h + 'px';
2023+ canvas.width = w;
2024+ canvas.height = h;
2025+ canvas.innerHTML = "Your browser does not support the canvas element.";
2026+
2027+ var img = newElement('img');
2028+ img.onload = function() {
2029+ if (canvas.getContext) {
2030+ var ctx = canvas.getContext('2d');
2031+ var sx = 0, sy = 0, sWidth = this.width, sHeight = this.height;
2032+ if (w / h > this.width / this.height) {
2033+ sHeight = this.width * h / w;
2034+ sy = (this.height - sHeight) / 2;
2035+ } else {
2036+ sWidth = this.height * w / h;
2037+ sx = (this.width - sWidth) / 2;
2038+ }
2039+ ctx.drawImage(img, sx, sy, sWidth, sHeight,
2040+ 0,0, canvas.width, canvas.height);
2041+ }
2042+ };
2043+ img.src = src;
2044+ return canvas;
2045+};
2046+
2047+var video = function(src) {
2048+ var e = newElement('video');
2049+ e.controls = "controls";
2050+ var source = newElement('source');
2051+ source.src = src;
2052+ var segs = src.split('.');
2053+ source.type = "video/" + segs[segs.length-1];
2054+ addTo(e, source);
2055+ e.style.display = "block";
2056+ return e;
2057+};
2058+
2059+function divify(e) {
2060+ var div = newElement('div');
2061+ addTo(div, e);
2062+ return div;
2063+};
2064+function goDown(e) {
2065+ return e //.tagName === "DIV" ? e : divify(e);
2066+};
2067+function goRight(e) {
2068+ e.style.styleFloat = "left";
2069+ e.style.cssFloat = "left";
2070+ return e;
2071+};
2072+function goIn(e) {
2073+ e.style.position = 'absolute';
2074+ return e;
2075+};
2076+function flowWith(f, prep, elist) {
2077+ var container = newElement('div');
2078+ for (var i = elist.length; i--; ) {
2079+ addTo(container, f(prep(elist[i])));
2080+ }
2081+ return container;
2082+};
2083+
2084+function flow(dir,elist) {
2085+ switch(dir) {
2086+ case "DDown": elist = elist.slice(0).reverse();
2087+ case "DUp": return flowWith(goDown,render,elist);
2088+ case "DRight": elist = elist.slice(0).reverse();
2089+ case "DLeft": return flowWith(goRight,render,elist);
2090+ case "DOut": elist = elist.slice(0).reverse();
2091+ case "DIn": return flowWith(goIn,render,elist);
2092+ };
2093+};
2094+
2095+function toPos(pos) {
2096+ switch(pos[0]) {
2097+ case "Absolute": return pos[1] + "px";
2098+ case "Relative": return (pos[1] * 100) + "%";
2099+ }
2100+}
2101+
2102+function setPos(pos,e) {
2103+ e.style.position = 'absolute';
2104+ e.style.margin = 'auto';
2105+ switch(pos[0]) {
2106+ case "Position":
2107+ if (pos[1][0] !== "Far") e.style.left = 0;
2108+ if (pos[1][0] !== "Near") e.style.right = 0;
2109+ if (pos[2][0] !== "Far") e.style.top = 0;
2110+ if (pos[2][0] !== "Near") e.style.bottom = 0;
2111+ break;
2112+ case "PositionAt":
2113+ e.style.top = toPos(pos[2]);
2114+ e.style.left = toPos(pos[1]);
2115+ var shift = "translate(" + (-elem[3]/2) + "px," + (-elem[4]/2) + "px)";
2116+ e.style.transform = shift;
2117+ e.style.msTransform = shift;
2118+ e.style.MozTransform = shift;
2119+ e.style.webkitTransform = shift;
2120+ e.style.OTransform = shift;
2121+ break;
2122+ default:
2123+ var p = pos[0].slice(-2);
2124+ e.style[p[0] === "T" ? 'top' : 'bottom'] = toPos(pos[2]);
2125+ e.style[p[1] === "L" ? 'left' : 'right'] = toPos(pos[1]);
2126+ }
2127+}
2128+
2129+function container(pos,elem) {
2130+ var e = render(elem);
2131+ setPos(pos,e);
2132+ var div = newElement('div');
2133+ div.style.position = "relative";
2134+ div.style.overflow = "hidden";
2135+ addTo(div,e);
2136+ return div;
2137+};
2138+
2139+function render(elem) {
2140+ var e = {};
2141+ switch(elem[2][0]) {
2142+ case "EText": e = makeText(elem[2][1],elem[2][2]); break;
2143+ case "EImage": e = image(elem[2][1]); break;
2144+ case "EVideo": e = video(elem[2][1]); break;
2145+ case "EFittedImage": e = fittedImage(elem[3],elem[4],elem[2][1]); break;
2146+ case "EFlow": e = flow(elem[2][1][0],elem[2][2]); break;
2147+ case "ECollage": e = Collage.collage(elem[2][1],elem[2][2],elem[2][3]); break;
2148+ case "EEmpty": e = newElement('div'); break;
2149+ case "EContainer": e = container(elem[2][1],elem[2][2]); break;
2150+ case "EHtml":
2151+ e = elem[2][1];
2152+ if (e.type !== 'button') {
2153+ var p = Value.getExcess(e);
2154+ elem[3] -= p[0];
2155+ elem[4] -= p[1];
2156+ }
2157+ break;
2158+ case "EExternalHtml":
2159+ e = newElement('div');
2160+ addTo(e, elem[2][1]);
2161+ break;
2162+ }
2163+ e.id = elem[1];
2164+ e.style.width = (~~elem[3]) + 'px';
2165+ e.style.height = (~~elem[4]) + 'px';
2166+ if (elem[5] !== 1) { e.style.opacity = elem[5]; }
2167+ if (elem[6][0] === "Just") {
2168+ e.style.backgroundColor = ElmCode.Graphics.Color.extract(elem[6][1]);
2169+ }
2170+ if (elem[7][0] === "Just") {
2171+ var a = newElement('a');
2172+ a.href = elem[7][1];
2173+ addTo(a,e);
2174+ return a;
2175+ }
2176+ return e;
2177+};
2178+
2179+function update(node,curr,next) {
2180+ if (node.tagName === 'A') { node = node.firstChild; }
2181+ if (curr[1] === next[1]) return;
2182+ if (curr[2][0] !== next[2][0]) {
2183+ return node.parentNode.replaceChild(render(next),node);
2184+ }
2185+ var nextE = next[2], currE = curr[2];
2186+ switch(nextE[0]) {
2187+ case "EText":
2188+ if (nextE[1] !== currE[1]) node.style.textAlign = nextE[1];
2189+ if (nextE[2] !== currE[2]) node.innerHTML = nextE[2];
2190+ break;
2191+ case "EImage":
2192+ if (nextE[1] !== currE[1]) node.src = nextE[1];
2193+ break;
2194+ case "EVideo":
2195+ case "EFittedImage":
2196+ if (!Value.eq(nextE,currE) || next[3]!==curr[3] || next[4]!==curr[4]) {
2197+ return node.parentNode.replaceChild(render(next),node);
2198+ }
2199+ break;
2200+ case "ECollage":
2201+ if (nextE[1] !== currE[1] || nextE[2] !== currE[2] || nextE[3].length !== currE[3].length) {
2202+ return node.parentNode.replaceChild(render(next),node);
2203+ }
2204+ Collage.updateCollage(node,currE[3],nextE[3]);
2205+ break;
2206+ case "EFlow":
2207+ if (nextE[1] !== currE[1]) {
2208+ return node.parentNode.replaceChild(render(next),node);
2209+ }
2210+ var nexts = nextE[2];
2211+ var kids = node.childNodes;
2212+ if (nexts.length !== kids.length) {
2213+ return node.parentNode.replaceChild(render(next),node);
2214+ }
2215+ var currs = currE[2];
2216+ var goDir = {};
2217+ switch(nextE[1][0]) {
2218+ case "DDown": case "DUp": goDir = goDown; break;
2219+ case "DRight": case "DLeft": goDir = goRight; break;
2220+ case "DOut": case "DIn": goDir = goIn; break;
2221+ }
2222+ for (var i = kids.length; i-- ;) {
2223+ update(kids[i],currs[i],nexts[i]);
2224+ goDir(kids[i]);
2225+ }
2226+ break;
2227+ case "EContainer":
2228+ update(node.childNodes[0],currE[2],nextE[2]);
2229+ setPos(nextE[1],node.childNodes[0]);
2230+ break;
2231+ case "EEmpty":
2232+ break;
2233+ case "EHtml":
2234+ if (next[1] !== curr[1]) {
2235+ var e = render(next);
2236+ node.parentNode.replaceChild(e,node);
2237+ node = e;
2238+ }
2239+ if (e.type !== 'button') {
2240+ var p = Value.getExcess(node);
2241+ next[3] -= p[0];
2242+ next[4] -= p[1];
2243+ }
2244+ break;
2245+ case "EExternalHtml":
2246+ if (next[1] !== curr[1])
2247+ node.parentNode.replaceChild(render(next),node);
2248+ break;
2249+ }
2250+ if (next[3] !== curr[3]) node.style.width = (~~next[3]) + 'px';
2251+ if (next[4] !== curr[4]) node.style.height = (~~next[4]) + 'px';
2252+ if (next[5] !== curr[5]) node.style.opacity = next[5];
2253+ if (next[6].length === 2) {
2254+ var clr = ElmCode.Graphics.Color.extract(next[6][1]);
2255+ if (clr !== node.style.backgroundColor) node.style.backgroundColor = clr;
2256+ }
2257+ if (next[7].length === 2) {
2258+ if (curr[7].length === 1 || next[7][1] !== curr[7][1]) node.parentNode.href = next[7][1];
2259+ }
2260+ next[1] = curr[1];
2261+}
2262+
2263+return {render:render,update:update,addTo:addTo,newElement:newElement,flowWith:flowWith,goIn:goIn};
2264+
2265+}();
2266+var Elm = function() {
2267+ var send = function(node, timestep, changed) {
2268+ var kids = node.kids;
2269+ for (var i = kids.length; i--; ) {
2270+ kids[i].recv(timestep, changed, node.id);
2271+ }
2272+ };
2273+ var input = function(base) {
2274+ this.id = Guid.guid();
2275+ this.value = base;
2276+ this.kids = [];
2277+ this.defaultNumberOfKids = 0;
2278+ this.recv = function(timestep, eid, v) {
2279+ var changed = eid === this.id;
2280+ if (changed) { this.value = v; }
2281+ send(this, timestep, changed);
2282+ return changed;
2283+ };
2284+ Dispatcher.inputs.push(this);
2285+ };
2286+ var lift = function(func,args) {
2287+ this.id = Guid.guid();
2288+ this.value = null;
2289+ this.kids = [];
2290+ this.count = 0;
2291+ this.changed = false;
2292+
2293+ args.reverse();
2294+ this.recalc = function() {
2295+ var f = func;
2296+ for (var i = args.length; i--; ) {
2297+ f = f(args[i].value);
2298+ }
2299+ this.value = f;
2300+ };
2301+ this.recalc();
2302+
2303+ this.recv = function(timestep, changed, parentID) {
2304+ this.count += 1;
2305+ if (changed) { this.changed = true; }
2306+ if (this.count == args.length) {
2307+ if (this.changed) { this.recalc() }
2308+ send(this, timestep, this.changed);
2309+ this.changed = false;
2310+ this.count = 0;
2311+ }
2312+ };
2313+ for (var i = args.length; i--; ) {
2314+ args[i].kids.push(this);
2315+ }
2316+ };
2317+ var fold = function(func,base,baseIsFunc,input) {
2318+ this.id = Guid.guid();
2319+ this.value = baseIsFunc ? base(input.value) : base;
2320+ this.kids = [];
2321+ this.recv = function(timestep, changed, parentID) {
2322+ if (changed) { this.value = func(input.value)(this.value); }
2323+ send(this, timestep, changed);
2324+ };
2325+ input.kids.push(this);
2326+ };
2327+
2328+ var dropIf = function(pred,base,input) {
2329+ this.id = Guid.guid();
2330+ this.value = pred(input.value) ? base : input.value;
2331+ this.kids = [];
2332+ this.recv = function(timestep, changed, parentID) {
2333+ var chng = changed && !pred(input.value);
2334+ if (chng) { this.value = input.value; }
2335+ send(this, timestep, chng);
2336+ };
2337+ input.kids.push(this);
2338+ };
2339+ var dropRepeats = function(input) {
2340+ this.id = Guid.guid();
2341+ this.value = input.value;
2342+ this.kids = [];
2343+ this.recv = function(timestep, changed, parentID) {
2344+ var chng = changed && !eq(this.value,input.value);
2345+ if (chng) { this.value = input.value; }
2346+ send(this, timestep, chng);
2347+ };
2348+ input.kids.push(this);
2349+ };
2350+
2351+ var dropWhen = function(s1) { return function(b) { return function(s2) {
2352+ var pairs = new lift(function(x){return function(y){return [x,y];};},[s1,s2]);
2353+ var dropped = new dropIf(function(p){return p[0];},[true,b],pairs);
2354+ return new lift(function(p){return p[1];},[dropped]); }; };
2355+ };
2356+
2357+ var sampleOn = function(s1,s2) {
2358+ this.id = Guid.guid();
2359+ this.value = s2.value;
2360+ this.kids = [];
2361+ this.count = 0;
2362+ this.changed = false;
2363+
2364+ this.recv = function(timestep, changed, parentID) {
2365+ if (parentID === s1.id) this.changed = changed;
2366+ this.count += 1;
2367+ if (this.count == 2) {
2368+ if (this.changed) { this.value = s2.value; }
2369+ send(this, timestep, this.changed);
2370+ this.count = 0;
2371+ this.changed = false;
2372+ }
2373+ };
2374+ s1.kids.push(this);
2375+ s2.kids.push(this);
2376+ };
2377+
2378+ return {Input: function(x) {return new input(x);},
2379+ Lift: function(f,xs){return new lift(f,xs);},
2380+ Fold: function(f,b,x){return new fold(f,b,false,x);},
2381+ Fold1: function(f,b,x){return new fold(f,b,true,x);},
2382+ keepIf : function(pred) { return function(base) { return function(sig) {
2383+ return new dropIf(function(x) { return !pred(x)},base,sig); }; }; },
2384+ dropIf : function(pred) { return function(base) { return function(sig) {
2385+ return new dropIf(pred,base,sig); }; }; },
2386+ keepWhen : function(s) { return dropWhen(new lift(function(b){return !b;},[s])); },
2387+ dropWhen : dropWhen,
2388+ dropRepeats : function(s) { return new dropRepeats(s);},
2389+ sampleOn : function(s1) { return function(s2) { return new sampleOn(s1,s2); }; }
2390+ };
2391+}();
2392+
2393+var Dispatcher = function() {
2394+ var program = null;
2395+ var timestep = 0;
2396+ var inputs = [];
2397+ var currentElement = null;
2398+
2399+ var initialize = function() {
2400+ program = ElmCode.main();
2401+ if (!program.hasOwnProperty('recv')) {
2402+ program = Elm.Input(program);
2403+ }
2404+
2405+ currentElement = program.value;
2406+ filterDeadInputs();
2407+
2408+ var content = document.getElementById('content');
2409+ content.appendChild(Render.render(currentElement));
2410+ var w = document.getElementById('widthChecker').offsetWidth;
2411+ if (w !== window.innerWidth) {
2412+ Dispatcher.notify(Window.dimensions.id, Value.Tuple(w, window.innerHeight));
2413+ }
2414+ program = Elm.Lift(function(value) {
2415+ var content = document.getElementById('content');
2416+ Render.update(content.firstChild,currentElement,value);
2417+ currentElement = value;
2418+ return value;
2419+ }, [program]);
2420+ };
2421+ var notify = function(id, v) {
2422+ timestep += 1;
2423+ //console.log(timestep);
2424+ var hasListener = false;
2425+ for (var i = inputs.length; i--; ) {
2426+ hasListener = inputs[i].recv(timestep, id, v) || hasListener;
2427+ }
2428+ return hasListener;
2429+ };
2430+
2431+ function isAlive(input) {
2432+ if (!input.hasOwnProperty('defaultNumberOfKids')) return true;
2433+ var len = input.kids.length;
2434+ if (len == 0) return false;
2435+ if (len > input.defaultNumberOfKids) return true;
2436+ var alive = false;
2437+ for (var i = len; i--; ) {
2438+ alive = alive || isAlive(input.kids[i]);
2439+ }
2440+ return alive;
2441+ }
2442+ function filterDeadInputs() {
2443+ var temp = [];
2444+ for (var i = inputs.length; i--; ) {
2445+ if (isAlive(inputs[i])) temp.push(inputs[i]);
2446+ }
2447+ inputs = temp;
2448+ }
2449+
2450+ return {initialize:initialize, notify:notify, inputs:inputs};
2451+}();
2452+var Signal = function() {
2453+ function wrap(elem) {
2454+ var p = Value.getSize(elem);
2455+ return ["Element", Guid.guid(), ["EHtml",elem], p[0], p[1], 1, Nothing, Nothing];
2456+ }
2457+ function toElmString(str) {
2458+ var out = ["Nil"];
2459+ for (var i = str.length; i--; ) {
2460+ out = ["Cons", str[i], out];
2461+ }
2462+ return out;
2463+ }
2464+ var addListener = function() {
2465+ if(document.addEventListener) {
2466+ return function(element, event, handler) {
2467+ element.addEventListener(event, handler, false);
2468+ };
2469+ }
2470+ else {
2471+ return function(element, event, handler) {
2472+ element.attachEvent('on' + event, handler);
2473+ };
2474+ }
2475+ }();
2476+
2477+ var Mouse = function() {
2478+ var position = Elm.Input(Value.Tuple(0,0));
2479+ position.defaultNumberOfKids = 2;
2480+
2481+ var x = Elm.Lift(function(p){return p[1];},[position]);
2482+ x.defaultNumberOfKids = 0;
2483+ var y = Elm.Lift(function(p){return p[2];},[position]);
2484+ y.defaultNumberOfKids = 0;
2485+
2486+ var isDown = Elm.Input(false);
2487+ var isClicked = Elm.Input(false);
2488+ var clicks = Elm.Input(Value.Tuple());
2489+
2490+ function getXY(e) {
2491+ var posx = 0;
2492+ var posy = 0;
2493+ if (!e) var e = window.event;
2494+ if (e.pageX || e.pageY) {
2495+ posx = e.pageX;
2496+ posy = e.pageY;
2497+ } else if (e.clientX || e.clientY) {
2498+ posx = e.clientX + document.body.scrollLeft +
2499+ document.documentElement.scrollLeft;
2500+ posy = e.clientY + document.body.scrollTop +
2501+ document.documentElement.scrollTop;
2502+ }
2503+ return Value.Tuple(posx, posy);
2504+ }
2505+
2506+ addListener(document, 'click', function(e) {
2507+ var hasListener1 = Dispatcher.notify(isClicked.id, true);
2508+ var hasListener2 = Dispatcher.notify(clicks.id, Value.Tuple());
2509+ Dispatcher.notify(isClicked.id, false);
2510+ if (!hasListener1 && !hasListener2)
2511+ this.removeEventListener('click',arguments.callee,false);
2512+ });
2513+ addListener(document, 'mousedown', function(e) {
2514+ var hasListener = Dispatcher.notify(isDown.id, true);
2515+ if (!hasListener)
2516+ this.removeEventListener('mousedown',arguments.callee,false);
2517+ });
2518+ addListener(document, 'mouseup', function(e) {
2519+ var hasListener = Dispatcher.notify(isDown.id, false);
2520+ if (!hasListener)
2521+ this.removeEventListener('mouseup',arguments.callee,false);
2522+ });
2523+ addListener(document, 'mousemove', function(e) {
2524+ var hasListener = Dispatcher.notify(position.id, getXY(e));
2525+ if (!hasListener)
2526+ this.removeEventListener('mousemove',arguments.callee,false);
2527+ });
2528+ var clickedOn = function(elem) {
2529+ var node = Render.render(elem);
2530+ var click = Elm.Input(false);
2531+ addListener(node, 'click', function(e) {
2532+ Dispatcher.notify(click.id, true);
2533+ Dispatcher.notify(click.id, false);
2534+ });
2535+ return Value.Tuple(wrap(node), click);
2536+ };
2537+ return {position: position,
2538+ x:x,
2539+ y:y,
2540+ isClicked: isClicked,
2541+ isDown: isDown,
2542+ clicks: clicks,
2543+ isClickedOn: clickedOn
2544+ };
2545+ }();
2546+
2547+ var Time = function() {
2548+ var every = function(t) {
2549+ t *= 1000;
2550+ var clock = Elm.Input(0);
2551+ var time = 0;
2552+ setInterval(function() {
2553+ time += t;
2554+ Dispatcher.notify(clock.id, time/1000);
2555+ }, t);
2556+ return clock;
2557+ };
2558+ var after = function(t) {
2559+ t *= 1000;
2560+ var thread = Elm.Input(false);
2561+ setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
2562+ return thread;
2563+ };
2564+ var before = function(t) {
2565+ t *= 1000;
2566+ var thread = Elm.Input(true);
2567+ setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
2568+ return thread;
2569+ };
2570+ return {every:every,after:after,before:before};
2571+ }();
2572+
2573+ var Window = function() {
2574+ var dimensions = Elm.Input(Value.Tuple(window.innerWidth,window.innerHeight));
2575+ dimensions.defaultNumberOfKids = 2;
2576+
2577+ var width = Elm.Lift(function(p){return p[1];},[dimensions]);
2578+ width.defaultNumberOfKids = 0;
2579+ var height = Elm.Lift(function(p){return p[2];},[dimensions]);
2580+ height.defaultNumberOfKids = 0;
2581+
2582+ addListener(window, 'resize', function(e) {
2583+ var w = document.getElementById('widthChecker').offsetWidth;
2584+ var hasListener = Dispatcher.notify(dimensions.id, Value.Tuple(w, window.innerHeight));
2585+ if (!hasListener)
2586+ this.removeEventListener('resize',arguments.callee,false);
2587+ });
2588+ return {dimensions:dimensions,width:width,height:height};
2589+ }();
2590+
2591+ var Keyboard = { Raw : function() {
2592+ var keysDown = Elm.Input(["Nil"]);
2593+ var charPressed = Elm.Input(["Nothing"]);
2594+ function remove(x,xs) {
2595+ if (xs[0] === "Nil") return xs;
2596+ if (xs[1] === x) return xs[2];
2597+ return ["Cons", xs[1], remove(x,xs[2])];
2598+ }
2599+ function has(x,xs) {
2600+ while (xs[0] !== "Nil") {
2601+ if (xs[1] === x) return true;
2602+ xs = xs[2];
2603+ }
2604+ return false;
2605+ }
2606+ addListener(document, 'keydown', function(e) {
2607+ if (has(e.keyCode, keysDown.value)) return;
2608+ var hasListener = Dispatcher.notify(keysDown.id, ["Cons", e.keyCode, keysDown.value]);
2609+ if (!hasListener)
2610+ this.removeEventListener('keydown',arguments.callee,false);
2611+ });
2612+ addListener(document, 'keyup', function(e) {
2613+ var codes = remove(e.keyCode, keysDown.value);
2614+ var hasListener = Dispatcher.notify(keysDown.id, codes);
2615+ if (!hasListener)
2616+ this.removeEventListener('keyup',arguments.callee,false);
2617+ });
2618+ addListener(window, 'blur', function(e) {
2619+ var hasListener = Dispatcher.notify(keysDown.id, ["Nil"]);
2620+ if (!hasListener)
2621+ this.removeEventListener('blur',arguments.callee,false);
2622+ });
2623+ addListener(document, 'keypress', function(e) {
2624+ var hasListener = Dispatcher.notify(charPressed.id, ["Just",e.charCode || e.keyCode]);
2625+ Dispatcher.notify(charPressed.id, ["Nothing"]);
2626+ if (!hasListener)
2627+ this.removeEventListener('keypress',arguments.callee,false);
2628+ });
2629+ return {keysDown:keysDown,
2630+ charPressed:charPressed};
2631+ }()
2632+ };
2633+
2634+ var HTTP = function() {
2635+
2636+ function request(verb) { return function(url) { return function(data) {
2637+ return function(headers) {
2638+ return {0 : "Request",
2639+ length : 1,
2640+ verb : Foreign.JavaScript.castStringToJSString(verb),
2641+ url : Foreign.JavaScript.castStringToJSString(url),
2642+ data : data === null ? null : Foreign.JavaScript.castStringToJSString(data),
2643+ headers : headers }; }; }; };
2644+ }
2645+ function get(url) { return request("GET")(url)(null)(["Nil"]); }
2646+ function post(url) { return function(data) {
2647+ return request("POST")(url)(data)(["Nil"]); }; }
2648+
2649+ function sendReq(responses) { return function(req) {
2650+ Dispatcher.notify(responses.id,["Waiting"]);
2651+ var request = null;
2652+ if (window.XMLHttpRequest) {
2653+ request = new XMLHttpRequest();
2654+ } else if (window.ActiveXObject) {
2655+ request = new ActiveXObject("Microsoft.XMLHTTP");
2656+ }
2657+ request.onreadystatechange = function(e) {
2658+ if (request.readyState === 4) {
2659+ Dispatcher.notify(
2660+ responses.id,
2661+ request.status === 200
2662+ ? ["Success", toElmString(request.responseText)]
2663+ : ["Failure", request.status, toElmString(request.statusText)]);
2664+ }
2665+ };
2666+ request.open(req.verb, req.url, true);
2667+ List.map(function(pair) {
2668+ request.setRequestHeader(
2669+ Foreign.JavaScript.castStringToJSString(pair[1]),
2670+ Foreign.JavaScript.castStringToJSString(pair[2]));
2671+ })(req.headers);
2672+ request.send(req.data);
2673+ return null;
2674+ };
2675+ }
2676+
2677+ function send(requests) {
2678+ var responses = Elm.Input(["Waiting"]);
2679+ var sender = Elm.Lift(sendReq(responses), [requests]);
2680+ var combine = Elm.Lift(function(x){return function(y){return x;}},
2681+ [responses,sender]);
2682+ return combine;
2683+ }
2684+
2685+ return {get : get,
2686+ post : post,
2687+ request : request,
2688+ send : send,
2689+ sendGet : function(urls){return send(Elm.Lift(get,[urls]));}
2690+ };
2691+ }();
2692+ var Random = function() {
2693+ var inRange = function(min) { return function(max) {
2694+ return Elm.Input(Math.floor(Math.random() * (max-min+1)) + min);
2695+ };
2696+ };
2697+ var randomize = function(min) { return function(max) { return function(signal) {
2698+ return Elm.Lift(function(x) { return Math.floor(Math.random() * (max-min+1)) + min;},[signal]);
2699+ };
2700+ };
2701+ };
2702+ return { inRange:inRange, randomize:randomize };
2703+ }();
2704+ var Input = function() {
2705+ var newTextInput = function(elem, ghostText) {
2706+ elem.placeholder = Foreign.JavaScript.castStringToJSString(ghostText);
2707+ var str = Elm.Input(["Nil"]);
2708+ addListener(elem, 'keyup', function(e) {
2709+ Dispatcher.notify(str.id, toElmString(elem.value));
2710+ elem.focus();
2711+ });
2712+ elem.style.padding = "1px";
2713+ return Value.Tuple(wrap(elem), str);
2714+ };
2715+ var newElement = function(name) {
2716+ var e = document.createElement(name);
2717+ e.style.padding = "0";
2718+ e.style.margin = "0";
2719+ return e;
2720+ };
2721+ var textArea = function(cols) { return function(rows) {
2722+ var textarea = newElement('textarea');
2723+ textarea.rows = rows;
2724+ textarea.cols = cols;
2725+ return newTextInput(textarea, "");
2726+ };
2727+ };
2728+ var textField = function(ghostText) {
2729+ var field = newElement('input');
2730+ field.type = 'text';
2731+ return newTextInput(field, ghostText);
2732+ };
2733+ var password = function(ghostText) {
2734+ var field = newElement('input');
2735+ field.type = 'password';
2736+ return newTextInput(field, ghostText);
2737+ };
2738+ var checkbox = function(checked) {
2739+ var box = newElement('input');
2740+ box.type = 'checkbox';
2741+ box.checked = checked;
2742+ var status = Elm.Input(checked);
2743+ addListener(box, 'change', function(e) {
2744+ Dispatcher.notify(status.id, box.checked);
2745+ });
2746+ return Value.Tuple(wrap(box), status);
2747+ };
2748+ var dropDown = function(options) {
2749+ var slct = newElement('select');
2750+ var opts = [];
2751+ while (options[0] === "Cons") {
2752+ var opt = newElement('option');
2753+ var str = Text.toText(options[1][1]);
2754+ opt.value = str;
2755+ opt.innerHTML = str;
2756+ slct.appendChild(opt);
2757+ opts.push(options[1][2]);
2758+ options = options[2];
2759+ }
2760+ var status = Elm.Input(opts[0]);
2761+ addListener(slct, 'change', function(e) {
2762+ Dispatcher.notify(status.id, opts[slct.selectedIndex]);
2763+ });
2764+ return Value.Tuple(wrap(slct), status);
2765+ };
2766+ var stringDropDown = function(opts) {
2767+ return dropDown(List.map (function(x) {return Value.Tuple(x,x);}) (opts));
2768+ };
2769+ var button = function(name) {
2770+ var b = newElement('input');
2771+ b.type = "button";
2772+ b.value = Foreign.JavaScript.castStringToJSString(name);
2773+ var press = Elm.Input(false);
2774+ addListener(b, 'click', function(e) {
2775+ Dispatcher.notify(press.id, true);
2776+ Dispatcher.notify(press.id, false);
2777+ });
2778+ return Value.Tuple(wrap(b),press);
2779+ };
2780+ return {textArea:textArea, textField:textField,
2781+ password:password, checkbox:checkbox,
2782+ dropDown:dropDown, stringDropDown:stringDropDown,
2783+ button:button};
2784+ }();
2785+
2786+ return {addListener:addListener,
2787+ Mouse:Mouse,
2788+ Keyboard:Keyboard,
2789+ Time:Time,
2790+ Window:Window,
2791+ HTTP:HTTP,
2792+ Random:Random,
2793+ Input:Input,
2794+ constant : function(v) { return Elm.Input(v); },
2795+ lift : function(f){return function(e){return Elm.Lift(f,[e]);};},
2796+ lift2 : function(f) { return function(e1) { return function(e2) {
2797+ return Elm.Lift(f, [e1,e2]); }; }; },
2798+ lift3 : function(f) { return function(e1) { return function(e2) {
2799+ return function(e3){return Elm.Lift(f,[e1,e2,e3]);};};};},
2800+ lift4 : function(f) { return function(e1) { return function(e2) {
2801+ return function(e3) { return function(e4) {
2802+ return Elm.Lift(f, [e1,e2,e3,e4]); }; }; }; }; },
2803+ foldp : function(f) { return function(b) { return function(e) {
2804+ return Elm.Fold(f,b,e); }; }; },
2805+ foldp_ : function(f) { return function(b) { return function(e) {
2806+ return Elm.Fold1(f,b,e); }; }; },
2807+ foldp1 : function(f) { return function(e) {
2808+ return Elm.Fold1(f,function(x){return x;},e); }; },
2809+ count : function(sig){return Elm.Fold(function(_){return function(c){return c+1;};},0,sig)},
2810+ keepIf : Elm.keepIf,
2811+ dropIf : Elm.dropIf,
2812+ keepWhen : Elm.keepWhen,
2813+ dropWhen : Elm.dropWhen,
2814+ dropRepeats : Elm.dropRepeats,
2815+ sampleOn : Elm.sampleOn
2816+ };
2817+}();
2818+var Prelude = function() {
2819+ var mod = function(x) { return function(y) {
2820+ var r = x % y;
2821+ var m = x==0 ? 0 : (y>0 ? (x>=0 ? r : r+y) : -mod(-x)(-y));
2822+ return m == y ? 0 : m;
2823+ }; };
2824+
2825+ var min = function(x) { return function(y) { return Math.min(x,y); }; };
2826+ var max = function(x) { return function(y) { return Math.max(x,y); }; };
2827+
2828+ var flip=function(f){return function(x){return function(y){return f(y)(x);};};};
2829+ var clamp = function(lo) { return function(hi) {
2830+ return function(x) { return Math.min(hi, Math.max(lo, x)); };
2831+ };
2832+ };
2833+ var curry = function(f) { return function(x) { return function(y) {
2834+ return f(["Tuple2",x,y]); }; };
2835+ };
2836+ var uncurry = function(f) { return function(p) {
2837+ if (p[0] !== "Tuple2") {
2838+ throw "Function was uncurry'd but was not given a pair.";
2839+ }
2840+ return f(p[1])(p[2]); };
2841+ };
2842+
2843+ var logBase=function(b){return function(x){return Math.log(x)/Math.log(b);};};
2844+
2845+ return {id : function(x) { return x; },
2846+ not : function(b) { return !b; },
2847+ fst : function(p) { return p[1]; },
2848+ snd : function(p) { return p[2]; },
2849+ rem : function(x) { return function(y) { return x % y; }; },
2850+ div : function(x) { return function(y) { return ~~(x / y); }; },
2851+ compare : function(x) { return function (y) {
2852+ x = (typeof x === "object") ? toText(x) : x;
2853+ y = (typeof y === "object") ? toText(y) : y;
2854+ return [ x === y ? 'EQ' : (x < y ? 'LT' : 'GT') ];
2855+ };
2856+ },
2857+ toFloat : function(x) { return x; },
2858+ round : function(n) { return Math.round(n); },
2859+ floor : function(n) { return Math.floor(n); },
2860+ ceiling : function(n) { return Math.ceil(n); },
2861+ truncate : function(n) { return ~~n; },
2862+ sqrt : Math.sqrt,
2863+ abs : Math.abs,
2864+ pi : Math.PI,
2865+ e : Math.E,
2866+ sin : Math.sin,
2867+ cos : Math.cos,
2868+ tan : Math.tan,
2869+ asin : Math.asin,
2870+ acos : Math.acos,
2871+ atan : Math.atan,
2872+ atan2 : function(y) { return function(x) { return Math.atan2(y,x); }; },
2873+ mod : mod,
2874+ min : min,
2875+ max : max,
2876+ flip : flip,
2877+ clamp : clamp,
2878+ curry : curry,
2879+ uncurry : uncurry,
2880+ logBase : logBase,
2881+ Just : Data.Maybe.Just,
2882+ Nothing : Data.Maybe.Nothing,
2883+ maybe : Data.Maybe.maybe,
2884+ map : Data.List.map,
2885+ filter : Data.List.filter,
2886+ head : Data.List.head,
2887+ tail : Data.List.tail,
2888+ last : Data.List.last,
2889+ length : Data.List.length,
2890+ reverse : Data.List.reverse,
2891+ foldr : Data.List.foldr,
2892+ foldr1 : Data.List.foldr1,
2893+ foldl : Data.List.foldl,
2894+ foldl1 : Data.List.foldl1,
2895+ and : Data.List.and,
2896+ or : Data.List.or,
2897+ all : Data.List.all,
2898+ any : Data.List.any,
2899+ sum : Data.List.sum,
2900+ product : Data.List.product,
2901+ concat : Data.List.concat,
2902+ concatMap : Data.List.concatMap,
2903+ maximum : Data.List.maximum,
2904+ minimum : Data.List.minimum,
2905+ scanl : Data.List.scanl,
2906+ scanl1 : Data.List.scanl1,
2907+ take : Data.List.take,
2908+ drop : Data.List.drop,
2909+ lift : Signal.lift,
2910+ lift2 : Signal.lift2,
2911+ lift3 : Signal.lift3,
2912+ lift4 : Signal.lift4,
2913+ foldp : Signal.foldp,
2914+ foldp1 : Signal.foldp1,
2915+ foldp_ : Signal.foldp_,
2916+ constant : Signal.constant,
2917+ count : Signal.count,
2918+ keepIf : Signal.keepIf,
2919+ dropIf : Signal.dropIf,
2920+ keepWhen : Signal.keepWhen,
2921+ dropWhen : Signal.dropWhen,
2922+ dropRepeats : Signal.dropRepeats,
2923+ sampleOn : Signal.sampleOn
2924+ };
2925+}();
2926+var eq = Value.eq;
2927+
2928+Signal.addListener(document, 'elm_log', function(e) { console.log(e.value); });
2929+Signal.addListener(document, 'elm_title', function(e) { document.title = e.value; });
2930+Signal.addListener(document, 'elm_redirect', function(e) {
2931+ if (e.value.length > 0) { window.location = e.value; }
2932+ });
2933+
2934+var includeGlobal = this;
2935+(function() {
2936+ var include = function(library) {
2937+ for (var i in library) {
2938+ if (i === 'Internal') continue;
2939+ try {
2940+ includeGlobal[i] = library[i];
2941+ } catch (err) {
2942+ if (i === 'length') {
2943+ includeGlobal.execScript('var length;');
2944+ length = library[i];
2945+ continue;
2946+ }
2947+ }
2948+ }
2949+ };
2950+ var includeAs = function(name) { return function(library) {
2951+ includeGlobal[name] = includeGlobal[name] || {};
2952+ for (var i in library) {
2953+ if (i === 'Internal') continue;
2954+ includeGlobal[name][i] = library[i];
2955+ }
2956+ };
2957+ };
2958+ include (Element);
2959+ include (Text);
2960+
2961+ color = Element.color;
2962+ height = Element.height;
2963+ show = Value.show;
2964+
2965+ include (ElmCode.Graphics.Color);
2966+ include (ElmCode.Graphics.Element);
2967+
2968+ includeAs ('Time') (Signal.Time);
2969+ includeAs ('Mouse') (Signal.Mouse);
2970+ includeAs ('Keyboard') (Signal.Keyboard);
2971+ includeAs ('Window') (Signal.Window);
2972+ includeAs ('HTTP') (Signal.HTTP);
2973+ includeAs ('Input') (Signal.Input);
2974+ includeAs ('Random') (Signal.Random);
2975+
2976+}());
2977+
2978+var ElmCode = ElmCode || {};
2979+ElmCode.Data = Data;
2980+ElmCode.Signal = Signal;
2981+ElmCode.Data.List = List;
2982+ElmCode.Foreign = Foreign;
2983+ElmCode.Prelude = Prelude;
2984+ElmCode.Graphics.Text = Text;
2985+try{
2986+
2987+if (ElmCode.Automaton) throw "Module name collision, 'Automaton' is already defined.";
2988+ElmCode.Automaton=function(){
2989+try{if (!(ElmCode.Prelude instanceof Object)) throw 'module not found'; } catch(e) {throw "Module 'Prelude' is missing. Compile with --make flag or load missing module in a separate JavaScript file.";}
2990+var hiddenVars=[];
2991+for(var i in ElmCode.Prelude){
2992+if (hiddenVars.indexOf(i) >= 0) continue;
2993+this[i]=ElmCode.Prelude[i];}
2994+try{if (!(ElmCode.Data.List instanceof Object)) throw 'module not found'; } catch(e) {throw "Module 'Data.List' is missing. Compile with --make flag or load missing module in a separate JavaScript file.";}
2995+var unzip=ElmCode.Data.List.unzip;
2996+function Automaton_0(a1){
2997+return ["Automaton",a1];};
2998+var Listen_9=["Listen"];
2999+var Ignore_10=["Ignore"];
3000+function DragFrom_11(a1){
3001+return ["DragFrom",a1];};
3002+var count_8=init_6(0)(function(__75){
3003+return function(c_76){
3004+return (1+c_76);};});
3005+function run_1(Automaton$m0_15){
3006+return function(input_16){
3007+return function(case2){
3008+var case0=case2;
3009+switch(case0[0]){
3010+case "Automaton":
3011+var case1=case0[1];
3012+return lift(fst)(foldp_(function(a_18){
3013+return function(Tuple2$bAutomaton$m_19){
3014+return function(case7){
3015+var case3=case7;
3016+switch(case3[0]){
3017+case "Tuple2":
3018+var case4=case3[1],case5=case3[2];
3019+switch(case5[0]){
3020+case "Automaton":
3021+var case6=case5[1];
3022+return case6(a_18);
3023+}break;
3024+}
3025+throw "Non-exhaustive pattern match in case";}(Tuple2$bAutomaton$m_19);};})(case1)(input_16));
3026+}
3027+throw "Non-exhaustive pattern match in case";}(Automaton$m0_15);};};
3028+function step_2(a_22){
3029+return function(Automaton$m_23){
3030+return function(case2){
3031+var case0=case2;
3032+switch(case0[0]){
3033+case "Automaton":
3034+var case1=case0[1];
3035+return case1(a_22);
3036+}
3037+throw "Non-exhaustive pattern match in case";}(Automaton$m_23);};};
3038+function composeAuto_3(a1_25){
3039+return function(a2_26){
3040+return function(){
3041+var Automaton$m1_27=a1_25;
3042+var m1_28=function(case2){
3043+var case0=case2;
3044+switch(case0[0]){
3045+case "Automaton":
3046+var case1=case0[1];
3047+return case1;
3048+}
3049+throw "Non-exhaustive pattern match in case";}(Automaton$m1_27);
3050+var Automaton$m2_29=a2_26;
3051+var m2_30=function(case5){
3052+var case3=case5;
3053+switch(case3[0]){
3054+case "Automaton":
3055+var case4=case3[1];
3056+return case4;
3057+}
3058+throw "Non-exhaustive pattern match in case";}(Automaton$m2_29);
3059+return Automaton_0(function(a_33){
3060+return function(){
3061+var Tuple2$bm1__34=m1_28(a_33);
3062+var b_35=function(case9){
3063+var case6=case9;
3064+switch(case6[0]){
3065+case "Tuple2":
3066+var case7=case6[1],case8=case6[2];
3067+return case7;
3068+}
3069+throw "Non-exhaustive pattern match in case";}(Tuple2$bm1__34);
3070+var m1__36=function(case13){
3071+var case10=case13;
3072+switch(case10[0]){
3073+case "Tuple2":
3074+var case11=case10[1],case12=case10[2];
3075+return case12;
3076+}
3077+throw "Non-exhaustive pattern match in case";}(Tuple2$bm1__34);
3078+return function(){
3079+var Tuple2$cm2__41=m2_30(b_35);
3080+var c_42=function(case17){
3081+var case14=case17;
3082+switch(case14[0]){
3083+case "Tuple2":
3084+var case15=case14[1],case16=case14[2];
3085+return case15;
3086+}
3087+throw "Non-exhaustive pattern match in case";}(Tuple2$cm2__41);
3088+var m2__43=function(case21){
3089+var case18=case21;
3090+switch(case18[0]){
3091+case "Tuple2":
3092+var case19=case18[1],case20=case18[2];
3093+return case20;
3094+}
3095+throw "Non-exhaustive pattern match in case";}(Tuple2$cm2__41);
3096+return ["Tuple2",c_42,composeAuto_3(m1__36)(m2__43)];}();}();});}();};};
3097+function combine_4(autos_48){
3098+return Automaton_0(function(a_49){
3099+return function(){
3100+var Tuple2$bsautos__50=unzip(map(function(Automaton$m_53){
3101+return function(case2){
3102+var case0=case2;
3103+switch(case0[0]){
3104+case "Automaton":
3105+var case1=case0[1];
3106+return case1(a_49);
3107+}
3108+throw "Non-exhaustive pattern match in case";}(Automaton$m_53);})(autos_48));
3109+var bs_51=function(case6){
3110+var case3=case6;
3111+switch(case3[0]){
3112+case "Tuple2":
3113+var case4=case3[1],case5=case3[2];
3114+return case4;
3115+}
3116+throw "Non-exhaustive pattern match in case";}(Tuple2$bsautos__50);
3117+var autos__52=function(case10){
3118+var case7=case10;
3119+switch(case7[0]){
3120+case "Tuple2":
3121+var case8=case7[1],case9=case7[2];
3122+return case9;
3123+}
3124+throw "Non-exhaustive pattern match in case";}(Tuple2$bsautos__50);
3125+return ["Tuple2",bs_51,combine_4(autos__52)];}();});};
3126+function pure_5(f_59){
3127+return Automaton_0(function(x_60){
3128+return ["Tuple2",f_59(x_60),pure_5(f_59)];});};
3129+function init_6(s_61){
3130+return function(step_62){
3131+return Automaton_0(function(a_63){
3132+return function(){
3133+var s__64=step_62(a_63)(s_61);
3134+return ["Tuple2",s__64,init_6(s__64)(step_62)];}();});};};
3135+function init__7(s_65){
3136+return function(step_66){
3137+return Automaton_0(function(a_67){
3138+return function(){
3139+var Tuple2$bs__68=step_66(a_67)(s_65);
3140+var b_69=function(case3){
3141+var case0=case3;
3142+switch(case0[0]){
3143+case "Tuple2":
3144+var case1=case0[1],case2=case0[2];
3145+return case1;
3146+}
3147+throw "Non-exhaustive pattern match in case";}(Tuple2$bs__68);
3148+var s__70=function(case7){
3149+var case4=case7;
3150+switch(case4[0]){
3151+case "Tuple2":
3152+var case5=case4[1],case6=case4[2];
3153+return case6;
3154+}
3155+throw "Non-exhaustive pattern match in case";}(Tuple2$bs__68);
3156+return ["Tuple2",b_69,init__7(s__70)(step_66)];}();});};};
3157+function vecSub_12(Tuple2$x1y1_77){
3158+return function(Tuple2$x2y2_78){
3159+return function(case3){
3160+var case0=case3;
3161+switch(case0[0]){
3162+case "Tuple2":
3163+var case1=case0[1],case2=case0[2];
3164+return function(case7){
3165+var case4=case7;
3166+switch(case4[0]){
3167+case "Tuple2":
3168+var case5=case4[1],case6=case4[2];
3169+return ["Tuple2",(case1-case5),(case2-case6)];
3170+}
3171+throw "Non-exhaustive pattern match in case";}(Tuple2$x2y2_78);
3172+}
3173+throw "Non-exhaustive pattern match in case";}(Tuple2$x1y1_77);};};
3174+function stepDrag_13(Tuple2$presspos_83){
3175+return function(Tuple2$dsform_84){
3176+return function(case3){
3177+var case0=case3;
3178+switch(case0[0]){
3179+case "Tuple2":
3180+var case1=case0[1],case2=case0[2];
3181+return function(case7){
3182+var case4=case7;
3183+switch(case4[0]){
3184+case "Tuple2":
3185+var case5=case4[1],case6=case4[2];
3186+return function(){
3187+function wrap_89(ds__90){
3188+return ["Tuple2",case6,["Tuple2",ds__90,case6]];};
3189+return function(case10){
3190+var case8=case10;
3191+switch(case8[0]){
3192+case "DragFrom":
3193+var case9=case8[1];
3194+return (case1?["Tuple2",uncurry(move)(vecSub_12(case2)(case9))(case6),["Tuple2",DragFrom_11(case9),case6]]:function(){
3195+var form__92=uncurry(move)(vecSub_12(case2)(case9))(case6);
3196+return ["Tuple2",form__92,["Tuple2",Listen_9,form__92]];}());
3197+case "Ignore":
3198+return wrap_89((case1?Ignore_10:Listen_9));
3199+case "Listen":
3200+return wrap_89((not(case1)?Listen_9:(isWithin(case2)(case6)?DragFrom_11(case2):Ignore_10)));
3201+}
3202+throw "Non-exhaustive pattern match in case";}(case5);}();
3203+}
3204+throw "Non-exhaustive pattern match in case";}(Tuple2$dsform_84);
3205+}
3206+throw "Non-exhaustive pattern match in case";}(Tuple2$presspos_83);};};
3207+function dragForm_14(form_93){
3208+return init__7(["Tuple2",Listen_9,form_93])(stepDrag_13);};
3209+return {Automaton:Automaton_0,run:run_1,step:step_2,composeAuto:composeAuto_3,combine:combine_4,pure:pure_5,init:init_6,init_:init__7,count:count_8,Listen:Listen_9,Ignore:Ignore_10,DragFrom:DragFrom_11,vecSub:vecSub_12,stepDrag:stepDrag_13,dragForm:dragForm_14};}();
3210+ElmCode.main=function(){
3211+return ElmCode.Automaton.main;};
3212+
3213+} catch (e) {ElmCode.main=function() {var msg = ('<br/><h2>Your browser may not be supported. Are you using a modern browser?</h2>' + '<br/><span style="color:grey">Runtime Error in Automaton module:<br/>' + e + '<br/><br/>The problem may stem from an improper usage of:<br/>fst, unzip</span>');document.body.innerHTML = Text.monospace(msg);throw e;};}