/
puzzlescript_modded.html
3654 lines (3168 loc) · 349 KB
/
puzzlescript_modded.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Gritfish PUZZLEBIT</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div id="main">
<div id="screenWrap">
<div id="gameTitle"><span>Gritfish</span> PUZZLEBIT</div>
<div id="screen">
<canvas id="gameCanvas"></canvas>
</div>
</div>
<div id="dpad">
<div id="up"></div>
<div id="left"></div>
<div id="center"></div>
<div id="down"></div>
<div id="right"></div>
</div>
<div id="startSelect">
<div id="start"><span>QUIT</span></div>
<div id="select"><span>RESTART</span></div>
</div>
<div id="ab">
<div id="aButton"><span>ACT</span></div>
<div id="bButton"><span>UNDO</span></div>
</div>
<div id="speaker">
</div>
</div>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="puzzlebit.js"></script>
<script>
function doSetupTitleScreenLevelContinue() { try { if (window.localStorage && void 0 !== localStorage[document.URL]) { if (void 0 !== localStorage[document.URL + "_checkpoint"]) { var e = localStorage[document.URL + "_checkpoint"];
curlevelTarget = JSON.parse(e); var t = []; for (var n in Object.keys(curlevelTarget.dat)) t[n] = curlevelTarget.dat[n];
curlevelTarget.dat = new Int32Array(t) } curlevel = localStorage[document.URL] } } catch (e) {} }
var unitTesting = !1,
curlevel = 0,
curlevelTarget = null,
hasUsedCheckpoint = !1,
levelEditorOpened = !1,
muted = 0;
doSetupTitleScreenLevelContinue();
var verbose_logging = !1,
throttle_movement = !1,
cache_console_messages = !1,
quittingTitleScreen = !1,
quittingMessageScreen = !1,
deltatime = 17,
timer = 0,
repeatinterval = 150,
autotick = 0,
autotickinterval = 0,
winning = !1,
againing = !1,
againinterval = 150,
norepeat_action = !1,
oldflickscreendat = [],
keybuffer = [],
restarting = !1,
messageselected = !1,
textImages = {},
initLevel = { width: 5, height: 5, layerCount: 2, dat: [1, 3, 3, 1, 1, 2, 2, 3, 3, 1, 2, 1, 2, 2, 3, 3, 1, 1, 2, 2, 3, 2, 1, 3, 2, 1, 3, 2, 1, 3, 1, 3, 3, 1, 1, 2, 2, 3, 3, 1, 2, 1, 2, 2, 3, 3, 1, 1, 2, 2], movementMask: [1, 3, 3, 1, 1, 2, 2, 3, 3, 1, 2, 1, 2, 2, 3, 3, 1, 1, 2, 2, 3, 2, 1, 3, 2, 1, 3, 2, 1, 3, 1, 3, 3, 1, 1, 2, 2, 3, 3, 1, 2, 1, 2, 2, 3, 3, 1, 1, 2, 2], rigidGroupIndexMask: [], rigidMovementAppliedMask: [], bannedGroup: [], colCellContents: [], rowCellContents: [] },
level = initLevel;
</script>
<script>
function stripTags(n) { var e = document.createElement("div");
e.innerHTML = n; var r = e.textContent || e.innerText || ""; return r }
function consolePrint(n, e) {}
function consolePrintFromRule(n, e, r) {}
function consoleCacheDump(n) {}
function consoleError(n, e) { var r = document.getElementById("errormessage");
n = stripTags(n), r.innerHTML += n + "<br>" }
function logErrorNoLine(n) { var e = document.getElementById("errormessage");
n = stripTags(n), e.innerHTML += n + "<br>" }
function logBetaMessage(n) { var e = document.getElementById("errormessage");
n = stripTags(n), e.innerHTML += n + "<br>" }
function clearInputHistory() {}
function pushInput(n) {}
var canSetHTMLColors = !0,
canDump = !1,
canOpenEditor = !1,
canYoutube = !0,
IDE = !1;
</script>
<script>
var font = { a: [
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[1, 0, 0, 1, 0],
[1, 0, 0, 1, 0],
[0, 1, 1, 1, 0]
], b: [
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 1, 1, 0, 0],
[1, 0, 0, 1, 0],
[0, 1, 1, 0, 0]
], c: [
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 1, 1, 0]
], d: [
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 1, 1, 1, 0],
[1, 0, 0, 1, 0],
[0, 1, 1, 0, 0]
], e: [
[0, 1, 1, 0, 0],
[1, 0, 0, 1, 0],
[1, 1, 1, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 1, 0, 0]
], f: [
[0, 0, 0, 0, 0],
[0, 0, 1, 1, 0],
[0, 1, 0, 0, 0],
[1, 1, 1, 0, 0],
[0, 1, 0, 0, 0]
], g: [
[0, 1, 1, 0, 0],
[1, 0, 0, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 1, 0],
[0, 1, 1, 0, 0]
], h: [
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 1, 1, 0, 0],
[1, 0, 0, 1, 0],
[1, 0, 0, 1, 0]
], i: [
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 1, 1, 0]
], j: [
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[1, 0, 1, 0, 0],
[0, 1, 0, 0, 0]
], k: [
[1, 0, 0, 0, 0],
[1, 0, 0, 1, 0],
[1, 1, 1, 0, 0],
[1, 0, 0, 1, 0],
[1, 0, 0, 1, 0]
], l: [
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 1, 0],
[0, 1, 1, 0, 0]
], m: [
[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[1, 0, 1, 0, 1],
[1, 0, 1, 0, 1],
[1, 0, 1, 0, 1]
], n: [
[0, 0, 0, 0, 0],
[0, 1, 1, 0, 0],
[1, 0, 0, 1, 0],
[1, 0, 0, 1, 0],
[1, 0, 0, 1, 0]
], o: [
[0, 0, 0, 0, 0],
[0, 1, 1, 0, 0],
[1, 0, 0, 1, 0],
[1, 0, 0, 1, 0],
[0, 1, 1, 0, 0]
], p: [
[0, 0, 0, 0, 0],
[0, 1, 1, 0, 0],
[1, 0, 0, 1, 0],
[1, 1, 1, 0, 0],
[1, 0, 0, 0, 0]
], q: [
[0, 0, 0, 0, 0],
[0, 1, 1, 0, 0],
[1, 0, 0, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 1, 0]
], r: [
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0]
], s: [
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 0],
[0, 1, 1, 0, 0],
[0, 0, 0, 1, 0],
[1, 1, 1, 0, 0]
], t: [
[0, 1, 0, 0, 0],
[1, 1, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[0, 0, 1, 1, 0]
], u: [
[0, 0, 0, 0, 0],
[1, 0, 0, 1, 0],
[1, 0, 0, 1, 0],
[1, 0, 0, 1, 0],
[1, 1, 1, 0, 0]
], v: [
[0, 0, 0, 0, 0],
[1, 0, 0, 1, 0],
[1, 0, 1, 0, 0],
[1, 1, 0, 0, 0],
[1, 0, 0, 0, 0]
], w: [
[0, 0, 0, 0, 0],
[1, 0, 1, 0, 1],
[1, 0, 1, 0, 1],
[1, 0, 1, 0, 1],
[0, 1, 0, 1, 0]
], x: [
[0, 0, 0, 0, 0],
[1, 0, 0, 1, 0],
[0, 1, 1, 0, 0],
[0, 1, 1, 0, 0],
[1, 0, 0, 1, 0]
], y: [
[1, 0, 0, 1, 0],
[1, 0, 0, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 1, 0],
[1, 1, 1, 0, 0]
], z: [
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 1, 1, 1, 0]
], A: [
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 1],
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1]
], B: [
[1, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[1, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[1, 1, 1, 1, 0]
], C: [
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1]
], D: [
[1, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[1, 1, 1, 1, 0]
], E: [
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1]
], F: [
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0]
], G: [
[0, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 0, 0, 1, 1],
[1, 0, 0, 0, 1],
[0, 1, 1, 1, 1]
], H: [
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1]
], I: [
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1]
], J: [
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 1, 1, 0, 0]
], K: [
[1, 0, 0, 0, 1],
[1, 0, 1, 1, 0],
[1, 1, 0, 0, 0],
[1, 0, 1, 1, 0],
[1, 0, 0, 0, 1]
], L: [
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1]
], M: [
[1, 1, 1, 1, 1],
[1, 0, 1, 0, 1],
[1, 0, 1, 0, 1],
[1, 0, 1, 0, 1],
[1, 0, 1, 0, 1]
], N: [
[1, 0, 0, 0, 1],
[1, 1, 0, 0, 1],
[1, 0, 1, 0, 1],
[1, 0, 0, 1, 1],
[1, 0, 0, 0, 1]
], O: [
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[1, 1, 1, 1, 1]
], P: [
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 1],
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0]
], Q: [
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1]
], R: [
[1, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[1, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1]
], S: [
[0, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 1],
[1, 1, 1, 1, 0]
], T: [
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]
], U: [
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[1, 1, 1, 1, 1]
], V: [
[1, 0, 0, 0, 1],
[0, 1, 0, 1, 0],
[0, 1, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]
], W: [
[1, 0, 1, 0, 1],
[1, 0, 1, 0, 1],
[1, 0, 1, 0, 1],
[1, 0, 1, 0, 1],
[0, 1, 0, 1, 0]
], X: [
[1, 0, 0, 0, 1],
[0, 1, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 0, 1]
], Y: [
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]
], Z: [
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 1, 1, 1, 1]
], 0: [
[1, 1, 1, 1, 1],
[1, 0, 0, 1, 1],
[1, 0, 1, 0, 1],
[1, 1, 0, 0, 1],
[1, 1, 1, 1, 1]
], 1: [
[1, 1, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1]
], 2: [
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1]
], 3: [
[1, 1, 1, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 1, 1, 0],
[0, 0, 0, 0, 1],
[1, 1, 1, 1, 0]
], 4: [
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 1, 0],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 0]
], 5: [
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 0],
[0, 0, 0, 0, 1],
[1, 1, 1, 1, 0]
], 6: [
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0]
], 7: [
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0]
], 8: [
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0]
], 9: [
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[0, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[0, 1, 1, 1, 0]
], ".": [
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0]
], ",": [
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 1, 0, 0]
], ";": [
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 1, 0, 0]
], ":": [
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0]
], "?": [
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[0, 0, 1, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]
], "!": [
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0]
], "@": [
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[1, 0, 1, 1, 1],
[1, 0, 0, 0, 0],
[0, 1, 1, 1, 0]
], "£": [
[0, 1, 1, 1, 0],
[0, 1, 0, 0, 1],
[1, 1, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 1, 1, 1, 1]
], $: [
[0, 1, 1, 1, 1],
[1, 0, 1, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 1, 0, 1],
[1, 1, 1, 1, 0]
], "%": [
[1, 1, 0, 0, 1],
[1, 1, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 1],
[1, 0, 0, 1, 1]
], "^": [
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
], "&": [
[0, 1, 1, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 1, 1],
[1, 0, 0, 1, 0],
[0, 1, 1, 0, 0]
], "*": [
[0, 1, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
], "(": [
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0]
], ")": [
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0]
], "+": [
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]
], "-": [
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
], _: [
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1]
], "=": [
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 0]
], " ": [
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
], "{": [
[0, 0, 1, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 1, 0]
], "}": [
[0, 1, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 1, 0, 0]
], "[": [
[0, 0, 1, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 1, 0]
], "]": [
[0, 1, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 1, 0, 0]
], "'": [
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
], '"': [
[0, 1, 0, 1, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
], "/": [
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0]
], "\\": [
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]
], "|": [
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]
], "<": [
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0]
], ">": [
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0]
], "~": [
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 1, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0]
], "`": [
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
], "#": [
[0, 1, 0, 1, 0],
[1, 1, 1, 1, 1],
[0, 1, 0, 1, 0],
[1, 1, 1, 1, 1],
[0, 1, 0, 1, 0]
] };
</script>
<script>
function RC4(t) { this.s = new Array(256), this.i = 0, this.j = 0; for (var i = 0; i < 256; i++) this.s[i] = i;
t && this.mix(t) }
function print_call_stack() { var t = new Error,
i = t.stack;
console.log(i) }
function RNG(t) { this.seed = t, null == t ? t = (Math.random() + Date.now()).toString() : "function" == typeof t ? (this.uniform = t, this.nextByte = function() { return ~~(256 * this.uniform()) }, t = null) : "[object String]" !== Object.prototype.toString.call(t) && (t = JSON.stringify(t)), this._normal = null, t ? this._state = new RC4(t) : this._state = null } String.prototype.getBytes = function() { for (var t = [], i = 0; i < this.length; i++) { var n = this.charCodeAt(i),
o = [];
do o.push(255 & n), n >>= 8; while (n > 0);
t = t.concat(o.reverse()) } return t }, RC4.prototype._swap = function(t, i) { var n = this.s[t];
this.s[t] = this.s[i], this.s[i] = n }, RC4.prototype.mix = function(t) { for (var i = t.getBytes(), n = 0, o = 0; o < this.s.length; o++) n += this.s[o] + i[o % i.length], n %= 256, this._swap(o, n) }, RC4.prototype.next = function() { return this.i = (this.i + 1) % 256, this.j = (this.j + this.s[this.i]) % 256, this._swap(this.i, this.j), this.s[(this.s[this.i] + this.s[this.j]) % 256] }, RNG.prototype.nextByte = function() { return this._state.next() }, RNG.prototype.uniform = function() { for (var t = 7, i = 0, n = 0; n < t; n++) i *= 256, i += this.nextByte(); return i / (Math.pow(2, 8 * t) - 1) }, RNG.prototype.random = function(t, i) { return null == t ? this.uniform() : (null == i && (i = t, t = 0), t + Math.floor(this.uniform() * (i - t))) }, RNG.prototype.normal = function() { if (null !== this._normal) { var t = this._normal; return this._normal = null, t } var i = this.uniform() || Math.pow(2, -53),
n = this.uniform(); return this._normal = Math.sqrt(-2 * Math.log(i)) * Math.sin(2 * Math.PI * n), Math.sqrt(-2 * Math.log(i)) * Math.cos(2 * Math.PI * n) }, RNG.prototype.exponential = function() { return -Math.log(this.uniform() || Math.pow(2, -53)) }, RNG.prototype.poisson = function(t) { var i = Math.exp(-(t || 1)),
n = 0,
o = 1;
do n++, o *= this.uniform(); while (o > i); return n - 1 }, RNG.prototype.gamma = function(t) { var i = (t < 1 ? 1 + t : t) - 1 / 3,
n = 1 / Math.sqrt(9 * i);
do { do var o = this.normal(),
r = Math.pow(n * o + 1, 3); while (r <= 0); var s = this.uniform(),
h = Math.pow(o, 2) } while (s >= 1 - .0331 * h * h && Math.log(s) >= .5 * h + i * (1 - r + Math.log(r))); return t < 1 ? i * r * Math.exp(this.exponential() / -t) : i * r }, RNG.roller = function(t, i) { var n = t.split(/(\d+)?d(\d+)([+-]\d+)?/).slice(1),
o = parseFloat(n[0]) || 1,
r = parseFloat(n[1]),
s = parseFloat(n[2]) || 0; return i = i || new RNG,
function() { for (var t = o + s, n = 0; n < o; n++) t += i.random(r); return t } };
</script>
<script>
function FastBase64_Init() { for (var a = 0; a < 4096; a++) FastBase64_encLookup[a] = FastBase64_chars[a >> 6] + FastBase64_chars[63 & a] }
function FastBase64_Encode(a) { for (var e = a.length, s = "", u = 0; e > 2;) n = a[u] << 16 | a[u + 1] << 8 | a[u + 2], s += FastBase64_encLookup[n >> 12] + FastBase64_encLookup[4095 & n], e -= 3, u += 3; if (e > 0) { var r = (252 & a[u]) >> 2,
t = (3 & a[u]) << 4; if (e > 1 && (t |= (240 & a[++u]) >> 4), s += FastBase64_chars[r], s += FastBase64_chars[t], 2 == e) { var o = (15 & a[u++]) << 2;
o |= (192 & a[u]) >> 6, s += FastBase64_chars[o] } 1 == e && (s += "="), s += "=" } return s }
function u32ToArray(a) { return [255 & a, a >> 8 & 255, a >> 16 & 255, a >> 24 & 255] }
function u16ToArray(a) { return [255 & a, a >> 8 & 255] }
function MakeRiff(a, e, n) { var s = [],
u = [],
r = [],
t = { chunkId: [82, 73, 70, 70], chunkSize: 0, format: [87, 65, 86, 69], subChunk1Id: [102, 109, 116, 32], subChunk1Size: 16, audioFormat: 1, numChannels: 1, sampleRate: a, byteRate: 0, blockAlign: 0, bitsPerSample: e, subChunk2Id: [100, 97, 116, 97], subChunk2Size: 0 };
t.byteRate = t.sampleRate * t.numChannels * t.bitsPerSample >> 3, t.blockAlign = t.numChannels * t.bitsPerSample >> 3, t.subChunk2Size = n.length, t.chunkSize = 36 + t.subChunk2Size, u = t.chunkId.concat(u32ToArray(t.chunkSize), t.format, t.subChunk1Id, u32ToArray(t.subChunk1Size), u16ToArray(t.audioFormat), u16ToArray(t.numChannels), u32ToArray(t.sampleRate), u32ToArray(t.byteRate), u16ToArray(t.blockAlign), u16ToArray(t.bitsPerSample), t.subChunk2Id, u32ToArray(t.subChunk2Size), n), r = "data:audio/wav;base64," + FastBase64_Encode(u); var o = { dat: s, wav: u, header: t, dataURI: r }; return o }
var FastBase64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
FastBase64_encLookup = [];
FastBase64_Init(), "undefined" != typeof exports && (exports.RIFFWAVE = RIFFWAVE);
</script>
<script>
function checkAudioContextExists() { try { null == AUDIO_CONTEXT && ("undefined" != typeof AudioContext ? AUDIO_CONTEXT = new AudioContext : "undefined" != typeof webkitAudioContext && (AUDIO_CONTEXT = new webkitAudioContext)) } catch (e) { window.console.log(e) } }
function Params() { var e = {}; return e.wave_type = SQUARE, e.p_env_attack = 0, e.p_env_sustain = .3, e.p_env_punch = 0, e.p_env_decay = .4, e.p_base_freq = .3, e.p_freq_limit = 0, e.p_freq_ramp = 0, e.p_freq_dramp = 0, e.p_vib_strength = 0, e.p_vib_speed = 0, e.p_arp_mod = 0, e.p_arp_speed = 0, e.p_duty = 0, e.p_duty_ramp = 0, e.p_repeat_speed = 0, e.p_pha_offset = 0, e.p_pha_ramp = 0, e.p_lpf_freq = 1, e.p_lpf_ramp = 0, e.p_lpf_resonance = 0, e.p_hpf_freq = 0, e.p_hpf_ramp = 0, e.sound_vol = .5, e.sample_rate = 44100, e.bit_depth = 8, e }
function frnd(e) { return seeded ? rng.uniform() * e : Math.random() * e }
function rnd(e) { return seeded ? Math.floor(rng.uniform() * (e + 1)) : Math.floor(Math.random() * (e + 1)) }
function SoundEffect(e, r) { this._buffer = AUDIO_CONTEXT.createBuffer(1, e, r) }
function cacheSeed(e) { if (e in sfxCache) return sfxCache[e]; var r = generateFromSeed(e);
r.sound_vol = SOUND_VOL, r.sample_rate = SAMPLE_RATE, r.bit_depth = BIT_DEPTH; var _ = SoundEffect.generate(r); for (sfxCache[e] = _, cachedSeeds.push(e); cachedSeeds.length > CACHE_MAX;) { var p = cachedSeeds[0];
cachedSeeds = cachedSeeds.slice(1), delete sfxCache[p] } return _ }
function playSound(e) { if (!muted && (checkAudioContextExists(), !unitTesting)) { var r = cacheSeed(e);
r.play() } }
function killAudioButton() { var e = document.getElementById("muteButton"),
r = document.getElementById("unMuteButton");
e && (e.remove(), r.remove()) }
function showAudioButton() { var e = document.getElementById("muteButton"),
r = document.getElementById("unMuteButton");
e && (e.style.display = "block", r.style.display = "none") }
function toggleMute() { 0 === muted ? muteAudio() : unMuteAudio() }
function muteAudio() { muted = 1, tryDeactivateYoutube(); var e = document.getElementById("muteButton"),
r = document.getElementById("unMuteButton");
e && (e.style.display = "none", r.style.display = "block") }
function unMuteAudio() { muted = 0, tryActivateYoutube(); var e = document.getElementById("muteButton"),
r = document.getElementById("unMuteButton");
e && (e.style.display = "block", r.style.display = "none") }
var SOUND_VOL = .25,
SAMPLE_RATE = 5512,
BIT_DEPTH = 8,
SQUARE = 0,
SAWTOOTH = 1,
SINE = 2,
NOISE = 3,
TRIANGLE = 4,
BREAKER = 5,
SHAPES = ["square", "sawtooth", "sine", "noise", "triangle", "breaker"],
AUDIO_CONTEXT;
checkAudioContextExists();
var masterVolume = 1,
rng, seeded = !1;
pickupCoin = function() { var e = Params(); if (e.wave_type = Math.floor(frnd(SHAPES.length)), 3 === e.wave_type && (e.wave_type = 0), e.p_base_freq = .4 + frnd(.5), e.p_env_attack = 0, e.p_env_sustain = frnd(.1), e.p_env_decay = .1 + frnd(.4), e.p_env_punch = .3 + frnd(.3), rnd(1)) { e.p_arp_speed = .5 + frnd(.2); var r = (1 | frnd(7)) + 1,
_ = r + (1 | frnd(7)) + 2;
e.p_arp_mod = +r / +_ } return e }, laserShoot = function() { var e = Params(); return e.wave_type = rnd(2), e.wave_type === SINE && rnd(1) && (e.wave_type = rnd(1)), e.wave_type = Math.floor(frnd(SHAPES.length)), 3 === e.wave_type && (e.wave_type = SQUARE), e.p_base_freq = .5 + frnd(.5), e.p_freq_limit = e.p_base_freq - .2 - frnd(.6), e.p_freq_limit < .2 && (e.p_freq_limit = .2), e.p_freq_ramp = -.15 - frnd(.2), 0 === rnd(2) && (e.p_base_freq = .3 + frnd(.6), e.p_freq_limit = frnd(.1), e.p_freq_ramp = -.35 - frnd(.3)), rnd(1) ? (e.p_duty = frnd(.5), e.p_duty_ramp = frnd(.2)) : (e.p_duty = .4 + frnd(.5), e.p_duty_ramp = -frnd(.7)), e.p_env_attack = 0, e.p_env_sustain = .1 + frnd(.2), e.p_env_decay = frnd(.4), rnd(1) && (e.p_env_punch = frnd(.3)), 0 === rnd(2) && (e.p_pha_offset = frnd(.2), e.p_pha_ramp = -frnd(.2)), rnd(1) && (e.p_hpf_freq = frnd(.3)), e }, explosion = function() { var e = Params(); return rnd(1) ? (e.p_base_freq = .1 + frnd(.4), e.p_freq_ramp = -.1 + frnd(.4)) : (e.p_base_freq = .2 + frnd(.7), e.p_freq_ramp = -.2 - frnd(.2)), e.p_base_freq *= e.p_base_freq, 0 === rnd(4) && (e.p_freq_ramp = 0), 0 === rnd(2) && (e.p_repeat_speed = .3 + frnd(.5)), e.p_env_attack = 0, e.p_env_sustain = .1 + frnd(.3), e.p_env_decay = frnd(.5), 0 === rnd(1) && (e.p_pha_offset = -.3 + frnd(.9), e.p_pha_ramp = -frnd(.3)), e.p_env_punch = .2 + frnd(.6), rnd(1) && (e.p_vib_strength = frnd(.7), e.p_vib_speed = frnd(.6)), 0 === rnd(2) && (e.p_arp_speed = .6 + frnd(.3), e.p_arp_mod = .8 - frnd(1.6)), e }, birdSound = function() { var e = Params(); return frnd(10) < 1 ? (e.wave_type = Math.floor(frnd(SHAPES.length)), 3 === e.wave_type && (e.wave_type = SQUARE), e.p_env_attack = .4304400932967592 + frnd(.2) - .1, e.p_env_sustain = .15739346034252394 + frnd(.2) - .1, e.p_env_punch = .004488201744871758 + frnd(.2) - .1, e.p_env_decay = .07478075528212291 + frnd(.2) - .1, e.p_base_freq = .9865265720147687 + frnd(.2) - .1, e.p_freq_limit = 0 + frnd(.2) - .1, e.p_freq_ramp = -.2995018224359539 + frnd(.2) - .1, frnd(1) < .5 && (e.p_freq_ramp = .1 + frnd(.15)), e.p_freq_dramp = .004598608156964473 + frnd(.1) - .05, e.p_vib_strength = -.2202799497929496 + frnd(.2) - .1, e.p_vib_speed = .8084998703158364 + frnd(.2) - .1, e.p_arp_mod = 0, e.p_arp_speed = 0, e.p_duty = -.9031808754347107 + frnd(.2) - .1, e.p_duty_ramp = -.8128699999808343 + frnd(.2) - .1, e.p_repeat_speed = .601486018931999 + frnd(.2) - .1, e.p_pha_offset = -.9424902314367765 + frnd(.2) - .1, e.p_pha_ramp = -.1055482222272056 + frnd(.2) - .1, e.p_lpf_freq = .9989765717851521 + frnd(.2) - .1, e.p_lpf_ramp = -.25051720626043017 + frnd(.2) - .1, e.p_lpf_resonance = .32777871505494693 + frnd(.2) - .1, e.p_hpf_freq = .0023548750981756753 + frnd(.2) - .1, e.p_hpf_ramp = -.002375673204842568 + frnd(.2) - .1, e) : frnd(10) < 1 ? (e.wave_type = Math.floor(frnd(SHAPES.length)), 3 === e.wave_type && (e.wave_type = SQUARE), e.p_env_attack = .5277795946672003 + frnd(.2) - .1, e.p_env_sustain = .18243733568468432 + frnd(.2) - .1, e.p_env_punch = -.020159754546840117 + frnd(.2) - .1, e.p_env_decay = .1561353422051903 + frnd(.2) - .1, e.p_base_freq = .9028855606533718 + frnd(.2) - .1, e.p_freq_limit = -.008842787837148716, e.p_freq_ramp = -.1, e.p_freq_dramp = -.012891241489551925, e.p_vib_strength = -.17923136138403065 + frnd(.2) - .1, e.p_vib_speed = .908263385610142 + frnd(.2) - .1, e.p_arp_mod = .41690153355414894 + frnd(.2) - .1, e.p_arp_speed = .0010766233195860704 + frnd(.2) - .1, e.p_duty = -.8735363011184684 + frnd(.2) - .1, e.p_duty_ramp = -.7397985366747507 + frnd(.2) - .1, e.p_repeat_speed = .0591789344172107 + frnd(.2) - .1, e.p_pha_offset = -.9961184222777699 + frnd(.2) - .1, e.p_pha_ramp = -.08234769395850523 + frnd(.2) - .1, e.p_lpf_freq = .9412475115697335 + frnd(.2) - .1, e.p_lpf_ramp = -.18261358925834958 + frnd(.2) - .1, e.p_lpf_resonance = .24541438107389477 + frnd(.2) - .1, e.p_hpf_freq = -.01831940280978611 + frnd(.2) - .1, e.p_hpf_ramp = -.03857383633171346 + frnd(.2) - .1, e) : frnd(10) < 1 ? (e.wave_type = Math.floor(frnd(SHAPES.length)), 3 === e.wave_type && (e.wave_type = SQUARE), e.p_env_attack = .4304400932967592 + frnd(.2) - .1, e.p_env_sustain = .15739346034252394 + frnd(.2) - .1, e.p_env_punch = .004488201744871758 + frnd(.2) - .1, e.p_env_decay = .07478075528212291 + frnd(.2) - .1, e.p_base_freq = .9865265720147687 + frnd(.2) - .1, e.p_freq_limit = 0 + frnd(.2) - .1, e.p_freq_ramp = -.2995018224359539 + frnd(.2) - .1, e.p_freq_dramp = .004598608156964473 + frnd(.2) - .1, e.p_vib_strength = -.2202799497929496 + frnd(.2) - .1, e.p_vib_speed = .8084998703158364 + frnd(.2) - .1, e.p_arp_mod = -.46410459213693644 + frnd(.2) - .1, e.p_arp_speed = -.10955361249587248 + frnd(.2) - .1, e.p_duty = -.9031808754347107 + frnd(.2) - .1, e.p_duty_ramp = -.8128699999808343 + frnd(.2) - .1, e.p_repeat_speed = .7014860189319991 + frnd(.2) - .1, e.p_pha_offset = -.9424902314367765 + frnd(.2) - .1, e.p_pha_ramp = -.1055482222272056 + frnd(.2) - .1, e.p_lpf_freq = .9989765717851521 + frnd(.2) - .1, e.p_lpf_ramp = -.25051720626043017 + frnd(.2) - .1, e.p_lpf_resonance = .32777871505494693 + frnd(.2) - .1, e.p_hpf_freq = .0023548750981756753 + frnd(.2) - .1, e.p_hpf_ramp = -.002375673204842568 + frnd(.2) - .1, e) : frnd(5) > 1 ? (e.wave_type = Math.floor(frnd(SHAPES.length)), 3 === e.wave_type && (e.wave_type = SQUARE), rnd(1) ? (e.p_arp_mod = .2697849293151393 + frnd(.2) - .1, e.p_arp_speed = -.3131172257760948 + frnd(.2) - .1, e.p_base_freq = .8090588299313949 + frnd(.2) - .1, e.p_duty = -.6210022920964955 + frnd(.2) - .1, e.p_duty_ramp = -.00043441813553182567 + frnd(.2) - .1, e.p_env_attack = .004321877246874195 + frnd(.2) - .1, e.p_env_decay = .1 + frnd(.2) - .1, e.p_env_punch = .061737781504416146 + frnd(.2) - .1, e.p_env_sustain = .4987252564798832 + frnd(.2) - .1, e.p_freq_dramp = .31700340314222614 + frnd(.2) - .1, e.p_freq_limit = 0 + frnd(.2) - .1, e.p_freq_ramp = -.163380391341416 + frnd(.2) - .1, e.p_hpf_freq = .4709005021145149 + frnd(.2) - .1, e.p_hpf_ramp = .6924667290539194 + frnd(.2) - .1, e.p_lpf_freq = .8351398631384511 + frnd(.2) - .1, e.p_lpf_ramp = .36616557192873134 + frnd(.2) - .1, e.p_lpf_resonance = -.08685777111664439 + frnd(.2) - .1, e.p_pha_offset = -.036084571580025544 + frnd(.2) - .1, e.p_pha_ramp = -.014806445085568108 + frnd(.2) - .1, e.p_repeat_speed = -.8094368475518489 + frnd(.2) - .1, e.p_vib_speed = .4496665457171294 + frnd(.2) - .1, e.p_vib_strength = .23413762515532424 + frnd(.2) - .1) : (e.p_arp_mod = -.35697118026766184 + frnd(.2) - .1, e.p_arp_speed = .3581140690559588 + frnd(.2) - .1, e.p_base_freq = 1.3260897696157528 + frnd(.2) - .1, e.p_duty = -.30984900436710694 + frnd(.2) - .1, e.p_duty_ramp = -.0014374759133411626 + frnd(.2) - .1, e.p_env_attack = .3160357835682254 + frnd(.2) - .1, e.p_env_decay = .1 + frnd(.2) - .1, e.p_env_punch = .24323114016870148 + frnd(.2) - .1, e.p_env_sustain = .4 + frnd(.2) - .1, e.p_freq_dramp = .2866475886237244 + frnd(.2) - .1, e.p_freq_limit = 0 + frnd(.2) - .1, e.p_freq_ramp = -.10956352368742976 + frnd(.2) - .1, e.p_hpf_freq = .20772718017889846 + frnd(.2) - .1, e.p_hpf_ramp = .1564090637378835 + frnd(.2) - .1, e.p_lpf_freq = .6021372770637031 + frnd(.2) - .1, e.p_lpf_ramp = .24016227139979027 + frnd(.2) - .1, e.p_lpf_resonance = -.08787383821160144 + frnd(.2) - .1, e.p_pha_offset = -.381597686151701 + frnd(.2) - .1, e.p_pha_ramp = -.0002481687661373495 + frnd(.2) - .1, e.p_repeat_speed = .07812112809425686 + frnd(.2) - .1, e.p_vib_speed = -.13648848579133943 + frnd(.2) - .1, e.p_vib_strength = .0018874158972302657 + frnd(.2) - .1), e) : (e.wave_type = Math.floor(frnd(SHAPES.length)), 1 !== e.wave_type && 3 !== e.wave_type || (e.wave_type = 2), e.p_base_freq = .85 + frnd(.15), e.p_freq_ramp = .3 + frnd(.15), e.p_env_attack = 0 + frnd(.09), e.p_env_sustain = .2 + frnd(.3), e.p_env_decay = 0 + frnd(.1), e.p_duty = frnd(2) - 1, e.p_duty_ramp = Math.pow(frnd(2) - 1, 3), e.p_repeat_speed = .5 + frnd(.1), e.p_pha_offset = -.3 + frnd(.9), e.p_pha_ramp = -frnd(.3), e.p_arp_speed = .4 + frnd(.6), e.p_arp_mod = .8 + frnd(.1), e.p_lpf_resonance = frnd(2) - 1, e.p_lpf_freq = 1 - Math.pow(frnd(1), 3), e.p_lpf_ramp = Math.pow(frnd(2) - 1, 3), e.p_lpf_freq < .1 && e.p_lpf_ramp < -.05 && (e.p_lpf_ramp = -e.p_lpf_ramp), e.p_hpf_freq = Math.pow(frnd(1), 5), e.p_hpf_ramp = Math.pow(frnd(2) - 1, 5), e) }, pushSound = function() { var e = Params(); return e.wave_type = Math.floor(frnd(SHAPES.length)), 2 === e.wave_type && e.wave_type++, 0 === e.wave_type && (e.wave_type = NOISE), e.p_base_freq = .1 + frnd(.4), e.p_freq_ramp = .05 + frnd(.2), e.p_env_attack = .01 + frnd(.09), e.p_env_sustain = .01 + frnd(.09), e.p_env_decay = .01 + frnd(.09), e.p_repeat_speed = .3 + frnd(.5), e.p_pha_offset = -.3 + frnd(.9), e.p_pha_ramp = -frnd(.3), e.p_arp_speed = .6 + frnd(.3), e.p_arp_mod = .8 - frnd(1.6), e }, powerUp = function() { var e = Params(); return rnd(1) ? e.wave_type = SAWTOOTH : e.p_duty = frnd(.6), e.wave_type = Math.floor(frnd(SHAPES.length)), 3 === e.wave_type && (e.wave_type = SQUARE), rnd(1) ? (e.p_base_freq = .2 + frnd(.3), e.p_freq_ramp = .1 + frnd(.4), e.p_repeat_speed = .4 + frnd(.4)) : (e.p_base_freq = .2 + frnd(.3), e.p_freq_ramp = .05 + frnd(.2), rnd(1) && (e.p_vib_strength = frnd(.7), e.p_vib_speed = frnd(.6))), e.p_env_attack = 0, e.p_env_sustain = frnd(.4), e.p_env_decay = .1 + frnd(.4), e }, hitHurt = function() { return result = Params(), result.wave_type = rnd(2), result.wave_type === SINE && (result.wave_type = NOISE), result.wave_type === SQUARE && (result.p_duty = frnd(.6)), result.wave_type = Math.floor(frnd(SHAPES.length)), result.p_base_freq = .2 + frnd(.6), result.p_freq_ramp = -.3 - frnd(.4), result.p_env_attack = 0, result.p_env_sustain = frnd(.1), result.p_env_decay = .1 + frnd(.2), rnd(1) && (result.p_hpf_freq = frnd(.3)), result }, jump = function() { return result = Params(), result.wave_type = SQUARE, result.wave_type = Math.floor(frnd(SHAPES.length)), 3 === result.wave_type && (result.wave_type = SQUARE), result.p_duty = frnd(.6), result.p_base_freq = .3 + frnd(.3), result.p_freq_ramp = .1 + frnd(.2), result.p_env_attack = 0, result.p_env_sustain = .1 + frnd(.3), result.p_env_decay = .1 + frnd(.2), rnd(1) && (result.p_hpf_freq = frnd(.3)), rnd(1) && (result.p_lpf_freq = 1 - frnd(.6)), result }, blipSelect = function() { return result = Params(), result.wave_type = rnd(1), result.wave_type = Math.floor(frnd(SHAPES.length)), 3 === result.wave_type && (result.wave_type = rnd(1)), result.wave_type === SQUARE && (result.p_duty = frnd(.6)), result.p_base_freq = .2 + frnd(.4), result.p_env_attack = 0, result.p_env_sustain = .1 + frnd(.1), result.p_env_decay = frnd(.2), result.p_hpf_freq = .1, result }, random = function() { return result = Params(), result.wave_type = Math.floor(frnd(SHAPES.length)), result.p_base_freq = Math.pow(frnd(2) - 1, 2), rnd(1) && (result.p_base_freq = Math.pow(frnd(2) - 1, 3) + .5), result.p_freq_limit = 0, result.p_freq_ramp = Math.pow(frnd(2) - 1, 5), result.p_base_freq > .7 && result.p_freq_ramp > .2 && (result.p_freq_ramp = -result.p_freq_ramp), result.p_base_freq < .2 && result.p_freq_ramp < -.05 && (result.p_freq_ramp = -result.p_freq_ramp), result.p_freq_dramp = Math.pow(frnd(2) - 1, 3), result.p_duty = frnd(2) - 1, result.p_duty_ramp = Math.pow(frnd(2) - 1, 3), result.p_vib_strength = Math.pow(frnd(2) - 1, 3), result.p_vib_speed = frnd(2) - 1, result.p_env_attack = Math.pow(frnd(2) - 1, 3), result.p_env_sustain = Math.pow(frnd(2) - 1, 2), result.p_env_decay = frnd(2) - 1, result.p_env_punch = Math.pow(frnd(.8), 2), result.p_env_attack + result.p_env_sustain + result.p_env_decay < .2 && (result.p_env_sustain += .2 + frnd(.3), result.p_env_decay += .2 + frnd(.3)), result.p_lpf_resonance = frnd(2) - 1, result.p_lpf_freq = 1 - Math.pow(frnd(1), 3), result.p_lpf_ramp = Math.pow(frnd(2) - 1, 3), result.p_lpf_freq < .1 && result.p_lpf_ramp < -.05 && (result.p_lpf_ramp = -result.p_lpf_ramp), result.p_hpf_freq = Math.pow(frnd(1), 5), result.p_hpf_ramp = Math.pow(frnd(2) - 1, 5), result.p_pha_offset = Math.pow(frnd(2) - 1, 3), result.p_pha_ramp = Math.pow(frnd(2) - 1, 3), result.p_repeat_speed = frnd(2) - 1, result.p_arp_speed = frnd(2) - 1, result.p_arp_mod = frnd(2) - 1, result };
var generators = [pickupCoin, laserShoot, explosion, powerUp, hitHurt, jump, blipSelect, pushSound, random, birdSound],
generatorNames = ["pickupCoin", "laserShoot", "explosion", "powerUp", "hitHurt", "jump", "blipSelect", "pushSound", "random", "birdSound"];
if (generateFromSeed = function(e) { rng = new RNG(e / 100 | 0); var r = e % 100,
_ = generators[r % generators.length];
seeded = !0; var p = _(); return p.seed = e, seeded = !1, p }, SoundEffect.prototype.getBuffer = function() { return this._buffer.getChannelData(0) }, SoundEffect.prototype.play = function() { var e = AUDIO_CONTEXT.createBufferSource(),
r = AUDIO_CONTEXT.createBiquadFilter(),
_ = AUDIO_CONTEXT.createBiquadFilter(),
p = AUDIO_CONTEXT.createBiquadFilter();
e.buffer = this._buffer, e.connect(r), r.frequency.value = 1600, _.frequency.value = 1600, p.frequency.value = 1600, r.connect(_), _.connect(p), p.connect(AUDIO_CONTEXT.destination); var n = AUDIO_CONTEXT.currentTime; "undefined" != typeof e.start ? e.start(n) : e.noteOn(n), e.onended = function() { p.disconnect() } }, SoundEffect.MIN_SAMPLE_RATE = 22050, "undefined" == typeof AUDIO_CONTEXT && (SoundEffect = function(e, r) { this._sample_rate = r, this._buffer = new Array(e), this._audioElement = null }, SoundEffect.prototype.getBuffer = function() { return this._audioElement = null, this._buffer }, SoundEffect.prototype.play = function() { if (this._audioElement) this._audioElement.cloneNode(!1).play();
else { for (var e = 0; e < this._buffer.length; e++) this._buffer[e] = 255 & Math.floor(128 * Math.max(0, Math.min(this._buffer[e] + 1, 2))); var r = MakeRiff(this._sample_rate, BIT_DEPTH, this._buffer);
this._audioElement = new Audio, this._audioElement.src = r.dataURI, this._audioElement.play() } }, SoundEffect.MIN_SAMPLE_RATE = 1), SoundEffect.generate = function(e) {
function r() { _ = 0, p = 100 / (e.p_base_freq * e.p_base_freq + .001), n = Math.floor(p), t = 100 / (e.p_freq_limit * e.p_freq_limit + .001), f = 1 - .01 * Math.pow(e.p_freq_ramp, 3), a = 1e-6 * -Math.pow(e.p_freq_dramp, 3), d = .5 - .5 * e.p_duty, s = 5e-5 * -e.p_duty_ramp, u = e.p_arp_mod >= 0 ? 1 - .9 * Math.pow(e.p_arp_mod, 2) : 1 + 10 * Math.pow(e.p_arp_mod, 2), o = 0, l = Math.floor(2e4 * Math.pow(1 - e.p_arp_speed, 2) + 32), 1 == e.p_arp_speed && (l = 0) } var _, p, n, t, f, a, d, s, u, o, l;
r(); var i = 0,
h = 0,
v = .1 * Math.pow(e.p_lpf_freq, 3),
m = 1 + 1e-4 * e.p_lpf_ramp,
c = 5 / (1 + 20 * Math.pow(e.p_lpf_resonance, 2)) * (.01 + v);
c > .8 && (c = .8); var y = 0,
E = .1 * Math.pow(e.p_hpf_freq, 2),
w = 1 + 3e-4 * e.p_hpf_ramp,
q = 0,
S = .01 * Math.pow(e.p_vib_speed, 2),
M = .5 * e.p_vib_strength,
A = 0,
b = 0,
g = 0,
T = [Math.floor(e.p_env_attack * e.p_env_attack * 1e5), Math.floor(e.p_env_sustain * e.p_env_sustain * 1e5), Math.floor(e.p_env_decay * e.p_env_decay * 1e5)],
I = T[0] + T[1] + T[2],
O = 0,
P = 1020 * Math.pow(e.p_pha_offset, 2);
e.p_pha_offset < 0 && (P = -P); var k = 1 * Math.pow(e.p_pha_ramp, 2);
e.p_pha_ramp < 0 && (k = -k); for (var N = Math.abs(Math.floor(P)), C = 0, R = [], B = 0; B < 1024; ++B) R[B] = 0; for (var U = [], B = 0; B < 32; ++B) U[B] = 2 * Math.random() - 1; var H = Math.floor(2e4 * Math.pow(1 - e.p_repeat_speed, 2) + 32);
0 == e.p_repeat_speed && (H = 0); var x, D = 2 * e.sound_vol,
D = Math.exp(e.sound_vol) - 1,
X = 0,
Q = 0,
L = Math.floor(44100 / e.sample_rate),
F = 0,
V = Math.ceil(I / L),
W = !1;
x = e.sample_rate < SoundEffect.MIN_SAMPLE_RATE ? new SoundEffect(4 * V, SoundEffect.MIN_SAMPLE_RATE) : new SoundEffect(V, e.sample_rate); for (var j = x.getBuffer(), G = 0;; ++G) { 0 != H && ++_ >= H && r(), 0 != l && G >= l && (l = 0, p *= u), f += a, p *= f, p > t && (p = t, e.p_freq_limit > 0 && (W = !0)); var K = p; if (M > 0 && (q += S, K = p * (1 + Math.sin(q) * M)), n = Math.floor(K), n < 8 && (n = 8), d += s, d < 0 && (d = 0), d > .5 && (d = .5), g++, g > T[b]) { for (g = 1, b++; b < 3 && 0 === T[b];) b++; if (3 === b) break } A = 0 === b ? g / T[0] : 1 === b ? 1 + 2 * Math.pow(1 - g / T[1], 1) * e.p_env_punch : 1 - g / T[2], P += k, N = Math.abs(Math.floor(P)), N > 1023 && (N = 1023), 0 != w && (E *= w, E < 1e-5 && (E = 1e-5), E > .1 && (E = .1)); for (var Y = 0, z = 0; z < 8; ++z) { var J = 0; if (O++, O >= n && (O %= n, e.wave_type === NOISE))
for (var B = 0; B < 32; ++B) U[B] = 2 * Math.random() - 1; var Z = O / n; if (e.wave_type === SQUARE) J = Z < d ? .5 : -.5;
else if (e.wave_type === SAWTOOTH) J = 1 - 2 * Z;
else if (e.wave_type === SINE) J = Math.sin(2 * Z * Math.PI);
else if (e.wave_type === NOISE) J = U[Math.floor(32 * O / n)];
else if (e.wave_type === TRIANGLE) J = Math.abs(1 - 2 * Z) - 1;
else { if (e.wave_type !== BREAKER) throw new Exception("bad wave type! " + e.wave_type);
J = Math.abs(1 - Z * Z * 2) - 1 } var $ = i;
v *= m, v < 0 && (v = 0), v > .1 && (v = .1), 1 != e.p_lpf_freq ? (h += (J - i) * v, h -= h * c) : (i = J, h = 0), i += h, y += i - $, y -= y * E, J = y, R[1023 & C] = J, J += R[C - N + 1024 & 1023], C = C + 1 & 1023, Y += J * A } X += Y, ++Q >= L && (Q = 0, Y = X / L, X = 0, Y = Y / 8 * masterVolume, Y *= D, j[F++] = Y, e.sample_rate < SoundEffect.MIN_SAMPLE_RATE && (j[F++] = Y, j[F++] = Y, j[F++] = Y)) } return L > 0 && (Y = X / L, Y = Y / 8 * masterVolume, Y *= D, j[F++] = Y, e.sample_rate < SoundEffect.MIN_SAMPLE_RATE && (j[F++] = Y, j[F++] = Y, j[F++] = Y)), x }, "undefined" != typeof exports) { var RIFFWAVE = require("./riffwave").RIFFWAVE;
exports.Params = Params, exports.generate = generate }
var sfxCache = {},
cachedSeeds = [],
CACHE_MAX = 50;
</script>
<script>
! function(e) { if ("object" == typeof exports && "object" == typeof module) module.exports = e();
else { if ("function" == typeof define && define.amd) return define([], e);
this.CodeMirror = e() } }(function() { "use strict";
function e(r, n) { if (!(this instanceof e)) return new e(r, n);
this.options = n = n || {}; for (var i in no) n.hasOwnProperty(i) || (n[i] = no[i]);
d(n); var o = n.value; "string" == typeof o && (o = new No(o, n.mode)), this.doc = o; var l = this.display = new t(r, o);
l.wrapper.CodeMirror = this, c(this), s(this), n.lineWrapping && (this.display.wrapper.className += " CodeMirror-wrap"), n.autofocus && !Ei && ft(this), this.state = { keyMaps: [], overlays: [], modeGen: 0, overwrite: !1, focused: !1, suppressEdits: !1, pasteIncoming: !1, cutIncoming: !1, draggingText: !1, highlight: new Bn }, bi && setTimeout(jn(ct, this, !0), 20), pt(this); var a = this;
je(this, function() { a.curOp.forceUpdate = !0, sn(a, o), n.autofocus && !Ei || ri() == l.input ? setTimeout(jn(Et, a), 20) : zt(a); for (var e in io) io.hasOwnProperty(e) && io[e](a, n[e], oo); for (var t = 0; t < uo.length; ++t) uo[t](a) }) }
function t(e, t) { var r = this,
n = r.input = Qn("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none");
ki ? n.style.width = "1000px" : n.setAttribute("wrap", "off"), Ii && (n.style.border = "1px solid black"), n.setAttribute("autocorrect", "off"), n.setAttribute("autocapitalize", "off"), n.setAttribute("spellcheck", "false"), r.inputDiv = Qn("div", [n], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"), r.scrollbarH = Qn("div", [Qn("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"), r.scrollbarV = Qn("div", [Qn("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"), r.scrollbarFiller = Qn("div", null, "CodeMirror-scrollbar-filler"), r.gutterFiller = Qn("div", null, "CodeMirror-gutter-filler"), r.lineDiv = Qn("div", null, "CodeMirror-code"), r.selectionDiv = Qn("div", null, null, "position: relative; z-index: 1"), r.cursorDiv = Qn("div", null, "CodeMirror-cursors"), r.measure = Qn("div", null, "CodeMirror-measure"), r.lineMeasure = Qn("div", null, "CodeMirror-measure"), r.lineSpace = Qn("div", [r.measure, r.lineMeasure, r.selectionDiv, r.cursorDiv, r.lineDiv], null, "position: relative; outline: none"), r.mover = Qn("div", [Qn("div", [r.lineSpace], "CodeMirror-lines")], null, "position: relative"), r.sizer = Qn("div", [r.mover], "CodeMirror-sizer"), r.heightForcer = Qn("div", null, null, "position: absolute; height: " + Fo + "px; width: 1px;"), r.gutters = Qn("div", null, "CodeMirror-gutters"), r.lineGutter = null, r.scroller = Qn("div", [r.sizer, r.heightForcer, r.gutters], "CodeMirror-scroll"), r.scroller.setAttribute("tabIndex", "-1"), r.wrapper = Qn("div", [r.inputDiv, r.scrollbarH, r.scrollbarV, r.scrollbarFiller, r.gutterFiller, r.scroller], "CodeMirror"), xi && (r.gutters.style.zIndex = -1, r.scroller.style.paddingRight = 0), Ii && (n.style.width = "0px"), ki || (r.scroller.draggable = !0), Hi && (r.inputDiv.style.height = "1px", r.inputDiv.style.position = "absolute"), xi && (r.scrollbarH.style.minHeight = r.scrollbarV.style.minWidth = "18px"), e.appendChild ? e.appendChild(r.wrapper) : e(r.wrapper), r.viewFrom = r.viewTo = t.first, r.view = [], r.externalMeasured = null, r.viewOffset = 0, r.lastSizeC = 0, r.updateLineNumbers = null, r.lineNumWidth = r.lineNumInnerWidth = r.lineNumChars = null, r.prevInput = "", r.alignWidgets = !1, r.pollingFast = !1, r.poll = new Bn, r.cachedCharWidth = r.cachedTextHeight = r.cachedPaddingH = null, r.inaccurateSelection = !1, r.maxLine = null, r.maxLineLength = 0, r.maxLineChanged = !1, r.wheelDX = r.wheelDY = r.wheelStartX = r.wheelStartY = null, r.shift = !1 }
function r(t) { t.doc.mode = e.getMode(t.options, t.doc.modeOption), n(t) }
function n(e) { e.doc.iter(function(e) { e.stateAfter && (e.stateAfter = null), e.styles && (e.styles = null) }), e.doc.frontier = e.doc.first, ve(e, 100), e.state.modeGen++, e.curOp && et(e) }
function i(e) { e.options.lineWrapping ? (e.display.wrapper.className += " CodeMirror-wrap", e.display.sizer.style.minWidth = "") : (e.display.wrapper.className = e.display.wrapper.className.replace(" CodeMirror-wrap", ""), h(e)), l(e), et(e), De(e), setTimeout(function() { g(e) }, 100) }
function o(e) { var t = Ke(e.display),
r = e.options.lineWrapping,
n = r && Math.max(5, e.display.scroller.clientWidth / _e(e.display) - 3); return function(i) { if (Rr(e.doc, i)) return 0; var o = 0; if (i.widgets)
for (var l = 0; l < i.widgets.length; l++) i.widgets[l].height && (o += i.widgets[l].height); return r ? o + (Math.ceil(i.text.length / n) || 1) * t : o + t } }
function l(e) { var t = e.doc,
r = o(e);
t.iter(function(e) { var t = r(e);
t != e.height && hn(e, t) }) }
function a(e) { var t = go[e.options.keyMap],
r = t.style;
e.display.wrapper.className = e.display.wrapper.className.replace(/\s*cm-keymap-\S+/g, "") + (r ? " cm-keymap-" + r : "") }
function s(e) { e.display.wrapper.className = e.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + e.options.theme.replace(/(^|\s)\s*/g, " cm-s-"), De(e) }
function u(e) { c(e), et(e), setTimeout(function() { m(e) }, 20) }
function c(e) { var t = e.display.gutters,
r = e.options.gutters;
Jn(t); for (var n = 0; n < r.length; ++n) { var i = r[n],
o = t.appendChild(Qn("div", null, "CodeMirror-gutter " + i)); "CodeMirror-linenumbers" == i && (e.display.lineGutter = o, o.style.width = (e.display.lineNumWidth || 1) + "px") } t.style.display = n ? "" : "none"; var l = t.offsetWidth;
e.display.sizer.style.marginLeft = l + "px", n && (e.display.scrollbarH.style.left = e.options.fixedGutter ? l + "px" : 0) }
function f(e) { if (0 == e.height) return 0; for (var t, r = e.text.length, n = e; t = Hr(n);) { var i = t.find(0, !0);
n = i.from.line, r += i.from.ch - i.to.ch } for (n = e; t = Ar(n);) { var i = t.find(0, !0);
r -= n.text.length - i.from.ch, n = i.to.line, r += n.text.length - i.to.ch } return r }
function h(e) { var t = e.display,
r = e.doc;
t.maxLine = un(r, r.first), t.maxLineLength = f(t.maxLine), t.maxLineChanged = !0, r.iter(function(e) { var r = f(e);
r > t.maxLineLength && (t.maxLineLength = r, t.maxLine = e) }) }
function d(e) { var t = Kn(e.gutters, "CodeMirror-linenumbers");
t == -1 && e.lineNumbers ? e.gutters = e.gutters.concat(["CodeMirror-linenumbers"]) : t > -1 && !e.lineNumbers && (e.gutters = e.gutters.slice(0), e.gutters.splice(t, 1)) }
function p(e) { var t = e.display.scroller; return { clientHeight: t.clientHeight, barHeight: e.display.scrollbarV.clientHeight, scrollWidth: t.scrollWidth, clientWidth: t.clientWidth, barWidth: e.display.scrollbarH.clientWidth, docHeight: Math.round(e.doc.height + we(e.display)) } }
function g(e, t) { t || (t = p(e)); var r = e.display,
n = t.docHeight + Fo,
i = t.scrollWidth > t.clientWidth,
o = n > t.clientHeight; if (o ? (r.scrollbarV.style.display = "block", r.scrollbarV.style.bottom = i ? ni(r.measure) + "px" : "0", r.scrollbarV.firstChild.style.height = Math.max(0, n - t.clientHeight + (t.barHeight || r.scrollbarV.clientHeight)) + "px") : (r.scrollbarV.style.display = "", r.scrollbarV.firstChild.style.height = "0"), i ? (r.scrollbarH.style.display = "block", r.scrollbarH.style.right = o ? ni(r.measure) + "px" : "0", r.scrollbarH.firstChild.style.width = t.scrollWidth - t.clientWidth + (t.barWidth || r.scrollbarH.clientWidth) + "px") : (r.scrollbarH.style.display = "", r.scrollbarH.firstChild.style.width = "0"), i && o ? (r.scrollbarFiller.style.display = "block", r.scrollbarFiller.style.height = r.scrollbarFiller.style.width = ni(r.measure) + "px") : r.scrollbarFiller.style.display = "", i && e.options.coverGutterNextToScrollbar && e.options.fixedGutter ? (r.gutterFiller.style.display = "block", r.gutterFiller.style.height = ni(r.measure) + "px", r.gutterFiller.style.width = r.gutters.offsetWidth + "px") : r.gutterFiller.style.display = "", Ai && 0 === ni(r.measure)) { r.scrollbarV.style.minWidth = r.scrollbarH.style.minHeight = Wi ? "18px" : "12px"; var l = function(t) { Dn(t) != r.scrollbarV && Dn(t) != r.scrollbarH && $e(e, mt)(t) };
Eo(r.scrollbarV, "mousedown", l), Eo(r.scrollbarH, "mousedown", l) } }
function v(e, t, r) { var n = r && null != r.top ? r.top : e.scroller.scrollTop;
n = Math.floor(n - xe(e)); var i = r && null != r.bottom ? r.bottom : n + e.wrapper.clientHeight,
o = pn(t, n),
l = pn(t, i); if (r && r.ensure) { var a = r.ensure.from.line,
s = r.ensure.to.line; if (a < o) return { from: a, to: pn(t, gn(un(t, a)) + e.wrapper.clientHeight) }; if (Math.min(s, t.lastLine()) >= l) return { from: pn(t, gn(un(t, s)) - e.wrapper.clientHeight), to: s } } return { from: o, to: l } }
function m(e) { var t = e.display,
r = t.view; if (t.alignWidgets || t.gutters.firstChild && e.options.fixedGutter) { for (var n = x(t) - t.scroller.scrollLeft + e.doc.scrollLeft, i = t.gutters.offsetWidth, o = n + "px", l = 0; l < r.length; l++)
if (!r[l].hidden) { e.options.fixedGutter && r[l].gutter && (r[l].gutter.style.left = o); var a = r[l].alignable; if (a)
for (var s = 0; s < a.length; s++) a[s].style.left = o }
e.options.fixedGutter && (t.gutters.style.left = n + i + "px") } }
function y(e) { if (!e.options.lineNumbers) return !1; var t = e.doc,
r = b(e.options, t.first + t.size - 1),
n = e.display; if (r.length != n.lineNumChars) { var i = n.measure.appendChild(Qn("div", [Qn("div", r)], "CodeMirror-linenumber CodeMirror-gutter-elt")),
o = i.firstChild.offsetWidth,
l = i.offsetWidth - o;
n.lineGutter.style.width = "", n.lineNumInnerWidth = Math.max(o, n.lineGutter.offsetWidth - l), n.lineNumWidth = n.lineNumInnerWidth + l, n.lineNumChars = n.lineNumInnerWidth ? r.length : -1, n.lineGutter.style.width = n.lineNumWidth + "px"; var a = n.gutters.offsetWidth; return n.scrollbarH.style.left = e.options.fixedGutter ? a + "px" : 0, n.sizer.style.marginLeft = a + "px", !0 } return !1 }
function b(e, t) { return String(e.lineNumberFormatter(t + e.firstLineNumber)) }
function x(e) { return e.scroller.getBoundingClientRect().left - e.sizer.getBoundingClientRect().left }
function w(e, t, r) { for (var n, i = e.display.viewFrom, o = e.display.viewTo, l = v(e.display, e.doc, t), a = !0;; a = !1) { var s = e.display.scroller.clientWidth; if (!C(e, l, r)) break;
n = !0, e.display.maxLineChanged && !e.options.lineWrapping && L(e); var u = p(e); if (he(e), S(e, u), g(e, u), a && e.options.lineWrapping && s != e.display.scroller.clientWidth) r = !0;
else if (r = !1, t && null != t.top && (t = { top: Math.min(u.docHeight - Fo - u.clientHeight, t.top) }), l = v(e.display, e.doc, t), l.from >= e.display.viewFrom && l.to <= e.display.viewTo) break } return e.display.updateLineNumbers = null, n && (En(e, "update", e), e.display.viewFrom == i && e.display.viewTo == o || En(e, "viewportChange", e, e.display.viewFrom, e.display.viewTo)), n }
function C(e, t, r) { var n = e.display,
i = e.doc; if (!n.wrapper.offsetWidth) return void rt(e); if (!(!r && t.from >= n.viewFrom && t.to <= n.viewTo && 0 == lt(e))) { y(e) && rt(e); var o = T(e),
l = i.first + i.size,
a = Math.max(t.from - e.options.viewportMargin, i.first),
s = Math.min(l, t.to + e.options.viewportMargin);
n.viewFrom < a && a - n.viewFrom < 20 && (a = Math.max(i.first, n.viewFrom)), n.viewTo > s && n.viewTo - s < 20 && (s = Math.min(l, n.viewTo)), Vi && (a = Er(e.doc, a), s = zr(e.doc, s)); var u = a != n.viewFrom || s != n.viewTo || n.lastSizeC != n.wrapper.clientHeight;
ot(e, a, s), n.viewOffset = gn(un(e.doc, n.viewFrom)), e.display.mover.style.top = n.viewOffset + "px"; var c = lt(e); if (u || 0 != c || r) { var f = ri(); return c > 4 && (n.lineDiv.style.display = "none"), N(e, n.updateLineNumbers, o), c > 4 && (n.lineDiv.style.display = ""), f && ri() != f && f.offsetHeight && f.focus(), Jn(n.cursorDiv), Jn(n.selectionDiv), u && (n.lastSizeC = n.wrapper.clientHeight, ve(e, 400)), k(e), !0 } } }
function L(e) { var t = e.display,
r = Me(e, t.maxLine, t.maxLine.text.length).left;
t.maxLineChanged = !1; var n = Math.max(0, r + 3),
i = Math.max(0, t.sizer.offsetLeft + n + Fo - t.scroller.clientWidth);
t.sizer.style.minWidth = n + "px", i < e.doc.scrollLeft && Mt(e, Math.min(t.scroller.scrollLeft, i), !0) }
function S(e, t) { e.display.sizer.style.minHeight = e.display.heightForcer.style.top = t.docHeight + "px", e.display.gutters.style.height = Math.max(t.docHeight, t.clientHeight - Fo) + "px" }
function k(e) { for (var t = e.display, r = t.lineDiv.offsetTop, n = 0; n < t.view.length; n++) { var i, o = t.view[n]; if (!o.hidden) { if (xi) { var l = o.node.offsetTop + o.node.offsetHeight;
i = l - r, r = l } else { var a = o.node.getBoundingClientRect();
i = a.bottom - a.top } var s = o.line.height - i; if (i < 2 && (i = Ke(t)), (s > .001 || s < -.001) && (hn(o.line, i), M(o.line), o.rest))
for (var u = 0; u < o.rest.length; u++) M(o.rest[u]) } } }
function M(e) { if (e.widgets)
for (var t = 0; t < e.widgets.length; ++t) e.widgets[t].height = e.widgets[t].node.offsetHeight }
function T(e) { for (var t = e.display, r = {}, n = {}, i = t.gutters.firstChild, o = 0; i; i = i.nextSibling, ++o) r[e.options.gutters[o]] = i.offsetLeft, n[e.options.gutters[o]] = i.offsetWidth; return { fixedPos: x(t), gutterTotalWidth: t.gutters.offsetWidth, gutterLeft: r, gutterWidth: n, wrapperWidth: t.wrapper.clientWidth } }
function N(e, t, r) {
function n(t) { var r = t.nextSibling; return ki && zi && e.display.currentWheelTarget == t ? t.style.display = "none" : t.parentNode.removeChild(t), r } for (var i = e.display, o = e.options.lineNumbers, l = i.lineDiv, a = l.firstChild, s = i.view, u = i.viewFrom, c = 0; c < s.length; c++) { var f = s[c]; if (f.hidden);
else if (f.node) { for (; a != f.node;) a = n(a); var h = o && null != t && t <= u && f.lineNumber;
f.changes && (Kn(f.changes, "gutter") > -1 && (h = !1), O(e, f, u, r)), h && (Jn(f.lineNumber), f.lineNumber.appendChild(document.createTextNode(b(e.options, u)))), a = f.node.nextSibling } else { var d = R(e, f, u, r);
l.insertBefore(d, a) } u += f.size } for (; a;) a = n(a) }
function O(e, t, r, n) { for (var i = 0; i < t.changes.length; i++) { var o = t.changes[i]; "text" == o ? D(e, t) : "gutter" == o ? E(e, t, r, n) : "class" == o ? I(t) : "widget" == o && z(t, n) } t.changes = null }
function H(e) { return e.node == e.text && (e.node = Qn("div", null, null, "position: relative"), e.text.parentNode && e.text.parentNode.replaceChild(e.node, e.text), e.node.appendChild(e.text), xi && (e.node.style.zIndex = 2)), e.node }
function A(e) { var t = e.bgClass ? e.bgClass + " " + (e.line.bgClass || "") : e.line.bgClass; if (t && (t += " CodeMirror-linebackground"), e.background) t ? e.background.className = t : (e.background.parentNode.removeChild(e.background), e.background = null);
else if (t) { var r = H(e);
e.background = r.insertBefore(Qn("div", null, t), r.firstChild) } }
function W(e, t) { var r = e.display.externalMeasured; return r && r.line == t.line ? (e.display.externalMeasured = null, t.measure = r.measure, r.built) : $r(e, t) }
function D(e, t) { var r = t.text.className,
n = W(e, t);
t.text == t.node && (t.node = n.pre), t.text.parentNode.replaceChild(n.pre, t.text), t.text = n.pre, n.bgClass != t.bgClass || n.textClass != t.textClass ? (t.bgClass = n.bgClass, t.textClass = n.textClass, I(t)) : r && (t.text.className = r) }
function I(e) { A(e), e.line.wrapClass ? H(e).className = e.line.wrapClass : e.node != e.text && (e.node.className = ""); var t = e.textClass ? e.textClass + " " + (e.line.textClass || "") : e.line.textClass;
e.text.className = t || "" }
function E(e, t, r, n) { t.gutter && (t.node.removeChild(t.gutter), t.gutter = null); var i = t.line.gutterMarkers; if (e.options.lineNumbers || i) { var o = H(t),
l = t.gutter = o.insertBefore(Qn("div", null, "CodeMirror-gutter-wrapper", "position: absolute; left: " + (e.options.fixedGutter ? n.fixedPos : -n.gutterTotalWidth) + "px"), t.text); if (!e.options.lineNumbers || i && i["CodeMirror-linenumbers"] || (t.lineNumber = l.appendChild(Qn("div", b(e.options, r), "CodeMirror-linenumber CodeMirror-gutter-elt", "left: " + n.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + e.display.lineNumInnerWidth + "px"))), i)
for (var a = 0; a < e.options.gutters.length; ++a) { var s = e.options.gutters[a],
u = i.hasOwnProperty(s) && i[s];
u && l.appendChild(Qn("div", [u], "CodeMirror-gutter-elt", "left: " + n.gutterLeft[s] + "px; width: " + n.gutterWidth[s] + "px")) } } }
function z(e, t) { e.alignable && (e.alignable = null); for (var r, n = e.node.firstChild; n; n = r) { var r = n.nextSibling; "CodeMirror-linewidget" == n.className && e.node.removeChild(n) } P(e, t) }
function R(e, t, r, n) { var i = W(e, t); return t.text = t.node = i.pre, i.bgClass && (t.bgClass = i.bgClass), i.textClass && (t.textClass = i.textClass), I(t), E(e, t, r, n), P(t, n), t.node }
function P(e, t) { if (F(e.line, e, t, !0), e.rest)
for (var r = 0; r < e.rest.length; r++) F(e.rest[r], e, t, !1) }
function F(e, t, r, n) { if (e.widgets)
for (var i = H(t), o = 0, l = e.widgets; o < l.length; ++o) { var a = l[o],
s = Qn("div", [a.node], "CodeMirror-linewidget");
a.handleMouseEvents || (s.ignoreEvents = !0), B(a, s, t, r), n && a.above ? i.insertBefore(s, t.gutter || t.text) : i.appendChild(s), En(a, "redraw") } }
function B(e, t, r, n) { if (e.noHScroll) {
(r.alignable || (r.alignable = [])).push(t); var i = n.wrapperWidth;
t.style.left = n.fixedPos + "px", e.coverGutter || (i -= n.gutterTotalWidth, t.style.paddingLeft = n.gutterTotalWidth + "px"), t.style.width = i + "px" } e.coverGutter && (t.style.zIndex = 5, t.style.position = "relative", e.noHScroll || (t.style.marginLeft = -n.gutterTotalWidth + "px")) }
function G(e) { return Ui(e.line, e.ch) }
function V(e, t) { return Ki(e, t) < 0 ? t : e }
function U(e, t) { return Ki(e, t) < 0 ? e : t }