├── .babelrc ├── .gitignore ├── .gitmodules ├── .jshintrc ├── .travis.yml ├── LICENSE ├── Makefile ├── README.md ├── __mocks__ ├── fastclick.js ├── lab-grapher.js ├── labquest2-interface.js ├── sensor-applet.js └── sensor-connector-interface.js ├── config └── s3_website.yml ├── developer-doc ├── configuration.md ├── deployment.md ├── fonts.md ├── java.md ├── linux-notes.md ├── localization.md ├── physical-constants-and-units.md ├── references.md ├── repository-structure.md ├── setup-node.md ├── setup-ruby.md └── website.md ├── node-bin ├── convert-e2d ├── convert-mml ├── convert-mml-files ├── create-mml-html-index ├── gen-lab-json ├── gen-lab-version ├── hex-to-lab-color ├── run-md2d └── update-expected-json ├── package-lock.json ├── package.json ├── script ├── archive-public.sh ├── create-archived-public-dir.sh ├── create-interactive.rb ├── create-symbolic-links-to-archives.rb └── s3-deploy.sh ├── src ├── embeddable.html ├── embeddable.js ├── embeddable.sass ├── favicon.ico ├── grapher.sass ├── helpers │ ├── energy2d │ │ ├── e2d-node-api.js │ │ └── e2d-parser.js │ ├── md2d │ │ ├── aminoacids-props-converter.js │ │ ├── md2d-node-api.js │ │ ├── mw-batch-converter.js │ │ └── post-batch-processor.rb │ └── node-setup.js ├── index.html ├── index.sass ├── interactives │ ├── act2model.json │ ├── amino-acids.json │ ├── chemical-reaction.json │ ├── energy2d.json │ ├── jsmol-two-molecules.json │ ├── not-found.html │ ├── oil-and-water.json │ ├── pendulum.json │ ├── sensor.json │ └── sun-on-ground.json ├── lab-fonts.sass ├── lab.sass ├── lab │ ├── arrays.js │ ├── common │ │ ├── alert.js │ │ ├── array-types.js │ │ ├── benchmark │ │ │ ├── benchmark.js │ │ │ └── browser-detect.js │ │ ├── console.js │ │ ├── controllers │ │ │ ├── __mocks__ │ │ │ │ ├── language-select.js │ │ │ │ └── playback-controller.js │ │ │ ├── about-dialog.js │ │ │ ├── bar-graph-controller.js │ │ │ ├── basic-dialog.js │ │ │ ├── button-controller.js │ │ │ ├── checkbox-controller.js │ │ │ ├── color-indicator-controller.js │ │ │ ├── copyright.js │ │ │ ├── credits-dialog.js │ │ │ ├── credits-dialog.tpl │ │ │ ├── data-set.js │ │ │ ├── disablable.js │ │ │ ├── div-controller.js │ │ │ ├── experiment-controller.js │ │ │ ├── export-controller.js │ │ │ ├── graph-controller.js │ │ │ ├── help-icon-support.js │ │ │ ├── help-system.js │ │ │ ├── image-controller.js │ │ │ ├── interactive-component.js │ │ │ ├── interactive-metadata.js │ │ │ ├── interactives-controller.js │ │ │ ├── joystick-controller.js │ │ │ ├── language-select.js │ │ │ ├── log-controller.js │ │ │ ├── model-controller.js │ │ │ ├── numeric-output-controller.js │ │ │ ├── parent-message-api.js │ │ │ ├── playback-controller.js │ │ │ ├── pulldown-controller.js │ │ │ ├── radio-controller.js │ │ │ ├── scripting-api.js │ │ │ ├── setup-banner.js │ │ │ ├── share-dialog.js │ │ │ ├── share-dialog.tpl │ │ │ ├── slider-controller.js │ │ │ ├── spectrometer-controller.js │ │ │ ├── table-controller.js │ │ │ ├── text-controller.js │ │ │ ├── thermometer-controller.js │ │ │ └── thermometer.tpl │ │ ├── cookies.js │ │ ├── define-builtin-properties.js │ │ ├── dispatch-support.js │ │ ├── feature-tests.js │ │ ├── filters │ │ │ ├── running-average-filter.js │ │ │ └── simple-period-filter.js │ │ ├── i18n.js │ │ ├── inherit.js │ │ ├── jquery-plugins.js │ │ ├── jquery-svg-class.js │ │ ├── lab-modeler-mixin.js │ │ ├── layout │ │ │ ├── detect-font-change.js │ │ │ ├── semantic-layout-config.js │ │ │ ├── semantic-layout.js │ │ │ ├── templates.js │ │ │ └── wrap-svg-text.js │ │ ├── listening-pool.js │ │ ├── markdown-to-html.js │ │ ├── mini-class.js │ │ ├── models │ │ │ ├── dataset.js │ │ │ ├── engines │ │ │ │ └── clone-restore-wrapper.js │ │ │ ├── plugin-controller.js │ │ │ ├── property-transition.js │ │ │ └── tick-history.js │ │ ├── output-support.js │ │ ├── parameter-support.js │ │ ├── performance.js │ │ ├── playback-support.js │ │ ├── property-description.js │ │ ├── property-support.js │ │ ├── resources-url.js │ │ ├── serialize.js │ │ ├── state-machine.js │ │ ├── url-helper.js │ │ ├── validator.js │ │ └── views │ │ │ ├── __mocks__ │ │ │ ├── numeric-output-view.js │ │ │ └── svg-container.js │ │ │ ├── color.js │ │ │ ├── gradients.js │ │ │ ├── hit-testing-helper.js │ │ │ ├── null-model-view.js │ │ │ ├── numeric-output-view.js │ │ │ ├── select-box-view.js │ │ │ ├── state-manager.js │ │ │ ├── svg-container.js │ │ │ ├── tab-index.js │ │ │ ├── table-view.js │ │ │ ├── tooltip.js │ │ │ └── view-state.js │ ├── grapher │ │ ├── bar-graph │ │ │ ├── __mocks__ │ │ │ │ └── bar-graph-view.js │ │ │ ├── bar-graph-model.js │ │ │ └── bar-graph-view.js │ │ └── index.js │ ├── import-export │ │ ├── __mocks__ │ │ │ └── codap-interface.js │ │ ├── codap-interface.js │ │ └── netlogo-importer.js │ ├── index.js │ ├── lab.config.js │ ├── locales │ │ └── translations.json │ ├── mml-converter │ │ ├── index.js │ │ └── mml-converter.js │ ├── models │ │ ├── dual-sensor-connector │ │ │ ├── controller.js │ │ │ ├── metadata.js │ │ │ ├── modeler.js │ │ │ ├── scripting-api.js │ │ │ ├── units-definition.js │ │ │ └── view.js │ │ ├── dual-sensor │ │ │ ├── controller.js │ │ │ ├── metadata.js │ │ │ ├── modeler.js │ │ │ ├── scripting-api.js │ │ │ └── view.js │ │ ├── energy2d │ │ │ ├── benchmarks │ │ │ │ └── benchmarks.js │ │ │ ├── controllers │ │ │ │ ├── controller.js │ │ │ │ └── scripting-api.js │ │ │ ├── gpu │ │ │ │ ├── context.js │ │ │ │ ├── gpgpu.js │ │ │ │ ├── mesh.js │ │ │ │ ├── shader.js │ │ │ │ └── texture.js │ │ │ ├── metadata.js │ │ │ ├── modeler.js │ │ │ ├── models │ │ │ │ ├── constants.js │ │ │ │ ├── core-model.js │ │ │ │ ├── helpers.js │ │ │ │ ├── part.js │ │ │ │ ├── photon.js │ │ │ │ ├── physics-solvers-gpu │ │ │ │ │ ├── fluid-solver-glsl │ │ │ │ │ │ ├── apply-buoyancy.fs.glsl │ │ │ │ │ │ ├── apply-u0v0-boundary.fs.glsl │ │ │ │ │ │ ├── apply-uv-boundary.fs.glsl │ │ │ │ │ │ ├── basic.vs.glsl │ │ │ │ │ │ ├── conserve-step1.fs.glsl │ │ │ │ │ │ ├── conserve-step2.fs.glsl │ │ │ │ │ │ ├── conserve-step3.fs.glsl │ │ │ │ │ │ ├── diffuse.fs.glsl │ │ │ │ │ │ ├── maccormack-step1.fs.glsl │ │ │ │ │ │ ├── maccormack-step2.fs.glsl │ │ │ │ │ │ ├── set-obstacle-boundary.fs.glsl │ │ │ │ │ │ ├── set-obstacle-velocity.fs.glsl │ │ │ │ │ │ └── uv-to-u0v0.fs.glsl │ │ │ │ │ ├── fluid-solver-gpu.js │ │ │ │ │ ├── heat-solver-glsl │ │ │ │ │ │ ├── basic.vs.glsl │ │ │ │ │ │ ├── force-flux-t.fs.glsl │ │ │ │ │ │ ├── force-flux-t0.fs.glsl │ │ │ │ │ │ ├── maccormack-step1.fs.glsl │ │ │ │ │ │ ├── maccormack-step2.fs.glsl │ │ │ │ │ │ ├── solver.fs.glsl │ │ │ │ │ │ └── t-to-t0.fs.glsl │ │ │ │ │ └── heat-solver-gpu.js │ │ │ │ ├── physics-solvers │ │ │ │ │ ├── fluid-solver.js │ │ │ │ │ ├── heat-solver.js │ │ │ │ │ └── ray-solver.js │ │ │ │ └── shape.js │ │ │ ├── utils │ │ │ │ └── performance-monitor.js │ │ │ └── views │ │ │ │ ├── color-palette.js │ │ │ │ ├── description.js │ │ │ │ ├── heatmap-webgl-glsl │ │ │ │ ├── basic.vs.glsl │ │ │ │ └── temp-renderer.fs.glsl │ │ │ │ ├── heatmap-webgl.js │ │ │ │ ├── heatmap.js │ │ │ │ ├── helpers.js │ │ │ │ ├── parts.js │ │ │ │ ├── performance.js │ │ │ │ ├── photons.js │ │ │ │ ├── player.js │ │ │ │ ├── renderer.js │ │ │ │ ├── sensors.js │ │ │ │ ├── time.js │ │ │ │ ├── vectormap-webgl-glsl │ │ │ │ ├── vectormap.fs.glsl │ │ │ │ └── vectormap.vs.glsl │ │ │ │ ├── vectormap-webgl.js │ │ │ │ ├── vectormap.js │ │ │ │ ├── view.js │ │ │ │ └── webgl-status.js │ │ ├── iframe │ │ │ ├── controller.js │ │ │ ├── iframe-container.js │ │ │ ├── metadata.js │ │ │ ├── modeler.js │ │ │ └── scripting-api.js │ │ ├── labquest2 │ │ │ ├── controller.js │ │ │ ├── metadata.js │ │ │ ├── modeler.js │ │ │ ├── scripting-api.js │ │ │ ├── units-definition.js │ │ │ └── view.js │ │ ├── md2d │ │ │ ├── benchmarks │ │ │ │ └── benchmarks.js │ │ │ ├── controllers │ │ │ │ ├── controller.js │ │ │ │ └── scripting-api.js │ │ │ ├── models │ │ │ │ ├── aminoacids-helper.js │ │ │ │ ├── aminoacids-props.js │ │ │ │ ├── atom-transition.js │ │ │ │ ├── engine │ │ │ │ │ ├── cell-list.js │ │ │ │ │ ├── constants │ │ │ │ │ │ ├── constants.txt │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── units.js │ │ │ │ │ ├── genetic-engine.js │ │ │ │ │ ├── math │ │ │ │ │ │ ├── distributions.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── minimizer.js │ │ │ │ │ │ └── utils.js │ │ │ │ │ ├── md2d.js │ │ │ │ │ ├── neighbor-list.js │ │ │ │ │ ├── pairwise-lj-properties.js │ │ │ │ │ ├── plugins │ │ │ │ │ │ ├── chemical-reactions.js │ │ │ │ │ │ └── quantum-dynamics.js │ │ │ │ │ ├── potentials │ │ │ │ │ │ ├── coulomb.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── lennard-jones.js │ │ │ │ │ └── utils.js │ │ │ │ ├── metadata.js │ │ │ │ ├── modeler.js │ │ │ │ ├── performance-optimizer.js │ │ │ │ ├── solvent.js │ │ │ │ ├── unit-definitions │ │ │ │ │ ├── index.js │ │ │ │ │ ├── md2d.js │ │ │ │ │ └── mks.js │ │ │ │ └── units-translation.js │ │ │ └── views │ │ │ │ ├── __mocks__ │ │ │ │ └── renderer.js │ │ │ │ ├── aminoacid-context-menu.js │ │ │ │ ├── applet-container.js │ │ │ │ ├── atoms-interactions.js │ │ │ │ ├── atoms-renderer.js │ │ │ │ ├── bonds-renderer.js │ │ │ │ ├── dna-edit-dialog.js │ │ │ │ ├── field-renderer.js │ │ │ │ ├── genetic-anim-states.js │ │ │ │ ├── genetic-elements-renderer.js │ │ │ │ ├── genetic-renderer.js │ │ │ │ ├── images-renderer.js │ │ │ │ ├── mutations-context-menu.js │ │ │ │ ├── nucleotide-paths.js │ │ │ │ ├── nucleotides.js │ │ │ │ ├── renderer.js │ │ │ │ ├── vdw-lines-renderer.js │ │ │ │ ├── vectors-renderer.js │ │ │ │ └── view.js │ │ ├── sensor-common │ │ │ ├── i18n-sensor-definitions-connector.js │ │ │ ├── i18n-sensor-definitions.js │ │ │ └── notifier.js │ │ ├── sensor-connector │ │ │ ├── controller.js │ │ │ ├── metadata.js │ │ │ ├── modeler.js │ │ │ ├── scripting-api.js │ │ │ ├── units-definition.js │ │ │ └── view.js │ │ ├── sensor │ │ │ ├── controller.js │ │ │ ├── metadata.js │ │ │ ├── modeler.js │ │ │ ├── scripting-api.js │ │ │ └── view.js │ │ └── signal-generator │ │ │ ├── controller.js │ │ │ ├── metadata.js │ │ │ └── modeler.js │ └── resources │ │ ├── aspect-ratio-1x1.png │ │ ├── back.png │ │ ├── col.svg │ │ ├── diagonal-lines.jpg │ │ ├── dna-cbio │ │ ├── A-to-C.svg │ │ ├── A-to-G.svg │ │ ├── A-to-T.svg │ │ ├── A.svg │ │ ├── BG_Nucleus.svg │ │ ├── Backbone_DNA.svg │ │ ├── Backbone_RNA.svg │ │ ├── C-to-A.svg │ │ ├── C-to-G.svg │ │ ├── C-to-T.svg │ │ ├── C.svg │ │ ├── Cells.svg │ │ ├── DNA_InsideNucleus_1.svg │ │ ├── DNA_InsideNucleus_2.svg │ │ ├── DoubleHelix_Unit.svg │ │ ├── G-to-A.svg │ │ ├── G-to-C.svg │ │ ├── G-to-T.svg │ │ ├── G.svg │ │ ├── NucleotideA_Direction1_noBonds.svg │ │ ├── NucleotideA_Direction2_noBonds.svg │ │ ├── NucleotideC_Direction1_noBonds.svg │ │ ├── NucleotideC_Direction2_noBonds.svg │ │ ├── NucleotideG_Direction1_noBonds.svg │ │ ├── NucleotideG_Direction2_noBonds.svg │ │ ├── NucleotideGlow_A.svg │ │ ├── NucleotideGlow_C.svg │ │ ├── NucleotideGlow_G.svg │ │ ├── NucleotideGlow_T.svg │ │ ├── NucleotideT_Direction1_noBonds.svg │ │ ├── NucleotideT_Direction2_noBonds.svg │ │ ├── NucleotideU_Direction1_noBonds.svg │ │ ├── NucleotideU_Direction2_noBonds.svg │ │ ├── Polymerase_Over.svg │ │ ├── Polymerase_Under.svg │ │ ├── Ribosome_bottom1.svg │ │ ├── Ribosome_over.png │ │ ├── Ribosome_over.svg │ │ ├── Ribosome_top1.svg │ │ ├── Ribosome_under.png │ │ ├── Ribosome_under.svg │ │ ├── T-to-A.svg │ │ ├── T-to-C.svg │ │ ├── T-to-G.svg │ │ ├── T.svg │ │ ├── tRNA_base.png │ │ ├── tRNA_base.svg │ │ ├── tRNA_neck.png │ │ └── tRNA_neck.svg │ │ ├── dna │ │ ├── A-to-C.svg │ │ ├── A-to-G.svg │ │ ├── A-to-T.svg │ │ ├── A.svg │ │ ├── BG_Nucleus.svg │ │ ├── Backbone_DNA.svg │ │ ├── Backbone_RNA.svg │ │ ├── C-to-A.svg │ │ ├── C-to-G.svg │ │ ├── C-to-T.svg │ │ ├── C.svg │ │ ├── Cells.svg │ │ ├── DNA_InsideNucleus_1.svg │ │ ├── DNA_InsideNucleus_2.svg │ │ ├── DoubleHelix_Unit.svg │ │ ├── G-to-A.svg │ │ ├── G-to-C.svg │ │ ├── G-to-T.svg │ │ ├── G.svg │ │ ├── NucleotideA_Direction1_noBonds.svg │ │ ├── NucleotideA_Direction2_noBonds.svg │ │ ├── NucleotideC_Direction1_noBonds.svg │ │ ├── NucleotideC_Direction2_noBonds.svg │ │ ├── NucleotideG_Direction1_noBonds.svg │ │ ├── NucleotideG_Direction2_noBonds.svg │ │ ├── NucleotideGlow_A.svg │ │ ├── NucleotideGlow_C.svg │ │ ├── NucleotideGlow_G.svg │ │ ├── NucleotideGlow_T.svg │ │ ├── NucleotideT_Direction1_noBonds.svg │ │ ├── NucleotideT_Direction2_noBonds.svg │ │ ├── NucleotideU_Direction1_noBonds.svg │ │ ├── NucleotideU_Direction2_noBonds.svg │ │ ├── Polymerase_Over.svg │ │ ├── Polymerase_Under.svg │ │ ├── Ribosome_bottom1.svg │ │ ├── Ribosome_over.png │ │ ├── Ribosome_over.svg │ │ ├── Ribosome_top1.svg │ │ ├── Ribosome_under.png │ │ ├── Ribosome_under.svg │ │ ├── T-to-A.svg │ │ ├── T-to-C.svg │ │ ├── T-to-G.svg │ │ ├── T.svg │ │ ├── tRNA_base.png │ │ ├── tRNA_base.svg │ │ ├── tRNA_neck.png │ │ └── tRNA_neck.svg │ │ ├── down.png │ │ ├── exp.svg │ │ ├── flags │ │ ├── ad.png │ │ ├── ae.png │ │ ├── af.png │ │ ├── ag.png │ │ ├── ai.png │ │ ├── al.png │ │ ├── am.png │ │ ├── ao.png │ │ ├── aq.png │ │ ├── ar.png │ │ ├── as.png │ │ ├── at.png │ │ ├── au.png │ │ ├── aw.png │ │ ├── ax.png │ │ ├── az.png │ │ ├── ba.png │ │ ├── bb.png │ │ ├── bd.png │ │ ├── be.png │ │ ├── bf.png │ │ ├── bg.png │ │ ├── bh.png │ │ ├── bi.png │ │ ├── bj.png │ │ ├── bl.png │ │ ├── bm.png │ │ ├── bn.png │ │ ├── bo.png │ │ ├── bq.png │ │ ├── br.png │ │ ├── bs.png │ │ ├── bt.png │ │ ├── bv.png │ │ ├── bw.png │ │ ├── by.png │ │ ├── bz.png │ │ ├── ca.png │ │ ├── cc.png │ │ ├── cd.png │ │ ├── cf.png │ │ ├── cg.png │ │ ├── ch.png │ │ ├── ci.png │ │ ├── ck.png │ │ ├── cl.png │ │ ├── cm.png │ │ ├── cn.png │ │ ├── co.png │ │ ├── cr.png │ │ ├── cu.png │ │ ├── cv.png │ │ ├── cw.png │ │ ├── cx.png │ │ ├── cy.png │ │ ├── cz.png │ │ ├── de.png │ │ ├── dj.png │ │ ├── dk.png │ │ ├── dm.png │ │ ├── do.png │ │ ├── dz.png │ │ ├── ec.png │ │ ├── ee.png │ │ ├── eg.png │ │ ├── eh.png │ │ ├── el.png │ │ ├── er.png │ │ ├── es.png │ │ ├── et.png │ │ ├── fi.png │ │ ├── fj.png │ │ ├── fk.png │ │ ├── fm.png │ │ ├── fo.png │ │ ├── fr.png │ │ ├── ga.png │ │ ├── gb.png │ │ ├── gd.png │ │ ├── ge.png │ │ ├── gf.png │ │ ├── gg.png │ │ ├── gh.png │ │ ├── gi.png │ │ ├── gl.png │ │ ├── gm.png │ │ ├── gn.png │ │ ├── gp.png │ │ ├── gq.png │ │ ├── gs.png │ │ ├── gt.png │ │ ├── gu.png │ │ ├── gw.png │ │ ├── gy.png │ │ ├── hk.png │ │ ├── hm.png │ │ ├── hn.png │ │ ├── hr.png │ │ ├── ht.png │ │ ├── hu.png │ │ ├── id.png │ │ ├── ie.png │ │ ├── il.png │ │ ├── im.png │ │ ├── in.png │ │ ├── index.html │ │ ├── io.png │ │ ├── iq.png │ │ ├── ir.png │ │ ├── is.png │ │ ├── it.png │ │ ├── je.png │ │ ├── jm.png │ │ ├── jo.png │ │ ├── jp.png │ │ ├── ke.png │ │ ├── kg.png │ │ ├── kh.png │ │ ├── ki.png │ │ ├── km.png │ │ ├── kn.png │ │ ├── kp.png │ │ ├── kr.png │ │ ├── kw.png │ │ ├── ky.png │ │ ├── kz.png │ │ ├── la.png │ │ ├── lb.png │ │ ├── lc.png │ │ ├── li.png │ │ ├── lk.png │ │ ├── lr.png │ │ ├── ls.png │ │ ├── lt.png │ │ ├── lu.png │ │ ├── lv.png │ │ ├── ly.png │ │ ├── ma.png │ │ ├── mc.png │ │ ├── md.png │ │ ├── me.png │ │ ├── mf.png │ │ ├── mg.png │ │ ├── mh.png │ │ ├── mk.png │ │ ├── ml.png │ │ ├── mm.png │ │ ├── mn.png │ │ ├── mo.png │ │ ├── mp.png │ │ ├── mq.png │ │ ├── mr.png │ │ ├── ms.png │ │ ├── mt.png │ │ ├── mu.png │ │ ├── mv.png │ │ ├── mw.png │ │ ├── mx.png │ │ ├── my.png │ │ ├── mz.png │ │ ├── na.png │ │ ├── nc.png │ │ ├── ne.png │ │ ├── nf.png │ │ ├── ng.png │ │ ├── ni.png │ │ ├── nl.png │ │ ├── no.png │ │ ├── np.png │ │ ├── nr.png │ │ ├── nu.png │ │ ├── nz.png │ │ ├── om.png │ │ ├── pa.png │ │ ├── pe.png │ │ ├── pf.png │ │ ├── pg.png │ │ ├── ph.png │ │ ├── pk.png │ │ ├── pl.png │ │ ├── pm.png │ │ ├── pn.png │ │ ├── pr.png │ │ ├── ps.png │ │ ├── pt-BR.png │ │ ├── pt.png │ │ ├── pw.png │ │ ├── py.png │ │ ├── qa.png │ │ ├── re.png │ │ ├── ro.png │ │ ├── rs.png │ │ ├── ru.png │ │ ├── rw.png │ │ ├── sa.png │ │ ├── sb.png │ │ ├── sc.png │ │ ├── sd.png │ │ ├── se.png │ │ ├── sg.png │ │ ├── sh.png │ │ ├── si.png │ │ ├── sj.png │ │ ├── sk.png │ │ ├── sl.png │ │ ├── sm.png │ │ ├── sn.png │ │ ├── so.png │ │ ├── sr.png │ │ ├── ss.png │ │ ├── st.png │ │ ├── sv.png │ │ ├── sx.png │ │ ├── sy.png │ │ ├── sz.png │ │ ├── tc.png │ │ ├── td.png │ │ ├── tf.png │ │ ├── tg.png │ │ ├── th.png │ │ ├── tj.png │ │ ├── tk.png │ │ ├── tl.png │ │ ├── tm.png │ │ ├── tn.png │ │ ├── to.png │ │ ├── tr.png │ │ ├── tt.png │ │ ├── tv.png │ │ ├── tw.png │ │ ├── tz.png │ │ ├── ua.png │ │ ├── ug.png │ │ ├── um.png │ │ ├── us.png │ │ ├── uy.png │ │ ├── uz.png │ │ ├── va.png │ │ ├── vc.png │ │ ├── ve.png │ │ ├── vg.png │ │ ├── vi.png │ │ ├── vn.png │ │ ├── vu.png │ │ ├── wf.png │ │ ├── ws.png │ │ ├── ye.png │ │ ├── yt.png │ │ ├── za.png │ │ ├── zh.png │ │ ├── zm.png │ │ ├── zw.png │ │ └── zz.png │ │ ├── forward.png │ │ ├── heatbath.gif │ │ ├── interactive-screenshot.jpg │ │ ├── lab-ribbon.png │ │ ├── layout │ │ ├── cc-logo-dark.png │ │ ├── cc-logo-dark.svg │ │ ├── cc-logo.png │ │ ├── cc-logo.svg │ │ ├── fullscreen-dark.svg │ │ ├── fullscreen-exit-dark.svg │ │ ├── fullscreen-exit.svg │ │ ├── fullscreen.gif │ │ └── fullscreen.svg │ │ ├── minus.svg │ │ ├── pause.png │ │ ├── play.png │ │ ├── playback.png │ │ ├── plus.svg │ │ ├── pressureGauge.svg │ │ ├── reset.png │ │ ├── test-svg-image-embed.svg │ │ ├── up.png │ │ └── upstatement │ │ ├── checked.svg │ │ ├── heatbath.svg │ │ ├── ke-gradient.svg │ │ └── unchecked.svg ├── locales │ ├── cs-CZ │ │ └── interactives │ │ │ └── oil-and-water.json │ ├── es │ │ └── interactives │ │ │ └── oil-and-water.json │ ├── it │ │ └── interactives │ │ │ └── oil-and-water.json │ ├── metadata │ │ ├── oil-and-water.json │ │ └── sensor.json │ ├── pl │ │ └── interactives │ │ │ ├── oil-and-water.json │ │ │ └── sensor.json │ ├── pt-BR │ │ └── interactives │ │ │ └── oil-and-water.json │ └── ru │ │ └── interactives │ │ └── oil-and-water.json ├── mml-converter.html ├── mml-converter.sass ├── models │ ├── act2model │ │ └── act2model.json │ ├── amino-acids │ │ └── amino-acids.json │ ├── chemical-reaction │ │ ├── chemical-reaction.json │ │ └── reactionsExplanationFlat.svg │ ├── energy2d │ │ └── energy2d.json │ ├── oil-and-water │ │ ├── oil-and-water-mix.json │ │ └── oil-and-water.json │ ├── pendulum │ │ └── pendulum.json │ ├── sensor │ │ └── sensor.json │ └── sun-on-ground │ │ ├── IROnCO2.json │ │ ├── photonKey.svg │ │ ├── smallSun.png │ │ ├── sunOnCO2.json │ │ ├── sunOnGround.json │ │ └── sunOnGroundAndCO2.json └── sass │ ├── _variables.scss │ ├── bourbon │ ├── _bourbon-deprecated-upcoming.scss │ ├── _bourbon.scss │ ├── addons │ │ ├── _button.scss │ │ ├── _clearfix.scss │ │ ├── _font-family.scss │ │ ├── _hide-text.scss │ │ ├── _html5-input-types.scss │ │ ├── _position.scss │ │ ├── _prefixer.scss │ │ ├── _retina-image.scss │ │ ├── _size.scss │ │ ├── _timing-functions.scss │ │ └── _triangle.scss │ ├── css3 │ │ ├── _animation.scss │ │ ├── _appearance.scss │ │ ├── _background-image.scss │ │ ├── _background-size.scss │ │ ├── _background.scss │ │ ├── _border-image.scss │ │ ├── _border-radius.scss │ │ ├── _box-sizing.scss │ │ ├── _columns.scss │ │ ├── _flex-box.scss │ │ ├── _font-face.scss │ │ ├── _hidpi-media-query.scss │ │ ├── _image-rendering.scss │ │ ├── _inline-block.scss │ │ ├── _keyframes.scss │ │ ├── _linear-gradient.scss │ │ ├── _perspective.scss │ │ ├── _placeholder.scss │ │ ├── _radial-gradient.scss │ │ ├── _transform.scss │ │ ├── _transition.scss │ │ └── _user-select.scss │ └── functions │ │ ├── _compact.scss │ │ ├── _deprecated-webkit-gradient.scss │ │ ├── _flex-grid.scss │ │ ├── _grid-width.scss │ │ ├── _linear-gradient.scss │ │ ├── _modular-scale.scss │ │ ├── _px-to-em.scss │ │ ├── _radial-gradient.scss │ │ ├── _render-gradients.scss │ │ ├── _tint-shade.scss │ │ └── _transition-property-name.scss │ ├── lab │ ├── _bar_graph.sass │ ├── _colors.sass │ ├── _components.sass │ ├── _context-menu.sass │ ├── _dialogs.sass │ ├── _energy2d.sass │ ├── _font-awesome.sass │ ├── _fonts.sass │ ├── _graphs.sass │ ├── _help-system.sass │ ├── _interactive-components.sass │ ├── _jquery-ui-lab-theme.sass │ ├── _model-container.sass │ └── _semantic-layout.sass │ └── neat │ ├── _neat-helpers.scss │ ├── _neat.scss │ ├── functions │ ├── _new-breakpoint.scss │ ├── _private.scss │ └── _px-to-em.scss │ ├── grid │ ├── _fill-parent.scss │ ├── _global-variables.scss │ ├── _grid.scss │ ├── _media.scss │ ├── _omega.scss │ ├── _outer-container.scss │ ├── _pad.scss │ ├── _row.scss │ ├── _shift.scss │ ├── _span-columns.scss │ ├── _to-deprecate.scss │ └── _visual-grid.scss │ └── settings │ ├── _grid.scss │ └── _visual-grid.scss ├── test ├── env-assert.js ├── fixtures │ ├── e2d-conversion │ │ ├── S1A1.json │ │ ├── S1B1.json │ │ ├── S1C1.json │ │ ├── S1C2.json │ │ ├── S2A1.json │ │ ├── S2B1.json │ │ ├── S3A1.json │ │ ├── S3B1.json │ │ ├── S3C1.json │ │ ├── S3D1.json │ │ ├── S3E1.json │ │ ├── S3F0.json │ │ ├── S3F1.json │ │ ├── S3F2.json │ │ ├── S3F3.json │ │ ├── S3F4.json │ │ ├── S3F5.json │ │ ├── S3G1.json │ │ ├── S3H1.json │ │ ├── S4A1.json │ │ ├── S4B1.json │ │ ├── S4C1.json │ │ ├── S4D1.json │ │ ├── S4E1.json │ │ ├── S5A1.json │ │ ├── S6D1.json │ │ ├── S7A1.json │ │ ├── S7B1.json │ │ ├── S7C1.json │ │ ├── barrel.json │ │ ├── benard-cell.json │ │ ├── bolometer.json │ │ ├── cable.json │ │ ├── compare-capacity.json │ │ ├── compare-conductivity.json │ │ ├── conduction1.json │ │ ├── conduction2.json │ │ ├── conduction3.json │ │ ├── conduction4.json │ │ ├── conduction5.json │ │ ├── conduction_plate.json │ │ ├── conservation-of-energy.json │ │ ├── constant-power-sources.json │ │ ├── constant-temperature-sources.json │ │ ├── convection-exploration.json │ │ ├── countercurrent-exchange.json │ │ ├── cross-section-venturi.json │ │ ├── dirichlet.json │ │ ├── double-bell.json │ │ ├── double-bell2.json │ │ ├── double-cavities.json │ │ ├── energy-audit.json │ │ ├── field-of-bar.json │ │ ├── fin1.json │ │ ├── fixed-flux-boundary.json │ │ ├── fixed-temperature-boundary.json │ │ ├── forced-convection.json │ │ ├── forced-convection1.json │ │ ├── forced-convection2.json │ │ ├── forced-convection3.json │ │ ├── forced-convection4.json │ │ ├── ghosting.json │ │ ├── hand.json │ │ ├── heat-concentration.json │ │ ├── heat-storage.json │ │ ├── heatshield.json │ │ ├── hot-plate-in-air.json │ │ ├── hot-water-cup-conductivity.json │ │ ├── hot-water-cup-open-vs-closed.json │ │ ├── hot-water-cup-thickness.json │ │ ├── house-ceiling.json │ │ ├── ht1.json │ │ ├── infiltration.json │ │ ├── insulation-effect.json │ │ ├── kelvin-helmholtz.json │ │ ├── laminar-turbulent.json │ │ ├── lid-driven-cavity.json │ │ ├── man.json │ │ ├── mantle.json │ │ ├── natural-convection.json │ │ ├── natural-convection1.json │ │ ├── natural-convection2.json │ │ ├── neumann.json │ │ ├── no-ghosting.json │ │ ├── parallel-conductors.json │ │ ├── plume.json │ │ ├── power-energy.json │ │ ├── prandtl.json │ │ ├── projection-effect.json │ │ ├── projection.json │ │ ├── quadrupole.json │ │ ├── radiation.json │ │ ├── rectangular-vs-circular-heat-source.json │ │ ├── regulation.json │ │ ├── reynolds.json │ │ ├── series-conductors.json │ │ ├── shelter.json │ │ ├── skylight.json │ │ ├── smoke-in-wind.json │ │ ├── solar-chimney.json │ │ ├── solar-cycles-shadow.json │ │ ├── solar-cycles.json │ │ ├── solar-heating-convection.json │ │ ├── solar-heating-two-story.json │ │ ├── solar-oven.json │ │ ├── solar-oven2.json │ │ ├── solar-radiation.json │ │ ├── solar-updraft-tower.json │ │ ├── solar-updraft-tower2.json │ │ ├── solar-updraft-tower3.json │ │ ├── stack-effect.json │ │ ├── step1.json │ │ ├── step2.json │ │ ├── streamlines.json │ │ ├── sunspace.json │ │ ├── thermal-bridge.json │ │ ├── thermoregulation.json │ │ ├── thermos.json │ │ ├── thermostat-cooling.json │ │ ├── thermostat.json │ │ ├── thermostat1.json │ │ ├── thermostat2.json │ │ ├── touch-convect.json │ │ ├── touch.json │ │ ├── trombe-wall-closeup.json │ │ ├── trombe-wall.json │ │ ├── two-blocks.json │ │ ├── usa-isotherm.json │ │ ├── vertical-temperature-gradient-in-house.json │ │ ├── village1.json │ │ ├── viscosity-turbulence.json │ │ ├── vortex-street-viscosity.json │ │ ├── vortex-street.json │ │ └── zeroth.json │ ├── mml-conversions │ │ ├── expected-json │ │ │ ├── angular-bonds.json │ │ │ ├── custom-element-colors.json │ │ │ ├── custom-lj-properties.json │ │ │ ├── draggable-atom.json │ │ │ ├── electric-field.json │ │ │ ├── ellipse-alhpa-at-props.json │ │ │ ├── gravitational-field-100.json │ │ │ ├── gravitational-field-200-default.json │ │ │ ├── gravitational-field-400.json │ │ │ ├── gravitational-field-off.json │ │ │ ├── heatbath.json │ │ │ ├── image-layers.json │ │ │ ├── image-visible-and-hidden.json │ │ │ ├── immovable-atom.json │ │ │ ├── invisible-obstacle.json │ │ │ ├── mark-atoms.json │ │ │ ├── mazeGame.json │ │ │ ├── no-atoms.json │ │ │ ├── no-electric-field.json │ │ │ ├── obstacle-color.json │ │ │ ├── obstacle-mass.json │ │ │ ├── obstacle-permeability.json │ │ │ ├── obstacle-probes.json │ │ │ ├── one-textbox.json │ │ │ ├── point-restraint.json │ │ │ ├── quantum-collision.json │ │ │ ├── rectangles.json │ │ │ ├── show-charge-symbols.json │ │ │ ├── show-vdw-lines.json │ │ │ ├── simple-ke-shading.json │ │ │ ├── solvent-dielectric-constant.json │ │ │ ├── sunOnGround.json │ │ │ ├── target-game-distance.json │ │ │ ├── time-step-5.0.json │ │ │ ├── two-charged-atoms-with-shading-image.json │ │ │ ├── two-charged-atoms-with-shading.json │ │ │ ├── two-charged-atoms.json │ │ │ ├── two-diatomic-molecules.json │ │ │ ├── two-obstacles.json │ │ │ ├── vectors.json │ │ │ ├── view-refresh-interval-10.json │ │ │ ├── viscosity-friction.json │ │ │ └── visible-and-invisible.json │ │ └── input-mml │ │ │ ├── angular-bonds.mml │ │ │ ├── custom-element-colors.mml │ │ │ ├── custom-lj-properties.mml │ │ │ ├── draggable-atom.mml │ │ │ ├── electric-field.mml │ │ │ ├── ellipse-alhpa-at-props.mml │ │ │ ├── gravitational-field-100.mml │ │ │ ├── gravitational-field-200-default.mml │ │ │ ├── gravitational-field-400.mml │ │ │ ├── gravitational-field-off.mml │ │ │ ├── heatbath.mml │ │ │ ├── image-layers.mml │ │ │ ├── image-visible-and-hidden.mml │ │ │ ├── immovable-atom.mml │ │ │ ├── invisible-obstacle.mml │ │ │ ├── mark-atoms.mml │ │ │ ├── mazeGame.mml │ │ │ ├── no-atoms.mml │ │ │ ├── no-electric-field.mml │ │ │ ├── obstacle-color.mml │ │ │ ├── obstacle-mass.mml │ │ │ ├── obstacle-permeability.mml │ │ │ ├── obstacle-probes.mml │ │ │ ├── one-textbox.mml │ │ │ ├── point-restraint.mml │ │ │ ├── quantum-collision.mml │ │ │ ├── rectangles.mml │ │ │ ├── show-charge-symbols.mml │ │ │ ├── show-vdw-lines.mml │ │ │ ├── simple-ke-shading.mml │ │ │ ├── solvent-dielectric-constant.mml │ │ │ ├── sunOnGround.mml │ │ │ ├── target-game-distance.mml │ │ │ ├── time-step-5.0.mml │ │ │ ├── two-charged-atoms-with-shading-image.mml │ │ │ ├── two-charged-atoms-with-shading.mml │ │ │ ├── two-charged-atoms.mml │ │ │ ├── two-diatomic-molecules.mml │ │ │ ├── two-obstacles.mml │ │ │ ├── vectors.mml │ │ │ ├── view-refresh-interval-10.mml │ │ │ ├── viscosity-friction.mml │ │ │ └── visible-and-invisible.mml │ └── models │ │ ├── pressure-probes.json │ │ ├── simple-model$0.mml │ │ ├── simple-model.cml │ │ └── simple-model.json ├── helpers │ └── index.js ├── jest │ ├── common │ │ ├── arrays.js │ │ ├── dispatch.js │ │ ├── export-controller-spec.js │ │ ├── graph-controller-spec.js │ │ ├── output-support-spec.js │ │ ├── parameter-support-spec.js │ │ ├── properties-retainment.js │ │ ├── property-transition.js │ │ ├── serialize.js │ │ ├── state-manager.js │ │ ├── table-controller-spec.js │ │ └── validator.js │ ├── energy2d │ │ ├── core-model-test.js │ │ ├── model-serialization-after-changes.js │ │ ├── model-serialization.js │ │ ├── part-test.js │ │ ├── photon-test.js │ │ └── shape-test.js │ ├── import-export │ │ └── netlogo-importer-spec.js │ ├── md2d │ │ ├── aminoacids.js │ │ ├── atoms.js │ │ ├── cell-list-test.js │ │ ├── constants-test.js │ │ ├── custom-parameters-spec.js │ │ ├── electric-field.js │ │ ├── filtered-output-spec.js │ │ ├── genetic-engine.js │ │ ├── interactive-controller-spec.js │ │ ├── interactive-filtered-outputs-spec.js │ │ ├── interactive-outputs-spec.js │ │ ├── interactive-parameters-spec.js │ │ ├── interactive-serialization-after-changes.js │ │ ├── interactive-serialization-basic.js │ │ ├── md2d-scripting-api.js │ │ ├── md2d-transitions.js │ │ ├── model-serialization.js │ │ ├── neighbor-list.js │ │ ├── obstacles.js │ │ ├── output-properties-spec.js │ │ ├── pairwise-lj-properties.js │ │ ├── quantum-dynamics.js │ │ └── units-translation-spec.js │ └── mml-conversions │ │ └── conversion-test.js └── setupTests.js ├── validation └── models │ └── md2d │ └── epsilon │ ├── cml.mustache │ ├── data │ ├── classic │ │ ├── model1$0.mml │ │ ├── model1.cml │ │ ├── model10$0.mml │ │ ├── model10.cml │ │ ├── model2$0.mml │ │ ├── model2.cml │ │ ├── model3$0.mml │ │ ├── model3.cml │ │ ├── model4$0.mml │ │ ├── model4.cml │ │ ├── model5$0.mml │ │ ├── model5.cml │ │ ├── model6$0.mml │ │ ├── model6.cml │ │ ├── model7$0.mml │ │ ├── model7.cml │ │ ├── model8$0.mml │ │ ├── model8.cml │ │ ├── model9$0.mml │ │ └── model9.cml │ ├── index.txt │ └── nextgen │ │ ├── model1.data.txt │ │ ├── model1.json │ │ ├── model10.data.txt │ │ ├── model10.json │ │ ├── model2.data.txt │ │ ├── model2.json │ │ ├── model3.data.txt │ │ ├── model3.json │ │ ├── model4.data.txt │ │ ├── model4.json │ │ ├── model5.data.txt │ │ ├── model5.json │ │ ├── model6.data.txt │ │ ├── model6.json │ │ ├── model7.data.txt │ │ ├── model7.json │ │ ├── model8.data.txt │ │ ├── model8.json │ │ ├── model9.data.txt │ │ └── model9.json │ ├── generate.rb │ ├── mml.mustache │ └── readme.md ├── vendor └── fonts │ └── lato-fontfacekit │ ├── Lato-Bla-webfont.eot │ ├── Lato-Bla-webfont.svg │ ├── Lato-Bla-webfont.ttf │ ├── Lato-Bla-webfont.woff │ ├── Lato-BlaIta-webfont.eot │ ├── Lato-BlaIta-webfont.svg │ ├── Lato-BlaIta-webfont.ttf │ ├── Lato-BlaIta-webfont.woff │ ├── Lato-Bol-webfont.eot │ ├── Lato-Bol-webfont.svg │ ├── Lato-Bol-webfont.ttf │ ├── Lato-Bol-webfont.woff │ ├── Lato-BolIta-webfont.eot │ ├── Lato-BolIta-webfont.svg │ ├── Lato-BolIta-webfont.ttf │ ├── Lato-BolIta-webfont.woff │ ├── Lato-Hai-webfont.eot │ ├── Lato-Hai-webfont.svg │ ├── Lato-Hai-webfont.ttf │ ├── Lato-Hai-webfont.woff │ ├── Lato-HaiIta-webfont.eot │ ├── Lato-HaiIta-webfont.svg │ ├── Lato-HaiIta-webfont.ttf │ ├── Lato-HaiIta-webfont.woff │ ├── Lato-Lig-webfont.eot │ ├── Lato-Lig-webfont.svg │ ├── Lato-Lig-webfont.ttf │ ├── Lato-Lig-webfont.woff │ ├── Lato-LigIta-webfont.eot │ ├── Lato-LigIta-webfont.svg │ ├── Lato-LigIta-webfont.ttf │ ├── Lato-LigIta-webfont.woff │ ├── Lato-Reg-webfont.eot │ ├── Lato-Reg-webfont.svg │ ├── Lato-Reg-webfont.ttf │ ├── Lato-Reg-webfont.woff │ ├── Lato-RegIta-webfont.eot │ ├── Lato-RegIta-webfont.svg │ ├── Lato-RegIta-webfont.ttf │ ├── Lato-RegIta-webfont.woff │ ├── SIL Open Font License 1.1.txt │ ├── demo.html │ └── stylesheet.css └── webpack.config.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "syntax-dynamic-import" 4 | ], 5 | "presets": [ 6 | [ 7 | "@babel/preset-env" 8 | ] 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | # files generated by a build 3 | /bin 4 | /public 5 | /src/lab/lab.version.js 6 | /src/lab/git-commit 7 | /src/lab/git-dirty 8 | /src/lab/git-branch-name 9 | .bundle 10 | .sass-cache 11 | /node_modules 12 | npm-debug.log 13 | /test/*.html 14 | 15 | # system-generated files 16 | .DS_Store 17 | Thumbs.db 18 | 19 | # editor-related files 20 | *.sublime-workspace 21 | .idea 22 | .project 23 | /*.log 24 | 25 | coverage 26 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "esversion": 6, 3 | "predef": ["$", "d3", "describe", "it", "beforeAll", "beforeEach", "afterEach", "sinon", "should", "expect", "gtag"], 4 | "browser" : true, 5 | "eqnull": true, 6 | "boss" : false, 7 | "curly": false, 8 | "debug": false, 9 | "devel": false, 10 | "eqeqeq": true, 11 | "evil": true, 12 | "forin": false, 13 | "immed": true, 14 | "indent": false, 15 | "laxbreak": false, 16 | "newcap": true, 17 | "noarg": true, 18 | "node": true, 19 | "noempty": true, 20 | "nonew": false, 21 | "nomen": false, 22 | "onevar": false, 23 | "plusplus": false, 24 | "regexp": false, 25 | "undef": true, 26 | "sub": true, 27 | "strict": false, 28 | "trailing": true, 29 | "white": false, 30 | "unused": true 31 | } 32 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | dist: trusty 2 | sudo: false 3 | # black list wip branches, however if pull requests are created for one then 4 | # travis should build it 5 | branches: 6 | except: 7 | - /^(wip|WIP)(-|_).*$/ 8 | language: node_js 9 | node_js: 10 | - "12" 11 | cache: 12 | bundler: true 13 | directories: 14 | - "$HOME/.npm" 15 | - "$HOME/.cache" 16 | install: 17 | - npm ci 18 | - travis_retry gem install s3_website -v 3.4.0 19 | script: 20 | - npm run build:production 21 | - npm run test 22 | after_success: 23 | - script/s3-deploy.sh 24 | env: 25 | global: 26 | - secure: "0vTh/6CdVgi1g9sHSCtiJuURDPNTgiX5eAu98W6UZhACVC3mLKG+DeBLY0U8PPlv9oK8pJggAwRQiUWdmc214tDk7ZkrHXx02S8EQgDL1Xy57wLhismlVJOFapMA1wkI/pCHADtc1ycYo6lYGhEDzGswjktxNImk2d9APYSrA4A=" 27 | - secure: "A430lxRQcBORvdmn7a5EHW6ffPt+iO+KC5ZqvR/sCuh/SRJDrPvGgY5+D4T6xAAybwNLDddUdbxZ3ACUT7oUVFbRNEJzfLSo6ugkMeK+BnABckG4Bh9BEAI4xhqiune09qBDoxwpAKQBCXGKS5q06snabbkfLjx2H+yPqGHCsSE=" 28 | - secure: "rnqygpeAbtFM1U82XMQgDMvXs+0ZiBLFNX38JXjPlXMDLNtoYzdb9uFnlEVIEuE7jj/SUt9DJCNgUdZG94nb8joQQ0LyvuFmDQphZ++ioTNcodk5lA3d4NyZ3mUtZURwwEnfJeZTJPPCw/8yz+zF/OIN1cknn61crj8N0Yp7cTo=" 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Concord Consortium 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /__mocks__/fastclick.js: -------------------------------------------------------------------------------- 1 | export default { 2 | attach: function() {} 3 | }; 4 | -------------------------------------------------------------------------------- /__mocks__/lab-grapher.js: -------------------------------------------------------------------------------- 1 | import sinon from "sinon"; 2 | 3 | function Graph() { 4 | return { 5 | addPoints: sinon.spy(), 6 | addPointListener: sinon.spy(), 7 | resetPoints: sinon.spy(), 8 | updateOrRescale: sinon.spy(), 9 | reset: sinon.spy(), 10 | repaint: sinon.spy(), 11 | xLabel: sinon.spy(), 12 | yLabel: sinon.spy(), 13 | xDomain: function() { 14 | return [0, 10]; 15 | }, 16 | yDomain: function() { 17 | return [0, 10]; 18 | } 19 | }; 20 | } 21 | 22 | export const mock = { 23 | Graph 24 | }; 25 | 26 | // Why is this necessary? Take a look at graph-controller-spec. It spies on mock.Graph to check how many times the constructor has been called. 27 | function constr() { 28 | return mock.Graph.apply(null, arguments); 29 | } 30 | 31 | constr.i18n = {}; 32 | 33 | export default constr; 34 | -------------------------------------------------------------------------------- /__mocks__/labquest2-interface.js: -------------------------------------------------------------------------------- 1 | export default {}; 2 | -------------------------------------------------------------------------------- /__mocks__/sensor-connector-interface.js: -------------------------------------------------------------------------------- 1 | export default {}; 2 | -------------------------------------------------------------------------------- /config/s3_website.yml: -------------------------------------------------------------------------------- 1 | s3_id: <%= ENV['S3_ACCESS_KEY_ID'] %> 2 | s3_secret: <%= ENV['S3_SECRET_KEY'] %> 3 | s3_bucket: lab-framework.concord.org 4 | s3_endpoint: us-east-1 5 | gzip: true 6 | 7 | <% if ENV['TRAVIS_BRANCH'] == 'production' %> 8 | # in this case we are going to deploy this branch to the top level of the domain 9 | # so we need to ignore the version and branch folders 10 | ignore_on_server: ^(version/|branch/) 11 | <% else %> 12 | # in this case we are going to deploy this code to a subfolder of either the branch 13 | # or version folder. So ignore everything except this folder. 14 | ignore_on_server: ^(?!<%= Regexp.escape(ENV['DEPLOY_DIR']) %>/|<%= Regexp.escape(ENV['DEPLOY_ARCHIVE']) %>) 15 | <% end %> 16 | max_age: 17 | "*": 21600 # 6 hours in seconds 18 | "version/*": 31536000 # 1 year in seconds 19 | "branch/*": 0 20 | -------------------------------------------------------------------------------- /developer-doc/java.md: -------------------------------------------------------------------------------- 1 | ## Java Resources 2 | 3 | The Lab framework uses a sensor applet to connect with USB sensors from Vernier. 4 | The jars for this applet and a javascript library for communicating with the applet come from 5 | the [Lab Sensor Applet Interface](https://github.com/concord-consortium/lab-sensor-applet-interface) 6 | project. The Lab framework pulls in the 7 | [distribution repository](https://github.com/concord-consortium/lab-sensor-applet-interface-dist) 8 | through a submodule. This distribution repository provides the built and signed jars. 9 | 10 | ### Working with sensor applet Java code within local Lab build 11 | 12 | 1. Clone lab-sensor-applet-interace https://github.com/concord-consortium/lab-sensor-applet-interface 13 | 2. Build it (see the readme of that project) 14 | 3. delete submodule folder `lab/vendor/lab-sensor-applet-interface-dist` 15 | 4. create a symlink `ln -s lab-sensor-applet-interface/dist lab/vendor/lab-sensor-applet-interface-dist` 16 | 17 | Now everytime you rebuild the sensor applet jars or javascript, and then make is run on the Lab project 18 | you local Lab server should include the new jars and new javascript. 19 | -------------------------------------------------------------------------------- /developer-doc/linux-notes.md: -------------------------------------------------------------------------------- 1 | # Additional Notes for Ubuntu Linux 2 | 3 | - the Ruby Gem Nokogiri requires libxslt and libxml2 4 | install them with: 5 | 6 | sudo apt-get install libxslt-dev libxml2-dev 7 | 8 | - D3.js build process fails: 9 | 10 | locale: Cannot set LC_ALL to default locale: No such file or directory 11 | 12 | Solution: 13 | 14 | $ sudo locale-gen en_US 15 | 16 | - D3.js build process fails: 17 | 18 | make[1]: /usr/lib/nodejs:/usr/share/javascript/uglify-js/bin/uglifyjs: Command not found 19 | 20 | Workaround: 21 | 22 | $ unset NODE_PATH 23 | 24 | and try to build the project again. 25 | -------------------------------------------------------------------------------- /developer-doc/setup-node.md: -------------------------------------------------------------------------------- 1 | # Install node.js, npm and yarn 2 | 3 | [node.js](http://nodejs.org/) and [npm](http://npmjs.org/) are required to build Lab. 4 | [npm](http://npmjs.org/) is included as part of [node.js](http://nodejs.org/). 5 | [yarn](https://yarnpkg.com) needs to be installed separately. 6 | 7 | ## OS X 8 | 9 | Install the latest stable version of node with installers available here: [http://nodejs.org/#download](http://nodejs.org/#download) 10 | 11 | Install yarn using homebrew: `brew install yarn` or check other installation methods: https://yarnpkg.com/en/docs/install#mac-tab 12 | 13 | ## Linux (Ubuntu) 14 | 15 | To install the latest stable versions of node you first need to add this PPA repositories: 16 | 17 | 1. [node PPA repo](https://launchpad.net/~chris-lea/+archive/node.js/) 18 | 19 | For this to work as intended python software properties must also be installed. 20 | 21 | $ sudo apt-get install python-software-properties 22 | $ sudo apt-add-repository ppa:chris-lea/node.js 23 | $ sudo apt-get update 24 | 25 | Now install node and npm: 26 | 27 | $ sudo apt-get install nodejs npm 28 | 29 | 2. Install Yarn: https://yarnpkg.com/en/docs/install#linux-tab 30 | -------------------------------------------------------------------------------- /developer-doc/website.md: -------------------------------------------------------------------------------- 1 | # Building Website 2 | 3 | ## HTML and CSS Generation 4 | 5 | [Haml](http://haml-lang.com/) is used to generate most of the HTML in the `public/` directory. 6 | 7 | [kramdown](http://kramdown.rubyforge.org/) is used to generate `readme.html` in `public/` from Mardown markup. 8 | 9 | [Sass](http://sass-lang.com/) is used to generate the CSS assets. The Sass markup may be in the form of 10 | `*.sass` or `*.scss` files 11 | 12 | The [Bourbon](http://thoughtbot.com/bourbon/) library of Sass mixins is included. 13 | 14 | - [Bourbon documentation](http://thoughtbot.com/bourbon/) 15 | - [ASCIIcast 330: Better SASS With Bourbon](http://asciicasts.com/episodes/330-better-sass-with-bourbon) 16 | - [Introducing Bourbon Sass Mixins](http://robots.thoughtbot.com/post/7846399901/introducing-bourbon-sass-mixins) 17 | 18 | -------------------------------------------------------------------------------- /node-bin/convert-e2d: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var parser = require("../src/helpers/energy2d/e2d-parser"); 4 | var fs = require("fs"); 5 | 6 | var input = process.argv[2]; 7 | var output = process.argv[3]; 8 | 9 | if (!input) { 10 | console.error("Please provide input .e2d file."); 11 | return 1; 12 | } 13 | 14 | var xml = fs.readFileSync(input).toString(); 15 | var parsedModel = parser.parse(xml); 16 | var json = JSON.stringify(parsedModel, null, 2); 17 | 18 | if (output) { 19 | fs.writeFileSync(output, json, null, 2); 20 | } else { 21 | process.stdout.write(json); 22 | } 23 | -------------------------------------------------------------------------------- /node-bin/convert-mml: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | /* 3 | Converts a single MML file to a json file, optionally with an _id attribute for 4 | inserting into CouchDB. 5 | */ 6 | const parseMML = require("../src/helpers/md2d/md2d-node-api").parseMML; 7 | const fs = require("fs"); 8 | 9 | const inFile = process.argv[2]; 10 | const outFile = process.argv[3]; 11 | const id = process.argv[4]; 12 | 13 | const mml = fs.readFileSync(inFile).toString(); 14 | const conversion = parseMML(mml); 15 | 16 | if (conversion.json) { 17 | if (id != null) { 18 | conversion.json._id = id; 19 | } 20 | fs.writeFileSync(outFile, JSON.stringify(conversion.json, null, 2)); 21 | } else { 22 | console.error(`Error converting file ${inFile}:\n${conversion.error}`); 23 | process.exit(1); 24 | } 25 | -------------------------------------------------------------------------------- /node-bin/create-mml-html-index: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var converter = require('../src/helpers/md2d/mw-batch-converter'); 4 | fs = require('fs'), 5 | path = require('path'), 6 | indexFile = path.normalize(path.dirname(require.main.filename) + 7 | '/../public/imports/legacy-mw-content/legacyMMLRunnables.html'); 8 | 9 | converter.createCmlJsonIndex( indexFile ); -------------------------------------------------------------------------------- /node-bin/gen-lab-json: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | // Enable ES6 import syntax support using esm package. 3 | require = require("esm")(module); 4 | // Lab is using paths relative to src/lab. Set node paths here to ensure that modules are found. 5 | process.env.NODE_PATH = "src/lab"; 6 | require("module").Module._initPaths(); // magic to get NODE_PATHS updated 7 | 8 | const fs = require("fs"); 9 | const interactive = require("../src/lab/common/controllers/interactive-metadata"); 10 | const md2d = require("../src/lab/models/md2d/models/metadata"); 11 | const energy2d = require("../src/lab/models/energy2d/metadata"); 12 | const sensor = require("../src/lab/models/sensor/metadata"); 13 | const signalGenerator = require("../src/lab/models/signal-generator/metadata"); 14 | const iframeModel = require("../src/lab/models/iframe/metadata"); 15 | 16 | var labMetaData = { 17 | interactive, 18 | models: { 19 | md2d, 20 | energy2d, 21 | sensor, 22 | "signal-generator": signalGenerator, 23 | "iframe-model": iframeModel 24 | } 25 | }; 26 | 27 | fs.writeFile("public/lab/lab.json", JSON.stringify(labMetaData, null, 2), function (err) { 28 | if (err) { 29 | console.log(err); 30 | } else { 31 | console.log("generated: public/lab/lab.json"); 32 | } 33 | }); 34 | -------------------------------------------------------------------------------- /node-bin/hex-to-lab-color: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | // Simple script that converts HTML hex color (e.g. #ffffff) into color value used by MD2D elements. 4 | 5 | var input = process.argv[2]; 6 | 7 | if (input[0] === "#") { 8 | input = input.substr(1); 9 | } 10 | 11 | var num = parseInt(input, 16); 12 | num = num - Math.pow(2, 24); 13 | 14 | console.log(input + " => " + num); 15 | -------------------------------------------------------------------------------- /node-bin/update-expected-json: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | var fs = require('fs'); 3 | var parseMML = require('../src/helpers/md2d/md2d-node-api').parseMML; 4 | var mmlFileNames = fs.readdirSync('test/fixtures/mml-conversions/input-mml'); 5 | 6 | mmlFileNames.forEach(function(mmlFileName) { 7 | var mml = fs.readFileSync('test/fixtures/mml-conversions/input-mml/'+mmlFileName).toString(); 8 | var conversion = parseMML(mml); 9 | var jsonFileName = mmlFileName.replace(/mml$/, 'json'); 10 | 11 | if (conversion.error) { 12 | throw new Error("could not convert input file \"" + mmlFileName + "\"; error = " + conversion.error); 13 | } 14 | fs.writeFileSync('test/fixtures/mml-conversions/expected-json/' + jsonFileName, JSON.stringify(conversion.json, null, 2)); 15 | }); 16 | -------------------------------------------------------------------------------- /script/archive-public.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | if [ ! -d public/.git ] 3 | then 4 | cat < /dev/null 15 | then 16 | cat < ../tarballs/$archivename 36 | cd .. 37 | else 38 | cat < is to prevent error messages when no match is found 14 | CURRENT_TAG=`git describe --tags --exact-match $TRAVIS_COMMIT 2> /dev/null` 15 | if [ "$TRAVIS_BRANCH" = "$CURRENT_TAG" ]; then 16 | # this is a tag build 17 | mkdir -p _site/version 18 | DEPLOY_DIR=version/$TRAVIS_BRANCH 19 | PREFIXED_NAME=lab-$TRAVIS_BRANCH 20 | DEPLOY_ARCHIVE=version/$PREFIXED_NAME.tar.gz 21 | mv public _site/version/$PREFIXED_NAME 22 | tar -czf _site/$DEPLOY_ARCHIVE --directory=_site/version/ $PREFIXED_NAME 23 | mv _site/version/$PREFIXED_NAME _site/$DEPLOY_DIR 24 | else 25 | mkdir -p _site/branch 26 | DEPLOY_DIR=branch/$TRAVIS_BRANCH 27 | DEPLOY_ARCHIVE=_fake_archive_that_should_never_be_on_the_server_ 28 | mv public _site/$DEPLOY_DIR 29 | fi 30 | export DEPLOY_DIR 31 | export DEPLOY_ARCHIVE 32 | fi 33 | 34 | s3_website push --site _site --config-dir config 35 | -------------------------------------------------------------------------------- /src/embeddable.sass: -------------------------------------------------------------------------------- 1 | @import 'sass/bourbon/bourbon' 2 | @import 'sass/variables' 3 | @import 'sass/neat/neat' 4 | 5 | html, body 6 | @include fill-parent 7 | height: 100% 8 | overflow: hidden 9 | background: transparent 10 | margin: 0 11 | padding: 0 12 | -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/src/favicon.ico -------------------------------------------------------------------------------- /src/grapher.sass: -------------------------------------------------------------------------------- 1 | @import "sass/lab/graphs" 2 | -------------------------------------------------------------------------------- /src/helpers/energy2d/e2d-node-api.js: -------------------------------------------------------------------------------- 1 | // Enable ES6 import syntax support using esm package. 2 | require = require("esm")(module); 3 | // Lab is using paths relative to src/lab. Set node paths here to ensure that modules are found. 4 | process.env.NODE_PATH = "src/lab"; 5 | require("module").Module._initPaths(); // magic to get NODE_PATHS updated 6 | 7 | const jsdom = require('jsdom'); 8 | const dom = new jsdom.JSDOM(""); 9 | global.window = dom.window; 10 | global.document = window.document; 11 | global.d3 = require("d3"); 12 | global.$ = global.jQuery = require("jquery")(window); 13 | 14 | // Used by E2D -> JSON conversion script. 15 | exports.validator = require('common/validator').default; 16 | exports.metadata = require('models/energy2d/metadata').default; 17 | -------------------------------------------------------------------------------- /src/helpers/md2d/md2d-node-api.js: -------------------------------------------------------------------------------- 1 | // Enable ES6 import syntax support using esm package. 2 | require = require("esm")(module); 3 | // Lab is using paths relative to src/lab. Set node paths here to ensure that modules are found. 4 | process.env.NODE_PATH = "src/lab"; 5 | require("module").Module._initPaths(); // magic to get NODE_PATHS updated 6 | 7 | const jsdom = require('jsdom'); 8 | const dom = new jsdom.JSDOM(""); 9 | global.window = dom.window; 10 | global.document = window.document; 11 | global.d3 = require("d3"); 12 | global.$ = global.jQuery = require("jquery")(window); 13 | 14 | // Export API for Node.js scripts. 15 | exports.Modeler = require('models/md2d/models/modeler').default; 16 | // Used by MML -> JSON conversion script. 17 | exports.parseMML = require('mml-converter/mml-converter').default; 18 | -------------------------------------------------------------------------------- /src/helpers/node-setup.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/src/helpers/node-setup.js -------------------------------------------------------------------------------- /src/index.sass: -------------------------------------------------------------------------------- 1 | $directory: "lab/" 2 | 3 | @import 'sass/bourbon/bourbon' 4 | 5 | html 6 | margin: 0 7 | padding: 0 8 | 9 | body 10 | margin: 0 11 | padding: 15px 12 | font-family: Lato, Verdana, Geneva, sans-serif 13 | color: #3f3f3f 14 | 15 | h1 16 | color: #333 17 | font-weight: 600 18 | font-size: 1.3em 19 | 20 | h2 21 | color: #5f5f5f 22 | font-weight: 600 23 | font-size: 1.15em 24 | margin-top: 0 25 | 26 | h3 27 | font-weight: 600 28 | font-size: 1.10em 29 | 30 | ul 31 | list-style-type: none 32 | 33 | a 34 | text-decoration: none 35 | font-weight: 500 36 | color: #028288 37 | &:visited 38 | color: #028288 39 | &:hover 40 | color: #009BA3 41 | 42 | .warning 43 | background: #FFE5E5 44 | padding: 10px 45 | border-radius: 20px 46 | 47 | .column1 48 | display: inline-block 49 | width: 700px 50 | 51 | .column2 52 | display: inline-block 53 | vertical-align: top 54 | width: 220px 55 | 56 | -------------------------------------------------------------------------------- /src/interactives/not-found.html: -------------------------------------------------------------------------------- 1 |
2 |

We couldn't find the Interactive you are looking for:

3 | 4 |

5 | unknown 6 |

7 | 8 |

It may have moved (without leaving a forwarding address).
9 | Try searching our Next-Generation Molecular Workbench Activities page.

10 | 11 |
12 | 13 | 14 | -------------------------------------------------------------------------------- /src/lab-fonts.sass: -------------------------------------------------------------------------------- 1 | $directory: "" 2 | 3 | @import "sass/lab/fonts" 4 | @import "sass/lab/font-awesome" 5 | -------------------------------------------------------------------------------- /src/lab.sass: -------------------------------------------------------------------------------- 1 | $directory: "" 2 | 3 | @import "~jquery-contextmenu/src/jquery.contextMenu.css" 4 | @import "~selectboxit/src/stylesheets/jquery.selectBoxIt.css" 5 | 6 | @import "sass/bourbon/bourbon" 7 | @import "sass/variables" 8 | @import "sass/neat/neat" 9 | 10 | @import "sass/lab/colors" 11 | @import "sass/lab/components" 12 | @import "sass/lab/interactive-components" 13 | @import "sass/lab/graphs" 14 | @import "sass/lab/semantic-layout" 15 | @import "sass/lab/context-menu" 16 | @import "sass/lab/model-container" 17 | @import "sass/lab/energy2d" 18 | @import "sass/lab/dialogs" 19 | @import "sass/lab/help-system" 20 | @import "sass/lab/jquery-ui-lab-theme" 21 | @import "sass/lab/font-awesome" 22 | -------------------------------------------------------------------------------- /src/lab/common/alert.js: -------------------------------------------------------------------------------- 1 | /** 2 | Tiny module providing global way to show errors to user. 3 | 4 | It's better to use module, as in the future, we may want to replace basic 5 | alert with more sophisticated solution (for example jQuery UI dialog). 6 | */ 7 | import console from 'common/console'; 8 | // Try to use global alert. If it's not available, use console.error (node.js). 9 | const alertFunc = typeof window.alert !== 'undefined' ? window.alert : console.error; 10 | 11 | export default function(msg) { 12 | alertFunc(msg); 13 | } 14 | -------------------------------------------------------------------------------- /src/lab/common/array-types.js: -------------------------------------------------------------------------------- 1 | 2 | // Tiny module which contains definition of preferred 3 | // array types used across whole Lab project. 4 | // It checks whether typed arrays are available and type of browser 5 | // (as typed arrays are slower in Safari). 6 | 7 | import arrays from 'arrays'; 8 | // Dependencies. 9 | var // Check for Safari. Typed arrays are faster almost everywhere ... except Safari. 10 | notSafari = (function() { 11 | // Node.js? 12 | if (typeof navigator === 'undefined') 13 | return true; 14 | // Safari? 15 | var safarimatch = / AppleWebKit\/([0123456789.+]+) \(KHTML, like Gecko\) Version\/([0123456789.]+) (Safari)\/([0123456789.]+)/, 16 | match = navigator.userAgent.match(safarimatch); 17 | return !match || !match[3]; 18 | }()), 19 | 20 | useTyped = arrays.typed && notSafari; 21 | 22 | // Return all available types of arrays. 23 | // If you need to use new type, declare it here. 24 | export default { 25 | floatType: useTyped ? 'Float64Array' : 'regular', 26 | int32Type: useTyped ? 'Int32Array' : 'regular', 27 | int16Type: useTyped ? 'Int16Array' : 'regular', 28 | int8Type: useTyped ? 'Int8Array' : 'regular', 29 | uint16Type: useTyped ? 'Uint16Array' : 'regular', 30 | uint8Type: useTyped ? 'Uint8Array' : 'regular' 31 | }; 32 | -------------------------------------------------------------------------------- /src/lab/common/controllers/__mocks__/language-select.js: -------------------------------------------------------------------------------- 1 | export default function languageSelect() {} 2 | -------------------------------------------------------------------------------- /src/lab/common/controllers/__mocks__/playback-controller.js: -------------------------------------------------------------------------------- 1 | export default function PlaybackController() { 2 | return { 3 | getViewContainer: function() { 4 | return $("
"); 5 | } 6 | }; 7 | } 8 | -------------------------------------------------------------------------------- /src/lab/common/controllers/button-controller.js: -------------------------------------------------------------------------------- 1 | 2 | import inherit from 'common/inherit'; 3 | import InteractiveComponent from 'common/controllers/interactive-component'; 4 | var buttonControllerCount = 0; 5 | 6 | function ButtonController(component, interactivesController) { 7 | this._actionClickFunction = function() {}; 8 | this._nameSpace = "button" + (++buttonControllerCount); 9 | this._clickTargetSelector = 'button'; 10 | // Call super constructor. 11 | InteractiveComponent.call(this, "button", component, interactivesController); 12 | this.$element.addClass("interactive-button"); 13 | this.button = $(' 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /test/jest/md2d/interactive-controller-spec.js: -------------------------------------------------------------------------------- 1 | import interactivesController from "../../../src/lab/common/controllers/interactives-controller"; 2 | 3 | describe("InterativeController", function () { 4 | let controller = null; 5 | let interactive = null; 6 | 7 | beforeEach(() => interactive = 8 | { 9 | "title": "Test Interactive", 10 | "models": [] 11 | }); 12 | 13 | it("initializes with no model defined", () => { 14 | controller = interactivesController(interactive, "body"); 15 | }); 16 | }); 17 | 18 | -------------------------------------------------------------------------------- /validation/models/md2d/epsilon/cml.mustache: -------------------------------------------------------------------------------- 1 | 2 | 3 | UTF-8 4 | First test model 5 | 6 |
7 | 8 | 9 | 10 | org.concord.mw2d.activity.AtomContainer 11 | model{{model_number}}$0.mml 12 | 13 | 14 | 15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /validation/models/md2d/epsilon/data/classic/model1.cml: -------------------------------------------------------------------------------- 1 | 2 | 3 | UTF-8 4 | First test model 5 | 6 |
7 | 8 | 9 | 10 | org.concord.mw2d.activity.AtomContainer 11 | model1$0.mml 12 | 13 | 14 | 15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /validation/models/md2d/epsilon/data/classic/model10.cml: -------------------------------------------------------------------------------- 1 | 2 | 3 | UTF-8 4 | First test model 5 | 6 |
7 | 8 | 9 | 10 | org.concord.mw2d.activity.AtomContainer 11 | model10$0.mml 12 | 13 | 14 | 15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /validation/models/md2d/epsilon/data/classic/model2.cml: -------------------------------------------------------------------------------- 1 | 2 | 3 | UTF-8 4 | First test model 5 | 6 |
7 | 8 | 9 | 10 | org.concord.mw2d.activity.AtomContainer 11 | model2$0.mml 12 | 13 | 14 | 15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /validation/models/md2d/epsilon/data/classic/model3.cml: -------------------------------------------------------------------------------- 1 | 2 | 3 | UTF-8 4 | First test model 5 | 6 |
7 | 8 | 9 | 10 | org.concord.mw2d.activity.AtomContainer 11 | model3$0.mml 12 | 13 | 14 | 15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /validation/models/md2d/epsilon/data/classic/model4.cml: -------------------------------------------------------------------------------- 1 | 2 | 3 | UTF-8 4 | First test model 5 | 6 |
7 | 8 | 9 | 10 | org.concord.mw2d.activity.AtomContainer 11 | model4$0.mml 12 | 13 | 14 | 15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /validation/models/md2d/epsilon/data/classic/model5.cml: -------------------------------------------------------------------------------- 1 | 2 | 3 | UTF-8 4 | First test model 5 | 6 |
7 | 8 | 9 | 10 | org.concord.mw2d.activity.AtomContainer 11 | model5$0.mml 12 | 13 | 14 | 15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /validation/models/md2d/epsilon/data/classic/model6.cml: -------------------------------------------------------------------------------- 1 | 2 | 3 | UTF-8 4 | First test model 5 | 6 |
7 | 8 | 9 | 10 | org.concord.mw2d.activity.AtomContainer 11 | model6$0.mml 12 | 13 | 14 | 15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /validation/models/md2d/epsilon/data/classic/model7.cml: -------------------------------------------------------------------------------- 1 | 2 | 3 | UTF-8 4 | First test model 5 | 6 |
7 | 8 | 9 | 10 | org.concord.mw2d.activity.AtomContainer 11 | model7$0.mml 12 | 13 | 14 | 15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /validation/models/md2d/epsilon/data/classic/model8.cml: -------------------------------------------------------------------------------- 1 | 2 | 3 | UTF-8 4 | First test model 5 | 6 |
7 | 8 | 9 | 10 | org.concord.mw2d.activity.AtomContainer 11 | model8$0.mml 12 | 13 | 14 | 15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /validation/models/md2d/epsilon/data/classic/model9.cml: -------------------------------------------------------------------------------- 1 | 2 | 3 | UTF-8 4 | First test model 5 | 6 |
7 | 8 | 9 | 10 | org.concord.mw2d.activity.AtomContainer 11 | model9$0.mml 12 | 13 | 14 | 15 | 16 |
17 |
18 | -------------------------------------------------------------------------------- /validation/models/md2d/epsilon/data/index.txt: -------------------------------------------------------------------------------- 1 | model epsilon initial PE initial KE approx. final KE 2 | 1 0.010 -2.633 0.000 0.000 3 | 2 0.033 -8.557 0.000 0.000 4 | 3 0.055 -14.482 0.000 0.000 5 | 4 0.078 -20.406 0.000 0.000 6 | 5 0.100 -26.330 0.000 0.000 7 | 6 0.010 -2.633 11.078 8.445 8 | 7 0.033 -8.557 17.002 8.445 9 | 8 0.055 -14.482 22.927 8.445 10 | 9 0.078 -20.406 28.851 8.445 11 | 10 0.100 -26.330 34.775 8.445 12 | -------------------------------------------------------------------------------- /validation/models/md2d/epsilon/readme.md: -------------------------------------------------------------------------------- 1 | 2 | Goals: 3 | 4 | 1. Generate the theoretical expectations 5 | 2. Generate the data from Java MW 6 | a. generate MML and CML models 7 | b. run models, collect results 8 | c. generate aggregate statistics from results 9 | 3. Generate data from HTML5 MW 10 | a. generate JSON model files 11 | b. run models, collect results 12 | c. generate aggregate statistics from results 13 | 4. Combine, graph, and analyze results from theoretical, Java MW, and HTML5 MW. 14 | 5. Generate pass/fail test for HTML5 MW that can be run automatically 15 | 16 | Working: script that generates Java MW CML and MML files, converts to HTML5 MW JSON and generates results by running HTML5 MD2D 17 | 18 | ruby validation/models/md2d/epsilon/generate.rb -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-Bla-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-Bla-webfont.eot -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-Bla-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-Bla-webfont.ttf -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-Bla-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-Bla-webfont.woff -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-BlaIta-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-BlaIta-webfont.eot -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-BlaIta-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-BlaIta-webfont.ttf -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-BlaIta-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-BlaIta-webfont.woff -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-Bol-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-Bol-webfont.eot -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-Bol-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-Bol-webfont.ttf -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-Bol-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-Bol-webfont.woff -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-BolIta-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-BolIta-webfont.eot -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-BolIta-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-BolIta-webfont.ttf -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-BolIta-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-BolIta-webfont.woff -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-Hai-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-Hai-webfont.eot -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-Hai-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-Hai-webfont.ttf -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-Hai-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-Hai-webfont.woff -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-HaiIta-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-HaiIta-webfont.eot -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-HaiIta-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-HaiIta-webfont.ttf -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-HaiIta-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-HaiIta-webfont.woff -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-Lig-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-Lig-webfont.eot -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-Lig-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-Lig-webfont.ttf -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-Lig-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-Lig-webfont.woff -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-LigIta-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-LigIta-webfont.eot -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-LigIta-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-LigIta-webfont.ttf -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-LigIta-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-LigIta-webfont.woff -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-Reg-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-Reg-webfont.eot -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-Reg-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-Reg-webfont.ttf -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-Reg-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-Reg-webfont.woff -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-RegIta-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-RegIta-webfont.eot -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-RegIta-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-RegIta-webfont.ttf -------------------------------------------------------------------------------- /vendor/fonts/lato-fontfacekit/Lato-RegIta-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/concord-consortium/lab/79ef76bbc0f8cae65b8593a7ada969878c580305/vendor/fonts/lato-fontfacekit/Lato-RegIta-webfont.woff --------------------------------------------------------------------------------