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