@@ -0,0 +1,4041 @@
1+
2+Elm = {};
3+
4+var Guid = function() {
5+ var counter = 0;
6+ var guid = function() { counter += 1; return counter; };
7+ return {guid : guid};
8+}();
9+Elm.JavaScript = function() {
10+ function castJSBoolToBool(b) { return b; }
11+ function castBoolToJSBool(b) { return b; }
12+
13+ function castJSNumberToFloat(n) { return n; }
14+ function castFloatToJSNumber(n) { return n; }
15+
16+ function castJSNumberToInt(n) { return ~~n; }
17+ function castIntToJSNumber(n) { return n; }
18+
19+ function castJSElementToElement(w) {
20+ return function(h) {
21+ return function(node) {
22+ return ["Element",Guid.guid(),
23+ ["EExternalHtml",node],
24+ w,h,1,["Nothing"],["Nothing"]];
25+ }
26+ }
27+ }
28+ function castElementToJSElement(elem) { return Render.render(elem); }
29+
30+ function castJSArrayToList(arr) {
31+ var list = ["Nil"];
32+ for (var i = arr.length; i--; ) {
33+ list = [ "Cons", arr[i], list ];
34+ }
35+ return list;
36+ }
37+ function castListToJSArray(list) {
38+ var a = [];
39+ while (list[0] === "Cons") {
40+ a.push(list[1]);
41+ list = list[2];
42+ }
43+ return a;
44+ }
45+
46+ var castJSStringToString = castJSArrayToList;
47+ function castStringToJSString(str) {
48+ if (typeof str === "string") return str;
49+ return castListToJSArray(str).join('');
50+ }
51+
52+ function fromTuple(t) { return t.slice(1); }
53+ function toTuple(a) { return ["Tuple" + a.length].concat(a); }
54+
55+ return {castJSBoolToBool:castJSBoolToBool,
56+ castBoolToJSBool:castBoolToJSBool,
57+ castJSNumberToFloat:castJSNumberToFloat,
58+ castFloatToJSNumber:castFloatToJSNumber,
59+ castJSNumberToInt:castJSNumberToInt,
60+ castIntToJSNumber:castIntToJSNumber,
61+ Experimental : {castJSElementToElement:castJSElementToElement,
62+ castElementToJSElement:castElementToJSElement},
63+ castJSArrayToList:castJSArrayToList,
64+ castListToJSArray:castListToJSArray,
65+ castJSStringToString:castJSStringToString,
66+ castStringToJSString:castStringToJSString,
67+ castTupleToJSTuple2:fromTuple,
68+ castTupleToJSTuple3:fromTuple,
69+ castTupleToJSTuple4:fromTuple,
70+ castTupleToJSTuple5:fromTuple,
71+ castJSTupleToTuple2:toTuple,
72+ castJSTupleToTuple3:toTuple,
73+ castJSTupleToTuple4:toTuple,
74+ castJSTupleToTuple5:toTuple
75+ };
76+}();
77+
78+var JSjson = window.JSON;
79+Elm.JSON = function() {
80+ var JS = Elm.JavaScript;
81+ var empty = ['JSON',{}];
82+ function singleton(k) { return function(v) {
83+ var obj = {};
84+ obj[JS.castStringToJSString(k)] = v;
85+ return ['JSON', obj ];
86+ };
87+ }
88+ function insert(k) { return function(v) { return function(inObj) {
89+ var obj = inObj[1];
90+ var outObj = {};
91+ for (var i in obj) {
92+ outObj[i] = obj[i];
93+ }
94+ outObj[JS.castStringToJSString(k)] = v;
95+ return ['JSON', outObj ];
96+ };
97+ };
98+ }
99+
100+ function lookup(key) { return function(obj) {
101+ var k = JS.castStringToJSString(key);
102+ return obj[1].hasOwnProperty(k) ? ["Just", obj[1][k]] : ["Nothing"] ;
103+ };
104+ }
105+ function find(tipe,base) { return function (key) { return function(obj) {
106+ var k = JS.castStringToJSString(key);
107+ if (obj[1].hasOwnProperty(k)) {
108+ var v = obj[1][k];
109+ if (v[0] === tipe) { return v[1]; }
110+ }
111+ return base;
112+ };
113+ }
114+ }
115+ function lookupWithDefault(base) { return function(key) { return function(obj) {
116+ var k = JS.castStringToJSString(key);
117+ return obj[1].hasOwnProperty(k) ? obj[1][k] : base ;
118+ };
119+ };
120+ }
121+
122+ function remove(k) { return function(inObj) {
123+ var obj = inObj[1];
124+ var outObj = {};
125+ for (var i in obj) {
126+ outObj[i] = obj[i];
127+ }
128+ delete outObj[JS.castStringToJSString(k)];
129+ return ['JSON', outObj];
130+ };
131+ }
132+
133+ function JsonString(v) { return [ "JsonString", v ]; }
134+ function JsonNumber(v) { return [ "JsonNumber", v ]; }
135+ function JsonBool(v) { return [ "JsonBool", v ]; }
136+ var JsonNull = [ "JsonNull" ];
137+ function JsonArray(v) { return [ "JsonArray", v ]; }
138+ function JsonObject(v) { return [ "JsonObject", v ]; }
139+
140+ function toList(json) {
141+ var obj = json[1];
142+ var arr = [];
143+ for (var i in obj) {
144+ arr.push(Value.Tuple(JS.castJSStringToString(i), obj[i]));
145+ }
146+ return JS.castJSArrayToList(arr);
147+ }
148+ function fromList(list) {
149+ var arr = JS.castListToJSArray(list);
150+ var obj = {};
151+ for (var i = arr.length; i--; ) {
152+ obj[JS.castStringToJSString(arr[i][1])] = arr[i][2];
153+ }
154+ return [ "JSON", obj ];
155+ }
156+
157+ function toPrettyJSString(sep) { return function (obj) {
158+ function fromValue(v) {
159+ switch (v[0]) {
160+ case 'JsonNull' : return null;
161+ case 'JsonString' : return JS.castStringToJSString(v[1]);
162+ case 'JsonObject' :
163+ var o = {};
164+ var from = v[1][1];
165+ for (var i in from) {
166+ o[i] = fromValue(from[i]);
167+ }
168+ return o;
169+ case 'JsonArray' :
170+ var a = JS.castListToJSArray(v[1]);
171+ for (var i = a.length; i--; ) {
172+ a[i] = fromValue(a[i]);
173+ }
174+ return a;
175+ default :
176+ return v[1];
177+ }
178+ }
179+ return JSjson.stringify(fromValue([ 'JsonObject', obj ]), null, JS.castStringToJSString(sep));
180+ };
181+ }
182+ function fromJSString(str) {
183+ var obj = JSjson.parse(str);
184+ function toValue(v) {
185+ switch (typeof v) {
186+ case 'string' : return [ "JsonString", JS.castJSStringToString(v) ];
187+ case 'number' : return [ "JsonNumber", JS.castJSNumberToFloat(v) ];
188+ case 'boolean' : return [ "JsonBool", JS.castJSBoolToBool(v) ];
189+ case 'object' :
190+ if (v === null) return [ "JsonNull" ];
191+ for (var i in v) {
192+ v[i] = toValue(v[i]);
193+ }
194+ if (v instanceof Array) return [ "JsonArray", JS.castJSArrayToList(v) ];
195+ return [ "JsonObject", [ "JSON", v ] ];
196+ }
197+ }
198+ for (var i in obj) {
199+ obj[i] = toValue(obj[i]);
200+ }
201+ return ['JSON',obj];
202+ }
203+ return {empty : empty,
204+ singleton : singleton,
205+ insert : insert,
206+ lookup : lookup,
207+ findString : find("JsonString",["Nil"]),
208+ findObject : find("JsonObject", empty ),
209+ findArray : find("JsonArray" ,["Nil"]),
210+ findWithDefault : lookupWithDefault,
211+ remove : remove,
212+ toPrettyJSString : toPrettyJSString,
213+ toJSString : toPrettyJSString(''),
214+ fromJSString : fromJSString,
215+ toPrettyString : function(sep) { return function(v) {
216+ return JS.castJSStringToString(toPrettyJSString(sep)(v)); }; },
217+ toString : function(v) { return JS.castJSStringToString(toPrettyJSString('')(v)); },
218+ fromString : function(v) { return fromJSString(JS.castStringToJSString(v)); },
219+ toList : toList,
220+ fromList : fromList,
221+ JsonString : JsonString,
222+ JsonNumber : JsonNumber,
223+ JsonBool : JsonBool,
224+ JsonNull : JsonNull,
225+ JsonArray : JsonArray,
226+ JsonObject : JsonObject
227+ };
228+}();
229+
230+var Value = function(){
231+
232+ var eq = function(x,y) {
233+ if (typeof x === "object") {
234+ if (x.hasOwnProperty('_')) {
235+ for (var i in x) { if (x[i] != y[i]) return false; }
236+ for (var i in y) { if (x[i] != y[i]) return false; }
237+ return true;
238+ }
239+ if (x === y) return true;
240+ if (x.length !== y.length) return false;
241+ for (var i = x.length; i--; ) {
242+ if (!eq(x[i],y[i])) return false;
243+ }
244+ return true;
245+ }
246+ return x === y;
247+ };
248+
249+ var Tuple = function() {
250+ var len = arguments.length;
251+ var arr = new Array(len+1);
252+ arr[0] = "Tuple" + arguments.length;
253+ for (var i = len; i--; ) {
254+ arr[i+1] = arguments[i];
255+ }
256+ return arr;
257+ };
258+
259+ var listToArray = function(list) {
260+ var arr = [];
261+ while (list[0] === "Cons") {
262+ arr.push(list[1]);
263+ list = list[2];
264+ }
265+ return arr;
266+ };
267+
268+ function makeSpaces(s) {
269+ if (s.length == 0) { return s; }
270+ var arr = s.split('');
271+ if (arr[0] == ' ') { arr[0] = " " }
272+ for (var i = arr.length; --i; ) {
273+ if (arr[i][0] == ' ' && arr[i-1] == ' ') {
274+ arr[i-1] = arr[i-1] + arr[i];
275+ arr[i] = '';
276+ }
277+ }
278+ for (var i = arr.length; i--; ) {
279+ if (arr[i].length > 1 && arr[i][0] == ' ') {
280+ var spaces = arr[i].split('');
281+ for (var j = spaces.length - 2; j >= 0; j -= 2) {
282+ spaces[j] = ' ';
283+ }
284+ arr[i] = spaces.join('');
285+ }
286+ }
287+ arr = arr.join('');
288+ if (arr[arr.length-1] === " ") {
289+ return arr.slice(0,-1) + ' ';
290+ }
291+ return arr;
292+ }
293+
294+ function properEscape(str) {
295+ if (str.length == 0) return str;
296+ str = str //.replace(/&/g, "&")
297+ .replace(/"/g, /*"*/ """)
298+ .replace(/'/g, /*'*/ "'")
299+ .replace(/</g, "<")
300+ .replace(/>/g, ">")
301+ .replace(/\n/g, "<br/>");
302+ var arr = str.split('<br/>');
303+ for (var i = arr.length; i--; ) {
304+ arr[i] = makeSpaces(arr[i]);
305+ }
306+ return arr.join('<br/>');
307+ }
308+
309+ var toText = function(elmList) {
310+ if (typeof elmList === "string") return properEscape(elmList);
311+ var a = [];
312+ while (elmList[0] === "Cons") {
313+ a.push(elmList[1]);
314+ elmList = elmList[2];
315+ }
316+ return properEscape(a.join(''));
317+ };
318+
319+ function getTextSize(w,h,txt) {
320+ var t = document.createElement('div');
321+ t.innerHTML = txt;
322+ t.style.textAlign = 'left';
323+ if (w > 0) { t.style.width = w + "px"; }
324+
325+ t.style.visibility = "hidden";
326+ t.style.styleFloat = "left";
327+ t.style.cssFloat = "left";
328+
329+ document.body.appendChild(t);
330+ var cStyle = window.getComputedStyle(t,null);
331+ var realW = cStyle.getPropertyValue("width").slice(0,-2) - 0;
332+ var realH = cStyle.getPropertyValue("height").slice(0,-2) - 0;
333+ document.body.removeChild(t);
334+ //delete t;
335+ return [Math.ceil(realW),Math.ceil(Math.max(h,realH))];
336+ }
337+
338+ function getSize(e) {
339+ var t = e.cloneNode(true);
340+
341+ t.style.visibility = "hidden";
342+ t.style.styleFloat = "left";
343+ t.style.cssFloat = "left";
344+
345+ document.body.appendChild(t);
346+ var w = t.offsetWidth;
347+ var h = t.offsetHeight;
348+ document.body.removeChild(t);
349+ //delete t;
350+ return [w,h];
351+ }
352+
353+ function getExcess(e) {
354+ var t = e.cloneNode(true);
355+
356+ t.style.visibility = "hidden";
357+ t.style.styleFloat = "left";
358+ t.style.cssFloat = "left";
359+
360+ document.body.appendChild(t);
361+ var ow = t.offsetWidth;
362+ var oh = t.offsetHeight;
363+ var cStyle = window.getComputedStyle(t,null);
364+ var w = cStyle.getPropertyValue("width").slice(0,-2) - 0;
365+ var h = cStyle.getPropertyValue("height").slice(0,-2) - 0;
366+ document.body.removeChild(t);
367+ //delete t;
368+ return [ow-w,oh-h];
369+ }
370+
371+
372+ function groupForms(forms) {
373+ forms = Elm.JavaScript.castListToJSArray(forms);
374+ var groups = [];
375+ var arr = [];
376+ for (var i = forms.length; i--; ) {
377+ var f = forms[i];
378+ switch(f[4][0]) {
379+ case "FElement":
380+ if (arr.length > 0) {
381+ groups.push(arr);
382+ arr = [];
383+ }
384+ groups.push(f);
385+ break;
386+ default:
387+ arr.push(f);
388+ }
389+ }
390+ if (arr.length > 0) groups.push(arr);
391+ return groups;
392+ }
393+
394+ var toString = function(v) {
395+ if (typeof v === "function") {
396+ return "<function>";
397+ } else if (typeof v === "boolean") {
398+ return v ? "True" : "False";
399+ } else if (typeof v === "number") {
400+ return v+"";
401+ } else if (typeof v === "string" && v.length < 2) {
402+ return "'"+v+"'";
403+ } else if (typeof v === "object" && v.hasOwnProperty('_')) {
404+ var output = []
405+ for (var k in v) {
406+ if (k == '_') continue;
407+ for (var i = v[k].length; i--; ) {
408+ output.push(k + " = " + toString(v[k][i]));
409+ }
410+ }
411+ if (output.length === 0) return "{}";
412+ return "{ " + output.join(", ") + " }";
413+ } else if (v[0]) {
414+ if (v[0].substring(0,5) === "Tuple") {
415+ var output = new Array(v.length-1);
416+ for (var i = v.length; --i; ) { output[i-1] = toString(v[i]); }
417+ return "(" + output.join(",") + ")";
418+ } else if (v[0] === "Cons") {
419+ var start = (typeof v[1] === "string") ? '"' : "[";
420+ var end = (typeof v[1] === "string") ? '"' : "]";
421+ var div = (typeof v[1] === "string") ? "" : ",";
422+ var f = (typeof v[1] === "string") ? function(x){return x} : toString;
423+ var output = start + f(v[1]);
424+ v = v[2];
425+ while (true) {
426+ if (v[0] === "Cons") {
427+ output += div + f(v[1]);
428+ v = v[2];
429+ } else {
430+ return output + end;
431+ }
432+ }
433+ } else if (v[0] === "Nil") {
434+ return "[]";
435+ } else if (v[0] === "JSON") {
436+ return "(JSON.fromList " + toString(Elm.JSON.toList(v)) + ")";
437+ } else if (v[0] === "RBNode" || v[0] === "RBEmpty") {
438+ function cons(k){ return function(v) { return function(acc) { return ["Cons",["Tuple2",k,v],acc]; }; }; }
439+ var list = Elm.Dict.foldr(cons)(["Nil"])(v);
440+ var name = "Dict";
441+ if (list[0] === "Cons" && list[1][2][0] === "Tuple0") {
442+ name = "Set";
443+ list = Elm.List.map(function(x) { return x[1]; })(list);
444+ }
445+ return "(" + name + ".fromList " + toString(list) + ")";
446+ } else {
447+ var output = [];
448+ for (var i = v.length; --i; ) { output.push(toString(v[i])); }
449+ output = v[0] + ' ' + output.join(' ');
450+ return (v.length > 1) ? "(" + output + ")" : output;
451+ }
452+ }
453+ return v+"";
454+ };
455+ var show = function(v) { return str(toString(v)); };
456+ var append = function(xs,ys) {
457+ if (typeof xs === "string" && typeof ys === "string") {
458+ return xs.concat(ys);
459+ }
460+ if (xs[0] === "Nil") {
461+ return ys;
462+ }
463+ var root = ["Cons", xs[1], ["Nil"]];
464+ var curr = root;
465+ xs = xs[2];
466+ while (xs[0]==="Cons") {
467+ curr[2] = ["Cons", xs[1], ["Nil"]];
468+ xs = xs[2];
469+ curr = curr[2];
470+ }
471+ curr[2] = ys;
472+ return root;
473+ };
474+
475+ var str = function(s) {
476+ var out = ["Nil"];
477+ for (var i = s.length; i--; ) {
478+ out = ["Cons", s[i], out];
479+ }
480+ return out;
481+ };
482+
483+ function wrap(elem) {
484+ var p = Value.getSize(elem);
485+ return ["Element", Guid.guid(), ["EHtml",elem],
486+ p[0], p[1], 1, ["Nothing"], ["Nothing"]];
487+ }
488+ var addListener = function() {
489+ if(document.addEventListener) {
490+ return function(element, event, handler) {
491+ element.addEventListener(event, handler, false);
492+ };
493+ } else {
494+ return function(element, event, handler) {
495+ element.attachEvent('on' + event, handler);
496+ };
497+ }
498+ }();
499+
500+ return {eq:eq,
501+ str:str,
502+ show:show,
503+ Tuple:Tuple,
504+ append:append,
505+ listToArray:listToArray,
506+ toText : toText,
507+ properEscape : properEscape,
508+ getTextSize : getTextSize,
509+ getSize : getSize,
510+ getExcess : getExcess,
511+ groupForms : groupForms,
512+ wrap : wrap,
513+ addListener : addListener
514+ };
515+}();Elm.List = function() {
516+
517+ var throwError = function(f) {
518+ throw "Function '" + f + "' expecting a list!";
519+ }
520+
521+ function length(xs) {
522+ var out = 0;
523+ while (xs[0] === "Cons") {
524+ out += 1;
525+ xs = xs[2];
526+ }
527+ return out;
528+ };
529+ var reverse = foldl(function(x_72) {
530+ return function(y_73) {
531+ return["Cons", x_72, y_73]
532+ }
533+ })(["Nil"]);
534+ var concat = foldr(function(x_74) {
535+ return function(y_75) {
536+ return Value.append(x_74, y_75)
537+ }
538+ })(["Nil"]);
539+ var and = foldl(function(x_77) {
540+ return function(y_78) {
541+ return x_77 && y_78
542+ }
543+ })(true);
544+ var or = foldl(function(x_79) {
545+ return function(y_80) {
546+ return x_79 || y_80
547+ }
548+ })(false);
549+ var sum = foldl(function(x_89) {
550+ return function(y_90) {
551+ return x_89 + y_90
552+ }
553+ })(0);
554+ var product = foldl(function(x_91) {
555+ return function(y_92) {
556+ return x_91 * y_92
557+ }
558+ })(1);
559+ var maximum = foldl1(function(x) { return function(y) { return Math.max(x,y) } });
560+ var minimum = foldl1(function(x) { return function(y) { return Math.min(x,y) } });
561+ function head(v) {
562+ if (v[0] !== "Cons") {
563+ throw "Error: 'head' only accepts lists of length greater than one.";
564+ }
565+ return v[1];
566+ }
567+ function tail(v) {
568+ if (v[0] !== "Cons") {
569+ throw "Error: 'tail' only accepts lists of length greater than one.";
570+ }
571+ return v[2];
572+ }
573+ function last(v) {
574+ if (v[0] !== "Cons") {
575+ throw "Error: 'last' only accepts lists of length greater than one.";
576+ }
577+ var out = v[1];
578+ while (v[0] === "Cons") {
579+ out = v[1];
580+ v = v[2];
581+ }
582+ return out;
583+ }
584+ function map(f) {
585+ return function(xs) {
586+ if (xs[0] === "Nil") { return xs; }
587+ if (xs[0] !== "Cons") { throwError('map'); }
588+ var root = ["Cons", f(xs[1]), ["Nil"]];
589+ var curr = root;
590+ xs = xs[2];
591+ while (xs[0]==="Cons") {
592+ curr[2] = ["Cons", f(xs[1]), ["Nil"]];
593+ xs = xs[2];
594+ curr = curr[2];
595+ }
596+ return root;
597+ }
598+ }
599+ function foldl(f) {
600+ return function(b) {
601+ return function(xs) {
602+ var acc = b;
603+ if (xs[0] === "Nil") { return acc; }
604+ if (xs[0] !== "Cons") { throwError('foldl'); }
605+ while (xs[0] === "Cons") {
606+ acc = f(xs[1])(acc);
607+ xs = xs[2];
608+ }
609+ return acc;
610+ }
611+ }
612+ }
613+ function foldr(f) {
614+ return function(b) {
615+ return function(xs) {
616+ var acc = b;
617+ if (xs[0] === "Nil") { return acc; }
618+ if (xs[0] !== "Cons") { throwError('foldr'); }
619+ var arr = [];
620+ while (xs[0] === "Cons") {
621+ arr.push(xs[1]);
622+ xs = xs[2];
623+ }
624+ for (var i = arr.length; i--; ) {
625+ acc = f(arr[i])(acc);
626+ }
627+ return acc;
628+ }
629+ }
630+ }
631+ function foldl1(f_49) {
632+ return function(_temp_50) {
633+ return function(v) {
634+ if("Cons" !== v[0]) {
635+ return undefined
636+ }else {
637+ var x_51 = v[1];
638+ var xs_52 = v[2];
639+ return foldl(f_49)(x_51)(xs_52)
640+ }
641+ }(_temp_50)
642+ }
643+ }
644+ function foldr1(f) {
645+ return function(xs) {
646+ if (xs[0] === "Nil") { throw "'foldr1' requires an non-empty list." }
647+ if (xs[0] !== "Cons") { throwError('foldr1'); }
648+ var arr = [];
649+ while (xs[0] === "Cons") {
650+ arr.push(xs[1]);
651+ xs = xs[2];
652+ }
653+ var acc = arr.pop();
654+ for (var i = arr.length; i--; ) {
655+ acc = f(arr[i])(acc);
656+ }
657+ return acc;
658+ }
659+ }
660+ function scanl(f) {
661+ return function(b) {
662+ return function(xs) {
663+ if (xs[0] === "Nil") { return ["Cons",b,["Nil"]]; }
664+ if (xs[0] !== "Cons") { throwError('scanl'); }
665+ var arr = [b];
666+ while (xs[0] === "Cons") {
667+ b = f(xs[1])(b);
668+ arr.push(b);
669+ xs = xs[2];
670+ }
671+ var out = ["Nil"];
672+ for (var i = arr.length; i--; ) {
673+ out = ["Cons", arr[i], out];
674+ }
675+ return out;
676+ }
677+ }
678+ }
679+ function scanl1(f) {
680+ return function(xs) {
681+ if (xs[0] !== "Cons") {
682+ throw "Error: 'scanl1' requires a list of at least length 1.";
683+ }
684+ return scanl(f)(xs[1])(xs[2]);
685+ }
686+ }
687+ function filter(pred) {
688+ return function(xs) {
689+ if (xs[0] === "Nil") { return xs; }
690+ if (xs[0] !== "Cons") { throwError('filter'); }
691+ var arr = [];
692+ while (xs[0] === "Cons") {
693+ if (pred(xs[1])) { arr.push(xs[1]); }
694+ xs = xs[2];
695+ }
696+ var out = ["Nil"];
697+ for (var i = arr.length; i--; ) {
698+ out = ["Cons", arr[i], out];
699+ }
700+ return out;
701+ }
702+ }
703+ function concatMap(f_76) {
704+ return function(x) {
705+ return concat(map(f_76)(x))
706+ }
707+ }
708+ function all(pred) {
709+ return foldl(function(x) { return function(acc) {
710+ return acc && pred(x);
711+ };})(true);
712+ }
713+ function any(pred) {
714+ return foldl(function(x) { return function(acc) {
715+ return acc || pred(x);
716+ };})(false);
717+ }
718+ function partition(pred_93) {
719+ return function(lst_94) {
720+ return function() {
721+ var v = lst_94;
722+ var c = [function(v) {
723+ if("Nil" !== v[0]) {
724+ return undefined
725+ }else {
726+ return["Tuple2", ["Nil"], ["Nil"]]
727+ }
728+ }, function(v) {
729+ if("Cons" !== v[0]) {
730+ return undefined
731+ }else {
732+ var x_95 = v[1];
733+ var xs_96 = v[2];
734+ return function(v) {
735+ if("Tuple2" !== v[0]) {
736+ return undefined
737+ }else {
738+ var as_97 = v[1];
739+ var bs_98 = v[2];
740+ return pred_93(x_95) ? ["Tuple2", ["Cons", x_95, as_97], bs_98] : ["Tuple2", as_97, ["Cons", x_95, bs_98]]
741+ }
742+ }(partition(pred_93)(xs_96))
743+ }
744+ }];
745+ for(var i = c.length;i--;) {
746+ var r = c[i](v);
747+ if(r !== undefined) {
748+ return r
749+ }
750+ }
751+ }()
752+ }
753+ }
754+ function zipWith(f) {
755+ return function(listA) {
756+ return function(listB) {
757+ if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
758+ if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zipWith'); }
759+ var arr = [];
760+ while (listA[0] === "Cons" && listB[0] === "Cons") {
761+ arr.push(f(listA[1])(listB[1]));
762+ listA = listA[2];
763+ listB = listB[2];
764+ }
765+ var out = ["Nil"];
766+ for (var i = arr.length; i--; ) {
767+ out = ["Cons", arr[i], out];
768+ }
769+ return out;
770+ }
771+ }
772+ }
773+ function zip(listA) {
774+ return function(listB) {
775+ if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
776+ if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zip'); }
777+ var arr = [];
778+ while (listA[0] === "Cons" && listB[0] === "Cons") {
779+ arr.push(["Tuple2", listA[1], listB[1]]);
780+ listA = listA[2];
781+ listB = listB[2];
782+ }
783+ var out = ["Nil"];
784+ for (var i = arr.length; i--; ) {
785+ out = ["Cons", arr[i], out];
786+ }
787+ return out;
788+ }
789+ }
790+ function unzip(pairs_112) {
791+ return function() {
792+ var v = pairs_112;
793+ var c = [function(v) {
794+ if("Nil" !== v[0]) {
795+ return undefined
796+ }else {
797+ return["Tuple2", ["Nil"], ["Nil"]]
798+ }
799+ }, function(v) {
800+ if("Cons" !== v[0]) {
801+ return undefined
802+ }else {
803+ var p_113 = v[1];
804+ var ps_114 = v[2];
805+ return function(v) {
806+ if("Tuple2" !== v[0]) {
807+ return undefined
808+ }else {
809+ if("Tuple2" !== v[1][0]) {
810+ return undefined
811+ }else {
812+ var x_115 = v[1][1];
813+ var y_116 = v[1][2];
814+ if("Tuple2" !== v[2][0]) {
815+ return undefined
816+ }else {
817+ var xs_117 = v[2][1];
818+ var ys_118 = v[2][2];
819+ return["Tuple2", ["Cons", x_115, xs_117], ["Cons", y_116, ys_118]]
820+ }
821+ }
822+ }
823+ }(["Tuple2", p_113, unzip(ps_114)])
824+ }
825+ }];
826+ for(var i = c.length;i--;) {
827+ var r = c[i](v);
828+ if(r !== undefined) {
829+ return r
830+ }
831+ }
832+ }()
833+ }
834+ function intersperse(sep_119) {
835+ return function(xs_120) {
836+ return function() {
837+ var v = xs_120;
838+ var c = [function(v) {
839+ if("Nil" !== v[0]) {
840+ return undefined
841+ }else {
842+ return["Nil"]
843+ }
844+ }, function(v) {
845+ if("Cons" !== v[0]) {
846+ return undefined
847+ }else {
848+ var a_124 = v[1];
849+ if("Nil" !== v[2][0]) {
850+ return undefined
851+ }else {
852+ return["Cons", a_124, ["Nil"]]
853+ }
854+ }
855+ }, function(v) {
856+ if("Cons" !== v[0]) {
857+ return undefined
858+ }else {
859+ var a_121 = v[1];
860+ if("Cons" !== v[2][0]) {
861+ return undefined
862+ }else {
863+ var b_122 = v[2][1];
864+ var cs_123 = v[2][2];
865+ return["Cons", a_121, ["Cons", sep_119, intersperse(sep_119)(["Cons", b_122, cs_123])]]
866+ }
867+ }
868+ }];
869+ for(var i = c.length;i--;) {
870+ var r = c[i](v);
871+ if(r !== undefined) {
872+ return r
873+ }
874+ }
875+ }()
876+ }
877+ }
878+ function intercalate(sep_125) {
879+ return function(xs_126) {
880+ return function() {
881+ var v = xs_126;
882+ var c = [function(v) {
883+ if("Nil" !== v[0]) {
884+ return undefined
885+ }else {
886+ return["Nil"]
887+ }
888+ }, function(v) {
889+ if("Cons" !== v[0]) {
890+ return undefined
891+ }else {
892+ var a_130 = v[1];
893+ if("Nil" !== v[2][0]) {
894+ return undefined
895+ }else {
896+ return a_130
897+ }
898+ }
899+ }, function(v) {
900+ if("Cons" !== v[0]) {
901+ return undefined
902+ }else {
903+ var a_127 = v[1];
904+ if("Cons" !== v[2][0]) {
905+ return undefined
906+ }else {
907+ var b_128 = v[2][1];
908+ var cs_129 = v[2][2];
909+ return Value.append(a_127, Value.append(sep_125, intercalate(sep_125)(["Cons", b_128, cs_129])))
910+ }
911+ }
912+ }];
913+ for(var i = c.length;i--;) {
914+ var r = c[i](v);
915+ if(r !== undefined) {
916+ return r
917+ }
918+ }
919+ }()
920+ }
921+ }
922+ function sort(xs) {
923+ if (xs[0] === "Nil") { return xs; }
924+ if (xs[0] !== "Cons") { throwError('sort'); }
925+ var arr = [];
926+ while (xs[0] === "Cons") {
927+ arr.push(xs[1]);
928+ xs = xs[2];
929+ }
930+ arr.sort(function(a,b) { return a - b});
931+ var out = ["Nil"];
932+ for (var i = arr.length; i--; ) {
933+ out = [ "Cons", arr[i], out ];
934+ }
935+ return out;
936+ }
937+ function take(n) { return function(xs) {
938+ if (n <= 0) { return ["Nil"]; }
939+ if (xs[0] === "Nil") { return xs; }
940+ if (xs[0] !== "Cons") { throwError('take'); }
941+ var out = [ "Cons", xs[1], ["Nil"] ];
942+ var temp = out;
943+ xs = xs[2];
944+ --n;
945+ while (xs[0] === "Cons" && n > 0) {
946+ temp[2] = [ "Cons", xs[1], ["Nil"] ];
947+ temp = temp[2];
948+ xs = xs[2];
949+ --n;
950+ }
951+ return out;
952+ };
953+ }
954+ function drop(n) { return function(xs) {
955+ if (xs[0] === "Nil") { return xs; }
956+ if (xs[0] !== "Cons") { throwError('drop'); }
957+ while (xs[0] === "Cons" && n > 0) {
958+ xs = xs[2];
959+ --n;
960+ }
961+ return xs;
962+ };
963+ }
964+ return {head:head,
965+ tail:tail,
966+ last:last,
967+ map:map,
968+ foldl:foldl,
969+ foldr:foldr,
970+ foldl1:foldl1,
971+ foldr1:foldr1,
972+ scanl:scanl,
973+ scanl1:scanl1,
974+ filter:filter,
975+ length:length,
976+ reverse:reverse,
977+ concat:concat,
978+ concatMap:concatMap,
979+ and:and,
980+ or:or,
981+ all:all,
982+ any:any,
983+ sum:sum,
984+ product:product,
985+ maximum:maximum,
986+ minimum:minimum,
987+ partition:partition,
988+ zipWith:zipWith,
989+ zip:zip,
990+ unzip:unzip,
991+ intersperse:intersperse,
992+ intercalate:intercalate,
993+ sort:sort,
994+ take:take,
995+ drop:drop};
996+}();
997+Elm.Maybe = function() {
998+ function consMaybe(x) { return function(xs) {
999+ if (x[0] === "Just") return ["Cons", x[1], xs];
1000+ return xs;
1001+ };
1002+ }
1003+ function fromMaybe(b) { return function(m) {
1004+ if (m[0] === "Just") return m[1];
1005+ return b;
1006+ };
1007+ }
1008+ function mapCons(f) { return function(y) { return function(xs) {
1009+ var x = f(y);
1010+ if (x[0] === "Just") return ["Cons", x[1], xs];
1011+ return xs;
1012+ };
1013+ };
1014+ }
1015+ function maybe(b) { return function(f) { return function(m) {
1016+ if (m[0] === "Just") return f(m[1]);
1017+ return b;
1018+ };
1019+ };
1020+ }
1021+
1022+ return {Just : function(x) { return ["Just",x]; },
1023+ Nothing : ["Nothing"],
1024+ catMaybes : Elm.List.foldr(consMaybe)(["Nil"]),
1025+ isJust : function(m) { return m[0] === "Just"; },
1026+ isNothing : function(m) { return m[0] === "Nothing"; },
1027+ fromMaybe : fromMaybe,
1028+ consMaybe : consMaybe,
1029+ mapMaybe : function(f) { return Elm.List.foldr(mapCons(f))(["Nil"]); },
1030+ maybe : maybe
1031+ };
1032+}();
1033+
1034+Elm.Char = function() {
1035+ function isBetween(lo,hi) { return function(chr) {
1036+ var c = chr.charCodeAt(0);
1037+ return lo <= c && c <= hi;
1038+ };
1039+ }
1040+ var isDigit = isBetween('0'.charCodeAt(0),'9'.charCodeAt(0));
1041+ var chk1 = isBetween('a'.charCodeAt(0),'f'.charCodeAt(0));
1042+ var chk2 = isBetween('A'.charCodeAt(0),'F'.charCodeAt(0));
1043+
1044+ return {fromCode : function(c) { return String.fromCharCode(c); },
1045+ toCode : function(c) { return c.charCodeAt(0); },
1046+ toUpper : function(c) { return c.toUpperCase(); },
1047+ toLower : function(c) { return c.toLowerCase(); },
1048+ toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },
1049+ toLocaleLower : function(c) { return c.toLocaleLowerCase(); },
1050+ isLower : isBetween('a'.charCodeAt(0),'z'.charCodeAt(0)),
1051+ isUpper : isBetween('A'.charCodeAt(0),'Z'.charCodeAt(0)),
1052+ isDigit : isDigit,
1053+ isOctDigit : isBetween('0'.charCodeAt(0),'7'.charCodeAt(0)),
1054+ isHexDigit : function(c) { return isDigit(c) || chk1(c) || chk2(c); }
1055+ };
1056+}();
1057+Elm.Color = function() {
1058+
1059+function Color_0(a1) {
1060+ return function(a2) {
1061+ return function(a3) {
1062+ return function(a4) {
1063+ return["Color", a1, a2, a3, a4]
1064+ }
1065+ }
1066+ }
1067+}
1068+var rgba_1 = Color_0;
1069+var red_3 = ["Color",255,0,0,1];
1070+var green_4 = ["Color",0,255,0,1];
1071+var blue_5 = ["Color",0,0,255,1];
1072+var yellow_6 = ["Color",255,255,0,1];
1073+var cyan_7 = ["Color",0,255,255,1];
1074+var magenta_8 = ["Color",255,0,255,1];
1075+var black_9 = ["Color",0,0,0,1];
1076+var white_10 = ["Color",255,255,255,1];
1077+var gray_11 = ["Color",128,128,128,1];
1078+var grey_12 = ["Color",128,128,128,1];
1079+function rgb_2(r_13) {
1080+ return function(g_14) {
1081+ return function(b_15) {
1082+ return ["Color",r_13,g_14,b_15,1]
1083+ }
1084+ }
1085+}
1086+function extract(c) {
1087+ if (c[4] === 1) { return 'rgb(' + c[1] + ',' + c[2] + ',' + c[3] + ')'; }
1088+ return 'rgba(' + c[1] + ',' + c[2] + ',' + c[3] + ',' + c[4] + ')';
1089+}
1090+function complement(rgb) {
1091+ var hsv = toHSV(rgb);
1092+ hsv.hue = (hsv.hue + 180) % 360;
1093+ return toRGB(hsv);
1094+}
1095+
1096+function hsva(h) { return function(s) { return function(v) { return function(a) {
1097+ var clr = toRGB({hue:h, saturation:s, value:v});
1098+ clr[4] = a;
1099+ return clr;
1100+ }; }; };
1101+}
1102+
1103+function hsv(h) { return function(s) { return function(v) {
1104+ return toRGB({hue:h, saturation:s, value:v}); }; }; }
1105+
1106+function toHSV(rgb) {
1107+ var hsv = {};
1108+ var r = rgb[1] / 255.0, g = rgb[2] / 255.0, b = rgb[3] / 255.0;
1109+ var M = Math.max(r,g,b);
1110+ var m = Math.min(r,g,b);
1111+ var c = M - m;
1112+
1113+ var h = 0;
1114+ if (c === 0) { h = 0; }
1115+ else if (M === r) { h = ((g - b) / c) % 6; }
1116+ else if (M === g) { h = ((b - r) / c) + 2; }
1117+ else if (M === b) { h = ((r - g) / c) + 4; }
1118+ h *= 60;
1119+
1120+ return { value : M, hue : h, saturation : (M === 0 ? 0 : c / M) };
1121+}
1122+
1123+function between(lo,hi,x) { return lo <= x && x < hi; }
1124+function norm(n) { return Math.round(n*255); }
1125+
1126+function toRGB(hsv) {
1127+ var c = hsv.value * hsv.saturation;
1128+ var hue = hsv.hue / 60;
1129+ var x = c * (1 - Math.abs((hue % 2) - 1));
1130+ var r = 0, g = 0, b = 0;
1131+ if (between(0,1,hue)) { r = c; g = x; b = 0; }
1132+ else if (between(1,2,hue)) { r = x; g = c; b = 0; }
1133+ else if (between(2,3,hue)) { r = 0; g = c; b = x; }
1134+ else if (between(3,4,hue)) { r = 0; g = x; b = c; }
1135+ else if (between(4,5,hue)) { r = x; g = 0; b = c; }
1136+ else if (between(5,6,hue)) { r = c; g = 0; b = x; }
1137+
1138+ var m = hsv.value - c;
1139+ return ["Color", norm(r+m), norm(g+m), norm(b+m), 1 ];
1140+}
1141+ return{rgba:rgba_1, rgb:rgb_2, hsva:hsva, hsv:hsv, 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,complement:complement,extract:extract}
1142+}();
1143+var Collage = function() {
1144+
1145+var JS = Elm.JavaScript;
1146+
1147+function tracePoints(ctx,points) {
1148+ var i = points.length - 1;
1149+ if (i <= 0) return;
1150+ ctx.moveTo(points[i][1], points[i][2]);
1151+ while (i--) { ctx.lineTo(points[i][1], points[i][2]); }
1152+}
1153+
1154+function solid(ctx,color,points) {
1155+ tracePoints(ctx,points);
1156+ ctx.strokeStyle = Elm.Color.extract(color);
1157+ ctx.stroke();
1158+};
1159+
1160+function filled(ctx,color,points) {
1161+ tracePoints(ctx,points);
1162+ ctx.fillStyle = Elm.Color.extract(color);
1163+ ctx.fill();
1164+}
1165+
1166+function textured(redo,ctx,src,points) {
1167+ var img = new Image();
1168+ img.src = JS.castStringToJSString(src);
1169+ img.onload = redo;
1170+
1171+ tracePoints(ctx,points);
1172+ ctx.fillStyle = ctx.createPattern(img,'repeat');
1173+ ctx.fill();
1174+}
1175+
1176+function customLine(pattern,ctx,color,points) {
1177+ if (pattern.length === 0) { pattern = [8,4]; }
1178+ customLineHelp(ctx, pattern, points);
1179+ ctx.strokeStyle = Elm.Color.extract(color);
1180+ ctx.stroke();
1181+};
1182+
1183+var customLineHelp = function(ctx, pattern, points) {
1184+ var i = points.length - 1;
1185+ if (i <= 0) return;
1186+ var x0 = points[i][1], y0 = points[i][2];
1187+ var x1=0, y1=0, dx=0, dy=0, remaining=0, nx=0, ny=0;
1188+ var pindex = 0, plen = pattern.length;
1189+ var draw = true, segmentLength = pattern[0];
1190+ ctx.moveTo(x0,y0);
1191+ while (i--) {
1192+ x1 = points[i][1]; y1 = points[i][2];
1193+ dx = x1 - x0; dy = y1 - y0;
1194+ remaining = Math.sqrt(dx * dx + dy * dy);
1195+ while (segmentLength <= remaining) {
1196+ x0 += dx * segmentLength / remaining;
1197+ y0 += dy * segmentLength / remaining;
1198+ ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);
1199+ // update starting position
1200+ dx = x1 - x0; dy = y1 - y0;
1201+ remaining = Math.sqrt(dx * dx + dy * dy);
1202+ // update pattern
1203+ draw = !draw;
1204+ pindex = (pindex + 1) % plen;
1205+ segmentLength = pattern[pindex];
1206+ }
1207+ if (remaining > 0) {
1208+ ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);
1209+ segmentLength -= remaining;
1210+ }
1211+ x0 = x1; y0 = y1;
1212+ }
1213+};
1214+
1215+function drawLine(ctx,form) {
1216+ var points = form[3][1];
1217+ switch(form[1][0]) {
1218+ case "Solid" : return solid(ctx,form[2],points);
1219+ case "Dotted": return customLine([3,3],ctx,form[2],points);
1220+ case "Dashed": return customLine([8,4],ctx,form[2],points);
1221+ case "Custom": return customLine(form[1][1],ctx,form[2],points);
1222+ }
1223+};
1224+
1225+function drawShape(redo,ctx,shapeStyle,color,points) {
1226+ switch(shapeStyle[0]) {
1227+ case "Filled": return filled(ctx,color,points);
1228+ case "Outlined": return solid(ctx,color,points);
1229+ case "Textured": return textured(redo,ctx,shapeStyle[1],points);
1230+ case "CustomOutline":
1231+ return customLine(shapeStyle[1],ctx,color,points);
1232+ }
1233+};
1234+
1235+function drawImage(redo,ctx,w,h,src) {
1236+ var img = new Image();
1237+ img.onload = redo;
1238+ img.src = JS.castStringToJSString(src);
1239+ ctx.drawImage(img,-w/2,-h/2,w,h);
1240+}
1241+
1242+function renderForm(redo,ctx,theta,scale,x,y,form) {
1243+ ctx.save();
1244+ if (x !== 0 || y !== 0) ctx.translate(x,y);
1245+ if (theta !== ~~theta) ctx.rotate(2*Math.PI*theta);
1246+ if (scale !== 1) ctx.scale(scale,scale);
1247+ ctx.beginPath();
1248+ switch(form[0]) {
1249+ case "FLine": drawLine(ctx,form); break;
1250+ case "FShape": drawShape(redo,ctx,form[1],form[2],form[3][1]); break;
1251+ case "FImage": drawImage(redo,ctx,form[1],form[2],form[3]); break;
1252+ }
1253+ ctx.restore();
1254+};
1255+
1256+function renderForms(redo,ctx,w,h,forms) {
1257+ ctx.clearRect(0,0,w,h);
1258+ for (var i = forms.length; i--; ) {
1259+ var f = forms[i];
1260+ renderForm(redo,ctx,f[1],f[2],f[3][1],f[3][2],f[4]);
1261+ }
1262+}
1263+
1264+function collageForms(w,h,forms) {
1265+ var canvas = Render.newElement('canvas');
1266+ w = ~~w;
1267+ h = ~~h;
1268+ canvas.style.width = w + 'px';
1269+ canvas.style.height = h + 'px';
1270+ canvas.style.display = "block";
1271+ canvas.width = w;
1272+ canvas.height = h;
1273+ if (canvas.getContext) {
1274+ var ctx = canvas.getContext('2d');
1275+ function redo() { renderForms(this,ctx,w,h,forms); }
1276+ renderForms(redo,ctx,w,h,forms);
1277+ return canvas;
1278+ }
1279+ canvas.innerHTML = "Your browser does not support the canvas element.";
1280+ return canvas;
1281+};
1282+
1283+function applyTransforms(theta,scale,x,y,w,h,e) {
1284+ var t = "translate(" + (x - w / 2) + "px,"+ (y - h / 2) + "px)";
1285+ var r = theta === (~~theta) ? "" : "rotate(" + theta*360 + "deg)";
1286+ var s = scale === 1 ? "" : "scale(" + scale + "," + scale + ")";
1287+ var transforms = t + " " + s + " " + r;
1288+ e.style.transform = transforms;
1289+ e.style.msTransform = transforms;
1290+ e.style.MozTransform = transforms;
1291+ e.style.webkitTransform = transforms;
1292+ e.style.OTransform = transforms;
1293+}
1294+
1295+function collageElement(w,h,theta,scale,x,y,elem) {
1296+ var e = Render.render(elem);
1297+ applyTransforms(theta,scale,x,y,elem[3],elem[4],e);
1298+ var div = Render.newElement('div');
1299+ Render.addTo(div,e);
1300+ div.style.width = (~~w) + "px";
1301+ div.style.height = (~~h) + "px";
1302+ div.style.overflow = "hidden";
1303+ return div;
1304+}
1305+
1306+function collage(w,h,formss) {
1307+ if (formss.length === 0) { return collageForms(w,h,[]); }
1308+ var elems = new Array(formss.length);
1309+ for (var i = formss.length; i--; ) {
1310+ var f = formss[i];
1311+ if (typeof f[0] === "string") {
1312+ elems[i] = collageElement(w,h,f[1],f[2],f[3][1],f[3][2],f[4][1]);
1313+ } else {
1314+ elems[i] = collageForms(w,h,f);
1315+ }
1316+ }
1317+ if (formss.length === 1) { return elems[0]; }
1318+ return Render.flowWith(Render.goIn,function(x){return x},elems);
1319+}
1320+
1321+function updateFormSet(node,currSet,nextSet) {
1322+ if (Value.eq(nextSet,currSet)) return;
1323+ var w = node.style.width.slice(0,-2) - 0;
1324+ var h = node.style.height.slice(0,-2) - 0;
1325+ if (typeof nextSet[0] === "object") {
1326+ if (typeof currSet[0] === "object") {
1327+ if (node.getContext) {
1328+ var ctx = node.getContext('2d');
1329+ function redo() { renderForms(this,ctx,w,h,nextSet); }
1330+ return renderForms(redo,ctx,w,h,nextSet);
1331+ }
1332+ }
1333+ var newNode = collageForms(w,h,nextSet);
1334+ newNode.style.position = 'absolute';
1335+ return node.parentNode.replaceChild(newNode,node);
1336+ }
1337+ node.style.width = (~~w) + "px";
1338+ node.style.height = (~~h) + "px";
1339+ var f = nextSet;
1340+ var next = nextSet[4][1];
1341+ Render.update(node.firstChild, currSet[4][1], next);
1342+ applyTransforms(f[1],f[2],f[3][1],f[3][2],next[3],next[4],node.firstChild);
1343+}
1344+
1345+// assumes that the form sets are the same length.
1346+function updateCollage(node,currs,nexts) {
1347+ if (nexts.length === 1) {
1348+ return updateFormSet(node,currs[0],nexts[0]);
1349+ }
1350+ var kids = node.childNodes;
1351+ var len = kids.length;
1352+ for (var i = len; i--; ) {
1353+ updateFormSet(kids[len-i-1], currs[i], nexts[i]);
1354+ }
1355+}
1356+
1357+function style(clr,n,list) {
1358+ return ["Tuple2",
1359+ '<span style="font-size:100%;color:' + clr + ';">' + n + '</span>',
1360+ list];
1361+}
1362+
1363+function insideForm(point) { return function(form) {
1364+ if (!inBoundsOf(point[1],point[2],form)) return false;
1365+ var hw, hh;
1366+ switch (form[4][0]) {
1367+ case "FShape": return insideShape(point,form[1],form[2],form[3],form[4][3][1]);
1368+ case "FLine": return false;
1369+ case "FImage":
1370+ hw = form[4][1] / 2;
1371+ hh = form[4][2] / 2;
1372+ break;
1373+ case "FElement":
1374+ hw = form[4][1][3] / 2;
1375+ hh = form[4][1][4] / 2;
1376+ break;
1377+ }
1378+ return insideShape(point,form[1],form[2],form[3],
1379+ [ [null, hw, hh],
1380+ [null,-hw, hh],
1381+ [null,-hw,-hh],
1382+ [null, hw,-hh],
1383+ [null, hw, hh] ]);
1384+ };
1385+}
1386+
1387+function inBoundsOf(px,py,form) {
1388+ if (form.length < 6) {
1389+ var fx = form[3][1], fy = form[3][2];
1390+ var radiusSquared = 0;
1391+ var scale = form[2];
1392+ switch (form[4][0]) {
1393+ case "FShape":
1394+ var points = form[4][3][1];
1395+ for (var i = points.length; --i; ) {
1396+ var p = points[i];
1397+ radiusSquared = Math.max(radiusSquared, p[1]*p[1] + p[2]*p[2]);
1398+ }
1399+ radiusSquared *= scale * scale;
1400+ break;
1401+ case "FLine":
1402+ break;
1403+ case "FImage":
1404+ var x = scale * form[4][1] / 2;
1405+ var y = scale * form[4][2] / 2;
1406+ radiusSquared = x*x + y*y;
1407+ break;
1408+ case "FElement":
1409+ var x = scale * form[4][1][3] / 2;
1410+ var y = scale * form[4][1][4] / 2;
1411+ radiusSquared = x*x + y*y;
1412+ break;
1413+ }
1414+ form.push(function(px,py) {
1415+ var dx = px - fx;
1416+ var dy = py - fy;
1417+ return dx*dx + dy*dy < radiusSquared + 1;
1418+ });
1419+ }
1420+ return form[5](px,py);
1421+}
1422+
1423+function insideShape(point,theta,scale,pos,points) {
1424+ var counter = 0;
1425+ var list = ["Nil"];
1426+ var p1,p2;
1427+
1428+ var x = (point[1] - pos[1]) / scale;
1429+ var y = (point[2] - pos[2]) / scale;
1430+ if (theta !== 0) {
1431+ var t = -2 * Math.PI * theta;
1432+ var nx = x * Math.cos(t) - y * Math.sin(t);
1433+ y = x * Math.sin(t) + y * Math.cos(t);
1434+ x = nx;
1435+ }
1436+
1437+ if (points.length === 0) { return false; }
1438+ p1 = points[0];
1439+ for (var i = points.length - 1; i--; ) {
1440+ p2 = points[i];
1441+ var p1x = p1[1], p1y = p1[2], p2x = p2[1], p2y = p2[2];
1442+
1443+ if (p1y < p2y) {var ymin=p1y, ymax=p2y;} else {var ymin=p2y, ymax=p1y;}
1444+ if (p1x < p2x) {var xmin=p1x, xmax=p2x;} else {var xmin=p2x, xmax=p1x;}
1445+
1446+ if (ymin < y && y <= ymax && x <= xmax) {
1447+ if (x <= xmin || x <= ((y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x)) {
1448+ ++counter;
1449+ }
1450+ }
1451+ p1 = p2;
1452+ }
1453+ return (counter % 2) === 1;
1454+}
1455+
1456+return {collage:collage, updateCollage:updateCollage, insideForm:insideForm};
1457+
1458+}();Elm.Graphics = function() {
1459+ for (this['i'] in Elm.List) {
1460+ eval('var ' + this['i'] + ' = Elm.List[this.i];');
1461+ }
1462+ var JS = Elm.JavaScript;
1463+ var DLeft_0 = ["DLeft"];
1464+ var DRight_1 = ["DRight"];
1465+ var DUp_2 = ["DUp"];
1466+ var DDown_3 = ["DDown"];
1467+ var DIn_4 = ["DIn"];
1468+ var DOut_5 = ["DOut"];
1469+ function Absolute_12(a1) {
1470+ return["Absolute", a1]
1471+ }
1472+ function Relative_13(a1) {
1473+ return["Relative", a1]
1474+ }
1475+ var Near_14 = ["Near"];
1476+ var Mid_15 = ["Mid"];
1477+ var Far_16 = ["Far"];
1478+ function Position_17(a1) {
1479+ return function(a2) {
1480+ return["Position", a1, a2]
1481+ }
1482+ }
1483+ function PositionTL_18(a1) {
1484+ return function(a2) {
1485+ return["PositionTL", a1, a2]
1486+ }
1487+ }
1488+ function PositionTR_19(a1) {
1489+ return function(a2) {
1490+ return["PositionTR", a1, a2]
1491+ }
1492+ }
1493+ function PositionBL_20(a1) {
1494+ return function(a2) {
1495+ return["PositionBL", a1, a2]
1496+ }
1497+ }
1498+ function PositionBR_21(a1) {
1499+ return function(a2) {
1500+ return["PositionBR", a1, a2]
1501+ }
1502+ }
1503+ function Element_37(id,e,w,h,o,c,l) {
1504+ return["Element", id, e, w, h, o, c, l ]
1505+ }
1506+ function EText_39(a1) {
1507+ return function(a2) {
1508+ return["EText", a1, a2]
1509+ }
1510+ }
1511+ function EImage_40(a1) {
1512+ return["EImage", JS.castStringToJSString(a1)]
1513+ }
1514+ function EVideo_41(a1) {
1515+ return["EVideo", JS.castStringToJSString(a1)]
1516+ }
1517+ function EFittedImage_42(a1) {
1518+ return["EFittedImage", JS.castStringToJSString(a1)]
1519+ }
1520+ function EFlow_43(a1) {
1521+ return function(a2) {
1522+ return["EFlow", a1, JS.castListToJSArray(a2)]
1523+ }
1524+ }
1525+ function ECollage_44(a1) {
1526+ return function(a2) {
1527+ return function(a3) {
1528+ return["ECollage", a1, a2, Value.groupForms(a3)]
1529+ }
1530+ }
1531+ }
1532+ var EEmpty_45 = ["EEmpty"];
1533+ function EContainer_46(a1) {
1534+ return function(a2) {
1535+ return["EContainer", a1, a2]
1536+ }
1537+ }
1538+ var Solid_68 = ["Solid"];
1539+ var Dotted_69 = ["Dotted"];
1540+ var Dashed_70 = ["Dashed"];
1541+ function Custom_71(a1) {
1542+ return["Custom", JS.castListToJSArray(a1)]
1543+ }
1544+ var Filled_72 = ["Filled"];
1545+ var Outlined_73 = ["Outlined"];
1546+ function CustomOutline_74(a1) {
1547+ return["CustomOutline", JS.castListToJSArray(a1)]
1548+ }
1549+ function Line_75(a1) {
1550+ return["Line", JS.castListToJSArray(a1)]
1551+ }
1552+ function Shape_78(a1) {
1553+ return function(a2) {
1554+ var points = JS.castListToJSArray(a1);
1555+ if (points.length > 0) { points.push(points[0]); }
1556+ return["Shape", points, a2];
1557+ }
1558+ }
1559+ function Form_84(a1) {
1560+ return function(a2) {
1561+ return function(a3) {
1562+ return function(a4) {
1563+ return["Form", a1, a2, a3, a4]
1564+ }
1565+ }
1566+ }
1567+ }
1568+ function FLine_85(a1) {
1569+ return function(a2) {
1570+ return function(a3) {
1571+ return["FLine", a1, a2, a3]
1572+ }
1573+ }
1574+ }
1575+ function FShape_86(a1) {
1576+ return function(a2) {
1577+ return function(a3) {
1578+ return["FShape", a1, a2, a3]
1579+ }
1580+ }
1581+ }
1582+ function FImage_87(a1) {
1583+ return function(a2) {
1584+ return function(a3) {
1585+ return["FImage", a1, a2, JS.castStringToJSString(a3)]
1586+ }
1587+ }
1588+ }
1589+ function FElement_88(a1) {
1590+ return["FElement", a1]
1591+ }
1592+ var left_6 = DLeft_0;
1593+ var right_7 = DRight_1;
1594+ var down_8 = DDown_3;
1595+ var up_9 = DUp_2;
1596+ var inward_10 = DIn_4;
1597+ var outward_11 = DOut_5;
1598+ var topLeft_22 = Position_17(Near_14)(Near_14);
1599+ var topRight_23 = Position_17(Far_16)(Near_14);
1600+ var bottomLeft_24 = Position_17(Near_14)(Far_16);
1601+ var bottomRight_25 = Position_17(Far_16)(Far_16);
1602+ var midLeft_26 = Position_17(Near_14)(Mid_15);
1603+ var midRight_27 = Position_17(Far_16)(Mid_15);
1604+ var midTop_28 = Position_17(Mid_15)(Near_14);
1605+ var midBottom_29 = Position_17(Mid_15)(Far_16);
1606+ var middle_30 = Position_17(Mid_15)(Mid_15);
1607+ function middleAt(a1) {
1608+ return function(a2) {
1609+ return["PositionAt", a1, a2]
1610+ }
1611+ }
1612+ var topLeftAt_31 = PositionTL_18;
1613+ var topRightAt_32 = PositionTR_19;
1614+ var bottomLeftAt_33 = PositionBL_20;
1615+ var bottomRightAt_34 = PositionBR_21;
1616+ var absolute_35 = Absolute_12;
1617+ var relative_36 = Relative_13;
1618+ function newElement_38(e,w,h,o,c,l) { return Element_37(Guid.guid(),e,w,h,o,c,l); }
1619+ function basicNewElement(e,w,h) { return Element_37(Guid.guid(),e,w,h,1,["Nothing"],["Nothing"]); }
1620+ var line_76 = Line_75;
1621+ var polygon_79 = Shape_78;
1622+ function sprite_96(src) {
1623+ return function(w) {
1624+ return function(h) {
1625+ return function(pos) {
1626+ return Form_84(0)(1)(pos)(FImage_87(w)(h)(src))
1627+ }
1628+ }
1629+ }
1630+ }
1631+ function toForm_97(pos) {
1632+ return function(e) {
1633+ return Form_84(0)(1)(pos)(FElement_88(e))
1634+ }
1635+ }
1636+ function width_47(w__101) {
1637+ return function(e) {
1638+ var be = e[2];
1639+ switch(be[0]) {
1640+ case "EImage":
1641+ case "EVideo":
1642+ return newElement_38(e[2],w__101,e[4] * w__101 / e[3], e[5], e[6], e[7]);
1643+ case "EText":
1644+ var p = Value.getTextSize(w__101,e[4],be[2]);
1645+ return newElement_38(e[2], w__101, p[1], e[5], e[6], e[7]);
1646+ }
1647+ return newElement_38(e[2], w__101, e[4], e[5], e[6], e[7]);
1648+ }
1649+ }
1650+ function height_48(h__108) {
1651+ return function(e) {
1652+ var be = e[2];
1653+ switch(be[0]) {
1654+ case "EImage":
1655+ case "EVideo":
1656+ return newElement_38(e[2], e[3] * h__108 / e[4], h__108, e[5], e[6], e[7]);
1657+ }
1658+ return newElement_38(e[2], e[3], h__108, e[5], e[6], e[7]);
1659+ }
1660+ }
1661+ function size_49(w) {
1662+ return function(h) {
1663+ return function(e) {
1664+ return newElement_38(e[2], w, h, e[5], e[6], e[7]);
1665+ }
1666+ }
1667+ }
1668+ function opacity_50(o) {
1669+ return function(e) {
1670+ return newElement_38(e[2], e[3], e[4], o, e[6], e[7]);
1671+ }
1672+ }
1673+ function color_51(c) {
1674+ return function(e) {
1675+ return newElement_38(e[2], e[3], e[4], e[5], ["Just",c], e[7]);
1676+ }
1677+ }
1678+ function link(lnk) {
1679+ return function(e) {
1680+ return newElement_38(e[2], e[3], e[4], e[5], e[6], ["Just", JS.castStringToJSString(lnk)]);
1681+ }
1682+ }
1683+ function widthOf_52(e) { return ~~e[3]; }
1684+ function heightOf_53(e) { return ~~e[4]; }
1685+ function sizeOf_54(e) { return["Tuple2", ~~e[3], ~~e[4]] }
1686+ function text_56(txt) {
1687+ var p = Value.getTextSize(0,0,txt);
1688+ return basicNewElement(EText_39("left")(txt), p[0], p[1])
1689+ }
1690+ function plainText(str) {
1691+ var txt = Value.toText(str);
1692+ var p = Value.getTextSize(0,0,txt);
1693+ return basicNewElement(EText_39("left")(txt),p[0],p[1])
1694+ }
1695+ function asText(v) {
1696+ var txt = Elm.Text.monospace(Value.toText(Value.show(v)));
1697+ var p = Value.getTextSize(0,0,txt);
1698+ return basicNewElement(EText_39("left")(txt),p[0],p[1])
1699+ }
1700+ function centeredText(txt) {
1701+ var p = Value.getTextSize(0,0,txt);
1702+ return basicNewElement(EText_39("center")(txt),p[0],p[1])
1703+ }
1704+ function justifiedText(txt) {
1705+ var p = Value.getTextSize(0,0,txt);
1706+ return basicNewElement(EText_39("justify")(txt),p[0],p[1])
1707+ }
1708+ function rightedText(txt) {
1709+ var p = Value.getTextSize(0,0,txt);
1710+ return basicNewElement(EText_39("right")(txt),p[0],p[1])
1711+ }
1712+ function image_57(w) {
1713+ return function(h) {
1714+ return function(src) {
1715+ return basicNewElement(EImage_40(src),w,h)
1716+ }
1717+ }
1718+ }
1719+ function images(srcs) {
1720+ var pics = Elm.Signal.constant(spacer_66(0)(0));
1721+ var update = Elm.Signal.lift(function(src) {
1722+ src = JS.castStringToJSString(src);
1723+ var img = new Image();
1724+ img.onload = function() {
1725+ Dispatcher.notify(pics.id,
1726+ image_57(this.width)(this.height)(src));
1727+ };
1728+ img.src = src;
1729+ })(srcs);
1730+ function f(x) { return function(y) { return x; } }
1731+ var combine = Elm.Signal.lift2(f)(pics)(update);
1732+ return combine;
1733+ }
1734+ function video_58(w) {
1735+ return function(h) {
1736+ return function(src) {
1737+ return basicNewElement(EVideo_41(src),w,h)
1738+ }
1739+ }
1740+ }
1741+ function fittedImage_59(w_147) {
1742+ return function(h_148) {
1743+ return function(s_149) {
1744+ return basicNewElement(EFittedImage_42(s_149),w_147,h_148)
1745+ }
1746+ }
1747+ }
1748+ function flow_60(dir_150) {
1749+ return function(es_151) {
1750+ return function() {
1751+ var w_152 = function() {
1752+ var ws_154 = map(widthOf_52)(es_151);
1753+ return function(case1) {
1754+ var case0 = case1;
1755+ switch(case0[0]) {
1756+ case "DLeft":
1757+ return sum(ws_154);
1758+ case "DRight":
1759+ return sum(ws_154)
1760+ }
1761+ return maximum(ws_154)
1762+ }(dir_150)
1763+ }();
1764+ var h_153 = function() {
1765+ var hs_155 = map(heightOf_53)(es_151);
1766+ return function(case3) {
1767+ var case2 = case3;
1768+ switch(case2[0]) {
1769+ case "DDown":
1770+ return sum(hs_155);
1771+ case "DUp":
1772+ return sum(hs_155)
1773+ }
1774+ return maximum(hs_155)
1775+ }(dir_150)
1776+ }();
1777+ return basicNewElement(EFlow_43(dir_150)(es_151), w_152, h_153)
1778+ }()
1779+ }
1780+ }
1781+ function above_61(e1_156) {
1782+ return function(e2_157) {
1783+ return basicNewElement(EFlow_43(DDown_3)(["Cons", e1_156, ["Cons", e2_157, ["Nil"]]]), Math.max(widthOf_52(e1_156),widthOf_52(e2_157)), heightOf_53(e1_156) + heightOf_53(e2_157));
1784+ }
1785+ }
1786+ function below_62(e1_158) {
1787+ return function(e2_159) {
1788+ return basicNewElement(EFlow_43(DDown_3)(["Cons", e2_159, ["Cons", e1_158, ["Nil"]]]), Math.max(widthOf_52(e1_158),widthOf_52(e2_159)), heightOf_53(e1_158) + heightOf_53(e2_159));
1789+ }
1790+ }
1791+ function beside_63(e1_160) {
1792+ return function(e2_161) {
1793+ return basicNewElement(EFlow_43(DRight_1)(["Cons", e1_160, ["Cons", e2_161, ["Nil"]]]), widthOf_52(e1_160) + widthOf_52(e2_161), Math.max(heightOf_53(e1_160),heightOf_53(e2_161)));
1794+ }
1795+ }
1796+ function layers_64(es_162) {
1797+ return basicNewElement(EFlow_43(DOut_5)(es_162), maximum(map(widthOf_52)(es_162)), maximum(map(heightOf_53)(es_162)))
1798+ }
1799+ function collage_65(w_163) {
1800+ return function(h_164) {
1801+ return function(forms_165) {
1802+ return basicNewElement(ECollage_44(w_163)(h_164)(forms_165),w_163,h_164)
1803+ }
1804+ }
1805+ }
1806+ function spacer_66(w_166) {
1807+ return function(h_167) {
1808+ return basicNewElement(EEmpty_45,w_166,h_167)
1809+ }
1810+ }
1811+ function container_67(w_169) {
1812+ return function(h_170) {
1813+ return function(pos_168) {
1814+ return function(e_171) {
1815+ return basicNewElement(EContainer_46(pos_168)(e_171),w_169,h_170)
1816+ }
1817+ }
1818+ }
1819+ }
1820+ function segment_77(p1_172) {
1821+ return function(p2_173) {
1822+ return Line_75(["Cons", p1_172, ["Cons", p2_173, ["Nil"]]])
1823+ }
1824+ }
1825+ function rect_80(w_174) {
1826+ return function(h_175) {
1827+ return function(pos_176) {
1828+ return Shape_78(["Cons", ["Tuple2", 0 - w_174 / 2, 0 - h_175 / 2],
1829+ ["Cons", ["Tuple2", 0 - w_174 / 2, h_175 / 2],
1830+ ["Cons", ["Tuple2", w_174 / 2, h_175 / 2],
1831+ ["Cons", ["Tuple2", w_174 / 2, 0 - h_175 / 2], ["Nil"]]]]])(pos_176)
1832+ }
1833+ }
1834+ }
1835+ function oval_81(w_177) {
1836+ return function(h_178) {
1837+ return function(pos_179) {
1838+ return function() {
1839+ var n_180 = 50;
1840+ return function() {
1841+ function f_181(i_182) {
1842+ return["Tuple2", w_177 / 2 * Math.cos(2 * (Math.PI / n_180) * i_182), h_178 / 2 * Math.sin(2 * (Math.PI / n_180) * i_182)];
1843+ }
1844+ return Shape_78(map(f_181)(function() {
1845+ var lo = 0;
1846+ var hi = n_180 - 1;
1847+ var lst = ["Nil"];
1848+ if(lo <= hi) {
1849+ do {
1850+ lst = ["Cons", hi, lst]
1851+ }while(hi-- > lo)
1852+ }
1853+ return lst
1854+ }()))(pos_179)
1855+ }()
1856+ }()
1857+ }
1858+ }
1859+ }
1860+ function circle_82(r_183) {
1861+ return oval_81(2 * r_183)(2 * r_183)
1862+ }
1863+ function ngon_83(n_184) {
1864+ return function(r_185) {
1865+ return function(pos_186) {
1866+ return function() {
1867+ var m_187 = n_184;
1868+ return function() {
1869+ function f_188(i_189) {
1870+ return["Tuple2", r_185 * Math.cos(2 * (Math.PI / m_187) * i_189), r_185 * Math.sin(2 * (Math.PI / m_187) * i_189)];
1871+ }
1872+ return Shape_78(map(f_188)(function() {
1873+ var lo = 0;
1874+ var hi = n_184 - 1;
1875+ var lst = ["Nil"];
1876+ if(lo <= hi) {
1877+ do {
1878+ lst = ["Cons", hi, lst]
1879+ }while(hi-- > lo)
1880+ }
1881+ return lst
1882+ }()))(pos_186)
1883+ }()
1884+ }()
1885+ }
1886+ }
1887+ }
1888+ function solid_89(clr_190) {
1889+ return function(ln_191) {
1890+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Solid_68)(clr_190)(ln_191))
1891+ }
1892+ }
1893+ function dotted_90(clr_192) {
1894+ return function(ln_193) {
1895+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dotted_69)(clr_192)(ln_193))
1896+ }
1897+ }
1898+ function dashed_91(clr_194) {
1899+ return function(ln_195) {
1900+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dashed_70)(clr_194)(ln_195))
1901+ }
1902+ }
1903+ function customLine_92(pattern_196) {
1904+ return function(clr_197) {
1905+ return function(ln_198) {
1906+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Custom_71(pattern_196))(clr_197)(ln_198))
1907+ }
1908+ }
1909+ }
1910+ function filled_93(clr) {
1911+ return function(shape) {
1912+ return Form_84(0)(1)(shape[2])(FShape_86(Filled_72)(clr)(shape));
1913+ }
1914+ }
1915+ function outlined_94(clr) {
1916+ return function(shape) {
1917+ return Form_84(0)(1)(shape[2])(FShape_86(Outlined_73)(clr)(shape));
1918+ }
1919+ }
1920+ function customOutline_95(pattern) {
1921+ return function(clr) {
1922+ return function(shape) {
1923+ return Form_84(0)(1)(shape[2])(FShape_86(CustomOutline_74(pattern))(clr)(shape));
1924+ }
1925+ }
1926+ }
1927+ function textured(src) {
1928+ return function(shape) {
1929+ return Form_84(0)(1)(shape[2])(FShape_86(["Textured",src])(null)(shape));
1930+ }
1931+ }
1932+ function rotate_98(t_212) {
1933+ return function(Form$thetascaleposform_213) {
1934+ return function(case5) {
1935+ var case0 = case5;
1936+ switch(case0[0]) {
1937+ case "Form":
1938+ var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1939+ return Form_84(t_212 + case1)(case2)(case3)(case4)
1940+ }
1941+ throw"Non-exhaustive pattern match in case";
1942+ }(Form$thetascaleposform_213)
1943+ }
1944+ }
1945+ function scale_99(s) {
1946+ return function(form) {
1947+ return Form_84(form[1])(s * form[2])(form[3])(form[4])
1948+ }
1949+ }
1950+ function move_100(x_224) {
1951+ return function(y_225) {
1952+ return function(Form$thetascaleTuple2$pxpyform_226) {
1953+ return function(case7) {
1954+ var case0 = case7;
1955+ switch(case0[0]) {
1956+ case "Form":
1957+ var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1958+ switch(case3[0]) {
1959+ case "Tuple2":
1960+ var case5 = case3[1], case6 = case3[2];
1961+ return Form_84(case1)(case2)(["Tuple2", x_224 + case5, y_225 + case6])(case4)
1962+ }
1963+ break
1964+ }
1965+ throw"Non-exhaustive pattern match in case";
1966+ }(Form$thetascaleTuple2$pxpyform_226)
1967+ }
1968+ }
1969+ }
1970+ 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,
1971+ 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,
1972+ outlined:outlined_94, customOutline:customOutline_95, textured:textured, sprite:sprite_96, toForm:toForm_97, rotate:rotate_98, scale:scale_99, move:move_100,
1973+ isWithin: Collage.insideForm}
1974+}();
1975+Elm.Text = function() {
1976+ function fromString(s) { return Value.toText(s); }
1977+
1978+ var addTag = function(tag) { return function(text) {
1979+ return '<' + tag + ' style="padding:0;margin:0">' + text + '</' + tag + '>';
1980+ };
1981+ };
1982+ var addStyle = function(style, value) { return function(text) {
1983+ return "<span style='" + style + ":" + value + "'>" + text + "</span>";
1984+ };
1985+ };
1986+
1987+ var typeface = function(name) {
1988+ name = Elm.JavaScript.castStringToJSString(name);
1989+ return addStyle('font-family', name);
1990+ };
1991+ var size = function(px) {
1992+ return addStyle('font-size', px + 'px');
1993+ };
1994+ var header = addTag('h1');
1995+ var height = function(h) { return addStyle('font-size', h+'em'); }
1996+ var italic = addStyle('font-style', 'italic');
1997+ var bold = addTag('b');
1998+ var color = function(c) {
1999+ return addStyle('color', Elm.Color.extract(c));
2000+ };
2001+ var underline = addStyle('text-decoration', 'underline');
2002+ var overline = addStyle('text-decoration', 'overline');
2003+ var strikeThrough = addStyle('text-decoration', 'line-through');
2004+ var link = function(href) { return function(text) {
2005+ return "<a href='" + fromString(href) + "'>" + text + "</a>";
2006+ };
2007+ };
2008+
2009+ return {fromString : fromString,
2010+ toText: fromString,
2011+ header : header,
2012+ height : height,
2013+ italic : italic,
2014+ bold : bold,
2015+ underline : underline,
2016+ overline : overline,
2017+ strikeThrough : strikeThrough,
2018+ monospace : typeface('monospace'),
2019+ typeface : typeface,
2020+ color : color,
2021+ link : link };
2022+}();
2023+
2024+var Render = function(){
2025+
2026+function newElement(elementType) {
2027+ var e = document.createElement(elementType);
2028+ e.style.padding = "0";
2029+ e.style.margin = "0";
2030+ return e;
2031+};
2032+
2033+function addTo(container, elem) {
2034+ container.appendChild(elem);
2035+};
2036+
2037+function makeText(pos,txt) {
2038+ var e = newElement('div');
2039+ e.innerHTML = txt;
2040+ e.style.textAlign = pos;
2041+ return e;
2042+};
2043+
2044+function image(src) {
2045+ var img = newElement('img');
2046+ img.src = src;
2047+ img.name = src;
2048+ img.style.display = "block";
2049+ return img;
2050+}
2051+
2052+function fittedImage(w,h,src) {
2053+ var e = newElement('div');
2054+ e.style.width = w + 'px';
2055+ e.style.height = h + 'px';
2056+ e.style.position = "relative";
2057+ e.style.overflow = "hidden";
2058+
2059+ var img = newElement('img');
2060+ img.onload = function() {
2061+ img.style.position = 'absolute';
2062+ img.style.margin = 'auto';
2063+
2064+ var sw = w, sh = h;
2065+ if (w / h > this.width / this.height) {
2066+ sh = Math.round(this.height * w / this.width);
2067+ } else {
2068+ sw = Math.round(this.width * h / this.height);
2069+ }
2070+ img.style.width = sw + 'px';
2071+ img.style.height = sh + 'px';
2072+ img.style.left = ((w - sw) / 2) + 'px';
2073+ img.style.top = ((h - sh) / 2) + 'px';
2074+ };
2075+ img.src = src;
2076+ img.name = src;
2077+ addTo(e,img);
2078+ return e;
2079+};
2080+
2081+var video = function(src) {
2082+ var e = newElement('video');
2083+ e.controls = "controls";
2084+ var source = newElement('source');
2085+ source.src = src;
2086+ var segs = src.split('.');
2087+ source.type = "video/" + segs[segs.length-1];
2088+ addTo(e, source);
2089+ e.style.display = "block";
2090+ return e;
2091+};
2092+
2093+function divify(e) {
2094+ var div = newElement('div');
2095+ addTo(div, e);
2096+ return div;
2097+};
2098+function goDown(e) {
2099+ return e //.tagName === "DIV" ? e : divify(e);
2100+};
2101+function goRight(e) {
2102+ e.style.styleFloat = "left";
2103+ e.style.cssFloat = "left";
2104+ return e;
2105+};
2106+function goIn(e) {
2107+ e.style.position = 'absolute';
2108+ return e;
2109+};
2110+function flowWith(f, prep, elist) {
2111+ var container = newElement('div');
2112+ for (var i = elist.length; i--; ) {
2113+ addTo(container, f(prep(elist[i])));
2114+ }
2115+ return container;
2116+};
2117+
2118+function flow(dir,elist) {
2119+ switch(dir) {
2120+ case "DDown": elist = elist.slice(0).reverse();
2121+ case "DUp": return flowWith(goDown,render,elist);
2122+ case "DRight": elist = elist.slice(0).reverse();
2123+ case "DLeft": return flowWith(goRight,render,elist);
2124+ case "DOut": elist = elist.slice(0).reverse();
2125+ case "DIn": return flowWith(goIn,render,elist);
2126+ };
2127+};
2128+
2129+function toPos(pos) {
2130+ switch(pos[0]) {
2131+ case "Absolute": return pos[1] + "px";
2132+ case "Relative": return (pos[1] * 100) + "%";
2133+ }
2134+}
2135+
2136+function setPos(pos,e) {
2137+ e.style.position = 'absolute';
2138+ e.style.margin = 'auto';
2139+ switch(pos[0]) {
2140+ case "Position":
2141+ if (pos[1][0] !== "Far") e.style.left = 0;
2142+ if (pos[1][0] !== "Near") e.style.right = 0;
2143+ if (pos[2][0] !== "Far") e.style.top = 0;
2144+ if (pos[2][0] !== "Near") e.style.bottom = 0;
2145+ break;
2146+ case "PositionAt":
2147+ e.style.top = toPos(pos[2]);
2148+ e.style.left = toPos(pos[1]);
2149+ var shift = "translate(" + ~~(-e.style.width.slice(0,-2) / 2) + "px," + ~~(-e.style.height.slice(0,-2) / 2) + "px)";
2150+ e.style.transform = shift;
2151+ e.style.msTransform = shift;
2152+ e.style.MozTransform = shift;
2153+ e.style.webkitTransform = shift;
2154+ e.style.OTransform = shift;
2155+ break;
2156+ default:
2157+ var p = pos[0].slice(-2);
2158+ e.style[p[0] === "T" ? 'top' : 'bottom'] = toPos(pos[2]);
2159+ e.style[p[1] === "L" ? 'left' : 'right'] = toPos(pos[1]);
2160+ }
2161+}
2162+
2163+function container(pos,elem) {
2164+ var e = render(elem);
2165+ setPos(pos,e);
2166+ var div = newElement('div');
2167+ div.style.position = "relative";
2168+ div.style.overflow = "hidden";
2169+ addTo(div,e);
2170+ return div;
2171+};
2172+
2173+function render(elem) {
2174+ var e = {};
2175+ switch(elem[2][0]) {
2176+ case "EText": e = makeText(elem[2][1],elem[2][2]); break;
2177+ case "EImage": e = image(elem[2][1]); break;
2178+ case "EVideo": e = video(elem[2][1]); break;
2179+ case "EFittedImage": e = fittedImage(elem[3],elem[4],elem[2][1]); break;
2180+ case "EFlow": e = flow(elem[2][1][0],elem[2][2]); break;
2181+ case "ECollage": e = Collage.collage(elem[2][1],elem[2][2],elem[2][3]); break;
2182+ case "EEmpty": e = newElement('div'); break;
2183+ case "EContainer": e = container(elem[2][1],elem[2][2]); break;
2184+ case "EHtml":
2185+ e = elem[2][1];
2186+ if (e.type !== 'button') {
2187+ var p = Value.getExcess(e);
2188+ elem[3] -= p[0];
2189+ elem[4] -= p[1];
2190+ }
2191+ break;
2192+ case "EExternalHtml":
2193+ e = newElement('div');
2194+ addTo(e, elem[2][1]);
2195+ break;
2196+ }
2197+ e.id = elem[1];
2198+ e.style.width = (~~elem[3]) + 'px';
2199+ e.style.height = (~~elem[4]) + 'px';
2200+ if (elem[5] !== 1) { e.style.opacity = elem[5]; }
2201+ if (elem[6][0] === "Just") {
2202+ e.style.backgroundColor = Elm.Color.extract(elem[6][1]);
2203+ }
2204+ if (elem[7][0] === "Just") {
2205+ var a = newElement('a');
2206+ a.href = elem[7][1];
2207+ addTo(a,e);
2208+ return a;
2209+ }
2210+ return e;
2211+};
2212+
2213+function update(node,curr,next) {
2214+ if (node.tagName === 'A') { node = node.firstChild; }
2215+ if (curr[1] === next[1]) return;
2216+ if (curr[2][0] !== next[2][0]) {
2217+ return node.parentNode.replaceChild(render(next),node);
2218+ }
2219+ var nextE = next[2], currE = curr[2];
2220+ switch(nextE[0]) {
2221+ case "EText":
2222+ if (nextE[1] !== currE[1]) node.style.textAlign = nextE[1];
2223+ if (nextE[2] !== currE[2]) node.innerHTML = nextE[2];
2224+ break;
2225+ case "EImage":
2226+ if (nextE[1] !== currE[1]) node.src = nextE[1];
2227+ break;
2228+ case "EVideo":
2229+ case "EFittedImage":
2230+ if (!Value.eq(nextE,currE) || next[3]!==curr[3] || next[4]!==curr[4]) {
2231+ return node.parentNode.replaceChild(render(next),node);
2232+ }
2233+ break;
2234+ case "ECollage":
2235+ if (nextE[1] !== currE[1] || nextE[2] !== currE[2] || nextE[3].length !== currE[3].length) {
2236+ return node.parentNode.replaceChild(render(next),node);
2237+ }
2238+ Collage.updateCollage(node,currE[3],nextE[3]);
2239+ break;
2240+ case "EFlow":
2241+ if (nextE[1] !== currE[1]) {
2242+ return node.parentNode.replaceChild(render(next),node);
2243+ }
2244+ var nexts = nextE[2];
2245+ var kids = node.childNodes;
2246+ if (nexts.length !== kids.length) {
2247+ return node.parentNode.replaceChild(render(next),node);
2248+ }
2249+ var currs = currE[2];
2250+ var goDir = function(x) { return x; };
2251+ switch(nextE[1][0]) {
2252+ case "DDown": case "DUp": goDir = goDown; break;
2253+ case "DRight": case "DLeft": goDir = goRight; break;
2254+ case "DOut": case "DIn": goDir = goIn; break;
2255+ }
2256+ for (var i = kids.length; i-- ;) {
2257+ update(kids[i],currs[i],nexts[i]);
2258+ goDir(kids[i]);
2259+ }
2260+ break;
2261+ case "EContainer":
2262+ update(node.childNodes[0],currE[2],nextE[2]);
2263+ setPos(nextE[1],node.childNodes[0]);
2264+ break;
2265+ case "EEmpty":
2266+ break;
2267+ case "EHtml":
2268+ if (next[1] !== curr[1]) {
2269+ var e = render(next);
2270+ node.parentNode.replaceChild(e,node);
2271+ node = e;
2272+ }
2273+ if (e.type !== 'button') {
2274+ var p = Value.getExcess(node);
2275+ next[3] -= p[0];
2276+ next[4] -= p[1];
2277+ }
2278+ break;
2279+ case "EExternalHtml":
2280+ if (next[1] !== curr[1])
2281+ node.parentNode.replaceChild(render(next),node);
2282+ break;
2283+ }
2284+ if (next[3] !== curr[3]) node.style.width = (~~next[3]) + 'px';
2285+ if (next[4] !== curr[4]) node.style.height = (~~next[4]) + 'px';
2286+ if (next[5] !== curr[5]) node.style.opacity = next[5];
2287+ if (next[6].length === 2) {
2288+ var clr = Elm.Color.extract(next[6][1]);
2289+ if (clr !== node.style.backgroundColor) node.style.backgroundColor = clr;
2290+ }
2291+ if (next[7].length === 2) {
2292+ if (curr[7].length === 1 || next[7][1] !== curr[7][1]) node.parentNode.href = next[7][1];
2293+ }
2294+ next[1] = curr[1];
2295+}
2296+
2297+return {render:render,update:update,addTo:addTo,newElement:newElement,flowWith:flowWith,goIn:goIn};
2298+
2299+}();
2300+Elm.Signal = function() {
2301+ var send = function(node, timestep, changed) {
2302+ var kids = node.kids;
2303+ for (var i = kids.length; i--; ) {
2304+ kids[i].recv(timestep, changed, node.id);
2305+ }
2306+ };
2307+ /**
2308+ * @constructor
2309+ */
2310+ function input(base) {
2311+ this.id = Guid.guid();
2312+ this.value = base;
2313+ this.kids = [];
2314+ this.defaultNumberOfKids = 0;
2315+ this.recv = function(timestep, eid, v) {
2316+ var changed = eid === this.id;
2317+ if (changed) { this.value = v; }
2318+ send(this, timestep, changed);
2319+ return changed;
2320+ };
2321+ Dispatcher.inputs.push(this);
2322+ };
2323+ /**
2324+ * @constructor
2325+ */
2326+ function lift(func,args) {
2327+ this.id = Guid.guid();
2328+ this.value = null;
2329+ this.kids = [];
2330+ this.count = 0;
2331+ this.changed = false;
2332+
2333+ args.reverse();
2334+ this.recalc = function() {
2335+ var f = func;
2336+ for (var i = args.length; i--; ) {
2337+ f = f(args[i].value);
2338+ }
2339+ this.value = f;
2340+ };
2341+ this.recalc();
2342+
2343+ this.recv = function(timestep, changed, parentID) {
2344+ this.count += 1;
2345+ if (changed) { this.changed = true; }
2346+ if (this.count == args.length) {
2347+ if (this.changed) { this.recalc() }
2348+ send(this, timestep, this.changed);
2349+ this.changed = false;
2350+ this.count = 0;
2351+ }
2352+ };
2353+ for (var i = args.length; i--; ) {
2354+ args[i].kids.push(this);
2355+ }
2356+ };
2357+ /**
2358+ * @constructor
2359+ */
2360+ function fold(func,base,baseIsFunc,input) {
2361+ this.id = Guid.guid();
2362+ this.value = baseIsFunc ? base(input.value) : base;
2363+ this.kids = [];
2364+ this.recv = function(timestep, changed, parentID) {
2365+ if (changed) { this.value = func(input.value)(this.value); }
2366+ send(this, timestep, changed);
2367+ };
2368+ input.kids.push(this);
2369+ };
2370+
2371+ /**
2372+ * @constructor
2373+ */
2374+ function dropIf(pred,base,input) {
2375+ this.id = Guid.guid();
2376+ this.value = pred(input.value) ? base : input.value;
2377+ this.kids = [];
2378+ this.recv = function(timestep, changed, parentID) {
2379+ var chng = changed && !pred(input.value);
2380+ if (chng) { this.value = input.value; }
2381+ send(this, timestep, chng);
2382+ };
2383+ input.kids.push(this);
2384+ };
2385+
2386+ /**
2387+ * @constructor
2388+ */
2389+ function dropRepeats(input) {
2390+ this.id = Guid.guid();
2391+ this.value = input.value;
2392+ this.kids = [];
2393+ this.recv = function(timestep, changed, parentID) {
2394+ var chng = changed && !Value.eq(this.value,input.value);
2395+ if (chng) { this.value = input.value; }
2396+ send(this, timestep, chng);
2397+ };
2398+ input.kids.push(this);
2399+ };
2400+
2401+ var dropWhen = function(s1) { return function(b) { return function(s2) {
2402+ var pairs = new lift(function(x){return function(y){return [x,y];};},[s1,s2]);
2403+ var dropped = new dropIf(function(p){return p[0];},[true,b],pairs);
2404+ return new lift(function(p){return p[1];},[dropped]); }; };
2405+ };
2406+
2407+ /**
2408+ * @constructor
2409+ */
2410+ function timeIndex(pair,s) {
2411+ this.id = Guid.guid();
2412+ var t = (new window.Date).getTime();
2413+ this.value = pair ? Value.Tuple(t,s.value) : t;
2414+ this.kids = [];
2415+ this.recv = function(timestep, changed, parentID) {
2416+ if (changed) this.value = pair ? Value.Tuple(timestep, s.value) : timestep;
2417+ send(this, timestep, changed);
2418+ };
2419+ s.kids.push(this);
2420+ }
2421+
2422+ /**
2423+ * @constructor
2424+ */
2425+ function sampleOn(s1,s2) {
2426+ this.id = Guid.guid();
2427+ this.value = s2.value;
2428+ this.kids = [];
2429+ this.count = 0;
2430+ this.changed = false;
2431+
2432+ this.recv = function(timestep, changed, parentID) {
2433+ if (parentID === s1.id) this.changed = changed;
2434+ this.count += 1;
2435+ if (this.count == 2) {
2436+ if (this.changed) { this.value = s2.value; }
2437+ send(this, timestep, this.changed);
2438+ this.count = 0;
2439+ this.changed = false;
2440+ }
2441+ };
2442+ s1.kids.push(this);
2443+ s2.kids.push(this);
2444+ };
2445+
2446+ function delay(t) { return function(s) {
2447+ var delayed = new input(s.value);
2448+ var firstEvent = true;
2449+ function update(v) {
2450+ if (firstEvent) return;
2451+ setTimeout(function() { Dispatcher.notify(delayed.id,v); },t);
2452+ }
2453+ function first(a) { return function(b) { return a; }; }
2454+ var out = new sampleOn(delayed,new lift(first, [delayed, new lift(update,[s])]));
2455+ firstEvent = false;
2456+ return out;
2457+ };
2458+ }
2459+
2460+ /**
2461+ * @constructor
2462+ */
2463+ function merge(s1,s2) {
2464+ this.id = Guid.guid();
2465+ this.value = s1.value;
2466+ this.kids = [];
2467+ this.next = null;
2468+ this.count = 0;
2469+ this.changed = false;
2470+
2471+ this.recv = function(timestep, changed, parentID) {
2472+ this.count += 1;
2473+ if (changed) {
2474+ this.changed = true;
2475+ if (parentID == s2.id && this.next === null) { this.next = s2.value; }
2476+ if (parentID == s1.id) { this.next = s1.value; }
2477+ }
2478+
2479+ if (this.count == 2) {
2480+ if (this.changed) {
2481+ this.value = this.next;
2482+ this.next = null;
2483+ }
2484+ send(this, timestep, this.changed);
2485+ this.changed = false;
2486+ this.count = 0;
2487+ }
2488+ };
2489+ s1.kids.push(this);
2490+ s2.kids.push(this);
2491+ };
2492+
2493+ function merges(ss) {
2494+ function mrg(x) { return function(y) { return new merge(x,y); }; }
2495+ return Elm.List.foldl1(mrg)(ss);
2496+ }
2497+
2498+ function average(sampleSize) { return function(s) {
2499+ var sample = new Array(sampleSize);
2500+ var i = sampleSize;
2501+ while (i--) sample[i] = 0;
2502+ i = 0;
2503+ var full = false;
2504+ var total = 0;
2505+ function f(n) {
2506+ total += n - sample[i];
2507+ sample[i] = n;
2508+ var avg = total / Math.max(1, full ? sampleSize : i);
2509+ if (++i == sampleSize) { full = true; i = 0; }
2510+ return avg;
2511+ }
2512+ return new lift(f, [s]);
2513+ };
2514+ }
2515+
2516+ return {
2517+ constant : function(v) { return new input(v); },
2518+ lift : function(f){return function(e){return new lift(f,[e]);};},
2519+ lift2 : function(f) {
2520+ return function(e1) { return function(e2) {
2521+ return new lift(f, [e1,e2]); };};},
2522+ lift3 : function(f) {
2523+ return function(e1) { return function(e2) {
2524+ return function(e3){return new lift(f,[e1,e2,e3]);};};};},
2525+ lift4 : function(f) {
2526+ return function(e1) { return function(e2) {
2527+ return function(e3) { return function(e4) {
2528+ return new lift(f, [e1,e2,e3,e4]);};};};};},
2529+ lift5 : function(f) {
2530+ return function(e1) { return function(e2) {
2531+ return function(e3) { return function(e4) {
2532+ return function(e5) {
2533+ return new lift(f, [e1,e2,e3,e4,e5]);};};};};};},
2534+ lift6 : function(f) { return function(e1) { return function(e2) {
2535+ return function(e3) { return function(e4) {
2536+ return function(e5) { return function(e6) {
2537+ return new lift(f, [e1,e2,e3,e4,e5,e6]); };};};};};};},
2538+ lift7 : function(f) { return function(e1) { return function(e2) {
2539+ return function(e3) { return function(e4) {
2540+ return function(e5) { return function(e6) {
2541+ return function(e7) {
2542+ return new lift(f, [e1,e2,e3,e4,e5,e6,e7]);};};};};};};};},
2543+ lift8 : function(f) { return function(e1) { return function(e2) {
2544+ return function(e3) { return function(e4) {
2545+ return function(e5) { return function(e6) {
2546+ return function(e7) { return function(e8) {
2547+ return new lift(f, [e1,e2,e3,e4,e5,e6,e7,e8]);};};};};};};};};},
2548+ foldp : function(f) { return function(b) { return function(e) {
2549+ return new fold(f,b,false,e); }; }; },
2550+ foldp$ : function(f) { return function(b) { return function(e) {
2551+ return new fold(f,b,true,e); }; }; },
2552+ foldp1 : function(f) { return function(e) {
2553+ return new fold(f,function(x){return x;},true,e); }; },
2554+ delay : delay,
2555+ merge : function(s1) { return function(s2) { return new merge(s1,s2)}; },
2556+ merges : merges,
2557+ average : average,
2558+ count : function(sig) {
2559+ var incr = function(_){return function(c){return c+1;};};
2560+ return new fold(incr,0,false,sig) },
2561+ countIf : function(pred) { return function(sig) {
2562+ var incr = function(x){return function(c){return pred(x) ? c+1 : c;};};
2563+ return new fold(incr,0,false,sig) }; },
2564+ keepIf : function(pred) { return function(base) { return function(sig) {
2565+ return new dropIf(function(x) { return !pred(x)},base,sig); }; }; },
2566+ dropIf : function(pred) { return function(base) { return function(sig) {
2567+ return new dropIf(pred,base,sig); }; }; },
2568+ keepWhen : function(s) { return dropWhen(new lift(function(b){return !b;},[s])); },
2569+ dropWhen : dropWhen,
2570+ dropRepeats : function(s) { return new dropRepeats(s);},
2571+ sampleOn : function(s1){return function(s2){return new sampleOn(s1,s2);};},
2572+ timestamp : function(s) { return new timeIndex(true, s); },
2573+ timeOf : function(s) { return new timeIndex(false, s); }
2574+ };
2575+}();
2576+var Dispatcher = function() {
2577+ var program = null;
2578+ var inputs = [];
2579+ var currentElement = null;
2580+
2581+ var initialize = function() {
2582+ program = Elm.main();
2583+ if (!program.hasOwnProperty('recv')) {
2584+ program = Elm.Signal.constant(program);
2585+ }
2586+
2587+ currentElement = program.value;
2588+ filterDeadInputs();
2589+
2590+ var content = document.getElementById('content');
2591+ content.appendChild(Render.render(currentElement));
2592+ var w = document.getElementById('widthChecker').offsetWidth;
2593+ if (w !== window.innerWidth) {
2594+ Dispatcher.notify(Elm.Window.dimensions.id, Value.Tuple(w, window.innerHeight));
2595+ }
2596+ program = Elm.Signal.lift(function(value) {
2597+ var content = document.getElementById('content');
2598+ Render.update(content.firstChild,currentElement,value);
2599+ currentElement = value;
2600+ return value;
2601+ })(program);
2602+ };
2603+ var notify = function(id, v) {
2604+ var timestep = (new window.Date).getTime();
2605+ var hasListener = false;
2606+ for (var i = inputs.length; i--; ) {
2607+ hasListener = inputs[i].recv(timestep, id, v) || hasListener;
2608+ }
2609+ return hasListener;
2610+ };
2611+
2612+ function isAlive(input) {
2613+ if (!input.hasOwnProperty('defaultNumberOfKids')) return true;
2614+ var len = input.kids.length;
2615+ if (len == 0) return false;
2616+ if (len > input.defaultNumberOfKids) return true;
2617+ var alive = false;
2618+ for (var i = len; i--; ) {
2619+ alive = alive || isAlive(input.kids[i]);
2620+ }
2621+ return alive;
2622+ }
2623+ function filterDeadInputs() {
2624+ var temp = [];
2625+ for (var i = inputs.length; i--; ) {
2626+ if (isAlive(inputs[i])) temp.push(inputs[i]);
2627+ }
2628+ inputs = temp;
2629+ }
2630+
2631+ return {initialize:initialize, notify:notify, inputs:inputs};
2632+}();Elm.HTTP = function() {
2633+ var JS = Elm.JavaScript;
2634+ var toElmString = Elm.JavaScript.castJSStringToString;
2635+ function request(verb) { return function(url) { return function(data) {
2636+ return function(headers) {
2637+ return {0 : "Request",
2638+ length : 1,
2639+ verb : JS.castStringToJSString(verb),
2640+ url : JS.castStringToJSString(url),
2641+ data : data === null ? null : JS.castStringToJSString(data),
2642+ headers : headers }; }; }; };
2643+ }
2644+ function get(url) { return request("GET")(url)(null)(["Nil"]); }
2645+ function post(url) { return function(data) {
2646+ return request("POST")(url)(data)(["Nil"]); }; }
2647+
2648+ function registerReq(queue,responses) { return function(req) {
2649+ if (req.url !== "") { sendReq(queue,responses,req); }
2650+ };
2651+ }
2652+
2653+ function updateQueue(queue,responses) {
2654+ if (queue.length > 0) {
2655+ Dispatcher.notify(responses.id, queue[0].value);
2656+ if (queue[0].value[0] !== "Waiting") {
2657+ queue.shift();
2658+ setTimeout(function() { updateQueue(queue,responses); }, 0);
2659+ }
2660+ }
2661+ }
2662+
2663+ function sendReq(queue,responses,req) {
2664+ var response = { value: ["Waiting"] };
2665+ queue.push(response);
2666+
2667+ var request = null;
2668+ if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); }
2669+ if (window.XMLHttpRequest) { request = new XMLHttpRequest(); }
2670+ request.onreadystatechange = function(e) {
2671+ if (request.readyState === 4) {
2672+ response.value = (request.status === 200
2673+ ? ["Success", toElmString(request.responseText)]
2674+ : ["Failure", request.status,
2675+ toElmString(request.statusText)]);
2676+ setTimeout(function() { updateQueue(queue,responses); }, 0);
2677+ }
2678+ };
2679+ request.open(req.verb, req.url, true);
2680+ Elm.List.map(function(pair) {
2681+ request.setRequestHeader(
2682+ JS.castStringToJSString(pair[1]),
2683+ JS.castStringToJSString(pair[2]));
2684+ })(req.headers);
2685+ request.send(req.data);
2686+ return null;
2687+ }
2688+
2689+ function send(requests) {
2690+ var responses = Elm.Signal.constant(["Waiting"]);
2691+ var sender = Elm.Signal.lift(registerReq([],responses))(requests);
2692+ function f(x) { return function(y) { return x; } }
2693+ var combine = Elm.Signal.lift2(f)(responses)(sender);
2694+ return combine;
2695+ }
2696+
2697+ return {get : get,
2698+ post : post,
2699+ request : request,
2700+ send : send,
2701+ sendGet : function(urls){return send(Elm.Signal.lift(get)(urls));}
2702+ };
2703+}();
2704+
2705+Elm.Input = function() {
2706+ var JS = Elm.JavaScript;
2707+ var toElmString = Elm.JavaScript.castJSStringToString;
2708+ var newTextInput = function(elem, ghostText) {
2709+ elem.placeholder = JS.castStringToJSString(ghostText);
2710+ var str = Elm.Signal.constant(["Nil"]);
2711+ Value.addListener(elem, 'keyup', function(e) {
2712+ Dispatcher.notify(str.id, toElmString(elem.value));
2713+ elem.focus();
2714+ });
2715+ elem.style.padding = "1px";
2716+ return Value.Tuple(Value.wrap(elem), str);
2717+ };
2718+ var newElement = function(name) {
2719+ var e = document.createElement(name);
2720+ e.style.padding = "0";
2721+ e.style.margin = "0";
2722+ return e;
2723+ };
2724+ var textArea = function(cols) { return function(rows) {
2725+ var textarea = newElement('textarea');
2726+ textarea.rows = rows;
2727+ textarea.cols = cols;
2728+ return newTextInput(textarea, "");
2729+ };
2730+ };
2731+ var textField = function(ghostText) {
2732+ var field = newElement('input');
2733+ field.type = 'text';
2734+ return newTextInput(field, ghostText);
2735+ };
2736+ var password = function(ghostText) {
2737+ var field = newElement('input');
2738+ field.type = 'password';
2739+ return newTextInput(field, ghostText);
2740+ };
2741+ var checkbox = function(checked) {
2742+ var box = newElement('input');
2743+ box.type = 'checkbox';
2744+ box.checked = checked;
2745+ var status = Elm.Signal.constant(checked);
2746+ Value.addListener(box, 'change', function(e) {
2747+ Dispatcher.notify(status.id, box.checked);
2748+ });
2749+ return Value.Tuple(Value.wrap(box), status);
2750+ };
2751+ var dropDown = function(options) {
2752+ var slct = newElement('select');
2753+ var opts = [];
2754+ while (options[0] === "Cons") {
2755+ var opt = newElement('option');
2756+ var str = Value.toText(options[1][1]);
2757+ opt.value = str;
2758+ opt.innerHTML = str;
2759+ slct.appendChild(opt);
2760+ opts.push(options[1][2]);
2761+ options = options[2];
2762+ }
2763+ var status = Elm.Signal.constant(opts[0]);
2764+ Value.addListener(slct, 'change', function(e) {
2765+ Dispatcher.notify(status.id, opts[slct.selectedIndex]);
2766+ });
2767+ return Value.Tuple(Value.wrap(slct), status);
2768+ };
2769+ var stringDropDown = function(opts) {
2770+ return dropDown(Elm.List.map (function(x) {return Value.Tuple(x,x);}) (opts));
2771+ };
2772+ var button = function(name) {
2773+ var b = newElement('input');
2774+ b.type = "button";
2775+ b.value = JS.castStringToJSString(name);
2776+ var press = Elm.Signal.constant(false);
2777+ Value.addListener(b, 'click', function(e) {
2778+ Dispatcher.notify(press.id, true);
2779+ Dispatcher.notify(press.id, false);
2780+ });
2781+ return Value.Tuple(Value.wrap(b),press);
2782+ };
2783+ return {textArea:textArea, textField:textField,
2784+ password:password, checkbox:checkbox,
2785+ dropDown:dropDown, stringDropDown:stringDropDown,
2786+ button:button};
2787+}();
2788+
2789+Elm.Keyboard = { Raw : function() {
2790+ var keysDown = Elm.Signal.constant(["Nil"]);
2791+ var charPressed = Elm.Signal.constant(["Nothing"]);
2792+
2793+ function remove(x,xs) {
2794+ if (xs[0] === "Nil") return xs;
2795+ if (xs[1] === x) return xs[2];
2796+ return ["Cons", xs[1], remove(x,xs[2])];
2797+ }
2798+ function has(x,xs) {
2799+ while (xs[0] !== "Nil") {
2800+ if (xs[1] === x) return true;
2801+ xs = xs[2];
2802+ }
2803+ return false;
2804+ }
2805+ Value.addListener(document, 'keydown', function(e) {
2806+ if (has(e.keyCode, keysDown.value)) return;
2807+ var hasListener = Dispatcher.notify(keysDown.id, ["Cons", e.keyCode, keysDown.value]);
2808+ if (!hasListener)
2809+ this.removeEventListener('keydown',arguments.callee,false);
2810+ });
2811+ Value.addListener(document, 'keyup', function(e) {
2812+ var codes = remove(e.keyCode, keysDown.value);
2813+ var hasListener = Dispatcher.notify(keysDown.id, codes);
2814+ if (!hasListener)
2815+ this.removeEventListener('keyup',arguments.callee,false);
2816+ });
2817+ Value.addListener(window, 'blur', function(e) {
2818+ var hasListener = Dispatcher.notify(keysDown.id, ["Nil"]);
2819+ if (!hasListener)
2820+ this.removeEventListener('blur',arguments.callee,false);
2821+ });
2822+ Value.addListener(document, 'keypress', function(e) {
2823+ var hasListener = Dispatcher.notify(charPressed.id, ["Just",e.charCode || e.keyCode]);
2824+ Dispatcher.notify(charPressed.id, ["Nothing"]);
2825+ if (!hasListener)
2826+ this.removeEventListener('keypress',arguments.callee,false);
2827+ });
2828+ return {keysDown:keysDown,
2829+ charPressed:charPressed};
2830+ }()
2831+};
2832+
2833+(function() {
2834+ function keySignal(f) {
2835+ var signal = Elm.Signal.lift(f)(Elm.Keyboard.Raw.keysDown);
2836+ Elm.Keyboard.Raw.keysDown.defaultNumberOfKids += 1;
2837+ signal.defaultNumberOfKids = 0;
2838+ return signal;
2839+ }
2840+
2841+ function dir(left,right,up,down) {
2842+ function f(ks) {
2843+ var x = 0, y = 0;
2844+ while (ks[0] == "Cons") {
2845+ switch (ks[1]) {
2846+ case left : --x; break;
2847+ case right: ++x; break;
2848+ case up : ++y; break;
2849+ case down : --y; break;
2850+ }
2851+ ks = ks[2];
2852+ }
2853+ return { _:[true], x:[x], y:[y] };
2854+ }
2855+ return keySignal(f);
2856+ }
2857+
2858+ function is(key) {
2859+ function f(ks) {
2860+ while (ks[0] == "Cons") {
2861+ if (key == ks[1]) return true;
2862+ ks = ks[2];
2863+ }
2864+ return false;
2865+ }
2866+ return keySignal(f);
2867+ }
2868+
2869+ Elm.Keyboard.arrows = dir(37,39,38,40);
2870+ Elm.Keyboard.wasd = dir(65,68,87,83);
2871+ Elm.Keyboard.shift = is(16);
2872+ Elm.Keyboard.ctrl = is(17);
2873+ Elm.Keyboard.space = is(32);
2874+
2875+}());
2876+
2877+Elm.Mouse = function() {
2878+ var position = Elm.Signal.constant(Value.Tuple(0,0));
2879+ position.defaultNumberOfKids = 2;
2880+
2881+ var x = Elm.Signal.lift(function(p){return p[1];})(position);
2882+ x.defaultNumberOfKids = 0;
2883+ var y = Elm.Signal.lift(function(p){return p[2];})(position);
2884+ y.defaultNumberOfKids = 0;
2885+
2886+ var isDown = Elm.Signal.constant(false);
2887+ var isClicked = Elm.Signal.constant(false);
2888+ var clicks = Elm.Signal.constant(Value.Tuple());
2889+
2890+ function getXY(e) {
2891+ var posx = 0;
2892+ var posy = 0;
2893+ if (!e) e = window.event;
2894+ if (e.pageX || e.pageY) {
2895+ posx = e.pageX;
2896+ posy = e.pageY;
2897+ } else if (e.clientX || e.clientY) {
2898+ posx = e.clientX + document.body.scrollLeft +
2899+ document.documentElement.scrollLeft;
2900+ posy = e.clientY + document.body.scrollTop +
2901+ document.documentElement.scrollTop;
2902+ }
2903+ return Value.Tuple(posx, posy);
2904+ }
2905+
2906+ Value.addListener(document, 'click', function(e) {
2907+ var hasListener1 = Dispatcher.notify(isClicked.id, true);
2908+ var hasListener2 = Dispatcher.notify(clicks.id, Value.Tuple());
2909+ Dispatcher.notify(isClicked.id, false);
2910+ if (!hasListener1 && !hasListener2)
2911+ this.removeEventListener('click',arguments.callee,false);
2912+ });
2913+ Value.addListener(document, 'mousedown', function(e) {
2914+ var hasListener = Dispatcher.notify(isDown.id, true);
2915+ if (!hasListener)
2916+ this.removeEventListener('mousedown',arguments.callee,false);
2917+ });
2918+ Value.addListener(document, 'mouseup', function(e) {
2919+ var hasListener = Dispatcher.notify(isDown.id, false);
2920+ if (!hasListener)
2921+ this.removeEventListener('mouseup',arguments.callee,false);
2922+ });
2923+ Value.addListener(document, 'mousemove', function(e) {
2924+ var hasListener = Dispatcher.notify(position.id, getXY(e));
2925+ if (!hasListener)
2926+ this.removeEventListener('mousemove',arguments.callee,false);
2927+ });
2928+ var clickedOn = function(elem) {
2929+ var node = Render.render(elem);
2930+ var click = Elm.Signal.constant(false);
2931+ Value.addListener(node, 'click', function(e) {
2932+ Dispatcher.notify(click.id, true);
2933+ Dispatcher.notify(click.id, false);
2934+ });
2935+ return Value.Tuple(Value.wrap(node), click);
2936+ };
2937+ return {position: position,
2938+ x:x,
2939+ y:y,
2940+ isClicked: isClicked,
2941+ isDown: isDown,
2942+ clicks: clicks,
2943+ isClickedOn: clickedOn
2944+ };
2945+ }();
2946+Elm.Touch = function() {
2947+ var touches = Elm.Signal.constant(["Nil"]);
2948+
2949+ function touch(t) {
2950+ return {_ : [true], x: [t.pageX], y: [t.pageY], id: [t.identifier] };
2951+ }
2952+
2953+ function listen(name) {
2954+ function update(e) {
2955+ var ts = Elm.JavaScript.castJSArrayToList(e.touches);
2956+ var hasListener = Dispatcher.notify(touches.id, Elm.List.map(touch)(ts));
2957+ if (!hasListener)
2958+ return this.removeEventListener(name,arguments.callee,false);
2959+ e.preventDefault();
2960+ }
2961+ Value.addListener(document, name, update);
2962+ }
2963+
2964+ listen("touchstart");
2965+ listen("touchmove");
2966+ listen("touchend");
2967+ listen("touchcancel");
2968+ listen("touchleave");
2969+
2970+ return { touches: touches };
2971+}();
2972+Elm.Random = function() {
2973+ var inRange = function(min) { return function(max) {
2974+ return Elm.Signal.constant(Math.floor(Math.random() * (max-min+1)) + min);
2975+ };
2976+ };
2977+ var randomize = function(min) { return function(max) { return function(signal) {
2978+ function f(x) { return Math.floor(Math.random() * (max-min+1)) + min; }
2979+ return Elm.Signal.lift(f)(signal);
2980+ };
2981+ };
2982+ };
2983+ return { inRange:inRange, randomize:randomize };
2984+}();Elm.Time = function() {
2985+ function timeNow() { return (new window.Date).getTime(); }
2986+ function everyWhen(isOn) { return function(t) {
2987+ var clock = Elm.Signal.constant(timeNow());
2988+ function tellTime() { Dispatcher.notify(clock.id, timeNow()); }
2989+ setInterval(tellTime, t);
2990+ return clock;
2991+ };
2992+ }
2993+ function fpsWhen(desiredFPS) { return function (isOn) {
2994+ var msPerFrame = 1000 / desiredFPS;
2995+ var prev = timeNow(), curr = prev, diff = 0, wasOn = true;
2996+ var ticker = Elm.Signal.constant(diff);
2997+ function tick(zero) { return function() {
2998+ curr = timeNow();
2999+ diff = zero ? 0 : curr - prev;
3000+ prev = curr;
3001+ Dispatcher.notify(ticker.id, diff);
3002+ };
3003+ }
3004+ var timeoutID = 0;
3005+ function f(isOn) { return function(t) {
3006+ if (isOn) {
3007+ timeoutID = setTimeout(tick(!wasOn && isOn), msPerFrame);
3008+ } else if (wasOn) {
3009+ clearTimeout(timeoutID);
3010+ }
3011+ wasOn = isOn;
3012+ return t;
3013+ };
3014+ }
3015+ return Elm.Signal.lift2(f)(isOn)(ticker);
3016+ };
3017+ }
3018+ function since(t) { return function(s) {
3019+ function cmp(a) { return function(b) { return !Value.eq(a,b); }; }
3020+ var dcount = Elm.Signal.count(Elm.Signal.delay(t)(s));
3021+ return Elm.Signal.lift2(cmp)(Elm.Signal.count(s))(dcount);
3022+ };
3023+ }
3024+ function after(t) {
3025+ t *= 1000;
3026+ var thread = Elm.Signal.constant(false);
3027+ setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
3028+ return thread;
3029+ }
3030+ function before(t) {
3031+ t *= 1000;
3032+ var thread = Elm.Signal.constant(true);
3033+ setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
3034+ return thread;
3035+ }
3036+ function read(s) {
3037+ var t = window.Date.parse(s);
3038+ return isNaN(t) ? ["Nothing"] : ["Just",t];
3039+ }
3040+ return {fpsWhen : fpsWhen,
3041+ fps : function(t) { return fpsWhen(t)(Elm.Signal.constant(true)); },
3042+ every : everyWhen(Elm.Signal.constant(true)),
3043+ delay : Elm.Signal.delay,
3044+ since : since,
3045+ after : after,
3046+ before : before,
3047+ hour : 3600000,
3048+ minute : 60000,
3049+ second : 1000,
3050+ ms : 1,
3051+ inHours : function(t) { return t / 3600000; },
3052+ inMinutes : function(t) { return t / 60000; },
3053+ inSeconds : function(t) { return t / 1000; },
3054+ inMss : function(t) { return t; },
3055+ toDate : function(t) { return new window.Date(t); },
3056+ read : read
3057+ };
3058+
3059+}();Elm.Window = function() {
3060+ var dimensions = Elm.Signal.constant(Value.Tuple(window.innerWidth,
3061+ window.innerHeight));
3062+ dimensions.defaultNumberOfKids = 2;
3063+
3064+ var width = Elm.Signal.lift(function(p){return p[1];})(dimensions);
3065+ width.defaultNumberOfKids = 0;
3066+ var height = Elm.Signal.lift(function(p){return p[2];})(dimensions);
3067+ height.defaultNumberOfKids = 0;
3068+
3069+ Value.addListener(window, 'resize', function(e) {
3070+ var w = document.getElementById('widthChecker').offsetWidth;
3071+ var hasListener = Dispatcher.notify(dimensions.id,
3072+ Value.Tuple(w, window.innerHeight));
3073+ if (!hasListener)
3074+ this.removeEventListener('resize',arguments.callee,false);
3075+ });
3076+ return {dimensions:dimensions,width:width,height:height};
3077+}();
3078+
3079+Elm.Date = function() {
3080+
3081+ function dateNow() { return new window.Date; }
3082+ function readDate(str) {
3083+ var d = new window.Date(Elm.JavaScript.castStringToJSString(str));
3084+ if (isNaN(d.getTime())) return ["Nothing"];
3085+ return ["Just",d];
3086+ }
3087+
3088+ var dayTable = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
3089+ var monthTable = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
3090+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
3091+
3092+ return {
3093+ read : readDate,
3094+ year : function(d) { return d.getFullYear(); },
3095+ month : function(d) { return [monthTable[d.getMonth()]]; },
3096+ day : function(d) { return d.getDate(); },
3097+ hour : function(d) { return d.getHours(); },
3098+ minute : function(d) { return d.getMinutes(); },
3099+ second : function(d) { return d.getSeconds(); },
3100+ dayOfWeek : function(d) { return [dayTable[d.getDay()]]; },
3101+ toTime : function(d) { return d.getTime(); },
3102+ Mon : ["Mon"], Tue : ["Tue"], Wed : ["Wed"],
3103+ Thu : ["Thu"], Fri : ["Fri"], Sat : ["Sat"], Sun : ["Sun"],
3104+ Jan : ["Jan"], Feb : ["Feb"], Mar : ["Mar"], Apr : ["Apr"],
3105+ May : ["May"], Jun : ["Jun"], Jul : ["Jul"], Aug : ["Aug"],
3106+ Sep : ["Sep"], Oct : ["Oct"], Nov : ["Nov"], Dec : ["Dec"]
3107+ };
3108+
3109+}();
3110+
3111+Value.addListener(document, 'elm_log', function(e) { console.log(e.value); });
3112+Value.addListener(document, 'elm_title', function(e) {document.title = e.value;});
3113+Value.addListener(document, 'elm_redirect', function(e) {
3114+ if (e.value.length > 0) { window.location = e.value; }
3115+ });
3116+
3117+Elm.Prelude = function() {
3118+ var mod = function(x) { return function(y) {
3119+ var r = x % y;
3120+ var m = x==0 ? 0 : (y>0 ? (x>=0 ? r : r+y) : -mod(-x)(-y));
3121+ return m == y ? 0 : m;
3122+ }; };
3123+
3124+ var min = function(x) { return function(y) { return Math.min(x,y); }; };
3125+ var max = function(x) { return function(y) { return Math.max(x,y); }; };
3126+
3127+ var flip=function(f){return function(x){return function(y){return f(y)(x);};};};
3128+ var clamp = function(lo) { return function(hi) {
3129+ return function(x) { return Math.min(hi, Math.max(lo, x)); };
3130+ };
3131+ };
3132+ var curry = function(f) { return function(x) { return function(y) {
3133+ return f(["Tuple2",x,y]); }; };
3134+ };
3135+ var uncurry = function(f) { return function(p) {
3136+ if (p[0] !== "Tuple2") {
3137+ throw "Function was uncurry'd but was not given a pair.";
3138+ }
3139+ return f(p[1])(p[2]); };
3140+ };
3141+
3142+ var logBase=function(b){return function(x){return Math.log(x)/Math.log(b);};};
3143+
3144+ function readInt(str) {
3145+ var s = Elm.JavaScript.castStringToJSString(str);
3146+ var len = s.length;
3147+ if (len === 0) { return ["Nothing"]; }
3148+ var start = 0;
3149+ if (s[0] == '-') {
3150+ if (len === 1) { return ["Nothing"]; }
3151+ start = 1;
3152+ }
3153+ for (var i = start; i < len; ++i) {
3154+ if (!Elm.Char.isDigit(s[i])) { return ["Nothing"]; }
3155+ }
3156+ return ["Just", parseInt(s)];
3157+ }
3158+
3159+ function readFloat(str) {
3160+ var s = Elm.JavaScript.castStringToJSString(str);
3161+ var len = s.length;
3162+ if (len === 0) { return ["Nothing"]; }
3163+ var start = 0;
3164+ if (s[0] == '-') {
3165+ if (len === 1) { return ["Nothing"]; }
3166+ start = 1;
3167+ }
3168+ var dotCount = 0;
3169+ for (var i = start; i < len; ++i) {
3170+ if (Elm.Char.isDigit(s[i])) { continue; }
3171+ if (s[i] === '.') {
3172+ dotCount += 1;
3173+ if (dotCount <= 1) { continue; }
3174+ }
3175+ return ["Nothing"];
3176+ }
3177+ return ["Just", parseFloat(s)];
3178+ }
3179+
3180+ function compare(x) { return function (y) {
3181+ if (x instanceof Array && y instanceof Array) {
3182+ var len = x.length;
3183+ if (len == y.length) {
3184+ for (var i = 1; i < len; ++i) {
3185+ var cmp = compare(x[i])(y[i]);
3186+ if (cmp[0] === 'EQ') continue;
3187+ return cmp;
3188+ }
3189+ return ['EQ'];
3190+ }
3191+ return [ y.length == 1 ? 'GT' : 'LT' ];
3192+ }
3193+ return [ x === y ? 'EQ' : (x < y ? 'LT' : 'GT') ];
3194+ };
3195+ }
3196+ return {eq : Value.eq,
3197+ id : function(x) { return x; },
3198+ not : function(b) { return !b; },
3199+ fst : function(p) { return p[1]; },
3200+ snd : function(p) { return p[2]; },
3201+ rem : function(x) { return function(y) { return x % y; }; },
3202+ div : function(x) { return function(y) { return ~~(x / y); }; },
3203+ otherwise : true,
3204+ compare : compare,
3205+ toFloat : function(x) { return x; },
3206+ round : function(n) { return Math.round(n); },
3207+ floor : function(n) { return Math.floor(n); },
3208+ ceiling : function(n) { return Math.ceil(n); },
3209+ truncate : function(n) { return ~~n; },
3210+ readInt : readInt,
3211+ readFloat : readFloat,
3212+ sqrt : Math.sqrt,
3213+ abs : Math.abs,
3214+ pi : Math.PI,
3215+ e : Math.E,
3216+ sin : Math.sin,
3217+ cos : Math.cos,
3218+ tan : Math.tan,
3219+ asin : Math.asin,
3220+ acos : Math.acos,
3221+ atan : Math.atan,
3222+ atan2 : function(y) { return function(x) { return Math.atan2(y,x); }; },
3223+ mod : mod,
3224+ min : min,
3225+ max : max,
3226+ flip : flip,
3227+ clamp : clamp,
3228+ curry : curry,
3229+ uncurry : uncurry,
3230+ logBase : logBase,
3231+ Just : Elm.Maybe.Just,
3232+ Nothing : Elm.Maybe.Nothing,
3233+ maybe : Elm.Maybe.maybe,
3234+ map : Elm.List.map,
3235+ zip : Elm.List.zip,
3236+ zipWith : Elm.List.zipWith,
3237+ filter : Elm.List.filter,
3238+ head : Elm.List.head,
3239+ tail : Elm.List.tail,
3240+ last : Elm.List.last,
3241+ length : Elm.List.length,
3242+ reverse : Elm.List.reverse,
3243+ foldr : Elm.List.foldr,
3244+ foldr1 : Elm.List.foldr1,
3245+ foldl : Elm.List.foldl,
3246+ foldl1 : Elm.List.foldl1,
3247+ and : Elm.List.and,
3248+ or : Elm.List.or,
3249+ all : Elm.List.all,
3250+ any : Elm.List.any,
3251+ sum : Elm.List.sum,
3252+ product : Elm.List.product,
3253+ concat : Elm.List.concat,
3254+ concatMap : Elm.List.concatMap,
3255+ maximum : Elm.List.maximum,
3256+ minimum : Elm.List.minimum,
3257+ scanl : Elm.List.scanl,
3258+ scanl1 : Elm.List.scanl1,
3259+ take : Elm.List.take,
3260+ drop : Elm.List.drop,
3261+ zip : Elm.List.zip,
3262+ unzip : Elm.List.unzip,
3263+ lift : Elm.Signal.lift,
3264+ lift2 : Elm.Signal.lift2,
3265+ lift3 : Elm.Signal.lift3,
3266+ lift4 : Elm.Signal.lift4,
3267+ lift5 : Elm.Signal.lift5,
3268+ lift6 : Elm.Signal.lift6,
3269+ lift7 : Elm.Signal.lift7,
3270+ lift8 : Elm.Signal.lift8,
3271+ foldp : Elm.Signal.foldp,
3272+ foldp1 : Elm.Signal.foldp1,
3273+ foldp$ : Elm.Signal.foldp$,
3274+ constant : Elm.Signal.constant,
3275+ merge : Elm.Signal.merge,
3276+ count : Elm.Signal.count,
3277+ countIf : Elm.Signal.countIf,
3278+ average : Elm.Signal.average,
3279+ keepIf : Elm.Signal.keepIf,
3280+ dropIf : Elm.Signal.dropIf,
3281+ keepWhen : Elm.Signal.keepWhen,
3282+ dropWhen : Elm.Signal.dropWhen,
3283+ dropRepeats : Elm.Signal.dropRepeats,
3284+ sampleOn : Elm.Signal.sampleOn,
3285+ timestamp : Elm.Signal.timestamp,
3286+ timeOf : Elm.Signal.timeOf
3287+ };
3288+
3289+}();
3290+
3291+(function() {
3292+ var include = function(library) {
3293+ for (var i in library) {
3294+ Elm.Prelude[i] = library[i];
3295+ }
3296+ };
3297+ include (Elm.Color);
3298+ include (Elm.Text);
3299+ include (Elm.Graphics);
3300+ include (Elm.Time);
3301+
3302+ show = Value.show;
3303+
3304+}());
3305+
3306+Elm.Dict=function(){
3307+ var compare = Elm.Prelude.compare;
3308+ var uncurry = Elm.Prelude.uncurry;
3309+ var Nothing = Elm.Prelude.Nothing;
3310+ var Just = Elm.Prelude.Just;
3311+ var not = Elm.Prelude.not;
3312+ var eq = Elm.Prelude.eq;
3313+ var isJust=Elm.Maybe.isJust;
3314+ var Red_0=['Red'];
3315+ var Black_1=['Black'];
3316+ function RBNode_2(a1){
3317+ return function(a2){
3318+ return function(a3){
3319+ return function(a4){
3320+ return function(a5){
3321+ return ['RBNode',a1,a2,a3,a4,a5];};};};};}
3322+ var RBEmpty_3=['RBEmpty'];
3323+ function min_6(t_42){
3324+ return function(){
3325+ switch(t_42[0]){
3326+ case 'RBEmpty':
3327+ throw '(min RBEmpty) is not defined';
3328+ case 'RBNode':
3329+ switch(t_42[4][0]){
3330+ case 'RBEmpty':
3331+ return ['Tuple2',t_42[2],t_42[3]];
3332+ }
3333+ return min_6(t_42[4]);
3334+ }
3335+ throw "Non-exhaustive pattern match in case";}();}
3336+ function lookup_7(k_46){
3337+ return function(t_47){
3338+ return function(){
3339+ switch(t_47[0]){
3340+ case 'RBEmpty':
3341+ return Nothing;
3342+ case 'RBNode':
3343+ return function(){
3344+ var case12=compare(k_46)(t_47[2]);
3345+ switch(case12[0]){
3346+ case 'EQ':
3347+ return Just(t_47[3]);
3348+ case 'GT':
3349+ return lookup_7(k_46)(t_47[5]);
3350+ case 'LT':
3351+ return lookup_7(k_46)(t_47[4]);
3352+ }
3353+ throw "Non-exhaustive pattern match in case";}();
3354+ }
3355+ throw "Non-exhaustive pattern match in case";}();};}
3356+ function findWithDefault_8(base_52){
3357+ return function(k_53){
3358+ return function(t_54){
3359+ return function(){
3360+ switch(t_54[0]){
3361+ case 'RBEmpty':
3362+ return base_52;
3363+ case 'RBNode':
3364+ return function(){
3365+ var case19=compare(k_53)(t_54[2]);
3366+ switch(case19[0]){
3367+ case 'EQ':
3368+ return t_54[3];
3369+ case 'GT':
3370+ return findWithDefault_8(base_52)(k_53)(t_54[5]);
3371+ case 'LT':
3372+ return findWithDefault_8(base_52)(k_53)(t_54[4]);
3373+ }
3374+ throw "Non-exhaustive pattern match in case";}();
3375+ }
3376+ throw "Non-exhaustive pattern match in case";}();};};}
3377+ function member_9(k_59){
3378+ return function(t_60){
3379+ return isJust(lookup_7(k_59)(t_60));};}
3380+ function rotateLeft_10(t_61){
3381+ return function(){
3382+ switch(t_61[0]){
3383+ case 'RBNode':
3384+ switch(t_61[5][0]){
3385+ case 'RBNode':
3386+ return RBNode_2(t_61[1])(t_61[5][2])(t_61[5][3])(RBNode_2(Red_0)(t_61[2])(t_61[3])(t_61[4])(t_61[5][4]))(t_61[5][5]);
3387+ }break;
3388+ }
3389+ throw 'rotateLeft of a node without enough children';}();}
3390+ function rotateRight_11(t_71){
3391+ return function(){
3392+ switch(t_71[0]){
3393+ case 'RBNode':
3394+ switch(t_71[4][0]){
3395+ case 'RBNode':
3396+ return RBNode_2(t_71[1])(t_71[4][2])(t_71[4][3])(t_71[4][4])(RBNode_2(Red_0)(t_71[2])(t_71[3])(t_71[4][5])(t_71[5]));
3397+ }break;
3398+ }
3399+ throw 'rotateRight of a node without enough children';}();}
3400+ function rotateLeftIfNeeded_12(t_81){
3401+ return function(){
3402+ switch(t_81[0]){
3403+ case 'RBNode':
3404+ switch(t_81[5][0]){
3405+ case 'RBNode':
3406+ switch(t_81[5][1][0]){
3407+ case 'Red':
3408+ return rotateLeft_10(t_81);
3409+ }break;
3410+ }break;
3411+ }
3412+ return t_81;}();}
3413+ function rotateRightIfNeeded_13(t_82){
3414+ return function(){
3415+ switch(t_82[0]){
3416+ case 'RBNode':
3417+ switch(t_82[4][0]){
3418+ case 'RBNode':
3419+ switch(t_82[4][1][0]){
3420+ case 'Red':
3421+ switch(t_82[4][4][0]){
3422+ case 'RBNode':
3423+ switch(t_82[4][4][1][0]){
3424+ case 'Red':
3425+ return rotateRight_11(t_82);
3426+ }break;
3427+ }break;
3428+ }break;
3429+ }break;
3430+ }
3431+ return t_82;}();}
3432+ function otherColor_14(c_83){
3433+ return function(){
3434+ switch(c_83[0]){
3435+ case 'Black':
3436+ return Red_0;
3437+ case 'Red':
3438+ return Black_1;
3439+ }
3440+ throw "Non-exhaustive pattern match in case";}();}
3441+ function color_flip_15(t_84){
3442+ return function(){
3443+ switch(t_84[0]){
3444+ case 'RBNode':
3445+ switch(t_84[4][0]){
3446+ case 'RBNode':
3447+ switch(t_84[5][0]){
3448+ case 'RBNode':
3449+ return RBNode_2(otherColor_14(t_84[1]))(t_84[2])(t_84[3])(RBNode_2(otherColor_14(t_84[4][1]))(t_84[4][2])(t_84[4][3])(t_84[4][4])(t_84[4][5]))(RBNode_2(otherColor_14(t_84[5][1]))(t_84[5][2])(t_84[5][3])(t_84[5][4])(t_84[5][5]));
3450+ }break;
3451+ }break;
3452+ }
3453+ throw 'color_flip called on a RBEmpty or RBNode with a RBEmpty child';}();}
3454+ function color_flipIfNeeded_16(t_98){
3455+ return function(){
3456+ switch(t_98[0]){
3457+ case 'RBNode':
3458+ switch(t_98[4][0]){
3459+ case 'RBNode':
3460+ switch(t_98[4][1][0]){
3461+ case 'Red':
3462+ switch(t_98[5][0]){
3463+ case 'RBNode':
3464+ switch(t_98[5][1][0]){
3465+ case 'Red':
3466+ return color_flip_15(t_98);
3467+ }break;
3468+ }break;
3469+ }break;
3470+ }break;
3471+ }
3472+ return t_98;}();}
3473+ function fixUp_17(t_99){
3474+ return color_flipIfNeeded_16(rotateRightIfNeeded_13(rotateLeftIfNeeded_12(t_99)));}
3475+ function ensureBlackRoot_18(t_100){
3476+ return function(){
3477+ switch(t_100[0]){
3478+ case 'RBNode':
3479+ switch(t_100[1][0]){
3480+ case 'Red':
3481+ return RBNode_2(Black_1)(t_100[2])(t_100[3])(t_100[4])(t_100[5]);
3482+ }break;
3483+ }
3484+ return t_100;}();}
3485+ function insert_19(k_105){
3486+ return function(v_106){
3487+ return function(t_107){
3488+ return function(){
3489+ function ins_108(t_109){
3490+ return function(){
3491+ switch(t_109[0]){
3492+ case 'RBEmpty':
3493+ return RBNode_2(Red_0)(k_105)(v_106)(RBEmpty_3)(RBEmpty_3);
3494+ case 'RBNode':
3495+ return function(){
3496+ var h_115=function(){
3497+ var case114=compare(k_105)(t_109[2]);
3498+ switch(case114[0]){
3499+ case 'EQ':
3500+ return RBNode_2(t_109[1])(t_109[2])(v_106)(t_109[4])(t_109[5]);
3501+ case 'GT':
3502+ return RBNode_2(t_109[1])(t_109[2])(t_109[3])(t_109[4])(ins_108(t_109[5]));
3503+ case 'LT':
3504+ return RBNode_2(t_109[1])(t_109[2])(t_109[3])(ins_108(t_109[4]))(t_109[5]);
3505+ }
3506+ throw "Non-exhaustive pattern match in case";}();
3507+ return fixUp_17(h_115);}();
3508+ }
3509+ throw "Non-exhaustive pattern match in case";}();}
3510+ return ensureBlackRoot_18(ins_108(t_107));}();};};}
3511+ function singleton_20(k_116){
3512+ return function(v_117){
3513+ return insert_19(k_116)(v_117)(RBEmpty_3);};}
3514+ function isRed_21(t_118){
3515+ return function(){
3516+ switch(t_118[0]){
3517+ case 'RBNode':
3518+ switch(t_118[1][0]){
3519+ case 'Red':
3520+ return true;
3521+ }break;
3522+ }
3523+ return false;}();}
3524+ function isRedLeft_22(t_119){
3525+ return function(){
3526+ switch(t_119[0]){
3527+ case 'RBNode':
3528+ switch(t_119[4][0]){
3529+ case 'RBNode':
3530+ switch(t_119[4][1][0]){
3531+ case 'Red':
3532+ return true;
3533+ }break;
3534+ }break;
3535+ }
3536+ return false;}();}
3537+ function isRedLeftLeft_23(t_120){
3538+ return function(){
3539+ switch(t_120[0]){
3540+ case 'RBNode':
3541+ switch(t_120[4][0]){
3542+ case 'RBNode':
3543+ switch(t_120[4][4][0]){
3544+ case 'RBNode':
3545+ switch(t_120[4][4][1][0]){
3546+ case 'Red':
3547+ return true;
3548+ }break;
3549+ }break;
3550+ }break;
3551+ }
3552+ return false;}();}
3553+ function isRedRight_24(t_121){
3554+ return function(){
3555+ switch(t_121[0]){
3556+ case 'RBNode':
3557+ switch(t_121[5][0]){
3558+ case 'RBNode':
3559+ switch(t_121[5][1][0]){
3560+ case 'Red':
3561+ return true;
3562+ }break;
3563+ }break;
3564+ }
3565+ return false;}();}
3566+ function isRedRightLeft_25(t_122){
3567+ return function(){
3568+ switch(t_122[0]){
3569+ case 'RBNode':
3570+ switch(t_122[5][0]){
3571+ case 'RBNode':
3572+ switch(t_122[5][4][0]){
3573+ case 'RBNode':
3574+ switch(t_122[5][4][1][0]){
3575+ case 'Red':
3576+ return true;
3577+ }break;
3578+ }break;
3579+ }break;
3580+ }
3581+ return false;}();}
3582+ function moveRedLeft_26(t_123){
3583+ return function(){
3584+ var t__124=color_flip_15(t_123);
3585+ return function(){
3586+ switch(t__124[0]){
3587+ case 'RBNode':
3588+ return function(){
3589+ switch(t__124[5][0]){
3590+ case 'RBNode':
3591+ switch(t__124[5][4][0]){
3592+ case 'RBNode':
3593+ switch(t__124[5][4][1][0]){
3594+ case 'Red':
3595+ return color_flip_15(rotateLeft_10(RBNode_2(t__124[1])(t__124[2])(t__124[3])(t__124[4])(rotateRight_11(t__124[5]))));
3596+ }break;
3597+ }break;
3598+ }
3599+ return t__124;}();
3600+ }
3601+ return t__124;}();}();}
3602+ function moveRedRight_27(t_130){
3603+ return function(){
3604+ var t__131=color_flip_15(t_130);
3605+ return (isRedLeftLeft_23(t__131)?color_flip_15(rotateRight_11(t__131)):t__131);}();}
3606+ function moveRedLeftIfNeeded_28(t_132){
3607+ return ((not(isRedLeft_22(t_132))&¬(isRedLeftLeft_23(t_132)))?moveRedLeft_26(t_132):t_132);}
3608+ function moveRedRightIfNeeded_29(t_133){
3609+ return ((not(isRedRight_24(t_133))&¬(isRedRightLeft_25(t_133)))?moveRedRight_27(t_133):t_133);}
3610+ function deleteMin_30(t_134){
3611+ return function(){
3612+ function del_135(t_136){
3613+ return function(){
3614+ switch(t_136[0]){
3615+ case 'RBNode':
3616+ switch(t_136[4][0]){
3617+ case 'RBEmpty':
3618+ return RBEmpty_3;
3619+ }break;
3620+ }
3621+ return function(){
3622+ var case198=moveRedLeftIfNeeded_28(t_136);
3623+ switch(case198[0]){
3624+ case 'RBEmpty':
3625+ return RBEmpty_3;
3626+ case 'RBNode':
3627+ return fixUp_17(RBNode_2(case198[1])(case198[2])(case198[3])(del_135(case198[4]))(case198[5]));
3628+ }
3629+ throw "Non-exhaustive pattern match in case";}();}();}
3630+ return ensureBlackRoot_18(del_135(t_134));}();}
3631+ function remove_31(k_142){
3632+ return function(t_143){
3633+ return function(){
3634+ function eq_and_noRightNode_144(t_150){
3635+ return function(){
3636+ switch(t_150[0]){
3637+ case 'RBNode':
3638+ switch(t_150[5][0]){
3639+ case 'RBEmpty':
3640+ return eq(k_142,t_150[2]);
3641+ }break;
3642+ }
3643+ return false;}();}
3644+ function eq_145(t_152){
3645+ return function(){
3646+ switch(t_152[0]){
3647+ case 'RBNode':
3648+ return eq(k_142,t_152[2]);
3649+ }
3650+ return false;}();}
3651+ function delLT_146(t_154){
3652+ return function(){
3653+ var case216=moveRedLeftIfNeeded_28(t_154);
3654+ switch(case216[0]){
3655+ case 'RBEmpty':
3656+ throw 'delLT on RBEmpty';
3657+ case 'RBNode':
3658+ return fixUp_17(RBNode_2(case216[1])(case216[2])(case216[3])(del_149(case216[4]))(case216[5]));
3659+ }
3660+ throw "Non-exhaustive pattern match in case";}();}
3661+ function delEQ_147(t_160){
3662+ return function(){
3663+ switch(t_160[0]){
3664+ case 'RBEmpty':
3665+ throw 'delEQ called on a RBEmpty';
3666+ case 'RBNode':
3667+ return function(){
3668+ var Tuple2$k_v__164=min_6(t_160[5]);
3669+ var k__165=function(){
3670+ switch(Tuple2$k_v__164[0]){
3671+ case 'Tuple2':
3672+ return Tuple2$k_v__164[1];
3673+ }
3674+ throw "Non-exhaustive pattern match in case";}();
3675+ var v__166=function(){
3676+ switch(Tuple2$k_v__164[0]){
3677+ case 'Tuple2':
3678+ return Tuple2$k_v__164[2];
3679+ }
3680+ throw "Non-exhaustive pattern match in case";}();
3681+ return fixUp_17(RBNode_2(t_160[1])(k__165)(v__166)(t_160[4])(deleteMin_30(t_160[5])));}();
3682+ }
3683+ throw "Non-exhaustive pattern match in case";}();}
3684+ function delGT_148(t_171){
3685+ return function(){
3686+ switch(t_171[0]){
3687+ case 'RBEmpty':
3688+ throw 'delGT called on a RBEmpty';
3689+ case 'RBNode':
3690+ return fixUp_17(RBNode_2(t_171[1])(t_171[2])(t_171[3])(t_171[4])(del_149(t_171[5])));
3691+ }
3692+ throw "Non-exhaustive pattern match in case";}();}
3693+ function del_149(t_177){
3694+ return function(){
3695+ switch(t_177[0]){
3696+ case 'RBEmpty':
3697+ return RBEmpty_3;
3698+ case 'RBNode':
3699+ return ((compare(k_142)(t_177[2])[0] === 'LT')?delLT_146(t_177):function(){
3700+ var u_179=(isRedLeft_22(t_177)?rotateRight_11(t_177):t_177);
3701+ return (eq_and_noRightNode_144(u_179)?u_179[4]:function(){
3702+ var t__180=moveRedRightIfNeeded_29(t_177);
3703+ return (eq_145(t__180)?delEQ_147(t__180):delGT_148(t__180));}());}());
3704+ }
3705+ throw "Non-exhaustive pattern match in case";}();}
3706+ return (member_9(k_142)(t_143)?ensureBlackRoot_18(del_149(t_143)):t_143);}();};}
3707+ function map_32(f_181){
3708+ return function(t_182){
3709+ return function(){
3710+ switch(t_182[0]){
3711+ case 'RBEmpty':
3712+ return RBEmpty_3;
3713+ case 'RBNode':
3714+ return RBNode_2(t_182[1])(t_182[2])(f_181(t_182[3]))(map_32(f_181)(t_182[4]))(map_32(f_181)(t_182[5]));
3715+ }
3716+ throw "Non-exhaustive pattern match in case";}();};}
3717+ function foldl_33(f_188){
3718+ return function(acc_189){
3719+ return function(t_190){
3720+ return function(){
3721+ switch(t_190[0]){
3722+ case 'RBEmpty':
3723+ return acc_189;
3724+ case 'RBNode':
3725+ return foldl_33(f_188)(f_188(t_190[2])(t_190[3])(foldl_33(f_188)(acc_189)(t_190[4])))(t_190[5]);
3726+ }
3727+ throw "Non-exhaustive pattern match in case";}();};};}
3728+ function foldr_34(f_195){
3729+ return function(acc_196){
3730+ return function(t_197){
3731+ return function(){
3732+ switch(t_197[0]){
3733+ case 'RBEmpty':
3734+ return acc_196;
3735+ case 'RBNode':
3736+ return foldr_34(f_195)(f_195(t_197[2])(t_197[3])(foldr_34(f_195)(acc_196)(t_197[5])))(t_197[4]);
3737+ }
3738+ throw "Non-exhaustive pattern match in case";}();};};}
3739+ function union_35(t1_202){
3740+ return function(t2_203){
3741+ return foldl_33(insert_19)(t2_203)(t1_202);};}
3742+ function intersect_36(t1_204){
3743+ return function(t2_205){
3744+ return foldl_33(function(k_206){
3745+ return function(v_207){
3746+ return function(t_208){
3747+ return (member_9(k_206)(t2_205)?insert_19(k_206)(v_207)(t_208):t_208);};};})(empty_4)(t1_204);};}
3748+ function diff_37(t1_209){
3749+ return function(t2_210){
3750+ return foldl_33(function(k_211){
3751+ return function(v_212){
3752+ return function(t_213){
3753+ return remove_31(k_211)(t_213);};};})(t1_209)(t2_210);};}
3754+ function keys_38(t_214){
3755+ return foldr_34(function(k_215){
3756+ return function(v_216){
3757+ return function(acc_217){
3758+ return ['Cons',k_215,acc_217];};};})(['Nil'])(t_214);}
3759+ function values_39(t_218){
3760+ return foldr_34(function(k_219){
3761+ return function(v_220){
3762+ return function(acc_221){
3763+ return ['Cons',v_220,acc_221];};};})(['Nil'])(t_218);}
3764+ function toList_40(t_222){
3765+ return foldr_34(function(k_223){
3766+ return function(v_224){
3767+ return function(acc_225){
3768+ return ['Cons',['Tuple2',k_223,v_224],acc_225];};};})(['Nil'])(t_222);}
3769+ function fromList_41(assocs_226){
3770+ return Elm.List.foldl(uncurry(insert_19))(empty_4)(assocs_226);}
3771+ var empty_4=RBEmpty_3;
3772+ return {$op : {},
3773+ empty:empty_4,
3774+ lookup:lookup_7,
3775+ findWithDefault:findWithDefault_8,
3776+ member:member_9,
3777+ insert:insert_19,
3778+ singleton:singleton_20,
3779+ remove:remove_31,
3780+ map:map_32,
3781+ foldl:foldl_33,
3782+ foldr:foldr_34,
3783+ union:union_35,
3784+ intersect:intersect_36,
3785+ diff:diff_37,
3786+ keys:keys_38,
3787+ values:values_39,
3788+ toList:toList_40,
3789+ fromList:fromList_41};}();
3790+
3791+Elm.Set=function(){
3792+ var empty_0=Elm.Dict.empty;
3793+ var remove_3=Elm.Dict.remove;
3794+ var member_4=Elm.Dict.member;
3795+ var union_5=Elm.Dict.union;
3796+ var intersect_6=Elm.Dict.intersect;
3797+ var diff_7=Elm.Dict.diff;
3798+ var toList_8=Elm.Dict.keys;
3799+ var fromList_9=Elm.List.foldl(function(k_15){
3800+ return function(t_16){
3801+ return Elm.Dict.insert(k_15)(["Tuple0"])(t_16);};})(empty_0);
3802+ function singleton_1(k_13){
3803+ return Elm.Dict.singleton(k_13)(["Tuple0"]);};
3804+ function insert_2(k_14){
3805+ return Elm.Dict.insert(k_14)(["Tuple0"]);};
3806+ function foldl_10(f_17){
3807+ return Elm.Dict.foldl(function(k_18){
3808+ return function(v_19){
3809+ return function(b_20){
3810+ return f_17(k_18)(b_20);};};});};
3811+ function foldr_11(f_21){
3812+ return Elm.Dict.foldr(function(k_22){
3813+ return function(v_23){
3814+ return function(b_24){
3815+ return f_21(k_22)(b_24);};};});};
3816+ function map_12(f_25){
3817+ return function(t_26){
3818+ return function(x){
3819+ return fromList_9(Elm.List.map(f_25)(x));}(toList_8(t_26));};};
3820+ return {empty:empty_0,singleton:singleton_1,insert:insert_2,remove:remove_3,member:member_4,union:union_5,intersect:intersect_6,diff:diff_7,toList:toList_8,fromList:fromList_9,foldl:foldl_10,foldr:foldr_11,map:map_12};}();
3821+
3822+(function() {
3823+try{
3824+
3825+var $op={};
3826+for(this['i'] in Elm){eval('var '+this['i']+'=Elm[this.i];');}
3827+if (Elm.Automaton) throw "Module name collision, 'Automaton' is already defined.";
3828+Elm.Automaton=function(){
3829+ try{
3830+ if (!(Elm.Prelude instanceof Object)) throw 'module not found';
3831+ } catch(e) {
3832+ throw ("Module 'Prelude' is missing. Compile with --make flag or load missing module in a separate JavaScript file.");
3833+ }
3834+ var hiddenVars={};
3835+ for (this['i'] in Elm.Prelude) {
3836+ if (hiddenVars[this['i']]) continue;
3837+ eval('var ' + this['i'] + ' = Elm.Prelude[this.i];');}
3838+ function Automaton_0(a1){
3839+ return ["Automaton",a1];}
3840+ var Listen_8=["Listen"];
3841+ var Ignore_9=["Ignore"];
3842+ function DragFrom_10(a1){
3843+ return ["DragFrom",a1];}
3844+ $op['>>>'] = function(a1_24){
3845+ return function(a2_25){
3846+ return function(){
3847+ var Automaton$m1_26=a1_24;
3848+ var m1_27=function(){
3849+ switch(Automaton$m1_26[0]){
3850+ case "Automaton":
3851+ return Automaton$m1_26[1];
3852+ }
3853+ throw "Non-exhaustive pattern match in case";}();
3854+ var Automaton$m2_28=a2_25;
3855+ var m2_29=function(){
3856+ switch(Automaton$m2_28[0]){
3857+ case "Automaton":
3858+ return Automaton$m2_28[1];
3859+ }
3860+ throw "Non-exhaustive pattern match in case";}();
3861+ return Automaton_0(function(a_32){
3862+ return function(){
3863+ var Tuple2$bm1__33=m1_27(a_32);
3864+ var b_34=function(){
3865+ switch(Tuple2$bm1__33[0]){
3866+ case "Tuple2":
3867+ return Tuple2$bm1__33[1];
3868+ }
3869+ throw "Non-exhaustive pattern match in case";}();
3870+ var m1__35=function(){
3871+ switch(Tuple2$bm1__33[0]){
3872+ case "Tuple2":
3873+ return Tuple2$bm1__33[2];
3874+ }
3875+ throw "Non-exhaustive pattern match in case";}();
3876+ return function(){
3877+ var Tuple2$cm2__40=m2_29(b_34);
3878+ var c_41=function(){
3879+ switch(Tuple2$cm2__40[0]){
3880+ case "Tuple2":
3881+ return Tuple2$cm2__40[1];
3882+ }
3883+ throw "Non-exhaustive pattern match in case";}();
3884+ var m2__42=function(){
3885+ switch(Tuple2$cm2__40[0]){
3886+ case "Tuple2":
3887+ return Tuple2$cm2__40[2];
3888+ }
3889+ throw "Non-exhaustive pattern match in case";}();
3890+ return ["Tuple2",c_41,$op['>>>'](m1__35)(m2__42)];}();}();});}();};};
3891+ $op['<<<'] = function(a2_47){
3892+ return function(a1_48){
3893+ return $op['>>>'](a1_48)(a2_47);};};
3894+ $op['^>>'] = function(f_49){
3895+ return function(a_50){
3896+ return $op['>>>'](pure_4(f_49))(a_50);};};
3897+ $op['>>^'] = function(a_51){
3898+ return function(f_52){
3899+ return $op['>>>'](a_51)(pure_4(f_52));};};
3900+ $op['^<<'] = function(f_53){
3901+ return function(a_54){
3902+ return $op['>>>'](a_54)(pure_4(f_53));};};
3903+ $op['<<^'] = function(a_55){
3904+ return function(f_56){
3905+ return $op['>>>'](pure_4(f_56))(a_55);};};
3906+ var count_7=init_5(0)(function(__84){
3907+ return function(c_85){
3908+ return (1+c_85);};});
3909+ function run_1(Automaton$m0_14){
3910+ return function(input_15){
3911+ return function(){
3912+ switch(Automaton$m0_14[0]){
3913+ case "Automaton":
3914+ return lift(fst)(foldp$(function(a_17){
3915+ return function(Tuple2$bAutomaton$m_18){
3916+ return function(){
3917+ switch(Tuple2$bAutomaton$m_18[0]){
3918+ case "Tuple2":
3919+ switch(Tuple2$bAutomaton$m_18[2][0]){
3920+ case "Automaton":
3921+ return Tuple2$bAutomaton$m_18[2][1](a_17);
3922+ }break;
3923+ }
3924+ throw "Non-exhaustive pattern match in case";}();};})(Automaton$m0_14[1])(input_15));
3925+ }
3926+ throw "Non-exhaustive pattern match in case";}();};}
3927+ function step_2(Automaton$m_21){
3928+ return function(a_22){
3929+ return function(){
3930+ switch(Automaton$m_21[0]){
3931+ case "Automaton":
3932+ return Automaton$m_21[1](a_22);
3933+ }
3934+ throw "Non-exhaustive pattern match in case";}();};}
3935+ function combine_3(autos_57){
3936+ return Automaton_0(function(a_58){
3937+ return function(){
3938+ var Tuple2$bsautos__59=unzip(map(function(Automaton$m_62){
3939+ return function(){
3940+ switch(Automaton$m_62[0]){
3941+ case "Automaton":
3942+ return Automaton$m_62[1](a_58);
3943+ }
3944+ throw "Non-exhaustive pattern match in case";}();})(autos_57));
3945+ var bs_60=function(){
3946+ switch(Tuple2$bsautos__59[0]){
3947+ case "Tuple2":
3948+ return Tuple2$bsautos__59[1];
3949+ }
3950+ throw "Non-exhaustive pattern match in case";}();
3951+ var autos__61=function(){
3952+ switch(Tuple2$bsautos__59[0]){
3953+ case "Tuple2":
3954+ return Tuple2$bsautos__59[2];
3955+ }
3956+ throw "Non-exhaustive pattern match in case";}();
3957+ return ["Tuple2",bs_60,combine_3(autos__61)];}();});}
3958+ function pure_4(f_68){
3959+ return Automaton_0(function(x_69){
3960+ return ["Tuple2",f_68(x_69),pure_4(f_68)];});}
3961+ function init_5(s_70){
3962+ return function(step_71){
3963+ return Automaton_0(function(a_72){
3964+ return function(){
3965+ var s__73=step_71(a_72)(s_70);
3966+ return ["Tuple2",s__73,init_5(s__73)(step_71)];}();});};}
3967+ function init__6(s_74){
3968+ return function(step_75){
3969+ return Automaton_0(function(a_76){
3970+ return function(){
3971+ var Tuple2$bs__77=step_75(a_76)(s_74);
3972+ var b_78=function(){
3973+ switch(Tuple2$bs__77[0]){
3974+ case "Tuple2":
3975+ return Tuple2$bs__77[1];
3976+ }
3977+ throw "Non-exhaustive pattern match in case";}();
3978+ var s__79=function(){
3979+ switch(Tuple2$bs__77[0]){
3980+ case "Tuple2":
3981+ return Tuple2$bs__77[2];
3982+ }
3983+ throw "Non-exhaustive pattern match in case";}();
3984+ return ["Tuple2",b_78,init__6(s__79)(step_75)];}();});};}
3985+ function vecSub_11(Tuple2$x1y1_86){
3986+ return function(Tuple2$x2y2_87){
3987+ return function(){
3988+ switch(Tuple2$x1y1_86[0]){
3989+ case "Tuple2":
3990+ return function(){
3991+ switch(Tuple2$x2y2_87[0]){
3992+ case "Tuple2":
3993+ return ["Tuple2",(Tuple2$x1y1_86[1]-Tuple2$x2y2_87[1]),(Tuple2$x1y1_86[2]-Tuple2$x2y2_87[2])];
3994+ }
3995+ throw "Non-exhaustive pattern match in case";}();
3996+ }
3997+ throw "Non-exhaustive pattern match in case";}();};}
3998+ function stepDrag_12(Tuple2$presspos_92){
3999+ return function(Tuple2$dsform_93){
4000+ return function(){
4001+ switch(Tuple2$presspos_92[0]){
4002+ case "Tuple2":
4003+ return function(){
4004+ switch(Tuple2$dsform_93[0]){
4005+ case "Tuple2":
4006+ return function(){
4007+ function wrap_98(ds__99){
4008+ return ["Tuple2",Tuple2$dsform_93[2],["Tuple2",ds__99,Tuple2$dsform_93[2]]];}
4009+ return function(){
4010+ switch(Tuple2$dsform_93[1][0]){
4011+ case "DragFrom":
4012+ return (Tuple2$presspos_92[1]?["Tuple2",uncurry(move)(vecSub_11(Tuple2$presspos_92[2])(Tuple2$dsform_93[1][1]))(Tuple2$dsform_93[2]),["Tuple2",DragFrom_10(Tuple2$dsform_93[1][1]),Tuple2$dsform_93[2]]]:function(){
4013+ var form__101=uncurry(move)(vecSub_11(Tuple2$presspos_92[2])(Tuple2$dsform_93[1][1]))(Tuple2$dsform_93[2]);
4014+ return ["Tuple2",form__101,["Tuple2",Listen_8,form__101]];}());
4015+ case "Ignore":
4016+ return wrap_98((Tuple2$presspos_92[1]?Ignore_9:Listen_8));
4017+ case "Listen":
4018+ return wrap_98((not(Tuple2$presspos_92[1])?Listen_8:(isWithin(Tuple2$presspos_92[2])(Tuple2$dsform_93[2])?DragFrom_10(Tuple2$presspos_92[2]):Ignore_9)));
4019+ }
4020+ throw "Non-exhaustive pattern match in case";}();}();
4021+ }
4022+ throw "Non-exhaustive pattern match in case";}();
4023+ }
4024+ throw "Non-exhaustive pattern match in case";}();};}
4025+ function draggable_13(form_102){
4026+ return init__6(["Tuple2",Listen_8,form_102])(stepDrag_12);}
4027+ return {$op : {'>>>' : $op['>>>'], '<<<' : $op['<<<'], '^>>' : $op['^>>'], '>>^' : $op['>>^'], '^<<' : $op['^<<'], '<<^' : $op['<<^']},
4028+ run:run_1,
4029+ step:step_2,
4030+ combine:combine_3,
4031+ pure:pure_4,
4032+ init:init_5,
4033+ init$:init__6,
4034+ count:count_7,
4035+ draggable:draggable_13};}();
4036+Elm.main=function(){
4037+ return Elm.Automaton.main;};
4038+} catch (e) {
4039+Elm.main=function() {
4040+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 + '</span>');
4041+document.body.innerHTML = Elm.Text.monospace(msg);throw e;};}}());