@ -0,0 +1,2 @@ |
|||||
|
.DS_Store |
||||
|
|
@ -0,0 +1,16 @@ |
|||||
|
<!doctype html> |
||||
|
<html lang="nl"> |
||||
|
<head> |
||||
|
<meta charset="utf-8"> |
||||
|
<title>123 Bicategorie webshop</title> |
||||
|
<style> |
||||
|
body {text-align: center; max-width: 700px; margin: 0 auto 0 auto;} |
||||
|
h1 {margin: 30px; font-size: 28pt; font-family: sans-serif;} |
||||
|
</style> |
||||
|
</head> |
||||
|
<body> |
||||
|
<h1>123 Bicategorie</h1> |
||||
|
<h2>Dé webshop voor al uw categorische producten!</h2> |
||||
|
</body> |
||||
|
</html> |
||||
|
|
@ -0,0 +1,28 @@ |
|||||
|
# ---> macOS |
||||
|
# General |
||||
|
.DS_Store |
||||
|
.AppleDouble |
||||
|
.LSOverride |
||||
|
|
||||
|
# Icon must end with two \r |
||||
|
Icon |
||||
|
|
||||
|
# Thumbnails |
||||
|
._* |
||||
|
|
||||
|
# Files that might appear in the root of a volume |
||||
|
.DocumentRevisions-V100 |
||||
|
.fseventsd |
||||
|
.Spotlight-V100 |
||||
|
.TemporaryItems |
||||
|
.Trashes |
||||
|
.VolumeIcon.icns |
||||
|
.com.apple.timemachine.donotpresent |
||||
|
|
||||
|
# Directories potentially created on remote AFP share |
||||
|
.AppleDB |
||||
|
.AppleDesktop |
||||
|
Network Trash Folder |
||||
|
Temporary Items |
||||
|
.apdisk |
||||
|
|
After Width: | Height: | Size: 39 KiB |
After Width: | Height: | Size: 42 KiB |
@ -0,0 +1,3 @@ |
|||||
|
# bisimulation-online |
||||
|
|
||||
|
April fools website |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 23 KiB |
@ -0,0 +1,185 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html lang="en"> |
||||
|
<head> |
||||
|
<meta charset="utf-8"> |
||||
|
<title>BaaS: Bisimulation as a Service</title> |
||||
|
|
||||
|
<link rel="stylesheet" media="screen" href="style.css"> |
||||
|
|
||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
||||
|
<meta name="author" content="Joshua Moerman"> |
||||
|
<meta name="description" content="Checking behavioural equivalence was never this easy!"> |
||||
|
</head> |
||||
|
<!-- |
||||
|
Hi there! |
||||
|
|
||||
|
Great to see you look at the source of this webpage. As you |
||||
|
have probably guessed, this is an April fools day joke. Hope |
||||
|
you can enjoy :-). |
||||
|
|
||||
|
In case you actually want to compute bisimulations, you can |
||||
|
have a look at model checkers such as: |
||||
|
- mCRL2: https://www.mcrl2.org |
||||
|
- Storm: https://www.stormchecker.org |
||||
|
- CADP: https://cadp.inria.fr |
||||
|
- UPPAAL: http://www.uppaal.org |
||||
|
- Prism: https://www.prismmodelchecker.org |
||||
|
Many provide implementations for checking bisimilarity. |
||||
|
|
||||
|
I would like to draw you attention to CoPaR: |
||||
|
- https://git8.cs.fau.de/software/copar |
||||
|
It is a generic implementation of parition refinement, based |
||||
|
on category theory. It implements all the usual bisimulation |
||||
|
algorithms (bisimulation, weighted bisimulation, lumping, ...) |
||||
|
with a single generic algorithm. In most cases it provides the |
||||
|
current best complexity of these algorithms. |
||||
|
|
||||
|
Kind regards, |
||||
|
Joshua Moerman |
||||
|
--> |
||||
|
<body> |
||||
|
<div> |
||||
|
<section class="intro"> |
||||
|
<header> |
||||
|
<h1>BaaS</h1> |
||||
|
<h2>Bisimulation as a Service</h2> |
||||
|
</header> |
||||
|
|
||||
|
<div class="summary"> |
||||
|
<p>Check behavioural equivalence of your models NOW! |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<div class="main"> |
||||
|
<div class="middle"> |
||||
|
<h3>What we do as BaaS</h3> |
||||
|
<p>We provide an online service for <em>bisimulation checking</em>. |
||||
|
Bisimulation is a must in the Industry 4.0 era. |
||||
|
Correctness and robustness of your software products are our top priority. |
||||
|
With BaaS, we are changing the way you do verification. |
||||
|
|
||||
|
<p>Developers can now check behavioural equivalence with the touch of a button, increasing their productivity. |
||||
|
We support many types of bisimulation, including the latest up-to techniques. |
||||
|
|
||||
|
<p>You can register for a monthly subscription which allows you to check many models. |
||||
|
We provide a free plan with reduced functionality. |
||||
|
</div> |
||||
|
|
||||
|
<div class="solide grid"> |
||||
|
<div> |
||||
|
<img class="cat" src="ginger-cat-746.png"/> |
||||
|
</div> |
||||
|
|
||||
|
<div> |
||||
|
<h3>What is a bisimulation?</h3> |
||||
|
<p>Two systems are <em>bisimilar</em> if they match each other's moves. |
||||
|
In this sense, each of the systems cannot be distinguished from the other by an observer. |
||||
|
|
||||
|
<p>A bisimulation relation is a <em>certificate</em> of this equivalence. |
||||
|
Our service computes this certificate automatically for you. |
||||
|
This makes our service trustworthy and secure, as it does not only return a binary output. |
||||
|
|
||||
|
<p>If your system contains a bug, our service will not be able to produce this certificate. |
||||
|
Instead, it will return a counterexample, which can be used to resolve the bug. |
||||
|
|
||||
|
<p>Bisimulations are also used to minimise your state-based systems. |
||||
|
This enables model-checkers to prove correctness in terms of temporal logics. |
||||
|
</div> |
||||
|
|
||||
|
<div> |
||||
|
<h3>Efficient</h3> |
||||
|
<p>Our algorithms are state-of-the art, using up-to techniques, making us the most efficient BaaS. |
||||
|
These up-to-techniques compress the bisimulation by using algebraic and coalgebraic properties of the system. |
||||
|
It allows the bisimulation algorithm to exit early and find bugs more quickly. |
||||
|
This is not only good for efficiency and throughput, it also shrinks the size of the certificate. |
||||
|
</div> |
||||
|
|
||||
|
<div> |
||||
|
<img class="cat" src="ginger-cat-713.png"/> |
||||
|
</div> |
||||
|
|
||||
|
<div> |
||||
|
<div class="profile"> |
||||
|
<img class="profile-pic" src="Rob.jpg"><br> |
||||
|
Prof. Dr. Rob van Glabbeek.<br> |
||||
|
<em>Expert.</em> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div> |
||||
|
<h3>Testimonial</h3> |
||||
|
<p style="font-style:italic">"BaaS is by far the most user-friendly bisimulation checker I have every tried. |
||||
|
Small systems, or ones with millions of transitions, Baas gives me the |
||||
|
right answers in virtually no time at all. Never again need I |
||||
|
experiment with dotted lines on a whiteboard: just pipe it through |
||||
|
BaaS and all will be clear!" |
||||
|
<p style="text-align:right">- Rob van Glabbeek |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="middle"> |
||||
|
<h3>BaaS Plans</h3> |
||||
|
|
||||
|
<p>Get in touch to inquire about the pricing. |
||||
|
Below is a table of the different features we provide. |
||||
|
|
||||
|
<table> |
||||
|
<tr class="rowheader"><th>You get<th>Free<th>Premium BaaS |
||||
|
<tr><td>Maximal number of models per month<td>10<td>9000 |
||||
|
<tr><td>Maximal number of states per model<td>50<td>1000000 |
||||
|
<tr><td>Maximal number of transitions per model<td>100<td>9000000 |
||||
|
|
||||
|
<tr class="rowheader"><th>Features<th><th> |
||||
|
<tr><td>Standard (strong) bisimulation<td>✓<td>✓ |
||||
|
<tr><td>Branching bisimulation<td><td>✓ |
||||
|
<tr><td>Bisimulation up-to transitive closure and congruence<td><td>✓ |
||||
|
<tr><td>Bisimulation up-to bisimulation<td><td>✓ |
||||
|
<tr><td>CEGAR & CEGIS API<td><td>✓ |
||||
|
<tr><td>O(m log n) algorithms<td><td>✓ |
||||
|
<tr><td>Big Data Types<!-- Credits to Freek Wiedijk for this joke! --><td><td>✓ |
||||
|
|
||||
|
<tr class="rowheader"><th>Models<th><th> |
||||
|
<tr><td>Deterministic Automata<td>✓<td>✓ |
||||
|
<tr><td>Nondeterministic Automata<td><td>✓ |
||||
|
<tr><td>Weighted Automata<td>✓<td>✓ |
||||
|
<tr><td>Weighted Tree Automata<td><td>✓ |
||||
|
<tr><td>Deterministic Register Automata<td><td>✓ |
||||
|
<tr><td>Markovian Timed Fault Trees<td><td>✓ |
||||
|
<tr><td>Quantum Software Product Line Systems<td><td>✓ |
||||
|
<tr><td>Labelled Transition Blockchain Coalgebras<td><td>✓ |
||||
|
</table> |
||||
|
|
||||
|
<p>Upon request, we can provide <em>divergence-preserving branching bisimilarity</em> for citizens from The Netherlands and France. |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
<div class="middle"> |
||||
|
<h3>Team</h3> |
||||
|
<p>We're a team of bisimulation technologists and serious entrepreneurs. |
||||
|
We work around the clock, to make sure your bisimulations are always ready to go. |
||||
|
|
||||
|
<div class="team"> |
||||
|
<div class="profile"> |
||||
|
<img class="profile-pic" src="Joshua.jpg"><br> |
||||
|
Joshua Moerman, PhD.<br> |
||||
|
Founder, Bisimulation Evangelist. |
||||
|
</div> |
||||
|
|
||||
|
<div class="profile"> |
||||
|
<img class="profile-pic" src="Jurriaan.jpg"><br> |
||||
|
Jurriaan Rot, PhD.<br> |
||||
|
CEO, CPO, and CTO. |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<footer> |
||||
|
Copyright 2020 - BaaS - Bisimulation Online |
||||
|
</footer> |
||||
|
</div> |
||||
|
|
||||
|
<!-- A bit of a hack. This creates the cats and star! --> |
||||
|
<aside></aside> |
||||
|
</div> |
||||
|
</body> |
||||
|
</html> |
After Width: | Height: | Size: 576 B |
@ -0,0 +1,284 @@ |
|||||
|
body { |
||||
|
margin: 0; |
||||
|
color: #034; |
||||
|
font-family: "Nunito Sans", "Avenir", "Helvetica Neue", sans-serif; |
||||
|
font-size: 14pt; |
||||
|
line-height: 1.4em; |
||||
|
} |
||||
|
p { |
||||
|
text-align: justify; |
||||
|
} |
||||
|
|
||||
|
a { |
||||
|
color: #3be; |
||||
|
} |
||||
|
a:hover { |
||||
|
color: #034; |
||||
|
} |
||||
|
|
||||
|
header { |
||||
|
margin: 0 auto; |
||||
|
max-width: 1040px; |
||||
|
position: relative; |
||||
|
text-align: center; |
||||
|
top: 0; |
||||
|
width: 100%; |
||||
|
z-index: 1; |
||||
|
} |
||||
|
h1 { |
||||
|
font-family: 'Adelle W01 Bold', "Lucida Bright", Lucida, "DejaVu Serif", "Bitstream Vera Serif", Georgia, serif; |
||||
|
font-size: 90px; |
||||
|
font-weight: 500; |
||||
|
|
||||
|
background-color: #fff; |
||||
|
color: #034; |
||||
|
display: inline-block; |
||||
|
min-height: 18px; |
||||
|
margin: 40px auto 0; |
||||
|
padding: 0 10px; |
||||
|
z-index: 2; |
||||
|
} |
||||
|
/* Creates horizontal line */ |
||||
|
h1:after { |
||||
|
background-color: #e42; |
||||
|
content: ''; |
||||
|
height: 12px; |
||||
|
left: 0; |
||||
|
margin-top: 2px; |
||||
|
position: absolute; |
||||
|
width: 100%; |
||||
|
z-index: -1; |
||||
|
} |
||||
|
h2 { |
||||
|
color: #e42; |
||||
|
font-size: 22px; |
||||
|
font-style: italic; |
||||
|
font-weight: 400; |
||||
|
|
||||
|
text-align: right; |
||||
|
max-width: 695px; |
||||
|
margin: -10px auto 0; |
||||
|
width: 100%; |
||||
|
} |
||||
|
|
||||
|
.summary { |
||||
|
position: relative; |
||||
|
max-width: 1040px; |
||||
|
margin: 20px auto; |
||||
|
z-index: 2; |
||||
|
} |
||||
|
.summary p { |
||||
|
color: #e42; |
||||
|
font-style: italic; |
||||
|
text-align: right; |
||||
|
max-width: 695px; |
||||
|
margin: 10px auto 0; |
||||
|
} |
||||
|
|
||||
|
.intro { |
||||
|
background: linear-gradient(to bottom, #fff 0%, #edf6ff 100%); |
||||
|
height: 450px; |
||||
|
} |
||||
|
|
||||
|
h3 { |
||||
|
color: #e42; |
||||
|
text-transform: uppercase; |
||||
|
font-size: 160%; |
||||
|
font-weight: 900; |
||||
|
} |
||||
|
|
||||
|
.main { |
||||
|
background-color: rgba(255, 255, 255, 0.9); |
||||
|
border-top: 5px solid #e42; |
||||
|
border-bottom: 5px solid #3be; |
||||
|
position: relative; |
||||
|
width: 100%; |
||||
|
z-index: 3; |
||||
|
} |
||||
|
|
||||
|
.main p, .main h3, .main .middle { |
||||
|
max-width: 495px; |
||||
|
} |
||||
|
|
||||
|
.middle { |
||||
|
margin: 25px auto 40px auto; |
||||
|
} |
||||
|
|
||||
|
.solide { |
||||
|
background: #edf6ff; |
||||
|
border-top: 5px solid #def; |
||||
|
border-bottom: 5px solid #def; |
||||
|
margin: 25px 0; |
||||
|
|
||||
|
display: grid; |
||||
|
grid-template-columns: auto auto; |
||||
|
grid-gap: 10px; |
||||
|
padding: 0 10%; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.solide > div { |
||||
|
padding: 20px 0; |
||||
|
max-width: 495px; |
||||
|
margin-left:auto; |
||||
|
margin-right:auto; |
||||
|
} |
||||
|
|
||||
|
.solide .cat { |
||||
|
max-height: 250px; |
||||
|
} |
||||
|
|
||||
|
table { |
||||
|
border-collapse: collapse; |
||||
|
max-width: 100%; |
||||
|
} |
||||
|
|
||||
|
table th { |
||||
|
padding: 15px; |
||||
|
} |
||||
|
|
||||
|
table td { |
||||
|
text-align: center; |
||||
|
max-width: 200px; |
||||
|
padding: 10px; |
||||
|
} |
||||
|
|
||||
|
.rowheader { |
||||
|
border-bottom: 2px solid #e42; |
||||
|
} |
||||
|
|
||||
|
.team { |
||||
|
display: grid; |
||||
|
grid-template-columns: auto auto; |
||||
|
grid-gap: 30px; |
||||
|
align-items: top; |
||||
|
} |
||||
|
|
||||
|
.profile { |
||||
|
text-align: center; |
||||
|
max-width: 220px; |
||||
|
margin: 0 auto; |
||||
|
} |
||||
|
|
||||
|
.profile-pic { |
||||
|
margin: 20px; |
||||
|
width: 160px; |
||||
|
border-radius:100px; |
||||
|
box-shadow: 0 0 10px 0 black; |
||||
|
} |
||||
|
|
||||
|
/* star */ |
||||
|
@keyframes spin { |
||||
|
from { transform: rotate(0deg); } |
||||
|
to { transform: rotate(360deg); } |
||||
|
} |
||||
|
aside:before { |
||||
|
animation: spin 37s infinite linear; |
||||
|
background: url('star.svg') center top no-repeat; |
||||
|
content: ''; |
||||
|
height: 921px; |
||||
|
left: 50%; |
||||
|
margin-left: -461.5px; |
||||
|
position: fixed; |
||||
|
top: 60px; |
||||
|
width: 923px; |
||||
|
} |
||||
|
|
||||
|
/* cats */ |
||||
|
@keyframes rise { |
||||
|
from { top: 100%; } |
||||
|
to { top: 165px; } |
||||
|
} |
||||
|
aside:after { |
||||
|
animation: rise 1.25s 1 ease; |
||||
|
background: url('ginger-cat-718.png') center no-repeat; |
||||
|
content: ''; |
||||
|
position: fixed; |
||||
|
z-index: 1; |
||||
|
left: 50%; |
||||
|
margin-left: -330px; |
||||
|
width: 660px; |
||||
|
height: 640px; |
||||
|
top: 165px; |
||||
|
} |
||||
|
|
||||
|
footer { |
||||
|
color: #fff; |
||||
|
padding: 20px; |
||||
|
background: #034; |
||||
|
font-size: 22px; |
||||
|
text-align: center; |
||||
|
} |
||||
|
footer a { |
||||
|
text-decoration: underline; |
||||
|
} |
||||
|
footer a:hover { |
||||
|
color: #fff; |
||||
|
} |
||||
|
|
||||
|
@media (max-width: 750px) { |
||||
|
.intro { |
||||
|
height: 320px; |
||||
|
} |
||||
|
aside:before { |
||||
|
top: 80px; |
||||
|
} |
||||
|
@keyframes rise-short { |
||||
|
from { top: 100%; } |
||||
|
to { top: 40px; } |
||||
|
} |
||||
|
aside:after { |
||||
|
background-size: 67%; |
||||
|
animation: rise-short 1.5s 1 ease; |
||||
|
top: 40px; |
||||
|
} |
||||
|
h1 { |
||||
|
font-size: 60px; |
||||
|
min-height: 50px; |
||||
|
margin-top: 35px; |
||||
|
} |
||||
|
.main footer { |
||||
|
font-size: 18px; |
||||
|
} |
||||
|
.middle { |
||||
|
/*width: 85%;*/ |
||||
|
} |
||||
|
.solide { |
||||
|
grid-template-columns: auto; |
||||
|
grid-gap: 0px; |
||||
|
} |
||||
|
.solide > div { |
||||
|
padding: 0px; |
||||
|
} |
||||
|
.solide .cat { |
||||
|
max-height: 140px; |
||||
|
padding: 10px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@media (max-width: 500px) { |
||||
|
body { |
||||
|
font-size: 15pt; |
||||
|
} |
||||
|
.solide { |
||||
|
padding: 5px; |
||||
|
} |
||||
|
.middle { |
||||
|
padding: 5px; |
||||
|
} |
||||
|
table th { |
||||
|
padding: 8px; |
||||
|
} |
||||
|
table td { |
||||
|
padding: 4px; |
||||
|
} |
||||
|
table { |
||||
|
font-size: 80%; |
||||
|
} |
||||
|
.team { |
||||
|
grid-template-columns: auto; |
||||
|
} |
||||
|
.profile { |
||||
|
max-width: 400px; |
||||
|
} |
||||
|
} |
@ -0,0 +1,25 @@ |
|||||
|
<!doctype html> |
||||
|
<html lang="en"> |
||||
|
<head> |
||||
|
<meta charset="utf-8"> |
||||
|
<title>Experiments</title> |
||||
|
<style> |
||||
|
body {text-align: center; font-family: sans-serif; background: #faf;} |
||||
|
</style> |
||||
|
</head> |
||||
|
|
||||
|
<body> |
||||
|
<h1>Dingen</h1> |
||||
|
|
||||
|
<ul> |
||||
|
<li><a href="./baas/">BaaS: Bisimulation as a Service</a> |
||||
|
<li><a href="./123bicategorie/">123bicategorie.nl: webshop for categorical products</a> |
||||
|
<li><a href="./rust-wasm/">Rust animation in the browser</a> |
||||
|
</ul> |
||||
|
|
||||
|
<footer style="color: #ffa"> |
||||
|
Copyright Joshua Moerman 2020 |
||||
|
</footer> |
||||
|
|
||||
|
</body> |
||||
|
</html> |
@ -0,0 +1,61 @@ |
|||||
|
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[0],{ |
||||
|
|
||||
|
/***/ "../pkg/rust_wasm.js": |
||||
|
/*!***************************!*\ |
||||
|
!*** ../pkg/rust_wasm.js ***! |
||||
|
\***************************/ |
||||
|
/*! exports provided: Universe, __wbg_random_a3b3bcffa2ed629c, __wbindgen_throw */ |
||||
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
||||
|
|
||||
|
"use strict"; |
||||
|
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _rust_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rust_wasm_bg.wasm */ \"../pkg/rust_wasm_bg.wasm\");\n/* harmony import */ var _rust_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rust_wasm_bg.js */ \"../pkg/rust_wasm_bg.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Universe\", function() { return _rust_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"Universe\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_random_a3b3bcffa2ed629c\", function() { return _rust_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_random_a3b3bcffa2ed629c\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return _rust_wasm_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_throw\"]; });\n\n\n\n\n//# sourceURL=webpack:///../pkg/rust_wasm.js?"); |
||||
|
|
||||
|
/***/ }), |
||||
|
|
||||
|
/***/ "../pkg/rust_wasm_bg.js": |
||||
|
/*!******************************!*\ |
||||
|
!*** ../pkg/rust_wasm_bg.js ***! |
||||
|
\******************************/ |
||||
|
/*! exports provided: Universe, __wbg_random_a3b3bcffa2ed629c, __wbindgen_throw */ |
||||
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
||||
|
|
||||
|
"use strict"; |
||||
|
eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Universe\", function() { return Universe; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_random_a3b3bcffa2ed629c\", function() { return __wbg_random_a3b3bcffa2ed629c; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return __wbindgen_throw; });\n/* harmony import */ var _rust_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rust_wasm_bg.wasm */ \"../pkg/rust_wasm_bg.wasm\");\n\n\nconst lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder;\n\nlet cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n\ncachedTextDecoder.decode();\n\nlet cachegetUint8Memory0 = null;\nfunction getUint8Memory0() {\n if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== _rust_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer) {\n cachegetUint8Memory0 = new Uint8Array(_rust_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"memory\"].buffer);\n }\n return cachegetUint8Memory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\n\nfunction notDefined(what) { return () => { throw new Error(`${what} is not defined`); }; }\n/**\n*/\nclass Universe {\n\n static __wrap(ptr) {\n const obj = Object.create(Universe.prototype);\n obj.ptr = ptr;\n\n return obj;\n }\n\n free() {\n const ptr = this.ptr;\n this.ptr = 0;\n\n _rust_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbg_universe_free\"](ptr);\n }\n /**\n */\n tick() {\n _rust_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"universe_tick\"](this.ptr);\n }\n /**\n * @returns {Universe}\n */\n static new() {\n var ret = _rust_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"universe_new\"]();\n return Universe.__wrap(ret);\n }\n /**\n */\n init() {\n _rust_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"universe_init\"](this.ptr);\n }\n /**\n * @returns {number}\n */\n width() {\n var ret = _rust_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"universe_width\"](this.ptr);\n return ret;\n }\n /**\n * @returns {number}\n */\n height() {\n var ret = _rust_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"universe_height\"](this.ptr);\n return ret;\n }\n /**\n * @returns {number}\n */\n stress() {\n var ret = _rust_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"universe_stress\"](this.ptr);\n return ret;\n }\n /**\n * @returns {number}\n */\n cells() {\n var ret = _rust_wasm_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"universe_cells\"](this.ptr);\n return ret;\n }\n}\n\nconst __wbg_random_a3b3bcffa2ed629c = typeof Math.random == 'function' ? Math.random : notDefined('Math.random');\n\nconst __wbindgen_throw = function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n};\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../www/node_modules/webpack/buildin/harmony-module.js */ \"./node_modules/webpack/buildin/harmony-module.js\")(module)))\n\n//# sourceURL=webpack:///../pkg/rust_wasm_bg.js?"); |
||||
|
|
||||
|
/***/ }), |
||||
|
|
||||
|
/***/ "../pkg/rust_wasm_bg.wasm": |
||||
|
/*!********************************!*\ |
||||
|
!*** ../pkg/rust_wasm_bg.wasm ***! |
||||
|
\********************************/ |
||||
|
/*! exports provided: memory, __wbg_universe_free, universe_tick, universe_new, universe_init, universe_width, universe_height, universe_stress, universe_cells */ |
||||
|
/***/ (function(module, exports, __webpack_require__) { |
||||
|
|
||||
|
eval("\"use strict\";\n// Instantiate WebAssembly module\nvar wasmExports = __webpack_require__.w[module.i];\n__webpack_require__.r(exports);\n// export exports from WebAssembly module\nfor(var name in wasmExports) if(name != \"__webpack_init__\") exports[name] = wasmExports[name];\n// exec imports from WebAssembly module (for esm order)\n/* harmony import */ var m0 = __webpack_require__(/*! ./rust_wasm_bg.js */ \"../pkg/rust_wasm_bg.js\");\n\n\n// exec wasm module\nwasmExports[\"__webpack_init__\"]()\n\n//# sourceURL=webpack:///../pkg/rust_wasm_bg.wasm?"); |
||||
|
|
||||
|
/***/ }), |
||||
|
|
||||
|
/***/ "./index.js": |
||||
|
/*!******************!*\ |
||||
|
!*** ./index.js ***! |
||||
|
\******************/ |
||||
|
/*! no exports provided */ |
||||
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
||||
|
|
||||
|
"use strict"; |
||||
|
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var rust_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rust-wasm */ \"../pkg/rust_wasm.js\");\n/* harmony import */ var rust_wasm_rust_wasm_bg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! rust-wasm/rust_wasm_bg */ \"../pkg/rust_wasm_bg.wasm\");\n\n\n\nconst CELL_SIZE = 5; // px\nconst GRID_COLOR = \"#CCCCCC\";\nconst COLOURS = [\"#FFF\", \"#FF8\", \"#FF0\", \"#F80\", \"#F00\", \"#800\", \"#000\"];\n\n// Construct the universe, and get its width and height.\nconst universe = rust_wasm__WEBPACK_IMPORTED_MODULE_0__[\"Universe\"].new();\nuniverse.init();\nconst width = universe.width();\nconst height = universe.height();\n\n// Give the canvas room for all of our cells and a 1px border\n// around each of them.\nconst infochaos = document.getElementById(\"chaos\");\nconst infomax = document.getElementById(\"max\");\nconst infoavg = document.getElementById(\"avg\");\nvar maxstress = 0;\nvar avgstress = 31000;\nconst canvas = document.getElementById(\"game-of-life-canvas\");\ncanvas.height = (CELL_SIZE) * height;\ncanvas.width = (CELL_SIZE) * width;\n\nconst ctx = canvas.getContext('2d');\n\nconst renderLoop = () => {\n universe.tick();\n\n //drawGrid();\n drawCells();\n\n const st = universe.stress();\n if (st > maxstress) maxstress = st;\n avgstress = 0.999 * avgstress + 0.001 * st\n infochaos.innerHTML = st;\n infomax.innerHTML = maxstress;\n infoavg.innerHTML = Math.round(avgstress);\n\n // setTimeout(renderLoop, 200);\n requestAnimationFrame(renderLoop);\n};\n\n// setTimeout(renderLoop, 1);\nrequestAnimationFrame(renderLoop);\n\nconst drawGrid = () => {\n ctx.beginPath();\n ctx.strokeStyle = GRID_COLOR;\n\n // Vertical lines.\n for (let i = 0; i <= width; i++) {\n ctx.moveTo(i * (CELL_SIZE + 1) + 1, 0);\n ctx.lineTo(i * (CELL_SIZE + 1) + 1, (CELL_SIZE + 1) * height + 1);\n }\n\n // Horizontal lines.\n for (let j = 0; j <= height; j++) {\n ctx.moveTo(0, j * (CELL_SIZE + 1) + 1);\n ctx.lineTo((CELL_SIZE + 1) * width + 1, j * (CELL_SIZE + 1) + 1);\n }\n\n ctx.stroke();\n};\n\nconst getIndex = (row, column) => {\n return row * width + column;\n};\n\nconst drawCells = () => {\n const cellsPtr = universe.cells();\n const cells = new Uint8Array(rust_wasm_rust_wasm_bg__WEBPACK_IMPORTED_MODULE_1__[\"memory\"].buffer, cellsPtr, width * height);\n\n ctx.beginPath();\n\n for (let row = 0; row < height; row++) {\n for (let col = 0; col < width; col++) {\n const idx = getIndex(row, col);\n const rat = Math.round(COLOURS.length * cells[idx] / 101);\n const colour = COLOURS[rat];\n\n ctx.fillStyle = colour;\n\n ctx.fillRect(\n col * (CELL_SIZE),\n row * (CELL_SIZE),\n CELL_SIZE,\n CELL_SIZE\n );\n }\n }\n\n ctx.stroke();\n};\n\n\n//# sourceURL=webpack:///./index.js?"); |
||||
|
|
||||
|
/***/ }), |
||||
|
|
||||
|
/***/ "./node_modules/webpack/buildin/harmony-module.js": |
||||
|
/*!*******************************************!*\ |
||||
|
!*** (webpack)/buildin/harmony-module.js ***! |
||||
|
\*******************************************/ |
||||
|
/*! no static exports found */ |
||||
|
/***/ (function(module, exports) { |
||||
|
|
||||
|
eval("module.exports = function(originalModule) {\n\tif (!originalModule.webpackPolyfill) {\n\t\tvar module = Object.create(originalModule);\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"exports\", {\n\t\t\tenumerable: true\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n\n\n//# sourceURL=webpack:///(webpack)/buildin/harmony-module.js?"); |
||||
|
|
||||
|
/***/ }) |
||||
|
|
||||
|
}]); |
@ -0,0 +1,270 @@ |
|||||
|
/******/ (function(modules) { // webpackBootstrap
|
||||
|
/******/ // install a JSONP callback for chunk loading
|
||||
|
/******/ function webpackJsonpCallback(data) { |
||||
|
/******/ var chunkIds = data[0]; |
||||
|
/******/ var moreModules = data[1]; |
||||
|
/******/ |
||||
|
/******/ |
||||
|
/******/ // add "moreModules" to the modules object,
|
||||
|
/******/ // then flag all "chunkIds" as loaded and fire callback
|
||||
|
/******/ var moduleId, chunkId, i = 0, resolves = []; |
||||
|
/******/ for(;i < chunkIds.length; i++) { |
||||
|
/******/ chunkId = chunkIds[i]; |
||||
|
/******/ if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) { |
||||
|
/******/ resolves.push(installedChunks[chunkId][0]); |
||||
|
/******/ } |
||||
|
/******/ installedChunks[chunkId] = 0; |
||||
|
/******/ } |
||||
|
/******/ for(moduleId in moreModules) { |
||||
|
/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { |
||||
|
/******/ modules[moduleId] = moreModules[moduleId]; |
||||
|
/******/ } |
||||
|
/******/ } |
||||
|
/******/ if(parentJsonpFunction) parentJsonpFunction(data); |
||||
|
/******/ |
||||
|
/******/ while(resolves.length) { |
||||
|
/******/ resolves.shift()(); |
||||
|
/******/ } |
||||
|
/******/ |
||||
|
/******/ }; |
||||
|
/******/ |
||||
|
/******/ |
||||
|
/******/ // The module cache
|
||||
|
/******/ var installedModules = {}; |
||||
|
/******/ |
||||
|
/******/ // object to store loaded and loading chunks
|
||||
|
/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
|
||||
|
/******/ // Promise = chunk loading, 0 = chunk loaded
|
||||
|
/******/ var installedChunks = { |
||||
|
/******/ "main": 0 |
||||
|
/******/ }; |
||||
|
/******/ |
||||
|
/******/ |
||||
|
/******/ |
||||
|
/******/ // script path function
|
||||
|
/******/ function jsonpScriptSrc(chunkId) { |
||||
|
/******/ return __webpack_require__.p + "" + chunkId + ".bootstrap.js" |
||||
|
/******/ } |
||||
|
/******/ |
||||
|
/******/ // object to store loaded and loading wasm modules
|
||||
|
/******/ var installedWasmModules = {}; |
||||
|
/******/ |
||||
|
/******/ function promiseResolve() { return Promise.resolve(); } |
||||
|
/******/ |
||||
|
/******/ var wasmImportObjects = { |
||||
|
/******/ "../pkg/rust_wasm_bg.wasm": function() { |
||||
|
/******/ return { |
||||
|
/******/ "./rust_wasm_bg.js": { |
||||
|
/******/ "__wbg_random_a3b3bcffa2ed629c": function() { |
||||
|
/******/ return installedModules["../pkg/rust_wasm_bg.js"].exports["__wbg_random_a3b3bcffa2ed629c"](); |
||||
|
/******/ }, |
||||
|
/******/ "__wbindgen_throw": function(p0i32,p1i32) { |
||||
|
/******/ return installedModules["../pkg/rust_wasm_bg.js"].exports["__wbindgen_throw"](p0i32,p1i32); |
||||
|
/******/ } |
||||
|
/******/ } |
||||
|
/******/ }; |
||||
|
/******/ }, |
||||
|
/******/ }; |
||||
|
/******/ |
||||
|
/******/ // The require function
|
||||
|
/******/ function __webpack_require__(moduleId) { |
||||
|
/******/ |
||||
|
/******/ // Check if module is in cache
|
||||
|
/******/ if(installedModules[moduleId]) { |
||||
|
/******/ return installedModules[moduleId].exports; |
||||
|
/******/ } |
||||
|
/******/ // Create a new module (and put it into the cache)
|
||||
|
/******/ var module = installedModules[moduleId] = { |
||||
|
/******/ i: moduleId, |
||||
|
/******/ l: false, |
||||
|
/******/ exports: {} |
||||
|
/******/ }; |
||||
|
/******/ |
||||
|
/******/ // Execute the module function
|
||||
|
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); |
||||
|
/******/ |
||||
|
/******/ // Flag the module as loaded
|
||||
|
/******/ module.l = true; |
||||
|
/******/ |
||||
|
/******/ // Return the exports of the module
|
||||
|
/******/ return module.exports; |
||||
|
/******/ } |
||||
|
/******/ |
||||
|
/******/ // This file contains only the entry chunk.
|
||||
|
/******/ // The chunk loading function for additional chunks
|
||||
|
/******/ __webpack_require__.e = function requireEnsure(chunkId) { |
||||
|
/******/ var promises = []; |
||||
|
/******/ |
||||
|
/******/ |
||||
|
/******/ // JSONP chunk loading for javascript
|
||||
|
/******/ |
||||
|
/******/ var installedChunkData = installedChunks[chunkId]; |
||||
|
/******/ if(installedChunkData !== 0) { // 0 means "already installed".
|
||||
|
/******/ |
||||
|
/******/ // a Promise means "currently loading".
|
||||
|
/******/ if(installedChunkData) { |
||||
|
/******/ promises.push(installedChunkData[2]); |
||||
|
/******/ } else { |
||||
|
/******/ // setup Promise in chunk cache
|
||||
|
/******/ var promise = new Promise(function(resolve, reject) { |
||||
|
/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; |
||||
|
/******/ }); |
||||
|
/******/ promises.push(installedChunkData[2] = promise); |
||||
|
/******/ |
||||
|
/******/ // start chunk loading
|
||||
|
/******/ var script = document.createElement('script'); |
||||
|
/******/ var onScriptComplete; |
||||
|
/******/ |
||||
|
/******/ script.charset = 'utf-8'; |
||||
|
/******/ script.timeout = 120; |
||||
|
/******/ if (__webpack_require__.nc) { |
||||
|
/******/ script.setAttribute("nonce", __webpack_require__.nc); |
||||
|
/******/ } |
||||
|
/******/ script.src = jsonpScriptSrc(chunkId); |
||||
|
/******/ |
||||
|
/******/ // create error before stack unwound to get useful stacktrace later
|
||||
|
/******/ var error = new Error(); |
||||
|
/******/ onScriptComplete = function (event) { |
||||
|
/******/ // avoid mem leaks in IE.
|
||||
|
/******/ script.onerror = script.onload = null; |
||||
|
/******/ clearTimeout(timeout); |
||||
|
/******/ var chunk = installedChunks[chunkId]; |
||||
|
/******/ if(chunk !== 0) { |
||||
|
/******/ if(chunk) { |
||||
|
/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); |
||||
|
/******/ var realSrc = event && event.target && event.target.src; |
||||
|
/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; |
||||
|
/******/ error.name = 'ChunkLoadError'; |
||||
|
/******/ error.type = errorType; |
||||
|
/******/ error.request = realSrc; |
||||
|
/******/ chunk[1](error); |
||||
|
/******/ } |
||||
|
/******/ installedChunks[chunkId] = undefined; |
||||
|
/******/ } |
||||
|
/******/ }; |
||||
|
/******/ var timeout = setTimeout(function(){ |
||||
|
/******/ onScriptComplete({ type: 'timeout', target: script }); |
||||
|
/******/ }, 120000); |
||||
|
/******/ script.onerror = script.onload = onScriptComplete; |
||||
|
/******/ document.head.appendChild(script); |
||||
|
/******/ } |
||||
|
/******/ } |
||||
|
/******/ |
||||
|
/******/ // Fetch + compile chunk loading for webassembly
|
||||
|
/******/ |
||||
|
/******/ var wasmModules = {"0":["../pkg/rust_wasm_bg.wasm"]}[chunkId] || []; |
||||
|
/******/ |
||||
|
/******/ wasmModules.forEach(function(wasmModuleId) { |
||||
|
/******/ var installedWasmModuleData = installedWasmModules[wasmModuleId]; |
||||
|
/******/ |
||||
|
/******/ // a Promise means "currently loading" or "already loaded".
|
||||
|
/******/ if(installedWasmModuleData) |
||||
|
/******/ promises.push(installedWasmModuleData); |
||||
|
/******/ else { |
||||
|
/******/ var importObject = wasmImportObjects[wasmModuleId](); |
||||
|
/******/ var req = fetch(__webpack_require__.p + "" + {"../pkg/rust_wasm_bg.wasm":"512e9878aaa7c8600613"}[wasmModuleId] + ".module.wasm"); |
||||
|
/******/ var promise; |
||||
|
/******/ if(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') { |
||||
|
/******/ promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) { |
||||
|
/******/ return WebAssembly.instantiate(items[0], items[1]); |
||||
|
/******/ }); |
||||
|
/******/ } else if(typeof WebAssembly.instantiateStreaming === 'function') { |
||||
|
/******/ promise = WebAssembly.instantiateStreaming(req, importObject); |
||||
|
/******/ } else { |
||||
|
/******/ var bytesPromise = req.then(function(x) { return x.arrayBuffer(); }); |
||||
|
/******/ promise = bytesPromise.then(function(bytes) { |
||||
|
/******/ return WebAssembly.instantiate(bytes, importObject); |
||||
|
/******/ }); |
||||
|
/******/ } |
||||
|
/******/ promises.push(installedWasmModules[wasmModuleId] = promise.then(function(res) { |
||||
|
/******/ return __webpack_require__.w[wasmModuleId] = (res.instance || res).exports; |
||||
|
/******/ })); |
||||
|
/******/ } |
||||
|
/******/ }); |
||||
|
/******/ return Promise.all(promises); |
||||
|
/******/ }; |
||||
|
/******/ |
||||
|
/******/ // expose the modules object (__webpack_modules__)
|
||||
|
/******/ __webpack_require__.m = modules; |
||||
|
/******/ |
||||
|
/******/ // expose the module cache
|
||||
|
/******/ __webpack_require__.c = installedModules; |
||||
|
/******/ |
||||
|
/******/ // define getter function for harmony exports
|
||||
|
/******/ __webpack_require__.d = function(exports, name, getter) { |
||||
|
/******/ if(!__webpack_require__.o(exports, name)) { |
||||
|
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); |
||||
|
/******/ } |
||||
|
/******/ }; |
||||
|
/******/ |
||||
|
/******/ // define __esModule on exports
|
||||
|
/******/ __webpack_require__.r = function(exports) { |
||||
|
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { |
||||
|
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); |
||||
|
/******/ } |
||||
|
/******/ Object.defineProperty(exports, '__esModule', { value: true }); |
||||
|
/******/ }; |
||||
|
/******/ |
||||
|
/******/ // create a fake namespace object
|
||||
|
/******/ // mode & 1: value is a module id, require it
|
||||
|
/******/ // mode & 2: merge all properties of value into the ns
|
||||
|
/******/ // mode & 4: return value when already ns object
|
||||
|
/******/ // mode & 8|1: behave like require
|
||||
|
/******/ __webpack_require__.t = function(value, mode) { |
||||
|
/******/ if(mode & 1) value = __webpack_require__(value); |
||||
|
/******/ if(mode & 8) return value; |
||||
|
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; |
||||
|
/******/ var ns = Object.create(null); |
||||
|
/******/ __webpack_require__.r(ns); |
||||
|
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); |
||||
|
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); |
||||
|
/******/ return ns; |
||||
|
/******/ }; |
||||
|
/******/ |
||||
|
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
||||
|
/******/ __webpack_require__.n = function(module) { |
||||
|
/******/ var getter = module && module.__esModule ? |
||||
|
/******/ function getDefault() { return module['default']; } : |
||||
|
/******/ function getModuleExports() { return module; }; |
||||
|
/******/ __webpack_require__.d(getter, 'a', getter); |
||||
|
/******/ return getter; |
||||
|
/******/ }; |
||||
|
/******/ |
||||
|
/******/ // Object.prototype.hasOwnProperty.call
|
||||
|
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; |
||||
|
/******/ |
||||
|
/******/ // __webpack_public_path__
|
||||
|
/******/ __webpack_require__.p = ""; |
||||
|
/******/ |
||||
|
/******/ // on error function for async loading
|
||||
|
/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; |
||||
|
/******/ |
||||
|
/******/ // object with all WebAssembly.instance exports
|
||||
|
/******/ __webpack_require__.w = {}; |
||||
|
/******/ |
||||
|
/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; |
||||
|
/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); |
||||
|
/******/ jsonpArray.push = webpackJsonpCallback; |
||||
|
/******/ jsonpArray = jsonpArray.slice(); |
||||
|
/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); |
||||
|
/******/ var parentJsonpFunction = oldJsonpFunction; |
||||
|
/******/ |
||||
|
/******/ |
||||
|
/******/ // Load entry module and return exports
|
||||
|
/******/ return __webpack_require__(__webpack_require__.s = "./bootstrap.js"); |
||||
|
/******/ }) |
||||
|
/************************************************************************/ |
||||
|
/******/ ({ |
||||
|
|
||||
|
/***/ "./bootstrap.js": |
||||
|
/*!**********************!*\ |
||||
|
!*** ./bootstrap.js ***! |
||||
|
\**********************/ |
||||
|
/*! no static exports found */ |
||||
|
/***/ (function(module, exports, __webpack_require__) { |
||||
|
|
||||
|
eval("// A dependency graph that contains any wasm must all be imported\n// asynchronously. This `bootstrap.js` file does the single async import, so\n// that no one else needs to worry about it again.\n__webpack_require__.e(/*! import() */ 0).then(__webpack_require__.bind(null, /*! ./index.js */ \"./index.js\"))\n .catch(e => console.error(\"Error importing `index.js`:\", e));\n\n\n//# sourceURL=webpack:///./bootstrap.js?"); |
||||
|
|
||||
|
/***/ }) |
||||
|
|
||||
|
/******/ }); |
@ -0,0 +1,29 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html> |
||||
|
<head> |
||||
|
<meta charset="utf-8"> |
||||
|
<title>Rust Animation</title> |
||||
|
<style> |
||||
|
body { |
||||
|
position: absolute; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
} |
||||
|
</style> |
||||
|
</head> |
||||
|
<body> |
||||
|
<canvas id="game-of-life-canvas"></canvas> |
||||
|
<div style="text-align: center;">chaos: <span id="chaos"></span>, max: <span id="max"></span>, mv avg: <span id="avg"></span></div> |
||||
|
|
||||
|
<noscript>This page contains webassembly and javascript content, please enable javascript in your browser.</noscript> |
||||
|
<script src="./bootstrap.js"></script> |
||||
|
|
||||
|
<div style="padding:20px; color:#888">Copyright Joshua Moerman 2020 (git commit af5a529)</div> |
||||
|
</body> |
||||
|
</html> |